BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnEfficiency.h
Go to the documentation of this file.
1#ifndef BMNEFF_H
2#define BMNEFF_H 1
3
4#include "BmnNewFieldMap.h"
5
6#include <BmnGlobalTrack.h>
7#include <BmnHit.h>
9#include <BmnKalmanFilter.h>
10#include <BmnVertex.h>
11#include <CbmVertex.h>
12#include <DstEventHeader.h>
13#include <TCanvas.h>
14#include <TChain.h>
15#include <TClonesArray.h>
16#include <TEfficiency.h>
17#include <TGeoManager.h>
18#include <TH1.h>
19#include <TH2.h>
20#include <TLine.h>
21#include <TNamed.h>
22#include <TObject.h>
23#include <TStyle.h>
24#include <UniRun.h>
25#include <vector>
26
27using namespace std;
28
29// A class to be used as a store when calculating efficiency ...
30
31class EffStore : public TObject
32{
33 public:
35 : detector("")
36 , station(-1)
37 , module(-1)
38 , zone("")
39 , nominator(0)
40 , denominator(0)
41 {}
42
43 EffStore(TString det, Int_t stat, Int_t mod, TString z = "")
44 : detector(det)
45 , station(stat)
46 , module(mod)
47 , zone(z)
48 , nominator(0)
49 , denominator(0)
50 {
51 hitPositionsAndEff.resize(0);
52 }
53
54 EffStore(TString det, Int_t stat, TString z = "")
55 : detector(det)
56 , station(stat)
57 , module(-1)
58 , zone(z)
59 , nominator(0)
60 , denominator(0)
61 {
62 hitPositionsAndEff.resize(0);
63 }
64
66
68
69 void AddHitCoordinates(BmnHit* hit, Double_t eff = 1.)
70 {
71 hitPositionsAndEff.push_back(TLorentzVector(hit->GetX(), hit->GetY(), hit->GetZ(), eff));
72 }
73
75 {
76 Double_t eff = 0.;
77 if (denominator != 0)
78 eff = 1. * nominator / denominator;
79
80 return eff;
81 }
82
84 Int_t Station() { return station; }
85 Int_t Module() { return module; }
86 TString Zone() { return zone; }
87
88 vector<TLorentzVector> CoordinatesAndEffs() { return hitPositionsAndEff; }
89
90 virtual ~EffStore() {}
91
92 private:
93 TString detector; // GEM or SILICON
96 TString zone; // big or hot (valid for GEM only!)
97
100
101 vector<TLorentzVector> hitPositionsAndEff;
102
104};
105
107{
108 public:
110 : det("GEM")
111 , nGemCut(4)
112 , nSilCut(2)
113 {
114 eContainers = nullptr;
115 }
116
118
119 // Move assignment
120
122 {
123 if (&input == this)
124 return *this;
125
126 det = input.det;
127 nGemCut = input.nGemCut;
128 nSilCut = input.nSilCut;
129
130 sfIndices.first = input.sfIndices.first;
131 sfIndices.second = input.sfIndices.second;
132
133 flParams.first = input.flParams.first;
134 flParams.second = input.flParams.second;
135
136 gPairMap = input.gPairMap;
137 sPairMap = input.sPairMap;
138
139 eContainers = input.eContainers;
140
141 for (auto it : input.usedStats)
142 usedStats.push_back(it);
143
144 for (auto it : input.hits)
145 hits.push_back(it);
146
147 input.hits.clear();
148 input.usedStats.clear();
149
150 if (input.eContainers)
151 input.eContainers = nullptr;
152
153 return *this;
154 }
155
156 // Detector specified, hit arrays and stats used ...
158 vector<BmnHit*> hits;
159 vector<Bool_t> usedStats;
160
161 // Indices and track params ....
162 pair<Int_t, Int_t> sfIndices;
163 pair<FairTrackParam, FairTrackParam> flParams;
164
166
167 // Y-ranges ...
168 map<Int_t, vector<pair<Double_t, Double_t>>> gPairMap; // stat --> corresponding set of Y-pairs
169 map<Int_t, vector<pair<Double_t, Double_t>>> sPairMap;
170
171 // hit cuts ...
174};
175
177{
178 public:
180
182 : fStation(stat)
183 , fModule(-1)
184 , fXMin(xMin)
185 , fXMax(xMax)
186 , fYMin(yMin)
187 , fYMax(yMax)
188 {}
189
191 : fStation(stat)
192 , fModule(mod)
193 , fXMin(xMin)
194 , fXMax(xMax)
195 , fYMin(yMin)
196 , fYMax(yMax)
197 {}
198
200 : fStation(stat)
201 , fModule(mod)
202 {
203 hitX = x;
204 hitY = y;
205 hitZ = z;
206 }
207
208 virtual ~InnerTrackerParams() { ; }
209
210 Int_t station() { return fStation; }
211
212 Int_t module() { return fModule; }
213
214 pair<Double_t, Double_t> x() { return make_pair(fXMin, fXMax); }
215
216 pair<Double_t, Double_t> y() { return make_pair(fYMin, fYMax); }
217
218 void SetZ(Double_t z) { fZ = z; }
219
220 Double_t z() { return fZ; }
221
223
224 protected:
227
230
233
234 Double_t fZ; // position of station (at given module if defined) ...
235
236 //
240
242};
243
244class EffStore2D : public EffStore
245{
246 public:
248
249 EffStore2D(TString det, Int_t stat, map<Int_t, vector<pair<Double_t, Double_t>>> pairs)
250 : EffStore(det, stat)
251 , hEffGem(nullptr)
252 , hEffGem1d(nullptr)
253 , hEffSil(nullptr)
254 , hEffSil1d(nullptr)
255 {
256
257 const Int_t nQp = 2; // positive and negative ...
258
259 enum QpValue
260 {
261 pos,
262 neg
263 };
264
265 hEffGem = new TEfficiency*[nQp];
266 hEffSil = new TEfficiency*[nQp];
267 hEffSilXP = new TEfficiency*[nQp];
268
269 if (det.Contains("GEM")) {
270 Int_t nBinsX = 160.; // 80.; // 160;
271 Int_t nBinsY = 45;
272
273 pair<Double_t, Double_t> y = make_pair(0., 45.);
274
275 Double_t xLow = -80.;
276 Double_t xUp = +80.;
277
278 for (Int_t iQp = 0; iQp < nQp; iQp++) {
279 TString Qp = (iQp == QpValue::pos) ? "Q_{p} > 0" : "Q_{p} < 0";
280
281 hEffGem[iQp] = new TEfficiency(Form("Detector# %s, Station# %d, %s", det.Data(), stat, Qp.Data()),
282 Form("Stat %d, %s; X [cm]; Y [cm]", stat, Qp.Data()), nBinsX, xLow, xUp,
283 nBinsY, y.first, y.second);
284 }
285
286 // Preparing 1D-efficiencies (x for different y-ranges) ...
287 if (pairs.size()) {
288 nBinsX = 20.; // 80.; // 160;
289
290 hEffGem1d = new TEfficiency**[nQp];
291
292 const Int_t nYRanges = pairs.find(stat)->second.size();
293
294 for (Int_t iQp = 0; iQp < nQp; iQp++) {
295 hEffGem1d[iQp] = new TEfficiency*[nYRanges];
296
297 TString Qp = (iQp == QpValue::pos) ? "Q_{p} > 0" : "Q_{p} < 0";
298
299 for (Int_t iRange = 0; iRange < nYRanges; iRange++) {
300 Double_t y0 = pairs.find(stat)->second.at(iRange).first;
301 Double_t y1 = pairs.find(stat)->second.at(iRange).second;
302
303 hEffGem1d[iQp][iRange] = new TEfficiency(
304 Form("Detector# %s, Station# %d, (%G < y < %G [cm]), %s", det.Data(), stat, y0, y1,
305 Qp.Data()),
306 Form("Stat %d, (%G < y < %G [cm]), %s; X [cm]; #varepsilon", stat, y0, y1, Qp.Data()),
307 nBinsX, xLow, xUp);
308 }
309 }
310 }
311 } else {
312 Int_t nBinsX = 80;
313 Int_t nBinsY = 45;
314
315 TClonesArray* sil = new TClonesArray("InnerTrackerParams");
316
317 // Adding necessary information ...
318 // stat 0
319 new ((*sil)[sil->GetEntriesFast()]) InnerTrackerParams(0, -6., +6., -5., +8.);
320
321 // stat 1
322 new ((*sil)[sil->GetEntriesFast()]) InnerTrackerParams(1, -6., +6., -5., +8.);
323
324 // stat 2
325 new ((*sil)[sil->GetEntriesFast()]) InnerTrackerParams(2, -12., +12., -11., +14.);
326
327 for (Int_t iQp = 0; iQp < nQp; iQp++) {
328 TString Qp = (iQp == QpValue::pos) ? "Q_{p} > 0" : "Q_{p} < 0";
329 hEffSil[iQp] = new TEfficiency(Form("Detector# %s, Station# %d, %s", det.Data(), stat, Qp.Data()),
330 Form("Stat %d, %s; X [cm]; Y [cm]", stat, Qp.Data()), nBinsX,
331 getRanges(sil, stat)[0], getRanges(sil, stat)[1], nBinsY,
332 getRanges(sil, stat)[2], getRanges(sil, stat)[3]);
333
334 nBinsY = 55;
335
336 hEffSilXP[iQp] =
337 new TEfficiency(Form("Detector# %s, Station# %d (xP), %s", det.Data(), stat, Qp.Data()),
338 Form("Stat %d, %s; X [cm]; P [GeV/c]", stat, Qp.Data()), nBinsX,
339 getRanges(sil, stat)[0], getRanges(sil, stat)[1], nBinsY, 0., 5.5);
340 }
341
342 // Preparing 1D-efficiencies (x for different y-ranges) ...
343 if (pairs.size()) {
344 nBinsX = 20.; // 80.; // 160;
345
346 hEffSil1d = new TEfficiency**[nQp];
347
348 const Int_t nYRanges = pairs.find(stat)->second.size();
349
350 for (Int_t iQp = 0; iQp < nQp; iQp++) {
351 hEffSil1d[iQp] = new TEfficiency*[nYRanges];
352
353 TString Qp = (iQp == QpValue::pos) ? "Q_{p} > 0" : "Q_{p} < 0";
354
355 for (Int_t iRange = 0; iRange < nYRanges; iRange++) {
356 Double_t y0 = pairs.find(stat)->second.at(iRange).first;
357 Double_t y1 = pairs.find(stat)->second.at(iRange).second;
358
359 hEffSil1d[iQp][iRange] = new TEfficiency(
360 Form("Detector# %s, Station# %d, (%G < y < %G [cm]), %s", det.Data(), stat, y0, y1,
361 Qp.Data()),
362 Form("Stat %d, (%G < y < %G [cm]), %s; X [cm]; #varepsilon", stat, y0, y1, Qp.Data()),
363 nBinsX, getRanges(sil, stat)[0], getRanges(sil, stat)[1]);
364 }
365 }
366 }
367
368 delete sil;
369 }
370 }
371
372 TEfficiency* efficiency(Int_t qpBin = 0, TString hType = "", TString det = "GEM")
373 {
374 // qpBin = 0 (positive), 1 (negative)
375 if (hType.IsNull())
376 return det.Contains("GEM") ? hEffGem[qpBin] : hEffSil[qpBin];
377 else if (det.Contains("SILICON") && !hType.IsNull())
378 return hEffSilXP[qpBin];
379 else
380 return nullptr;
381 }
382
383 TEfficiency* efficiency4range(Int_t range, Int_t qpBin = 0, TString det = "GEM")
384 {
385 // qpBin = 0 (positive), 1 (negative)
386
387 if (det.Contains("GEM") && hEffGem1d[qpBin][range])
388 return hEffGem1d[qpBin][range];
389 else if (det.Contains("SIL") && hEffSil1d[qpBin][range])
390 return hEffSil1d[qpBin][range];
391
392 else
393 return nullptr;
394 }
395
396 virtual ~EffStore2D()
397 {
398 // Should be implemented further ...
399 }
400
401 private:
404
405 TEfficiency** hEffSil; // epslion(x, y)
406 TEfficiency** hEffSilXP; // epsilon(x, P)
407 TEfficiency*** hEffSil1d; // epsilon(x) at different y-slices
408
409 private:
410 vector<Double_t> getRanges(TClonesArray* sil, Int_t stat)
411 {
412
413 vector<Double_t> tmp;
414
415 for (Int_t iEntry = 0; iEntry < sil->GetEntriesFast(); iEntry++) {
416 InnerTrackerParams* silEle = (InnerTrackerParams*)sil->UncheckedAt(iEntry);
417
418 if (silEle->station() == stat) {
419 tmp.push_back(silEle->x().first);
420 tmp.push_back(silEle->x().second);
421 tmp.push_back(silEle->y().first);
422 tmp.push_back(silEle->y().second);
423
424 break;
425 }
426 }
427
428 return tmp;
429 }
430
432};
433
434// A class to be used as a store for calculated residuals ...
435
436class Residuals : public EffStore
437{
438 public:
440 : detector("")
441 , station(-1)
442 , module(-1)
443 {
444 ;
445 }
446
447 Residuals(TString det, Int_t stat, Int_t mod)
448 : EffStore(det, stat, mod)
449 , detector(det)
450 , station(stat)
451 , module(mod)
452 {
453 ;
454 }
455
456 virtual ~Residuals() { ; }
457
459 {
460 x.push_back(xR);
461 y.push_back(yR);
462 }
463
464 vector<Double_t> GetX() { return x; }
465
466 vector<Double_t> GetY() { return y; }
467
468 private:
469 TString detector; // GEM or SILICON
472
473 vector<Double_t> x;
474 vector<Double_t> y;
475
477};
478
479class BmnEfficiency : public TNamed
480{
481 public:
483 BmnEfficiency(FairRunAna*, BmnInnerTrackerGeometryDraw*, TString, Int_t nEvents = 0);
484 BmnEfficiency(FairRunAna*, TString, Int_t nEvents = 0);
485
486 void SetMinNHitsPerGlobTrack(Int_t nHits) { fNHits = nHits; }
487
489
490 void SetMinNHitsPerGemTrack(Int_t nHits) { fNHitsGem = nHits; }
491
493 TClonesArray* effSilicon,
494 map<Int_t, vector<pair<Double_t, Double_t>>>,
495 map<Int_t, vector<pair<Double_t, Double_t>>>);
496
498 {
499 if (fMagField)
500 delete fMagField;
501 if (dstChain)
502 delete dstChain;
503 if (fKalman)
504 delete fKalman;
505 }
506
508
509 // Overloading = ...
510
512 {
513 // Check assignement to itself
514 if (this == &eff)
515 return *this;
516
517 dstChain = eff.dstChain;
518 fVertices = eff.fVertices;
520
523
525 fGemHits = eff.fGemHits;
526
527 fMagField = eff.fMagField;
528 fField = eff.fField;
529 fKalman = eff.fKalman;
530
531 return *this;
532 }
533
534 private:
536 // Acceptance maps to be used ...
537 map<pair<Int_t, Int_t>, Double_t> fStatZ; // (stat, mod) --> Z
538 map<pair<Int_t, Int_t>, vector<Double_t>> fStatAcceptance; // (stat, mod) --> vector of boarders ...
541
543 void FillAcceptanceMaps(TClonesArray*, TClonesArray* SILs = nullptr);
544
546 {
547 Double_t z = hit->GetZ();
548
549 TString det = "";
550 if (z > gem->GetStation(0)->GetZPosition() - 5.)
551 det = "GEM";
552 else
553 det = "SILICON";
554
555 return det;
556 }
557
558 inline Double_t FindZ(Int_t stat) { return fStatZ.find(make_pair(stat, 0))->second; }
559
561 vector<BmnHit*>,
562 pair<FairTrackParam, FairTrackParam>,
563 pair<Double_t, Double_t>&);
564
565 Int_t FindBin(Double_t y, Int_t stat, map<Int_t, vector<pair<Double_t, Double_t>>> pairMap)
566 {
567 Int_t bin = -1;
568
569 for (size_t iRange = 0; iRange < pairMap.find(stat)->second.size(); iRange++) {
570 Double_t min = pairMap.find(stat)->second.at(iRange).first;
571 Double_t max = pairMap.find(stat)->second.at(iRange).second;
572
573 if (y > min && y < max) {
574 bin = iRange;
575 break;
576 }
577 }
578
579 return bin;
580 }
581
582 protected:
583 // Geometries
586
588
596
599
603
605
607};
608
609#endif
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
Definition P4_F32vec4.h:30
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
Definition P4_F32vec4.h:31
bool Bool_t
int Int_t
double Double_t
#define ClassDef(name, id)
char * Form(const char *fmt,...)
void fillEfficiency(inputForEfficiency &&in)
void SetMinNHitsPerGlobTrack(Int_t nHits)
BmnKalmanFilter * fKalman
BmnNewFieldMap * fMagField
TClonesArray * fInnerHits
void Efficiency(TClonesArray *, TClonesArray *effSilicon, map< Int_t, vector< pair< Double_t, Double_t > > >, map< Int_t, vector< pair< Double_t, Double_t > > >)
BmnGemStripStationSet * gem
TClonesArray * fSiliconTracks
map< pair< Int_t, Int_t >, Double_t > fStatZ
BmnEfficiency & operator=(const BmnEfficiency &eff)
TString GetDetector(BmnHit *hit)
BmnSiliconStationSet * silicon
TClonesArray * fGemTracks
TClonesArray * fVertices
Double_t FindZ(Int_t stat)
DstEventHeader * fHeader
FairField * fField
TClonesArray * fGemHits
Int_t FindBin(Double_t y, Int_t stat, map< Int_t, vector< pair< Double_t, Double_t > > > pairMap)
virtual ~BmnEfficiency()
TClonesArray * fSiliconHits
void FillAcceptanceMaps(TClonesArray *, TClonesArray *SILs=nullptr)
void SetMinNHitsPerGemTrack(Int_t nHits)
TChain * dstChain
map< pair< Int_t, Int_t >, vector< Double_t > > fStatAcceptance
TString GetGemZone(BmnHit *)
void SetMinNHitsPerSiliconTrack(Int_t nHits)
Bool_t isVirtualHitInAcceptance(Int_t, vector< BmnHit * >, pair< FairTrackParam, FairTrackParam >, pair< Double_t, Double_t > &)
TClonesArray * fGlobTracks
Field Map does not have any symmetries w.r.t coordinate axises.
TEfficiency *** hEffSil1d
EffStore2D(TString det, Int_t stat, map< Int_t, vector< pair< Double_t, Double_t > > > pairs)
TEfficiency ** hEffSilXP
TEfficiency * efficiency(Int_t qpBin=0, TString hType="", TString det="GEM")
virtual ~EffStore2D()
TEfficiency ** hEffSil
TEfficiency ** hEffGem
vector< Double_t > getRanges(TClonesArray *sil, Int_t stat)
TEfficiency *** hEffGem1d
TEfficiency * efficiency4range(Int_t range, Int_t qpBin=0, TString det="GEM")
TString detector
Int_t Station()
TString zone
vector< TLorentzVector > CoordinatesAndEffs()
Int_t station
virtual ~EffStore()
void IncreaseDenominatorByUnity()
Int_t denominator
EffStore(TString det, Int_t stat, TString z="")
Int_t Module()
Int_t module
Double_t Efficiency()
void AddHitCoordinates(BmnHit *hit, Double_t eff=1.)
TString Detector()
TString Zone()
vector< TLorentzVector > hitPositionsAndEff
void IncreaseNominatorByUnity()
EffStore(TString det, Int_t stat, Int_t mod, TString z="")
Int_t nominator
InnerTrackerParams(Int_t stat, Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax)
void SetZ(Double_t z)
pair< Double_t, Double_t > y()
pair< Double_t, Double_t > x()
InnerTrackerParams(Int_t stat, Int_t mod, Double_t x, Double_t y, Double_t z)
virtual ~InnerTrackerParams()
InnerTrackerParams(Int_t stat, Int_t mod, Double_t xMin, Double_t xMax, Double_t yMin, Double_t yMax)
vector< Double_t > GetY()
vector< Double_t > x
TString detector
vector< Double_t > y
void SetXY(Double_t xR, Double_t yR)
virtual ~Residuals()
vector< Double_t > GetX()
Residuals(TString det, Int_t stat, Int_t mod)
Int_t GetEntriesFast() const
TObject * UncheckedAt(Int_t i) const
friend friend class TClonesArray
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual ~inputForEfficiency()
map< Int_t, vector< pair< Double_t, Double_t > > > sPairMap
pair< Int_t, Int_t > sfIndices
inputForEfficiency & operator=(inputForEfficiency &&input)
vector< Bool_t > usedStats
pair< FairTrackParam, FairTrackParam > flParams
vector< BmnHit * > hits
map< Int_t, vector< pair< Double_t, Double_t > > > gPairMap
TClonesArray * eContainers
Definition json.hpp:4446