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