CbmRoot
Loading...
Searching...
No Matches
CbmLitGlobalElectronId.cxx
Go to the documentation of this file.
1/* Copyright (C) 2011-2025 UGiessen/JINR-LIT, Giessen/Dubna
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Semen Lebedev [committer], Andrey Lebedev, Cornelius Feier-Riesen */
4
10
12
13#include "CbmGlobalTrack.h"
15#include "CbmRichRing.h"
16#include "CbmStsTrack.h"
17#include "CbmTofHit.h"
18#include "CbmTofTrack.h"
19#include "CbmTrdTrack.h"
20#include "FairRootManager.h"
21#include "TClonesArray.h"
22#include "TMath.h"
23#include "TString.h"
24#include "TSystem.h"
25#include "utils/CbmRichUtil.h"
26
27#include <Logger.h>
28
29#include <cmath>
30#include <iostream>
31
33 : fTrdAnnCut(0.6)
34 , fRichAnnCut(-0.2)
35 , fRichUseAnn(true)
36 , fRichMeanA(-1.)
37 , fRichMeanB(-1.)
38 , fRichRmsA(-1.)
39 , fRichRmsB(-1.)
40 , fRichRmsCoeff(-1.)
41 , fRichDistCut(-1.)
42 , fGlobalTracks(NULL)
43 , fStsTracks(NULL)
44 , fRichRings(NULL)
45 , fTrdTracks(NULL)
46 , fTofHits(NULL)
47 , fTofTracks(NULL)
48{
49 Init();
50}
51
53
55{
56 // Cut values for 8 Gev // TODO: Comment on which el-efficiency cut is roughly tuned to
57 FairRootManager* ioman = FairRootManager::Instance();
58 if (ioman != nullptr) {
59 fGlobalTracks = (TClonesArray*) ioman->GetObject("GlobalTrack");
60 fStsTracks = (TClonesArray*) ioman->GetObject("StsTrack");
61 fRichRings = (TClonesArray*) ioman->GetObject("RichRing");
62 fTrdTracks = (TClonesArray*) ioman->GetObject("TrdTrack");
63 fTofHits = (TClonesArray*) ioman->GetObject("TofHit");
64 fTofTracks = (TClonesArray*) ioman->GetObject("TofTrack");
65 }
66 LOG(info) << "fRichAnnCut = " << fRichAnnCut;
67 LOG(info) << "fTrdAnnCut = " << fTrdAnnCut;
68}
69
70Bool_t CbmLitGlobalElectronId::IsStsElectron(Int_t globalTrackIndex, Double_t momentum)
71{
72 const CbmGlobalTrack* globalTrack = static_cast<const CbmGlobalTrack*>(fGlobalTracks->At(globalTrackIndex));
73 Int_t stsInd = globalTrack->GetStsTrackIndex();
74 if (stsInd < 0) return false;
75 CbmStsTrack* stsTrack = static_cast<CbmStsTrack*>(fStsTracks->At(stsInd));
76 if (NULL == stsTrack) return false;
77 double eLoss = stsTrack->GetELoss();
78 return (fStsELossCut2D->IsInside(momentum, eLoss));
79}
80
81Bool_t CbmLitGlobalElectronId::IsRichElectron(Int_t globalTrackIndex, Double_t momentum)
82{
83 if (NULL == fGlobalTracks || NULL == fRichRings) return false;
84
85 if (fRichUseAnn == false) {
86 const CbmGlobalTrack* globalTrack = static_cast<const CbmGlobalTrack*>(fGlobalTracks->At(globalTrackIndex));
87 Int_t richId = globalTrack->GetRichRingIndex();
88 if (richId < 0) return false;
89 CbmRichRing* ring = static_cast<CbmRichRing*>(fRichRings->At(richId));
90 if (NULL == ring) return false;
91 Double_t axisA = ring->GetAaxis();
92 Double_t axisB = ring->GetBaxis();
93 Double_t dist = CbmRichUtil::GetRingTrackDistance(globalTrackIndex);
94 if (fabs(axisA - fRichMeanA) < fRichRmsCoeff * fRichRmsA && fabs(axisB - fRichMeanB) < fRichRmsCoeff * fRichRmsB
95 && dist < fRichDistCut) {
96 return true;
97 }
98 else {
99 return false;
100 }
101 }
102
103 else {
104 Double_t ann = CbmRichElectronIdAnn::GetInstance().CalculateAnnValue(globalTrackIndex, momentum);
105 return (fRichAnnCut2D->IsInside(momentum, ann));
106 }
107}
108
109Bool_t CbmLitGlobalElectronId::IsTrdElectron(Int_t globalTrackIndex, Double_t momentum)
110{
111 if (NULL == fGlobalTracks || NULL == fTrdTracks) return false;
112 const CbmGlobalTrack* globalTrack = static_cast<const CbmGlobalTrack*>(fGlobalTracks->At(globalTrackIndex));
113 Int_t trdId = globalTrack->GetTrdTrackIndex();
114 if (trdId < 0) return false;
115 CbmTrdTrack* trdTrack = static_cast<CbmTrdTrack*>(fTrdTracks->At(trdId));
116 if (NULL == trdTrack) return false;
117 Double_t lhood = trdTrack->GetPidLikeEL();
118 double chi2Trd = (trdTrack->GetNDF() > 0.) ? trdTrack->GetChiSq() / trdTrack->GetNDF() : 0.;
119 return (fTrdElLikeCut2D->IsInside(momentum, lhood) && fTrdChi2Cut2D->IsInside(momentum, chi2Trd));
120}
121
122Bool_t CbmLitGlobalElectronId::IsTofElectron(Int_t globalTrackIndex, Double_t momentum, Double_t eventTime)
123{
124 if (NULL == fGlobalTracks || NULL == fTofTracks) return false;
125 const CbmGlobalTrack* globalTrack = static_cast<const CbmGlobalTrack*>(fGlobalTracks->At(globalTrackIndex));
126 CbmTofTrack* tofTrack = static_cast<CbmTofTrack*>(fTofTracks->At(globalTrack->GetTofTrackIndex()));
127 if (NULL == tofTrack) return false;
128
129 Double_t mass2 = GetTofM2(globalTrackIndex, momentum, eventTime);
130 if (mass2 == -1.) return false;
131 double dist = tofTrack->GetDistance();
132 return (fTofM2Cut2D->IsInside(momentum, mass2) && fTofDistCut2D->IsInside(momentum, dist));
133}
134
135Double_t CbmLitGlobalElectronId::GetRichAnn(Int_t globalTrackIndex, Double_t momentum)
136{
137 return CbmRichElectronIdAnn::GetInstance().CalculateAnnValue(globalTrackIndex, momentum);
138}
139
140Double_t CbmLitGlobalElectronId::GetTrdAnn(Int_t globalTrackIndex, Double_t momentum)
141{
142 if (NULL == fGlobalTracks || NULL == fTrdTracks) return -1.;
143 const CbmGlobalTrack* globalTrack = static_cast<const CbmGlobalTrack*>(fGlobalTracks->At(globalTrackIndex));
144 Int_t trdId = globalTrack->GetTrdTrackIndex();
145 if (trdId < 0) return -1.;
146 CbmTrdTrack* trdTrack = static_cast<CbmTrdTrack*>(fTrdTracks->At(trdId));
147 if (NULL == trdTrack) return -1.;
148
149 return trdTrack->GetPidLikeEL();
150}
151
152Double_t CbmLitGlobalElectronId::GetTofM2(Int_t globalTrackIndex, Double_t momentum, Double_t eventTime)
153{
154 if (NULL == fGlobalTracks || NULL == fTofHits) return -1.;
155 const CbmGlobalTrack* globalTrack = static_cast<const CbmGlobalTrack*>(fGlobalTracks->At(globalTrackIndex));
156 Double_t trackLength = globalTrack->GetLength() / 100.;
157 Int_t tofId = globalTrack->GetTofHitIndex();
158 if (tofId < 0) return -1.;
159 CbmTofHit* tofHit = (CbmTofHit*) fTofHits->At(tofId);
160 if (NULL == tofHit) return -1.;
161
162 Double_t noOffsetTime = tofHit->GetTime() - eventTime;
163 Double_t time = 0.2998 * noOffsetTime; // time in ns -> transfrom to ct in m
164 Double_t mass2 = momentum * momentum * (TMath::Power(time / trackLength, 2) - 1);
165
166 return mass2;
167}
168
ClassImp(CbmLitGlobalElectronId)
Implementation of the electron identification algorithm in the RICH detector using Artificial Neural ...
Data class for STS tracks.
int Int_t
bool Bool_t
int32_t GetStsTrackIndex() const
int32_t GetRichRingIndex() const
int32_t GetTofTrackIndex() const
int32_t GetTofHitIndex() const
double GetLength() const
int32_t GetTrdTrackIndex() const
double GetTime() const
Definition CbmHit.h:79
Bool_t IsTrdElectron(Int_t globalTrackindex, Double_t momentum)
Identify electron in RICH detector.
std::unique_ptr< TCutG > fRichAnnCut2D
Double_t GetTrdAnn(Int_t globalTrackindex, Double_t momentum)
Return ANN value for electron Identification in the TRD detector.
std::unique_ptr< TCutG > fTrdElLikeCut2D
Bool_t IsStsElectron(Int_t globalTrackIndex, Double_t momentum)
Identify electron in STS detector.
std::unique_ptr< TCutG > fTofM2Cut2D
Double_t GetTofM2(Int_t globalTrackIndex, Double_t momentum, Double_t eventTime=1000.)
Return TOF m2 value.
Double_t GetRichAnn(Int_t globalTrackIndex, Double_t momentum)
Identify electron in RICH detector.
Bool_t IsTofElectron(Int_t globalTrackIndex, Double_t momentum, Double_t eventTime=1000.)
Identify electron in RICH detector.
Bool_t IsRichElectron(Int_t globalTrackIndex, Double_t momentum)
Identify electron in RICH detector.
std::unique_ptr< TCutG > fTofDistCut2D
void Init()
Initialize TClonesArrays.
std::unique_ptr< TCutG > fStsELossCut2D
virtual ~CbmLitGlobalElectronId()
Destructor.
std::unique_ptr< TCutG > fTrdChi2Cut2D
double CalculateAnnValue(int globalTrackIndex, double momentum)
Calculate output value of the ANN.
static CbmRichElectronIdAnn & GetInstance()
double GetAaxis() const
Definition CbmRichRing.h:80
double GetBaxis() const
Definition CbmRichRing.h:81
static double GetRingTrackDistance(int globalTrackId)
float GetELoss() const
double GetDistance() const
Definition CbmTofTrack.h:79
int32_t GetNDF() const
Definition CbmTrack.h:64
double GetChiSq() const
Definition CbmTrack.h:63
double GetPidLikeEL() const
Definition CbmTrdTrack.h:43