CbmRoot
Loading...
Searching...
No Matches
LmvmUtils.cxx
Go to the documentation of this file.
1/* Copyright (C) 2010-2021 Justus-Liebig-Universitaet Giessen, Giessen
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Semen Lebedev [committer], Cornelius Feier-Riesen*/
4
5#include "LmvmUtils.h"
6
7#include "CbmKFVertex.h"
8#include "CbmL1PFFitter.h"
9#include "CbmMCTrack.h"
10#include "CbmStsTrack.h"
11#include "Logger.h"
12#include "TClonesArray.h"
13#include "TDatabasePDG.h"
14#include "TMCProcess.h"
15#include "TRandom3.h"
17
18#include <iostream>
19
20#include "LmvmCand.h"
21#include "LmvmDef.h"
22
23using std::string;
24using std::vector;
25
27
29{
30 CbmL1PFFitter fPFFitter;
31 vector<CbmStsTrack> stsTracks;
32 stsTracks.resize(1);
33 stsTracks[0] = *stsTrack;
35 vector<float> chiPrim;
36 fPFFitter.GetChiToVertex(stsTracks, vField, chiPrim, kfVertex, 3e6);
37 cand->fChi2Sts = stsTracks[0].GetChiSq() / stsTracks[0].GetNDF();
38 cand->fChi2Prim = chiPrim[0];
39 const FairTrackParam* vtxTrack = stsTracks[0].GetParamFirst();
40
41 vtxTrack->Position(cand->fPosition);
42 vtxTrack->Momentum(cand->fMomentum);
43
44 cand->fMass = TDatabasePDG::Instance()->GetParticle(11)->Mass();
45 cand->fCharge = (vtxTrack->GetQp() > 0) ? 1 : -1;
46 cand->fEnergy = sqrt(cand->fMomentum.Mag2() + cand->fMass * cand->fMass);
47 cand->fRapidity = 0.5 * TMath::Log((cand->fEnergy + cand->fMomentum.Z()) / (cand->fEnergy - cand->fMomentum.Z()));
48}
49
50void LmvmUtils::CalculateArmPodParams(LmvmCand* cand1, LmvmCand* cand2, double& alpha, double& ptt)
51{
52 alpha = ptt = 0.;
53 double spx = cand1->fMomentum.X() + cand2->fMomentum.X();
54 double spy = cand1->fMomentum.Y() + cand2->fMomentum.Y();
55 double spz = cand1->fMomentum.Z() + cand2->fMomentum.Z();
56 double sp = sqrt(spx * spx + spy * spy + spz * spz);
57
58 if (sp == 0.0) return;
59 double pn, /*pp,*/ pln, plp;
60 if (cand1->fCharge < 0.) {
61 pn = cand1->fMomentum.Mag();
62 //pp = cand2->fMomentum.Mag();
63 pln = (cand1->fMomentum.X() * spx + cand1->fMomentum.Y() * spy + cand1->fMomentum.Z() * spz) / sp;
64 plp = (cand2->fMomentum.X() * spx + cand2->fMomentum.Y() * spy + cand2->fMomentum.Z() * spz) / sp;
65 }
66 else {
67 pn = cand2->fMomentum.Mag();
68 //pp = cand1->fMomentum.Mag();
69 pln = (cand2->fMomentum.X() * spx + cand2->fMomentum.Y() * spy + cand2->fMomentum.Z() * spz) / sp;
70 plp = (cand1->fMomentum.X() * spx + cand1->fMomentum.Y() * spy + cand1->fMomentum.Z() * spz) / sp;
71 }
72 if (pn == 0.0) return;
73 double ptm = (1. - ((pln / pn) * (pln / pn)));
74 ptt = (ptm >= 0.) ? pn * sqrt(ptm) : 0;
75 alpha = (plp - pln) / (plp + pln);
76}
77
79{
80 if (IsMcSignalEl(mctrack)) return ELmvmSrc::Signal;
81 if (IsMcPi0El(mctrack, mcTracks)) return ELmvmSrc::Pi0;
82 if (IsMcGammaEl(mctrack, mcTracks)) return ELmvmSrc::Gamma;
83 if (IsMcEtaEl(mctrack, mcTracks)) return ELmvmSrc::Eta;
84 return ELmvmSrc::Bg; // all bg track wich are not pi0, gamma, eta electrons
85}
86
88{
89 if (mct != nullptr && mct->GetGeantProcessId() == kPPrimary && std::abs(mct->GetPdgCode()) == 11) return true;
90 return false;
91}
92
93bool LmvmUtils::IsMcGammaEl(const CbmMCTrack* mct, TClonesArray* mcTracks)
94{
95 if (mct == nullptr || std::abs(mct->GetPdgCode()) != 11 || mct->GetMotherId() < 0) return false;
96 CbmMCTrack* mct1 = static_cast<CbmMCTrack*>(mcTracks->At(mct->GetMotherId()));
97 if (mct1 != nullptr && mct1->GetPdgCode() == 22) return true;
98 return false;
99}
100
101bool LmvmUtils::IsMcPi0El(const CbmMCTrack* mct, TClonesArray* mcTracks)
102{
103 if (mct == nullptr || std::abs(mct->GetPdgCode()) != 11 || mct->GetMotherId() < 0) return false;
104 CbmMCTrack* mct1 = static_cast<CbmMCTrack*>(mcTracks->At(mct->GetMotherId()));
105 if (mct1 != nullptr && mct1->GetPdgCode() == 111) return true;
106 return false;
107}
108
109bool LmvmUtils::IsMcEtaEl(const CbmMCTrack* mct, TClonesArray* mcTracks)
110{
111 if (mct == nullptr || std::abs(mct->GetPdgCode()) != 11 || mct->GetMotherId() < 0) return false;
112 CbmMCTrack* mct1 = static_cast<CbmMCTrack*>(mcTracks->At(mct->GetMotherId()));
113 if (mct1 != NULL && mct1->GetPdgCode() == 221) return true;
114 return false;
115}
116
117bool LmvmUtils::IsMcPairSignal(const CbmMCTrack* mctP, const CbmMCTrack* mctM)
118{
119 return (IsMcSignalEl(mctM) && IsMcSignalEl(mctP));
120}
121
122bool LmvmUtils::IsMcPairPi0(const CbmMCTrack* mctP, const CbmMCTrack* mctM, TClonesArray* mcTracks)
123{
124 return ((mctM->GetMotherId() == mctP->GetMotherId()) && IsMcPi0El(mctM, mcTracks) && IsMcPi0El(mctP, mcTracks));
125}
126
127bool LmvmUtils::IsMcPairEta(const CbmMCTrack* mctP, const CbmMCTrack* mctM, TClonesArray* mcTracks)
128{
129 return ((mctM->GetMotherId() == mctP->GetMotherId()) && IsMcEtaEl(mctM, mcTracks) && IsMcEtaEl(mctP, mcTracks));
130}
131
132bool LmvmUtils::IsMcPairGamma(const CbmMCTrack* mctP, const CbmMCTrack* mctM, TClonesArray* mcTracks)
133{
134 return ((mctM->GetMotherId() == mctP->GetMotherId()) && IsMcGammaEl(mctM, mcTracks) && IsMcGammaEl(mctP, mcTracks));
135}
136
137bool LmvmUtils::IsMcPairBg(const CbmMCTrack* mctP, const CbmMCTrack* mctM, TClonesArray* mcTracks)
138{
139 bool isGamma = IsMcPairGamma(mctP, mctM, mcTracks);
140 bool isEta = IsMcPairEta(mctP, mctM, mcTracks);
141 bool isPi0 = IsMcPairPi0(mctP, mctM, mcTracks);
142 return (!isEta) && (!isGamma) && (!isPi0) && (!(IsMcSignalEl(mctP) && IsMcSignalEl(mctM)));
143}
144
145ELmvmSrc LmvmUtils::GetMcPairSrc(const CbmMCTrack* mctP, const CbmMCTrack* mctM, TClonesArray* mcTracks)
146{
147 if (IsMcPairSignal(mctP, mctM)) return ELmvmSrc::Signal;
148 if (IsMcPairGamma(mctP, mctM, mcTracks)) return ELmvmSrc::Gamma;
149 if (IsMcPairPi0(mctP, mctM, mcTracks)) return ELmvmSrc::Pi0;
150 if (IsMcPairEta(mctP, mctM, mcTracks)) return ELmvmSrc::Eta;
151 if (IsMcPairBg(mctP, mctM, mcTracks)) return ELmvmSrc::Bg;
152
153 return ELmvmSrc::Undefined;
154}
155
156
157bool LmvmUtils::IsMcPairSignal(const LmvmCand& candP, const LmvmCand& candM)
158{
159 return (candP.IsMcSignal() && candM.IsMcSignal());
160}
161
162bool LmvmUtils::IsMcPairPi0(const LmvmCand& candP, const LmvmCand& candM)
163{
164 return (candP.IsMcPi0() && candM.IsMcPi0() && candP.fMcMotherId == candM.fMcMotherId);
165}
166
167bool LmvmUtils::IsMcPairEta(const LmvmCand& candP, const LmvmCand& candM)
168{
169 return (candP.IsMcEta() && candM.IsMcEta() && candP.fMcMotherId == candM.fMcMotherId);
170}
171
172bool LmvmUtils::IsMcPairGamma(const LmvmCand& candP, const LmvmCand& candM)
173{
174 return (candP.IsMcGamma() && candM.IsMcGamma() && candP.fMcMotherId == candM.fMcMotherId);
175}
176
177bool LmvmUtils::IsMcPairBg(const LmvmCand& candP, const LmvmCand& candM)
178{
179 bool isGamma = IsMcPairGamma(candP, candM);
180 bool isEta = IsMcPairEta(candP, candM);
181 bool isPi0 = IsMcPairPi0(candP, candM);
182 return (!isEta) && (!isGamma) && (!isPi0) && (!(candP.IsMcSignal() && candM.IsMcSignal()));
183}
184
186{
187 if (IsMcPairSignal(candP, candM)) return ELmvmSrc::Signal;
188 if (IsMcPairGamma(candP, candM)) return ELmvmSrc::Gamma;
189 if (IsMcPairPi0(candP, candM)) return ELmvmSrc::Pi0;
190 if (IsMcPairEta(candP, candM)) return ELmvmSrc::Eta;
191 if (IsMcPairBg(candP, candM)) return ELmvmSrc::Bg;
192
193 LOG(warning) << "LmvmUtils::GetMcPairSrc: Pair source is 'Undefined'! Check!";
194 return ELmvmSrc::Undefined;
195}
196
198{
199 if (candM.IsMcGamma()) {
200 if (candP.IsMcGamma() && candP.fMcMotherId != candM.fMcMotherId) return ELmvmBgPairSrc::GG;
201 if (candP.IsMcPi0()) return ELmvmBgPairSrc::GP;
202 return ELmvmBgPairSrc::GO;
203 }
204 else if (candM.IsMcPi0()) {
205 if (candP.IsMcGamma()) return ELmvmBgPairSrc::GP;
206 if (candP.IsMcPi0() && candP.fMcMotherId != candM.fMcMotherId) return ELmvmBgPairSrc::PP;
207 return ELmvmBgPairSrc::PO;
208 }
209 else {
210 if (candP.IsMcGamma()) return ELmvmBgPairSrc::GO;
211 if (candP.IsMcPi0()) return ELmvmBgPairSrc::PO;
212 return ELmvmBgPairSrc::OO;
213 }
214
216}
217
219{
220 if (cand.fStsMcTrackId == cand.fRichMcTrackId && cand.fStsMcTrackId == cand.fTrdMcTrackId
221 && cand.fStsMcTrackId == cand.fTofMcTrackId && cand.fStsMcTrackId != -1)
222 return false;
223 return true;
224}
225
227{
228 if (cand.fStsMcTrackId == -1 || cand.fRichMcTrackId == -1 || cand.fTrdMcTrackId == -1 || cand.fTofMcTrackId == -1)
229 return true;
230 return false;
231}
232
233double LmvmUtils::Distance(double x1, double y1, double x2, double y2) { return std::sqrt(Distance2(x1, y1, x2, y2)); }
234
235double LmvmUtils::Distance2(double x1, double y1, double x2, double y2)
236{
237 return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
238}
239
240void LmvmUtils::IsElectron(int globalTrackIndex, double momentum, double momentumCut, LmvmCand* cand)
241{
242 bool stsEl = CbmLitGlobalElectronId::GetInstance().IsStsElectron(globalTrackIndex, momentum);
243
244 bool richEl = CbmLitGlobalElectronId::GetInstance().IsRichElectron(globalTrackIndex, momentum);
245 cand->fRichAnn = CbmLitGlobalElectronId::GetInstance().GetRichAnn(globalTrackIndex, momentum);
246
247 bool trdEl = CbmLitGlobalElectronId::GetInstance().IsTrdElectron(globalTrackIndex, momentum);
248
249 bool tofEl = CbmLitGlobalElectronId::GetInstance().IsTofElectron(globalTrackIndex, momentum);
250 cand->fMass2 = CbmLitGlobalElectronId::GetInstance().GetTofM2(globalTrackIndex, momentum);
251
252 bool isMomCut = (momentumCut > 0.) ? (momentum < momentumCut) : true;
253 cand->fIsElectron = (stsEl && richEl && trdEl && tofEl && isMomCut);
254}
255
256void LmvmUtils::IsRichElectron(int globalTrackIndex, double momentum, LmvmCand* cand)
257{
258 cand->fIsRichElectron = CbmLitGlobalElectronId::GetInstance().IsRichElectron(globalTrackIndex, momentum);
259}
260
261void LmvmUtils::IsTrdElectron(int globalTrackIndex, double momentum, LmvmCand* cand)
262{
263 cand->fIsTrdElectron = CbmLitGlobalElectronId::GetInstance().IsTrdElectron(globalTrackIndex, momentum);
264}
265
266void LmvmUtils::IsTofElectron(int globalTrackIndex, double momentum, LmvmCand* cand)
267{
268 cand->fIsTofElectron = CbmLitGlobalElectronId::GetInstance().IsTofElectron(globalTrackIndex, momentum);
269}
270
271void LmvmUtils::IsElectronMc(LmvmCand* cand, TClonesArray* mcTracks, double pionMisidLevel)
272{
273 // Use MC information for PID to set a required level of pion suppression
274 if (cand->fStsMcTrackId < 0 || cand->fStsMcTrackId >= mcTracks->GetEntriesFast()) {
275 cand->fIsElectron = false;
276 }
277 else {
278 CbmMCTrack* mcTrack = static_cast<CbmMCTrack*>(mcTracks->At(cand->fStsMcTrackId));
279 if (std::abs(mcTrack->GetPdgCode()) == 11) {
280 cand->fIsElectron = true;
281 }
282 else {
283 cand->fIsElectron = (gRandom->Rndm() < pionMisidLevel);
284 }
285 }
286}
287
289{
290 if (cand->fCharge == 0) return "0";
291 return (cand->fCharge > 0) ? "+" : "-";
292}
293
295{
296 if (mct->GetCharge() == 0) return "0";
297 return (mct->GetCharge() > 0) ? "+" : "-";
298}
299
301 const LmvmCand& cand1,
302 const LmvmCand& cand2) // TODO: MC-Tracks (einzeln und Paare) mit einbauen; und evtl same-mixed Events;
303{
304 // If both particles are signals, the Pluto weight has to be calculated only once, since both are stemming from the
305 // same mother particle (only one Pluto per event). In all other cases the weight can be calculated as w1*w2.
306 if (cand1.IsMcSignal() && cand2.IsMcSignal())
307 return cand1.fWeight;
308 else
309 return cand1.fWeight * cand2.fWeight;
310}
311
312double LmvmUtils::MinvScale(double minv, const string& particle)
313{
314 if (particle == "inmed")
315 return GetMassScaleInmed(minv);
316 else if (particle == "qgp")
317 return GetMassScaleQgp(minv);
318 else
319 return 1.;
320}
321
323{
324 int nArray = sizeof(fMinvArray);
325 double weight = -1.;
326
327 if (minv < fMinvArray[0]) {
328 double dy = fScaleArrayInmed[0] - fScaleArrayInmed[1];
329 double dx = fMinvArray[1] - fMinvArray[0];
330 double slope = dy / dx;
331 double d = fMinvArray[0] - minv;
332 weight = fScaleArrayInmed[0] + slope * d;
333 return weight;
334 }
335 else {
336 for (int i = 1; i < nArray; i++) {
337 if (fMinvArray[i] > minv) {
338 double dy = fScaleArrayInmed[i] - fScaleArrayInmed[i - 1];
339 double dx = fMinvArray[i] - fMinvArray[i - 1];
340 double slope = dy / dx;
341 double dLeft = minv - fMinvArray[i - 1];
342 weight = fScaleArrayInmed[i - 1] + slope * dLeft;
343 return weight;
344 }
345 }
346 }
347 return weight;
348}
349
350double LmvmUtils::GetMassScaleQgp(double minv)
351{
352 int nArray = sizeof(fMinvArray);
353 double weight = -1.;
354
355 if (minv < fMinvArray[0]) {
356 double dy = fScaleArrayQgp[0] - fScaleArrayQgp[1];
357 double dx = fMinvArray[1] - fMinvArray[0];
358 double slope = dy / dx;
359 double d = fMinvArray[0] - minv;
360 weight = fScaleArrayQgp[0] + slope * d;
361 return weight;
362 }
363 else {
364 for (int i = 1; i < nArray; i++) {
365 if (fMinvArray[i] > minv) {
366 double dy = fScaleArrayQgp[i] - fScaleArrayQgp[i - 1];
367 double dx = fMinvArray[i] - fMinvArray[i - 1];
368 double slope = dy / dx;
369 double dLeft = minv - fMinvArray[i - 1];
370 weight = fScaleArrayQgp[i - 1] + slope * dLeft;
371 return weight;
372 }
373 }
374 }
375 return weight;
376}
Data class for STS tracks.
static vector< vector< QAMCTrack > > mcTracks
friend fvec sqrt(const fvec &a)
ELmvmSrc
Definition LmvmDef.h:23
@ Signal
Definition LmvmDef.h:24
@ Gamma
Definition LmvmDef.h:27
@ Undefined
Definition LmvmDef.h:29
ELmvmBgPairSrc
Definition LmvmDef.h:51
ClassImp(LmvmUtils)
void GetChiToVertex(std::vector< CbmStsTrack > &Tracks, std::vector< PFFieldRegion > &field, std::vector< float > &chiToVtx, CbmKFVertex &primVtx, float chiPrim=-1)
Bool_t IsTrdElectron(Int_t globalTrackindex, Double_t momentum)
Identify electron in RICH detector.
Bool_t IsStsElectron(Int_t globalTrackIndex, Double_t momentum)
Identify electron in STS detector.
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.
static CbmLitGlobalElectronId & GetInstance()
double GetCharge() const
Charge of the associated particle.
uint32_t GetGeantProcessId() const
Definition CbmMCTrack.h:66
int32_t GetMotherId() const
Definition CbmMCTrack.h:68
int32_t GetPdgCode() const
Definition CbmMCTrack.h:67
bool IsMcPi0() const
Definition LmvmCand.h:123
bool fIsTrdElectron
Definition LmvmCand.h:75
double fChi2Sts
Definition LmvmCand.h:65
int fStsMcTrackId
Definition LmvmCand.h:81
int fCharge
Definition LmvmCand.h:63
double fEnergy
Definition LmvmCand.h:61
int fTofMcTrackId
Definition LmvmCand.h:84
bool IsMcSignal() const
Definition LmvmCand.h:122
bool fIsRichElectron
Definition LmvmCand.h:74
bool fIsTofElectron
Definition LmvmCand.h:76
double fRapidity
Definition LmvmCand.h:62
bool fIsElectron
Definition LmvmCand.h:107
bool IsMcEta() const
Definition LmvmCand.h:125
TVector3 fPosition
Definition LmvmCand.h:56
double fMass2
Definition LmvmCand.h:98
double fRichAnn
Definition LmvmCand.h:96
int fTrdMcTrackId
Definition LmvmCand.h:83
int fMcMotherId
Definition LmvmCand.h:79
double fMass
Definition LmvmCand.h:58
int fRichMcTrackId
Definition LmvmCand.h:82
bool IsMcGamma() const
Definition LmvmCand.h:124
double fWeight
Definition LmvmCand.h:60
double fChi2Prim
Definition LmvmCand.h:64
TVector3 fMomentum
Definition LmvmCand.h:57
static void IsTofElectron(int globalTrackIndex, double momentum, LmvmCand *cand)
static bool IsMcGammaEl(const CbmMCTrack *mct, TClonesArray *mcTracks)
Definition LmvmUtils.cxx:93
static double Distance(double x1, double y1, double x2, double y2)
static ELmvmSrc GetMcPairSrc(const CbmMCTrack *mctP, const CbmMCTrack *mctM, TClonesArray *mcTracks)
static void CalculateArmPodParams(LmvmCand *cand1, LmvmCand *cand2, double &alpha, double &ptt)
Definition LmvmUtils.cxx:50
static void IsElectronMc(LmvmCand *cand, TClonesArray *mcTracks, double pionMisidLevel)
static constexpr double fScaleArrayInmed[170]
Definition LmvmUtils.h:132
static double GetWeightPair(const LmvmCand &cand1, const LmvmCand &cand2)
static double GetMassScaleQgp(double minv)
static void IsElectron(int globalTrackIndex, double momentum, double momentumCut, LmvmCand *cand)
static bool IsMcPairSignal(const CbmMCTrack *mctP, const CbmMCTrack *mctM)
static ELmvmSrc GetMcSrc(CbmMCTrack *mctrack, TClonesArray *mcTracks)
Definition LmvmUtils.cxx:78
static void IsTrdElectron(int globalTrackIndex, double momentum, LmvmCand *cand)
static bool IsMcPairEta(const CbmMCTrack *mctP, const CbmMCTrack *mctM, TClonesArray *mcTracks)
static double MinvScale(double minv, const std::string &particle)
static void IsRichElectron(int globalTrackIndex, double momentum, LmvmCand *cand)
static bool IsMismatch(const LmvmCand &cand)
static constexpr double fScaleArrayQgp[170]
Definition LmvmUtils.h:153
static bool IsMcPairGamma(const CbmMCTrack *mctP, const CbmMCTrack *mctM, TClonesArray *mcTracks)
static bool IsMcPairPi0(const CbmMCTrack *mctP, const CbmMCTrack *mctM, TClonesArray *mcTracks)
static constexpr double fMinvArray[170]
Definition LmvmUtils.h:117
static bool IsGhost(const LmvmCand &cand)
static bool IsMcPairBg(const CbmMCTrack *mctP, const CbmMCTrack *mctM, TClonesArray *mcTracks)
static std::string GetChargeStr(const LmvmCand *cand)
static bool IsMcPi0El(const CbmMCTrack *mct, TClonesArray *mcTracks)
static ELmvmBgPairSrc GetBgPairSrc(const LmvmCand &candP, const LmvmCand &candM)
static double GetMassScaleInmed(double minv)
static bool IsMcSignalEl(const CbmMCTrack *mct)
Definition LmvmUtils.cxx:87
static void CalculateAndSetTrackParams(LmvmCand *cand, CbmStsTrack *stsTrack, CbmKFVertex &kfVertex)
Definition LmvmUtils.cxx:28
static bool IsMcEtaEl(const CbmMCTrack *mct, TClonesArray *mcTracks)
static double Distance2(double x1, double y1, double x2, double y2)