Belle II Software development
KLMTriggerModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <trg/klm/modules/klmtrigger/KLMTriggerModule.h>
10
11
12#include "trg/klm/modules/klmtrigger/KLMAxis.h"
13
14#include "trg/klm/modules/klmtrigger/klmtrgLayerCounter.h"
15#include <trg/klm/modules/klmtrigger/klmtrgLinearFit.h>
16
17#include <trg/klm/modules/klmtrigger/IO_csv.h>
18
19
20#include <klm/bklm/geometry/GeometryPar.h>
21// framework - DataStore
22#include <framework/datastore/StoreArray.h>
23#include <framework/datastore/StoreObjPtr.h>
24
25// event data
26#include <framework/dataobjects/EventMetaData.h>
27
28// digits
29#include <klm/dataobjects/KLMDigit.h>
30
31
32#include <trg/klm/dataobjects/KLMTrgSummary.h>
33#include <trg/klm/dataobjects/KLMTrgFittedTrack.h>
34
35
36
37
38
39
40#include <trg/klm/dbobjects/KLMTriggerParameters.h>
41#include <framework/database/DBObjPtr.h>
42
43
44#include <unordered_map>
45#include <algorithm>
46#include <numeric>
47#include <vector>
48#include <tuple>
49#include <iostream>
50
51//#include <trg/klm/modules/klmtrigger/geometry.h>
52
53
54using namespace std;
55using namespace Belle2;
56
57
58
59
60
61
62
63
64
65using namespace Belle2;
66using namespace Belle2::KLM_TRG_definitions;
67
68
69
70// part of unused old Trigger collection
71const std::string m_klmtrackCollectionName = "TRGKLMTracks";
72const std::string m_klmhitCollectionName = "TRGKLMHits";
73// end
74
75
76
77
78
79
80//-----------------------------------------------------------------
81// Register the Module
82//-----------------------------------------------------------------
83REG_MODULE(KLMTrigger);
84
85//-----------------------------------------------------------------
86// Implementation
87//-----------------------------------------------------------------
88
89
90vector<string> split(const string& str, const string& delim)
91{
92 vector<string> tokens;
93 size_t prev = 0, pos = 0;
94 do {
95 pos = str.find(delim, prev);
96 if (pos == string::npos) pos = str.length();
97 string token = str.substr(prev, pos - prev);
98 if (!token.empty()) tokens.push_back(token);
99 prev = pos + delim.length();
100 } while (pos < str.length() && prev < str.length());
101 return tokens;
102}
103
104std::vector<int> layer_string_list_to_integer_range(const std::string& instr)
105{
106 std::vector<int> ret;
107 auto str_spl = split(instr, ":");
108
109 int start = std::stoi(str_spl[0]);
110 int stop = std::stoi(str_spl[1]);
111 for (int i = start; i < stop ; ++i) {
112 ret.push_back(i);
113 }
114
115 return ret;
116}
117std::vector<int> layer_string_list_to_integer_list(const std::string& instr)
118{
119 std::vector<int> ret;
120 auto str_spl = split(instr, ",");
121
122 for (const auto& e : str_spl) {
123 ret.push_back(std::stoi(e));
124 }
125
126 return ret;
127}
128std::vector<int> layer_string_list_to_integer(const std::string& instr)
129{
130 if (instr.find(":") != string::npos) {
131 return layer_string_list_to_integer_range(instr);
132 }
133 if (instr.find(",") != string::npos) {
134 return layer_string_list_to_integer_list(instr);
135 }
136 std::vector<int> ret;
137 return ret;
138}
139KLMTriggerModule::KLMTriggerModule() : Module()
140{
141 setDescription("KLM trigger simulation");
142 setPropertyFlags(c_ParallelProcessingCertified);
143
144 addParam("y_cutoff", y_cutoff, "", 500);
145 addParam("intercept_cutoff", m_intercept_cutoff, "", 500);
146 addParam("CSV_Dump_Path", m_dump_Path, "", m_dump_Path);
147
148}
149
150
151
152
153
154
155
156
157
158
159
160
161
163{
164 m_event_nr = 0;
165 StoreArray<KLMDigit> klmDigits;
166 klmDigits.isRequired();
167 if (!klmDigits.isValid())
168 return;
169
172
173
174
175 StoreArray<KLMTrgFittedTrack> KLMTrgFittedTrack_("KLMTrgFittedTrack");
177
178
179
180 if (!m_dump_Path.empty()) {
181 get_IO_csv_handle().dump_path = m_dump_Path;
182 get_IO_csv_handle().do_dump = true;
183 }
184
185}
186
188{
189 StoreObjPtr<EventMetaData> evtMetaData;
191 B2DEBUG(100, "KLMTrigger: Experiment " << evtMetaData->getExperiment() << ", run " << evtMetaData->getRun());
192 if (not KLMTriggerParameters.isValid())
193 B2FATAL("KLM trigger parameters are not available.");
194
195 try {
196 m_layerUsed = layer_string_list_to_integer(KLMTriggerParameters->getWhichLayers());
197 B2DEBUG(20, "KLMTrigger: m_layerUsed " << KLMTriggerParameters->getWhichLayers());
198 for (auto e : m_layerUsed) {
199 B2DEBUG(20, "KLMTrigger: layer " << e << " used.");
200 }
201 } catch (const std::exception& e) {
202 B2FATAL("Something went wrong when parsing the 'm_whichLayers' string"
204 << LogVar("exception", e.what()));
205 }
206 try {
207 m_klmtrg_layer_counter = std::make_shared< Belle2::klmtrgLayerCounter>();
208 m_klm_trig_linear_fit = std::make_shared< Belle2::klmtrgLinearFit>();
209 m_klm_trig_linear_fit->set_y_cutoff(y_cutoff);
210 m_klm_trig_linear_fit->set_intercept_cutoff(m_intercept_cutoff);
211
212
213 m_klmtrg_layer_counter->set_NLayerTrigger(KLMTriggerParameters->getNLayers());
214
215 for (auto e : m_layerUsed) {
216 m_klmtrg_layer_counter->add_layersUsed(e);
217 }
218
219
221
222
223 for (size_t i = 0 ; i < KLMTriggerParameters->getGeometryDataSize() ; ++i) {
224 e.subdetector = KLMTriggerParameters->getSubdetector(i);
225 e.section = KLMTriggerParameters->getSection(i);
226 e.sector = KLMTriggerParameters->getSector(i);
227 e.layer = KLMTriggerParameters->getLayer(i);
228 e.plane = KLMTriggerParameters->getPlane(i);
229 e.slopeX.v = KLMTriggerParameters->getSlopeX(i);
230 e.offsetX.v = KLMTriggerParameters->getOffsetX(i);
231 e.slopeY.v = KLMTriggerParameters->getSlopeY(i);
232 e.offsetY.v = KLMTriggerParameters->getOffsetY(i);
233 m_klm_trig_linear_fit->add_geometry(e);
234
235 }
236
237
238
239 } catch (const std::exception& er) {
240 B2FATAL(er.what());
241 }
242
243}
244
245
247{
248
249
250}
251
252
253
254
255
256
257
258
259
260template <typename T1, typename T2>
261auto push_linear_fit_to_KLMTrgFittedTrack(T1&& linear_fited, T2& KLMTrgFittedTrack_)
262{
263 for (const auto& e : linear_fited) {
264 //if (e.slopeXY >= 1e100) { continue; }
265 auto FittedTrack = KLMTrgFittedTrack_.appendNew();
266 FittedTrack->setSlopeXY(e.slopeXY) ;
267 FittedTrack->setInterceptXY(e.interceptXY);
268 FittedTrack->setIpXY(e.ipXY) ;
269 FittedTrack->setPlane(e.plane);
270 FittedTrack->setChisqXY(e.chisqXY);
271 FittedTrack->setSubdetector(e.subdetector);
272 FittedTrack->setSection(e.section);
273 FittedTrack->setSector(e.sector);
274 FittedTrack->setNhits(e.Nhits);
275 FittedTrack->setTrack_id(e.track_id);
276
277 }
278
279}
280
281
282
283
284template <typename T1, typename T2, typename T3>
285auto push_KLMSummary(T1&& m_klmtrg_layer_counter, T2&& m_klm_trig_linear_fit, T3& KLMTrgSummary)
286{
287
288 KLMTrgSummary->setBKLM_back_to_back_flag(
289 m_klmtrg_layer_counter->get_BKLM_back_to_back_flag(KLMElementNumbers::c_BKLM)
290 );
291
292 KLMTrgSummary->setEKLM_back_to_back_flag(
293 m_klmtrg_layer_counter->get_BKLM_back_to_back_flag(KLMElementNumbers::c_EKLM)
294 );
295
296 KLMTrgSummary->setBKLM_n_trg_sectors(
297 m_klmtrg_layer_counter->get_n_sections_trig(KLMElementNumbers::c_BKLM)
298 );
299 KLMTrgSummary->setEKLM_n_trg_sectors(
300 m_klmtrg_layer_counter->get_n_sections_trig(KLMElementNumbers::c_EKLM)
301 );
302 KLMTrgSummary->setSector_mask_Backward_Barrel(
303 m_klmtrg_layer_counter->get_triggermask(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_BackwardSection)
304 );
305
306 KLMTrgSummary->setSector_mask_Forward_Barrel(
307 m_klmtrg_layer_counter->get_triggermask(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_ForwardSection)
308 );
309 KLMTrgSummary->setSector_mask_Backward_Endcap(
310 m_klmtrg_layer_counter->get_triggermask(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_BackwardSection)
311 );
312
313 KLMTrgSummary->setSector_mask_Forward_Endcap(
314 m_klmtrg_layer_counter->get_triggermask(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_ForwardSection)
315 );
316
317
318
319
320
321
322
323 KLMTrgSummary->setSector_mask_SLF_Backward_Barrel(
324 m_klm_trig_linear_fit->get_triggermask(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_BackwardSection)
325 );
326
327 KLMTrgSummary->setSector_mask_SLF_Forward_Barrel(
328 m_klm_trig_linear_fit->get_triggermask(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_ForwardSection)
329 );
330 KLMTrgSummary->setSector_mask_SLF_Backward_Endcap(
331 m_klm_trig_linear_fit->get_triggermask(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_BackwardSection)
332 );
333
334 KLMTrgSummary->setSector_mask_SLF_Forward_Endcap(
335 m_klm_trig_linear_fit->get_triggermask(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_ForwardSection)
336 );
337
338
339 KLMTrgSummary->setSector_mask_SLF_OR_Backward_Barrel(
340 m_klm_trig_linear_fit->get_triggermask_or(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_BackwardSection)
341 );
342
343 KLMTrgSummary->setSector_mask_SLF_OR_Forward_Barrel(
344 m_klm_trig_linear_fit->get_triggermask_or(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_ForwardSection)
345 );
346 KLMTrgSummary->setSector_mask_SLF_OR_Backward_Endcap(
347 m_klm_trig_linear_fit->get_triggermask_or(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_BackwardSection)
348 );
349
350 KLMTrgSummary->setSector_mask_SLF_OR_Forward_Endcap(
351 m_klm_trig_linear_fit->get_triggermask_or(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_ForwardSection)
352 );
353
354
355}
356
357
359{
360
361 try {
362 ++m_event_nr;
363 StoreArray<KLMDigit> klmDigits;
364 StoreArray<KLMTrgFittedTrack> KLMTrgFittedTrack_("KLMTrgFittedTrack");
366 KLMTrgSummary.create();
367
368
369 get_IO_csv_handle().event_nr = m_event_nr;
371 auto hits = nt::algorithms::fill_vector(klmDigits.getEntries(),
372 [&](auto Index) {
373 const auto& digit = klmDigits[Index];
374
375
376 dummy.event_nr = m_event_nr;
377 dummy.subdetector = digit->getSubdetector();
378 dummy.section = digit->getSection();
379 dummy.sector = digit->getSector() - 1;
380 dummy.plane = digit->getPlane();
381 dummy.layer = digit->getLayer();
382 dummy.strip = digit->getStrip();
383 return dummy;
384
385 });
386
387 m_klmtrg_layer_counter->run(hits);
388 m_klm_trig_linear_fit->run(hits);
389
390
391 push_linear_fit_to_KLMTrgFittedTrack(m_klm_trig_linear_fit->get_result(), KLMTrgFittedTrack_);
392
393 push_KLMSummary(m_klmtrg_layer_counter, m_klm_trig_linear_fit, KLMTrgSummary);
394
395 } catch (const std::exception& er) {
396 B2FATAL(er.what());
397 }
398}
399
400
401
402
403
404
405
406
407
Class for accessing objects in the database.
Definition: DBObjPtr.h:21
@ c_ErrorIfAlreadyRegistered
If the object/array was already registered, produce an error (aborting initialisation).
Definition: DataStore.h:72
Store KLM TRG track information as a ROOT object.
Definition: KLMTrgSummary.h:20
virtual void initialize() override
Initialize the Module.
virtual void event() override
This method is the core of the module.
virtual void endRun() override
This method is called if the current run ends.
std::string m_dump_Path
Name of the file for debugging output.
virtual void beginRun() override
Called when entering a new run.
DBObject containing parameters used in KLMTrigger module.
int32_t getNLayers() const
Get the number of layers used in the trigger logic.
std::string getWhichLayers() const
Get the pattern of layers used in the trigger logic.
Base class for Modules.
Definition: Module.h:72
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
bool isValid() const
Check whether the array was registered.
Definition: StoreArray.h:288
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:95
Class to store variables with their name which were sent to the logging service.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:649
Abstract base class for different kinds of events.
STL namespace.