Belle II Software development
klmtrgLayerCounter.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
10#include "trg/klm/modules/klmtrigger/ntuples_full.h"
11
12
13#include "trg/klm/modules/klmtrigger/klmtrgLayerCounter.h"
14#include "trg/klm/modules/klmtrigger/IO_csv.h"
15#include "trg/klm/modules/klmtrigger/bit_operations.h"
16
17
18#include <unordered_map>
19#include <algorithm>
20#include <numeric>
21#include <vector>
22#include <tuple>
23#include <iostream>
24#include <bitset>
25
26using namespace Belle2::KLM_TRG_definitions;
27
28
29
30
31
32
33namespace Belle2 {
38
39 void klmtrgLayerCounter::clear_layersUsed()
40 {
41 m_layersUsed.clear();
42 }
43
44 void klmtrgLayerCounter::add_layersUsed(int layersUsed)
45 {
46 m_layersUsed.emplace_back(layersUsed);
47 }
48
49 void klmtrgLayerCounter::set_NLayerTrigger(int NLayerTrigger)
50 {
51 m_NLayerTrigger = NLayerTrigger;
52 }
53
54 void klmtrgLayerCounter::set_NPlaneTrigger(int NPlaneTrigger)
55 {
56 m_NPlaneTrigger = NPlaneTrigger;
57 }
58
59 void klmtrgLayerCounter::set_countPlanes(int countPlanes)
60 {
61 m_countPlanes = countPlanes;
62 }
63
64 KLM_Digit_compact_ts klmtrgLayerCounter::set_joiningAlgorithm(const KLM_Digit_compact_ts& hits, const int count_planes)
65 {
66 if (count_planes == 1) {
67 auto hits1 = nt::algorithms::join_vectors(
68 hits,
69 m_layersUsed,
70 nt::comparators::on_common_args,
71 [&](auto e1, const auto&) {
72 e1.layer = e1.layer * 2 + e1.plane;
73 return e1;
74 });
75 return hits1;
76 } else {
77 auto hits1 = nt::algorithms::join_vectors(
78 hits,
79 m_layersUsed,
80 nt::comparators::on_common_args,
81 [&](auto e1, const auto&) {
82 e1.layer = e1.layer;
83 return e1;
84 });
85 return hits1;
86 }
87 }
88
89 void klmtrgLayerCounter::run(const KLM_Digit_compact_ts& hits)
90 {
91
92
93 m_sections_trig.clear();
94 m_summary1.clear();
95
96 auto hits1 = set_joiningAlgorithm(hits, m_countPlanes);
97
98 __CSV__WRITE__(hits1);
99
100
101 auto grouped = nt_group(
102 hits1[0].subdetector,
103 hits1[0].section,
104 hits1[0].sector
105 ).apply_append(
106 hits1,
107 [](const auto & e1) {
108 auto bit_mask = to_bit_mask(nt_span(e1, layer));
109 return nt::ntuple(
110 ax_maker(plane_count) = countBits(bit_mask),
111 ax_maker(plane_mask) = bit_mask
112 );
113 });
114
115
116 __CSV__WRITE__(grouped);
117 int threshold = (m_countPlanes == 1) ? m_NPlaneTrigger : m_NLayerTrigger;
118 nt::algorithms::filter(grouped, [&](const auto & e) { return e.plane_count >= threshold; });
119
120
121
122
123
124 m_sections_trig = nt_group(
125 grouped[0].subdetector,
126 grouped[0].section
127 ).apply_append(
128 grouped,
129 [&](const auto & e1) {
130
131 auto bit_mask = to_bit_mask(nt_span(e1, sector));
132 n_sections_trig nsector = countBits(bit_mask);
133 return nt::ntuple(
134 sector_mask(bit_mask),
135 nsector
136 );
137 }
138 );
139
140 __CSV__WRITE__(m_sections_trig);
141
142
143
144 m_summary1 = nt_group(
145 m_sections_trig[0].subdetector
146 ).apply_append(
147 m_sections_trig,
148 [](const auto & e1) {
149 auto bit_mask = countBits(to_bit_mask(nt_span(e1, section)));
150 n_sections_trig nsector = nt::algorithms::sum(e1, [](auto&& e) {return e.n_sections_trig; });
151
152 return nt::ntuple(
153 nsector,
154 back2back(bit_mask == 2)
155
156 );
157 }
158 );
159
160 __CSV__WRITE__(m_summary1);
161
162
163 }
164
165 int klmtrgLayerCounter::get_n_sections_trig(int subdetector)
166 {
167 for (const auto& e : m_summary1) {
168 if (e.subdetector == subdetector) {
169 return e.n_sections_trig;
170 }
171 }
172 return 0;
173 }
174
175 int klmtrgLayerCounter::get_triggermask(int subdetector, int section)
176 {
177 for (const auto& e : m_sections_trig) {
178 if (e.subdetector == subdetector && e.section == section) {
179 return e.sector_mask;
180 }
181 }
182 return 0;
183 }
184
185 int klmtrgLayerCounter::get_BKLM_back_to_back_flag(int subdetector)
186 {
187 for (const auto& e : m_summary1) {
188 if (e.subdetector == subdetector) {
189 return e.back2back;
190 }
191 }
192 return 0;
193 }
194
195
197}
Abstract base class for different kinds of events.