// ------------------------------------------------------------------------- // ----- PndLmdTrksFilterTask source file ----- // ----- Created 06/05/13 by A.Karavdina ----- // ------------------------------------------------------------------------- // libc includes #include // Root includes #include "TROOT.h" #include "TClonesArray.h" #include "TVector3.h" #include // framework includes #include "FairRootManager.h" #include "PndLmdTrksFilterTask.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" // PndSds includes #include "PndSdsMCPoint.h" #include "PndSdsHit.h" #include "PndSdsMergedHit.h" //PndLmd includes //#include "PndLinTrack.h" #include #include // ----- Default constructor ------------------------------------------- PndLmdTrksFilterTask::PndLmdTrksFilterTask() : FairTask("Tracks filtering Task for PANDA Lmd"), fEventNr(0) { fHitName="LMDHitsMerged"; fMCHitName="LMDPoint"; // fClusterName = clusterBranch; // fDigiName = digiBrunch; fTrkCandName = "LMDTrackCand"; fTrkName="LMDPndTrack"; fTrkOutName="LMDPndTrack"; } // ----- Destructor ---------------------------------------------------- PndLmdTrksFilterTask::~PndLmdTrksFilterTask() { } // ----- Public method Init -------------------------------------------- InitStatus PndLmdTrksFilterTask::Init() { // Get RootManager FairRootManager* ioman = FairRootManager::Instance(); if(ioman==0) { Error("PndLmdTrksFilterTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection fMCHitArray=(TClonesArray*) ioman->GetObject(fMCHitName); if(fMCHitArray==0) { Error("PndLmdTrksFilterTask::Init","MC hit-array not found!"); return kERROR; } fHitArray=(TClonesArray*) ioman->GetObject(fHitName); if(fHitArray==0) { Error("PndLmdTrksFilterTask::Init","hit-array not found!"); return kERROR; } fTrkArray=(TClonesArray*) ioman->GetObject(fTrkName); if(fTrkArray==0) { Error("PndLmdTrksFilterTask::Init","track-array not found!"); return kERROR; } fTrkCandArray=(TClonesArray*) ioman->GetObject(fTrkCandName); if(fTrkCandArray==0) { Error("PndLmdTrksFilterTask::Init","trk-cand--array not found!"); return kERROR; } fTrkOutArray = new TClonesArray("PndTrack"); ioman->Register("LMDPndTrack", "PndLmd", fTrkOutArray, kTRUE); // fClusterArray=(TClonesArray*) ioman->GetObject(fClusterName); // if(fClusterArray==0) // { // Error("PndLmdTrksFilterTask::Init","cluster-array not found!"); // return kERROR; // } // fDigiArray=(TClonesArray*) ioman->GetObject(fDigiName); // if(fDigiArray==0) // { // Error("PndLmdTrksFilterTask::Init","digi-array not found!"); // return kERROR; // } lmddim = PndLmdDim::Instance(); return kSUCCESS; } // ------------------------------------------------------------------------- // ----- Public method Exec -------------------------------------------- void PndLmdTrksFilterTask::Exec(Option_t* opt) { if(fVerbose>4){ cout<<""<Delete(); //go through all tracks const unsigned int gll = fTrkArray->GetEntriesFast(); int trksH0[gll];//hits on pl#0 int trksH1[gll];//hits on pl#1 int trksH2[gll];//hits on pl#2 int trksH3[gll];//hits on pl#3 vector trkHn;//number of hits in trk vector trk_accept; vector vchi2; int mcidtop[4][gll]; int mcidbot[4][gll]; for (unsigned int i = 0; iAt(i)); double chi2 = trkpnd->GetChi2(); vchi2.push_back(chi2); trk_accept.push_back(true); int candID = trkpnd->GetRefIndex(); PndTrackCand *trkcand = (PndTrackCand*)fTrkCandArray->At(candID); const unsigned int Ntrkcandhits= trkcand->GetNHits(); trkHn.push_back(Ntrkcandhits); for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++){ // loop over rec.hits PndTrackCandHit candhit = (PndTrackCandHit)(trkcand->GetSortedHit(iHit)); Int_t hitID = candhit.GetHitId(); // PndSdsHit* myHit = (PndSdsHit*)(fHitArray->At(hitID)); PndSdsMergedHit* myHit = (PndSdsMergedHit*)(fHitArray->At(hitID)); Int_t sensid = myHit->GetSensorID(); int ihalf,iplane,imodule,iside,idie,isensor; lmddim->Get_sensor_by_id(sensid,ihalf,iplane,imodule,iside,idie,isensor); // if(fVerbose>4){ // cout<<"trk# "<GetSecondMCHit(); if(mcrefbot>0){ PndSdsMCPoint* MCPointBot = (PndSdsMCPoint*)(fMCHitArray->At(mcrefbot)); int MCtrkid = MCPointBot->GetTrackID(); mcidbot[iplane][i] = MCtrkid; } else{ mcidbot[iplane][i] = -1; } int mcreftop = myHit->GetRefIndex(); if(mcreftop>0){ PndSdsMCPoint* MCPointTop = (PndSdsMCPoint*)(fMCHitArray->At(mcreftop)); int MCtrkid = MCPointTop->GetTrackID(); mcidtop[iplane][i] = MCtrkid; } else{ mcidtop[iplane][i] = -1; } if(mcidbot[iplane][i]>0 && mcidtop[iplane][i]>0){ if(mcidtop[iplane][i]!=mcidbot[iplane][i]) cout<<"Attention! mcidtop!=mcidbot: for trk#"<4){ cout<<" trk#"<1){// if 2 and more hits are similar if(trkHn[i]>trkHn[j]){ //take trk with higher number of hits trk_accept[i]=true; trk_accept[j]=false; } else{ if(trkHn[i]vchi2[j]){ trk_accept[i]=false; trk_accept[j]=true; } else{ trk_accept[i]=true; trk_accept[j]=false; } } } if(fVerbose>4){ cout<<" trk#"<4){ cout<<" trk#"<At(i)); new((*fTrkOutArray)[rec_trk]) PndTrack(*(trkpnd)); //save Track rec_trk++; } } if(fVerbose>2) cout<<"Ev#"<GetEntriesFast(); cout<<"MC trks in rec.Hits:"<At(iHit)); Int_t sensid = myHit->GetSensorID(); int ihalf,iplane,imodule,iside,idie,isensor; lmddim->Get_sensor_by_id(sensid,ihalf,iplane,imodule,iside,idie,isensor); if(iplane!=plprev){ cout<<""<GetSecondMCHit(); if(mcrefbot>0){ PndSdsMCPoint* MCPointBot = (PndSdsMCPoint*)(fMCHitArray->At(mcrefbot)); int MCtrkid = MCPointBot->GetTrackID(); cout<GetRefIndex(); if(mcreftop>0){ PndSdsMCPoint* MCPointTop = (PndSdsMCPoint*)(fMCHitArray->At(mcreftop)); int MCtrkid = MCPointTop->GetTrackID(); cout<2) cout<<"PndLmdTrksFilterTask::Exec END!"<