62 std::vector<float> bdt_features;
67 sim_particles_coll_name_, sim_particles_pass_name_)};
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];
84 std::vector<double> gamma_p(3);
85 double gamma_energy = 90000.;
86 std::vector<double> gamma_x0(3);
88 std::vector<double> recoil_p(3);
89 bool found_recoil_e =
false;
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) {
96 if (track.q() == 1 && track.getNhits() == 5) {
97 gamma_x0 = track.getPosition();
98 gamma_p[0] = -1. * track.getMomentum()[0];
99 gamma_p[1] = -1. * track.getMomentum()[1];
100 gamma_p[2] = 8000. - track.getMomentum()[2];
104 if (event.
exists(sp_collection_, sp_pass_name_)) {
106 sp_collection_, sp_pass_name_);
107 bool found_rec =
false;
108 for (
auto const &it : particle_map) {
109 for (
auto const &sphit : target_sp_hits) {
110 if (sphit.getPosition()[2] > 0) {
111 if (it.first == sphit.getTrackID()) {
112 if (it.second.getPdgID() == 622) {
113 std::vector<float> x0_float = sphit.getPosition();
114 std::vector<double> x0_double(x0_float.begin(), x0_float.end());
115 gamma_x0 = x0_double;
116 gamma_p = sphit.getMomentum();
117 gamma_energy = sphit.getEnergy();
120 if (it.second.getPdgID() == 11 &&
121 inList(it.second.getParents(), 0)) {
123 std::vector<float> x0_float = sphit.getPosition();
124 std::vector<double> x0_double(x0_float.begin(),
126 gamma_x0 = x0_double;
127 gamma_p[0] = -1. * sphit.getMomentum()[0];
128 gamma_p[1] = -1. * sphit.getMomentum()[1];
129 gamma_p[2] = beam_energy_mev_ - sphit.getMomentum()[2];
130 gamma_energy = beam_energy_mev_ - sphit.getEnergy();
133 recoil_p = sphit.getMomentum();
134 found_recoil_e =
true;
144 std::acos(gamma_p[2] / std::sqrt(gamma_p[0] * gamma_p[0] +
145 gamma_p[1] * gamma_p[1] +
146 gamma_p[2] * gamma_p[2])));
149 if (found_recoil_e) {
150 p_mag = std::sqrt(recoil_p[0] * recoil_p[0] + recoil_p[1] * recoil_p[1] +
151 recoil_p[2] * recoil_p[2]);
154 if (p_mag < 50. && all_cuts_) {
160 const auto &ecal_rec_hits =
event.getCollection<
ldmx::EcalHit>(
161 ecal_rec_collection_, ecal_rec_pass_name_);
162 const auto &hcal_rec_hits =
event.getCollection<
ldmx::HcalHit>(
163 hcal_rec_collection_, hcal_rec_pass_name_);
166 double ecal_energy = 0.;
167 double hcal_energy = 0.;
168 bool hcal_containment =
true;
171 if (hit.getEnergy() > 0.) {
172 ecal_energy += hit.getEnergy();
173 if (hit.getZPos() <= 541.722) {
174 trigger += hit.getEnergy();
179 if (hit.getEnergy() > 0.) {
181 if (det_id.getSection() != 0) {
184 if (det_id.
getLayerID() == 1 && hit.getPE() > 5) {
185 hcal_containment =
false;
187 hcal_energy += 12. * hit.getEnergy();
191 if (trigger > 3160. && all_cuts_) {
196 if (ecal_energy > 3160. && all_cuts_) {
201 if (p_mag > 2400. && all_cuts_) {
207 ecal_veto_collection_, ecal_veto_pass_)};
208 if (ecal_veto.getDisc() < ecal_bdt_cut_val_ && all_cuts_) {
213 if (hcal_energy < 4840 && all_cuts_) {
218 if (!hcal_containment && all_cuts_) {
224 int n_layers_hit = 0;
232 double iso_energy = 0.;
233 int n_readout_hits = 0;
234 double summed_det = 0.;
235 double r_mean_from_photon_track = 0.;
238 std::vector<int> layers_hit;
240 if (hit.getEnergy() > 0.) {
242 if (det_id.getSection() != 0) {
245 if (fabs(hit.getXPos()) > 1000 || fabs(hit.getYPos()) > 1000) {
249 double hit_x = hit.getXPos();
250 double hit_y = hit.getYPos();
251 double hit_z = hit.getZPos();
252 double hit_r = sqrt(hit_x * hit_x + hit_y * hit_y);
254 summed_det += hit.getEnergy();
256 x_mean += hit_x * hit.getEnergy();
257 y_mean += hit_y * hit.getEnergy();
258 z_mean += hit_z * hit.getEnergy();
259 r_mean += hit_r * hit.getEnergy();
262 if (!(std::find(layers_hit.begin(), layers_hit.end(),
268 gamma_x0[0] + (hit_z - gamma_x0[2]) * gamma_p[0] / gamma_p[2];
270 gamma_x0[1] + (hit_z - gamma_x0[2]) * gamma_p[1] / gamma_p[2];
272 r_mean_from_photon_track +=
273 hit.getEnergy() * sqrt((hit_x - proj_x) * (hit_x - proj_x) +
274 (hit_y - proj_y) * (hit_y - proj_y));
277 double closest_point = 9999.;
279 if (hit2.getEnergy() > 0.) {
281 if (fabs(hit2.getXPos()) > 1000 || fabs(hit2.getYPos()) > 1000) {
288 if (hit.isOrientationX()) {
289 if (fabs(hit2.getYPos() - hit_y) > 0) {
290 if (fabs(hit2.getYPos() - hit_y) < closest_point) {
291 closest_point = abs(hit2.getYPos() - hit_y);
295 if (hit.isOrientationY()) {
296 if (fabs(hit2.getXPos() - hit_x) > 0) {
297 if (fabs(hit2.getXPos() - hit_x) < closest_point) {
298 closest_point = fabs(hit2.getXPos() - hit_x);
305 if (closest_point > 50.) {
307 iso_energy += hit.getEnergy();
312 n_layers_hit = layers_hit.size();
314 if (summed_det > 0.) {
315 x_mean /= summed_det;
316 y_mean /= summed_det;
317 z_mean /= summed_det;
318 r_mean /= summed_det;
320 r_mean_from_photon_track /= summed_det;
324 if (hit.getEnergy() > 0.) {
325 if (fabs(hit.getXPos()) > 1000 || fabs(hit.getYPos()) > 1000) {
329 if (det_id.getSection() == 0) {
330 x_std += hit.getEnergy() * (hit.getXPos() - x_mean) *
331 (hit.getXPos() - x_mean);
332 y_std += hit.getEnergy() * (hit.getYPos() - y_mean) *
333 (hit.getYPos() - y_mean);
334 z_std += hit.getEnergy() * (hit.getZPos() - z_mean) *
335 (hit.getZPos() - z_mean);
340 if (summed_det > 0.) {
341 x_std = sqrt(x_std / summed_det);
342 y_std = sqrt(y_std / summed_det);
343 z_std = sqrt(z_std / summed_det);
360 bdt_features.push_back(n_layers_hit);
361 bdt_features.push_back(x_std);
362 bdt_features.push_back(y_std);
363 bdt_features.push_back(z_std);
364 bdt_features.push_back(x_mean);
365 bdt_features.push_back(y_mean);
366 bdt_features.push_back(r_mean);
367 bdt_features.push_back(iso_hits);
368 bdt_features.push_back(iso_energy);
369 bdt_features.push_back(n_readout_hits);
370 bdt_features.push_back(hcal_energy);
371 bdt_features.push_back(r_mean_from_photon_track);
373 ldmx::ort::FloatArrays inputs({bdt_features});
375 rt_->run({feature_list_name_}, inputs, {
"probabilities"})[0].at(1);
379 for (
int i = 0; i < 10000; i++) {
380 double disc = 0.999 + (double(i) / 10000.) * (1. - 0.999);
382 0.999 + ((
double(i) + 0.5) / 10000.) * (1. - 0.999));
383 double disc_roc = 0.99 + (double(i) / 10000.) * (1. - 0.99);
386 0.999 + ((
double(i) + 0.5) / 10000.) * (1. - 0.999));
388 if (pred >= disc_roc) {
395 if (pred < bdt_cut_val_) {