CbmRoot
Loading...
Searching...
No Matches
Reco.cxx
Go to the documentation of this file.
1/* Copyright (C) 2023-2025 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Felix Weiglhofer [committer], P.-A. Loizeau, Sergei Zharko */
4#include "Reco.h"
5
7#include "AuxDigiData.h"
8#include "BuildInfo.h"
9#include "CbmDigiEvent.h"
10#include "EventbuildChain.h"
11#include "Exceptions.h"
12#include "HistogramSender.h"
13#include "ParFiles.h"
14#include "RecoGeneralQa.h"
15#include "StsDigiQa.h"
16#include "TrackingSetup.h"
17#include "bmon/Calibrate.h"
18#include "bmon/Hitfind.h"
19#include "bmon/ReadoutConfig.h"
20#include "bmon/Unpack.h"
21#include "ca/TrackingChain.h"
23#include "compat/OpenMP.h"
24#include "evbuild/Config.h"
26#include "much/Unpack.h"
27#include "qa/QaManager.h"
30#include "rich/Unpack.h"
31#include "sts/ChannelMaskSet.h"
32#include "sts/HitfinderChain.h"
33#include "sts/Unpack.h"
34#include "tof/Calibrate.h"
35#include "tof/Hitfind.h"
36#include "tof/Unpack.h"
37#include "trd/Hitfind.h"
38#include "trd/Unpack.h"
39#include "trd2d/Unpack.h"
40#include "util/TimingsFormat.h"
41#include "util/TsUtils.h"
42#include "yaml/Yaml.h"
43
44#include <Monitor.hpp>
45#include <System.hpp>
46
47#include <xpu/host.h>
48
49using namespace cbm::algo;
50using fles::Subsystem;
51
52namespace chron = std::chrono;
53
54Reco::Reco() {}
56
57void Reco::Validate(const Options& opts)
58{
59 if (!fs::exists(opts.ParamsDir())) throw FatalError("ParamsDir does not exist: {}", opts.ParamsDir().string());
60
61 bool hasOutputFile = !opts.OutputFile().empty();
62 bool hasOutputType = !opts.OutputTypes().empty();
63
64 if (!hasOutputFile && hasOutputType) {
65 throw FatalError("Output types specified, but no output file given: -o <file> missing");
66 }
67
68 if (hasOutputFile && !hasOutputType) {
69 throw FatalError("Output file specified, but no output types given: -O <types> missing");
70 }
71
73 throw FatalError("Archive compression enabled but compiled without Zstd: Remove --archive-compression flag");
74 }
75
76 if (opts.Has(Step::LocalReco) && !opts.Has(Step::Unpack)) {
77 throw FatalError("Local reco can't run without unpacking: Add 'Unpack' to the reco steps");
78 }
79
80 if (opts.Has(Step::Tracking) && !opts.Has(Step::LocalReco)) {
81 throw FatalError("Tracking can't run without local reco: Add 'LocalReco' to the reco steps");
82 }
83}
84
85void Reco::Init(const Options& opts)
86{
87 if (fInitialized) throw std::runtime_error("Chain already initialized");
88
89 Validate(opts);
90
91 fContext.opts = opts;
93
94 if (Opts().HistogramUri() != "") {
95 fSender =
96 std::make_shared<HistogramSender>(Opts().HistogramUri(), Opts().HistogramHwm(), Opts().CompressHistograms());
97 // fContext.sender = fSender;
98
100 if (0 == fRunStartTimeNs) {
101 fRunStartTimeNs = chron::duration_cast<chron::nanoseconds>(chron::system_clock::now().time_since_epoch()).count();
102 }
103 }
104
105 xpu::device_prop props{xpu::device::active()};
106 L_(info) << "Running CBM Reco on Device '" << props.name() << "' (Using " << openmp::GetMaxThreads()
107 << " OpenMP threads)";
108
109 if (!opts.MonitorUri().empty()) {
110 fContext.monitor = std::make_unique<cbm::Monitor>(opts.MonitorUri());
111 L_(info) << "Monitoring enabled, sending to " << opts.MonitorUri();
112 }
113
114 // Reco Params
115 fContext.recoParams = yaml::ReadFromFile<RecoParams>(opts.ParamsDir() / "RecoParams.yaml");
116
117 ParFiles parFiles(opts.RunId());
118 L_(info) << "Using parameter files for setup " << parFiles.setup;
119
120 // QA instantiation
121 if (fSender != nullptr) {
122 // QA manager
123 fQaManager = std::make_unique<qa::Manager>(fSender);
124 fQaManager->SetContext(&fContext);
125
126 // General QA
127 fGeneralQa = std::make_unique<qa::RecoGeneralQa>(fRunStartTimeNs, fSender);
128 }
129
130 // Unpackers
131 if (Opts().Has(Subsystem::BMON) && Opts().Has(Step::Unpack)) {
132 bmon::ReadoutSetup readoutSetup =
134 bmon::ReadoutConfig cfg{readoutSetup};
135 fBmonUnpack = std::make_unique<bmon::Unpack>(cfg);
136 }
137
138 if (Opts().Has(Subsystem::MUCH) && Opts().Has(Step::Unpack)) {
140 fMuchUnpack = std::make_unique<much::Unpack>(cfg);
141 }
142
143 if (Opts().Has(Subsystem::RICH) && Opts().Has(Step::Unpack)) {
145 fRichUnpack = std::make_unique<rich::Unpack>(cfg);
146 }
147
148 if (Opts().Has(Subsystem::STS) && Opts().Has(Step::Unpack)) {
149 sts::ReadoutSetup readoutSetup = yaml::ReadFromFile<sts::ReadoutSetup>(Opts().ParamsDir() / parFiles.sts.readout);
150 auto chanMask = yaml::ReadFromFile<sts::ChannelMaskSet>(Opts().ParamsDir() / parFiles.sts.chanMask);
151 auto walkMap = yaml::ReadFromFile<sts::WalkMap>(Opts().ParamsDir() / parFiles.sts.walkMap);
152 bool bCollectAux = (fSender != nullptr && Opts().CollectAuxData());
153 sts::ReadoutConfig readout{readoutSetup, chanMask};
154 sts::Unpack::Config cfg{.readout = readout, .walkMap = walkMap, .bCollectAuxData = bCollectAux};
155 fStsUnpack = std::make_unique<sts::Unpack>(cfg);
156 if (fSender != nullptr && Opts().Has(QaStep::UnpackSts)) {
157 fStsDigiQa = std::make_unique<sts::DigiQa>(fSender);
158 fStsDigiQa->SetUseAuxData(bCollectAux);
159 fStsDigiQa->RegisterReadoutSetup(readoutSetup);
160 fStsDigiQa->Init();
161 }
162 }
163
164 if (Opts().Has(Subsystem::TOF) && Opts().Has(Step::Unpack)) {
165 tof::ReadoutSetup readoutSetup = yaml::ReadFromFile<tof::ReadoutSetup>(Opts().ParamsDir() / parFiles.tof.readout);
166 tof::ReadoutConfig cfg{readoutSetup};
167 fTofUnpack = std::make_unique<tof::Unpack>(cfg);
168 }
169
170 if (Opts().Has(Subsystem::TRD) && Opts().Has(Step::Unpack)) {
171 auto cfg = yaml::ReadFromFile<trd::ReadoutConfig>(Opts().ParamsDir() / parFiles.trd.readout);
172 fTrdUnpack = std::make_unique<trd::Unpack>(cfg);
173 }
174
175 if (Opts().Has(Subsystem::TRD2D) && Opts().Has(Step::Unpack)) {
176 auto setup = yaml::ReadFromFile<trd2d::ReadoutSetup>(Opts().ParamsDir() / parFiles.trd.readout2d);
177 auto calib = yaml::ReadFromFile<trd2d::ReadoutCalib>(Opts().ParamsDir() / parFiles.trd.fee2d);
178 trd2d::Unpack::Config cfg{.roSetup = setup, .roCalib = calib};
179 fTrd2dUnpack = std::make_unique<trd2d::Unpack>(cfg);
180 }
181
182 // --- Tracking setup
183 auto pTrackingSetup = std::make_shared<TrackingSetup>();
184 pTrackingSetup->SetContext(&fContext);
185 pTrackingSetup->Use(Subsystem::STS, Opts().Has(Subsystem::STS));
186 pTrackingSetup->Use(Subsystem::TRD, Opts().Has(Subsystem::TRD));
187 pTrackingSetup->Use(Subsystem::TOF, Opts().Has(Subsystem::TOF));
188 pTrackingSetup->Init();
189
190 // --- Event building
191 if (Opts().Has(Step::DigiTrigger)) {
192 fs::path configFile = opts.ParamsDir() / "EventbuildConfig.yaml";
193 evbuild::Config config(YAML::LoadFile(configFile.string()));
195 std::make_unique<evbuild::EventbuildChain>(config, (Opts().Has(QaStep::EventBuilding) ? fSender : nullptr));
196 if (fQaManager != nullptr && Opts().Has(QaStep::V0Trigger)) {
197 // FIXME: Replace with a common function SetTriggerQa(fQaManager)
198 auto pTriggerQa = std::make_shared<evbuild::V0TriggerQa>(fQaManager);
199 pTriggerQa->Init();
200 fEventBuild->SetV0TriggerQa(pTriggerQa);
201 }
202 fEventBuild->RegisterTrackingSetup(pTrackingSetup);
203 }
204
205 // STS Hitfinder
206 if (Opts().Has(fles::Subsystem::STS) && Opts().Has(Step::LocalReco)) {
207 sts::HitfinderPars hitFinderSetup =
209 hitFinderSetup.landauTable = sts::LandauTable::FromFile(opts.ParamsDir() / "LandauWidthTable.txt");
210 sts::HitfinderChainPars hitFinderPars;
211 hitFinderPars.setup = std::move(hitFinderSetup);
212 hitFinderPars.memory = Params().sts.memory;
213 fStsHitFinder = std::make_unique<sts::HitfinderChain>();
214 fStsHitFinder->SetContext(&fContext);
215 fStsHitFinder->SetParameters(hitFinderPars);
216 }
217
218 // TOF Hitfinder
219 if (Opts().Has(fles::Subsystem::TOF) && Opts().Has(Step::LocalReco)) {
220 auto calibSetup = yaml::ReadFromFile<tof::CalibrateSetup>(opts.ParamsDir() / parFiles.tof.calibrate);
221 fTofCalibrator = std::make_unique<tof::Calibrate>(calibSetup);
222
223 auto hitfindSetup = yaml::ReadFromFile<tof::HitfindSetup>(opts.ParamsDir() / parFiles.tof.hitfinder);
224 fTofHitFinder = std::make_unique<tof::Hitfind>(hitfindSetup);
225
226 if (fQaManager != nullptr && Opts().Has(QaStep::RecoTof)) {
227 fTofHitFinderQa = std::make_unique<tof::HitfindQa>(fQaManager, "TofHitfind");
228 fTofHitFinderQa->InitParameters(hitfindSetup);
229 fTofHitFinderQa->Init();
230 }
231 }
232
233 if (Opts().Has(fles::Subsystem::TRD) && Opts().Has(Step::LocalReco)) {
234 auto setup = yaml::ReadFromFile<trd::HitfindSetup>(opts.ParamsDir() / parFiles.trd.hitfinder);
235 auto setup2d = yaml::ReadFromFile<trd::Hitfind2DSetup>(opts.ParamsDir() / parFiles.trd.hitfinder2d);
236 fTrdHitfind = std::make_unique<trd::Hitfind>(setup, setup2d);
237 }
238
239 // Digi event reconstruction:
240 {
242 // It makes no sence to reconstruct an event, if there is no STS, TRD or TOF
243 fbReconstructDigiEvents &= Opts().Has(fles::Subsystem::STS);
244 fbReconstructDigiEvents &= Opts().Has(fles::Subsystem::TRD);
245 fbReconstructDigiEvents &= Opts().Has(fles::Subsystem::TOF);
246 fbReconstructDigiEvents &= Opts().Has(fles::Subsystem::BMON);
247 }
248
249 // Tracking
250 if (Opts().Has(Step::Tracking)) {
251 if (fQaManager != nullptr && Opts().Has(QaStep::Tracking)) {
252 fTracking = std::make_unique<TrackingChain>(ECbmRecoMode::Timeslice, fQaManager, "CaTimeslice");
253 }
254 else {
255 fTracking = std::make_unique<TrackingChain>(ECbmRecoMode::Timeslice);
256 }
257 fTracking->RegisterSetup(pTrackingSetup);
258 fTracking->SetContext(&fContext);
259 fTracking->Init();
260 }
261
264
265 // BMON hit finding in event reconstruction
266 auto bmonCalSetup = yaml::ReadFromFile<bmon::CalibrateSetup>(opts.ParamsDir() / parFiles.bmon.calibrate);
267 auto bmonHitSetup = yaml::ReadFromFile<bmon::HitfindSetup>(opts.ParamsDir() / parFiles.bmon.hitfinder);
268 fBmonCalibrator = std::make_unique<bmon::Calibrate>(bmonCalSetup);
269 fBmonHitFinder = std::make_unique<bmon::Hitfind>(bmonHitSetup);
270 if (fQaManager != nullptr && Opts().Has(QaStep::RecoBmon)) {
271 fBmonHitFinderQa = std::make_unique<bmon::HitfindQa>(fQaManager, "BmonHitfindEvent");
272 fBmonHitFinderQa->InitParameters(bmonCalSetup, bmonHitSetup);
273 fBmonHitFinderQa->Init();
274 }
275
276 // Tracking in event reconstruction
277 if (fQaManager != nullptr && Opts().Has(QaStep::Tracking)) {
278 fTrackingEvent = std::make_unique<TrackingChain>(ECbmRecoMode::EventByEvent, fQaManager, "CaEvent");
279 }
280 else {
281 fTrackingEvent = std::make_unique<TrackingChain>(ECbmRecoMode::EventByEvent);
282 }
283 fTrackingEvent->RegisterSetup(pTrackingSetup);
284 fTrackingEvent->SetContext(&fContext);
285 fTrackingEvent->Init();
286
287 if (fQaManager != nullptr && Opts().Has(QaStep::V0Finder)) {
288 fV0Finder = std::make_unique<V0FinderChain>(fQaManager);
289 }
290 else {
291 fV0Finder = std::make_unique<V0FinderChain>();
292 }
293 fV0Finder->SetContext(&fContext);
294 fV0Finder->SetBmonDefinedAddresses(fBmonHitFinder->GetDiamondAddresses());
295 fV0Finder->Init();
296 }
297
298 // Initialize the QA manager
299 if (fQaManager != nullptr) {
300 fQaManager->Init();
301 }
302
303 fInitialized = true;
304
305 L_(debug) << "CBM Reco finished initialization";
306}
307
308
309RecoResults Reco::Run(const fles::Timeslice& ts)
310{
311 if (!fInitialized) {
312 throw std::runtime_error("Chain not initialized");
313 }
314
315 ProcessingMonitor procMon;
316
317 RecoResults recoData;
318 RecoResults results;
319 {
320 xpu::scoped_timer t_(fmt::format("TS {}", ts.index()), &procMon.time);
321 xpu::t_add_bytes(ts_utils::SizeBytes(ts));
322
323 L_(info) << ">>> Processing TS " << ts.index();
324 xpu::set<cbm::algo::Params>(Params());
325
326 DigiData digis;
327 AuxDigiData auxDigis;
328
329 if (Opts().Has(Step::Unpack)) {
330 xpu::scoped_timer timerU("Unpack", &procMon.timeUnpack);
331 xpu::t_add_bytes(ts_utils::SizeBytes(ts));
332
333 std::tie(digis.fBmon, auxDigis.fBmon) = RunUnpacker(fBmonUnpack, ts);
334 std::tie(digis.fMuch, auxDigis.fMuch) = RunUnpacker(fMuchUnpack, ts);
335 std::tie(digis.fRich, auxDigis.fRich) = RunUnpacker(fRichUnpack, ts);
336 std::tie(digis.fSts, auxDigis.fSts) = RunUnpacker(fStsUnpack, ts);
337 std::tie(digis.fTof, auxDigis.fTof) = RunUnpacker(fTofUnpack, ts);
338 std::tie(digis.fTrd, auxDigis.fTrd) = RunUnpacker(fTrdUnpack, ts);
339 std::tie(digis.fTrd2d, auxDigis.fTrd2d) = RunUnpacker(fTrd2dUnpack, ts);
340
341 // No unpackers for these yet
342 // digis.fPsd = RunUnpacker(fPsdUnpack, ts);
343 // digis.fFsd = RunUnpacker(fFsdUnpack, ts);
344
345 L_(info) << "TS contains Digis: STS=" << digis.fSts.size() << " MUCH=" << digis.fMuch.size()
346 << " TOF=" << digis.fTof.size() << " BMON=" << digis.fBmon.size() << " TRD=" << digis.fTrd.size()
347 << " TRD2D=" << digis.fTrd2d.size() << " RICH=" << digis.fRich.size() << " PSD=" << digis.fPsd.size()
348 << " FSD=" << digis.fFsd.size();
349 // --- Raw digi QAs
350 if (fSender != nullptr && Opts().Has(Subsystem::STS)) {
351 fStsDigiQa->RegisterDigiData(&digis.fSts);
352 fStsDigiQa->RegisterAuxDigiData(&auxDigis.fSts);
353 fStsDigiQa->SetTimesliceIndex(ts.index());
354 fStsDigiQa->Exec();
355 }
356 }
357
358
359 sts::HitfinderMon stsHitfinderMonitor;
360 if (fStsHitFinder) {
361 xpu::scoped_timer timerSTS("STS Reco", &procMon.timeSTS);
362 xpu::t_add_bytes(digis.fSts.size() * sizeof(CbmStsDigi));
363 bool storeClusters = Opts().HasOutput(RecoData::Cluster);
364 auto stsResults = (*fStsHitFinder)(digis.fSts, storeClusters);
365 stsHitfinderMonitor = std::move(stsResults.monitor);
366 recoData.stsHits = stsResults.hits;
367 recoData.stsClusters = std::move(stsResults.clusters);
368 QueueStsRecoMetrics(stsHitfinderMonitor);
369 }
370
372 if (Opts().Has(Step::LocalReco) && Opts().Has(fles::Subsystem::TOF)) {
373 xpu::scoped_timer timerTOF("TOF Reco", &procMon.timeTOF);
374 xpu::t_add_bytes(digis.fTof.size() * sizeof(CbmTofDigi));
375 auto [caldigis, calmonitor] = (*fTofCalibrator)(digis.fTof);
376 auto nUnknownRPC = calmonitor.fDigiCalibUnknownRPC;
377 if (nUnknownRPC > 0) {
378 L_(error) << "TOF Digis with unknown RPCs: " << nUnknownRPC;
379 }
380 auto [hits, hitmonitor, digiindices] = (*fTofHitFinder)(caldigis);
381 if (fTofHitFinderQa != nullptr) {
382 fTofHitFinderQa->RegisterHits(&hits);
383 fTofHitFinderQa->Exec();
384 }
385 recoData.tofHits = std::move(hits);
386 QueueTofCalibMetrics(calmonitor);
387 QueueTofRecoMetrics(hitmonitor);
388 }
389
391 if (fTrdHitfind) {
392 xpu::scoped_timer timerTRD("TRD Reco", &procMon.timeTRD);
393 xpu::t_add_bytes(digis.fTrd.size() * sizeof(CbmTrdDigi));
394 // FIXME: additional copy of digis, figure out how to pass 1d + 2d digis at once to hitfinder
395 const auto& digis1d = digis.fTrd;
396 const auto& digis2d = digis.fTrd2d;
397 PODVector<CbmTrdDigi> allDigis{};
398 allDigis.reserve(digis1d.size() + digis2d.size());
399 std::copy(digis1d.begin(), digis1d.end(), std::back_inserter(allDigis));
400 std::copy(digis2d.begin(), digis2d.end(), std::back_inserter(allDigis));
401 auto trdResults = (*fTrdHitfind)(allDigis);
402 recoData.trdHits = std::move(std::get<0>(trdResults));
403 QueueTrdRecoMetrics(std::get<1>(trdResults));
404 }
405
406 L_(info) << "TS contains Hits: STS=" << recoData.stsHits.NElements() << " TOF=" << recoData.tofHits.NElements()
407 << " TRD=" << recoData.trdHits.NElements();
408
409
410 // --- Tracking
411 TrackingChain::Output_t trackingOutput{};
412 if (Opts().Has(Step::Tracking)) {
413 xpu::scoped_timer timerCA("CA", &procMon.timeCA);
414 xpu::t_add_bytes(recoData.stsHits.NElements() * sizeof(sts::Hit));
415 xpu::t_add_bytes(recoData.tofHits.NElements() * sizeof(tof::Hit));
416 xpu::t_add_bytes(recoData.trdHits.NElements() * sizeof(trd::Hit));
418 .stsHits = recoData.stsHits,
419 .tofHits = recoData.tofHits,
420 .trdHits = recoData.trdHits,
421 };
422 trackingOutput = fTracking->Run(input);
423 recoData.tracks = std::move(trackingOutput.tracks);
424 std::sort(recoData.tracks.begin(), recoData.tracks.end(),
425 [](const cbm::algo::ca::Track& track1, const cbm::algo::ca::Track& track2) {
426 return track1.fParPV.Time() < track2.fParPV.Time();
427 });
428 QueueTrackingMetrics(trackingOutput.monitorData);
429 }
430
431 // --- Event building
432 std::vector<DigiEvent> events;
434 if (Opts().Has(Step::DigiTrigger)) {
435 auto [ev, mon] = fEventBuild->Run(digis, recoData);
436 events = std::move(ev);
437 evbuildMonitor = mon;
438 QueueEvbuildMetrics(evbuildMonitor);
439 }
440
441 // --- Reconstruct and select digi events
445 for (auto& event : events) {
447 event.fSelectionTriggers = ReconstructEvent(event);
449 }
450 auto v0FinderMonitor = fV0Finder->GetMonitor();
452 v0FinderMonitor.GetCounterValue(kfp::ECounter::KfpLambdaCandidates));
453 }
454
455 // --- Filter data for output
456 if (Opts().HasOutput(RecoData::DigiTimeslice)) {
457 results.bmonDigis = std::move(digis.fBmon);
458 results.stsDigis = std::move(digis.fSts);
459 results.muchDigis = std::move(digis.fMuch);
460 results.trd2dDigis = std::move(digis.fTrd2d);
461 results.trdDigis = std::move(digis.fTrd);
462 results.tofDigis = std::move(digis.fTof);
463 results.richDigis = std::move(digis.fRich);
464 }
465 if (Opts().HasOutput(RecoData::Track)) {
466 results.tracks = std::move(recoData.tracks);
467 results.trackStsHitIndices = std::move(trackingOutput.stsHitIndices);
468 results.trackTofHitIndices = std::move(trackingOutput.tofHitIndices);
469 }
470 if (Opts().HasOutput(RecoData::DigiEvent)) results.events = std::move(events);
471 if (Opts().HasOutput(RecoData::Cluster)) results.stsClusters = std::move(recoData.stsClusters);
472 if (Opts().HasOutput(RecoData::Hit)) {
473 results.stsHits = std::move(recoData.stsHits);
474 results.tofHits = std::move(recoData.tofHits);
475 results.trdHits = std::move(recoData.trdHits);
476 }
477
478 // QA
479 if (fSender != nullptr) {
480 (*fGeneralQa)(ts);
481
482 // Send all the histograms, collected through the timeslice
483 fQaManager->SetTimesliceId(ts.index());
484 fQaManager->SendHistograms();
485 }
486 }
487 PrintTimings(procMon.time);
488 if (prevTsId) {
489 procMon.tsDelta = ts.index() - *prevTsId;
490 }
491 prevTsId = ts.index();
492 QueueProcessingMetrics(procMon);
493
494 return results;
495}
496
498{
499 if (fStsHitFinder) {
500 fStsHitFinder->Finalize();
501 }
502 if (fTracking) {
503 L_(info) << "Track finding in a timeslice:";
504 fTracking->Finalize();
505 }
506 if (fTrackingEvent) {
507 L_(info) << "Track finding in digi events:";
508 fTrackingEvent->Finalize();
509 }
511 fV0Finder->Finalize();
513 }
514
515
516 if (Opts().Profiling() >= ProfilingSummary) {
517 L_(info) << MakeReportSubtimers("Run Summary", fTimesliceTimesAcc) << "\n"
519
520 if (Opts().TimingsFile() != "") {
521 std::ofstream file(Opts().TimingsFile().string());
523 }
524 }
525}
526
527void Reco::PrintTimings(xpu::timings& timings)
528{
529 if (Opts().CollectKernelTimes()) {
530 fTimesliceTimesAcc.merge(timings);
531 }
532
533 if (Opts().Profiling() >= ProfilingPerTS) {
534 L_(info) << MakeReportSubtimers("TS timings", timings) << "\n" << MakeReportSummary("Total", timings);
535 }
536 else {
537 L_(info) << "TS Processing time (Wall): " << timings.wall() << " ms";
538 }
539}
540
542{
543 CbmEventTriggers triggers(0);
544 RecoResults recoEvent;
545 //* BMON hit reconstruction
546 {
548 auto [calDigis, calMonitor] = (*fBmonCalibrator)(digiEvent.fBmon);
549 auto [hits, hitMonitor, digiIndices] = (*fBmonHitFinder)(calDigis);
551 if (fBmonHitFinderQa != nullptr) {
552 fBmonHitFinderQa->RegisterDigis(&calDigis);
553 fBmonHitFinderQa->RegisterHits(&hits);
554 fBmonHitFinderQa->RegisterDigiIndices(&digiIndices);
555 fBmonHitFinderQa->Exec();
556 }
557 recoEvent.bmonHits = std::move(hits);
558 }
559
560 //* STS hit reconstruction
561 {
563 auto stsResults = (*fStsHitFinder)(digiEvent.fSts);
565 if (stsResults.hits.NElements() < 4) { // TODO: Provide a config for cuts (testing mode for now)
567 return triggers;
568 }
569 recoEvent.stsHits = stsResults.hits;
570 }
571
572 //* TOF hit reconstruction
573 {
575 auto [caldigis, calmonitor] = (*fTofCalibrator)(digiEvent.fTof);
576 auto [hits, hitmonitor, digiindices] = (*fTofHitFinder)(caldigis);
578 if (hits.NElements() < 2) { // TODO: Provide a config for cuts (testing mode for now)
580 return triggers;
581 }
582 recoEvent.tofHits = std::move(hits);
583 }
584
585 //* TRD hit reconstruction
586 {
587 // FIXME: additional copy of digis, figure out how to pass 1d + 2d digis at once to hitfinder
589 const auto& digis1d = digiEvent.fTrd;
590 const auto& digis2d = digiEvent.fTrd2d;
591 PODVector<CbmTrdDigi> allDigis{};
592 allDigis.reserve(digis1d.size() + digis2d.size());
593 std::copy(digis1d.begin(), digis1d.end(), std::back_inserter(allDigis));
594 std::copy(digis2d.begin(), digis2d.end(), std::back_inserter(allDigis));
595 auto trdResults = (*fTrdHitfind)(allDigis);
597 recoEvent.trdHits = std::move(std::get<0>(trdResults));
598 }
599
600 //* Tracking
601 {
603 TrackingChain::Input_t input{.stsHits = recoEvent.stsHits,
604 .tofHits = recoEvent.tofHits,
605 .trdHits = recoEvent.trdHits};
606 TrackingChain::Output_t output = fTrackingEvent->Run(input);
607 recoEvent.tracks = std::move(output.tracks);
608 recoEvent.trackStsHitIndices = std::move(output.stsHitIndices);
609 recoEvent.trackTofHitIndices = std::move(output.tofHitIndices);
610 recoEvent.trackTrdHitIndices = std::move(output.trdHitIndices);
612 if (recoEvent.tracks.size() < 2) { // Reject all events with less then two tracks
614 return triggers;
615 }
616 }
617
618 //* V0-selector
620 triggers = fV0Finder->ProcessEvent(recoEvent);
622 L_(info) << "!!! Found event with potential lambda candidates";
624 }
626 return triggers;
627}
628
629
630template<class Unpacker>
631auto Reco::RunUnpacker(const std::unique_ptr<Unpacker>& unpacker, const fles::Timeslice& ts) -> UnpackResult_t<Unpacker>
632{
633 if (!unpacker) {
634 return {};
635 }
636 auto [digis, monitor, aux] = (*unpacker)(ts);
637 QueueUnpackerMetricsDet(monitor);
638 return std::make_tuple(digis, aux);
639}
640
641template<class MSMonitor>
643{
644 if (!HasMonitor()) {
645 return;
646 }
647
648 std::string_view det = ToString(monitor.system);
649
650 auto MkKey = [&](std::string_view key) { return fmt::format("{}{}", key, Capitalize(det)); };
651
652 GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
653 {
654 {MkKey("unpackBytesIn"), monitor.sizeBytesIn},
655 {MkKey("unpackBytesOut"), monitor.sizeBytesOut},
656 {MkKey("unpackExpansionFactor"), monitor.ExpansionFactor()},
657 {MkKey("unpackNumMs"), monitor.numMs},
658 {MkKey("unpackNumErrInvalidSysVer"), monitor.errInvalidSysVer},
659 {MkKey("unpackNumErrInvalidEqId"), monitor.errInvalidEqId},
660 });
661}
662
664{
665 if (!HasMonitor()) return;
666
667 GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
668 {
669 {"stsRecoNumClusters", (unsigned long) monitor.nClusterTotal},
670 {"stsRecoNumHits", (unsigned long) monitor.nHitsTotal},
671 {"stsRecoNumClusterBucketOverflow", monitor.nClusterBucketOverflow},
672 {"stsRecoNumHitBucketOverflow", monitor.nHitBucketOverflow},
673 });
674}
675
677{
678 if (!HasMonitor()) return;
679
680 GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
681 {
682 {"tofRecoNumDigisIn", mon.fNumDigis},
683 {"tofRecoNumHits", mon.fNumHits},
684 });
685}
686
688{
689 if (!HasMonitor()) {
690 return;
691 }
692
693 GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
694 {
695 {"trdRecoNumDigisIn", mon.numDigis},
696 {"trdRecoNumHits", mon.numHits},
697 });
698}
699
701{
702 if (!HasMonitor()) return;
703
704 GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
705 {
706 {"tofCalibTimeTotal", mon.fTime.wall()},
707 {"tofCalibThroughput", FilterNan(mon.fTime.throughput())},
708 {"tofCalibNumDigisIn", mon.fNumDigis},
709 {"tofCalibUnknownRPC", mon.fDigiCalibUnknownRPC},
710 });
711}
712
713
715{
716 if (!HasMonitor()) return;
717
718 const MetricTagSet tags = {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}};
719
720 size_t nDigisTotal = 0;
721 size_t nDigisInEventsTotal = 0;
722
723 auto queueDetMetrics = [&](std::string_view det, auto& detMon) {
724 size_t nDigis = detMon.nDigis;
725 size_t nDigisInEvents = detMon.nDigisInEvents;
726 double selectionRatio = nDigis > 0 ? double(nDigisInEvents) / nDigis : 0;
727
728 nDigisTotal += nDigis;
729 nDigisInEventsTotal += nDigisInEvents;
730
731 GetMonitor().QueueMetric("cbmreco", tags,
732 {{fmt::format("{}NumDigisTotal", det), nDigis},
733 {fmt::format("{}NumDigisInEvents", det), nDigisInEvents},
734 {fmt::format("{}EvSelectionRatio", det), selectionRatio}});
735 };
736
737 queueDetMetrics("sts", mon.evbuild.sts);
738 queueDetMetrics("much", mon.evbuild.much);
739 queueDetMetrics("tof", mon.evbuild.tof);
740 queueDetMetrics("bmon", mon.evbuild.bmon);
741 queueDetMetrics("trd", mon.evbuild.trd);
742 queueDetMetrics("trd2d", mon.evbuild.trd2d);
743 queueDetMetrics("rich", mon.evbuild.rich);
744
745 double totalSelectionRatio = nDigisTotal > 0 ? double(nDigisInEventsTotal) / nDigisTotal : 0;
746 GetMonitor().QueueMetric("cbmreco", tags,
747 {{"digiTriggerTimeTotal", mon.digiMultTrigger.time.wall()},
748 {"digiTriggerThroughput", FilterNan(mon.digiMultTrigger.time.throughput())},
749 {"hitTriggerTimeTotal", mon.hitMultTrigger.time.wall()},
750 {"hitTriggerThroughput", FilterNan(mon.hitMultTrigger.time.throughput())},
751 {"v0TriggerNumTrackPairs", mon.v0Trigger.numTrackPairs},
752 {"v0TriggerNumTrackPairsCoinc", mon.v0Trigger.numTrackPairsAfterTimeCut},
753 {"v0TriggerErrTracksUnsorted", mon.v0Trigger.errTracksUnsorted},
754 {"v0TriggerTimeTotal", mon.v0Trigger.time.wall()},
755 {"v0TriggerThroughput", FilterNan(mon.v0Trigger.time.throughput())},
756 {"eventbuildTimeTotal", mon.evbuild.time.wall()},
757 {"eventbuildThroughput", FilterNan(mon.evbuild.time.throughput())},
758 {"numTrigger", mon.evbuild.numTriggers},
759 {"numEvents", mon.evbuild.numEvents},
760 {"totalEvSelectionRatio", totalSelectionRatio}});
761}
762
764{
765 if (!HasMonitor()) {
766 return;
767 }
768
769 GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
770 {{"caTrackFinderTime", monitor.GetTimer(ca::ETimer::FindTracks).GetTotalMs()},
771 {"caTrackFitterTime", monitor.GetTimer(ca::ETimer::FitTracks).GetTotalMs()},
772 {"caNofRecoTracks", monitor.GetCounterValue(ca::ECounter::RecoTrack)},
773 {"caNofRecoHitsTotal", monitor.GetCounterValue(ca::ECounter::RecoHit)},
774 {"caNofRecoHitsUsed", monitor.GetCounterValue(ca::ECounter::RecoHitUsed)},
775 {"caNofWindows", monitor.GetCounterValue(ca::ECounter::SubTS)}});
776}
777
779{
780 if (!HasMonitor()) {
781 return;
782 }
783
784 MetricFieldSet fields = {
785 {"processingTimeTotal", mon.time.wall()}, {"processingThroughput", FilterNan(mon.time.throughput())},
786 {"caRecoTimeTotal", mon.timeCA.wall()}, {"caRecoThroughput", FilterNan(mon.timeCA.throughput())},
787 {"trdRecoTimeTotal", mon.timeTRD.wall()}, {"trdRecoThroughput", FilterNan(mon.timeTRD.throughput())},
788 {"tofRecoTimeTotal", mon.timeTOF.wall()}, {"tofRecoThroughput", FilterNan(mon.timeTOF.throughput())},
789 {"stsRecoTimeTotal", mon.timeSTS.wall()}, {"stsRecoThroughput", FilterNan(mon.timeSTS.throughput())},
790 {"unpackTimeTotal", mon.timeUnpack.wall()}, {"unpackThroughput", FilterNan(mon.timeUnpack.throughput())}};
791
792 if (mon.tsDelta) {
793 fields.emplace_back("tsDelta", *mon.tsDelta);
794 }
795
796 GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
797 std::move(fields));
798}
799
801{
802 if (!HasMonitor()) {
803 return;
804 }
805
806 MetricFieldSet fields = {{"processingTimeIdle", FilterNan(mon.timeIdle)},
807 {"processingTimeWriteArchive", mon.timeWriteArchive.wall()},
808 {"processingThroughputWriteArchive", FilterNan(mon.timeWriteArchive.throughput())},
809 {"processingBytesWritten", FilterNan(mon.bytesWritten)}};
810
811 GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
812 std::move(fields));
813}
#define L_(level)
Collection of auxiliary data from unpackers (header)
A BMON hitfinder QA.
source file for the ca::Track class
static vector< vector< QAHit > > hits
A chain for V0 finding.
This file contains the definition of the ParFiles class.
QA manager for the online data reconstruction.
QA module for STS raw digis (source)
A TOF hitfinder QA.
A chain class to execute CA tracking algorithm in online reconstruction (header)
A detector setup interface used for tracking input data initialization (source)
Calibrator for the BMON digis (implementation)
A BMON hit class.
Class to store different triggers for a given event.
@ Lambda
Lambda-trigger.
bool Test(ETrigger key) const
Tests a particular single trigger.
Data class for a single-channel message in the STS.
Definition CbmStsDigi.h:40
Data class for expanded digital TOF information.
Definition CbmTofDigi.h:47
const std::vector< RecoData > & OutputTypes() const
const std::string & MonitorUri() const
fs::path ParamsDir() const
bool ReconstructDigiEvents() const
uint64_t RunStart() const
bool CompressArchive() const
uint64_t RunId() const
fs::path OutputFile() const
bool HasOutput(RecoData recoData) const
bool CollectAuxData() const
bool Has(fles::Subsystem detector) const
const std::string & ChildId() const
A vector that is partitioned into multiple subvectors.
std::unique_ptr< tof::Hitfind > fTofHitFinder
Definition Reco.h:178
std::unique_ptr< tof::HitfindQa > fTofHitFinderQa
Definition Reco.h:179
bool fbReconstructDigiEvents
Definition Reco.h:147
ChainContext fContext
Definition Reco.h:148
std::optional< u64 > prevTsId
Definition Reco.h:153
std::unique_ptr< TrackingChain > fTrackingEvent
Tracking in event.
Definition Reco.h:191
void Init(const Options &)
Definition Reco.cxx:85
std::unique_ptr< bmon::HitfindQa > fBmonHitFinderQa
Definition Reco.h:162
std::unique_ptr< trd::Hitfind > fTrdHitfind
Definition Reco.h:184
void QueueTofRecoMetrics(const tof::HitfindMonitorData &)
Definition Reco.cxx:676
std::shared_ptr< HistogramSender > fSender
Definition Reco.h:150
std::unique_ptr< bmon::Unpack > fBmonUnpack
Definition Reco.h:159
std::unique_ptr< sts::Unpack > fStsUnpack
Definition Reco.h:171
std::unique_ptr< rich::Unpack > fRichUnpack
Definition Reco.h:168
std::unique_ptr< V0FinderChain > fV0Finder
V0-finding chain (in event or a bunch of events)
Definition Reco.h:194
void QueueTrdRecoMetrics(const trd::HitfindMonitorData &)
Definition Reco.cxx:687
std::unique_ptr< much::Unpack > fMuchUnpack
Definition Reco.h:165
CbmEventTriggers ReconstructEvent(const DigiEvent &event)
Definition Reco.cxx:541
bool fInitialized
Definition Reco.h:146
auto RunUnpacker(const std::unique_ptr< Unpacker > &, const fles::Timeslice &) -> UnpackResult_t< Unpacker >
Definition Reco.cxx:631
uint64_t fRunStartTimeNs
Definition Reco.h:151
void Finalize()
Definition Reco.cxx:497
xpu::timings fTimesliceTimesAcc
Definition Reco.h:149
evselect::Monitor fEvSelectingMonitor
Monitor for event selecting.
Definition Reco.h:197
std::unique_ptr< sts::DigiQa > fStsDigiQa
Raw STS-digis QA.
Definition Reco.h:172
std::unique_ptr< tof::Unpack > fTofUnpack
Definition Reco.h:176
void QueueProcessingMetrics(const ProcessingMonitor &)
Definition Reco.cxx:778
std::unique_ptr< qa::Manager > fQaManager
Definition Reco.h:200
static double FilterNan(double x)
Definition Reco.h:202
std::unique_ptr< bmon::Calibrate > fBmonCalibrator
Definition Reco.h:160
void QueueStsRecoMetrics(const sts::HitfinderMon &)
Definition Reco.cxx:663
std::unique_ptr< bmon::Hitfind > fBmonHitFinder
Definition Reco.h:161
std::unique_ptr< tof::Calibrate > fTofCalibrator
Definition Reco.h:177
void QueueTofCalibMetrics(const tof::CalibrateMonitorData &)
Definition Reco.cxx:700
std::unique_ptr< trd2d::Unpack > fTrd2dUnpack
Definition Reco.h:183
std::unique_ptr< qa::RecoGeneralQa > fGeneralQa
QA of online processing itself.
Definition Reco.h:156
std::unique_ptr< sts::HitfinderChain > fStsHitFinder
Definition Reco.h:173
std::unique_ptr< TrackingChain > fTracking
Tracking in timeslice.
Definition Reco.h:190
void Validate(const Options &opts)
Definition Reco.cxx:57
std::unique_ptr< trd::Unpack > fTrdUnpack
Definition Reco.h:182
std::unique_ptr< evbuild::EventbuildChain > fEventBuild
Definition Reco.h:187
RecoResults Run(const fles::Timeslice &)
Definition Reco.cxx:309
void PrintTimings(xpu::timings &)
Definition Reco.cxx:527
void QueueUnpackerMetricsDet(const UnpackMonitor< MSMonitor > &)
Definition Reco.cxx:642
void QueueTrackingMetrics(const ca::TrackingMonitorData &)
Definition Reco.cxx:763
void QueueEvbuildMetrics(const evbuild::EventbuildChainMonitorData &)
Definition Reco.cxx:714
void QueueProcessingExtraMetrics(const ProcessingExtraMonitor &)
Definition Reco.cxx:800
const RecoParams & Params() const
Definition SubChain.h:21
Monitor & GetMonitor() const
Definition SubChain.h:25
bool HasMonitor() const
Definition SubChain.h:23
void SetContext(const ChainContext *ctx)
Definition SubChain.h:18
const Options & Opts() const
Definition SubChain.h:20
int GetCounterValue(ECounterKey key) const
Gets counter value.
const Timer & GetTimer(ETimerKey key) const
Gets timer.
std::string ToString() const
Prints counters summary to string.
Definition CaMonitor.h:167
void IncrementCounter(ECounterKey key)
Increments key counter by 1.
Definition CaMonitor.h:99
void Reset()
Resets the counters.
Definition CaMonitor.h:107
void StartTimer(ETimerKey key)
Starts timer.
Definition CaMonitor.h:131
void StopTimer(ETimerKey key)
Stops timer.
Definition CaMonitor.h:135
double GetTotalMs() const
Gets total time [ms].
Definition CaTimer.h:80
Class representing an output track in the CA tracking algorithm.
Configuration of digi event building.
Provides the hardware-to-software address mapping for the CBM-RICH.
Provides the hardware-to-software address mapping for the CBM-STS.
A light-weight TRD hit class for online reconstruction, based on CbmTrdHit. .
constexpr bool WITH_ZSTD
Definition BuildInfo.h:62
@ RecoHit
number of reconstructed hits
@ RecoTrack
number of reconstructed tracks
@ SubTS
number of sub time-slices
@ RecoHitUsed
number of used reconstructed hits
@ EventsNeStsHits
Events with not enough STS hits.
@ LambdaCandidates
Number of lambda-candidates, returned by KFParticleFinder.
@ EventsTotal
Total number of events processed.
@ EventsSelected
Number of selected events.
@ EventsNeTofHits
Events with enough STS hits, but not enough TOF hits.
@ Timeslices
number of processed timeslices
@ EventsNeTracks
Events with enough hits, but not enough tracks.
@ KfpLambdaCandidates
Number of lambda-candidates.
int GetMaxThreads()
Definition OpenMP.h:46
size_t SizeBytes(const fles::Timeslice &ts)
Definition TsUtils.h:10
T ReadFromFile(fs::path path)
Definition Yaml.h:51
std::string_view ToString(T t)
Definition EnumDict.h:64
std::tuple< algo_traits::Output_t< Unpacker >, algo_traits::Aux_t< Unpacker > > UnpackResult_t
Definition Reco.h:95
std::string MakeReportSubtimers(std::string_view title, const xpu::timings &t, size_t align)
Print timings from subtimers.
std::string MakeReportYaml(const xpu::timings &t)
Print timings in YAML format.
std::vector< T, PODAllocator< T > > PODVector
PODVector is a std::vector that doesn't initialize its elements.
Definition PODVector.h:17
std::string MakeReportSummary(std::string_view title, const xpu::timings &t, size_t align)
Only print the top-level times (Elapsed time, total kernel time, memcpy and memset times)....
std::string Capitalize(std::string_view str)
Capitalize the first letter of a string. The rest of the string is made lowercase.
Definition StlUtils.cxx:9
Collection of auxiliary digi objects from different module unpackers.
Definition AuxDigiData.h:27
UnpackAux< bmon::UnpackAuxData > fBmon
Definition AuxDigiData.h:28
UnpackAux< trd2d::UnpackAuxData > fTrd2d
Definition AuxDigiData.h:34
UnpackAux< rich::UnpackAuxData > fRich
Definition AuxDigiData.h:30
UnpackAux< sts::UnpackAuxData > fSts
Definition AuxDigiData.h:31
UnpackAux< much::UnpackAuxData > fMuch
Definition AuxDigiData.h:29
UnpackAux< tof::UnpackAuxData > fTof
Definition AuxDigiData.h:32
UnpackAux< trd::UnpackAuxData > fTrd
Definition AuxDigiData.h:33
std::unique_ptr< cbm::Monitor > monitor
Collection of digis from all detector systems.
Definition DigiData.h:32
PODVector< CbmRichDigi > fRich
Unpacked RICH digis.
Definition DigiData.h:39
PODVector< CbmTrdDigi > fTrd
Unpacked TRD digis.
Definition DigiData.h:37
PODVector< CbmStsDigi > fSts
Unpacked STS digis.
Definition DigiData.h:33
PODVector< CbmTrdDigi > fTrd2d
Unpacked TRD2D digis.
Definition DigiData.h:38
PODVector< CbmFsdDigi > fFsd
Unpacked FSD digis.
Definition DigiData.h:41
PODVector< CbmTofDigi > fTof
Unpacked TOF digis.
Definition DigiData.h:35
PODVector< CbmPsdDigi > fPsd
Unpacked PSD digis.
Definition DigiData.h:40
PODVector< CbmMuchDigi > fMuch
Unpacked MUCH digis.
Definition DigiData.h:34
PODVector< CbmBmonDigi > fBmon
Unpacked Bmon digis.
Definition DigiData.h:36
Event data with event number and trigger time.
Definition DigiData.h:80
Indicates an unrecoverable error. Should tear down the process.
Definition Exceptions.h:34
Class to hold the paths to the parameter files for the different detectors.
Definition ParFiles.h:21
fs::path hitfinder
Definition ParFiles.h:30
fs::path hitfinder2d
Definition ParFiles.h:51
struct cbm::algo::ParFiles::@2 tof
struct cbm::algo::ParFiles::@0 bmon
struct cbm::algo::ParFiles::@1 sts
struct cbm::algo::ParFiles::@3 trd
fs::path calibrate
Definition ParFiles.h:29
fs::path readout2d
Definition ParFiles.h:48
fs::path chanMask
Definition ParFiles.h:35
Monitor for additional processing steps.
Definition Reco.h:120
xpu::timings timeUnpack
Definition Reco.h:108
std::optional< i64 > tsDelta
Definition Reco.h:113
struct cbm::algo::RecoParams::STS::Memory memory
ca::Vector< std::vector< HitId_t > > trackTofHitIndices
Definition RecoResults.h:51
PartitionedVector< trd::Hit > trdHits
Definition RecoResults.h:46
PODVector< CbmMuchDigi > muchDigis
Definition RecoResults.h:34
PartitionedVector< sts::Cluster > stsClusters
Definition RecoResults.h:42
ca::Vector< ca::Track > tracks
Definition RecoResults.h:49
PartitionedVector< tof::Hit > tofHits
Definition RecoResults.h:45
ca::Vector< std::vector< HitId_t > > trackTrdHitIndices
Definition RecoResults.h:52
std::vector< DigiEvent > events
Definition RecoResults.h:40
PODVector< CbmTrdDigi > trd2dDigis
Definition RecoResults.h:35
PartitionedVector< bmon::Hit > bmonHits
Definition RecoResults.h:47
PartitionedSpan< sts::Hit > stsHits
Definition RecoResults.h:44
PODVector< CbmTofDigi > tofDigis
Definition RecoResults.h:37
ca::Vector< std::vector< HitId_t > > trackStsHitIndices
Definition RecoResults.h:50
PODVector< CbmRichDigi > richDigis
Definition RecoResults.h:38
PODVector< CbmStsDigi > stsDigis
Definition RecoResults.h:33
PODVector< CbmTrdDigi > trdDigis
Definition RecoResults.h:36
PODVector< CbmBmonDigi > bmonDigis
Definition RecoResults.h:32
Input to the TrackingChain.
Output from the TrackingChain.
ca::Vector< ca::Track > tracks
Reconstructed tracks.
ca::Vector< std::vector< std::pair< uint32_t, uint32_t > > > trdHitIndices
TRD hit indices.
ca::Vector< std::vector< std::pair< uint32_t, uint32_t > > > tofHitIndices
TOF hit indices.
ca::Vector< std::vector< std::pair< uint32_t, uint32_t > > > stsHitIndices
STS hit indices.
Readout setup / Hardware cabling for BMon Used to create the hardware mapping for the BMon unpacker.
size_t numTriggers
Number of input triggers.
EventBuilderDetectorMonitorData much
Monitoring data for MUCH.
EventBuilderDetectorMonitorData rich
Monitoring data for RICH.
size_t numEvents
Number of built and selected events.
EventBuilderDetectorMonitorData sts
Monitoring data for STS.
EventBuilderDetectorMonitorData tof
Monitoring data for TOF.
EventBuilderDetectorMonitorData bmon
Monitoring data for Bmon.
EventBuilderDetectorMonitorData trd2d
Monitoring data for TRD2D.
xpu::timings time
Time for event building.
EventBuilderDetectorMonitorData trd
Monitoring data for TRD.
TimeClusterTriggerMonitorData hitMultTrigger
TimeClusterTriggerMonitorData digiMultTrigger
xpu::timings time
Time for trigger building.
xpu::timings time
Time for trigger building.
Definition V0Trigger.h:30
RecoParams::STS::Memory memory
static LandauTable FromFile(fs::path path)
Readout setup / Hardware cabling for STS Used to create the hardware mapping for the STS unpacker.
Monitoring data for calibration.
Monitoring data for hitfinding.
Definition tof/Hitfind.h:30
Readout setup / Hardware cabling for TOF Used to create the hardware mapping for the TOF unpacker.
Monitoring data for hitfinding.
Definition trd/Hitfind.h:36