LDMX Software
EcalTPSelector.cxx
2
4#include "Trigger/Event/TrigCaloHit.h"
5#include "Trigger/Event/TrigEnergySum.h"
6#include "Trigger/TrigUtilities.h"
7
8namespace trigger {
9
11 tp_coll_name_ = ps.get<std::string>("tp_coll_name");
12 pass_coll_name_ = ps.get<std::string>("pass_coll_name");
13 tp_coll_passname_ = ps.get<std::string>("tp_coll_pass_name");
14 tp_coll_event_passname_ = ps.get<std::string>("tp_coll_event_passname");
15}
16
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; // left
23 std::map<int, ldmx::HgcrocTrigDigiCollection> r_digis; // right
24 std::map<int, ldmx::HgcrocTrigDigiCollection> c_digis; // center
25 std::map<int, int> l_sums; // left
26 std::map<int, int> r_sums; // right
27 std::map<int, int> c_sums; // center
28 for (const auto& trig_digi : ecal_trig_digis) {
29 ldmx::EcalTriggerID tid(trig_digi.getId());
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 // Enforce truncation.
63 // For outer modules, the energy sort is not possible
64 // Instead, sort by ID to be deterministic.
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 // center digis, can sort by energy
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 // collections to record (corrected to MeV)
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
109 ldmx::EcalTriggerID tid(tp.getId());
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 // TrigEnergySum s(pair.first, 4, e);
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 // TrigEnergySum s(pair.first, 1, e);
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 // TrigEnergySum s(pair.first, 0, e);
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}
135
136// double EcalTPSelector::primitiveToEnergy(int tp, int layer){
137// float sie = hgc_compression_factor_ * tp *
138// gain_ * m_vto_me_v_; // in MeV, before layer corrections
139// return (sie / mip_si_energy_ * layerWeights.at(layer) + sie) *
140// second_order_energy_correction_ * ad_hoc_;
141// }
142
143void EcalTPSelector::decodeTP(ldmx::HgcrocTrigDigi tp, double& x, double& y,
144 double& z, double& e) {
145 ldmx::EcalTriggerID tid(tp.getId());
146 const ecal::EcalTriggerGeometry& geom =
148 ecal::EcalTriggerGeometry::CONDITIONS_OBJECT_NAME);
149 // const auto center_ecalID = geom.centerInTriggerCell(tid);
150 // const ldmx::EcalGeometry& hexReadout = getCondition<ldmx::EcalGeometry>(
151 // ldmx::EcalGeometry::CONDITIONS_OBJECT_NAME);
152 // hexReadout.getCellAbsolutePosition(center_ecalID,x,y,z);
153 std::tie(x, y, z) = geom.globalPosition(tid);
154 // e = primitiveToEnergy(tp.linearPrimitive(), tid.layer());
155 EcalTpToE cvt;
156 e = cvt.calc(tp.linearPrimitive(), tid.layer());
157}
158
159} // namespace trigger
160
ECal clustering algorithm.
Class that defines the relationship between precision cells and trigger cells and provides geometry i...
#define DECLARE_PRODUCER(CLASS)
Macro which allows the framework to construct a producer given its name during configuration.
defines the relationship between precision cells and trigger cells and provides geometry information ...
std::tuple< double, double, double > globalPosition(ldmx::EcalTriggerID triggerCell) const
Returns the center of the given trigger cell in world coordinates.
const T & getCondition(const std::string &condition_name)
Access a conditions object for the current event.
Implements an event buffer system for storing event data.
Definition Event.h:40
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.
Definition Event.cxx:107
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:26
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:75
Extension of DetectorID providing access to ECal trigger cell information.
int layer() const
Get the value of the layer field from the ID.
int module() const
Get the value of the module field from the ID.
Contains the trigger output for a single trigger hgcroc channel.
uint32_t linearPrimitive() const
Get the linearized value of the trigger primitive.
uint32_t getId() const
Get the id of the digi.
virtual void produce(framework::Event &event)
Process the event and put new data products into it.
virtual void configure(framework::config::Parameters &ps)
Callback for the EventProcessor to configure itself from the given set of parameters.