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 "CbmRecoSetupManager.h"
16#include "CbmSetup.h"
17
18#include <FairRootManager.h>
19#include <Logger.h>
20
21#include <TAxis.h>
22#include <TClonesArray.h>
23
26
27// ---------------------------------------------------------------------------------------------------------------------
28//
29InputQaSetup::InputQaSetup(int verbose, bool isMCUsed) : CbmQaTask("CbmCaInputQaSetup", verbose, isMCUsed) {}
30
31// ---------------------------------------------------------------------------------------------------------------------
32//
34
35
36// ---------------------------------------------------------------------------------------------------------------------
37//
39{
40 if (IsMCUsed() && !fpMCEventHeader) {
41 throw std::logic_error("MC event header branch is unavailable");
42 }
43 for (int iD = 0; iD < static_cast<int>(ca::EDetectorID::END); ++iD) {
44 if (fvbUseDet[iD]) {
45 if (!fvpBrHits[iD]) {
46 throw std::logic_error(Form("Hit branch is unavailable for %s", kDetName[iD]));
47 }
48 if (IsMCUsed() && !fvpBrPoints[iD]) {
49 throw std::logic_error(Form("MC point branch is unavailable for %s", kDetName[iD]));
50 }
51 }
52 }
53}
54
55// ---------------------------------------------------------------------------------------------------------------------
56//
58{
59 auto CheckDetector = [&](ca::EDetectorID detID) {
60 if (CbmSetup::Instance()->IsActive(ToCbmModuleId(detID))) {
61 fvbUseDet[detID] = true;
62 }
63 L_(info) << fName << ": " << ToCbmModuleId(detID) << " " << fvbUseDet[detID];
64 };
65 CheckDetector(ca::EDetectorID::kMvd);
66 CheckDetector(ca::EDetectorID::kSts);
67 CheckDetector(ca::EDetectorID::kMuch);
68 CheckDetector(ca::EDetectorID::kTrd);
69 CheckDetector(ca::EDetectorID::kTof);
70}
71
72// ---------------------------------------------------------------------------------------------------------------------
73//
75{
76 // Tracking setup by hits
77 {
78 auto* canv = MakeQaObject<TCanvas>("c_setup_hits", "Setup by hits", 1000, 1000);
79 canv->Divide(1, 2, 0.000001, 0.000001);
80 canv->cd(1);
81 gPad->SetLogz();
82 gPad->SetBottomMargin(0.000001);
83 gPad->SetRightMargin(0.05);
84 gPad->SetTitle("");
85 auto* ph_hit_xz = dynamic_cast<TH2F*>(fph_hit_xz.back()->Clone("h_hit_xz_clone"));
86 ph_hit_xz->SetTitle(";z [cm];x [cm]");
87 ph_hit_xz->Draw("col");
88 this->PutSetupNameOnPad(0.08, 0.83, 0.50, 0.89);
89 canv->cd(2);
90 gPad->SetLogz();
91 gPad->SetTopMargin(0.000001);
92 gPad->SetRightMargin(0.05);
93 gPad->SetTitle("");
94 auto* ph_hit_yz = dynamic_cast<TH2F*>(fph_hit_yz.back()->Clone("h_hit_yz_clone"));
95 ph_hit_yz->SetTitle(";z [cm];y [cm]");
96 ph_hit_yz->Draw("col");
97 this->PutSetupNameOnPad(0.08, 0.93, 0.50, 0.99);
98
99
100 auto LoBinEdge = [](TAxis* pAxis, double val) { return pAxis->GetBinLowEdge(pAxis->FindBin(val)); };
101 auto UpBinEdge = [](TAxis* pAxis, double val) { return pAxis->GetBinUpEdge(pAxis->FindBin(val)); };
102
103 const auto& recoSetup = cbm::RecoSetupManager::Instance()->GetSetup();
104
105 recoSetup.ForEachUnit([&](const auto& unit) {
106 using Unit_t = std::remove_reference_t<std::remove_cv_t<decltype(unit)>>;
107 constexpr auto DetId = cbm::algo::ca::ToCaDetectorID(Unit_t::GetModuleId());
108 if (!fvbUseDet[DetId]) {
109 return;
110 }
111
112 int nSt = unit.GetNofTrackingStations();
113 for (int iSt = 0; iSt < nSt; ++iSt) {
114 int iStActive = fpParameters->GetStationIndexActive(iSt, DetId);
115 Color_t boxColor = (iStActive < 0) ? kGray + 1 : kOrange + 2;
116 const char* detName = fmt::format("{}-{}", Unit_t::GetDetectorName(), iSt).c_str();
117 {
118 double zMin = LoBinEdge(fph_hit_xz.back()->GetXaxis(), fvZmin[DetId][iSt]);
119 double zMax = UpBinEdge(fph_hit_xz.back()->GetXaxis(), fvZmax[DetId][iSt]);
120 double xMin = LoBinEdge(fph_hit_xz.back()->GetYaxis(), fvXmin[DetId][iSt]);
121 double xMax = UpBinEdge(fph_hit_xz.back()->GetYaxis(), fvXmax[DetId][iSt]);
122 canv->cd(1);
123 auto* pBox = new TBox(zMin, xMin, zMax, xMax);
124 pBox->SetFillStyle(0);
125 pBox->SetLineWidth(2);
126 pBox->SetLineColor(boxColor);
127 pBox->Draw("same");
128 auto* pText = new TText(zMin, xMax, detName);
129 pText->SetTextColor(boxColor);
130 pText->SetTextSize(0.035);
131 pText->SetTextAngle(45);
132 pText->Draw("same");
133 }
134 {
135 double zMin = LoBinEdge(fph_hit_yz.back()->GetXaxis(), fvZmin[DetId][iSt]);
136 double zMax = UpBinEdge(fph_hit_yz.back()->GetXaxis(), fvZmax[DetId][iSt]);
137 double yMin = LoBinEdge(fph_hit_yz.back()->GetYaxis(), fvYmin[DetId][iSt]);
138 double yMax = UpBinEdge(fph_hit_yz.back()->GetYaxis(), fvYmax[DetId][iSt]);
139 canv->cd(2);
140 auto* pBox = new TBox(zMin, yMin, zMax, yMax);
141 pBox->SetFillStyle(0);
142 pBox->SetLineWidth(2);
143 pBox->SetLineColor(boxColor);
144 pBox->Draw("same");
145 auto* pText = new TText(zMin, yMax, detName);
146 pText->SetTextSize(0.035);
147 pText->SetTextColor(boxColor);
148 pText->SetTextAngle(45);
149 pText->Draw("same");
150 }
151 }
152 });
153 }
154}
155
156// -----------------------------------------------------------------------------------------------------------------
157//
158template<cbm::algo::ca::EDetectorID DetID>
160{
161 using Hit_t = HitTypes_t::at<DetID>;
162 using McPoint_t = PointTypes_t::at<DetID>;
163 int nHits = fvpBrHits[DetID]->GetEntriesFast();
165
166 for (int iH = 0; iH < nHits; ++iH) {
167 const auto* pHit = dynamic_cast<const Hit_t*>(fvpBrHits[DetID]->At(iH));
168 if (!pHit) {
169 LOG(warn) << fName << ": hit with iH = " << iH << " for detector " << kDetName[DetID] << " is not found";
170 }
171 auto address = pHit->GetAddress();
172
173 // skip Bmon hits (rule?)
174 if constexpr (ca::EDetectorID::kTof == DetID) {
175 if (5 == CbmTofAddress::GetSmType(address)) {
176 continue;
177 }
178 }
179
180 int iStLoc = pDetIfs->GetTrackingStationId(address);
181 if (iStLoc < 0) {
182 continue;
183 }
184
185 int iStGeo = fpParameters->GetStationIndexGeometry(iStLoc, DetID);
186 auto xHit = pHit->GetX();
187 auto yHit = pHit->GetY();
188 auto zHit = pHit->GetZ();
189 if (fvXmin[DetID][iStLoc] > xHit) {
190 fvXmin[DetID][iStLoc] = xHit;
191 }
192 if (fvXmax[DetID][iStLoc] < xHit) {
193 fvXmax[DetID][iStLoc] = xHit;
194 }
195 if (fvYmin[DetID][iStLoc] > yHit) {
196 fvYmin[DetID][iStLoc] = yHit;
197 }
198 if (fvYmax[DetID][iStLoc] < yHit) {
199 fvYmax[DetID][iStLoc] = yHit;
200 }
201 if (fvZmin[DetID][iStLoc] > zHit) {
202 fvZmin[DetID][iStLoc] = zHit;
203 }
204 if (fvZmax[DetID][iStLoc] < zHit) {
205 fvZmax[DetID][iStLoc] = zHit;
206 }
207 if (iStGeo >= 0) {
208 fph_hit_xy[iStGeo]->Fill(xHit, yHit);
209 fph_hit_xz[iStGeo]->Fill(zHit, xHit);
210 fph_hit_yz[iStGeo]->Fill(zHit, yHit);
211 }
212 fph_hit_xz.back()->Fill(zHit, xHit);
213 fph_hit_yz.back()->Fill(zHit, yHit);
214 } // iH
215
216 if (IsMCUsed()) {
217 int nMCevents = fpMCEventList->GetNofEvents();
218 for (int iE = 0; iE < nMCevents; ++iE) {
219 int iFile = fpMCEventList->GetFileIdByIndex(iE);
220 int iEvent = fpMCEventList->GetEventIdByIndex(iE);
221 int nPoints = fvpBrPoints[DetID]->Size(iFile, iEvent);
222
223 for (int iP = 0; iP < nPoints; ++iP) {
224 const auto* pPoint = dynamic_cast<const McPoint_t*>(fvpBrPoints[DetID]->Get(iFile, iEvent, iP));
225 if (!pPoint) {
226 LOG(error) << fName << ": point with iFile=" << iFile << ", iEvent=" << iEvent << ", iP=" << iP
227 << " for detector " << kDetName[DetID] << " is not found";
228 continue;
229 }
230 auto address = pPoint->GetDetectorID();
231
232 int iStLoc = pDetIfs->GetTrackingStationId(address);
233 if (iStLoc < 0) {
234 continue;
235 }
236
237 int iStGeo = fpParameters->GetStationIndexGeometry(iStLoc, DetID);
238 auto xPoint = pPoint->FairMCPoint::GetX();
239 auto yPoint = pPoint->FairMCPoint::GetY();
240 auto zPoint = pPoint->FairMCPoint::GetZ();
241
242 if (iStGeo >= 0) {
243 fph_point_xy[iStGeo]->Fill(xPoint, yPoint);
244 fph_point_xz[iStGeo]->Fill(zPoint, xPoint);
245 fph_point_yz[iStGeo]->Fill(zPoint, yPoint);
246 }
247 fph_point_xz.back()->Fill(zPoint, xPoint);
248 fph_point_yz.back()->Fill(zPoint, yPoint);
249 } // iP
250 } // iE
251 }
252}
253
254// ---------------------------------------------------------------------------------------------------------------------
255//
274
275
276// ---------------------------------------------------------------------------------------------------------------------
277//
279try {
280 LOG(info) << fName << ": initializing... ";
282
283 // Tracking parameters
285 assert(fpParameters != nullptr); // Hint: Add the cbm::ca::ParametersHandler::Instance() as a task in the FairRunAna
286
287 auto pFairManager = FairRootManager::Instance();
288 assert(pFairManager);
289
290 auto pMcManager = IsMCUsed() ? dynamic_cast<CbmMCDataManager*>(pFairManager->GetObject("MCDataManager")) : nullptr;
291 if (IsMCUsed()) {
292 fpMCEventList = dynamic_cast<CbmMCEventList*>(pFairManager->GetObject("MCEventList."));
293 fpMCEventHeader = pMcManager->GetObject("MCEventHeader.");
294 }
295
296 if (!RecoSetupManager::Instance()->IsInitialized()) {
297 throw std::runtime_error("RecoSetupManager was not initialize. Please, add it as task to your macro");
298 }
299
300 fvpBrPoints.fill(nullptr);
301 fvpBrHits.fill(nullptr);
302
303 const auto& recoSetup = cbm::RecoSetupManager::Instance()->GetSetup();
304 recoSetup.ForEachUnit([&](const auto& unit) {
305 using Unit_t = std::remove_reference_t<std::remove_cv_t<decltype(unit)>>;
306 constexpr auto DetId = cbm::algo::ca::ToCaDetectorID(Unit_t::GetModuleId());
307 if (!fvbUseDet[DetId]) {
308 return;
309 }
310 int nSt = unit.GetNofTrackingStations();
311 fvXmin[DetId].resize(nSt, std::numeric_limits<double>::max());
312 fvXmax[DetId].resize(nSt, std::numeric_limits<double>::lowest());
313 fvYmin[DetId].resize(nSt, std::numeric_limits<double>::max());
314 fvYmax[DetId].resize(nSt, std::numeric_limits<double>::lowest());
315 fvZmin[DetId].resize(nSt, std::numeric_limits<double>::max());
316 fvZmax[DetId].resize(nSt, std::numeric_limits<double>::lowest());
317 });
318
319 auto InitHitBranch = [&](const char* brName, ca::EDetectorID detID) {
320 if (fvbUseDet[detID]) {
321 fvpBrHits[detID] = dynamic_cast<TClonesArray*>(pFairManager->GetObject(brName));
322 if (!fvpBrHits[detID]) {
323 fvbUseDet[detID] = false; // Disable detectors without hits
324 }
325 }
326 return static_cast<bool>(fvpBrHits[detID]);
327 };
328
329 auto InitPointBranch = [&](const char* brName, ca::EDetectorID detID) {
330 if (IsMCUsed() && fvbUseDet[detID]) {
331 fvpBrPoints[detID] = pMcManager->InitBranch(brName);
332 }
333 };
334
335 InitHitBranch("MvdHit", ca::EDetectorID::kMvd);
336 InitHitBranch("StsHit", ca::EDetectorID::kSts);
337 InitHitBranch("MuchPixelHit", ca::EDetectorID::kMuch);
338 InitHitBranch("TrdHit", ca::EDetectorID::kTrd);
339 if (!InitHitBranch("TofCalHit", ca::EDetectorID::kTof)) {
340 InitHitBranch("TofHit", ca::EDetectorID::kTof);
341 }
342
343 InitPointBranch("MvdPoint", ca::EDetectorID::kMvd);
344 InitPointBranch("StsPoint", ca::EDetectorID::kSts);
345 InitPointBranch("MuchPoint", ca::EDetectorID::kMuch);
346 InitPointBranch("TrdPoint", ca::EDetectorID::kTrd);
347 InitPointBranch("TofPoint", ca::EDetectorID::kTof);
348
349 this->CheckInit();
350
351
352 int nStGeo = fpParameters->GetNstationsGeometry();
353
354 MakeQaDirectory("hit_occupancy");
355 for (int iD = 0; iD < static_cast<int>(ca::EDetectorID::END); ++iD) {
356 if (fvbUseDet[iD]) {
357 MakeQaDirectory(Form("hit_occupancy/%s", kDetName[iD]));
358 }
359 }
360 MakeQaDirectory("point_occupancy");
361 for (int iD = 0; iD < static_cast<int>(ca::EDetectorID::END); ++iD) {
362 if (fvbUseDet[iD]) {
363 MakeQaDirectory(Form("point_occupancy/%s", kDetName[iD]));
364 }
365 }
366
367 fph_hit_xy.resize(nStGeo);
368 fph_hit_xz.resize(nStGeo + 1);
369 fph_hit_yz.resize(nStGeo + 1);
370 fph_point_xy.resize(nStGeo);
371 fph_point_xz.resize(nStGeo + 1);
372 fph_point_yz.resize(nStGeo + 1);
373
375 constexpr int kNbinsZ = 300;
376 constexpr int kNbinsX = 200;
377 constexpr int kNbinsY = 200;
378 constexpr float kMinZ = -5.;
379 constexpr float kMaxZ = 350.;
380 constexpr float kMinX = -100.;
381 constexpr float kMaxX = 100.;
382 constexpr float kMinY = -100.;
383 constexpr float kMaxY = 100.;
384
385 for (int iStGeo = 0; iStGeo <= nStGeo; ++iStGeo) {
386 auto [detID, iStLoc] = fpParameters->GetStationIndexLocal(iStGeo);
387 TString sF = "";
388 TString sN = "";
389 TString sT = "";
390 TString sNsuff = (iStGeo == nStGeo) ? "" : Form("_st_%s%d", kDetName[detID], iStLoc);
391 TString sTsuff = (iStGeo == nStGeo) ? "" : Form(" in %s station %d", kDetName[detID], iStLoc);
392
393 // Hit occupancy
394 sF = Form("hit_occupancy%s", ((iStGeo == nStGeo) ? "" : Form("/%s", kDetName[detID])));
395 sN = Form("hit_xz%s", sNsuff.Data());
396 sT = Form("hit occupancy in xz-plane%s;z_{hit} [cm];x_{hit} [cm]", sTsuff.Data());
397 fph_hit_xz[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsZ, kMinZ, kMaxZ, kNbinsX, kMinX, kMaxX);
398
399 sN = Form("hit_yz%s", sNsuff.Data());
400 sT = Form("hit occupancy in yz-plane%s;z_{hit} [cm];y_{hit} [cm]", sTsuff.Data());
401 fph_hit_yz[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsZ, kMinZ, kMaxZ, kNbinsY, kMinY, kMaxY);
402
403 if (iStGeo < nStGeo) {
404 sN = Form("hit_xy%s", sNsuff.Data());
405 sT = Form("hit occupancy in xy-plane%s;x_{hit} [cm];y_{hit} [cm]", sTsuff.Data());
406 fph_hit_xy[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsX, kMinX, kMaxX, kNbinsY, kMinY, kMaxY);
407 }
408
409 if (IsMCUsed()) {
410 // Point occupancy
411 sF = Form("point_occupancy%s", ((iStGeo == nStGeo) ? "" : Form("/%s", kDetName[detID])));
412 sN = Form("point_xz%s", sNsuff.Data());
413 sT = Form("point occupancy in xz-plane%s;z_{point} [cm];x_{point} [cm]", sTsuff.Data());
414 fph_point_xz[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsZ, kMinZ, kMaxZ, kNbinsX, kMinX, kMaxX);
415
416 sN = Form("point_yz%s", sNsuff.Data());
417 sT = Form("point occupancy in yz-plane%s;z_{point} [cm];y_{point} [cm]", sTsuff.Data());
418 fph_point_yz[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsZ, kMinZ, kMaxZ, kNbinsY, kMinY, kMaxY);
419
420 if (iStGeo < nStGeo) {
421 sN = Form("point_xy%s", sNsuff.Data());
422 sT = Form("point occupancy in xy-plane%s;x_{point} [cm];y_{point} [cm]", sTsuff.Data());
423 fph_point_xy[iStGeo] = MakeQaObject<TH2F>(sF + "/" + sN, sT, kNbinsX, kMinX, kMaxX, kNbinsY, kMinY, kMaxY);
424 }
425 }
426 }
427
428
429 auto CreateMaterialBudgetHistograms = [&](const auto& kfSetup, const TString& dir) {
430 for (int iLayer = 0; iLayer < kfSetup.GetNofLayers(); ++iLayer) {
431 const auto& matMap{kfSetup.GetMaterial(iLayer)};
432 auto [detID, stationID] = kfSetup.GetIndexMap().GlobalToLocal(iLayer);
433 TString sN = Form("%s/mat_budget_%s_st%d", dir.Data(), kDetName[detID], stationID);
434 TString sT =
435 Form("Material budget map for %s station %d;x [cm];y [cm]; X/X_{0} [%%]", kDetName[detID], stationID);
436 auto nBins{matMap.GetNbins()};
437 auto xMin{-matMap.GetXYmax()};
438 auto xMax{+matMap.GetXYmax()};
439 auto* pHist = MakeQaObject<TH2F>(sN, sT, nBins, xMin, xMax, nBins, xMin, xMax);
440 for (int iX = 0; iX < nBins; ++iX) {
441 for (int iY = 0; iY < nBins; ++iY) {
442 pHist->SetBinContent(iX + 1, iY + 1, 100. * matMap.template GetBinThicknessX0<float>(iX, iY));
443 }
444 }
445 }
446 };
447
448 MakeQaDirectory("TrackingKFSetup");
449 MakeQaDirectory("TrackingKFSetup/geometry");
450 CreateMaterialBudgetHistograms(fpParameters->GetGeometrySetup(), "TrackingKFSetup/geometry");
451 MakeQaDirectory("TrackingKFSetup/active");
452 CreateMaterialBudgetHistograms(fpParameters->GetActiveSetup(), "TrackingKFSetup/active");
453
454 LOG(info) << fName << ": initializing... \033[1;32mDone\033[0m";
455 return kSUCCESS;
456}
457catch (const std::exception& e) {
458 LOG(error) << fName << ": initializing... \033[1;31mFailed\033[0m\nReason: " << e.what();
459 return kFATAL;
460}
#define L_(level)
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.
A manager for setup representation in CBM reconstruction.
Task class creating and managing CbmMCDataArray objects.
Container class for MC events with number, file and start time.
T * MakeQaObject(TString sName, TString sTitle, Args... args)
Definition CbmQaIO.h:260
void MakeQaDirectory(TString sName)
Definition CbmQaIO.cxx:132
CbmQaTask(const char *name, int verbose, bool isMCUsed, ECbmRecoMode recoMode=ECbmRecoMode::Timeslice)
Constructor from parameters.
Definition CbmQaTask.cxx:32
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 CbmSetup * Instance()
Definition CbmSetup.cxx:160
static int32_t GetSmType(uint32_t address)
InputQaSetup(int verbose, bool isMCUsed)
Constructor from parameters.
const algo::RecoSetup & GetSetup() const
Setup accessor.
static RecoSetupManager * Instance()
Instance access.
void ForEachUnit(Visitor &&visitor) const
A for-each method, which is applied to each unit, if it has a value (constant access)
Definition RecoSetup.h:95
const RecoSetupUnit_t< ModuleId > * Get() const
Access to a reconstruction setup unit.
Definition RecoSetup.h:112
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::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
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.
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.
CbmMCEventList * fpMCEventList
Pointer to MC event list.
std::shared_ptr< const ca::Parameters< double > > fpParameters
Pointer to CA parameters object.
void CheckoutDetectors()
Check out initialized detectors.
void CreateSummary() override
Creates summary cavases, tables etc.
DetIdArr_t< std::vector< double > > fvYmin
static ParametersHandler & Instance()
Instance.
ParametersPtr_t Get() const
Accessor to the parameters shared pointer.
EDetectorID
Enumeration for the tracking detector subsystems in CBM-CA.
Definition CbmDefs.h:216
constexpr ECbmModuleId ToCbmModuleId(EDetectorID detID)
Conversion map from EDetectorID to ECbmModuleId.
Definition CbmDefs.h:228
constexpr EDetectorID ToCaDetectorID(ECbmModuleId modId)
Conversion map from EDetectorID to ECbmModuleId.
Definition CbmDefs.h:242
constexpr DetIdArr_t< const char * > kDetName
Names of detector subsystems.
std::tuple_element_t< static_cast< std::size_t >(DetID), std::tuple< Types... > > at