1#include "Tracking/dqm/StraightTracksDQM.h"
6namespace tracking::dqm {
10 parameters.
get<std::string>(
"track_collection",
"LinearRecoilTracks");
11 truth_collection_ = parameters.
get<std::string>(
"truth_collection",
12 "LinearRecoilTruthTracks");
13 title_ = parameters.
get<std::string>(
"title",
"recoil_lin_trk_");
14 track_prob_cut_ = parameters.
get<
double>(
"trackProb_cut", 0.5);
15 subdetector_ = parameters.
get<std::string>(
"subdetector",
"Recoil");
16 measurement_collection_ = parameters.
get<std::string>(
17 "measurement_collection",
"DigiRecoilSimHits");
19 track_collection_events_passname_ =
20 parameters.
get<std::string>(
"track_collection_events_passname");
21 truth_collection_events_passname_ =
22 parameters.
get<std::string>(
"truth_collection_events_passname");
23 input_pass_name_ = parameters.
get<std::string>(
"input_pass_name");
25 ldmx_log(info) <<
"Track Collection " << track_collection_;
26 ldmx_log(info) <<
"Truth Collection " << truth_collection_;
30 ldmx_log(debug) <<
"DQM Reading in::" << track_collection_;
32 if (!event.
exists(track_collection_, track_collection_events_passname_)) {
33 ldmx_log(error) <<
"trackCollection " << track_collection_
38 const std::vector<ldmx::StraightTrack> tracks =
41 const std::vector<ldmx::Measurement> measurements =
46 if (event.
exists(truth_collection_, truth_collection_events_passname_)) {
47 truth_track_collection_ =
48 std::make_shared<std::vector<ldmx::StraightTrack>>(
51 do_truth_comparison_ =
true;
54 ldmx_log(debug) <<
"Do truth comparison::" << do_truth_comparison_;
56 if (do_truth_comparison_) {
57 sortTracks(tracks, unique_tracks_, duplicate_tracks_, fake_tracks_);
59 unique_tracks_ = tracks;
62 ldmx_log(debug) <<
"Filling histograms ";
67 ldmx_log(debug) <<
"Track Monitoring on Unique Tracks";
69 trackMonitoringUnique(unique_tracks_, measurements, title_,
true,
true);
71 ldmx_log(debug) <<
"Track Monitoring on duplicates and fakes";
74 trackMonitoring(duplicate_tracks_, measurements, title_ +
"dup_",
false);
75 trackMonitoring(fake_tracks_, measurements, title_ +
"fake_",
false);
78 unique_tracks_.clear();
79 duplicate_tracks_.clear();
83void StraightTracksDQM::trackMonitoring(
84 const std::vector<ldmx::StraightTrack>& tracks,
85 const std::vector<ldmx::Measurement>& measurements,
const std::string title,
86 const bool& do_detail) {
87 for (
auto& track : tracks) {
88 double trk_theta = track.getTheta();
89 double trk_phi = track.getPhi();
90 double track_state_loc0_target = track.getTargetX();
91 double track_state_loc1_target = track.getTargetY();
92 double track_state_loc0_ecal = track.getEcalLayer1X();
93 double track_state_loc1_ecal = track.getEcalLayer1Y();
94 int track_pdg_id = track.getPdgID();
96 double sigma_phi = phiAngleError(track.getSlopeX(), track.getCov());
98 thetaAngleError(track.getSlopeX(), track.getSlopeY(), track.getCov());
113 track.getChi2() / track.getNdf());
123void StraightTracksDQM::trackMonitoringUnique(
124 const std::vector<ldmx::StraightTrack>& tracks,
125 const std::vector<ldmx::Measurement>& measurements,
const std::string title,
126 const bool& do_detail,
const bool& do_truth) {
127 for (
auto& track : tracks) {
128 double trk_theta = track.getTheta();
129 double trk_phi = track.getPhi();
130 double track_state_loc0_target = track.getTargetX();
131 double track_state_loc1_target = track.getTargetY();
132 double track_state_loc0_ecal = track.getEcalLayer1X();
133 double track_state_loc1_ecal = track.getEcalLayer1Y();
134 int track_pdg_id = track.getPdgID();
136 const std::vector<double> cov = track.getCov();
137 double sigma_phi = phiAngleError(track.getSlopeX(), cov);
139 thetaAngleError(track.getSlopeX(), track.getSlopeY(), cov);
140 double sigma_loc0_target = std::sqrt(cov[4]);
141 double sigma_loc1_target = std::sqrt(cov[9]);
142 double sigma_loc0_ecal =
143 locError(cov.at(0), cov.at(4), cov.at(1), track.getEcalLayer1Z());
144 double sigma_loc1_ecal =
145 locError(cov.at(7), cov.at(9), cov.at(8), track.getEcalLayer1Z());
160 track.getChi2() / track.getNdf());
176 auto it = std::find_if(truth_track_collection_->begin(),
177 truth_track_collection_->end(),
179 return tt.getTrackID() == track.getTrackID();
182 double track_truth_prob = track.getTruthProb();
185 if (it != truth_track_collection_->end() &&
186 track_truth_prob >= track_prob_cut_) {
192 double truth_theta = truth_trk->getTheta();
193 double truth_phi = truth_trk->getPhi();
194 double truth_state_loc0_target = truth_trk->getTargetX();
195 double truth_state_loc1_target = truth_trk->getTargetY();
196 double truth_state_loc0_ecal = truth_trk->getEcalLayer1X();
197 double truth_state_loc1_ecal = truth_trk->getEcalLayer1Y();
198 int truth_pdg_id = truth_trk->getPdgID();
204 double res_phi = trk_phi - truth_phi;
205 double res_theta = trk_theta - truth_theta;
210 double pull_phi = res_phi / sigma_phi;
211 double pull_theta = res_theta / sigma_theta;
217 track_state_loc0_target - truth_state_loc0_target);
219 track_state_loc1_target - truth_state_loc1_target);
221 track_state_loc0_ecal - truth_state_loc0_ecal);
223 track_state_loc1_ecal - truth_state_loc1_ecal);
227 (track_state_loc0_target - truth_state_loc0_target) /
230 (track_state_loc1_target - truth_state_loc1_target) /
233 (track_state_loc0_ecal - truth_state_loc0_ecal) /
236 (track_state_loc1_ecal - truth_state_loc1_ecal) /
242 track_state_loc0_target - truth_state_loc0_target);
245 track_state_loc1_target - truth_state_loc1_target);
247 track_state_loc0_ecal - truth_state_loc0_ecal);
249 track_state_loc1_ecal - truth_state_loc1_ecal);
254 (track_state_loc0_target - truth_state_loc0_target) /
258 (track_state_loc1_target - truth_state_loc1_target) /
262 (track_state_loc0_ecal - truth_state_loc0_ecal) /
266 (track_state_loc1_ecal - truth_state_loc1_ecal) /
277void StraightTracksDQM::sortTracks(
278 const std::vector<ldmx::StraightTrack>& tracks,
279 std::vector<ldmx::StraightTrack>& unique_tracks,
280 std::vector<ldmx::StraightTrack>& duplicate_tracks,
281 std::vector<ldmx::StraightTrack>& fake_tracks) {
282 std::vector<ldmx::StraightTrack> sorted_tracks = tracks;
285 std::sort(sorted_tracks.begin(), sorted_tracks.end(),
287 return trk1.getTrackID() < trk2.getTrackID();
291 for (
size_t i = 0; i < sorted_tracks.size(); i++) {
292 if (sorted_tracks[i].getTruthProb() < track_prob_cut_)
293 fake_tracks.push_back(sorted_tracks[i]);
297 if (unique_tracks.size() == 0 ||
298 sorted_tracks[i].getTrackID() != sorted_tracks[i - 1].getTrackID()) {
299 unique_tracks.push_back(sorted_tracks[i]);
306 else if (sorted_tracks[i].getTruthProb() >
307 unique_tracks.back().getTruthProb()) {
308 duplicate_tracks.push_back(unique_tracks.back());
309 unique_tracks.back() = sorted_tracks[i];
314 duplicate_tracks.push_back(sorted_tracks[i]);
322 if ((unique_tracks.size() + duplicate_tracks.size() + fake_tracks.size()) !=
324 ldmx_log(error) <<
"Unique and duplicate track vectors do not add up to "
325 "original tracks vector";
330 ldmx_log(trace) <<
"Unique tracks:";
332 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
333 <<
", Truth Prob: " << track.getTruthProb();
335 ldmx_log(trace) <<
"Duplicate tracks:";
337 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
338 <<
", Truth Prob: " << track.getTruthProb();
340 ldmx_log(trace) <<
"Fake tracks:";
342 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
343 <<
", Truth Prob: " << track.getTruthProb();
348double StraightTracksDQM::thetaAngleError(
349 double m_x,
double m_y,
const std::vector<double>& covariance_vector) {
350 double sqrt_term = std::sqrt(1 + (m_x * m_x));
351 double sum_term = (1 + (m_x * m_x) + (m_y * m_y));
353 double dtheta_dmx = (-m_x * m_y) / (sqrt_term * sum_term);
354 double dtheta_dmy = (sqrt_term / sum_term);
356 double sigma_mx2 = covariance_vector[0];
357 double sigma_my2 = covariance_vector[7];
358 double cov_mx_my = covariance_vector[2];
360 double sigma_theta2 = (dtheta_dmx * dtheta_dmx * sigma_mx2) +
361 (dtheta_dmy * dtheta_dmy * sigma_my2) +
362 (2 * dtheta_dmx * dtheta_dmy * cov_mx_my);
364 return std::sqrt(sigma_theta2);
367double StraightTracksDQM::phiAngleError(
368 double m_x,
const std::vector<double>& covariance_vector) {
369 double sum_term = (1 + (m_x * m_x));
371 double sigma_mx = std::sqrt(covariance_vector[0]);
373 double sigma_phi = (sigma_mx / sum_term);
378double StraightTracksDQM::locError(
double var_slope,
double var_intercept,
379 double cov_slope_intercept,
double z_pos) {
380 return std::sqrt((z_pos * z_pos * var_slope) + var_intercept +
381 (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.