// ------------------------------------------------------------------------- // ----- 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(); // htthetatphiTrkFit = new TNtuple("htthetatphiTrkFit","ntthetatphiTrk","tg_theta:tg_phi"); return kSUCCESS; } // ------------------------------------------------------------------------- // ----- Public method Exec -------------------------------------------- void PndLmdTrksFilterTask::Exec(Option_t* opt) { fTrkOutArray->Delete(); if(fVerbose>4){ cout<<""<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 stopch; //if trks were checked by chi2 there is no need to check them futher vector vchi2; int mcidtop[4][gll]; int mcidbot[4][gll]; for (unsigned int i = 0; iAt(i)); bool dirOK=true; // //check theta&phi----- FairTrackParP fFittedTrkP = trkpnd->GetParamFirst(); TVector3 MomRecLMD(fFittedTrkP.GetPx(),fFittedTrkP.GetPy(),fFittedTrkP.GetPz()); MomRecLMD *=1./MomRecLMD.Mag(); double thetaCent=MomRecLMD.Theta()-0.040; if(fVerbose<2){ if(abs(thetaCent)>0.011 || abs(MomRecLMD.Phi())>0.25) dirOK=false; if(abs(fFittedTrkP.GetX())>1000. || abs(fFittedTrkP.GetY())>1000) dirOK=false; //misaligned sensors give wierd results } // //-------------------------- double chi2 = trkpnd->GetChi2(); vchi2.push_back(chi2); trk_accept.push_back(dirOK); // stopch.push_back(false); 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]) if(fVerbose>4) 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; } // stopch[i]=true; // stopch[j]=true; } } if(fVerbose>4){ cout<<" trk#"<0 && trkHn[i]==3 && trkHn[j]==3){// if 1 hit is similar if(vchi2[i]>vchi2[j]){ trk_accept[i]=false; trk_accept[j]=true; } else{ trk_accept[i]=true; trk_accept[j]=false; } }// if 1 hit is similar } } } } //save good trks int rec_trk=0; for (unsigned int i = 0; i4){ cout<<" trk#"<At(i)); // //check theta&phi----- if(fVerbose>4){ FairTrackParP fFittedTrkP = trkpnd->GetParamFirst(); TVector3 MomRecLMD(fFittedTrkP.GetPx(),fFittedTrkP.GetPy(),fFittedTrkP.GetPz()); MomRecLMD *=1./MomRecLMD.Mag(); double thetaCent=MomRecLMD.Theta()-0.0402; // htthetatphiTrkFit->Fill(MomRecLMD.Theta(),MomRecLMD.Phi()); } new((*fTrkOutArray)[rec_trk]) PndTrack(*(trkpnd)); //save Track rec_trk++; } } if(fVerbose>2) cout<<"Ev#"<GetEntriesFast(); // if(fVerbose>2) 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){ // if(fVerbose>2) cout<<""<2) cout<<"pl"<GetSecondMCHit(); // if(mcrefbot>0){ // PndSdsMCPoint* MCPointBot = (PndSdsMCPoint*)(fMCHitArray->At(mcrefbot)); // int MCtrkid = MCPointBot->GetTrackID(); // if(fVerbose>2) cout<GetRefIndex(); // if(mcreftop>0){ // PndSdsMCPoint* MCPointTop = (PndSdsMCPoint*)(fMCHitArray->At(mcreftop)); // int MCtrkid = MCPointTop->GetTrackID(); // if(fVerbose>2) cout<2) cout<<"; "; // } // if(fVerbose>2) cout<<""<2) cout<<"PndLmdTrksFilterTask::Exec END!"<CloneTree(); // nout1->Write(); } ClassImp(PndLmdTrksFilterTask);