Run the processor.
52 {
53
54
55
56 nevents_++;
57 auto start = std::chrono::high_resolution_clock::now();
58 auto &&stepper = Acts::EigenStepper<>{sp_interpolated_b_field_};
59
60
61 propagator_ = std::make_shared<VoidPropagator>(stepper);
62
63
64 using Linearizer = Acts::HelicalTrackLinearizer;
65 Linearizer::Config linearizer_config;
66 linearizer_config.bField = sp_interpolated_b_field_;
67 linearizer_config.propagator = propagator_;
68 Linearizer linearizer(linearizer_config);
69
70
71 using VertexFitter = Acts::FullBilloirVertexFitter;
72
73 VertexFitter::Config vertex_fitter_cfg;
74
75 VertexFitter billoir_fitter(vertex_fitter_cfg);
76
77
78
79
80
81
82
83
84 Acts::VertexingOptions vf_options(
gctx_, bctx_);
85
86
87 const std::vector<ldmx::Track> tracks =
88 event.getCollection<
ldmx::Track>(trk_coll_name_, input_pass_name_);
89
90
91 const std::vector<ldmx::Track> seeds =
92 event.getCollection<
ldmx::Track>(
"RecoilTruthSeeds", input_pass_name_);
93
94 if (tracks.size() < 1) return;
95
96
97 std::vector<Acts::BoundTrackParameters> billoir_tracks;
98
99
100
101
102
103 std::shared_ptr<Acts::PerigeeSurface> perigee_surface =
104 Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3(
105 tracks.front().getPerigeeX(), tracks.front().getPerigeeY(),
106 tracks.front().getPerigeeZ()));
107
108 for (unsigned int i_track = 0; i_track < tracks.size(); i_track++) {
109 Acts::BoundVector param_vec;
110 param_vec << tracks.at(i_track).getD0(), tracks.at(i_track).getZ0(),
111 tracks.at(i_track).getPhi(), tracks.at(i_track).getTheta(),
112 tracks.at(i_track).getQoP(), tracks.at(i_track).getT();
113
114 Acts::BoundSquareMatrix cov_mat =
115 tracking::sim::utils::unpackCov(tracks.at(i_track).getPerigeeCov());
116 auto part{Acts::GenericParticleHypothesis(Acts::ParticleHypothesis(
117 Acts::PdgParticle(tracks.at(i_track).getPdgID())))};
118 billoir_tracks.push_back(Acts::BoundTrackParameters(
119 perigee_surface, param_vec, std::move(cov_mat), part));
120 }
121
122
123 if (billoir_tracks.size() != 2) {
124 return;
125 }
126
127 if (billoir_tracks.at(0).charge() * billoir_tracks.at(1).charge() > 0) return;
128
129
130 double pion_mass = 139.570 * Acts::UnitConstants::MeV;
131
132 TLorentzVector p1, p2;
133 p1.SetXYZM(billoir_tracks.at(0).momentum()(0),
134 billoir_tracks.at(0).momentum()(1),
135 billoir_tracks.at(0).momentum()(2), pion_mass);
136
137 p2.SetXYZM(billoir_tracks.at(1).momentum()(0),
138 billoir_tracks.at(1).momentum()(1),
139 billoir_tracks.at(1).momentum()(2), pion_mass);
140
141 std::vector<TLorentzVector> pion_seeds;
142
143 if (seeds.size() == 2) {
144 for (int i_seed = 0; i_seed < seeds.size(); i_seed++) {
145 std::shared_ptr<Acts::PerigeeSurface> perigee_surface2 =
146 Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3(
147 seeds.at(i_seed).getPerigeeX(), seeds.at(i_seed).getPerigeeY(),
148 seeds.at(i_seed).getPerigeeZ()));
149
150 Acts::BoundVector param_vec;
151 param_vec << seeds.at(i_seed).getD0(), seeds.at(i_seed).getZ0(),
152 seeds.at(i_seed).getPhi(), seeds.at(i_seed).getTheta(),
153 seeds.at(i_seed).getQoP(), seeds.at(i_seed).getT();
154
155 Acts::BoundSquareMatrix cov_mat =
156 tracking::sim::utils::unpackCov(seeds.at(i_seed).getPerigeeCov());
157 int pion_pdg_id = 211;
158 if (seeds.at(i_seed).q() < 0) pion_pdg_id = -211;
159
160 auto part{Acts::GenericParticleHypothesis(
161 Acts::ParticleHypothesis(Acts::PdgParticle(pion_pdg_id)))};
162 auto bound_seed_params = Acts::BoundTrackParameters(
163 perigee_surface, param_vec, std::move(cov_mat), part);
164
165 TLorentzVector pion4v;
166 pion4v.SetXYZM(bound_seed_params.momentum()(0),
167 bound_seed_params.momentum()(1),
168 bound_seed_params.momentum()(2), pion_mass);
169
170 pion_seeds.push_back(pion4v);
171 }
172
173 h_m_truth_->Fill((pion_seeds.at(0) + pion_seeds.at(1)).M());
174 }
175
176 if ((pion_seeds.size() == 2) &&
177 (pion_seeds.at(0) + pion_seeds.at(1)).M() > 0.490 &&
178 (pion_seeds.at(0) + pion_seeds.at(1)).M() < 0.510) {
179
180 h_m_truth_filter_->Fill((p1 + p2).M());
181 }
182
183 h_m_->Fill((p1 + p2).M());
184
185 auto end = std::chrono::high_resolution_clock::now();
186
187
188 auto diff = end - start;
189 processing_time_ += std::chrono::duration<double, std::milli>(diff).count();
190}
Implementation of a track object.