CbmRoot
Loading...
Searching...
No Matches
EventBuilder.cxx
Go to the documentation of this file.
1/* Copyright (C) 2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Volker Friese [committer] */
4
6
7#include <cassert>
8#include <iomanip>
9
10#include <xpu/host.h>
11
12using std::is_sorted;
13using std::vector;
14
15namespace cbm::algo::evbuild
16{
17
18 // ----- Algorithm execution --------------------------------------------
20 std::optional<DigiEventSelector> selector) const
21 {
22 xpu::push_timer("EventBuilder");
23 xpu::t_add_bytes(ts.TotalSizeBytes());
24
25 // --- Output data
26 resultType result = {};
27 auto& events = result.first;
28 events.resize(triggers.size());
29
30 std::transform(triggers.begin(), triggers.end(), events.begin(),
31 [&ts, &result, this](const double& trigger) { return BuildEvent(ts, result.second, trigger); });
32
33 // --- Apply event selector
34 if (selector.has_value()) {
35 auto notSelected = [&](DigiEvent& ev) { return !((*selector)(ev)); };
36 auto removeIt = std::remove_if(events.begin(), events.end(), notSelected);
37 events.erase(removeIt, events.end());
38 }
39
40 EventBuilderMonitorData& monitor = result.second;
41
42 monitor.mvd.nDigis += ts.fMvd.size();
43 monitor.sts.nDigis += ts.fSts.size();
44 monitor.rich.nDigis += ts.fRich.size();
45 monitor.much.nDigis += ts.fMuch.size();
46 monitor.trd.nDigis += ts.fTrd.size();
47 monitor.trd2d.nDigis += ts.fTrd2d.size();
48 monitor.tof.nDigis += ts.fTof.size();
49 monitor.psd.nDigis += ts.fPsd.size();
50 monitor.fsd.nDigis += ts.fFsd.size();
51 monitor.bmon.nDigis += ts.fBmon.size();
52 monitor.numTriggers += triggers.size();
53 monitor.numEvents += result.first.size();
54
55 monitor.time = xpu::pop_timer();
56 return result;
57 }
58
59 // --- Build a single event
60 DigiEvent EventBuilder::BuildEvent(const DigiData& ts, EventBuilderMonitorData& monitor, double trigger) const
61 {
62 DigiEvent event;
63 event.fTime = trigger;
64
65 // --- Loop over systems
66 for (auto entry : fConfig.fWindows) {
67
68 auto system = entry.first;
69 const double tMin = trigger + entry.second.first;
70 const double tMax = trigger + entry.second.second;
71
72 // --- Build the event using trigger window
73 switch (system) {
74 case ECbmModuleId::kMvd: {
75 event.fMvd = CopyRange(ts.fMvd, tMin, tMax);
76 break;
77 }
78 case ECbmModuleId::kSts: {
79 event.fSts = CopyRange(ts.fSts, tMin, tMax);
80 break;
81 }
83 event.fRich = CopyRange(ts.fRich, tMin, tMax);
84 break;
85 }
87 event.fMuch = CopyRange(ts.fMuch, tMin, tMax);
88 break;
89 }
90 case ECbmModuleId::kTrd: {
91 event.fTrd = CopyRange(ts.fTrd, tMin, tMax);
92 break;
93 }
95 event.fTrd2d = CopyRange(ts.fTrd2d, tMin, tMax);
96 break;
97 }
98 case ECbmModuleId::kTof: {
99 event.fTof = CopyRange(ts.fTof, tMin, tMax);
100 break;
101 }
102 case ECbmModuleId::kPsd: {
103 event.fPsd = CopyRange(ts.fPsd, tMin, tMax);
104 break;
105 }
106 case ECbmModuleId::kFsd: {
107 event.fFsd = CopyRange(ts.fFsd, tMin, tMax);
108 break;
109 }
110 case ECbmModuleId::kBmon: {
111 event.fBmon = CopyRange(ts.fBmon, tMin, tMax);
112 break;
113 }
114 default: break;
115 }
116 }
117 monitor.mvd.nDigisInEvents += event.fMvd.size();
118 monitor.sts.nDigisInEvents += event.fSts.size();
119 monitor.rich.nDigisInEvents += event.fRich.size();
120 monitor.much.nDigisInEvents += event.fMuch.size();
121 monitor.trd.nDigisInEvents += event.fTrd.size();
122 monitor.trd2d.nDigisInEvents += event.fTrd2d.size();
123 monitor.tof.nDigisInEvents += event.fTof.size();
124 monitor.psd.nDigisInEvents += event.fPsd.size();
125 monitor.fsd.nDigisInEvents += event.fFsd.size();
126 monitor.bmon.nDigisInEvents += event.fBmon.size();
127 return event;
128 }
129 // --------------------------------------------------------------------------
130
131
132 // ----- Info to string -------------------------------------------------
133 std::string EventBuilder::ToString() const
134 {
135 std::stringstream out;
136 out << "--- Using EventBuilder with event windows:";
137 for (const auto& entry : fConfig.fWindows) {
138 out << "\n " << std::left << std::setw(5) << entry.first << ": ";
139 out << " [" << std::right << std::setw(5) << entry.second.first;
140 out << ", " << std::right << std::setw(5) << entry.second.second << "] ns";
141 }
142 return out.str();
143 }
144 // --------------------------------------------------------------------------
145
146} // namespace cbm::algo::evbuild
@ kMvd
Micro-Vertex Detector.
Definition CbmDefs.h:47
@ kTrd
Transition Radiation Detector.
Definition CbmDefs.h:51
@ kTof
Time-of-flight Detector.
Definition CbmDefs.h:52
@ kPsd
Projectile spectator detector.
Definition CbmDefs.h:54
@ kSts
Silicon Tracking System.
Definition CbmDefs.h:48
@ kTrd2d
TRD-FASP Detector (FIXME)
Definition CbmDefs.h:58
@ kMuch
Muon detection system.
Definition CbmDefs.h:50
@ kFsd
Forward spectator detector.
Definition CbmDefs.h:59
@ kBmon
Bmon Counter.
Definition CbmDefs.h:57
@ kRich
Ring-Imaging Cherenkov Detector.
Definition CbmDefs.h:49
DigiEvent BuildEvent(const DigiData &ts, EventBuilderMonitorData &monitor, double trigger) const
Build a single event from a trigger time.
std::pair< std::vector< DigiEvent >, EventBuilderMonitorData > resultType
EventBuilderConfig fConfig
Configuration / parameters.
resultType operator()(const DigiData &ts, const std::vector< double > triggers, std::optional< DigiEventSelector > selector) const
Execution.
static Vector CopyRange(const Vector &source, double tMin, double tMax)
Copy data objects in a given time interval from the source to the target vector.
std::string ToString() const
Info to string.
Collection of digis from all detector systems.
Definition DigiData.h:33
PODVector< CbmRichDigi > fRich
Unpacked RICH digis.
Definition DigiData.h:41
PODVector< CbmTrdDigi > fTrd
Unpacked TRD digis.
Definition DigiData.h:39
PODVector< CbmStsDigi > fSts
Unpacked STS digis.
Definition DigiData.h:34
PODVector< CbmTrdDigi > fTrd2d
Unpacked TRD2D digis.
Definition DigiData.h:40
PODVector< CbmFsdDigi > fFsd
Unpacked FSD digis.
Definition DigiData.h:43
PODVector< CbmTofDigi > fTof
Unpacked TOF digis.
Definition DigiData.h:37
PODVector< CbmMvdRawDigi > fMvd
Unpacked MVD digis.
Definition DigiData.h:36
PODVector< CbmPsdDigi > fPsd
Unpacked PSD digis.
Definition DigiData.h:42
PODVector< CbmMuchDigi > fMuch
Unpacked MUCH digis.
Definition DigiData.h:35
PODVector< CbmBmonDigi > fBmon
Unpacked Bmon digis.
Definition DigiData.h:38
size_t TotalSizeBytes() const
Get the total number of bytes used by all digis.
Definition DigiData.cxx:52
Event data with event number and trigger time.
Definition DigiData.h:82
double fTime
Event trigger time [ns].
Definition DigiData.h:85
size_t nDigisInEvents
Number of digis collected into events.
size_t nDigis
Full number of digis in input source.
Monitoring data for event building.
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 mvd
Monitoring data for MVD.
EventBuilderDetectorMonitorData bmon
Monitoring data for Bmon.
EventBuilderDetectorMonitorData trd2d
Monitoring data for TRD2D.
xpu::timings time
Time for event building.
EventBuilderDetectorMonitorData fsd
Monitoring data for FSD.
EventBuilderDetectorMonitorData trd
Monitoring data for TRD.
EventBuilderDetectorMonitorData psd
Monitoring data for PSD.