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