19 bool debug_transform =
false;
20 auto transform_pos = [debug_transform](
const Acts::Vector3& pos_) {
21 Acts::Vector3 rot_pos;
24 rot_pos(2) = pos_(0) + DIPOLE_OFFSET;
29 if (debug_transform) {
30 std::cout <<
"PF::DEFAULT3 TRANSFORM\n";
31 std::cout <<
"PF::Check:: transforming Pos\n";
33 std::cout <<
"\nTO\n";
34 std::cout << rot_pos <<
"\n";
44 Acts::RotationMatrix3 rotation = Acts::RotationMatrix3::Identity();
47 auto transform_b_field = [rotation, scale, debug_transform](
48 const Acts::Vector3& field,
49 const Acts::Vector3& ) {
51 Acts::Vector3 rot_field;
52 rot_field(0) = field(2);
53 rot_field(1) = field(0);
54 rot_field(2) = field(1);
57 rot_field = scale * rot_field;
60 rot_field = rotation * rot_field;
64 if (debug_transform) {
65 std::cout <<
"PF::DEFAULT3 TRANSFORM\n";
66 std::cout <<
"PF::Check:: transforming\n";
68 std::cout <<
"\nTO\n";
69 std::cout << rot_field <<
"\n";
76 const auto map = std::make_shared<InterpolatedMagneticField3>(
80 transform_pos, transform_b_field));
82 auto acts_logging_level = Acts::Logging::FATAL;
84 if (
debug_) acts_logging_level = Acts::Logging::VERBOSE;
98 Acts::MultiEigenStepperLoop multi_stepper(map);
104 Acts::Navigator::Config nav_cfg{geometry().getTG()};
105 nav_cfg.resolveMaterial =
true;
106 nav_cfg.resolvePassive =
false;
107 nav_cfg.resolveSensitive =
true;
108 const Acts::Navigator navigator(nav_cfg);
110 auto gsf_propagator =
111 GsfPropagator(std::move(multi_stepper), std::move(navigator),
112 Acts::getDefaultLogger(
"GSF_PROP", acts_logging_level));
114 BetheHeitlerApprox bethe_heitler = Acts::makeDefaultBetheHeitlerApprox();
116 gsf_ = std::make_unique<std::decay_t<
decltype(*gsf_)>>(
117 std::move(gsf_propagator), std::move(bethe_heitler),
118 Acts::getDefaultLogger(
"GSF", acts_logging_level));
120 const auto stepper = Acts::EigenStepper<>{map};
123 Acts::getDefaultLogger(
"GSF_EXTRAP", acts_logging_level));
125 trk_extrap_ = std::make_shared<std::decay_t<
decltype(*trk_extrap_)>>(
126 *
propagator_, geometryContext(), magneticFieldContext());
182 Acts::GainMatrixUpdater updater;
183 Acts::GsfExtensions<Acts::VectorMultiTrajectory> gsf_extensions;
184 gsf_extensions.updater.connect<
185 &Acts::GainMatrixUpdater::operator()<Acts::VectorMultiTrajectory>>(
187 gsf_extensions.calibrator
189 Acts::VectorMultiTrajectory>>(&calibrator);
192 struct SurfaceAccessor {
193 const Acts::TrackingGeometry* tracking_geometry_;
195 const Acts::Surface* operator()(
const Acts::SourceLink& sourceLink)
const {
196 const auto& index_source_link =
198 return tracking_geometry_->findSurface(index_source_link.geometryId());
202 SurfaceAccessor m_sl_surface_accessor{tg.getTG().get()};
204 gsf_extensions.surfaceAccessor.connect<&SurfaceAccessor::operator()>(
205 &m_sl_surface_accessor);
206 gsf_extensions.mixtureReducer.connect<&Acts::reduceMixtureLargestWeights>();
211 Acts::PropagatorOptions<Acts::StepperPlainOptions,
212 Acts::NavigatorPlainOptions, ActionList, AbortList>
213 propagator_options(geometryContext(), magneticFieldContext());
215 propagator_options.pathLimit = std::numeric_limits<double>::max();
218 propagator_options.loopProtection =
false;
223 propagator_options.actionList.get<Acts::MaterialInteractor>();
224 m_interactor.multipleScattering =
true;
225 m_interactor.energyLoss =
true;
226 m_interactor.recordInteractions =
false;
230 propagator_options.actionList.get<Acts::detail::SteppingLogger>();
231 s_logger.sterile =
true;
233 propagator_options.stepping.maxStepSize =
241 std::shared_ptr<const Acts::Surface> gsf_ref_surface;
242 Acts::GsfOptions<Acts::VectorMultiTrajectory> gsf_options{
243 geometryContext(), magneticFieldContext(), calibrationContext()};
244 gsf_options.extensions = gsf_extensions;
245 gsf_options.propagatorPlainOptions = propagator_options;
252 std::vector<ldmx::Track> out_tracks;
254 Acts::VectorTrackContainer vtc;
255 Acts::VectorMultiTrajectory mtj;
256 Acts::TrackContainer tc{vtc, mtj};
259 unsigned int itrk = 0;
260 ldmx_log(debug) <<
"Starting GSF processing of " << tracks.size()
263 for (
auto& track : tracks) {
264 ldmx_log(debug) <<
"Processing track " << itrk <<
" with "
265 << track.getMeasurementsIdxs().size() <<
" measurements";
267 std::vector<ldmx::Measurement> meas_on_track;
270 std::vector<Acts::SourceLink> fit_track_source_links;
272 for (
auto imeas : track.getMeasurementsIdxs()) {
273 auto meas = measurements.at(imeas);
274 meas_on_track.push_back(meas);
278 const Acts::Surface* hit_surface =
279 tg.geo::TrackingGeometry::getSurface(meas.getLayerID());
283 fit_track_source_links.push_back(Acts::SourceLink(idx_sl));
287 std::reverse(meas_on_track.begin(), meas_on_track.end());
288 std::reverse(fit_track_source_links.begin(), fit_track_source_links.end());
290 for (
auto m : meas_on_track) {
291 ldmx_log(trace) <<
" Measurement:\n" << m <<
"\n";
294 ldmx_log(debug) <<
" Track bound track parameters preparation:";
298 std::shared_ptr<Acts::PerigeeSurface> perigee =
299 Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3(
300 track.getPerigeeX(), track.getPerigeeY(), track.getPerigeeZ()));
302 Acts::BoundTrackParameters trk_btp =
303 tracking::sim::utils::boundTrackParameters(track, perigee);
305 Acts::BoundTrackParameters trk_btp_beam_origin =
306 tracking::sim::utils::boundTrackParameters(track, perigee);
308 if (tagger_tracking_) {
309 if (!track.getTrackState(ldmx::TrackStateType::AtBeamOrigin)
311 ldmx_log(warn) <<
"Failed retreiving AtBeamOrigin TrackState for "
316 auto ts = track.getTrackState(ldmx::TrackStateType::AtBeamOrigin).value();
317 trk_btp_beam_origin =
322 if (!track.getTrackState(ldmx::TrackStateType::AtTarget).has_value()) {
324 <<
"Failed retreiving AtTarget TrackState for track. Skipping..";
327 auto ts = track.getTrackState(ldmx::TrackStateType::AtTarget).value();
328 trk_btp_beam_origin = tracking::sim::utils::btp(ts,
target_surface_, 11);
330 ldmx_log(debug) <<
" Perigee Surface (acts-x, acts-y, acts-z) = ("
331 << track.getPerigeeX() <<
", " << track.getPerigeeY()
332 <<
", " << track.getPerigeeZ() <<
")";
334 const Acts::BoundVector& trkpars = trk_btp.parameters();
335 ldmx_log(debug) <<
" Track parameters (d0, z0, phi, theta, q/p)= ("
336 << trkpars[Acts::eBoundLoc0] <<
", "
337 << trkpars[Acts::eBoundLoc1] <<
", "
338 << trkpars[Acts::eBoundPhi] <<
", "
339 << trkpars[Acts::eBoundTheta] <<
", "
340 << trkpars[Acts::eBoundQOverP] <<
")";
342 Acts::Vector3 trk_pos = trk_btp.position(geometryContext());
343 ldmx_log(debug) <<
" Track position (acts-x, acts-y, acts-z) = ("
344 << trk_pos(0) <<
", " << trk_pos(1) <<
", " << trk_pos(2)
347 const Acts::BoundVector& trk_pars_beam_origin =
348 trk_btp_beam_origin.parameters();
350 <<
" BeamOrigin track parameters (d0, z0, phi, theta, q/p)= ("
351 << trk_pars_beam_origin[Acts::eBoundLoc0] <<
", "
352 << trk_pars_beam_origin[Acts::eBoundLoc1] <<
", "
353 << trk_pars_beam_origin[Acts::eBoundPhi] <<
", "
354 << trk_pars_beam_origin[Acts::eBoundTheta] <<
", "
355 << trk_pars_beam_origin[Acts::eBoundQOverP] <<
")";
357 Acts::Vector3 trk_pos_beam_origin =
358 trk_btp_beam_origin.position(geometryContext());
360 <<
" BeamOrigin track position (acts-x, acts-y, acts-z) = ("
361 << trk_pos_beam_origin(0) <<
", " << trk_pos_beam_origin(1) <<
", "
362 << trk_pos_beam_origin(2) <<
")";
364 ldmx_log(debug) <<
" About to run GSF fit with "
365 << fit_track_source_links.size() <<
" source links";
368 if (tagger_tracking_) {
373 gsf_options.referenceSurface = &(*gsf_ref_surface);
377 auto gsf_refit_result =
378 gsf_->fit(fit_track_source_links.begin(), fit_track_source_links.end(),
379 trk_btp_beam_origin, gsf_options, tc);
381 if (!gsf_refit_result.ok()) {
382 ldmx_log(warn) <<
"GSF re-fit failed: "
383 << gsf_refit_result.error().message();
387 ldmx_log(debug) <<
" GSF fit succeeded, tc.size() = " << tc.size();
389 if (tc.size() < 1)
continue;
391 auto gsftrk = tc.getTrack(0);
394 const Acts::BoundVector& perigee_pars = gsftrk.parameters();
395 const Acts::BoundMatrix& trk_cov = gsftrk.covariance();
396 const Acts::Surface& perigee_surface = gsftrk.referenceSurface();
399 <<
" Reference Surface (acts-x, acts-y, acts-z) = ("
400 << perigee_surface.transform(geometryContext()).translation()(0) <<
", "
401 << perigee_surface.transform(geometryContext()).translation()(1) <<
", "
402 << perigee_surface.transform(geometryContext()).translation()(2) <<
")";
404 ldmx_log(debug) <<
" Found track has " << gsftrk.nTrackStates()
407 ldmx_log(debug) <<
" Track parameters (d0, z0, phi, theta, q/p)= ("
408 << perigee_pars[Acts::eBoundLoc0] <<
", "
409 << perigee_pars[Acts::eBoundLoc1] <<
", "
410 << perigee_pars[Acts::eBoundPhi] <<
", "
411 << perigee_pars[Acts::eBoundTheta] <<
", "
412 << perigee_pars[Acts::eBoundQOverP] <<
") ";
416 bool success =
false;
417 bool success_ecal =
false;
420 if (tagger_tracking_) {
421 ldmx_log(debug) <<
" Target extrapolation";
424 success = trk_extrap_->trackStateAtSurface(
426 ldmx::TrackStateType::AtTarget);
429 trk.addTrackState(ts_at_target);
430 ts_at_target_surface = ts_at_target;
434 ldmx_log(debug) <<
" Ecal Extrapolation";
436 success_ecal = trk_extrap_->trackStateAtSurface(
437 gsftrk,
ecal_surface_, ts_at_ecal, ldmx::TrackStateType::AtECAL);
439 if (success_ecal) trk.addTrackState(ts_at_ecal);
442 ldmx_log(debug) <<
" Target extrapolation for perigee parameters";
443 success = trk_extrap_->trackStateAtSurface(
445 ldmx::TrackStateType::AtTarget);
446 if (success) trk.addTrackState(ts_at_target_surface);
450 trk.setPerigeeLocation(0., 0., 0.);
451 trk.setChi2(gsftrk.chi2());
452 trk.setNhits(gsftrk.nMeasurements());
453 trk.setNdf(gsftrk.nMeasurements() - 5);
455 ldmx_log(debug) <<
" Extrapolated track parameters at target (d0, z0, "
456 "phi, theta, q/p)= ("
457 << ts_at_target_surface.params_[Acts::eBoundLoc0] <<
", "
458 << ts_at_target_surface.params_[Acts::eBoundLoc1] <<
", "
459 << ts_at_target_surface.params_[Acts::eBoundPhi] <<
", "
460 << ts_at_target_surface.params_[Acts::eBoundTheta] <<
", "
461 << ts_at_target_surface.params_[Acts::eBoundQOverP]
463 ldmx_log(debug) <<
" Using extrapolated parameters";
465 std::vector<double> cov;
466 for (
auto c : ts_at_target_surface.cov_) cov.push_back(c);
467 ldmx_log(debug) <<
" Setting extrapolated covariance, size="
469 trk.setPerigeeCov(cov);
471 ldmx_log(debug) <<
" Extrapolation failed, using perigee parameters";
472 ldmx_log(debug) <<
" Perigee parameters (d0, z0, phi, theta, q/p)= ("
473 << perigee_pars[Acts::eBoundLoc0] <<
", "
474 << perigee_pars[Acts::eBoundLoc1] <<
", "
475 << perigee_pars[Acts::eBoundPhi] <<
", "
476 << perigee_pars[Acts::eBoundTheta] <<
", "
477 << perigee_pars[Acts::eBoundQOverP] <<
")";
479 tracking::sim::utils::convertActsToLdmxPars(perigee_pars));
480 std::vector<double> v_trk_cov;
481 tracking::sim::utils::flatCov(trk_cov, v_trk_cov);
482 ldmx_log(debug) <<
" Setting perigee covariance, size="
484 trk.setPerigeeCov(v_trk_cov);
486 Acts::Vector3 trk_momentum = gsftrk.momentum();
487 trk.setMomentum(trk_momentum(0), trk_momentum(1), trk_momentum(2));
490 trk.setTrackID(track.getTrackID());
491 trk.setPdgID(track.getPdgID());
492 trk.setTruthProb(track.getTruthProb());
496 ldmx_log(debug) <<
" Added track to output, total tracks = "
497 << (out_tracks.size() + 1);
499 out_tracks.push_back(trk);