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