Process the event and put new data products into it.
17 {
18 if (!event.
exists(tp_coll_name_, tp_coll_event_passname_))
return;
19 auto ecal_trig_digis{event.getObject<ldmx::HgcrocTrigDigiCollection>(
20 tp_coll_name_, tp_coll_passname_)};
21
22 std::map<int, ldmx::HgcrocTrigDigiCollection> l_digis;
23 std::map<int, ldmx::HgcrocTrigDigiCollection> r_digis;
24 std::map<int, ldmx::HgcrocTrigDigiCollection> c_digis;
25 std::map<int, int> l_sums;
26 std::map<int, int> r_sums;
27 std::map<int, int> c_sums;
28 for (const auto& trig_digi : ecal_trig_digis) {
30 int module = tid.module();
31 int layer = tid.layer();
32 if (module > 3) {
33 auto ptr = l_digis.find(layer);
34 if (ptr == l_digis.end()) {
35 l_digis[layer] = {trig_digi};
36 l_sums[layer] = trig_digi.linearPrimitive();
37 } else {
38 l_digis[layer].push_back(trig_digi);
39 l_sums[layer] += trig_digi.linearPrimitive();
40 }
41 } else if (module > 0) {
42 auto ptr = r_digis.find(layer);
43 if (ptr == r_digis.end()) {
44 r_digis[layer] = {trig_digi};
45 r_sums[layer] = trig_digi.linearPrimitive();
46 } else {
47 r_digis[layer].push_back(trig_digi);
48 r_sums[layer] += trig_digi.linearPrimitive();
49 }
50 } else {
51 auto ptr = c_digis.find(layer);
52 if (ptr == c_digis.end()) {
53 c_digis[layer] = {trig_digi};
54 c_sums[layer] = trig_digi.linearPrimitive();
55 } else {
56 c_digis[layer].push_back(trig_digi);
57 c_sums[layer] += trig_digi.linearPrimitive();
58 }
59 }
60 }
61
62
63
64
65 ldmx::HgcrocTrigDigiCollection pass_t_ps;
66 pass_t_ps.reserve(ecal_trig_digis.size());
67 for (auto& pair : l_digis) {
68 auto& digis = pair.second;
69 if (digis.size() > max_outer_t_ps_) {
70 std::sort(digis.begin(), digis.end(),
72 return a.getId() > b.getId();
73 });
74 digis.resize(max_central_t_ps_);
75 }
76 pass_t_ps.insert(pass_t_ps.end(), digis.begin(), digis.end());
77 }
78 for (auto& pair : r_digis) {
79 auto& digis = pair.second;
80 if (digis.size() > max_outer_t_ps_) {
81 std::sort(digis.begin(), digis.end(),
83 return a.getId() > b.getId();
84 });
85 digis.resize(max_central_t_ps_);
86 }
87 pass_t_ps.insert(pass_t_ps.end(), digis.begin(), digis.end());
88 }
89
90 for (auto& pair : c_digis) {
91 auto& digis = pair.second;
92 if (digis.size() > max_central_t_ps_) {
93 std::sort(digis.begin(), digis.end(),
95 return a.getPrimitive() > b.getPrimitive();
96 });
97 digis.resize(max_central_t_ps_);
98 }
99 pass_t_ps.insert(pass_t_ps.end(), digis.begin(), digis.end());
100 }
101
102
103 std::vector<TrigCaloHit> pass_trig_hits;
104 for (const auto& tp : pass_t_ps) {
105 double x, y, z, e;
106 decodeTP(tp, x, y, z, e);
107 pass_trig_hits.emplace_back(x, y, z, e);
108
110 pass_trig_hits.back().setLayer(tid.layer());
111 pass_trig_hits.back().setModule(tid.module());
112 }
113
114 TrigEnergySumCollection pass_trig_sums;
115 EcalTpToE cvt;
116 for (auto& pair : l_sums) {
117 double e = cvt.calc(pair.second, pair.first);
118
119 pass_trig_sums.emplace_back(pair.first, 4, e);
120 }
121 for (auto& pair : r_sums) {
122 double e = cvt.calc(pair.second, pair.first);
123
124 pass_trig_sums.emplace_back(pair.first, 1, e);
125 }
126 for (auto& pair : c_sums) {
127 double e = cvt.calc(pair.second, pair.first);
128
129 pass_trig_sums.emplace_back(pair.first, 0, e);
130 }
131
132 event.add(pass_coll_name_ + "Hits", pass_trig_hits);
133 event.add(pass_coll_name_ + "Sums", pass_trig_sums);
134}
bool exists(const std::string &name, const std::string &passName, bool unique=true) const
Check for the existence of an object or collection with the given name and pass name in the event.
Contains the trigger output for a single trigger hgcroc channel.