1#include "Tracking/dqm/StraightTracksDQM.h"
6#include "Tracking/Sim/TrackingUtils.h"
8namespace tracking::dqm {
11 track_collection_ = parameters.getParameter<std::string>(
12 "track_collection",
"LinearRecoilTracks");
13 truth_collection_ = parameters.getParameter<std::string>(
14 "truth_collection",
"LinearRecoilTruthTracks");
15 title_ = parameters.getParameter<std::string>(
"title",
"recoil_lin_trk_");
16 track_prob_cut_ = parameters.getParameter<
double>(
"trackProb_cut", 0.5);
17 subdetector_ = parameters.getParameter<std::string>(
"subdetector",
"Recoil");
18 measurement_collection_ = parameters.getParameter<std::string>(
19 "measurement_collection",
"DigiRecoilSimHits");
21 parameters.getParameter<std::string>(
"input_pass_name",
"");
23 ldmx_log(info) <<
"Track Collection " << track_collection_;
24 ldmx_log(info) <<
"Truth Collection " << truth_collection_;
28 ldmx_log(debug) <<
"DQM Reading in::" << track_collection_;
30 if (!event.
exists(track_collection_)) {
31 ldmx_log(error) <<
"trackCollection " << track_collection_
36 const std::vector<ldmx::StraightTrack> tracks =
39 const std::vector<ldmx::Measurement> measurements =
44 if (event.
exists(truth_collection_)) {
45 truth_track_collection_ =
46 std::make_shared<std::vector<ldmx::StraightTrack>>(
49 do_truth_comparison_ =
true;
52 ldmx_log(debug) <<
"Do truth comparison::" << do_truth_comparison_;
54 if (do_truth_comparison_) {
55 sortTracks(tracks, unique_tracks_, duplicate_tracks_, fake_tracks_);
57 unique_tracks_ = tracks;
60 ldmx_log(debug) <<
"Filling histograms ";
65 ldmx_log(debug) <<
"Track Monitoring on Unique Tracks";
67 trackMonitoringUnique(unique_tracks_, measurements, title_,
true,
true);
69 ldmx_log(debug) <<
"Track Monitoring on duplicates and fakes";
72 trackMonitoring(duplicate_tracks_, measurements, title_ +
"dup_",
false);
73 trackMonitoring(fake_tracks_, measurements, title_ +
"fake_",
false);
76 unique_tracks_.clear();
77 duplicate_tracks_.clear();
81void StraightTracksDQM::trackMonitoring(
82 const std::vector<ldmx::StraightTrack>& tracks,
83 const std::vector<ldmx::Measurement>& measurements,
const std::string title,
84 const bool& do_detail) {
85 for (
auto& track : tracks) {
86 double trk_theta = track.getTheta();
87 double trk_phi = track.getPhi();
88 double track_state_loc0_target = track.getTargetX();
89 double track_state_loc1_target = track.getTargetY();
90 double track_state_loc0_ecal = track.getEcalLayer1X();
91 double track_state_loc1_ecal = track.getEcalLayer1Y();
92 int track_pdgID = track.getPdgID();
94 double sigma_phi = phiAngleError(track.getSlopeX(), track.getCov());
96 thetaAngleError(track.getSlopeX(), track.getSlopeY(), track.getCov());
111 track.getChi2() / track.getNdf());
121void StraightTracksDQM::trackMonitoringUnique(
122 const std::vector<ldmx::StraightTrack>& tracks,
123 const std::vector<ldmx::Measurement>& measurements,
const std::string title,
124 const bool& do_detail,
const bool& do_truth) {
125 for (
auto& track : tracks) {
126 double trk_theta = track.getTheta();
127 double trk_phi = track.getPhi();
128 double track_state_loc0_target = track.getTargetX();
129 double track_state_loc1_target = track.getTargetY();
130 double track_state_loc0_ecal = track.getEcalLayer1X();
131 double track_state_loc1_ecal = track.getEcalLayer1Y();
132 int track_pdgID = track.getPdgID();
134 double sigma_phi = phiAngleError(track.getSlopeX(), track.getCov());
136 thetaAngleError(track.getSlopeX(), track.getSlopeY(), track.getCov());
137 double sigma_loc0_target = std::sqrt(track.getCov()[4]);
138 double sigma_loc1_target = std::sqrt(track.getCov()[9]);
139 double sigma_loc0_ecal =
140 locError(track.getCov()[0], track.getCov()[4], track.getCov()[1],
141 track.getEcalLayer1Z());
142 double sigma_loc1_ecal =
143 locError(track.getCov()[7], track.getCov()[9], track.getCov()[8],
144 track.getEcalLayer1Z());
159 track.getChi2() / track.getNdf());
175 auto it = std::find_if(truth_track_collection_->begin(),
176 truth_track_collection_->end(),
178 return tt.getTrackID() == track.getTrackID();
181 double track_truth_prob = track.getTruthProb();
184 if (it != truth_track_collection_->end() &&
185 track_truth_prob >= track_prob_cut_) {
191 double truth_theta = truth_trk->getTheta();
192 double truth_phi = truth_trk->getPhi();
193 double truth_state_loc0_target = truth_trk->getTargetX();
194 double truth_state_loc1_target = truth_trk->getTargetY();
195 double truth_state_loc0_ecal = truth_trk->getEcalLayer1X();
196 double truth_state_loc1_ecal = truth_trk->getEcalLayer1Y();
197 int truth_pdgID = truth_trk->getPdgID();
203 double res_phi = trk_phi - truth_phi;
204 double res_theta = trk_theta - truth_theta;
209 double pull_phi = res_phi / sigma_phi;
210 double pull_theta = res_theta / sigma_theta;
216 track_state_loc0_target - truth_state_loc0_target);
218 track_state_loc1_target - truth_state_loc1_target);
220 track_state_loc0_ecal - truth_state_loc0_ecal);
222 track_state_loc1_ecal - truth_state_loc1_ecal);
226 (track_state_loc0_target - truth_state_loc0_target) /
229 (track_state_loc1_target - truth_state_loc1_target) /
232 (track_state_loc0_ecal - truth_state_loc0_ecal) /
235 (track_state_loc1_ecal - truth_state_loc1_ecal) /
241 track_state_loc0_target - truth_state_loc0_target);
244 track_state_loc1_target - truth_state_loc1_target);
246 track_state_loc0_ecal - truth_state_loc0_ecal);
248 track_state_loc1_ecal - truth_state_loc1_ecal);
253 (track_state_loc0_target - truth_state_loc0_target) /
257 (track_state_loc1_target - truth_state_loc1_target) /
261 (track_state_loc0_ecal - truth_state_loc0_ecal) /
265 (track_state_loc1_ecal - truth_state_loc1_ecal) /
276void StraightTracksDQM::sortTracks(
277 const std::vector<ldmx::StraightTrack>& tracks,
278 std::vector<ldmx::StraightTrack>& unique_tracks,
279 std::vector<ldmx::StraightTrack>& duplicate_tracks,
280 std::vector<ldmx::StraightTrack>& fake_tracks) {
281 std::vector<ldmx::StraightTrack> sorted_tracks = tracks;
284 std::sort(sorted_tracks.begin(), sorted_tracks.end(),
286 return trk1.getTrackID() < trk2.getTrackID();
290 for (
size_t i = 0; i < sorted_tracks.size(); i++) {
291 if (sorted_tracks[i].getTruthProb() < track_prob_cut_)
292 fake_tracks.push_back(sorted_tracks[i]);
296 if (unique_tracks.size() == 0 ||
297 sorted_tracks[i].getTrackID() != sorted_tracks[i - 1].getTrackID()) {
298 unique_tracks.push_back(sorted_tracks[i]);
305 else if (sorted_tracks[i].getTruthProb() >
306 unique_tracks.back().getTruthProb()) {
307 duplicate_tracks.push_back(unique_tracks.back());
308 unique_tracks.back() = sorted_tracks[i];
313 duplicate_tracks.push_back(sorted_tracks[i]);
321 if ((unique_tracks.size() + duplicate_tracks.size() + fake_tracks.size()) !=
323 ldmx_log(error) <<
"Unique and duplicate track vectors do not add up to "
324 "original tracks vector";
329 ldmx_log(trace) <<
"Unique tracks:";
331 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
332 <<
", Truth Prob: " << track.getTruthProb();
334 ldmx_log(trace) <<
"Duplicate tracks:";
336 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
337 <<
", Truth Prob: " << track.getTruthProb();
339 ldmx_log(trace) <<
"Fake tracks:";
341 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
342 <<
", Truth Prob: " << track.getTruthProb();
347double StraightTracksDQM::thetaAngleError(
348 double m_x,
double m_y,
const std::vector<double>& covariance_vector) {
349 double sqrt_term = std::sqrt(1 + (m_x * m_x));
350 double sum_term = (1 + (m_x * m_x) + (m_y * m_y));
352 double dtheta_dmx = (-m_x * m_y) / (sqrt_term * sum_term);
353 double dtheta_dmy = (sqrt_term / sum_term);
355 double sigma_mx2 = covariance_vector[0];
356 double sigma_my2 = covariance_vector[7];
357 double cov_mx_my = covariance_vector[2];
359 double sigma_theta2 = (dtheta_dmx * dtheta_dmx * sigma_mx2) +
360 (dtheta_dmy * dtheta_dmy * sigma_my2) +
361 (2 * dtheta_dmx * dtheta_dmy * cov_mx_my);
363 return std::sqrt(sigma_theta2);
366double StraightTracksDQM::phiAngleError(
367 double m_x,
const std::vector<double>& covariance_vector) {
368 double sum_term = (1 + (m_x * m_x));
370 double sigma_mx = std::sqrt(covariance_vector[0]);
372 double sigma_phi = (sigma_mx / sum_term);
377double StraightTracksDQM::locError(
double var_slope,
double var_intercept,
378 double cov_slope_intercept,
double z_pos) {
379 return std::sqrt((z_pos * z_pos * var_slope) + var_intercept +
380 (2 * z_pos * cov_slope_intercept));
#define DECLARE_ANALYZER_NS(NS, CLASS)
Macro which allows the framework to construct an analyzer given its name during configuration.
HistogramHelper histograms_
Interface class 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 double &val)
Fill a 1D histogram.
Class encapsulating parameters for configuring a processor.
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.