Process the event and make histograms or summaries.
61 {
62 std::vector<float> bdt_features;
63
64 double decay_z;
65
67 sim_particles_coll_name_, sim_particles_pass_name_)};
68
69 for (auto const &it : particle_map) {
70 std::vector<int> parents = it.second.getParents();
71 for (int track_id : parents) {
72 if (track_id == 0 && it.second.getPdgID() == -11) {
73 decay_z = it.second.getVertex()[2];
74 }
75 }
76 }
77
79
80
81
82
83
84 std::vector<double> gamma_p(3);
85 double gamma_energy = 90000.;
86 std::vector<double> gamma_x0(3);
87
88 std::vector<double> recoil_p(3);
89 bool found_recoil_e = false;
90
91 if (recoil_from_tracking_) {
92 const auto &recoil_tracks{
93 event.getCollection<
ldmx::Track>(track_collection_, track_pass_name_)};
94 for (auto &track : recoil_tracks) {
95
96 auto trk_pos = track.getPositionAtTarget();
97 auto trk_mom = track.getMomentumAtTarget();
98 if (track.getCharge() == 1 && track.getNhits() == 5 &&
99 trk_pos.size() == 3 && trk_mom.size() == 3) {
100 gamma_x0 = trk_pos;
101 gamma_p[0] = -1. * trk_mom[0];
102 gamma_p[1] = -1. * trk_mom[1];
103 gamma_p[2] = 8000. - trk_mom[2];
104 }
105 }
106 } else {
107 if (event.
exists(sp_collection_, sp_pass_name_)) {
109 sp_collection_, sp_pass_name_);
110 bool found_rec = false;
111 for (auto const &it : particle_map) {
112 for (auto const &sphit : target_sp_hits) {
113 if (sphit.getPosition()[2] > 0) {
114 if (it.first == sphit.getTrackID()) {
115 if (it.second.getPdgID() == 622) {
116 std::vector<float> x0_float = sphit.getPosition();
117 std::vector<double> x0_double(x0_float.begin(), x0_float.end());
118 gamma_x0 = x0_double;
119 gamma_p = sphit.getMomentum();
120 gamma_energy = sphit.getEnergy();
121 found_rec = true;
122 }
123 if (it.second.getPdgID() == 11 &&
124 inList(it.second.getParents(), 0)) {
125 if (!found_rec) {
126 std::vector<float> x0_float = sphit.getPosition();
127 std::vector<double> x0_double(x0_float.begin(),
128 x0_float.end());
129 gamma_x0 = x0_double;
130 gamma_p[0] = -1. * sphit.getMomentum()[0];
131 gamma_p[1] = -1. * sphit.getMomentum()[1];
132 gamma_p[2] = beam_energy_mev_ - sphit.getMomentum()[2];
133 gamma_energy = beam_energy_mev_ - sphit.getEnergy();
134 found_rec = true;
135 }
136 recoil_p = sphit.getMomentum();
137 found_recoil_e = true;
138 }
139 }
140 }
141 }
142 }
143 }
144 }
147 std::acos(gamma_p[2] / std::sqrt(gamma_p[0] * gamma_p[0] +
148 gamma_p[1] * gamma_p[1] +
149 gamma_p[2] * gamma_p[2])));
150
151 double p_mag = 0.;
152 if (found_recoil_e) {
153 p_mag = std::sqrt(recoil_p[0] * recoil_p[0] + recoil_p[1] * recoil_p[1] +
154 recoil_p[2] * recoil_p[2]);
155 }
156
157 if (p_mag < 50. && all_cuts_) {
158 return;
159 }
161
162
163 const auto &ecal_rec_hits =
event.getCollection<
ldmx::EcalHit>(
164 ecal_rec_collection_, ecal_rec_pass_name_);
165 const auto &hcal_rec_hits =
event.getCollection<
ldmx::HcalHit>(
166 hcal_rec_collection_, hcal_rec_pass_name_);
167
168 double trigger = 0.;
169 double ecal_energy = 0.;
170 double hcal_energy = 0.;
171 bool hcal_containment = true;
172
174 if (hit.getEnergy() > 0.) {
175 ecal_energy += hit.getEnergy();
176 if (hit.getZPos() <= 541.722) {
177 trigger += hit.getEnergy();
178 }
179 }
180 }
182 if (hit.getEnergy() > 0.) {
184 if (det_id.getSection() != 0) {
185 continue;
186 }
187 if (det_id.getLayerID() == 1 && hit.getPE() > 5) {
188 hcal_containment = false;
189 }
190 hcal_energy += 12. * hit.getEnergy();
191 }
192 }
193
194 if (trigger > 3160. && all_cuts_) {
195 return;
196 }
198
199 if (ecal_energy > 3160. && all_cuts_) {
200 return;
201 }
203
204 if (p_mag > 2400. && all_cuts_) {
205 return;
206 }
208
210 ecal_veto_collection_, ecal_veto_pass_)};
211 if (ecal_veto.getDisc() < ecal_bdt_cut_val_ && all_cuts_) {
212 return;
213 }
215
216 if (hcal_energy < 4840 && all_cuts_) {
217 return;
218 }
220
221 if (!hcal_containment && all_cuts_) {
222 return;
223 }
225
226
227 int n_layers_hit = 0;
228 double x_std = 0.;
229 double y_std = 0.;
230 double z_std = 0.;
231 double x_mean = 0.;
232 double y_mean = 0.;
233 double r_mean = 0.;
234 int iso_hits = 0;
235 double iso_energy = 0.;
236 int n_readout_hits = 0;
237 double summed_det = 0.;
238 double r_mean_from_photon_track = 0.;
239
240 double z_mean = 0.;
241 std::vector<int> layers_hit;
243 if (hit.getEnergy() > 0.) {
245 if (det_id.getSection() != 0) {
246 continue;
247 }
248 if (fabs(hit.getXPos()) > 1000 || fabs(hit.getYPos()) > 1000) {
249 continue;
250 }
251 n_readout_hits += 1;
252 double hit_x = hit.getXPos();
253 double hit_y = hit.getYPos();
254 double hit_z = hit.getZPos();
255 double hit_r = sqrt(hit_x * hit_x + hit_y * hit_y);
256
257 summed_det += hit.getEnergy();
258
259 x_mean += hit_x * hit.getEnergy();
260 y_mean += hit_y * hit.getEnergy();
261 z_mean += hit_z * hit.getEnergy();
262 r_mean += hit_r * hit.getEnergy();
263
264
265 if (!(std::find(layers_hit.begin(), layers_hit.end(),
266 det_id.getLayerID()) != layers_hit.end())) {
267 layers_hit.push_back(det_id.getLayerID());
268 }
269
270 double proj_x =
271 gamma_x0[0] + (hit_z - gamma_x0[2]) * gamma_p[0] / gamma_p[2];
272 double proj_y =
273 gamma_x0[1] + (hit_z - gamma_x0[2]) * gamma_p[1] / gamma_p[2];
274
275 r_mean_from_photon_track +=
276 hit.getEnergy() * sqrt((hit_x - proj_x) * (hit_x - proj_x) +
277 (hit_y - proj_y) * (hit_y - proj_y));
278
279
280 double closest_point = 9999.;
282 if (hit2.getEnergy() > 0.) {
284 if (fabs(hit2.getXPos()) > 1000 || fabs(hit2.getYPos()) > 1000) {
285 continue;
286 }
287 if (det_i_d2.getLayerID() == det_id.getLayerID()) {
288
289
290
291 if (hit.isOrientationX()) {
292 if (fabs(hit2.getYPos() - hit_y) > 0) {
293 if (fabs(hit2.getYPos() - hit_y) < closest_point) {
294 closest_point = abs(hit2.getYPos() - hit_y);
295 }
296 }
297 }
298 if (hit.isOrientationY()) {
299 if (fabs(hit2.getXPos() - hit_x) > 0) {
300 if (fabs(hit2.getXPos() - hit_x) < closest_point) {
301 closest_point = fabs(hit2.getXPos() - hit_x);
302 }
303 }
304 }
305 }
306 }
307 }
308 if (closest_point > 50.) {
309 iso_hits += 1;
310 iso_energy += hit.getEnergy();
311 }
312 }
313 }
314
315 n_layers_hit = layers_hit.size();
316
317 if (summed_det > 0.) {
318 x_mean /= summed_det;
319 y_mean /= summed_det;
320 z_mean /= summed_det;
321 r_mean /= summed_det;
322
323 r_mean_from_photon_track /= summed_det;
324 }
325
327 if (hit.getEnergy() > 0.) {
328 if (fabs(hit.getXPos()) > 1000 || fabs(hit.getYPos()) > 1000) {
329 continue;
330 }
332 if (det_id.getSection() == 0) {
333 x_std += hit.getEnergy() * (hit.getXPos() - x_mean) *
334 (hit.getXPos() - x_mean);
335 y_std += hit.getEnergy() * (hit.getYPos() - y_mean) *
336 (hit.getYPos() - y_mean);
337 z_std += hit.getEnergy() * (hit.getZPos() - z_mean) *
338 (hit.getZPos() - z_mean);
339 }
340 }
341 }
342
343 if (summed_det > 0.) {
344 x_std = sqrt(x_std / summed_det);
345 y_std = sqrt(y_std / summed_det);
346 z_std = sqrt(z_std / summed_det);
347 }
348
349
362
363 bdt_features.push_back(n_layers_hit);
364 bdt_features.push_back(x_std);
365 bdt_features.push_back(y_std);
366 bdt_features.push_back(z_std);
367 bdt_features.push_back(x_mean);
368 bdt_features.push_back(y_mean);
369 bdt_features.push_back(r_mean);
370 bdt_features.push_back(iso_hits);
371 bdt_features.push_back(iso_energy);
372 bdt_features.push_back(n_readout_hits);
373 bdt_features.push_back(hcal_energy);
374 bdt_features.push_back(r_mean_from_photon_track);
375
376 ldmx::ort::FloatArrays inputs({bdt_features});
377 float pred =
378 rt_->run({feature_list_name_}, inputs, {"probabilities"})[0].at(1);
379
381
382 for (int i = 0; i < 10000; i++) {
383 double disc = 0.999 + (double(i) / 10000.) * (1. - 0.999);
385 0.999 + ((double(i) + 0.5) / 10000.) * (1. - 0.999));
386 double disc_roc = 0.99 + (double(i) / 10000.) * (1. - 0.99);
387 if (pred >= disc) {
389 0.999 + ((double(i) + 0.5) / 10000.) * (1. - 0.999));
390 }
391 if (pred >= disc_roc) {
393 }
394 }
395
397
398 if (pred < bdt_cut_val_) {
399 return;
400 }
402
403 return;
404}
HistogramPool histograms_
helper object for making and filling histograms
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.
void fill(const std::string &name, const T &val)
Fill a 1D histogram.
Stores reconstructed hit information from the ECAL.
Stores reconstructed hit information from the HCAL.
Implements detector ids for HCal subdetector.
Class representing a simulated particle.
Represents a simulated tracker hit in the simulation.
Implementation of a track object.