59 auto start = std::chrono::high_resolution_clock::now();
60 auto &&stepper = Acts::EigenStepper<>{sp_interpolated_bField_};
63 propagator_ = std::make_shared<VoidPropagator>(stepper);
66 using Linearizer = Acts::HelicalTrackLinearizer;
67 Linearizer::Config linearizerConfig;
68 linearizerConfig.bField = sp_interpolated_bField_;
69 linearizerConfig.propagator = propagator_;
70 Linearizer linearizer(linearizerConfig);
73 using VertexFitter = Acts::FullBilloirVertexFitter;
75 VertexFitter::Config vertexFitterCfg;
77 VertexFitter billoirFitter(vertexFitterCfg);
86 Acts::VertexingOptions vfOptions(
gctx_, bctx_);
89 const std::vector<ldmx::Track> tracks =
90 event.getCollection<
ldmx::Track>(trk_coll_name_, input_pass_name_);
93 const std::vector<ldmx::Track> seeds =
94 event.getCollection<
ldmx::Track>(
"RecoilTruthSeeds", input_pass_name_);
96 if (tracks.size() < 1)
return;
99 std::vector<Acts::BoundTrackParameters> billoir_tracks;
105 std::shared_ptr<Acts::PerigeeSurface> perigeeSurface =
106 Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3(
107 tracks.front().getPerigeeX(), tracks.front().getPerigeeY(),
108 tracks.front().getPerigeeZ()));
110 for (
unsigned int iTrack = 0; iTrack < tracks.size(); iTrack++) {
111 Acts::BoundVector paramVec;
112 paramVec << tracks.at(iTrack).getD0(), tracks.at(iTrack).getZ0(),
113 tracks.at(iTrack).getPhi(), tracks.at(iTrack).getTheta(),
114 tracks.at(iTrack).getQoP(), tracks.at(iTrack).getT();
116 Acts::BoundSquareMatrix covMat =
117 tracking::sim::utils::unpackCov(tracks.at(iTrack).getPerigeeCov());
118 auto part{Acts::GenericParticleHypothesis(Acts::ParticleHypothesis(
119 Acts::PdgParticle(tracks.at(iTrack).getPdgID())))};
120 billoir_tracks.push_back(Acts::BoundTrackParameters(
121 perigeeSurface, paramVec, std::move(covMat), part));
125 if (billoir_tracks.size() != 2) {
129 if (billoir_tracks.at(0).charge() * billoir_tracks.at(1).charge() > 0)
return;
132 double pion_mass = 139.570 * Acts::UnitConstants::MeV;
134 TLorentzVector p1, p2;
135 p1.SetXYZM(billoir_tracks.at(0).momentum()(0),
136 billoir_tracks.at(0).momentum()(1),
137 billoir_tracks.at(0).momentum()(2), pion_mass);
139 p2.SetXYZM(billoir_tracks.at(1).momentum()(0),
140 billoir_tracks.at(1).momentum()(1),
141 billoir_tracks.at(1).momentum()(2), pion_mass);
143 std::vector<TLorentzVector> pion_seeds;
145 if (seeds.size() == 2) {
146 for (
int iSeed = 0; iSeed < seeds.size(); iSeed++) {
147 std::shared_ptr<Acts::PerigeeSurface> perigeeSurface2 =
148 Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3(
149 seeds.at(iSeed).getPerigeeX(), seeds.at(iSeed).getPerigeeY(),
150 seeds.at(iSeed).getPerigeeZ()));
152 Acts::BoundVector paramVec;
153 paramVec << seeds.at(iSeed).getD0(), seeds.at(iSeed).getZ0(),
154 seeds.at(iSeed).getPhi(), seeds.at(iSeed).getTheta(),
155 seeds.at(iSeed).getQoP(), seeds.at(iSeed).getT();
157 Acts::BoundSquareMatrix covMat =
158 tracking::sim::utils::unpackCov(seeds.at(iSeed).getPerigeeCov());
160 if (seeds.at(iSeed).q() < 0) pionPdgId = -211;
162 auto part{Acts::GenericParticleHypothesis(
163 Acts::ParticleHypothesis(Acts::PdgParticle(pionPdgId)))};
164 auto boundSeedParams = Acts::BoundTrackParameters(
165 perigeeSurface, paramVec, std::move(covMat), part);
167 TLorentzVector pion4v;
168 pion4v.SetXYZM(boundSeedParams.momentum()(0),
169 boundSeedParams.momentum()(1),
170 boundSeedParams.momentum()(2), pion_mass);
172 pion_seeds.push_back(pion4v);
175 h_m_truth_->Fill((pion_seeds.at(0) + pion_seeds.at(1)).M());
178 if ((pion_seeds.size() == 2) &&
179 (pion_seeds.at(0) + pion_seeds.at(1)).M() > 0.490 &&
180 (pion_seeds.at(0) + pion_seeds.at(1)).M() < 0.510) {
182 h_m_truthFilter_->Fill((p1 + p2).M());
185 h_m_->Fill((p1 + p2).M());
187 auto end = std::chrono::high_resolution_clock::now();
190 auto diff = end - start;
191 processing_time_ += std::chrono::duration<double, std::milli>(diff).count();