25 #include "FairTrackParH.h"
26 #include "FairMCApplication.h"
27 #include "FairRunAna.h"
28 #include "FairRootManager.h"
29 #include "FairRuntimeDb.h"
31 #include "TObjArray.h"
33 #include "TGeoMatrix.h"
34 #include "TGeoManager.h"
46 FairRootManager *fManager =FairRootManager::Instance();
53 FairTask(), fMcTrack(0), fTrack(0), fTrack2(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), fRichPoint(0), fRichHit(0),
80 fCorrErrorProp(kTRUE),
86 fBackPropagate(kTRUE),
88 fGeanePropagator(NULL),
102 sFile =
"./pidcorrelator.root";
106 for (Int_t
mm=0;
mm<3;
mm++)
107 for (Int_t ll=0; ll<20;ll++)
119 fMcTrack(0), fTrack(0), fTrack2(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), fRichPoint(0), fRichHit(0),
145 fCorrErrorProp(kTRUE),
151 fBackPropagate(kTRUE),
153 fGeanePropagator(NULL),
167 sFile =
"./pidcorrelator.root";
171 for (Int_t
mm=0;
mm<3;
mm++)
172 for (Int_t ll=0; ll<20;ll++)
186 FairRootManager *fManager =FairRootManager::Instance();
190 cout <<
"-I- PndPidCorrelator::Init: No PndTrack array!" << endl;
207 cout <<
"-I- PndPidCorrelator::Init: No 2nd PndTrack array!" << endl;
226 fSttHit =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"STTHit"));
229 cout <<
"-I- PndPidCorrelator::Init: Using STTHit" << endl;
234 cout <<
"-W- PndPidCorrelator::Init: No STT hits array! Switching STT OFF" << endl;
240 fSttHit =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"STTHitMix"));
243 cout <<
"-I- PndPidCorrelator::Init: Using STTHitMix" << endl;
248 cout <<
"-W- PndPidCorrelator::Init: No STT hits mix array! Switching STT OFF" << endl;
259 fFtsHit =
dynamic_cast<TClonesArray *
>( fManager->GetObject(
"FTSHit"));
262 cout <<
"-I- PndPidCorrelator::Init: Using FTSHit" << endl;
267 cout <<
"-W- PndPidCorrelator::Init: No FTS hits array! Switching FTS OFF" << endl;
273 fFtsHit =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"FTSHitMix"));
276 cout <<
"-I- PndPidCorrelator::Init: Using FTSHitMix" << endl;
281 cout <<
"-W- PndPidCorrelator::Init: No FTS hits mix array! Switching FTS OFF" << endl;
292 fMvdHitsStrip =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"MVDHitsStrip"));
295 cout <<
"-W- PndPidCorrelator::Init: No MVDHitsStrip array!" << endl;
299 fMvdHitsPixel =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"MVDHitsPixel"));
302 cout <<
"-W- PndPidCorrelator::Init: No MVDHitsPixel array!" << endl;
308 fMvdHitsStrip =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"MVDHitsStripMix"));
311 cout <<
"-W- PndPidCorrelator::Init: No MVDHitsStripMix array!" << endl;
315 fMvdHitsPixel =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"MVDHitsPixelMix"));
318 cout <<
"-W- PndPidCorrelator::Init: No MVDHitsPixelMix array!" << endl;
325 cout <<
"-W- PndPidCorrelator::Init: No MVD hits array! Switching MVD OFF" << endl;
330 cout <<
"-I- PndPidCorrelator::Init: Using MVDHit" << endl;
337 fTofHit =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"SciTHit"));
340 cout <<
"-W- PndPidCorrelator::Init: No SciTHit array!" << endl;
345 cout <<
"-I- PndPidCorrelator::Init: Using SciTHit" << endl;
350 fTofPoint =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"SciTPoint"));
353 cout <<
"-W- PndPidCorrelator::Init: No SciTPoint array!" << endl;
362 fFtofHit =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"FtofHit"));
365 cout <<
"-W- PndPidCorrelator::Init: No FtofHit array!" << endl;
370 cout <<
"-I- PndPidCorrelator::Init: Using FtofHit" << endl;
375 fFtofPoint =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"FtofPoint"));
378 cout <<
"-W- PndPidCorrelator::Init: No FtofPoint array!" << endl;
387 fEmcCluster =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"EmcCluster"));
390 cout <<
"-W- PndPidCorrelator::Init: No EmcCluster array!" << endl;
395 cout <<
"-I- PndPidCorrelator::Init: Using EmcCluster" << endl;
399 fEmcBump =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"EmcBump"));
402 cout <<
"-W- PndPidCorrelator::Init: No EmcBump array!" << endl;
406 cout <<
"-I- PndPidCorrelator::Init: Using EmcBump" << endl;
410 fEmcDigi =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"EmcDigi"));
413 cout <<
"-W- PndPidCorrelator::Init: No EmcDigi array! No EMC E1/E9/E25 information is propagated!" << endl;
420 fDrcHit =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"DrcHit"));
423 cout <<
"-W- PndPidCorrelator::Init: No DrcHit array!" << endl;
428 cout <<
"-I- PndPidCorrelator::Init: Using DrcHit" << endl;
436 fDskParticle =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"DskParticle"));
439 cout <<
"-W- PndPidCorrelator::Init: No DskParticle array!" << endl;
444 cout <<
"-I- PndPidCorrelator::Init: Using DskParticle" << endl;
452 fMdtHit =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"MdtHit"));
455 cout <<
"-W- PndPidCorrelator::Init: No MdtHit array!" << endl;
460 cout <<
"-I- PndPidCorrelator::Init: Using MdtHit" << endl;
463 fMdtTrk =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"MdtTrk"));
466 cout <<
"-W- PndPidCorrelator::Init: No MdtTrk array!" << endl;
470 cout <<
"-I- PndPidCorrelator::Init: Using MdtTrk" << endl;
478 fRichHit =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"RichHit"));
481 cout <<
"-W- PndPidCorrelator::Init: No RichHit array!" << endl;
486 cout <<
"-I- PndPidCorrelator::Init: Using RichHit" << endl;
493 cout <<
"-I- PndPidCorrelator::Init: Using MonteCarlo correlation" << endl;
494 fTofPoint =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"TofPoint"));
497 cout <<
"-W- PndPidCorrelator::Init: No TofPoint array!" << endl;
502 cout <<
"-I- PndPidCorrelator::Init: Using TofPoint" << endl;
504 fDrcPoint =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"DrcBarPoint"));
507 cout <<
"-W- PndPidCorrelator::Init: No DrcBarPoint array!" << endl;
512 cout <<
"-I- PndPidCorrelator::Init: Using DrcPoint" << endl;
514 fMdtPoint =
dynamic_cast<TClonesArray *
> ( fManager->GetObject(
"MdtPoint"));
517 cout <<
"-W- PndPidCorrelator::Init: No MdtPoint array!" << endl;
522 cout <<
"-I- PndPidCorrelator::Init: Using MdtPoint" << endl;
524 fRichPoint =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"RichBarPoint"));
527 cout <<
"-W- PndPidCorrelator::Init: No RichBarPoint array!" << endl;
532 cout <<
"-I- PndPidCorrelator::Init: Using RichBarPoint" << endl;
542 cout <<
"-I- PndPidCorrelator::Init: Using Geane for Track propagation" << endl;
547 cout <<
"-I- PndPidCorrelator::Init: Switching OFF Geane error propagation" << endl;
552 fMcTrack =
dynamic_cast<TClonesArray *
> (fManager->GetObject(
"MCTrack"));
554 cout <<
"-I- PndPidCorrelator::Init: No PndMcTrack array! No ideal pid hypothesis is possible!" << endl;
567 cout <<
"-I- PndPidCorrelator::Init: No PID set -> Using default PION hypothesis" << endl;
572 cout <<
"-I- PndPidCorrelator::Init: Using ELECTRON hypothesis" << endl;
577 cout <<
"-I- PndPidCorrelator::Init: Using MUON hypothesis" << endl;
582 cout <<
"-I- PndPidCorrelator::Init: Using PION hypothesis" << endl;
587 cout <<
"-I- PndPidCorrelator::Init: Using KAON hypothesis" << endl;
592 cout <<
"-I- PndPidCorrelator::Init: Using PROTON hypothesis" << endl;
597 cout <<
"-I- PndPidCorrelator::Init: Not recognised PID set -> Using default PION hypothesis" << endl;
612 cout <<
"-W- PndPidCorrelator::Init: No MDT geometry ???" << endl;
629 tofCorr =
new TNtuple(
"tofCorr",
"TRACK-TOF Correlation",
630 "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");
631 ftofCorr =
new TNtuple(
"ftofCorr",
"TRACK-FTOF Correlation",
632 "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");
633 emcCorr =
new TNtuple(
"emcCorr",
"TRACK-EMC Correlation",
634 "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");
635 fscCorr =
new TNtuple(
"fscCorr",
"TRACK-FSC Correlation",
636 "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");
637 mdtCorr =
new TNtuple(
"mdtCorr",
"TRACK-MDT Correlation",
638 "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");
639 drcCorr =
new TNtuple(
"drcCorr",
"TRACK-DRC Correlation",
640 "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");
641 dskCorr =
new TNtuple(
"dskCorr",
"TRACK-DSK Correlation",
642 "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");
643 richCorr =
new TNtuple(
"richCorr",
"TRACK-RICH Correlation",
644 "track_x:track_y:track_z:track_phi:track_p:track_charge:track_theta:track_z0:rich_x:rich_y:rich_phi:chi2:rich_thetac:rich_nphot:dphi:glen:flag");
645 cout <<
"-I- PndPidCorrelator::Init: Filling Debug histograms" << endl;
666 if (
fFast) cout <<
"-W- PndPidCorrelator::Init: Using fast correlator!!" << endl;
668 cout <<
"-I- PndPidCorrelator::Init: Success!" << endl;
677 FairRun*
run = FairRun::Instance();
678 if ( ! run ) Fatal(
"PndPidCorrelator:: SetParContainers",
"No analysis run");
680 FairRuntimeDb* db = run->GetRuntimeDb();
681 if ( ! db ) Fatal(
"PndPidCorrelator:: SetParContainers",
"No runtime database");
700 cout <<
" ===== PndPidCorrelator - Event: " <<
fEventCounter;
704 nTracksTot +=
fTrack->GetEntriesFast();
708 nTracksTot +=
fTrack2->GetEntriesFast();
711 cout <<
" - Number of tracks for pid " << nTracksTot;
728 cout <<
" - Number of Clusters for pid: ";
748 Int_t nTracks =
fTrack->GetEntriesFast();
749 for (Int_t
i = 0;
i < nTracks;
i++) {
755 if ((par.GetMomentum().Mag()<0.05) || (par.GetMomentum().Mag()>15.) ) {
763 FairTrackParH *helix =
new FairTrackParH(&par, ierr);
771 std::vector<FairLink> mcTrackLinks = track->GetSortedMCTracks();
772 if (mcTrackLinks.size() > 0) {
773 pidCand->
SetMcIndex(mcTrackLinks[0].GetIndex());
776 mcTrackLinks[0].GetIndex());
780 <<
"-I- PndPidCorrelator::ConstructChargedCandidate: PndMCTrack does not exist!! (why?) -> let's try with pion hyp "
788 <<
"-I- PndPidCorrelator::ConstructChargedCandidate: Track is an ion (PDGCode>100000000) -> let's try with pion hyp"
825 Int_t nTracks2 =
fTrack2->GetEntriesFast();
826 for (Int_t
i = 0;
i < nTracks2;
i++) {
832 if ((par.GetMomentum().Mag()<0.1) || (par.GetMomentum().Mag()>20.) ) {
840 FairTrackParH *helix =
new FairTrackParH(&par, ierr);
847 std::vector<FairLink> mcTrackLinks = track->GetSortedMCTracks();
848 if (mcTrackLinks.size() > 0) {
849 pidCand->
SetMcIndex(mcTrackLinks[0].GetIndex());
852 mcTrackLinks[0].GetIndex());
856 <<
"-I- PndPidCorrelator::ConstructChargedCandidate: PndMCTrack does not exist!! (why?) -> let's try with pion hyp "
864 <<
"-I- PndPidCorrelator::ConstructChargedCandidate: Track is an ion (PDGCode>100000000) -> let's try with pion hyp"
912 emcType =
"EmcCluster";
916 nBumps =
fEmcBump->GetEntriesFast();
920 for (Int_t
i = 0;
i < nBumps;
i++)
946 TLorentzVector lv(p3,p3.Mag());
950 Float_t emcQuality = 1000000;
951 TVector3 vertex(0., 0., 0.);
960 nTracks =
fTrack->GetEntriesFast();
967 for (Int_t tt = 0; tt < nTracks; tt++)
981 FairTrackParH *helix =
new FairTrackParH(&par, ierr);
985 if ((bump->
GetModule()<3) && (helix->GetZ()>150.) )
continue;
986 if ((bump->
GetModule()==3) && (helix->GetZ()<165.) )
continue;
987 if ((bump->
GetModule()==4) && (helix->GetZ()>-30.) )
continue;
998 vertex.SetXYZ(-10000, -10000, -10000);
999 FairTrackParH *fRes=
new FairTrackParH();
1002 vertex.SetXYZ(fRes->GetX(), fRes->GetY(), fRes->GetZ());
1005 Float_t dist = (v1-vertex).Mag2();
1006 if ( emcQuality > dist )
1037 pidCand->SetLink(FairLink(emcType,
i));
1040 if (mclist.size()>0)
1058 for (Int_t ii=0; ii<
fEmcCluster->GetEntriesFast(); ii++)
1070 FairRootManager::Instance()->Register(chargName,
"Pid",
fPidChargedCand, kTRUE);
1071 FairRootManager::Instance()->
1076 FairRootManager::Instance()->
1139 Int_t size = pidRef.GetEntriesFast();
1148 Int_t size = pidRef.GetEntriesFast();
1157 Int_t size = pidRef.GetEntriesFast();
1158 return new(pidRef[size])
PndTrack(*track);
void ConstructChargedCandidate()
void SetTrackIndex(int idx)
void SetEmcNumberOfCrystals(Int_t val)
void SetP4Cov(const TMatrixD &covP4)
void Init(PndEmcErrorMatrixParObject *par)
PndRecoKalmanFit * fFitter
Object to retrieve MVD geometry.
map< Int_t, vector< Int_t > > mapMdtBarrel
void SetEmcNumberOfBumps(Int_t val)
virtual void Exec(Option_t *option)
Short_t GetModule() const
void SetEmcModule(Int_t val)
TClonesArray * fMdtHit
PndMdtPoint TCA.
Bool_t GetFMdtInfo(FairTrackParP *helix, PndPidCandidate *pid)
TClonesArray * fPidNeutralCand
PndPidCandidate TCA for charged particles.
Bool_t GetMvdInfo(PndTrack *track, PndPidCandidate *pid)
PndPidCandidate * AddNeutralCandidate(PndPidCandidate *cand)
Float_t mdtLayerPos[3][20]
void SetEmcClusterE1(Double_t val)
PndEmcErrorMatrix * fEmcErrorMatrix
EMC error matrix parameters.
void SetEmcCalEnergy(Double_t val)
void SetCov7(const TMatrixD &cov7)
TClonesArray * fDskParticle
PndDrcHit TCA.
TFile * r
Geane propagator.
PndEmcErrorMatrixPar * fEmcErrorMatrixPar
EMC geometry parameters.
PndPidCorrPar * fCorrPar
PndRichHit TCA.
void SetEmcQuality(Double_t val)
virtual Double_t Energy(PndEmcCluster *clust, Int_t pid=22)=0
Bool_t GetMdtInfo(PndTrack *track, PndPidCandidate *pid)
map< Int_t, Bool_t > fClusterList
cout<< "POINTs for new FwEndCap == "<< tsim-> GetEntriesFast()
TClonesArray * fMdtTrack
PndPidCandidate TCA for neutral particles.
void SetErrorMatrixObject(PndEmcErrorMatrixParObject *ParObject)
Bool_t GetSttInfo(PndTrack *track, PndPidCandidate *pid)
TClonesArray * fFtsHit
PndSttHit TCA.
PndTrack * AddMdtTrack(PndTrack *track)
Float_t GetEmcNeutralQCut()
Bool_t GetTofInfo(FairTrackParH *helix, PndPidCandidate *pid)
const std::vector< Int_t > & GetMcList() const
TClonesArray * fRichHit
PndRichBarPoint TCA.
PndGeoFtsPar * fFtsParameters
STT geometry parameters.
TMatrixD GetErrorP7(const PndEmcCluster &cluster) const
void SetTrackBranch(int idx)
Bool_t GetFscInfo(FairTrackParH *helix, PndPidCandidate *pid)
TClonesArray * fMdtTrk
PndMdtHit TCA.
Bool_t GetRichInfo(FairTrackParH *helix, PndPidCandidate *pid)
PndEmcAbsClusterCalibrator * fEmcCalibrator
FTS geometry parameters.
void ConstructNeutralCandidate()
virtual Double_t E1() const
void InitFromFile(Int_t geomVersion)
h_MC_angle SetTitle("MC truth: opening angle of #pi^{0}")
Bool_t GetFtofInfo(FairTrackParH *helix, PndPidCandidate *pid)
TClonesArray * fSttHit
PndDskParticle TCA //need to change to PndDskHit in future.
TClonesArray * fMvdHitsPixel
PndSdsHit TCA for strip.
virtual void SetParContainers()
void SetEmcClusterE9(Double_t val)
void SetEmcIndex(Int_t val)
Bool_t GetDrcInfo(FairTrackParH *helix, PndPidCandidate *pid)
PndPidCandidate * AddChargedCandidate(PndPidCandidate *cand)
FairTrackParP GetParamLast()
virtual ~PndPidCorrelator()
static PndEmcAbsClusterCalibrator * MakeEmcClusterCalibrator(Int_t method, Int_t version=1)
PndEmcErrorMatrixParObject * GetParObject()
TMatrixD Get4MomentumErrorMatrix(const PndEmcCluster &cluster) const
TClonesArray * fDrcHit
PndDrcBarPoint TCA.
map< Int_t, vector< Int_t > > mapMdtForward
Bool_t GetGemInfo(PndTrack *track, PndPidCandidate *pid)
a cluster (group of neighboring crystals) of hit emc crystals
TClonesArray * fTrack2
PndTrackID TCA.
void SetGeane(Bool_t opt=kTRUE)
map< Int_t, Double_t > fClusterQ
TClonesArray * fEmcDigi
PndEmcBump TCA.
static PndGeoHandling * Instance()
FairGeanePro * fGeanePropagator
Refitter for MDT tracks.
PndGeoSttPar * fSttParameters
EMC error matrix.
TClonesArray * fMdtPoint
PndEmcDigi TCA.
TClonesArray * fMvdHitsStrip
PndTrack TCA for MDT refit.
void SetEmcClusterE25(Double_t val)
TClonesArray * fFtofPoint
PndFtofHit TCA.
TClonesArray * fTofPoint
PndTofHit TCA.
TClonesArray * fPidChargedCand
2nd PndTrackID TCA
Float_t mdtIronThickness[3][20]
Int_t NumberOfDigis() const
void SetFitStatus(Int_t val)
void SetEmcClusterLat(Double_t val)
Int_t GetGeometryVersion()
virtual Double_t E25() const
TClonesArray * fEmcBump
PndEmcCluster TCA.
TClonesArray * fDrcPoint
PndMdtTrk TCA.
virtual Double_t energy() const
void SetEmcTimeStamp(Double_t val)
PndEmcErrorMatrixParObject * GetParObject()
void SetLastHit(TVector3 &pos)
void SetNumIterations(Int_t num)
Bool_t GetDskInfo(FairTrackParH *helix, PndPidCandidate *pid)
virtual Double_t E9() const
Bool_t GetTrackInfo(PndTrack *track, PndPidCandidate *pid)
virtual InitStatus Init()
void SetEmcClusterZ20(Double_t val)
Calculate Error Matrix for the given EmcCluster with parametrization defined by the given parameter P...
PndEmcGeoPar * fEmcGeoPar
Correlation parameters.
void SetEmcClusterZ53(Double_t val)
Bool_t GetFtsInfo(PndTrack *track, PndPidCandidate *pid)
TClonesArray * fTrack
PndMCTrack TCA.
represents a reconstructed (splitted) emc cluster
void SetEmcRawEnergy(Double_t val)
TClonesArray * fRichPoint
PndFtsHit TCA.
TMatrixT< double > TMatrixD
TClonesArray * fFtofHit
PndTofPoint TCA.
map< Int_t, vector< Int_t > > mapMdtEndcap
TClonesArray * fTofHit
PndSdsHit TCA for pixel.
Bool_t GetEmcInfo(FairTrackParH *helix, PndPidCandidate *pid)
TClonesArray * fEmcCluster
PndFtofPoint TCA.