CbmRoot
Loading...
Searching...
No Matches
CbmCaInputQaSetup.cxx
Go to the documentation of this file.
1/* Copyright (C) 2023 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Sergei Zharko [committer] */
4
9
10#include "CbmCaInputQaSetup.h"
11
13#include "CbmL1DetectorID.h"
14#include "CbmMCDataManager.h"
15#include "FairRootManager.h"
16#include "TAxis.h"
17
18#include <Logger.h>
19
23
24// ---------------------------------------------------------------------------------------------------------------------
25//
26InputQaSetup::InputQaSetup(int verbose, bool isMCUsed) : CbmQaTask("CbmCaInputQaSetup", verbose, isMCUsed) {}
27
28// ---------------------------------------------------------------------------------------------------------------------
29//
31
32
33// ---------------------------------------------------------------------------------------------------------------------
34//
36{
37 if (IsMCUsed() && !fpMCEventHeader) {
38 throw std::logic_error("MC event header branch is unavailable");
39 }
40 for (int iD = 0; iD < static_cast<int>(ca::EDetectorID::END); ++iD) {
41 if (fvbUseDet[iD]) {
42 if (!fvpBrHits[iD]) {
43 throw std::logic_error(Form("Hit branch is unavailable for %s", kDetName[iD]));
44 }
45 if (IsMCUsed() && !fvpBrPoints[iD]) {
46 throw std::logic_error(Form("MC point branch is unavailable for %s", kDetName[iD]));
47 }
48 }
49 }
50}
51
52// ---------------------------------------------------------------------------------------------------------------------
53//
55{
56 // Tracking setup by hits
57 {
58 auto* canv = MakeQaObject<TCanvas>("c_setup_hits", "Setup by hits", 1000, 1000);
59 canv->Divide(1, 2, 0.000001, 0.000001);
60 canv->cd(1);
61 gPad->SetLogz();
62 gPad->SetBottomMargin(0.000001);
63 gPad->SetRightMargin(0.05);
64 gPad->SetTitle("");
65 auto* ph_hit_xz = dynamic_cast<TH2F*>(fph_hit_xz.back()->Clone("h_hit_xz_clone"));
66 ph_hit_xz->SetTitle(";z [cm];x [cm]");
67 ph_hit_xz->Draw("col");
68 this->PutSetupNameOnPad(0.08, 0.83, 0.50, 0.89);
69 canv->cd(2);
70 gPad->SetLogz();
71 gPad->SetTopMargin(0.000001);
72 gPad->SetRightMargin(0.05);
73 gPad->SetTitle("");
74 auto* ph_hit_yz = dynamic_cast<TH2F*>(fph_hit_yz.back()->Clone("h_hit_yz_clone"));
75 ph_hit_yz->SetTitle(";z [cm];y [cm]");
76 ph_hit_yz->Draw("col");
77 this->PutSetupNameOnPad(0.08, 0.93, 0.50, 0.99);
78
79
80 auto LoBinEdge = [](TAxis* pAxis, double val) { return pAxis->GetBinLowEdge(pAxis->FindBin(val)); };
81 auto UpBinEdge = [](TAxis* pAxis, double val) { return pAxis->GetBinUpEdge(pAxis->FindBin(val)); };
82
83 for (int iDet = 0; iDet < static_cast<int>(fvpDetInterface.size()); ++iDet) {
84 if (!fvbUseDet[iDet]) {
85 continue;
86 }
87 int nSt = fvpDetInterface[iDet]->GetNtrackingStations();
88 for (int iSt = 0; iSt < nSt; ++iSt) {
89 int iStActive = fpParameters->GetStationIndexActive(iSt, static_cast<ca::EDetectorID>(iDet));
90 Color_t boxColor = (iStActive < 0) ? kGray + 1 : kOrange + 2;
91 const char* detName = Form("%s-%d", fvpDetInterface[iDet]->GetDetectorName().c_str(), iSt);
92 {
93 double zMin = LoBinEdge(fph_hit_xz.back()->GetXaxis(), fvZmin[iDet][iSt]);
94 double zMax = UpBinEdge(fph_hit_xz.back()->GetXaxis(), fvZmax[iDet][iSt]);
95 double xMin = LoBinEdge(fph_hit_xz.back()->GetYaxis(), fvXmin[iDet][iSt]);
96 double xMax = UpBinEdge(fph_hit_xz.back()->GetYaxis(), fvXmax[iDet][iSt]);
97 canv->cd(1);
98 auto* pBox = new TBox(zMin, xMin, zMax, xMax);
99 pBox->SetFillStyle(0);
100 pBox->SetLineWidth(2);
101 pBox->SetLineColor(boxColor);
102 pBox->Draw("same");
103 auto* pText = new TText(zMin, xMax, detName);
104 pText->SetTextColor(boxColor);
105 pText->SetTextSize(0.035);
106 pText->SetTextAngle(45);
107 pText->Draw("same");
108 }
109 {
110 double zMin = LoBinEdge(fph_hit_yz.back()->GetXaxis(), fvZmin[iDet][iSt]);
111 double zMax = UpBinEdge(fph_hit_yz.back()->GetXaxis(), fvZmax[iDet][iSt]);
112 double yMin = LoBinEdge(fph_hit_yz.back()->GetYaxis(), fvYmin[iDet][iSt]);
113 double yMax = UpBinEdge(fph_hit_yz.back()->GetYaxis(), fvYmax[iDet][iSt]);
114 canv->cd(2);
115 auto* pBox = new TBox(zMin, yMin, zMax, yMax);
116 pBox->SetFillStyle(0);
117 pBox->SetLineWidth(2);
118 pBox->SetLineColor(boxColor);
119 pBox->Draw("same");
120 auto* pText = new TText(zMin, yMax, detName);
121 pText->SetTextSize(0.035);
122 pText->SetTextColor(boxColor);
123 pText->SetTextAngle(45);
124 pText->Draw("same");
125 }
126 }
127 }
128 }
129}
130
131// -----------------------------------------------------------------------------------------------------------------
132//
133template<cbm::algo::ca::EDetectorID DetID>
135{
136 using Hit_t = HitTypes_t::at<DetID>;
137 using McPoint_t = PointTypes_t::at<DetID>;
138 int nHits = fvpBrHits[DetID]->GetEntriesFast();
139
140 for (int iH = 0; iH < nHits; ++iH) {
141 const auto* pHit = dynamic_cast<const Hit_t*>(fvpBrHits[DetID]->At(iH));
142 if (!pHit) {
143 LOG(warn) << fName << ": hit with iH = " << iH << " for detector " << kDetName[DetID] << " is not found";
144 }
145 auto address = pHit->GetAddress();
146
147 // skip Bmon hits (rule?)
148 if constexpr (ca::EDetectorID::kTof == DetID) {
149 if (5 == CbmTofAddress::GetSmType(address)) {
150 continue;
151 }
152 }
153
154 int iStLoc = fvpDetInterface[DetID]->GetTrackingStationIndex(address);
155 if (iStLoc < 0) {
156 continue;
157 }
158
159 int iStGeo = fpParameters->GetStationIndexGeometry(iStLoc, DetID);
160 auto xHit = pHit->GetX();
161 auto yHit = pHit->GetY();
162 auto zHit = pHit->GetZ();
163 if (fvXmin[DetID][iStLoc] > xHit) {
164 fvXmin[DetID][iStLoc] = xHit;
165 }
166 if (fvXmax[DetID][iStLoc] < xHit) {
167 fvXmax[DetID][iStLoc] = xHit;
168 }
169 if (fvYmin[DetID][iStLoc] > yHit) {
170 fvYmin[DetID][iStLoc] = yHit;
171 }
172 if (fvYmax[DetID][iStLoc] < yHit) {
173 fvYmax[DetID][iStLoc] = yHit;
174 }
175 if (fvZmin[DetID][iStLoc] > zHit) {
176 fvZmin[DetID][iStLoc] = zHit;
177 }
178 if (fvZmax[DetID][iStLoc] < zHit) {
179 fvZmax[DetID][iStLoc] = zHit;
180 }
181 if (iStGeo >= 0) {
182 fph_hit_xy[iStGeo]->Fill(xHit, yHit);
183 fph_hit_xz[iStGeo]->Fill(zHit, xHit);
184 fph_hit_yz[iStGeo]->Fill(zHit, yHit);
185 }
186 fph_hit_xz.back()->Fill(zHit, xHit);
187 fph_hit_yz.back()->Fill(zHit, yHit);
188 } // iH
189
190 if (IsMCUsed()) {
191 int nMCevents = fpMCEventList->GetNofEvents();
192 for (int iE = 0; iE < nMCevents; ++iE) {
193 int iFile = fpMCEventList->GetFileIdByIndex(iE);
194 int iEvent = fpMCEventList->GetEventIdByIndex(iE);
195 int nPoints = fvpBrPoints[DetID]->Size(iFile, iEvent);
196
197 for (int iP = 0; iP < nPoints; ++iP) {
198 const auto* pPoint = dynamic_cast<const McPoint_t*>(fvpBrPoints[DetID]->Get(iFile, iEvent, iP));
199 if (!pPoint) {
200 LOG(error) << fName << ": point with iFile=" << iFile << ", iEvent=" << iEvent << ", iP=" << iP
201 << " for detector " << kDetName[DetID] << " is not found";
202 continue;
203 }
204 auto address = pPoint->GetDetectorID();
205
206 int iStLoc = fvpDetInterface[DetID]->GetTrackingStationIndex(address);
207 if (iStLoc < 0) {
208 continue;
209 }
210
211 int iStGeo = fpParameters->GetStationIndexGeometry(iStLoc, DetID);
212 auto xPoint = pPoint->FairMCPoint::GetX();
213 auto yPoint = pPoint->FairMCPoint::GetY();
214 auto zPoint = pPoint->FairMCPoint::GetZ();
215
216 if (iStGeo >= 0) {
217 fph_point_xy[iStGeo]->Fill(xPoint, yPoint);
218 fph_point_xz[iStGeo]->Fill(zPoint, xPoint);
219 fph_point_yz[iStGeo]->Fill(zPoint, yPoint);
220 }
221 fph_point_xz.back()->Fill(zPoint, xPoint);
222 fph_point_yz.back()->Fill(zPoint, yPoint);
223 } // iP
224 } // iE
225 }
226}
227
228// ---------------------------------------------------------------------------------------------------------------------
229//
231{
232 if (fvbUseDet[ca::EDetectorID::kMvd]) {
234 }
235 if (fvbUseDet[ca::EDetectorID::kSts]) {
237 }
238 if (fvbUseDet[ca::EDetectorID::kMuch]) {
240 }
241 if (fvbUseDet[ca::EDetectorID::kTrd]) {
243 }
244 if (fvbUseDet[ca::EDetectorID::kTof]) {
246 }
247}
248
249
250// ---------------------------------------------------------------------------------------------------------------------
251//
253try {
254 LOG(info) << fName << ": initializing... ";
255
256 // Tracking parameters
258 LOG(info) << fName << ": parameters instance, reference: " << fpParameters.use_count();
259
260 auto pFairManager = FairRootManager::Instance();
261 assert(pFairManager);
262
263 auto pMcManager = IsMCUsed() ? dynamic_cast<CbmMCDataManager*>(pFairManager->GetObject("MCDataManager")) : nullptr;
264 if (IsMCUsed()) {
265 fpMCEventList = dynamic_cast<CbmMCEventList*>(pFairManager->GetObject("MCEventList."));
266 fpMCEventHeader = pMcManager->GetObject("MCEventHeader.");
267 }
268
269 fvpBrPoints.fill(nullptr);
270 fvpBrHits.fill(nullptr);
271
272 auto InitDetInterface = [&](CbmTrackingDetectorInterfaceBase* ifs, ca::EDetectorID detID) {
273 if (fvbUseDet[detID]) {
274 fvpDetInterface[detID] = ifs;
275 int nSt = ifs->GetNtrackingStations();
276 fvXmin[detID].resize(nSt, std::numeric_limits<double>::max());
277 fvXmax[detID].resize(nSt, std::numeric_limits<double>::lowest());
278 fvYmin[detID].resize(nSt, std::numeric_limits<double>::max());
279 fvYmax[detID].resize(nSt, std::numeric_limits<double>::lowest());
280 fvZmin[detID].resize(nSt, std::numeric_limits<double>::max());
281 fvZmax[detID].resize(nSt, std::numeric_limits<double>::lowest());
282 }
283 };
284
285 auto InitHitBranch = [&](const char* brName, ca::EDetectorID detID) {
286 if (fvbUseDet[detID]) {
287 fvpBrHits[detID] = dynamic_cast<TClonesArray*>(pFairManager->GetObject(brName));
288 }
289 return static_cast<bool>(fvpBrHits[detID]);
290 };
291
292 auto InitPointBranch = [&](const char* brName, ca::EDetectorID detID) {
293 if (IsMCUsed() && fvbUseDet[detID]) {
294 fvpBrPoints[detID] = pMcManager->InitBranch(brName);
295 }
296 };
297
298 InitDetInterface(CbmMvdTrackingInterface::Instance(), ca::EDetectorID::kMvd);
299 InitDetInterface(CbmStsTrackingInterface::Instance(), ca::EDetectorID::kSts);
300 InitDetInterface(CbmMuchTrackingInterface::Instance(), ca::EDetectorID::kMuch);
301 InitDetInterface(CbmTrdTrackingInterface::Instance(), ca::EDetectorID::kTrd);
302 InitDetInterface(CbmTofTrackingInterface::Instance(), ca::EDetectorID::kTof);
303
304 InitHitBranch("MvdHit", ca::EDetectorID::kMvd);
305 InitHitBranch("StsHit", ca::EDetectorID::kSts);
306 InitHitBranch("MuchPixelHit", ca::EDetectorID::kMuch);
307 InitHitBranch("TrdHit", ca::EDetectorID::kTrd);
308 if (!InitHitBranch("TofCalHit", ca::EDetectorID::kTof)) {
309 InitHitBranch("TofHit", ca::EDetectorID::kTof);
310 }
311
312 InitPointBranch("MvdPoint", ca::EDetectorID::kMvd);
313 InitPointBranch("StsPoint", ca::EDetectorID::kSts);
314 InitPointBranch("MuchPoint", ca::EDetectorID::kMuch);
315 InitPointBranch("TrdPoint", ca::EDetectorID::kTrd);
316 InitPointBranch("TofPoint", ca::EDetectorID::kTof);
317
318 this->CheckInit();
319
320
321 int nStGeo = fpParameters->GetNstationsGeometry();
322
323 MakeQaDirectory("hit_occupancy");
324 for (int iD = 0; iD < static_cast<int>(ca::EDetectorID::END); ++iD) {
325 if (fvbUseDet[iD]) {
326 MakeQaDirectory(Form("hit_occupancy/%s", kDetName[iD]));
327 }
328 }
329 MakeQaDirectory("point_occupancy");
330 for (int iD = 0; iD < static_cast<int>(ca::EDetectorID::END); ++iD) {
331 if (fvbUseDet[iD]) {
332 MakeQaDirectory(Form("point_occupancy/%s", kDetName[iD]));
333 }
334 }
335
336 fph_hit_xy.resize(nStGeo);
337 fph_hit_xz.resize(nStGeo + 1);
338 fph_hit_yz.resize(nStGeo + 1);
339 fph_point_xy.resize(nStGeo);
340 fph_point_xz.resize(nStGeo + 1);
341 fph_point_yz.resize(nStGeo + 1);
342
344 constexpr int kNbinsZ = 300;
345 constexpr int kNbinsX = 200;
346 constexpr int kNbinsY = 200;
347 constexpr float kMinZ = -5.;
348 constexpr float kMaxZ = 350.;
349 constexpr float kMinX = -100.;
350 constexpr float kMaxX = 100.;
351 constexpr float kMinY = -100.;
352 constexpr float kMaxY = 100.;
353
354 for (int iStGeo = 0; iStGeo <= nStGeo; ++iStGeo) {
355 auto [detID, iStLoc] = fpParameters->GetStationIndexLocal(iStGeo);
356 TString sF = "";
357 TString sN = "";
358 TString sT = "";
359 TString sNsuff = (iStGeo == nStGeo) ? "" : Form("_st_%s%d", kDetName[detID], iStLoc);
360 TString sTsuff = (iStGeo == nStGeo) ? "" : Form(" in %s station %d", kDetName[detID], iStLoc);
361
362 // Hit occupancy
363 sF = Form("hit_occupancy%s", ((iStGeo == nStGeo) ? "" : Form("/%s", kDetName[detID])));
364 sN = Form("hit_xz%s", sNsuff.Data());
365 sT = Form("hit occupancy in xz-plane%s;z_{hit} [cm];x_{hit} [cm]", sTsuff.Data());
366 fph_hit_xz[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsZ, kMinZ, kMaxZ, kNbinsX, kMinX, kMaxX);
367
368 sN = Form("hit_yz%s", sNsuff.Data());
369 sT = Form("hit occupancy in yz-plane%s;z_{hit} [cm];y_{hit} [cm]", sTsuff.Data());
370 fph_hit_yz[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsZ, kMinZ, kMaxZ, kNbinsY, kMinY, kMaxY);
371
372 if (iStGeo < nStGeo) {
373 sN = Form("hit_xy%s", sNsuff.Data());
374 sT = Form("hit occupancy in xy-plane%s;x_{hit} [cm];y_{hit} [cm]", sTsuff.Data());
375 fph_hit_xy[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsX, kMinX, kMaxX, kNbinsY, kMinY, kMaxY);
376 }
377
378 if (IsMCUsed()) {
379 // Point occupancy
380 sF = Form("point_occupancy%s", ((iStGeo == nStGeo) ? "" : Form("/%s", kDetName[detID])));
381 sN = Form("point_xz%s", sNsuff.Data());
382 sT = Form("point occupancy in xz-plane%s;z_{point} [cm];x_{point} [cm]", sTsuff.Data());
383 fph_point_xz[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsZ, kMinZ, kMaxZ, kNbinsX, kMinX, kMaxX);
384
385 sN = Form("point_yz%s", sNsuff.Data());
386 sT = Form("point occupancy in yz-plane%s;z_{point} [cm];y_{point} [cm]", sTsuff.Data());
387 fph_point_yz[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsZ, kMinZ, kMaxZ, kNbinsY, kMinY, kMaxY);
388
389 if (iStGeo < nStGeo) {
390 sN = Form("point_xy%s", sNsuff.Data());
391 sT = Form("point occupancy in xy-plane%s;x_{point} [cm];y_{point} [cm]", sTsuff.Data());
392 fph_point_xy[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsX, kMinX, kMaxX, kNbinsY, kMinY, kMaxY);
393 }
394 }
395 }
396
397
398 auto CreateMaterialBudgetHistograms = [&](const auto& kfSetup, const TString& dir) {
399 for (int iLayer = 0; iLayer < kfSetup.GetNofLayers(); ++iLayer) {
400 const auto& matMap{kfSetup.GetMaterial(iLayer)};
401 auto [detID, stationID] = kfSetup.GetIndexMap().GlobalToLocal(iLayer);
402 TString sN = Form("%s/mat_budget_%s_st%d", dir.Data(), kDetName[detID], stationID);
403 TString sT =
404 Form("Material budget map for %s station %d;x [cm];y [cm]; X/X_{0} [%%]", kDetName[detID], stationID);
405 auto nBins{matMap.GetNbins()};
406 auto xMin{-matMap.GetXYmax()};
407 auto xMax{+matMap.GetXYmax()};
408 auto* pHist = MakeQaObject<TH2F>(sN, sT, nBins, xMin, xMax, nBins, xMin, xMax);
409 for (int iX = 0; iX < nBins; ++iX) {
410 for (int iY = 0; iY < nBins; ++iY) {
411 pHist->SetBinContent(iX + 1, iY + 1, 100. * matMap.template GetBinThicknessX0<float>(iX, iY));
412 }
413 }
414 }
415 };
416
417 MakeQaDirectory("TrackingKFSetup");
418 MakeQaDirectory("TrackingKFSetup/geometry");
419 CreateMaterialBudgetHistograms(fpParameters->GetGeometrySetup(), "TrackingKFSetup/geometry");
420 MakeQaDirectory("TrackingKFSetup/active");
421 CreateMaterialBudgetHistograms(fpParameters->GetActiveSetup(), "TrackingKFSetup/active");
422
423 LOG(info) << fName << ": initializing... \033[1;32mDone\033[0m";
424 return kSUCCESS;
425}
426catch (const std::exception& e) {
427 LOG(error) << fName << ": initializing... \033[1;31mFailed\033[0m\nReason: " << e.what();
428 return kFATAL;
429}
QA task for tracking detector interfaces.
Handles an instance of the CA-parameters as a shared pointer (header)
Implementation of L1DetectorID enum class for CBM.
Task class creating and managing CbmMCDataArray objects.
Container class for MC events with number, file and start time.
int32_t GetFileIdByIndex(uint32_t index)
File number by index @value File number for event at given index in list.
int32_t GetEventIdByIndex(uint32_t index)
Event number by index @value Event number for event at given index in list.
std::size_t GetNofEvents() const
Number of events in the list @value Number of events.
static CbmMuchTrackingInterface * Instance()
Gets pointer to the instance of the CbmMuchTrackingInterface.
static CbmMvdTrackingInterface * Instance()
Gets pointer to the instance of the CbmMvdTrackingInterface.
T * MakeQaObject(TString sName, TString sTitle, Args... args)
Definition CbmQaIO.h:261
void MakeQaDirectory(TString sName)
Definition CbmQaIO.cxx:132
bool IsMCUsed() const
Returns flag, whether MC information is used or not in the task.
Definition CbmQaTask.h:126
void PutSetupNameOnPad(double xMin, double yMin, double xMax, double yMax)
Puts setup title on the canvas.
static CbmStsTrackingInterface * Instance()
Gets pointer to the instance of the CbmStsTrackingInterface class.
static int32_t GetSmType(uint32_t address)
static CbmTofTrackingInterface * Instance()
Gets pointer to the instance of the CbmTofTrackingInterface.
Abstract class, which should be inherited by every detecting subsystem tracking interface class.
int GetNtrackingStations() const
Gets actual number of stations, provided by the current geometry setup.
static CbmTrdTrackingInterface * Instance()
Gets pointer to the instance of the CbmTrdTrackingInterface.
A CA Parameters object initialization class.
A container for all external parameters of the CA tracking algorithm.
A QA task to analyze hit and MC point occupancy distributions in different tracking stations.
void FillHistogramsDet()
Fill histograms for a given detector type.
std::vector< TH2F * > fph_hit_xz
Hit occupancy in x-z plane vs. station.
std::shared_ptr< ca::Parameters< float > > fpParameters
Pointer to CA parameters object.
std::vector< TH2F * > fph_hit_xy
Hit occupancy in x-y plane vs. station.
DetIdArr_t< std::vector< double > > fvZmax
std::vector< TH2F * > fph_point_yz
MC point occupancy in y-z plane vs. station.
std::vector< TH2F * > fph_point_xz
MC point occupancy in x-z plane vs. station.
DetIdArr_t< std::vector< double > > fvXmin
DetIdArr_t< bool > fvbUseDet
Detector subsystem usage flag.
DetIdArr_t< std::vector< double > > fvZmin
std::string fsParametersFilename
Filename for the tracking parameters.
DetIdArr_t< std::vector< double > > fvXmax
std::vector< TH2F * > fph_hit_yz
Hit occupancy in y-z plane vs. station.
void CheckInit() const
Checks branches initialization.
void Check() override
Checks results of the QA and returns a success flag.
DetIdArr_t< TClonesArray * > fvpBrHits
Input branch for hits.
CbmMCDataObject * fpMCEventHeader
Pointer to MC event header.
InputQaSetup(int verbose, bool isMCUsed)
Constructor from parameters.
InitStatus InitQa() override
Initializes QA-task.
std::vector< TH2F * > fph_point_xy
MC point occupancy in x-z plane vs. station.
void ExecQa() override
Fills histograms.
DetIdArr_t< std::vector< double > > fvYmax
DetIdArr_t< CbmMCDataArray * > fvpBrPoints
Input branch for MC points.
DetIdArr_t< const CbmTrackingDetectorInterfaceBase * > fvpDetInterface
Pointers to the tracking detector interfaces for each subsystem.
CbmMCEventList * fpMCEventList
Pointer to MC event list.
void CreateSummary() override
Creates summary cavases, tables etc.
DetIdArr_t< std::vector< double > > fvYmin
const ParametersPtr_t Get(const std::string &filename)
Returns an shared pointer to the parameters instance.
static ParametersHandler * Instance()
Instance access.
EDetectorID
Enumeration for the tracking detector subsystems in CBM-CA.
Definition CbmDefs.h:176
constexpr DetIdArr_t< const char * > kDetName
Names of detector subsystems.
std::tuple_element_t< static_cast< std::size_t >(DetID), std::tuple< Types... > > at