// ------------------------------------------------------------------------- // ----- MvdPidIdealTask source file ----- // ----- Created 20/03/07 by R.Kliemt ----- // ------------------------------------------------------------------------- // libc includes #include // Root includes #include "TROOT.h" #include "TString.h" #include "TClonesArray.h" #include "TParticlePDG.h" // framework includes #include "CbmRootManager.h" #include "MvdPidIdealTask.h" #include "CbmRunAna.h" #include "CbmRuntimeDb.h" #include "../mcstack/CbmMCTrack.h" // Mvd includes #include "MvdPoint.h" #include "MvdTrackCand.h" // #include "MvdCluster.h" // ----- Default constructor ------------------------------------------- MvdPidIdealTask::MvdPidIdealTask() : CbmTask("Digitization task for PANDA Mvd") { fBranchName = "MvdPoint"; } // ------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- MvdPidIdealTask::~MvdPidIdealTask() { } // ----- Public method Init -------------------------------------------- InitStatus MvdPidIdealTask::Init() { // Get RootManager CbmRootManager* ioman = CbmRootManager::Instance(); if ( ! ioman ) { std::cout << "-E- MvdPidIdealTask::Init: "<< "RootManager not instantiated!" << std::endl; return kFATAL; } // Get input array fPointArray = (TClonesArray*) ioman->GetObject(fBranchName); if ( ! fPointArray ) { std::cout << "-W- MvdPidIdealTask::Init: "<< "No "<GetObject("MCTrack"); if(fMctruthArray==0) { std::cout << "-W- MvdPidIdealTask::Init: "<< "No McTruth array!" << std::endl; return kERROR; } // Create and register output array fTrackOutputArray = new TClonesArray("MvdTrackCand"); ioman->Register("MvdTrackCand", "Mvd ideal tracklets", fTrackOutputArray, kTRUE); return kSUCCESS; } // ------------------------------------------------------------------------- void MvdPidIdealTask::SetParContainers() { // Get Base Container CbmRunAna* ana = CbmRunAna::Instance(); CbmRuntimeDb* rtdb=ana->GetRuntimeDb(); } // ----- Public method Exec -------------------------------------------- void MvdPidIdealTask::Exec(Option_t* opt) { if ( ! fTrackOutputArray ) Fatal("Exec", "No fTrackOutputArray"); fTrackOutputArray->Clear(); // CREATE MONTECARLO MAP std::map mcmap; Int_t nmc=fMctruthArray->GetEntriesFast(); for(int imc=0;imcAt(imc); mcmap[imc]=mc; } // BUILD TRACK Candidates std::map trackMap; Int_t nMvdHits=fPointArray->GetEntriesFast(); for(Int_t iMvdHit=0;iMvdHitAt(iMvdHit); int MCid=mvdpoint->GetTrackID(); // cut on secondaries (deltas) etc if(MCid<0)continue; TVector3 pos; mvdpoint->Position(pos); // build tracks here: // check if track already candidated: if(trackMap[MCid]==0) { int pdgcode = mcmap[MCid]->GetPdgCode(); TParticlePDG pdgpart(pdgcode); int mcCharge = (int)pdgpart.Charge(); TVector3 pos = mcmap[MCid]->GetStartVertex(); TVector3 mom = mcmap[MCid]->GetMomentum(); double invp = 1 / mom.Mag(); double dxdz = invp*mom.x()*mom.z(); double dydz = invp*mom.y()*mom.z(); double sigx = 0.01, sigy = 0.01, sigdxdz = 0.01, sigdydz = 0.01, siginvp = 0.01; sigx*=pos.x(); sigy*=pos.y(); sigdxdz*=dxdz; sigdydz*=dydz; siginvp*=invp; if(fVerbose>1) std::cout<<"MvdPidIdealTask::Exec(), Particle Info: " <