87 "SimParticles", sim_particles_pass_name_)};
93 std::vector<double> gamma_p(3);
94 std::vector<double> gamma_x0(3);
95 if (recoil_from_tracking_) {
96 const auto &recoil_tracks{
97 event.getCollection<
ldmx::Track>(track_collection_, track_pass_name_)};
99 for (
auto &track : recoil_tracks) {
101 if (track.q() == 1 && track.getNhits() == 5) {
102 gamma_x0 = track.getPosition();
103 gamma_p[0] = -1. * track.getMomentum()[0];
104 gamma_p[1] = -1. * track.getMomentum()[1];
105 gamma_p[2] = beam_energy_mev_ - track.getMomentum()[2];
109 if (event.
exists(sp_collection_, sp_pass_name_)) {
111 sp_collection_, sp_pass_name_);
112 for (
auto const &it : particle_map) {
113 for (
auto const &sphit : target_sp_hits) {
114 if (sphit.getPosition()[2] > 0) {
115 if (it.first == sphit.getTrackID()) {
116 if (it.second.getPdgID() == 11 &&
117 inList(it.second.getParents(), 0)) {
121 std::vector<float> x0_float = sphit.getPosition();
122 std::vector<double> x0_double(x0_float.begin(), x0_float.end());
123 gamma_x0 = x0_double;
124 gamma_p[0] = -1. * sphit.getMomentum()[0];
125 gamma_p[1] = -1. * sphit.getMomentum()[1];
126 gamma_p[2] = beam_energy_mev_ - sphit.getMomentum()[2];
136 const auto &hcal_rec_hits =
137 event.getCollection<
ldmx::HcalHit>(rec_coll_name_, rec_pass_name_);
140 std::vector<int> layers_hit;
142 if (hit.getEnergy() > 0.) {
144 if (det_id.getSection() != 0) {
147 n_readout_hits_ += 1;
148 double hit_x = hit.getXPos();
149 double hit_y = hit.getYPos();
150 double hit_z = hit.getZPos();
151 double hit_r = sqrt(hit_x * hit_x + hit_y * hit_y);
153 summed_det_ += hit.getEnergy();
155 x_mean_ += hit_x * hit.getEnergy();
156 y_mean_ += hit_y * hit.getEnergy();
157 z_mean += hit_z * hit.getEnergy();
158 r_mean_ += hit_r * hit.getEnergy();
161 if (!(std::find(layers_hit.begin(), layers_hit.end(),
167 gamma_x0[0] + (hit_z - gamma_x0[2]) * gamma_p[0] / gamma_p[2];
169 gamma_x0[1] + (hit_z - gamma_x0[2]) * gamma_p[1] / gamma_p[2];
171 r_mean_from_photon_track_ +=
172 hit.getEnergy() * sqrt((hit_x - proj_x) * (hit_x - proj_x) +
173 (hit_y - proj_y) * (hit_y - proj_y));
176 double closest_point = 9999.;
178 if (hit2.getEnergy() > 0.) {
184 if (hit.isOrientationX()) {
185 if (abs(hit2.getYPos() - hit_y) > 0) {
186 if (abs(hit2.getYPos() - hit_y) < closest_point) {
187 closest_point = abs(hit2.getYPos() - hit_y);
191 if (hit.isOrientationY()) {
192 if (abs(hit2.getXPos() - hit_x) > 0) {
193 if (abs(hit2.getXPos() - hit_x) < closest_point) {
194 closest_point = abs(hit2.getXPos() - hit_x);
201 if (closest_point > 50.) {
203 iso_energy_ += hit.getEnergy();
208 n_layers_hit_ = layers_hit.size();
210 if (summed_det_ > 0.) {
211 x_mean_ /= summed_det_;
212 y_mean_ /= summed_det_;
213 z_mean /= summed_det_;
214 r_mean_ /= summed_det_;
216 r_mean_from_photon_track_ /= summed_det_;
220 if (hit.getEnergy() > 0.) {
222 if (det_id.getSection() == 0) {
223 x_std_ += hit.getEnergy() * (hit.getXPos() - x_mean_) *
224 (hit.getXPos() - x_mean_);
225 y_std_ += hit.getEnergy() * (hit.getYPos() - y_mean_) *
226 (hit.getYPos() - y_mean_);
227 z_std_ += hit.getEnergy() * (hit.getZPos() - z_mean) *
228 (hit.getZPos() - z_mean);
233 if (summed_det_ > 0.) {
234 x_std_ = sqrt(x_std_ / summed_det_);
235 y_std_ = sqrt(y_std_ / summed_det_);
236 z_std_ = sqrt(z_std_ / summed_det_);
239 result.setVariables(n_layers_hit_, x_std_, y_std_, z_std_, x_mean_, y_mean_,
240 r_mean_, iso_hits_, iso_energy_, n_readout_hits_,
241 summed_det_, r_mean_from_photon_track_);
243 buildBDTFeatureVector(result);
245 ldmx::ort::FloatArrays inputs({bdt_features_});
247 rt_->run({feature_list_name_}, inputs, {
"probabilities"})[0].at(1);
248 ldmx_log(info) <<
" Visibles BDT was ran, score is " << pred;
250 event.add(collection_name_, result);
Class representing a simulated particle.