LDMX Software
EcalTPSelector.cxx
2
3namespace trigger {
4
6 tp_coll_name_ = ps.get<std::string>("tpCollName");
7 pass_coll_name_ = ps.get<std::string>("passCollName");
8 tp_coll_passname_ = ps.get<std::string>("tp_coll_pass_name");
9 tp_coll_event_passname_ = ps.get<std::string>("tp_coll_event_passname");
10}
11
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; // left
18 std::map<int, ldmx::HgcrocTrigDigiCollection> r_digis; // right
19 std::map<int, ldmx::HgcrocTrigDigiCollection> c_digis; // center
20 std::map<int, int> l_sums; // left
21 std::map<int, int> r_sums; // right
22 std::map<int, int> c_sums; // center
23 for (const auto& trig_digi : ecal_trig_digis) {
24 ldmx::EcalTriggerID tid(trig_digi.getId());
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 // Enforce truncation.
58 // For outer modules, the energy sort is not possible
59 // Instead, sort by ID to be deterministic.
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 // center digis, can sort by energy
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 // collections to record (corrected to MeV)
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
104 ldmx::EcalTriggerID tid(tp.getId());
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 // TrigEnergySum s(pair.first, 4, e);
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 // TrigEnergySum s(pair.first, 1, e);
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 // TrigEnergySum s(pair.first, 0, e);
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}
130
131// double EcalTPSelector::primitiveToEnergy(int tp, int layer){
132// float sie = hgc_compression_factor_ * tp *
133// gain_ * m_vto_me_v_; // in MeV, before layer corrections
134// return (sie / mip_si_energy_ * layerWeights.at(layer) + sie) *
135// second_order_energy_correction_ * ad_hoc_;
136// }
137
138void EcalTPSelector::decodeTP(ldmx::HgcrocTrigDigi tp, double& x, double& y,
139 double& z, double& e) {
140 ldmx::EcalTriggerID tid(tp.getId());
141 const ecal::EcalTriggerGeometry& geom =
143 ecal::EcalTriggerGeometry::CONDITIONS_OBJECT_NAME);
144 // const auto center_ecalID = geom.centerInTriggerCell(tid);
145 // const ldmx::EcalGeometry& hexReadout = getCondition<ldmx::EcalGeometry>(
146 // ldmx::EcalGeometry::CONDITIONS_OBJECT_NAME);
147 // hexReadout.getCellAbsolutePosition(center_ecalID,x,y,z);
148 std::tie(x, y, z) = geom.globalPosition(tid);
149 // e = primitiveToEnergy(tp.linearPrimitive(), tid.layer());
150 EcalTpToE cvt;
151 e = cvt.calc(tp.linearPrimitive(), tid.layer());
152}
153
154} // namespace trigger
155
ECal clustering algorithm.
#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:42
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:92
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:29
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78
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.