// ------------------------------------------------------------------------- // ----- 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" #include "FairMCEventHeader.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,TString geaneBranch) : FairTask("Track Quality Task for PANDA Lmd"), fEventNr(0) { fWriteAllMC = false; fPbeam = pBeam; fGeaneName = geaneBranch; //cout<<"Beam Momentum for particle with PDGid#"<GetObject("MCEventHeader."); // if ( !fMCHeader) { // std::cout << "-W- PndLmdTrkQTask::Init: "<< "No MCEventHeader "<<" object!" << std::endl; // return kERROR; // } //Get MC points fMCHits = (TClonesArray*) ioman->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("LMDPndTrackFilt"); if (!fRecTracks){ std::cout << "-W- PndLmdTrkQTask::Init: "<< "No LMDPndTrackFilt" << " array!" << std::endl; return kERROR; } //Get rec.tracks after back propagation // fRecBPTracks = (TClonesArray*) ioman->GetObject("GeaneTrackFinal");//use raw reconstructed data // fRecBPTracks = (TClonesArray*) ioman->GetObject("LMDCleanTrack");//use cleaned data fRecBPTracks = (TClonesArray*) ioman->GetObject(fGeaneName); 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(); lmddim = PndLmdDim::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; int glModule, glHalf; FairRootManager* ioman = FairRootManager::Instance(); // double glEvTime = FairRootManager::Instance()->GetEventTime(); double glEvTime= ioman->GetEventTime(); // FairMCEventHeader* iomchead = (FairMCEventHeader*) ioman->GetObject("MCEventHeader"); // FairMCEventHeader* mcevhead = (FairMCEventHeader*) fMCHeader->At(0); // int glEvID = mcevhead->GetEventID(); // cout<<"this is event # "<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); glPDG = mctrk->GetPdgCode(); 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]; // const int nSize = 2e4; // int MCtksREChits[nSize];//add arbitrary number of fake trks due to noise hits 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; //MCtrkid = fabs(MCtrkid)+1e4; MCtrkid = MCtrkid; } 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??? // MCtrkid = fabs(MCtrkid)+1e4; MCtrkid = MCtrkid; } 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(); // cout<<"candID = "<At(candID); /// Obtain first approximation const int numPts = trkcand->GetNHits(); //read how many points in this track PndTrackCandHit theHit1 = trkcand->GetSortedHit(0); //get 1st hit Int_t index1 = theHit1.GetHitId(); PndSdsHit* Hit1sds = (PndSdsHit*) fRecHits->At(index1); TVector3 posSeed = Hit1sds->GetPosition(); PndTrackCandHit theHit2 = trkcand->GetSortedHit(numPts-1); //get last hit Int_t index2 = theHit2.GetHitId(); PndSdsHit* Hit2sds = (PndSdsHit*) fRecHits->At(index2); TVector3 pos2 = Hit2sds->GetPosition(); TVector3 MomRecCandLMD = pos2 - posSeed; MomRecCandLMD *=fPbeam/MomRecCandLMD.Mag(); // 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;nkAt(iN); TVector3 PosRec = fRes->GetPosition(); Double_t lyambda = fRes->GetLambda(); if(lyambda==0){ cout<<"GEANE didn't propagate trk No."<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(prevID3) 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(); // // glPDG = 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=-100; //Trk was not back-propagated! // 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; 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 sensorID = myHit->GetSensorID(); int ihalf, iplane, imodule, iside, idie, isensor; lmddim->Get_sensor_by_id(sensorID, ihalf, iplane, imodule, iside, idie, isensor); glModule = imodule; glHalf = ihalf; glTrkTime = myHit->GetTimeStamp(); //TODO: include info from GetTimeStampError() // if(trkType>0){ //TODO: ghost-doubled trks has MC trk!!! // // int MCidforREC = RECtrkMCid[iN]; // // 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; // glEvTime = -9999; // // trkMCStatus = -9999; // // glPDG = -9999; // } // else{ // } int MCidforREC = RECtrkMCid[iN]; // if(!goodTrk[iN]) continue; //cout<<" MCidforREC = "<9998){ 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; // glEvTime = -9999; trkMCStatus = -9999; glPDG = -9999; } else{ PndMCTrack *mctrk =(PndMCTrack*) fMCTracks->At(MCidforREC); glPDG = mctrk->GetPdgCode(); // glEvTime = mctrk->GetStartTime(); //this gives start time of trk, doesn't matter since all el. pbar start in IP 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(); trkMCStatus = movID; // if(movID<0) trkMCStatus=1; // else // trkMCStatus=0; glNumMChits = MCtksSIMhits[MCidforREC]; glNumDoubleMChits = MCDoubleHits[MCidforREC]; // //Get MC info in LMD int mcrefbot = myHit->GetSecondMCHit(); int mcreftop = myHit->GetRefIndex(); if(fVerbose>0){ cout<<"mcrefbot = "<"<0) cout<<" NB:this MCtrk contains "<0){// if MCtksREChits[imc]==0 trk is out of measurment range // if(MCtksREChits[imc]>0){// if MCtksREChits[imc]==0 trk is out of measurment range nMCmissedLossHits++; trkQ=-2; if(fVerbose>7) cout<<" --- MCtrk#"<"<