Process the event and put new data products into it.
87 {
91 auto start = std::chrono::high_resolution_clock::now();
92 nevents_++;
93
94
96 ldmx::EcalGeometry::CONDITIONS_OBJECT_NAME);
97
98 std::vector<std::array<float, 3>> ele_p;
99 std::vector<std::array<float, 3>> ele_pos;
100 std::vector<bool> fiducial_in_tracker;
101
102 auto setup_finish = std::chrono::high_resolution_clock::now();
103 profiling_map_["setup"] +=
104 std::chrono::duration<float, std::milli>(setup_finish - start).count();
105
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164 if (recoil_from_tracking_) {
165 ldmx_log(trace) << " Get recoil tracks collection";
166
167
168 auto recoil_tracks{
169 event.getCollection<
ldmx::Track>(track_coll_name_, track_pass_name_)};
170
171 ldmx_log(trace) << " Propagate the recoil ele to the ECAL";
172 auto ele_track_states =
174 if (!ele_track_states.empty()) {
175 for (int i = 0; i < ele_track_states.size(); ++i) {
176 std::vector<float>& recoil_track_states_ecal = ele_track_states[i];
177 std::array<float, 3> recoil_pos;
178 std::array<float, 3> recoil_p;
179
180
181 if (!recoil_track_states_ecal.empty()) {
182 recoil_pos = {recoil_track_states_ecal[0],
183 recoil_track_states_ecal[1],
184 recoil_track_states_ecal[2]};
185 recoil_p = {(recoil_track_states_ecal[3]),
186 (recoil_track_states_ecal[4]),
187 (recoil_track_states_ecal[5])};
188 fiducial_in_tracker.push_back(true);
189 } else {
190 recoil_pos = {-9999.f, -9999.f, -9999.f};
191 recoil_p = {0.f, 0.f, 0.f};
192 fiducial_in_tracker.push_back(false);
193 ldmx_log(info) << " Electron trajectory is empty!";
194 }
195 ldmx_log(debug) << " Electron " << i + 1 << ": set recoil_p = ("
196 << recoil_p[0] << ", " << recoil_p[1] << ", "
197 << recoil_p[2] << ") and recoil_pos = ("
198 << recoil_pos[0] << ", " << recoil_pos[1] << ", "
199 << recoil_pos[2] << ")";
200 ele_p.push_back(recoil_p);
201 ele_pos.push_back(recoil_pos);
202 }
203 } else {
204 ldmx_log(info) << " No valid electron tracks found in recoil tracking "
205 "information";
206 }
207 }
208
209 auto recoil_electron_finish = std::chrono::high_resolution_clock::now();
210 profiling_map_["recoil_electron"] +=
211 std::chrono::duration<float, std::milli>(recoil_electron_finish -
212 setup_finish)
213 .count();
214
218
219 ldmx_log(trace) << " Get projected trajectories for electron and photon";
220
221 std::vector<std::vector<XYCoords>> ele_trajectories;
222 std::vector<float> ele_p_mag;
223 std::vector<float> ele_theta;
224
225 if (!ele_p.empty() && !ele_pos.empty()) {
226 for (int i = 0; i < ele_p.size(); ++i) {
227 std::array<float, 3>& recoil_p = ele_p[i];
228 std::array<float, 3>& recoil_pos = ele_pos[i];
229 std::vector<XYCoords> ele_trajectory;
230
231
232
233
234 if ((recoil_p[2] > 0.) && (recoil_pos[0] != -9999.)) {
235 ele_trajectory = getTrajectory(recoil_p, recoil_pos);
236 } else {
237 ldmx_log(trace) << "Ele trajectory cannot be determined, pZ = "
238 << recoil_p[2] << " X = " << recoil_pos[0];
239 }
240
241
242 float recoil_p_mag =
243 (recoil_p[2] > 0.)
244 ? sqrt((recoil_p[0] * recoil_p[0]) + (recoil_p[1] * recoil_p[1]) +
245 (recoil_p[2] * recoil_p[2]))
246 : -1.0;
247 float recoil_theta = recoil_p_mag > 0
248 ? acos(recoil_p[2] / recoil_p_mag) * 180.0 / M_PI
249 : -1.0;
250
251
252 ele_trajectories.push_back(ele_trajectory);
253 ele_p_mag.push_back(recoil_p_mag);
254 ele_theta.push_back(recoil_theta);
255
256 }
257 }
258
259 auto trajectories_finish = std::chrono::high_resolution_clock::now();
260 profiling_map_["trajectories"] +=
261 std::chrono::duration<float, std::milli>(trajectories_finish -
262 recoil_electron_finish)
263 .count();
264
268
269 ldmx_log(trace) << " Build recoil removal distances vector";
270 std::vector<float> rem_dist_values_bin_0(rem_dist_values_[0].begin() + 4,
271 rem_dist_values_[0].end());
272 std::vector<std::vector<float>> removal_distances;
273
274 if (!ele_trajectories.empty()) {
275 for (int k = 0; k < ele_p_mag.size(); ++k) {
276 float theta_min, theta_max, p_min, p_max;
277 bool inrange;
278 std::vector<float> rec_rem_dists = rem_dist_values_bin_0;
279 float& recoil_p_mag = ele_p_mag[k];
280 float& recoil_theta = ele_theta[k];
281
282
283 for (int i = 0; i < rem_dist_values_.size(); i++) {
284 theta_min = rem_dist_values_[i][0];
285 theta_max = rem_dist_values_[i][1];
286 p_min = rem_dist_values_[i][2];
287 p_max = rem_dist_values_[i][3];
288 inrange = true;
289
290 if (theta_min != -1.0) {
291 inrange = inrange && (recoil_theta >= theta_min);
292 }
293 if (theta_max != -1.0) {
294 inrange = inrange && (recoil_theta < theta_max);
295 }
296 if (p_min != -1.0) {
297 inrange = inrange && (recoil_p_mag >= p_min);
298 }
299 if (p_max != -1.0) {
300 inrange = inrange && (recoil_p_mag < p_max);
301 }
302 if (inrange) {
303 std::vector<float> rem_dist_values_bini(
304 rem_dist_values_[i].begin() + 4, rem_dist_values_[i].end());
305 rec_rem_dists = rem_dist_values_bini;
306 }
307 }
308 removal_distances.push_back(rec_rem_dists);
309 }
310 }
311
312 auto rem_dist_finish = std::chrono::high_resolution_clock::now();
313 profiling_map_["rem_dist"] += std::chrono::duration<float, std::milli>(
314 rem_dist_finish - trajectories_finish)
315 .count();
316
320
321
322 const std::vector<ldmx::EcalHit> ecal_rec_hits =
323 event.getCollection<
ldmx::EcalHit>(rec_coll_name_, rec_pass_name_);
324
325 std::vector<ldmx::EcalHit> ecal_rec_hits_inc;
326 std::vector<ldmx::EcalHit> ecal_rec_hits_exc;
327
328
329
330 if (!ele_trajectories.empty()) {
331 ldmx_log(trace) << " ======== EcalRecHitInc List (length"
332 << ecal_rec_hits_inc.size() << ") ========";
334 ecal_rec_hits) {
335
338 XYCoords xy_pair = std::make_pair(x, y);
339
340 bool include = true;
341 for (int i = 0; i < ele_trajectories.size(); ++i) {
342 std::vector<XYCoords>& ele_trajectory = ele_trajectories[i];
343 std::vector<float>& rec_rem_dists = removal_distances[i];
344
345 float dist_ele_traj =
346
347 ele_trajectory.size()
348 ? sqrt(pow((xy_pair.first - ele_trajectory[id.layer()].first),
349 2) +
350 pow((xy_pair.second - ele_trajectory[id.layer()].second),
351 2))
352 : -1.0;
353 if (dist_ele_traj == -1.0) {
354 ldmx_log(trace) << " ele_trajectory does not exist; KEEP";
355 continue;
356 } else if (dist_ele_traj <=
357 (rec_rem_dists[id.layer()])) {
358
359
360 ldmx_log(trace) << " dist_ele_traj = " << dist_ele_traj
361 << " <= " << rec_rem_dists[id.layer()] << "; DISCARD";
362 include = false;
363 } else {
364 ldmx_log(trace) << " dist_ele_traj = " << dist_ele_traj
365 << " > " << rec_rem_dists[id.layer()] << "; KEEP";
366 continue;
367 }
368 }
369
370
371 if (include) {
372 ecal_rec_hits_inc.emplace_back(hit);
373 } else {
374 ecal_rec_hits_exc.emplace_back(hit);
375 }
376
377 }
378 ldmx_log(trace) << " ======== END OF ecal_rec_hit List ========";
379 } else {
380 ecal_rec_hits_inc = ecal_rec_hits;
381 }
382 ldmx_log(info) << " Removed " << ecal_rec_hits_exc.size()
383 << " hits within recoil electron RoC; "
384 << ecal_rec_hits_inc.size() << " hits remaining of "
385 << ecal_rec_hits.size();
386
387
389
390 event.add(collection_name_excluded_, ecal_rec_hits_exc);
391
392 auto recoil_removal_finish = std::chrono::high_resolution_clock::now();
393 profiling_map_["recoil_removal"] +=
394 std::chrono::duration<float, std::milli>(recoil_removal_finish -
395 rem_dist_finish)
396 .count();
397
398 auto end = std::chrono::high_resolution_clock::now();
399 auto time_diff = end - start;
400 processing_time_ +=
401 std::chrono::duration<float, std::milli>(time_diff).count();
402
403}
std::vector< std::vector< float > > pTTrackProp(const ldmx::Tracks &tracks, int ele_count)
Return a vector of ele_count valid track states with the greatest transverse momentum.
const T & getCondition(const std::string &condition_name)
Access a conditions object for the current event.
std::tuple< double, double, double > getPosition(EcalID id) const
Get a cell's position from its ID number.
Stores reconstructed hit information from the ECAL.
Extension of DetectorID providing access to ECal layers and cell numbers in a hex grid.
Implementation of a track object.