1#include "Tracking/Reco/Vertexer.h"
20void Vertexer::onProcessStart() {
28 h_delta_d0_ =
new TH1F(
"h_delta_d0",
"h_delta_d0", 400, d0min, d0max);
29 h_delta_z0_ =
new TH1F(
"h_delta_z0",
"h_delta_z0", 200, z0min, z0max);
30 h_delta_p_ =
new TH1F(
"h_delta_p",
"h_delta_p", 200, -1, 4);
32 h_delta_phi_ =
new TH1F(
"h_delta_phi",
"h_delta_phi", 400, -0.2, 0.2);
33 h_delta_theta_ =
new TH1F(
"h_delta_theta",
"h_delta_theta", 200, -0.1, 0.1);
35 h_delta_d0_vs_recoil_p_ =
36 new TH2F(
"h_delta_d0_vs_recoil_p",
"h_delta_d0_vs_recoil_p", 200, 0, 5,
38 h_delta_z0_vs_recoil_p_ =
39 new TH2F(
"h_delta_z0_vs_recoil_p",
"h_delta_z0_vs_recoil_p", 200, 0, 5,
43 new TH2F(
"h_td0_vs_rd0",
"h_td0_vs_rd0", 100, -40, 40, 100, -40, 40);
45 new TH2F(
"h_tz0_vs_rz0",
"h_tz0_vs_rz0", 100, -40, 40, 100, -40, 40);
47 bctx_ = Acts::MagneticFieldContext();
60 sp_interpolated_b_field_ =
61 std::make_shared<InterpolatedMagneticField3>(loadDefaultBField(
62 field_map_, defaultTransformPos, defaultTransformBField));
65 Acts::Vector3 b_field(0., 0., -1.5 * Acts::UnitConstants::T);
66 b_field_ = std::make_shared<Acts::ConstantBField>(b_field);
68 std::cout <<
"Check if nullptr::" << sp_interpolated_b_field_.get()
75 auto&& stepper_const = Acts::EigenStepper<>{b_field_};
76 propagator_ = std::make_shared<VoidPropagator>(stepper_const);
81 field_map_ = parameters.
get<std::string>(
"field_map");
83 trk_c_name_1_ = parameters.
get<std::string>(
"trk_c_name_1",
"TaggerTracks");
84 trk_c_name_2_ = parameters.
get<std::string>(
"trk_c_name_2",
"RecoilTracks");
85 input_pass_name_ = parameters.
get<std::string>(
"input_pass_name");
98 const auto& tracks_1 =
99 event.getCollection<
ldmx::Track>(trk_c_name_1_, input_pass_name_);
100 const auto& tracks_2 =
101 event.getCollection<
ldmx::Track>(trk_c_name_2_, input_pass_name_);
103 ldmx_log(debug) <<
"Retrieved track collections" << std::endl
104 <<
"Track 1 size:" << tracks_1.size() << std::endl
105 <<
"Track 2 size:" << tracks_2.size() << std::endl;
107 if (tracks_1.size() < 1 || tracks_2.size() < 1)
return;
109 std::vector<Acts::BoundTrackParameters> billoir_tracks_1, billoir_tracks_2;
113 Acts::Vector3 perigee_acts = tracking::sim::utils::ldmx2Acts(Acts::Vector3(
114 tracks_1.front().getPerigeeX(), tracks_1.front().getPerigeeY(),
115 tracks_1.front().getPerigeeZ()));
116 std::shared_ptr<Acts::PerigeeSurface> perigee_surface =
117 Acts::Surface::makeShared<Acts::PerigeeSurface>(perigee_acts);
120 taggerRecoilMonitoring(tracks_1, tracks_2);
126 for (
auto& trk : tracks_1) {
127 billoir_tracks_1.push_back(
128 tracking::sim::utils::boundTrackParameters(trk, perigee_surface));
131 for (
auto& trk : tracks_2) {
132 billoir_tracks_2.push_back(
133 tracking::sim::utils::boundTrackParameters(trk, perigee_surface));
137 std::vector<Acts::Vertex> fit_vertices;
139 for (
auto& b_trk_1 : billoir_tracks_1) {
140 std::vector<const Acts::BoundTrackParameters*> fit_tracks_ptr;
142 for (
auto& b_trk_2 : billoir_tracks_2) {
143 fit_tracks_ptr.push_back(&b_trk_1);
144 fit_tracks_ptr.push_back(&b_trk_2);
146 ldmx_log(debug) <<
"Calling vertex fitter" << std::endl
147 <<
"Track 1 parameters" << std::endl
148 << b_trk_1 << std::endl
149 <<
"Track 2 parameters" << std::endl
150 << b_trk_2 << std::endl;
166 ldmx_log(warn) <<
"Vertex fit failed" << std::endl;
174void Vertexer::onProcessEnd() {
175 ldmx_log(info) <<
"Reconstructed " << nvertices_ <<
" vertices over "
176 << nreconstructable_ <<
" reconstructable" << std::endl;
178 TFile* outfile =
new TFile((getName() +
".root").c_str(),
"RECREATE");
181 h_delta_d0_->Write();
182 h_delta_z0_->Write();
184 h_delta_phi_->Write();
185 h_delta_theta_->Write();
187 h_delta_d0_vs_recoil_p_->Write();
188 h_delta_z0_vs_recoil_p_->Write();
190 h_td0_vs_rd0_->Write();
191 h_tz0_vs_rz0_->Write();
197void Vertexer::taggerRecoilMonitoring(
198 const std::vector<ldmx::Track>& tagger_tracks,
199 const std::vector<ldmx::Track>& recoil_tracks) {
204 if (tagger_tracks.size() != 1 || recoil_tracks.size() != 1)
return;
216 t_p = t_trk.getCharge() / t_trk.getQoP();
217 r_p = r_trk.getCharge() / r_trk.getQoP();
219 h_delta_d0_->Fill(t_trk.getD0() - r_trk.getD0());
220 h_delta_z0_->Fill(t_trk.getZ0() - r_trk.getZ0());
221 h_delta_p_->Fill(t_p - r_p);
222 h_delta_phi_->Fill(t_trk.getPhi() - r_trk.getPhi());
223 h_delta_theta_->Fill(t_trk.getTheta() - r_trk.getTheta());
227 h_delta_d0_vs_recoil_p_->Fill(r_p, t_trk.getD0() - r_trk.getD0());
228 h_delta_z0_vs_recoil_p_->Fill(r_p, t_trk.getZ0() - r_trk.getZ0());
231 h_td0_vs_rd0_->Fill(r_trk.getD0(), t_trk.getD0());
232 h_tz0_vs_rz0_->Fill(r_trk.getZ0(), t_trk.getZ0());
#define DECLARE_PRODUCER(CLASS)
Macro which allows the framework to construct a producer given its name during configuration.
Implements an event buffer system for storing event data.
Class which represents the process under execution.
Base class for a module which produces a data product.
Class encapsulating parameters for configuring a processor.
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Implementation of a track object.
All classes in the ldmx-sw project use this namespace.
The measurement calibrator can be a function or a class/struct able to retrieve the sim hits containe...