// ------------------------------------------------------------------------- // ----- PndLmdDigiQTask source file ----- // ----- Created 19/09/14 by A.Karavdina ----- // ------------------------------------------------------------------------- // libc includes #include // Root includes #include "TROOT.h" #include "TClonesArray.h" #include "TVector3.h" #include // framework includes #include "FairRootManager.h" #include "PndLmdGeaneTask.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "FairHit.h" #include "PndMCTrack.h" #include "FairBaseParSet.h" #include "TGeant3.h" #include "FairTrackParH.h" #include "FairTrackParP.h" #include "TDatabasePDG.h" #include "PndTrack.h" #include "FairMCEventHeader.h" // PndSds includes #include "PndSdsMCPoint.h" #include "PndSdsHit.h" #include "PndSdsMergedHit.h" #include #include #include "PndLmdDigiQTask.h" // // ----- Default constructor ------------------------------------------- // PndLmdDigiQTask::PndLmdDigiQTask() : FairTask("Track Quality Task for PANDA Lmd"), fEventNr(0) // { // } // // ------------------------------------------------------------------------- PndLmdDigiQTask::PndLmdDigiQTask(TString digiBranch) : FairTask("Digis Quality Task for PANDA Lmd"), fEventNr(0) { fWriteAllMC = false; fDigiName = digiBranch; } // ----- Destructor ---------------------------------------------------- PndLmdDigiQTask::~PndLmdDigiQTask() { } // ----- Public method Init -------------------------------------------- InitStatus PndLmdDigiQTask::Init() { // Get RootManager FairRootManager* ioman = FairRootManager::Instance(); if ( !ioman){ std::cout << "-E- PndLmdDigiQTask::Init: "<< "RootManager not instantiated!" << std::endl; return kFATAL; } // fMCHeader = (TClonesArray*) ioman->GetObject("MCEventHeader."); // if ( !fMCHeader) { // std::cout << "-W- PndLmdDigiQTask::Init: "<< "No MCEventHeader "<<" object!" << std::endl; // return kERROR; // } //Get MC points fMCHits = (TClonesArray*) ioman->GetObject("LMDPoint"); if ( !fMCHits) { std::cout << "-W- PndLmdDigiQTask::Init: "<< "No LMDPoint"<<" array!" << std::endl; return kERROR; } //Get MC tracks fMCTracks = (TClonesArray*) ioman->GetObject("MCTrack"); if ( !fMCTracks) { std::cout << "-W- PndLmdDigiQTask::Init: "<< "No MCTrack"<<" array!" << std::endl; return kERROR; } //Get digis fDigis = (TClonesArray*) ioman->GetObject("LMDPixelDigis"); if ( !fDigis) { std::cout << "-W- PndLmdDigiQTask::Init: "<< "No LMDPixelDigis"<<" array!" << std::endl; return kERROR; } fDigiQ = new TClonesArray("PndLmdDigiQ"); ioman->Register("LMDPixelDigisQ","DigiQ",fDigiQ,kTRUE); FairRun* fRun = FairRun::Instance(); FairRuntimeDb* rtdb = fRun->GetRuntimeDb(); // if(lmddim!=0 ) lmddim->Cleanup(); lmddim = PndLmdDim::Instance(); return kSUCCESS; } // ------------------------------------------------------------------------- // ----- Public method Exec -------------------------------------------- void PndLmdDigiQTask::Exec(Option_t* opt) { FairRootManager* ioman = FairRootManager::Instance(); double glEvTime= ioman->GetEventTime(); fDigiQ->Delete(); const int nMCHits = fMCHits->GetEntriesFast(); const int nDigis = fDigis->GetEntriesFast(); const int nParticles = fMCTracks->GetEntriesFast(); /// Set elastic/inelastic flag ---------------------------------------------------- bool elfl=false; int sumID=0; int TotCharge=0; for (Int_t iN=0; iNAt(iN); int glPDG = mctrk->GetPdgCode(); Int_t mcID = mctrk->GetPdgCode(); int motherid = mctrk->GetMotherID(); if(motherid<0){ sumID+=fabs(mcID); } } if(sumID==4424) elfl=true; ///------------------------------------------------------------------------------ for (Int_t i=0; iAt(i)); // read digi hit TClonesArray& clref = *fDigiQ; Int_t size = clref.GetEntriesFast(); PndLmdDigiQ *digiq = new(clref[size])PndLmdDigiQ(*DigiPoint, elfl); int nmchits = DigiPoint->GetNIndices(); // number of PndSdsMCPoint(s) contributing to digi int sensorID = DigiPoint->GetSensorID(); int ihalf, iplane, imodule, iside, idie, isensor; lmddim->Get_sensor_by_id(sensorID, ihalf, iplane, imodule, iside, idie, isensor); for(Int_t j=0; jGetIndex(j); PndSdsMCPoint* MCPoint = (PndSdsMCPoint*)(fMCHits->At(mcind)); int MCtrk = MCPoint->GetTrackID(); PndMCTrack *mctrk =(PndMCTrack*) fMCTracks->At(MCtrk); int glPDG = mctrk->GetPdgCode();// barp: -2212 digiq->SetMCtrkID(MCtrk); digiq->SetPDG(glPDG); digiq->SetPlane(iplane); digiq->SetHalf(ihalf); digiq->SetModule(imodule); digiq->SetSide(iside); digiq->SetEvT(glEvTime); int movID = mctrk->GetMotherID();// primary: <0 TVector3 MomMC = mctrk->GetMomentum(); double thMC = MomMC.Theta(); digiq->SetThMC(thMC); if(glPDG==-2212 && movID<0 && elfl) digiq->SetFlSig(); else digiq->SetFlBkg(); } } if(fVerbose>2) cout<<"PndLmdDigiQTask::Exec END!"<