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#include <trg/klm/modules/klmtrigger/KLMAxis.h>
11#include <trg/klm/modules/klmtrigger/klmtrgLayerCounter.h>
12#include <trg/klm/modules/klmtrigger/klmtrgLinearFit.h>
13#include <trg/klm/modules/klmtrigger/IO_csv.h>
14#include <trg/klm/dataobjects/KLMTrgSummary.h>
15#include <trg/klm/dataobjects/KLMTrgFittedTrack.h>
16#include <trg/klm/dbobjects/KLMTriggerParameters.h>
17
18// klm
19#include <klm/bklm/geometry/GeometryPar.h>
20#include <klm/dataobjects/KLMDigit.h>
21
22// framework
23#include <framework/datastore/StoreArray.h>
24#include <framework/datastore/StoreObjPtr.h>
25#include <framework/dataobjects/EventMetaData.h>
26#include <framework/database/DBObjPtr.h>
27
28#include <vector>
29
30using namespace std;
31using namespace Belle2;
32using namespace Belle2::KLM_TRG_definitions;
33
34// part of unused old Trigger collection
35// const std::string m_klmtrackCollectionName = "TRGKLMTracks";
36// const std::string m_klmhitCollectionName = "TRGKLMHits";
37// end
38
39//-----------------------------------------------------------------
40// Register the Module
41//-----------------------------------------------------------------
42REG_MODULE(KLMTrigger);
43
44//-----------------------------------------------------------------
45// Implementation
46//-----------------------------------------------------------------
47
48
49vector<string> split(const string& str, const string& delim)
50{
51 vector<string> tokens;
52 size_t prev = 0, pos = 0;
53 do {
54 pos = str.find(delim, prev);
55 if (pos == string::npos) pos = str.length();
56 string token = str.substr(prev, pos - prev);
57 if (!token.empty()) tokens.push_back(token);
58 prev = pos + delim.length();
59 } while (pos < str.length() && prev < str.length());
60 return tokens;
61}
62
63std::vector<int> layer_string_list_to_integer_range(const std::string& instr)
64{
65 std::vector<int> ret;
66 auto str_spl = split(instr, ":");
67
68 int start = std::stoi(str_spl[0]);
69 int stop = std::stoi(str_spl[1]);
70 for (int i = start; i < stop ; ++i) {
71 ret.push_back(i);
72 }
73
74 return ret;
75}
76std::vector<int> layer_string_list_to_integer_list(const std::string& instr)
77{
78 std::vector<int> ret;
79 auto str_spl = split(instr, ",");
80
81 for (const auto& e : str_spl) {
82 ret.push_back(std::stoi(e));
83 }
84
85 return ret;
86}
87std::vector<int> layer_string_list_to_integer(const std::string& instr)
88{
89 if (instr.find(":") != string::npos) {
90 return layer_string_list_to_integer_range(instr);
91 }
92 if (instr.find(",") != string::npos) {
93 return layer_string_list_to_integer_list(instr);
94 }
95 std::vector<int> ret;
96 return ret;
97}
98KLMTriggerModule::KLMTriggerModule() : Module()
99{
100 setDescription("KLM trigger simulation");
101 setPropertyFlags(c_ParallelProcessingCertified);
102
103 addParam("y_cutoff", y_cutoff, "", 500);
104 addParam("intercept_cutoff", m_intercept_cutoff, "", 500);
105 addParam("CSV_Dump_Path", m_dump_Path, "", m_dump_Path);
106
107}
108
110{
111 m_event_nr = 0;
112 StoreArray<KLMDigit> klmDigits;
113 klmDigits.isRequired();
114 if (!klmDigits.isValid())
115 return;
116
119
120 StoreArray<KLMTrgFittedTrack> KLMTrgFittedTrack_("KLMTrgFittedTrack");
122
123 if (!m_dump_Path.empty()) {
124 get_IO_csv_handle().dump_path = m_dump_Path;
125 get_IO_csv_handle().do_dump = true;
126 }
127
128}
129
131{
132 StoreObjPtr<EventMetaData> evtMetaData;
134 B2DEBUG(100, "KLMTrigger: Experiment " << evtMetaData->getExperiment() << ", run " << evtMetaData->getRun());
135 if (not KLMTriggerParameters.isValid())
136 B2FATAL("KLM trigger parameters are not available.");
137
138 try {
139 m_layerUsed = layer_string_list_to_integer(KLMTriggerParameters->getWhichLayers());
140 B2DEBUG(20, "KLMTrigger: m_layerUsed " << KLMTriggerParameters->getWhichLayers());
141 for (auto e : m_layerUsed) {
142 B2DEBUG(20, "KLMTrigger: layer " << e << " used.");
143 }
144 } catch (const std::exception& e) {
145 B2FATAL("Something went wrong when parsing the 'm_whichLayers' string"
147 << LogVar("exception", e.what()));
148 }
149 try {
150 m_klmtrg_layer_counter = std::make_shared< Belle2::klmtrgLayerCounter>();
151 m_klm_trig_linear_fit = std::make_shared< Belle2::klmtrgLinearFit>();
152 m_klm_trig_linear_fit->set_y_cutoff(y_cutoff);
153 m_klm_trig_linear_fit->set_intercept_cutoff(m_intercept_cutoff);
154
155
156 m_klmtrg_layer_counter->set_NPlaneTrigger(KLMTriggerParameters->getNPlanes());
157 m_klmtrg_layer_counter->set_NLayerTrigger(KLMTriggerParameters->getNLayers());
158 m_klmtrg_layer_counter->set_countPlanes(KLMTriggerParameters->getcountPlanes());
159
160 for (auto e : m_layerUsed) {
161 m_klmtrg_layer_counter->add_layersUsed(e);
162 }
163
164 Belle2::KLM_TRG_definitions::KLM_geo_fit_t e{};
165
166 for (size_t i = 0 ; i < KLMTriggerParameters->getGeometryDataSize() ; ++i) {
167 e.subdetector = KLMTriggerParameters->getSubdetector(i);
168 e.section = KLMTriggerParameters->getSection(i);
169 e.sector = KLMTriggerParameters->getSector(i);
170 e.layer = KLMTriggerParameters->getLayer(i);
171 e.plane = KLMTriggerParameters->getPlane(i);
172 e.slopeX.v = KLMTriggerParameters->getSlopeX(i);
173 e.offsetX.v = KLMTriggerParameters->getOffsetX(i);
174 e.slopeY.v = KLMTriggerParameters->getSlopeY(i);
175 e.offsetY.v = KLMTriggerParameters->getOffsetY(i);
176 m_klm_trig_linear_fit->add_geometry(e);
177
178 }
179
180 } catch (const std::exception& er) {
181 B2FATAL(er.what());
182 }
183
184}
185
186
190
191template <typename T1, typename T2>
192auto push_linear_fit_to_KLMTrgFittedTrack(T1&& linear_fited, T2& KLMTrgFittedTrack_)
193{
194 for (const auto& e : linear_fited) {
195 //if (e.slopeXY >= 1e100) { continue; }
196 auto FittedTrack = KLMTrgFittedTrack_.appendNew();
197 FittedTrack->setSlopeXY(e.slopeXY) ;
198 FittedTrack->setInterceptXY(e.interceptXY);
199 FittedTrack->setIpXY(e.ipXY) ;
200 FittedTrack->setPlane(e.plane);
201 FittedTrack->setChisqXY(e.chisqXY);
202 FittedTrack->setSubdetector(e.subdetector);
203 FittedTrack->setSection(e.section);
204 FittedTrack->setSector(e.sector);
205 FittedTrack->setNhits(e.Nhits);
206 FittedTrack->setTrack_id(e.track_id);
207
208 }
209
210}
211
212template <typename T1, typename T2, typename T3>
213auto push_KLMSummary(T1&& m_klmtrg_layer_counter, T2&& m_klm_trig_linear_fit, T3& KLMTrgSummary)
214{
215
216 KLMTrgSummary->setBKLM_back_to_back_flag(
217 m_klmtrg_layer_counter->get_BKLM_back_to_back_flag(KLMElementNumbers::c_BKLM)
218 );
219
220 KLMTrgSummary->setEKLM_back_to_back_flag(
221 m_klmtrg_layer_counter->get_BKLM_back_to_back_flag(KLMElementNumbers::c_EKLM)
222 );
223
224 KLMTrgSummary->setBKLM_n_trg_sectors(
225 m_klmtrg_layer_counter->get_n_sections_trig(KLMElementNumbers::c_BKLM)
226 );
227 KLMTrgSummary->setEKLM_n_trg_sectors(
228 m_klmtrg_layer_counter->get_n_sections_trig(KLMElementNumbers::c_EKLM)
229 );
230 KLMTrgSummary->setSector_mask_Backward_Barrel(
231 m_klmtrg_layer_counter->get_triggermask(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_BackwardSection)
232 );
233
234 KLMTrgSummary->setSector_mask_Forward_Barrel(
235 m_klmtrg_layer_counter->get_triggermask(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_ForwardSection)
236 );
237 KLMTrgSummary->setSector_mask_Backward_Endcap(
238 m_klmtrg_layer_counter->get_triggermask(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_BackwardSection)
239 );
240
241 KLMTrgSummary->setSector_mask_Forward_Endcap(
242 m_klmtrg_layer_counter->get_triggermask(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_ForwardSection)
243 );
244
245 KLMTrgSummary->setSector_mask_SLF_Backward_Barrel(
246 m_klm_trig_linear_fit->get_triggermask(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_BackwardSection)
247 );
248
249 KLMTrgSummary->setSector_mask_SLF_Forward_Barrel(
250 m_klm_trig_linear_fit->get_triggermask(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_ForwardSection)
251 );
252 KLMTrgSummary->setSector_mask_SLF_Backward_Endcap(
253 m_klm_trig_linear_fit->get_triggermask(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_BackwardSection)
254 );
255
256 KLMTrgSummary->setSector_mask_SLF_Forward_Endcap(
257 m_klm_trig_linear_fit->get_triggermask(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_ForwardSection)
258 );
259
260 KLMTrgSummary->setSector_mask_SLF_OR_Backward_Barrel(
261 m_klm_trig_linear_fit->get_triggermask_or(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_BackwardSection)
262 );
263
264 KLMTrgSummary->setSector_mask_SLF_OR_Forward_Barrel(
265 m_klm_trig_linear_fit->get_triggermask_or(KLMElementNumbers::c_BKLM, BKLMElementNumbers::c_ForwardSection)
266 );
267 KLMTrgSummary->setSector_mask_SLF_OR_Backward_Endcap(
268 m_klm_trig_linear_fit->get_triggermask_or(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_BackwardSection)
269 );
270
271 KLMTrgSummary->setSector_mask_SLF_OR_Forward_Endcap(
272 m_klm_trig_linear_fit->get_triggermask_or(KLMElementNumbers::c_EKLM, EKLMElementNumbers::c_ForwardSection)
273 );
274
275}
276
277
279{
280
281 try {
282 ++m_event_nr;
283 StoreArray<KLMDigit> klmDigits;
284 StoreArray<KLMTrgFittedTrack> KLMTrgFittedTrack_("KLMTrgFittedTrack");
286 KLMTrgSummary.create();
287
288 get_IO_csv_handle().event_nr = m_event_nr;
289 Belle2::KLM_TRG_definitions::KLM_Digit_compact_t dummy {};
290 auto hits = nt::algorithms::fill_vector(klmDigits.getEntries(),
291 [&](auto Index) {
292 const auto& digit = klmDigits[Index];
293
294 dummy.event_nr = m_event_nr;
295 dummy.subdetector = digit->getSubdetector();
296 dummy.section = digit->getSection();
297 dummy.sector = digit->getSector() - 1;
298 dummy.plane = digit->getPlane();
299 dummy.layer = digit->getLayer();
300 dummy.strip = digit->getStrip();
301 return dummy;
302
303 });
304
305 m_klmtrg_layer_counter->run(hits);
306 m_klm_trig_linear_fit->run(hits);
307
308 push_linear_fit_to_KLMTrgFittedTrack(m_klm_trig_linear_fit->get_result(), KLMTrgFittedTrack_);
309
310 push_KLMSummary(m_klmtrg_layer_counter, m_klm_trig_linear_fit, KLMTrgSummary);
311
312 } catch (const std::exception& er) {
313 B2FATAL(er.what());
314 }
315}
316
317
318
319
320
321
322
323
324
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.
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.
int32_t getcountPlanes() const
Get the number of layers used in the trigger logic.
int32_t getNPlanes() const
Get the number of planes 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:289
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:96
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.