CbmRoot
Loading...
Searching...
No Matches
_GTestDigiEventSelector.cxx
Go to the documentation of this file.
1/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Dominik Smith [committer] */
4
5#include "DigiEventSelector.h"
7#include "MicrosliceDescriptor.hpp"
8#include "gtest/gtest-spi.h"
9#include "gtest/gtest.h"
10
11#include <unordered_set>
12
13#include <yaml-cpp/yaml.h>
14
15using namespace cbm::algo;
16
17TEST(_GTestDigiEventSelector, CheckDigiEventSelectorAlgorithmSimple)
18{
19 SCOPED_TRACE("CheckDigiEventSelectorAlgorithSimple");
20
21
22 // --- Test number of digis per system
23 size_t nBmon = 1;
24 size_t nSts = 2;
25 size_t nMuch = 3;
26 size_t nRich = 4;
27 size_t nTrd = 5;
28 size_t nTrd2d = 6;
29 size_t nTof = 7;
30 size_t nPsd = 8;
31 size_t nFsd = 9;
32
33 DigiEvent event;
34 for (size_t i = 0; i < nBmon; i++)
35 event.fBmon.push_back(CbmBmonDigi());
36 for (size_t i = 0; i < nSts; i++)
37 event.fSts.push_back(CbmStsDigi());
38 for (size_t i = 0; i < nMuch; i++)
39 event.fMuch.push_back(CbmMuchDigi());
40 for (size_t i = 0; i < nRich; i++)
41 event.fRich.push_back(CbmRichDigi());
42 for (size_t i = 0; i < nTrd; i++)
43 event.fTrd.push_back(CbmTrdDigi());
44 for (size_t i = 0; i < nTrd2d; i++)
45 event.fTrd2d.push_back(CbmTrdDigi());
46 for (size_t i = 0; i < nTof; i++)
47 event.fTof.push_back(CbmTofDigi());
48 for (size_t i = 0; i < nPsd; i++)
49 event.fPsd.push_back(CbmPsdDigi());
50 for (size_t i = 0; i < nFsd; i++)
51 event.fFsd.push_back(CbmFsdDigi());
52
53 // Tracking setup
54 auto trackingSetup = std::make_shared<cbm::algo::TrackingSetup>();
55 trackingSetup->Use(fles::Subsystem::TOF); // Init TOF withot a context
56 trackingSetup->Init();
57
58
59 YAML::Node node;
60 node["minDigis"][ToString(ECbmModuleId::kBmon)] = nBmon;
61 node["minDigis"][ToString(ECbmModuleId::kSts)] = nSts;
62 node["minDigis"][ToString(ECbmModuleId::kMuch)] = nMuch;
63 node["minDigis"][ToString(ECbmModuleId::kRich)] = nRich;
64 node["minDigis"][ToString(ECbmModuleId::kTrd)] = nTrd;
65 node["minDigis"][ToString(ECbmModuleId::kTrd2d)] = nTrd2d;
66 node["minDigis"][ToString(ECbmModuleId::kTof)] = nTof;
67 node["minDigis"][ToString(ECbmModuleId::kPsd)] = nPsd;
68 node["minDigis"][ToString(ECbmModuleId::kFsd)] = nFsd;
69
70 {
71 // --- Check with created numbers of digis - should pass
74 select.RegisterTrackingSetup(trackingSetup);
75 EXPECT_EQ(select(event), true);
76 }
77
78 {
79 // --- Increment Bmon - should fail
80 node["minDigis"][ToString(ECbmModuleId::kBmon)] = nBmon + 1;
83 select.RegisterTrackingSetup(trackingSetup);
84 EXPECT_EQ(select(event), false);
85 }
86
87 {
88 // --- Increment STS - should fail
89 node["minDigis"][ToString(ECbmModuleId::kSts)] = nSts + 1;
92 select.RegisterTrackingSetup(trackingSetup);
93 EXPECT_EQ(select(event), false);
94 }
95
96 {
97 // --- Increment MUCH - should fail
98 node["minDigis"][ToString(ECbmModuleId::kMuch)] = nMuch + 1;
101 select.RegisterTrackingSetup(trackingSetup);
102 EXPECT_EQ(select(event), false);
103 }
104
105 {
106 // --- Increment RICH - should fail
107 node["minDigis"][ToString(ECbmModuleId::kRich)] = nRich + 1;
110 select.RegisterTrackingSetup(trackingSetup);
111 EXPECT_EQ(select(event), false);
112 }
113
114 {
115 // --- Increment TRD - should fail
116 node["minDigis"][ToString(ECbmModuleId::kTrd)] = nTrd + 1;
119 select.RegisterTrackingSetup(trackingSetup);
120 EXPECT_EQ(select(event), false);
121 }
122
123 {
124 // --- Increment TRD2D - should fail
125 node["minDigis"][ToString(ECbmModuleId::kTrd2d)] = nTrd2d + 1;
128 select.RegisterTrackingSetup(trackingSetup);
129 EXPECT_EQ(select(event), false);
130 }
131
132 {
133 // --- Increment TOF - should fail
134 node["minDigis"][ToString(ECbmModuleId::kTof)] = nTof + 1;
137 select.RegisterTrackingSetup(trackingSetup);
138 EXPECT_EQ(select(event), false);
139 }
140
141 {
142 // --- Increment PSD - should fail
143 node["minDigis"][ToString(ECbmModuleId::kPsd)] = nPsd + 1;
146 select.RegisterTrackingSetup(trackingSetup);
147 EXPECT_EQ(select(event), false);
148 }
149
150 {
151 // --- Increment FSD - should fail
152 node["minDigis"][ToString(ECbmModuleId::kFsd)] = nFsd + 1;
155 select.RegisterTrackingSetup(trackingSetup);
156 EXPECT_EQ(select(event), false);
157 }
158
159 {
160 // --- Test number of STS stations
161 {
162 const uint maxStsStations = 8;
163 const uint maxStsModules = 12;
164 const uint maxStsLadders = 4;
165
166 for (uint numStations = 1; numStations < maxStsStations; numStations++) {
167 //Prepare input
168 DigiEvent eventIn;
169 //Produce digi pairs with valid addresses
170 for (uint station = 0; station < numStations; station++) {
171 for (uint module = 0; module < maxStsModules; module++) {
172 for (uint ladder = 0; ladder < maxStsLadders; ladder++) {
173 for (uint halfladder = 0; halfladder <= 1; halfladder++) {
174 //add digis pairs
175 int32_t address = CbmStsAddress::GetAddress(station, ladder, halfladder, module);
176 eventIn.fSts.push_back(CbmStsDigi(address, 0, 0.0, 0.0));
177 eventIn.fSts.push_back(CbmStsDigi(address, 1024, 0.0, 0.0)); //other side channel
178
179 //add digis from next station without partner for intentionally failed test
180 int32_t nextAddress = CbmStsAddress::GetAddress(numStations, ladder, 0, module);
181 eventIn.fSts.push_back(CbmStsDigi(nextAddress, 1024, 0.0, 0.0));
182 }
183 }
184 }
185 }
186
187 YAML::Node node2;
188 //L_(info) << "tof min layers: " << numStations;
189 { // Test correct number of stations - should pass
190 node2["minLayers"][ToString(ECbmModuleId::kSts)] = numStations;
193 select.RegisterTrackingSetup(trackingSetup);
194 EXPECT_EQ(select(eventIn), true);
195 }
196
197 {
198 // Test if digi without partner is properly disregarded
199 node2["minLayers"][ToString(ECbmModuleId::kSts)] = numStations + 1;
202 select.RegisterTrackingSetup(trackingSetup);
203 EXPECT_EQ(select(eventIn), false);
204 }
205 }
206 }
207
208
209 // --- Test number of TOF layers
210 {
211 //Prepare input
212 DigiEvent eventIn;
213
214 const uint8_t numSmTypes = 10;
215 const uint8_t numSm[numSmTypes] = {5, 0, 1, 0, 0, 1, 1, 1, 0, 1};
216 const uint8_t numRpc[numSmTypes] = {5, 3, 5, 1, 1, 1, 2, 2, 1, 2};
217 std::vector<std::vector<int>> trkStationId = {
218 {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3},
219 {},
220 {2, 2, 2, 2, 2},
221 {},
222 {},
223 {0},
224 {1, 1},
225 {1, 1},
226 {},
227 {2, 2}};
228 std::unordered_set<int32_t> setTofStation;
229
230 for (uint smType = 0; smType < numSmTypes; smType++) {
231 for (uint sm = 0; sm < numSm[smType]; sm++) {
232 for (uint rpc = 0; rpc < numRpc[smType]; rpc++) {
233
234 uint32_t addrFront = CbmTofAddress::GetUniqueAddress(sm, rpc, 0, 0, smType, 0);
235 uint32_t addrBack = CbmTofAddress::GetUniqueAddress(sm, rpc, 0, 1, smType, 0);
236 eventIn.fTof.push_back(CbmTofDigi(addrFront, 0.0, 0.0));
237 eventIn.fTof.push_back(CbmTofDigi(addrBack, 0.0, 0.0));
238
239 int32_t TofStationId = -1;
240 if (smType < numSmTypes) {
241 if (sm < numSm[smType] && rpc < numRpc[smType]) {
242 TofStationId = trkStationId[smType][sm * numRpc[smType] + rpc];
243 }
244 }
245 setTofStation.insert(TofStationId);
246
247 YAML::Node node2;
248
249 { // Test actual number of layers -- should pass
250 node2["minLayers"][ToString(ECbmModuleId::kTof)] = setTofStation.size();
253 select.RegisterTrackingSetup(trackingSetup);
254 EXPECT_EQ(select(eventIn), true);
255 }
256
257 { // Test with one more station - should fail
258 node2["minLayers"][ToString(ECbmModuleId::kTof)] = setTofStation.size() + 1;
261 select.RegisterTrackingSetup(trackingSetup);
262 EXPECT_EQ(select(eventIn), false);
263 }
264 }
265 }
266 }
267 }
268 }
269}
@ kTrd
Transition Radiation Detector.
@ kTof
Time-of-flight Detector.
@ kPsd
Projectile spectator detector.
@ kSts
Silicon Tracking System.
@ kTrd2d
TRD-FASP Detector (FIXME)
@ kMuch
Muon detection system.
@ kFsd
Forward spectator detector.
@ kRich
Ring-Imaging Cherenkov Detector.
TEST(_GTestDigiEventSelector, CheckDigiEventSelectorAlgorithmSimple)
Data class for a signal in the t-zero detector.
Definition CbmBmonDigi.h:30
Data class for FSD digital information.
Definition CbmFsdDigi.h:36
Data class for PSD digital information.
Definition CbmPsdDigi.h:36
Data class for a single-channel message in the STS.
Definition CbmStsDigi.h:40
static uint32_t GetUniqueAddress(uint32_t Sm, uint32_t Rpc, uint32_t Channel, uint32_t Side=0, uint32_t SmType=0, uint32_t RpcType=0)
Data class for expanded digital TOF information.
Definition CbmTofDigi.h:47
Configuration of the DigiEventSelector class.
Algorithm to select CbmDigiEvents based on the number of digis and the number of activated layers in ...
void RegisterTrackingSetup(std::shared_ptr< TrackingSetup > pSetup)
Registers tracking setup.
int32_t GetAddress(uint32_t unit=0, uint32_t ladder=0, uint32_t halfladder=0, uint32_t module=0, uint32_t sensor=0, uint32_t side=0, uint32_t version=kCurrentVersion)
Construct address.
std::string_view ToString(T t)
Definition EnumDict.h:64
PODVector< CbmRichDigi > fRich
Unpacked RICH digis.
Definition DigiData.h:38
PODVector< CbmTrdDigi > fTrd
Unpacked TRD digis.
Definition DigiData.h:36
PODVector< CbmStsDigi > fSts
Unpacked STS digis.
Definition DigiData.h:32
PODVector< CbmTrdDigi > fTrd2d
Unpacked TRD2D digis.
Definition DigiData.h:37
PODVector< CbmFsdDigi > fFsd
Unpacked FSD digis.
Definition DigiData.h:40
PODVector< CbmTofDigi > fTof
Unpacked TOF digis.
Definition DigiData.h:34
PODVector< CbmPsdDigi > fPsd
Unpacked PSD digis.
Definition DigiData.h:39
PODVector< CbmMuchDigi > fMuch
Unpacked MUCH digis.
Definition DigiData.h:33
PODVector< CbmBmonDigi > fBmon
Unpacked Bmon digis.
Definition DigiData.h:35
Event data with event number and trigger time.
Definition DigiData.h:79