1#include "Tracking/Reco/Vertexer.h"
3#include "Acts/Definitions/Units.hpp"
4#include "Acts/Surfaces/PerigeeSurface.hpp"
5#include "Acts/Vertexing/Vertex.hpp"
7#include "Tracking/Sim/TrackingUtils.h"
22void Vertexer::onProcessStart() {
30 h_delta_d0_ =
new TH1F(
"h_delta_d0",
"h_delta_d0", 400, d0min, d0max);
31 h_delta_z0_ =
new TH1F(
"h_delta_z0",
"h_delta_z0", 200, z0min, z0max);
32 h_delta_p_ =
new TH1F(
"h_delta_p",
"h_delta_p", 200, -1, 4);
34 h_delta_phi_ =
new TH1F(
"h_delta_phi",
"h_delta_phi", 400, -0.2, 0.2);
35 h_delta_theta_ =
new TH1F(
"h_delta_theta",
"h_delta_theta", 200, -0.1, 0.1);
37 h_delta_d0_vs_recoil_p_ =
38 new TH2F(
"h_delta_d0_vs_recoil_p",
"h_delta_d0_vs_recoil_p", 200, 0, 5,
40 h_delta_z0_vs_recoil_p_ =
41 new TH2F(
"h_delta_z0_vs_recoil_p",
"h_delta_z0_vs_recoil_p", 200, 0, 5,
45 new TH2F(
"h_td0_vs_rd0",
"h_td0_vs_rd0", 100, -40, 40, 100, -40, 40);
47 new TH2F(
"h_tz0_vs_rz0",
"h_tz0_vs_rz0", 100, -40, 40, 100, -40, 40);
49 bctx_ = Acts::MagneticFieldContext();
62 sp_interpolated_b_field_ =
63 std::make_shared<InterpolatedMagneticField3>(loadDefaultBField(
64 field_map_, defaultTransformPos, defaultTransformBField));
67 Acts::Vector3 b_field(0., 0., -1.5 * Acts::UnitConstants::T);
68 b_field_ = std::make_shared<Acts::ConstantBField>(b_field);
70 std::cout <<
"Check if nullptr::" << sp_interpolated_b_field_.get()
77 auto&& stepper_const = Acts::EigenStepper<>{b_field_};
78 propagator_ = std::make_shared<VoidPropagator>(stepper_const);
83 field_map_ = parameters.
get<std::string>(
"field_map");
85 trk_c_name_1_ = parameters.
get<std::string>(
"trk_c_name_1",
"TaggerTracks");
86 trk_c_name_2_ = parameters.
get<std::string>(
"trk_c_name_2",
"RecoilTracks");
87 input_pass_name_ = parameters.
get<std::string>(
"input_pass_name");
100 const auto& tracks_1 =
101 event.getCollection<
ldmx::Track>(trk_c_name_1_, input_pass_name_);
102 const auto& tracks_2 =
103 event.getCollection<
ldmx::Track>(trk_c_name_2_, input_pass_name_);
105 ldmx_log(debug) <<
"Retrieved track collections" << std::endl
106 <<
"Track 1 size:" << tracks_1.size() << std::endl
107 <<
"Track 2 size:" << tracks_2.size() << std::endl;
109 if (tracks_1.size() < 1 || tracks_2.size() < 1)
return;
111 std::vector<Acts::BoundTrackParameters> billoir_tracks_1, billoir_tracks_2;
115 Acts::Vector3 perigee_acts = tracking::sim::utils::ldmx2Acts(Acts::Vector3(
116 tracks_1.front().getPerigeeX(), tracks_1.front().getPerigeeY(),
117 tracks_1.front().getPerigeeZ()));
118 std::shared_ptr<Acts::PerigeeSurface> perigee_surface =
119 Acts::Surface::makeShared<Acts::PerigeeSurface>(perigee_acts);
122 taggerRecoilMonitoring(tracks_1, tracks_2);
128 for (
auto& trk : tracks_1) {
129 billoir_tracks_1.push_back(
130 tracking::sim::utils::boundTrackParameters(trk, perigee_surface));
133 for (
auto& trk : tracks_2) {
134 billoir_tracks_2.push_back(
135 tracking::sim::utils::boundTrackParameters(trk, perigee_surface));
139 std::vector<Acts::Vertex> fit_vertices;
141 for (
auto& b_trk_1 : billoir_tracks_1) {
142 std::vector<const Acts::BoundTrackParameters*> fit_tracks_ptr;
144 for (
auto& b_trk_2 : billoir_tracks_2) {
145 fit_tracks_ptr.push_back(&b_trk_1);
146 fit_tracks_ptr.push_back(&b_trk_2);
148 ldmx_log(debug) <<
"Calling vertex fitter" << std::endl
149 <<
"Track 1 parameters" << std::endl
150 << b_trk_1 << std::endl
151 <<
"Track 2 parameters" << std::endl
152 << b_trk_2 << std::endl;
168 ldmx_log(warn) <<
"Vertex fit failed" << std::endl;
176void Vertexer::onProcessEnd() {
177 ldmx_log(info) <<
"Reconstructed " << nvertices_ <<
" vertices over "
178 << nreconstructable_ <<
" reconstructable" << std::endl;
180 TFile* outfile =
new TFile((getName() +
".root").c_str(),
"RECREATE");
183 h_delta_d0_->Write();
184 h_delta_z0_->Write();
186 h_delta_phi_->Write();
187 h_delta_theta_->Write();
189 h_delta_d0_vs_recoil_p_->Write();
190 h_delta_z0_vs_recoil_p_->Write();
192 h_td0_vs_rd0_->Write();
193 h_tz0_vs_rz0_->Write();
199void Vertexer::taggerRecoilMonitoring(
200 const std::vector<ldmx::Track>& tagger_tracks,
201 const std::vector<ldmx::Track>& recoil_tracks) {
206 if (tagger_tracks.size() != 1 || recoil_tracks.size() != 1)
return;
218 t_p = t_trk.getCharge() / t_trk.getQoP();
219 r_p = r_trk.getCharge() / r_trk.getQoP();
221 h_delta_d0_->Fill(t_trk.getD0() - r_trk.getD0());
222 h_delta_z0_->Fill(t_trk.getZ0() - r_trk.getZ0());
223 h_delta_p_->Fill(t_p - r_p);
224 h_delta_phi_->Fill(t_trk.getPhi() - r_trk.getPhi());
225 h_delta_theta_->Fill(t_trk.getTheta() - r_trk.getTheta());
229 h_delta_d0_vs_recoil_p_->Fill(r_p, t_trk.getD0() - r_trk.getD0());
230 h_delta_z0_vs_recoil_p_->Fill(r_p, t_trk.getZ0() - r_trk.getZ0());
233 h_td0_vs_rd0_->Fill(r_trk.getD0(), t_trk.getD0());
234 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...