#include "PndDetectorList.h" #include "PndPidCorrelatorMod.h" #include "PndPidCandidate.h" #include "PndMCTrack.h" #include "PndTrack.h" #include "PndTrackID.h" #include "PndSciTPoint.h" #include "PndSciTHit.h" #include "PndEmcBump.h" #include "PndEmcDigi.h" #include "PndEmcStructure.h" #include "PndEmcXtal.h" #include "PndEmcErrorMatrix.h" #include "PndEmcClusterCalibrator.h" #include "PndEmcClusterEnergySums.h" #include "PndMdtPoint.h" #include "PndMdtHit.h" #include "PndMdtTrk.h" #include "PndDrcBarPoint.h" #include "PndDrcHit.h" #include "PndDskParticle.h" #include "FairTrackParH.h" #include "FairMCApplication.h" #include "FairRunAna.h" #include "FairRootManager.h" #include "FairRuntimeDb.h" #include "TObjArray.h" #include "TVector3.h" #include "TGeoMatrix.h" #include "TGeoManager.h" #include "TSystem.h" #include static Int_t fNrOfEvents = 0; Int_t nPidProg = 0; // ---------------------------------------------------------- // --- Interface with PidMaker and output --- //___________________________________________________________ PndPidCorrelatorMod::~PndPidCorrelatorMod() { // FairRootManager *fManager =FairRootManager::Instance(); fManager->Write(); delete fEmcErrorMatrix; } //___________________________________________________________ PndPidCorrelatorMod::PndPidCorrelatorMod() : FairTask(), fMcTrack(0), fTrack(0), fTrackID(0), fTrack2(0), fTrackID2(0), fPidChargedCand(0), fPidNeutralCand(0), fMdtTrack(0), fMvdHitsStrip(0), fMvdHitsPixel(0), fTofHit(0), fTofPoint(0), fFtofHit(0), fFtofPoint(0), fEmcCluster(0), fEmcBump(0), fEmcDigi(0), fMdtPoint(0), fMdtHit(0), fMdtTrk(0), fDrcPoint(0), fDrcHit(0), fDskParticle(0), fSttHit(0), fFtsHit(0), fCorrPar(new PndPidCorrPar()), fEmcGeoPar(new PndEmcGeoPar()), fEmcErrorMatrixPar(new PndEmcErrorMatrixPar()), fEmcErrorMatrix(new PndEmcErrorMatrix()), fSttParameters(new PndGeoSttPar()), fEmcCalibrator(NULL), fEmcClstCount(0), fFscClstCount(0), fDebugMode(kFALSE), fGeanePro(kTRUE), fMdtRefit(kFALSE), fMvdMode(-1), fSttMode(-1), fFtsMode(-1), fTofMode(-1), fFtofMode(-1), fEmcMode(-1), fMdtMode(-1), fDrcMode(-1), fDskMode(-1), fMixMode(kFALSE), fPidHyp(0), fIdealHyp(kFALSE), fFast(kFALSE), fSimulation(kFALSE), fIdeal(kFALSE), fCorrErrorProp(kTRUE), fFlagCut(kTRUE), fBackPropagate(kTRUE), tofCorr(0), emcCorr(0), fscCorr(0), drcCorr(0), dskCorr(0), fTrackBranch(""), fTrackIDBranch(""), fTrackBranch2(""), fTrackIDBranch2(""), fTrackOutBranch(""), sDir(""), sFile(""), fGeoH(NULL), fClusterList(), fClusterQ(), mapMdtBarrel(), mapMdtEndcap(), mapMdtForward(), fGeanePropagator(NULL) { //--- fPidChargedCand = new TClonesArray("PndPidCandidate"); fPidNeutralCand = new TClonesArray("PndPidCandidate"); sDir = "./"; sFile = "./pidcorrelator.root"; fGeoH = PndGeoHandling::Instance(); // Resetting MDT geometry parameters for (Int_t mm=0; mm<3; mm++) for (Int_t ll=0; ll<20;ll++) { mdtLayerPos[mm][ll] = -1; mdtIronThickness[mm][ll] = -1; } Reset(); } //___________________________________________________________ PndPidCorrelatorMod::PndPidCorrelatorMod(const char *name, const char *title) : FairTask(name), fMcTrack(0), fTrack(0), fTrackID(0), fTrack2(0), fTrackID2(0), fPidChargedCand(0), fPidNeutralCand(0), fMdtTrack(0), fMvdHitsStrip(0), fMvdHitsPixel(0), fTofHit(0), fTofPoint(0), fFtofHit(0), fFtofPoint(0), fEmcCluster(0), fEmcBump(0), fEmcDigi(0), fMdtPoint(0), fMdtHit(0), fMdtTrk(0), fDrcPoint(0), fDrcHit(0), fDskParticle(0), fSttHit(0), fFtsHit(0), fCorrPar(new PndPidCorrPar()), fEmcGeoPar(new PndEmcGeoPar()), fEmcErrorMatrixPar(new PndEmcErrorMatrixPar()), fEmcErrorMatrix(new PndEmcErrorMatrix()), fSttParameters(new PndGeoSttPar()), fEmcCalibrator(NULL), fEmcClstCount(0), fFscClstCount(0), fDebugMode(kFALSE), fGeanePro(kTRUE), fMdtRefit(kFALSE), fMvdMode(-1), fSttMode(-1), fFtsMode(-1), fTofMode(-1), fFtofMode(-1), fEmcMode(-1), fMdtMode(-1), fDrcMode(-1), fDskMode(-1), fMixMode(kFALSE), fPidHyp(0), fIdealHyp(kFALSE), fFast(kFALSE), fSimulation(kFALSE), fIdeal(kFALSE), fCorrErrorProp(kTRUE), fFlagCut(kTRUE), fBackPropagate(kTRUE), tofCorr(0), emcCorr(0), fscCorr(0), drcCorr(0), dskCorr(0), fTrackBranch(""), fTrackIDBranch(""), fTrackBranch2(""), fTrackIDBranch2(""), fTrackOutBranch(""), sDir(""), sFile(""), fGeoH(NULL), fClusterList(), fClusterQ(), mapMdtBarrel(), mapMdtEndcap(), mapMdtForward(), fGeanePropagator(NULL) { //--- fPidChargedCand = new TClonesArray("PndPidCandidate"); fPidNeutralCand = new TClonesArray("PndPidCandidate"); sDir = "./"; sFile = "./pidcorrelator.root"; fGeoH = PndGeoHandling::Instance(); // Resetting MDT geometry parameters for (Int_t mm=0; mm<3; mm++) for (Int_t ll=0; ll<20;ll++) { mdtLayerPos[mm][ll] = -1; mdtIronThickness[mm][ll] = -1; } Reset(); } //___________________________________________________________ InitStatus PndPidCorrelatorMod::Init() { // cout << "InitStatus PndPidCorrelator::Init()" << endl; FairRootManager *fManager =FairRootManager::Instance(); // Get nr of events and digis (for progress counter) fNrOfEvents = ((fManager->GetInTree())->GetEntriesFast())/100; stoptime = 0; // *** STT *** if (fSttMode) { if (fMixMode==kFALSE) { fSttHit = dynamic_cast ( fManager->GetObject("STTHit")); if ( fSttHit ) { cout << "-I- PndPidCorrelator::Init: Using STTHit" << endl; fSttMode = 2; } else { cout << "-W- PndPidCorrelator::Init: No STT hits array! Switching STT OFF" << endl; fSttMode = 0; } } else { fSttHit = dynamic_cast (fManager->GetObject("STTHitMix")); if ( fSttHit ) { cout << "-I- PndPidCorrelator::Init: Using STTHitMix" << endl; fSttMode = 2; } else { cout << "-W- PndPidCorrelator::Init: No STT hits mix array! Switching STT OFF" << endl; fSttMode = 0; } } } // *** FTS *** if (fFtsMode) { if (fMixMode==kFALSE) { fFtsHit =dynamic_cast( fManager->GetObject("FTSHit")); if ( fFtsHit ) { cout << "-I- PndPidCorrelator::Init: Using FTSHit" << endl; fFtsMode = 2; } else { cout << "-W- PndPidCorrelator::Init: No FTS hits array! Switching FTS OFF" << endl; fFtsMode = 0; } } else { fFtsHit =dynamic_cast (fManager->GetObject("FTSHitMix")); if ( fFtsHit ) { cout << "-I- PndPidCorrelator::Init: Using FTSHitMix" << endl; fFtsMode = 2; } else { cout << "-W- PndPidCorrelator::Init: No FTS hits mix array! Switching FTS OFF" << endl; fFtsMode = 0; } } } // *** MVD *** if (fMvdMode) { if (fMixMode==kFALSE) { fMvdHitsStrip = dynamic_cast ( fManager->GetObject("MVDHitsStrip")); if ( ! fMvdHitsStrip ) { cout << "-W- PndPidCorrelator::Init: No MVDHitsStrip array!" << endl; } else fMvdMode = 2; fMvdHitsPixel = dynamic_cast ( fManager->GetObject("MVDHitsPixel")); if ( ! fMvdHitsPixel ) { cout << "-W- PndPidCorrelator::Init: No MVDHitsPixel array!" << endl; } else fMvdMode = 2; } else { fMvdHitsStrip = dynamic_cast ( fManager->GetObject("MVDHitsStripMix")); if ( ! fMvdHitsStrip ) { cout << "-W- PndPidCorrelator::Init: No MVDHitsStripMix array!" << endl; } else fMvdMode = 2; fMvdHitsPixel = dynamic_cast (fManager->GetObject("MVDHitsPixelMix")); if ( ! fMvdHitsPixel ) { cout << "-W- PndPidCorrelator::Init: No MVDHitsPixelMix array!" << endl; } else fMvdMode = 2; } if (( ! fMvdHitsStrip ) && ( ! fMvdHitsPixel )) { cout << "-W- PndPidCorrelator::Init: No MVD hits array! Switching MVD OFF" << endl; fMvdMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using MVDHit" << endl; } } // *** TOF *** if (fTofMode) { fTofHit = dynamic_cast (fManager->GetObject("SciTHit")); if ( ! fTofHit ) { cout << "-W- PndPidCorrelator::Init: No SciTHit array!" << endl; fTofMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using SciTHit" << endl; fTofMode = 2; } if (fIdeal) { fTofPoint = dynamic_cast (fManager->GetObject("SciTPoint")); if ( ! fTofPoint ) { cout << "-W- PndPidCorrelator::Init: No SciTPoint array!" << endl; fTofMode = 0; } } } // *** FTOF *** if (fFtofMode) { fFtofHit = dynamic_cast ( fManager->GetObject("FtofHit")); if ( ! fFtofHit ) { cout << "-W- PndPidCorrelator::Init: No FtofHit array!" << endl; fFtofMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using FtofHit" << endl; fFtofMode = 2; } if (fIdeal) { fFtofPoint = dynamic_cast (fManager->GetObject("FtofPoint")); if ( ! fFtofPoint ) { cout << "-W- PndPidCorrelator::Init: No FtofPoint array!" << endl; fFtofMode = 0; } } } // *** EMC *** if (fEmcMode) { bool forceClusters = false; bool forceBumps = false; if (fEmcMode == 2) forceClusters = true; if (fEmcMode == 3) forceBumps = true; fEmcCluster = dynamic_cast ( fManager->GetObject("EmcCluster")); if ( ! fEmcCluster ) { cout << "-W- PndPidCorrelator::Init: No EmcCluster array!" << endl; fEmcMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using EmcCluster" << endl; if (!forceBumps) fEmcMode = 2; // don't change the mode if the user wants to force the use of bumps } fEmcBump = dynamic_cast (fManager->GetObject("EmcPhiBump")); if ( ! fEmcBump ) { cout << "-W- PndPidCorrelator::Init: No EmcBump array!" << endl; } else { cout << "-I- PndPidCorrelator::Init: Using EmcBump" << endl; if (!forceClusters) fEmcMode = 3; // don't change the mode if the user wants to force the use of clusters } fEmcDigi = dynamic_cast ( fManager->GetObject("EmcDigiClusterBase")); if ( ! fEmcDigi) { cout << "-W- PndPidCorrelator::Init: No EmcDigi array! No EMC E1/E9/E25 information is propagated!" << endl; } } // *** DRC *** if (fDrcMode) { fDrcHit = dynamic_cast (fManager->GetObject("DrcHit")); if ( ! fDrcHit ) { cout << "-W- PndPidCorrelator::Init: No DrcHit array!" << endl; fDrcMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using DrcHit" << endl; fDrcMode = 2; } } // *** DSK *** if (fDskMode) { fDskParticle = dynamic_cast ( fManager->GetObject("DskParticle")); if ( ! fDskParticle ) { cout << "-W- PndPidCorrelator::Init: No DskParticle array!" << endl; fDskMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using DskParticle" << endl; fDskMode = 2; } } // *** MDT *** if (fMdtMode) { fMdtHit = dynamic_cast (fManager->GetObject("MdtHit")); if ( ! fMdtHit ) { cout << "-W- PndPidCorrelator::Init: No MdtHit array!" << endl; fMdtMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using MdtHit" << endl; fMdtMode = 2; } fMdtTrk = dynamic_cast (fManager->GetObject("MdtTrk")); if ( ! fMdtTrk ) { cout << "-W- PndPidCorrelator::Init: No MdtTrk array!" << endl; } else { cout << "-I- PndPidCorrelator::Init: Using MdtTrk" << endl; fMdtMode = 3; } } if (fIdeal) { cout << "-I- PndPidCorrelator::Init: Using MonteCarlo correlation" << endl; fTofPoint =dynamic_cast ( fManager->GetObject("TofPoint")); if ( ! fTofPoint ) { cout << "-W- PndPidCorrelator::Init: No TofPoint array!" << endl; fTofMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using TofPoint" << endl; } fDrcPoint = dynamic_cast (fManager->GetObject("DrcBarPoint")); if ( ! fDrcPoint ) { cout << "-W- PndPidCorrelator::Init: No DrcBarPoint array!" << endl; fDrcMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using DrcPoint" << endl; } fMdtPoint = dynamic_cast ( fManager->GetObject("MdtPoint")); if ( ! fMdtPoint ) { cout << "-W- PndPidCorrelator::Init: No MdtPoint array!" << endl; fMdtMode = 0; } else { cout << "-I- PndPidCorrelator::Init: Using MdtPoint" << endl; } } Register(); fCorrPar->printParams(); if (fGeanePro) { cout << "-I- PndPidCorrelator::Init: Using Geane for Track propagation" << endl; fGeanePropagator = new FairGeanePro(); if (!fCorrErrorProp) { cout << "-I- PndPidCorrelator::Init: Switching OFF Geane error propagation" << endl; fGeanePropagator->PropagateOnlyParameters(); } if (fIdealHyp) { fMcTrack = dynamic_cast (fManager->GetObject("MCTrack")); if ( ! fMcTrack ) { cout << "-I- PndPidCorrelator::Init: No PndMcTrack array! No ideal pid hypothesis is possible!" << endl; return kERROR; } if (fTrackIDBranch=="") { cout << "-I- PndPidCorrelator::Init: No TrackID Branch name! No ideal pid hypothesis is possible!" << endl; return kERROR; } } else { switch (abs(fPidHyp)) { case 0: cout << "-I- PndPidCorrelator::Init: No PID set -> Using default PION hypothesis" << endl; fPidHyp = 211; break; case 11: cout << "-I- PndPidCorrelator::Init: Using ELECTRON hypothesis" << endl; fPidHyp = -11; break; case 13: cout << "-I- PndPidCorrelator::Init: Using MUON hypothesis" << endl; fPidHyp = -13; break; case 211: cout << "-I- PndPidCorrelator::Init: Using PION hypothesis" << endl; fPidHyp = 211; break; case 321: cout << "-I- PndPidCorrelator::Init: Using KAON hypothesis" << endl; fPidHyp = 321; break; case 2212: cout << "-I- PndPidCorrelator::Init: Using PROTON hypothesis" << endl; fPidHyp = 2212; break; default: cout << "-I- PndPidCorrelator::Init: Not recognised PID set -> Using default PION hypothesis" << endl; fPidHyp = 211; break; } } } else { return kFATAL; } if (fMdtMode>0) { if (!MdtGeometry()) { cout << "-W- PndPidCorrelator::Init: No MDT geometry ???" << endl; fMdtMode = 0; } } if (fMdtRefit) { fFitter = new PndRecoKalmanFit(); fFitter->SetGeane(fGeanePro); fFitter->SetNumIterations(1); if (!fFitter->Init()) return kFATAL; } if (fDebugMode) { r = TFile::Open(sDir+sFile,"RECREATE"); tofCorr = new TNtuple("tofCorr","TRACK-TOF Correlation", "track_x:track_y:track_z:track_phi:track_p:track_charge:track_theta:track_z0:tof_x:tof_y:tof_z:tof_phi:chi2:dphi:len:glen"); ftofCorr = new TNtuple("ftofCorr","TRACK-FTOF Correlation", "track_x:track_y:track_z:ver_x:ver_y:ver_z:ver_px:ver_py:ver_pz:track_p:track_charge:track_theta:track_z0:tof_x:tof_y:tof_z:chi2:len:glen:tlen"); emcCorr = new TNtuple("emcCorr","TRACK-EMC Correlation", "track_x:track_y:track_z:track_phi:track_p:track_charge:track_theta:track_z0:emc_x:emc_y:emc_z:emc_phi:chi2:dphi:emc_ene:glen:emc_mod"); fscCorr = new TNtuple("fscCorr","TRACK-FSC Correlation", "track_x:track_y:track_z:track_phi:track_p:track_charge:track_theta:track_z0:emc_x:emc_y:emc_z:emc_phi:chi2:dphi:emc_ene:glen:emc_mod"); mdtCorr = new TNtuple("mdtCorr","TRACK-MDT Correlation", "track_x:track_y:track_z:track_dx:track_dy:track_dz:track_phi:track_p:track_charge:track_theta:track_z0:mdt_x:mdt_y:mdt_z:mdt_phi:mdt_p:chi2:mdt_mod:dphi:glen:mdt_count:nhits"); drcCorr = new TNtuple("drcCorr","TRACK-DRC Correlation", "track_x:track_y:track_z:track_phi:track_p:track_charge:track_theta:track_z0:drc_x:drc_y:drc_phi:chi2:drc_thetac:drc_nphot:dphi:glen:flag"); dskCorr = new TNtuple("dskCorr","TRACK-DSK Correlation", "track_x:track_y:track_z:track_phi:track_p:track_charge:track_theta:track_z0:dsk_x:dsk_y:dsk_z:dsk_phi:chi2:dsk_thetac:dsk_nphot:dphi:glen:track_lx:track_ly:track_lz:track_xp:flag"); cout << "-I- PndPidCorrelator::Init: Filling Debug histograms" << endl; } // Set Parameters for Emc error matrix if (fEmcMode>0) { if (fEmcErrorMatrixPar->IsValid()) { fEmcErrorMatrix->Init(fEmcErrorMatrixPar->GetParObject()); //std::cout<<"PndPidCorrelator: Emc error matrix is read from RTDB"<GetGeometryVersion(); fEmcErrorMatrix->InitFromFile(emcGeomVersion); fEmcErrorMatrixPar->SetErrorMatrixObject(fEmcErrorMatrix->GetParObject()); //std::cout<<"PndPidCorrelator: Emc error matrix is read from file"<GetRuntimeDb(); if ( ! db ) Fatal("PndPidCorrelator:: SetParContainers", "No runtime database"); // Get PID Correlation parameter container fCorrPar = (PndPidCorrPar*) db->getContainer("PndPidCorrPar"); // Get Emc geometry parameter container fEmcGeoPar = (PndEmcGeoPar*) db->getContainer("PndEmcGeoPar"); // Get Emc error matrix parameter container fEmcErrorMatrixPar = (PndEmcErrorMatrixPar*) db->getContainer("PndEmcErrorMatrixPar"); // Get Stt parameter fSttParameters = (PndGeoSttPar*) db->getContainer("PndGeoSttPar"); fFtsParameters = (PndGeoFtsPar*) db->getContainer("PndGeoFtsPar"); } //______________________________________________________ void PndPidCorrelatorMod::Exec(Option_t * option) { //- Reset(); fTimer.Start(kFALSE); if (fEmcMode>0) { PndEmcCluster *tmp_cluster; for(Int_t i=0; i < fEmcCluster->GetEntriesFast();i++) { tmp_cluster = (PndEmcCluster*)fEmcCluster->At(i); if(tmp_cluster->GetModule() < 5 && tmp_cluster->GetModule() >0) { fEmcClstCount++; } if(tmp_cluster->GetModule() == 5) { fFscClstCount++; } } ResetEmcQ(); if (fVerbose>2) { cout << " - Number of Clusters for pid: "; cout << " EMC: " << fEmcClstCount; cout << " FSC: " << fFscClstCount; } } if (fVerbose>2) cout<0) && (!fFast)) ConstructNeutralCandidate(); fEventCounter++; } //______________________________________________________ void PndPidCorrelatorMod::ConstructChargedCandidate() { //- //FIXME: Use Clear() to save time. //Call Delete() only for too busy events to save Memory fPidChargedCand->Delete(); if (fMdtRefit) fMdtTrack->Delete(); if (fMdtMode>0) MdtMapping(); Int_t nTracks = fTrack->GetEntriesFast(); for (Int_t i = 0; i < nTracks; i++) { PndTrack* track = (PndTrack*) fTrack->At(i); Int_t ierr = 0; FairTrackParP par = track->GetParamLast(); if ((par.GetMomentum().Mag()<0.05) || (par.GetMomentum().Mag()>15.) )continue; // cut low and high momenta if ((fFlagCut) && (track->GetFlag()<=0)) continue; // cut flag<=0 FairTrackParH *helix = new FairTrackParH(&par, ierr); PndPidCandidate* pidCand = new PndPidCandidate(); if (fTrackIDBranch!="") { PndTrackID* trackID = (PndTrackID*) fTrackID->At(i); if (trackID->GetNCorrTrackId()>0) { pidCand->SetMcIndex(trackID->GetCorrTrackID()); if (fIdealHyp) { PndMCTrack *mcTrack = (PndMCTrack*)fMcTrack->At(trackID->GetCorrTrackID()); if ( ! mcTrack ) { fPidHyp = 211; cout << "-I- PndPidCorrelator::ConstructChargedCandidate: PndMCTrack does not exist!! (why?) -> let's try with pion hyp " << endl; } else { fPidHyp = abs(mcTrack->GetPdgCode()); } if (fPidHyp>=100000000) { fPidHyp = 211; std::cout << "-I- PndPidCorrelator::ConstructChargedCandidate: Track is an ion (PDGCode>100000000) -> let's try with pion hyp" << std::endl; } if ( abs(fPidHyp)==13 ) fPidHyp = -13; if ( abs(fPidHyp)==11 ) fPidHyp = -11; } } } else { // added for PndAnalysis, TODO: remove after Fairlinks work with Associators PndTrackCand trackCand = track->GetTrackCand(); pidCand->SetMcIndex(trackCand.getMcTrackId()); } pidCand->SetTrackIndex(i); pidCand->SetTrackBranch(FairRootManager::Instance()->GetBranchId(fTrackBranch)); pidCand->AddLink(FairLink(fTrackBranch, i)); if (!GetTrackInfo(track, pidCand)) continue; if ( (fMvdMode==2) && ((fMvdHitsStrip->GetEntriesFast()+fMvdHitsPixel->GetEntriesFast())>0) ) GetMvdInfo(track, pidCand); if ( (fSttMode == 2) && (fSttHit ->GetEntriesFast()>0) ) GetSttInfo(track, pidCand); GetGemInfo(track, pidCand); if (!fFast) { if ( (fTofMode==2) && (fTofHit ->GetEntriesFast()>0) ) GetTofInfo(helix, pidCand); if ( (fEmcMode>0) && (fEmcClstCount>0) ) GetEmcInfo(helix, pidCand); if ( (fMdtMode>0) && (fMdtHit ->GetEntriesFast()>0) ) GetMdtInfo(track, pidCand); if ( (fDrcMode>0) && (fDrcHit ->GetEntriesFast()>0) ) GetDrcInfo(helix, pidCand); if ( (fDskMode>0) && (fDskParticle->GetEntriesFast()>0)) GetDskInfo(helix, pidCand); } AddChargedCandidate(pidCand); } if (fTrackBranch2!="") { Int_t nTracks2 = fTrack2->GetEntriesFast(); for (Int_t i = 0; i < nTracks2; i++) { PndTrack* track = (PndTrack*) fTrack2->At(i); Int_t ierr = 0; FairTrackParP par = track->GetParamLast(); if ((par.GetMomentum().Mag()<0.1) || (par.GetMomentum().Mag()>20.) )continue; // cut low and high momenta if ((fFlagCut) && (track->GetFlag()<=0)) continue; // cut flag<=0 FairTrackParH *helix = new FairTrackParH(&par, ierr); PndPidCandidate* pidCand = new PndPidCandidate(); if (fTrackIDBranch2!="") { PndTrackID* trackID = (PndTrackID*) fTrackID2->At(i); if (trackID->GetNCorrTrackId()>0) { pidCand->SetMcIndex(trackID->GetCorrTrackID()); if (fIdealHyp) { PndMCTrack *mcTrack = (PndMCTrack*)fMcTrack->At(trackID->GetCorrTrackID()); if ( ! mcTrack ) { fPidHyp = 211; cout << "-I- PndPidCorrelator::ConstructChargedCandidate: PndMCTrack does not exist!! (why?) -> let's try with pion hyp " << endl; } else { fPidHyp = abs(mcTrack->GetPdgCode()); } if (fPidHyp>=100000000) { fPidHyp = 211; std::cout << "-I- PndPidCorrelator::ConstructChargedCandidate: Track is an ion (PDGCode>100000000) -> let's try with pion hyp" << std::endl; } if ( abs(fPidHyp)==13 ) fPidHyp = -13; if ( abs(fPidHyp)==11 ) fPidHyp = -11; } } } else { // added for PndAnalysis, TODO: remove after Fairlinks work with Associators PndTrackCand trackCand = track->GetTrackCand(); pidCand->SetMcIndex(trackCand.getMcTrackId()); } pidCand->SetTrackIndex(i); pidCand->SetTrackBranch(FairRootManager::Instance()->GetBranchId(fTrackBranch2)); pidCand->AddLink(FairLink("PndTrack", i)); if (!GetTrackInfo(track, pidCand)) continue; if ( (fMvdMode==2) && ((fMvdHitsStrip->GetEntriesFast()+fMvdHitsPixel->GetEntriesFast())>0) ) GetMvdInfo(track, pidCand); if ( (fFtsMode == 2) && (fFtsHit ->GetEntriesFast()>0) ) GetFtsInfo(track, pidCand); GetGemInfo(track, pidCand); if (!fFast) { if ( (fFtofMode==2) && (fFtofHit->GetEntriesFast()>0) ) GetFtofInfo(helix, pidCand); if ( (fEmcMode>0) && (fFscClstCount>0) ) GetFscInfo(helix, pidCand); //if ( (fMdtMode>0) && (fMdtHit ->GetEntriesFast()>0) ) GetMdtInfo(track, pidCand); if (mapMdtForward.size()>0) GetFMdtInfo(&par, pidCand); } // end of fast mode AddChargedCandidate(pidCand); } } } //______________________________________________________ void PndPidCorrelatorMod::ConstructNeutralCandidate() { //- fPidNeutralCand->Delete(); TString emcType; Int_t nBumps = 0; if (fEmcMode == 2) { nBumps = fEmcCluster->GetEntriesFast(); emcType = "EmcCluster"; } else if(fEmcMode == 3) { nBumps = fEmcBump->GetEntriesFast(); emcType = "EmcBump"; } if (fVerbose>3) std::cout << "Nr of clusters: " << nBumps << endl; for (Int_t i = 0; i < nBumps; i++) { PndEmcBump* bump; PndEmcCluster *clu; //Float_t quality = -1.; if (fEmcMode==2) { //if (fClusterList[i]) continue; bump = (PndEmcBump*) fEmcCluster->At(i); clu = (PndEmcBump*) fEmcCluster->At(i); //quality = fClusterQ[i]; } else if(fEmcMode == 3) { bump = (PndEmcBump*) fEmcBump->At(i); //if (fClusterList[bump->GetClusterIndex()]) continue; // skip correlated clusters clu = (PndEmcCluster*)fEmcCluster->At(bump->GetClusterIndex()); //quality = fClusterQ[bump->GetClusterIndex()]; } // ----- Overwrite existing digiArray and fill with digis fetched via FairLinks ----// /*int NrOfDigis = fEmcDigi->GetEntries(); cout << "Number of Digis (cluster "<< i << "): " << fEmcDigi->GetEntries() << endl; for (int bf=0; bfGetEntries(); bf++) { PndEmcDigi *digi = (PndEmcDigi *) fEmcDigi->At(bf); cout << digi->GetEnergy() << " "; } cout << "\nDeleting digi array..." << endl; fEmcDigi->Delete(); cout << "Getting linked digis... "; std::cout << *clu->GetPointerToLinks() << std::endl; FairMultiLinkedData digiLinks = clu->GetLinksWithType(FairRootManager::Instance()->GetBranchId("EmcDigiSorted")); cout << digiLinks.GetNLinks() << " found." << endl; if (digiLinks.GetNLinks() < NrOfDigis) continue; for (Int_t j=0; jGetCloneOfLinkData(digiLinks.GetLink(j)); if(myDigi) { cout << myDigi->GetEnergy() << "(L) "; PndEmcDigi* newDigi = new((*fEmcDigi)[fEmcDigi->GetEntriesFast()]) PndEmcDigi(*myDigi); delete(myDigi); } else { std::cout << "-E in PndPidCorrelatorMod::ConstructNeutralCandidate() FairLink " << digiLinks.GetLink(j) << " to EmcDigi delivers null" << std::endl; } } cout << endl;*/ // ------------------------ // TVector3 vtx(0,0,0); TVector3 v1=bump->where(); TVector3 p3; p3.SetMagThetaPhi(fEmcCalibrator->Energy(bump), v1.Theta(), v1.Phi()); TLorentzVector lv(p3,p3.Mag()); TMatrixD covP4=fEmcErrorMatrix->Get4MomentumErrorMatrix(*clu); TMatrixD covP7=fEmcErrorMatrix->GetErrorP7(*clu); // *** Real PID correlator compares the bump location to the vertex of digi tracks here *** // // omitted for testing purposes (and because it leads to crashes atm) -> set vertex location to IP // // std::cout << "Constructing pidCand (EMC)" << endl; PndPidCandidate* pidCand = new PndPidCandidate(0, vtx, lv); pidCand->SetP4Cov(covP4); pidCand->SetCov7(covP7); pidCand->SetEmcRawEnergy(bump->energy()); pidCand->SetEmcCalEnergy(fEmcCalibrator->Energy(bump)); pidCand->SetEmcIndex(i); pidCand->SetEmcModule(bump->GetModule()); pidCand->SetEmcNumberOfCrystals(bump->NumberOfDigis()); pidCand->SetEmcNumberOfBumps(clu->NBumps()); pidCand->SetLastHit(v1); pidCand->SetEmcClusterZ20(bump->Z20()); pidCand->SetEmcClusterZ53(bump->Z53()); pidCand->SetEmcClusterLat(bump->LatMom()); /*if (fEmcDigi) { PndEmcClusterEnergySums esum(*clu, fEmcDigi); pidCand->SetEmcClusterE1(esum.E1()); pidCand->SetEmcClusterE9(esum.E9()); pidCand->SetEmcClusterE25(esum.E25()); }*/ pidCand->SetLink(FairLink(emcType, i)); std::vector mclist = clu->GetMcList(); if (mclist.size()>0) { pidCand->SetMcIndex(mclist[0]); } AddNeutralCandidate(pidCand); } } void PndPidCorrelatorMod::ResetEmcQ() { // Fuction to reset all the quality values for emc-track correlation to -1 fClusterQ.clear(); fClusterList.clear(); for (Int_t ii=0; iiGetEntriesFast(); ii++) { fClusterQ[ii] = -1; fClusterList[ii] = kFALSE; } } //_________________________________________________________________ void PndPidCorrelatorMod::Register() { //--- TString chargName = "PidChargedCand" + fTrackOutBranch; FairRootManager::Instance()-> Register(chargName,"Pid", fPidChargedCand, kTRUE); FairRootManager::Instance()-> Register("PidNeutralCand","Pid", fPidNeutralCand, kTRUE); if (fMdtRefit) { FairRootManager::Instance()-> Register("MdtTrack","Pid", fMdtTrack, kTRUE); } } //_________________________________________________________________ void PndPidCorrelatorMod::Finish() { //--- cout << endl; if (fDebugMode) { //TFile *r = TFile::Open(sDir+sFile,"RECREATE"); r->cd(); tofCorr->Write(); ftofCorr->Write(); emcCorr->Write(); fscCorr->Write(); mdtCorr->Write(); drcCorr->Write(); dskCorr->Write(); r->Save(); tofCorr->Delete(); ftofCorr->Delete(); emcCorr->Delete(); fscCorr->Delete(); mdtCorr->Delete(); drcCorr->Delete(); dskCorr->Delete(); tofCorr = 0; ftofCorr = 0; emcCorr = 0; fscCorr = 0; mdtCorr = 0; drcCorr = 0; dskCorr = 0; r->Close(); r->Delete(); } } //_________________________________________________________________ void PndPidCorrelatorMod::Reset() { //--- fMvdPath = 0.; fMvdELoss = 0.; fMvdHitCount = 0; fEmcClstCount = 0; fFscClstCount = 0; fClusterList.clear(); fClusterQ.clear(); mapMdtBarrel.clear(); mapMdtEndcap.clear(); mapMdtForward.clear(); } //_________________________________________________________________ PndPidCandidate* PndPidCorrelatorMod::AddChargedCandidate(PndPidCandidate* cand) { // Creates a new hit in the TClonesArray. TClonesArray& pidRef = *fPidChargedCand; Int_t size = pidRef.GetEntriesFast(); return new(pidRef[size]) PndPidCandidate(*cand); } //_________________________________________________________________ PndPidCandidate* PndPidCorrelatorMod::AddNeutralCandidate(PndPidCandidate* cand) { // Creates a new hit in the TClonesArray. TClonesArray& pidRef = *fPidNeutralCand; Int_t size = pidRef.GetEntriesFast(); return new(pidRef[size]) PndPidCandidate(*cand); } //_________________________________________________________________ PndTrack* PndPidCorrelatorMod::AddMdtTrack(PndTrack* track) { // Creates a new hit in the TClonesArray. TClonesArray& pidRef = *fMdtTrack; Int_t size = pidRef.GetEntriesFast(); return new(pidRef[size]) PndTrack(*track); } ClassImp(PndPidCorrelatorMod)