10#include "trg/klm/modules/klmtrigger/ntuples_full.h"
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"
18#include <unordered_map>
26using namespace Belle2::KLM_TRG_definitions;
39 void klmtrgLayerCounter::clear_layersUsed()
44 void klmtrgLayerCounter::add_layersUsed(
int layersUsed)
46 m_layersUsed.emplace_back(layersUsed);
49 void klmtrgLayerCounter::set_NLayerTrigger(
int NLayerTrigger)
51 m_NLayerTrigger = NLayerTrigger;
54 void klmtrgLayerCounter::set_NPlaneTrigger(
int NPlaneTrigger)
56 m_NPlaneTrigger = NPlaneTrigger;
59 void klmtrgLayerCounter::set_countPlanes(
int countPlanes)
61 m_countPlanes = countPlanes;
64 KLM_Digit_compact_ts klmtrgLayerCounter::set_joiningAlgorithm(
const KLM_Digit_compact_ts& hits,
const int count_planes)
66 if (count_planes == 1) {
67 auto hits1 = nt::algorithms::join_vectors(
70 nt::comparators::on_common_args,
71 [&](
auto e1,
const auto&) {
72 e1.layer = e1.layer * 2 + e1.plane;
77 auto hits1 = nt::algorithms::join_vectors(
80 nt::comparators::on_common_args,
81 [&](
auto e1,
const auto&) {
89 void klmtrgLayerCounter::run(
const KLM_Digit_compact_ts& hits)
93 m_sections_trig.clear();
96 auto hits1 = set_joiningAlgorithm(hits, m_countPlanes);
98 __CSV__WRITE__(hits1);
101 auto grouped = nt_group(
102 hits1[0].subdetector,
107 [](
const auto & e1) {
108 auto bit_mask = to_bit_mask(nt_span(e1, layer));
110 ax_maker(plane_count) = countBits(bit_mask),
111 ax_maker(plane_mask) = bit_mask
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; });
124 m_sections_trig = nt_group(
125 grouped[0].subdetector,
129 [&](
const auto & e1) {
131 auto bit_mask = to_bit_mask(nt_span(e1, sector));
132 n_sections_trig nsector = countBits(bit_mask);
134 sector_mask(bit_mask),
140 __CSV__WRITE__(m_sections_trig);
144 m_summary1 = nt_group(
145 m_sections_trig[0].subdetector
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; });
154 back2back(bit_mask == 2)
160 __CSV__WRITE__(m_summary1);
165 int klmtrgLayerCounter::get_n_sections_trig(
int subdetector)
167 for (
const auto& e : m_summary1) {
168 if (e.subdetector == subdetector) {
169 return e.n_sections_trig;
175 int klmtrgLayerCounter::get_triggermask(
int subdetector,
int section)
177 for (
const auto& e : m_sections_trig) {
178 if (e.subdetector == subdetector && e.section == section) {
179 return e.sector_mask;
185 int klmtrgLayerCounter::get_BKLM_back_to_back_flag(
int subdetector)
187 for (
const auto& e : m_summary1) {
188 if (e.subdetector == subdetector) {
Abstract base class for different kinds of events.