// ------------------------------------------------------------------------- // ----- PndLmdTrkQTask source file ----- // ----- Created 18/06/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 "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" // PndSds includes #include "PndSdsMCPoint.h" #include "PndSdsHit.h" #include "PndSdsMergedHit.h" #include #include #include "PndLmdTrkQTask.h" // ----- Default constructor ------------------------------------------- PndLmdTrkQTask::PndLmdTrkQTask() : FairTask("Track Quality Task for PANDA Lmd"), fEventNr(0) { } // ------------------------------------------------------------------------- PndLmdTrkQTask::PndLmdTrkQTask(Double_t pBeam): FairTask("Track Quality Task for PANDA Lmd"), fEventNr(0) { fWriteAllMC = false; fPbeam = pBeam; //cout<<"Beam Momentum for particle with PDGid#"<GetObject("LMDPoint"); if ( !fMCHits) { std::cout << "-W- PndLmdTrkQTask::Init: "<< "No LMDPoint"<<" array!" << std::endl; return kERROR; } //Get MC tracks fMCTracks = (TClonesArray*) ioman->GetObject("MCTrack"); if ( !fMCTracks) { std::cout << "-W- PndLmdTrkQTask::Init: "<< "No MCTrack"<<" array!" << std::endl; return kERROR; } //Get digis fDigis = (TClonesArray*) ioman->GetObject("LMDPixelDigis"); if ( !fDigis) { std::cout << "-W- PndLmdTrkQTask::Init: "<< "No LMDPixelDigis"<<" array!" << std::endl; return kERROR; } //Get clusters fClusters = (TClonesArray*) ioman->GetObject("LMDPixelClusterCand"); if ( !fClusters) { std::cout << "-W- PndLmdTrkQTask::Init: "<< "No LMDPixelClusterCand"<<" array!" << std::endl; return kERROR; } //Get rec. hits fRecHits = (TClonesArray*) ioman->GetObject("LMDHitsMerged"); if ( !fRecHits) { std::cout << "-W- PndLmdTrkQTask::Init: "<< "No LMDHitsMerged"<<" array!" << std::endl; return kERROR; } //Get trk cand fRecCandTracks = (TClonesArray*) ioman->GetObject("LMDTrackCand"); if ( !fRecCandTracks) { std::cout << "-W- PndLmdTrkQTask::Init: "<< "No LMDTrackCand"<<" array!" << std::endl; return kERROR; } //Get rec.tracks before back propagation fRecTracks = (TClonesArray*) ioman->GetObject("LMDPndTrack"); if (!fRecTracks){ std::cout << "-W- PndLmdTrkQTask::Init: "<< "No LMDPndTrack" << " array!" << std::endl; return kERROR; } //Get rec.tracks after back propagation fRecBPTracks = (TClonesArray*) ioman->GetObject("GeaneTrackFinal"); if (!fRecBPTracks){ std::cout << "-W- PndLmdTrkQTask::Init: "<< "No GeaneTrackFinal" << " array!" << std::endl; return kERROR; } fTrackQ = new TClonesArray("PndLmdTrackQ"); ioman->Register("LMDTrackQ","TrkQ",fTrackQ,kTRUE); // fDetName = new TClonesArray("TObjString"); // ioman->Register("DetName", "TrkQ", fDetName, kTRUE); // fGeoH = PndGeoHandling::Instance(); FairRun* fRun = FairRun::Instance(); FairRuntimeDb* rtdb = fRun->GetRuntimeDb(); // TDatabasePDG *fdbPDG = TDatabasePDG::Instance(); // fdbPDG = TDatabasePDG::Instance(); return kSUCCESS; } // ------------------------------------------------------------------------- // void PndLmdTrkQTask::SetParContainers() // { // } // ----- Public method Exec -------------------------------------------- void PndLmdTrkQTask::Exec(Option_t* opt) { fTrackQ->Delete(); // fDetName->Delete(); Double_t glXrecLMD,glYrecLMD,glZrecLMD,glThetarecLMD,glPhirecLMD; Double_t glXrec,glYrec,glZrec,glThetarec,glPhirec, glMomrec; Double_t glXmc,glYmc,glZmc,glThetamc,glPhimc, glMommc; Double_t glXmcLMD,glYmcLMD,glZmcLMD,glThetamcLMD,glPhimcLMD, glMommcLMD; Int_t trkRECStatus; Int_t trkMCStatus; Double_t glchi2; int glPDG; int glNumMChits; int glNumDoubleMChits; const int nGeaneTrks = fRecBPTracks->GetEntriesFast(); const int nParticles = fMCTracks->GetEntriesFast(); const int numTrk = fRecTracks->GetEntriesFast(); const int nRecHits = fRecHits->GetEntriesFast(); const int nMCHits = fMCHits->GetEntriesFast(); const int nTrkCandidates = fRecCandTracks->GetEntriesFast(); const int nRecTrks = fRecTracks->GetEntriesFast(); if(fVerbose>0) cout<<"%%%%%! Event #"<At(iN); Int_t mcID = mctrk->GetPdgCode(); int motherid = mctrk->GetMotherID(); if(motherid<0 && fabs(mcID)<1e5){ sumID+=fabs(mcID); } // TParticlePDG *fParticle = fdbPDG->GetParticle(mcID); // Double_t fCharge = fParticle->Charge(); // TotCharge += fCharge; } ///------------------------------------------------------------------------------ /// Chech how many MC hits has MC trk ---------------------------- int MCtksSIMhits[nParticles]; int MCDoubleHits[nParticles]; for(int imctrk=0;imctrkAt(imc)); int MCtrk = MCPoint->GetTrackID(); MCtksSIMhits[MCtrk]++; } ///------------------------------------------------------------------------------ /// Chech how many REC hits has MC trk ---------------------------- int MCtksREChits[nParticles]; for(int imctrk=0;imctrk7) cout<<" ** ALL REChits are made from MChits: "<At(irec)); int mcrefbot = myHit->GetSecondMCHit(); int MCtrkidbot,MCtrkidtop; if(mcrefbot>0){ PndSdsMCPoint* MCPointBot = (PndSdsMCPoint*)(fMCHits->At(mcrefbot)); int MCtrkid = MCPointBot->GetTrackID(); if(MCtrkid<0) fMCnegative=true;//TODO: how it is possible??? MCtksREChits[MCtrkid]++; MCtrkidbot=MCtrkid; if(fVerbose>7) cout<<" "<GetZ()<<")"; } int mcreftop = myHit->GetRefIndex(); if(mcreftop>0){ PndSdsMCPoint* MCPointTop = (PndSdsMCPoint*)(fMCHits->At(mcreftop)); int MCtrkid = MCPointTop->GetTrackID(); if(MCtrkid<0) fMCnegative=true;//TODO: how it is possible??? MCtksREChits[MCtrkid]++; MCtrkidtop=MCtrkid; if(fVerbose>7) cout<<" "<GetZ()<<")"; } if(mcreftop>0 && mcrefbot>0){ if(MCtrkidtop==MCtrkidbot){ MCDoubleHits[MCtrkidbot]++; } else{ if(fVerbose>7) cout<<" REChit No."<7) cout<<" "<7) cout<<"bad event, skip it!"<At(iN); double chi2 = trkpnd->GetChi2(); FairTrackParP fFittedTrkP = trkpnd->GetParamFirst(); TVector3 PosRecLMD(fFittedTrkP.GetX(),fFittedTrkP.GetY(),fFittedTrkP.GetZ()); TVector3 MomRecLMD(fFittedTrkP.GetPx(),fFittedTrkP.GetPy(),fFittedTrkP.GetPz()); MomRecLMD *=fPbeam/MomRecLMD.Mag(); int candID = trkpnd->GetRefIndex(); PndTrackCand *trkcand = (PndTrackCand*)fRecCandTracks->At(candID); TVector3 PosRecCandLMD = trkcand->getPosSeed(); TVector3 MomRecCandLMD = trkcand->getDirSeed(); MomRecCandLMD *=fPbeam/MomRecCandLMD.Mag(); } ///------------------------------------------------------------------- /// Set MC ID for each track ---------------------------------------------------- Int_t nRecGEANEtrk = 0; int MCtrk[nParticles]; //Number of participation this MCid in rec.tracks int RECtrkMCid[nGeaneTrks];//Assignment MC id to REC trk; for(int nk=0;nk3) cout<<"GEANEtrk#"<At(iN); TVector3 PosRec = fRes->GetPosition(); Double_t lyambda = fRes->GetLambda(); if(lyambda==0){ cout<<"GEANE didn't propagate "<At(iN); double chi2 = trkpnd->GetChi2(); int candID = trkpnd->GetRefIndex(); //if(fVerbose>5) cout<<"candID = "<At(candID); const int Ntrkcandhits = trkcand->GetNHits(); // PndSdsMCPoint* MCPointHit; int MCtrkID[Ntrkcandhits]; //arrray of hits MCid for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++){ MCtrkID[iHit]=9999; } Int_t diffIDs=1; //Matching between MC & Rec on hits level----------------------------------- bool emergExit=false; if(fVerbose>7) cout<<" *** REChits in trk (with "<7) cout<<"No."<GetSortedHit(iHit)); Int_t hitID = candhit.GetHitId(); PndSdsMergedHit* myHit = (PndSdsMergedHit*)(fRecHits->At(hitID)); int mcrefbot = myHit->GetSecondMCHit(); bool badpxbot=false; bool badpxtop=false; if(mcrefbot>=0){ PndSdsMCPoint* MCPointBot = (PndSdsMCPoint*)(fMCHits->At(mcrefbot)); int MCtrkid = MCPointBot->GetTrackID(); if(MCtrkid<0){ emergExit=true; if(fVerbose>7) cout<<" "<-1) MCtrkID[iHit]=MCtrkid; if(fVerbose>7) cout<<" "<7) cout<<" Ooops, mcrefbot = "<GetRefIndex(); if(mcreftop>=0){ // if(fVerbose>5) // cout<<", "<At(mcreftop)); int MCtrkid = MCPointTop->GetTrackID(); if(MCtrkid<0){ emergExit=true; if(fVerbose>7) cout<<" "<-1) MCtrkID[iHit]=MCtrkid; if(fVerbose>7) cout<<" "<7) cout<<" Ooops, mcreftop = "<7) cout<<" "<9998) break; if(prevID countMC_IDs(diffIDs); for(int kn=0;kn9998) break; if(prevID1) cout<<""<3) cout<<"countMC_IDs["<maxID){ maxID=countMC_IDs[kn]; posIDmax = kn; } } prevID = MCtrkID[0]; diffCount=0; for(Int_t n=0; n-1){ // All tracks /// Read MC track parameters ---------------------------------------------------------- int MCidforREC = RECtrkMCid[iN]; PndMCTrack *mctrk =(PndMCTrack*) fMCTracks->At(MCidforREC); Int_t mcID = mctrk->GetPdgCode(); TVector3 MomMC = mctrk->GetMomentum(); Double_t thetaMC = MomMC.Theta(); Double_t phiMC = MomMC.Phi(); ///------------------------------------------------------------------------------------ /// Read track-parameters after back-propagation --------------------------------------- //TODO: problem with covarance matrix in FairTrackParH??? Double_t CovGEANELAB[6][6]; fRes->GetMARSCov(CovGEANELAB); Double_t errX = fRes->GetDX(); Double_t errY = fRes->GetDY(); Double_t errZ = fRes->GetDZ(); Double_t errPx = fRes->GetDPx(); Double_t errPy = fRes->GetDPy(); Double_t errPz = fRes->GetDPz(); TVector3 errMomBP(errPx,errPy,errPz); Double_t thetaBP = TMath::Pi()/2. - lyambda; Double_t err_lyambda = fRes->GetDLambda(); if(err_lyambda==0) err_lyambda = errMomBP.Theta(); // Double_t err_lyambda = errMom.Theta(); Double_t phiBP = fRes->GetPhi(); Double_t err_phi = fRes->GetDPhi(); if(err_phi==0) err_phi=errMomBP.Phi(); Double_t errMomRecBP = fRes->GetDQp(); TVector3 MomRecBP = fRes->GetMomentum(); ///================================== } ///------------------------------------------------------------------------------------- } /// (II) missed\ghost tracks are defined on hits information /// GHOST ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- ///check repeated assignment to one MC trk (maybe one MC trk rec. trk was assigned to several REC trk) --------------------------------- //NB: it's only quantity and _ NOT_ quality check. 1st REC trk will be called GOOD and 2nd and others GHOST int RECassigMC[nGeaneTrks];//how many time MCid from this RECtrk met in other RECtrks for (Int_t iN=0; iN3) cout<<"GHOST?!: rec.trks #"<1){ //one RECtrk was already called GOOD for this MCid -> all next are GHOSTs goodTrk[iN]=false; ghostTrk[iN]=true; trkType = +2; ghostRecI++; } if(goodTrk[iN]){ if(fVerbose>7) cout<<"... RECtrk#"<7) cout<<"... RECtrk#"<At(iN); Double_t lyambda = fRes->GetLambda(); if(lyambda==0) trkType=-10; // cout<<"GEANE didn't propagate "<GetPhi(); TVector3 MomRecBP = fRes->GetMomentum(); TVector3 PosBP = fRes->GetPosition(); //Fill tree with rec vs. mc trk info ------------------------------------------------ glXrec = PosBP.X(); glYrec = PosBP.Y(); glZrec = PosBP.Z(); glThetarec = thetaBP; glPhirec = phiBP; glMomrec = MomRecBP.Mag(); Double_t errX = fRes->GetDX(); Double_t errY = fRes->GetDY(); Double_t errZ = fRes->GetDZ(); Double_t errPx = fRes->GetDPx(); Double_t errPy = fRes->GetDPy(); Double_t errPz = fRes->GetDPz(); TVector3 errMomBP(errPx,errPy,errPz); Double_t err_lyambda = fRes->GetDLambda(); // if(err_lyambda==0) err_lyambda = errMomBP.Theta(); Double_t err_phi = fRes->GetDPhi(); PndTrack *trkpnd = (PndTrack*)fRecTracks->At(iN); glchi2 = trkpnd->GetChi2(); FairTrackParP fFittedTrkP = trkpnd->GetParamFirst(); TVector3 PosRecLMD(fFittedTrkP.GetX(),fFittedTrkP.GetY(),fFittedTrkP.GetZ()); TVector3 MomRecLMD(fFittedTrkP.GetPx(),fFittedTrkP.GetPy(),fFittedTrkP.GetPz()); MomRecLMD *=fPbeam/MomRecLMD.Mag(); glXrecLMD = PosRecLMD.X(); glYrecLMD = PosRecLMD.Y(); glZrecLMD = PosRecLMD.Z(); glThetarecLMD = MomRecLMD.Theta(); glPhirecLMD = MomRecLMD.Phi(); trkRECStatus = trkType; if(trkType>0){ //TODO: ghost-doubled trks has MC trk!!! glXmc= -9999; glYmc =-9999; glZmc = -9999; glThetamc =-9999; glPhimc = -9999; glMommc = -9999; glXmcLMD = -9999; glYmcLMD =-9999; glZmcLMD = -9999; glThetamcLMD =-9999; glPhimcLMD = -9999; glMommcLMD = -9999; glNumMChits = -9999; glNumDoubleMChits = -9999; trkMCStatus = -9999; glPDG = -9999; } else{ int MCidforREC = RECtrkMCid[iN]; // if(!goodTrk[iN]) continue; PndMCTrack *mctrk =(PndMCTrack*) fMCTracks->At(MCidforREC); glPDG = mctrk->GetPdgCode(); TVector3 MomMC = mctrk->GetMomentum(); glThetamc = MomMC.Theta(); glPhimc = MomMC.Phi(); glMommc = MomMC.Mag(); TVector3 StartMC = mctrk->GetStartVertex(); glXmc= StartMC.X(); glYmc = StartMC.Y(); glZmc = StartMC.Z(); int movID = mctrk->GetMotherID(); if(movID<0) trkMCStatus=0; else trkMCStatus=+1; glNumMChits = MCtksSIMhits[MCidforREC]; glNumDoubleMChits = MCDoubleHits[MCidforREC]; //Get MC info in LMD int candID = trkpnd->GetRefIndex(); PndTrackCand *trkcand = (PndTrackCand*)fRecCandTracks->At(candID); PndTrackCandHit candhit = (PndTrackCandHit)(trkcand->GetSortedHit(0));//1st hit info Int_t hitID = candhit.GetHitId(); PndSdsMergedHit* myHit = (PndSdsMergedHit*)(fRecHits->At(hitID)); int mcrefbot = myHit->GetSecondMCHit(); int mcreftop = myHit->GetRefIndex(); PndSdsMCPoint* MCPointHit; if(mcreftop>=0){ MCPointHit = (PndSdsMCPoint*)(fMCHits->At(mcreftop)); } else{ MCPointHit = (PndSdsMCPoint*)(fMCHits->At(mcrefbot)); } TVector3 PosMClmd = MCPointHit->GetPosition(); double pxTrue = MCPointHit->GetPx(); double pyTrue = MCPointHit->GetPy(); double pzTrue = MCPointHit->GetPz(); TVector3 MomMClmd(pxTrue,pyTrue,pzTrue); glXmcLMD = PosMClmd.X(); glYmcLMD = PosMClmd.Y(); glZmcLMD = PosMClmd.Z(); glThetamcLMD = MomMClmd.Theta(); glPhimcLMD = MomMClmd.Phi(); glMommcLMD = MomMClmd.Mag(); } // tRECMCtrks->Fill(); TClonesArray& clref = *fTrackQ; Int_t size = clref.GetEntriesFast(); PndLmdTrackQ *trkqlmd = new(clref[size])PndLmdTrackQ(glMommc); trkqlmd->SetTrkRecStatus(trkRECStatus); trkqlmd->SetSecondary(trkMCStatus); trkqlmd->SetPDGcode(glPDG); trkqlmd->SetLMDpoint(glXrecLMD,glYrecLMD,glZrecLMD); trkqlmd->SetLMDdir(glThetarecLMD,glPhirecLMD); trkqlmd->SetLMDchi2(glchi2); trkqlmd->SetIPpoint(glXrec,glYrec,glZrec); trkqlmd->SetIPmom(glThetarec,glPhirec,glMomrec); trkqlmd->SetIPerrpoint(errX,errY,errZ); trkqlmd->SetIPerrmom(err_lyambda,err_phi,errMomBP.Mag()); trkqlmd->SetMCpoint(glXmc,glYmc,glZmc); trkqlmd->SetMCmom(glThetamc,glPhimc,glMommc); trkqlmd->SetSecondary(trkMCStatus); trkqlmd->SetNumMChits(glNumMChits); trkqlmd->SetNumDoubleMChits(glNumDoubleMChits); trkqlmd->SetMCpointLMD(glXmcLMD,glYmcLMD,glZmcLMD); trkqlmd->SetMCmomLMD(glThetamcLMD,glPhimcLMD,glMommcLMD); // trkqlmd->SetTotEvCharge(TotCharge); trkqlmd->SetSumEvPDG(sumID); trkqlmd->SetEvMCMulti(nParticles); trkqlmd->SetEvRECMulti(nGeaneTrks); //(end) Fill tree with rec vs. mc trk info --------------------------------------- } ///END GHOST-------------------------------------------------------------------------------------------------------------------------------------------------------------------- /// MISSED ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ if((nParticles-goodRecII)>0){ //missed trks int nMCmissedTrkSearch=0; int nMCmissedLossHits=0; for(int imc=0;imcAt(imc); int movID = mctrk->GetMotherID(); TVector3 MomMC = mctrk->GetMomentum(); TVector3 PosMC = mctrk->GetStartVertex(); int trkQ=0; /// if MC trk was missed, justify why int minHits = MCDoubleHits[imc]+2; if(MCDoubleHits[imc]==4) minHits -=1; if(missTrk){ if(MCtksREChits[imc]>minHits){//missed during trk-search if(fVerbose>7){ cout<<" --- MCtrk#"<"<0) cout<<" NB:this MCtrk contains "<0){// if MCtksREChits[imc]==0 trk is out of measurment range nMCmissedLossHits++; trkQ=-2; if(fVerbose>7) cout<<" --- MCtrk#"<"<