1#include "Tracking/dqm/StraightTracksDQM.h"
6#include "Tracking/Sim/TrackingUtils.h"
8namespace tracking::dqm {
12 parameters.
get<std::string>(
"track_collection",
"LinearRecoilTracks");
13 truth_collection_ = parameters.
get<std::string>(
"truth_collection",
14 "LinearRecoilTruthTracks");
15 title_ = parameters.
get<std::string>(
"title",
"recoil_lin_trk_");
16 track_prob_cut_ = parameters.
get<
double>(
"trackProb_cut", 0.5);
17 subdetector_ = parameters.
get<std::string>(
"subdetector",
"Recoil");
18 measurement_collection_ = parameters.
get<std::string>(
19 "measurement_collection",
"DigiRecoilSimHits");
21 track_collection_events_passname_ =
22 parameters.
get<std::string>(
"track_collection_events_passname");
23 truth_collection_events_passname_ =
24 parameters.
get<std::string>(
"truth_collection_events_passname");
25 input_pass_name_ = parameters.
get<std::string>(
"input_pass_name");
27 ldmx_log(info) <<
"Track Collection " << track_collection_;
28 ldmx_log(info) <<
"Truth Collection " << truth_collection_;
32 ldmx_log(debug) <<
"DQM Reading in::" << track_collection_;
34 if (!event.
exists(track_collection_, track_collection_events_passname_)) {
35 ldmx_log(error) <<
"trackCollection " << track_collection_
40 const std::vector<ldmx::StraightTrack> tracks =
43 const std::vector<ldmx::Measurement> measurements =
48 if (event.
exists(truth_collection_, truth_collection_events_passname_)) {
49 truth_track_collection_ =
50 std::make_shared<std::vector<ldmx::StraightTrack>>(
53 do_truth_comparison_ =
true;
56 ldmx_log(debug) <<
"Do truth comparison::" << do_truth_comparison_;
58 if (do_truth_comparison_) {
59 sortTracks(tracks, unique_tracks_, duplicate_tracks_, fake_tracks_);
61 unique_tracks_ = tracks;
64 ldmx_log(debug) <<
"Filling histograms ";
69 ldmx_log(debug) <<
"Track Monitoring on Unique Tracks";
71 trackMonitoringUnique(unique_tracks_, measurements, title_,
true,
true);
73 ldmx_log(debug) <<
"Track Monitoring on duplicates and fakes";
76 trackMonitoring(duplicate_tracks_, measurements, title_ +
"dup_",
false);
77 trackMonitoring(fake_tracks_, measurements, title_ +
"fake_",
false);
80 unique_tracks_.clear();
81 duplicate_tracks_.clear();
85void StraightTracksDQM::trackMonitoring(
86 const std::vector<ldmx::StraightTrack>& tracks,
87 const std::vector<ldmx::Measurement>& measurements,
const std::string title,
88 const bool& do_detail) {
89 for (
auto& track : tracks) {
90 double trk_theta = track.getTheta();
91 double trk_phi = track.getPhi();
92 double track_state_loc0_target = track.getTargetX();
93 double track_state_loc1_target = track.getTargetY();
94 double track_state_loc0_ecal = track.getEcalLayer1X();
95 double track_state_loc1_ecal = track.getEcalLayer1Y();
96 int track_pdg_id = track.getPdgID();
98 double sigma_phi = phiAngleError(track.getSlopeX(), track.getCov());
100 thetaAngleError(track.getSlopeX(), track.getSlopeY(), track.getCov());
115 track.getChi2() / track.getNdf());
125void StraightTracksDQM::trackMonitoringUnique(
126 const std::vector<ldmx::StraightTrack>& tracks,
127 const std::vector<ldmx::Measurement>& measurements,
const std::string title,
128 const bool& do_detail,
const bool& do_truth) {
129 for (
auto& track : tracks) {
130 double trk_theta = track.getTheta();
131 double trk_phi = track.getPhi();
132 double track_state_loc0_target = track.getTargetX();
133 double track_state_loc1_target = track.getTargetY();
134 double track_state_loc0_ecal = track.getEcalLayer1X();
135 double track_state_loc1_ecal = track.getEcalLayer1Y();
136 int track_pdg_id = track.getPdgID();
138 double sigma_phi = phiAngleError(track.getSlopeX(), track.getCov());
140 thetaAngleError(track.getSlopeX(), track.getSlopeY(), track.getCov());
141 double sigma_loc0_target = std::sqrt(track.getCov()[4]);
142 double sigma_loc1_target = std::sqrt(track.getCov()[9]);
143 double sigma_loc0_ecal =
144 locError(track.getCov()[0], track.getCov()[4], track.getCov()[1],
145 track.getEcalLayer1Z());
146 double sigma_loc1_ecal =
147 locError(track.getCov()[7], track.getCov()[9], track.getCov()[8],
148 track.getEcalLayer1Z());
163 track.getChi2() / track.getNdf());
179 auto it = std::find_if(truth_track_collection_->begin(),
180 truth_track_collection_->end(),
182 return tt.getTrackID() == track.getTrackID();
185 double track_truth_prob = track.getTruthProb();
188 if (it != truth_track_collection_->end() &&
189 track_truth_prob >= track_prob_cut_) {
195 double truth_theta = truth_trk->getTheta();
196 double truth_phi = truth_trk->getPhi();
197 double truth_state_loc0_target = truth_trk->getTargetX();
198 double truth_state_loc1_target = truth_trk->getTargetY();
199 double truth_state_loc0_ecal = truth_trk->getEcalLayer1X();
200 double truth_state_loc1_ecal = truth_trk->getEcalLayer1Y();
201 int truth_pdg_id = truth_trk->getPdgID();
207 double res_phi = trk_phi - truth_phi;
208 double res_theta = trk_theta - truth_theta;
213 double pull_phi = res_phi / sigma_phi;
214 double pull_theta = res_theta / sigma_theta;
220 track_state_loc0_target - truth_state_loc0_target);
222 track_state_loc1_target - truth_state_loc1_target);
224 track_state_loc0_ecal - truth_state_loc0_ecal);
226 track_state_loc1_ecal - truth_state_loc1_ecal);
230 (track_state_loc0_target - truth_state_loc0_target) /
233 (track_state_loc1_target - truth_state_loc1_target) /
236 (track_state_loc0_ecal - truth_state_loc0_ecal) /
239 (track_state_loc1_ecal - truth_state_loc1_ecal) /
245 track_state_loc0_target - truth_state_loc0_target);
248 track_state_loc1_target - truth_state_loc1_target);
250 track_state_loc0_ecal - truth_state_loc0_ecal);
252 track_state_loc1_ecal - truth_state_loc1_ecal);
257 (track_state_loc0_target - truth_state_loc0_target) /
261 (track_state_loc1_target - truth_state_loc1_target) /
265 (track_state_loc0_ecal - truth_state_loc0_ecal) /
269 (track_state_loc1_ecal - truth_state_loc1_ecal) /
280void StraightTracksDQM::sortTracks(
281 const std::vector<ldmx::StraightTrack>& tracks,
282 std::vector<ldmx::StraightTrack>& unique_tracks,
283 std::vector<ldmx::StraightTrack>& duplicate_tracks,
284 std::vector<ldmx::StraightTrack>& fake_tracks) {
285 std::vector<ldmx::StraightTrack> sorted_tracks = tracks;
288 std::sort(sorted_tracks.begin(), sorted_tracks.end(),
290 return trk1.getTrackID() < trk2.getTrackID();
294 for (
size_t i = 0; i < sorted_tracks.size(); i++) {
295 if (sorted_tracks[i].getTruthProb() < track_prob_cut_)
296 fake_tracks.push_back(sorted_tracks[i]);
300 if (unique_tracks.size() == 0 ||
301 sorted_tracks[i].getTrackID() != sorted_tracks[i - 1].getTrackID()) {
302 unique_tracks.push_back(sorted_tracks[i]);
309 else if (sorted_tracks[i].getTruthProb() >
310 unique_tracks.back().getTruthProb()) {
311 duplicate_tracks.push_back(unique_tracks.back());
312 unique_tracks.back() = sorted_tracks[i];
317 duplicate_tracks.push_back(sorted_tracks[i]);
325 if ((unique_tracks.size() + duplicate_tracks.size() + fake_tracks.size()) !=
327 ldmx_log(error) <<
"Unique and duplicate track vectors do not add up to "
328 "original tracks vector";
333 ldmx_log(trace) <<
"Unique tracks:";
335 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
336 <<
", Truth Prob: " << track.getTruthProb();
338 ldmx_log(trace) <<
"Duplicate tracks:";
340 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
341 <<
", Truth Prob: " << track.getTruthProb();
343 ldmx_log(trace) <<
"Fake tracks:";
345 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
346 <<
", Truth Prob: " << track.getTruthProb();
351double StraightTracksDQM::thetaAngleError(
352 double m_x,
double m_y,
const std::vector<double>& covariance_vector) {
353 double sqrt_term = std::sqrt(1 + (m_x * m_x));
354 double sum_term = (1 + (m_x * m_x) + (m_y * m_y));
356 double dtheta_dmx = (-m_x * m_y) / (sqrt_term * sum_term);
357 double dtheta_dmy = (sqrt_term / sum_term);
359 double sigma_mx2 = covariance_vector[0];
360 double sigma_my2 = covariance_vector[7];
361 double cov_mx_my = covariance_vector[2];
363 double sigma_theta2 = (dtheta_dmx * dtheta_dmx * sigma_mx2) +
364 (dtheta_dmy * dtheta_dmy * sigma_my2) +
365 (2 * dtheta_dmx * dtheta_dmy * cov_mx_my);
367 return std::sqrt(sigma_theta2);
370double StraightTracksDQM::phiAngleError(
371 double m_x,
const std::vector<double>& covariance_vector) {
372 double sum_term = (1 + (m_x * m_x));
374 double sigma_mx = std::sqrt(covariance_vector[0]);
376 double sigma_phi = (sigma_mx / sum_term);
381double StraightTracksDQM::locError(
double var_slope,
double var_intercept,
382 double cov_slope_intercept,
double z_pos) {
383 return std::sqrt((z_pos * z_pos * var_slope) + var_intercept +
384 (2 * z_pos * cov_slope_intercept));
#define DECLARE_ANALYZER(CLASS)
Macro which allows the framework to construct an analyzer given its name during configuration.
HistogramPool histograms_
helper object for making and filling histograms
Implements an event buffer system for storing event data.
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.
Class encapsulating parameters for configuring a processor.
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
void configure(framework::config::Parameters ¶meters) override
Callback for the EventProcessor to configure itself from the given set of parameters.
void analyze(const framework::Event &event) override
Process the event and make histograms or summaries.