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 const std::vector<double> cov = track.getCov();
139 double sigma_phi = phiAngleError(track.getSlopeX(), cov);
141 thetaAngleError(track.getSlopeX(), track.getSlopeY(), cov);
142 double sigma_loc0_target = std::sqrt(cov[4]);
143 double sigma_loc1_target = std::sqrt(cov[9]);
144 double sigma_loc0_ecal =
145 locError(cov.at(0), cov.at(4), cov.at(1), track.getEcalLayer1Z());
146 double sigma_loc1_ecal =
147 locError(cov.at(7), cov.at(9), cov.at(8), track.getEcalLayer1Z());
162 track.getChi2() / track.getNdf());
178 auto it = std::find_if(truth_track_collection_->begin(),
179 truth_track_collection_->end(),
181 return tt.getTrackID() == track.getTrackID();
184 double track_truth_prob = track.getTruthProb();
187 if (it != truth_track_collection_->end() &&
188 track_truth_prob >= track_prob_cut_) {
194 double truth_theta = truth_trk->getTheta();
195 double truth_phi = truth_trk->getPhi();
196 double truth_state_loc0_target = truth_trk->getTargetX();
197 double truth_state_loc1_target = truth_trk->getTargetY();
198 double truth_state_loc0_ecal = truth_trk->getEcalLayer1X();
199 double truth_state_loc1_ecal = truth_trk->getEcalLayer1Y();
200 int truth_pdg_id = truth_trk->getPdgID();
206 double res_phi = trk_phi - truth_phi;
207 double res_theta = trk_theta - truth_theta;
212 double pull_phi = res_phi / sigma_phi;
213 double pull_theta = res_theta / sigma_theta;
219 track_state_loc0_target - truth_state_loc0_target);
221 track_state_loc1_target - truth_state_loc1_target);
223 track_state_loc0_ecal - truth_state_loc0_ecal);
225 track_state_loc1_ecal - truth_state_loc1_ecal);
229 (track_state_loc0_target - truth_state_loc0_target) /
232 (track_state_loc1_target - truth_state_loc1_target) /
235 (track_state_loc0_ecal - truth_state_loc0_ecal) /
238 (track_state_loc1_ecal - truth_state_loc1_ecal) /
244 track_state_loc0_target - truth_state_loc0_target);
247 track_state_loc1_target - truth_state_loc1_target);
249 track_state_loc0_ecal - truth_state_loc0_ecal);
251 track_state_loc1_ecal - truth_state_loc1_ecal);
256 (track_state_loc0_target - truth_state_loc0_target) /
260 (track_state_loc1_target - truth_state_loc1_target) /
264 (track_state_loc0_ecal - truth_state_loc0_ecal) /
268 (track_state_loc1_ecal - truth_state_loc1_ecal) /
279void StraightTracksDQM::sortTracks(
280 const std::vector<ldmx::StraightTrack>& tracks,
281 std::vector<ldmx::StraightTrack>& unique_tracks,
282 std::vector<ldmx::StraightTrack>& duplicate_tracks,
283 std::vector<ldmx::StraightTrack>& fake_tracks) {
284 std::vector<ldmx::StraightTrack> sorted_tracks = tracks;
287 std::sort(sorted_tracks.begin(), sorted_tracks.end(),
289 return trk1.getTrackID() < trk2.getTrackID();
293 for (
size_t i = 0; i < sorted_tracks.size(); i++) {
294 if (sorted_tracks[i].getTruthProb() < track_prob_cut_)
295 fake_tracks.push_back(sorted_tracks[i]);
299 if (unique_tracks.size() == 0 ||
300 sorted_tracks[i].getTrackID() != sorted_tracks[i - 1].getTrackID()) {
301 unique_tracks.push_back(sorted_tracks[i]);
308 else if (sorted_tracks[i].getTruthProb() >
309 unique_tracks.back().getTruthProb()) {
310 duplicate_tracks.push_back(unique_tracks.back());
311 unique_tracks.back() = sorted_tracks[i];
316 duplicate_tracks.push_back(sorted_tracks[i]);
324 if ((unique_tracks.size() + duplicate_tracks.size() + fake_tracks.size()) !=
326 ldmx_log(error) <<
"Unique and duplicate track vectors do not add up to "
327 "original tracks vector";
332 ldmx_log(trace) <<
"Unique tracks:";
334 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
335 <<
", Truth Prob: " << track.getTruthProb();
337 ldmx_log(trace) <<
"Duplicate tracks:";
339 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
340 <<
", Truth Prob: " << track.getTruthProb();
342 ldmx_log(trace) <<
"Fake tracks:";
344 ldmx_log(trace) <<
"Track ID: " << track.getTrackID()
345 <<
", Truth Prob: " << track.getTruthProb();
350double StraightTracksDQM::thetaAngleError(
351 double m_x,
double m_y,
const std::vector<double>& covariance_vector) {
352 double sqrt_term = std::sqrt(1 + (m_x * m_x));
353 double sum_term = (1 + (m_x * m_x) + (m_y * m_y));
355 double dtheta_dmx = (-m_x * m_y) / (sqrt_term * sum_term);
356 double dtheta_dmy = (sqrt_term / sum_term);
358 double sigma_mx2 = covariance_vector[0];
359 double sigma_my2 = covariance_vector[7];
360 double cov_mx_my = covariance_vector[2];
362 double sigma_theta2 = (dtheta_dmx * dtheta_dmx * sigma_mx2) +
363 (dtheta_dmy * dtheta_dmy * sigma_my2) +
364 (2 * dtheta_dmx * dtheta_dmy * cov_mx_my);
366 return std::sqrt(sigma_theta2);
369double StraightTracksDQM::phiAngleError(
370 double m_x,
const std::vector<double>& covariance_vector) {
371 double sum_term = (1 + (m_x * m_x));
373 double sigma_mx = std::sqrt(covariance_vector[0]);
375 double sigma_phi = (sigma_mx / sum_term);
380double StraightTracksDQM::locError(
double var_slope,
double var_intercept,
381 double cov_slope_intercept,
double z_pos) {
382 return std::sqrt((z_pos * z_pos * var_slope) + var_intercept +
383 (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.