1#include "Tracking/Reco/TruthSeedProcessor.h"
3#include "Tracking/Sim/GeometryContainers.h"
5namespace tracking::reco {
12 gctx_ = Acts::GeometryContext();
13 normal_ = std::make_shared<std::normal_distribution<float>>(0., 1.);
15 Acts::StraightLineStepper stepper;
16 Acts::Navigator::Config navCfg{geometry().getTG()};
17 const Acts::Navigator navigator(navCfg);
19 linpropagator_ = std::make_shared<LinPropagator>(stepper, navigator);
20 trk_extrap_ = std::make_shared<std::decay_t<
decltype(*trk_extrap_)>>(
21 *linpropagator_, geometry_context(), magnetic_field_context());
26 parameters.getParameter<std::string>(
"scoring_hits_coll_name");
27 sp_pass_name_ = parameters.getParameter<std::string>(
"sp_pass_name",
"");
29 parameters.getParameter<std::string>(
"recoil_sim_hits_coll_name");
31 parameters.getParameter<std::string>(
"tagger_sim_hits_coll_name");
33 parameters.getParameter<std::string>(
"input_pass_name",
"");
37 pdg_ids_ = parameters.getParameter<std::vector<int>>(
"pdg_ids", {11});
38 z_min_ = parameters.getParameter<
double>(
"z_min", -9999);
39 track_id_ = parameters.getParameter<
int>(
"track_id", -9999);
40 pz_cut_ = parameters.getParameter<
double>(
"pz_cut", -9999);
41 p_cut_ = parameters.getParameter<
double>(
"p_cut", 0.);
42 p_cut_max_ = parameters.getParameter<
double>(
"p_cut_max", 100000.);
43 p_cut_ecal_ = parameters.getParameter<
double>(
"p_cut_ecal", -1.);
44 recoil_sp_ = parameters.getParameter<
double>(
"recoil_sp",
true);
45 target_sp_ = parameters.getParameter<
double>(
"tagger_sp",
true);
46 seedSmearing_ = parameters.getParameter<
bool>(
"seedSmearing",
false);
47 max_track_id_ = parameters.getParameter<
int>(
"max_track_id", 5);
49 ldmx_log(info) <<
"Seed Smearing is set to " << seedSmearing_;
51 d0smear_ = parameters.getParameter<std::vector<double>>(
"d0smear",
54 parameters.getParameter<std::vector<double>>(
"z0smear", {0.1, 0.1, 0.1});
55 phismear_ = parameters.getParameter<
double>(
"phismear", 0.001);
56 thetasmear_ = parameters.getParameter<
double>(
"thetasmear", 0.001);
57 relpsmear_ = parameters.getParameter<
double>(
"relpsmear", 0.1);
60 rel_smearfactors_ = parameters.getParameter<std::vector<double>>(
61 "rel_smearfactors", {0.1, 0.1, 0.1, 0.1, 0.1, 0.1});
62 inflate_factors_ = parameters.getParameter<std::vector<double>>(
63 "inflate_factors", {10., 10., 10., 10., 10., 10.});
71 beamOrigin_ = parameters.getParameter<std::vector<double>>(
72 "beamOrigin", {-883.0, -21.745876, 0.0});
75 skip_tagger_ = parameters.getParameter<
bool>(
"skip_tagger",
false);
76 skip_recoil_ = parameters.getParameter<
bool>(
"skip_recoil",
false);
81 ldmx::Track& trk,
const std::shared_ptr<Acts::Surface>& target_surface) {
82 std::vector<double> pos{
static_cast<double>(hit.
getPosition()[0]),
94 const std::shared_ptr<Acts::Surface>& target_surface) {
96 particle.
getCharge(), trk, target_surface);
102 const std::vector<double>& pos_vec,
const std::vector<double>& p_vec,
104 const std::shared_ptr<Acts::Surface>& target_surface) {
112 Acts::Vector3 pos{pos_vec[0], pos_vec[1], pos_vec[2]};
113 Acts::Vector3 mom{p_vec[0], p_vec[1], p_vec[2]};
116 pos = tracking::sim::utils::Ldmx2Acts(pos);
117 mom = tracking::sim::utils::Ldmx2Acts(mom);
121 double q{charge * Acts::UnitConstants::e};
129 auto free_params{tracking::sim::utils::toFreeParameters(pos, mom, q)};
134 auto gen_surface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
135 Acts::Vector3(free_params[Acts::eFreePos0], free_params[Acts::eFreePos1],
136 free_params[Acts::eFreePos2]))};
144 Acts::transformFreeToBoundParameters(free_params, *gen_surface,
gctx_)
147 if (charge > 0) pdgid = -11;
148 auto part{Acts::GenericParticleHypothesis(
149 Acts::ParticleHypothesis(Acts::PdgParticle(pdgid)))};
150 Acts::BoundTrackParameters boundTrkPars(gen_surface, bound_params,
155 Acts::Vector3 tgt_surf_center = target_surface->center(geometry_context());
156 Acts::Vector3 gen_surf_center = gen_surface->center(geometry_context());
160 if (abs(tgt_surf_center(0) - gen_surf_center(0)) > tol)
161 ldmx_log(error) <<
"Linear extrapolation to a far away surface in B field."
162 <<
" This will cause inaccuracies in track parameters"
163 <<
" Distance extrapolated = "
164 << (tgt_surf_center(0) - gen_surf_center(0)) << std::endl;
166 auto propBoundState = trk_extrap_->extrapolate(boundTrkPars, target_surface);
169 Acts::Vector3 ref = target_surface->center(geometry_context());
174 trk.setPerigeeLocation(ref(0), ref(1), ref(2));
176 auto propBoundVec = (propBoundState.value()).parameters();
179 tracking::sim::utils::convertActsToLdmxPars(propBoundVec));
181 trk.setPosition(pos(0), pos(1), pos(2));
182 trk.setMomentum(mom(0), mom(1), mom(2));
190 const std::map<
int, std::vector<int>>& hit_count_map,
191 const std::shared_ptr<Acts::Surface>& origin_surface,
192 const std::shared_ptr<Acts::Surface>& target_surface,
193 const std::shared_ptr<Acts::Surface>& ecal_surface) {
196 truth_recoil_track.setTrackID(trackID);
207 Acts::Vector3 ref = target_surface->center(geometry_context());
208 ts_truth_target.refX = ref(0);
209 ts_truth_target.refY = ref(1);
210 ts_truth_target.refZ = ref(2);
211 ts_truth_target.params = truth_track_target.getPerigeeParameters();
213 ts_truth_target.ts_type = ldmx::TrackStateType::AtTarget;
214 smearedTruthTrack.addTrackState(ts_truth_target);
221 Acts::Vector3 ref_ecal = ecal_surface->center(geometry_context());
222 ts_truth_ecal.refX = ref_ecal(0);
223 ts_truth_ecal.refY = ref_ecal(1);
224 ts_truth_ecal.refZ = ref_ecal(2);
225 ts_truth_ecal.params = truth_track_ecal.getPerigeeParameters();
227 ts_truth_ecal.ts_type = ldmx::TrackStateType::AtECAL;
228 smearedTruthTrack.addTrackState(ts_truth_ecal);
233 for (
auto sim_hit_idx : hit_count_map.at(smearedTruthTrack.getTrackID())) {
234 smearedTruthTrack.addMeasurementIndex(sim_hit_idx);
238 smearedTruthTrack.setNhits(nhits);
240 return smearedTruthTrack;
246 const std::map<
int, std::vector<int>>& hit_count_map,
247 const std::shared_ptr<Acts::Surface>& origin_surface,
248 const std::shared_ptr<Acts::Surface>& target_surface) {
252 truth_track.setTrackID(trackID);
263 ldmx_log(debug) <<
"Truth parameters at beam origin" << std::endl;
264 for (
auto par : truth_track.getPerigeeParameters())
265 ldmx_log(debug) << par <<
" ";
266 ldmx_log(debug) << std::endl;
277 Acts::Vector3 ref = target_surface->center(geometry_context());
278 ts_truth_target.refX = ref(0);
279 ts_truth_target.refY = ref(1);
280 ts_truth_target.refZ = ref(2);
281 ts_truth_target.params = truth_track_target.getPerigeeParameters();
283 ts_truth_target.ts_type = ldmx::TrackStateType::AtTarget;
284 smearedTruthTrack.addTrackState(ts_truth_target);
286 ldmx_log(debug) <<
"Truth parameters at target" << std::endl;
287 for (
auto par : truth_track_target.getPerigeeParameters())
288 ldmx_log(debug) << par <<
" ";
289 ldmx_log(debug) << std::endl;
295 Acts::Vector3 ref_origin = origin_surface->center(geometry_context());
296 ts_truth_beam_origin.refX = ref_origin(0);
297 ts_truth_beam_origin.refY = ref_origin(1);
298 ts_truth_beam_origin.refZ = ref_origin(2);
299 ts_truth_beam_origin.params = seedTruthTrack.getPerigeeParameters();
301 ts_truth_beam_origin.ts_type = ldmx::TrackStateType::AtBeamOrigin;
302 smearedTruthTrack.addTrackState(ts_truth_beam_origin);
304 ldmx_log(debug) <<
"Smeared parameters at origin" << std::endl;
305 for (
auto par : smearedTruthTrack.getPerigeeParameters())
306 ldmx_log(debug) << par <<
" ";
307 ldmx_log(debug) << std::endl;
316 for (
auto sim_hit_idx : hit_count_map.at(smearedTruthTrack.getTrackID())) {
317 smearedTruthTrack.addMeasurementIndex(sim_hit_idx);
321 smearedTruthTrack.setNhits(nhits);
323 return smearedTruthTrack;
327 bool seed_smearing) {
329 seed.setPerigeeLocation(tt.getPerigeeLocation()[0],
330 tt.getPerigeeLocation()[1],
331 tt.getPerigeeLocation()[2]);
333 seed.setNhits(tt.getNhits());
335 seed.setNsharedHits(0);
336 seed.setTrackID(tt.getTrackID());
337 seed.setPdgID(tt.getPdgID());
338 seed.setTruthProb(1.);
340 Acts::BoundVector bound_params;
341 Acts::BoundVector stddev;
344 ldmx_log(debug) <<
"Smear track and inflate covariance" << std::endl;
356 double sigma_d0 = d0smear_[0];
357 double sigma_z0 = z0smear_[0];
358 double sigma_phi = phismear_;
359 double sigma_theta = thetasmear_;
360 double sigma_p = relpsmear_ * abs(1 / tt.getQoP());
361 double sigma_t = 1. * Acts::UnitConstants::ns;
363 double smear = (*normal_)(generator_);
364 double d0smear = tt.getD0() + smear * sigma_d0;
366 smear = (*normal_)(generator_);
367 double z0smear = tt.getZ0() + smear * sigma_z0;
369 smear = (*normal_)(generator_);
370 double Phismear = tt.getPhi() + smear * sigma_phi;
372 smear = (*normal_)(generator_);
373 double Thetasmear = tt.getTheta() + smear * sigma_theta;
375 double p = std::abs(1. / tt.getQoP());
376 smear = (*normal_)(generator_);
377 double Psmear = p + smear * sigma_p;
379 double Q = tt.getQoP() < 0 ? -1. : 1.;
380 double QoPsmear = Q / Psmear;
382 smear = (*normal_)(generator_);
383 double Tsmear = tt.getT() + smear * sigma_t;
385 bound_params << d0smear, z0smear, Phismear, Thetasmear, QoPsmear, Tsmear;
387 stddev[Acts::eBoundLoc0] =
388 inflate_factors_[Acts::eBoundLoc0] * sigma_d0 * Acts::UnitConstants::mm;
389 stddev[Acts::eBoundLoc1] =
390 inflate_factors_[Acts::eBoundLoc1] * sigma_z0 * Acts::UnitConstants::mm;
391 stddev[Acts::eBoundPhi] = inflate_factors_[Acts::eBoundPhi] * sigma_phi;
392 stddev[Acts::eBoundTheta] =
393 inflate_factors_[Acts::eBoundTheta] * sigma_theta;
394 stddev[Acts::eBoundQOverP] =
395 inflate_factors_[Acts::eBoundQOverP] * (1. / p) * (1. / p) * sigma_p;
396 stddev[Acts::eBoundTime] =
397 inflate_factors_[Acts::eBoundTime] * sigma_t * Acts::UnitConstants::ns;
399 ldmx_log(debug) << stddev << std::endl;
401 std::vector<double> v_seed_params(
402 (bound_params).data(),
403 bound_params.data() + bound_params.rows() * bound_params.cols());
405 Acts::BoundSquareMatrix bound_cov =
406 stddev.cwiseProduct(stddev).asDiagonal();
407 std::vector<double> v_seed_cov;
408 tracking::sim::utils::flatCov(bound_cov, v_seed_cov);
410 seed.setPerigeeCov(v_seed_cov);
415 bound_params << tt.getD0(), tt.getZ0(), tt.getPhi(), tt.getTheta(),
416 tt.getQoP(), tt.getT();
418 std::vector<double> v_seed_params(
419 (bound_params).data(),
420 bound_params.data() + bound_params.rows() * bound_params.cols());
422 double p = std::abs(1. / tt.getQoP());
423 double sigma_p = 0.75 * p * Acts::UnitConstants::GeV;
424 stddev[Acts::eBoundLoc0] = 2 * Acts::UnitConstants::mm;
425 stddev[Acts::eBoundLoc1] = 5 * Acts::UnitConstants::mm;
426 stddev[Acts::eBoundTime] = 1000 * Acts::UnitConstants::ns;
427 stddev[Acts::eBoundPhi] = 5 * Acts::UnitConstants::degree;
428 stddev[Acts::eBoundTheta] = 5 * Acts::UnitConstants::degree;
429 stddev[Acts::eBoundQOverP] = (1. / p) * (1. / p) * sigma_p;
431 Acts::BoundSquareMatrix bound_cov =
432 stddev.cwiseProduct(stddev).asDiagonal();
433 std::vector<double> v_seed_cov;
434 tracking::sim::utils::flatCov(bound_cov, v_seed_cov);
436 seed.setPerigeeCov(v_seed_cov);
443 const std::vector<ldmx::SimTrackerHit>& sim_hits,
444 std::map<
int, std::vector<int>>& hit_count_map) {
445 for (
int i_sim_hit = 0; i_sim_hit < sim_hits.size(); i_sim_hit++) {
446 auto& sim_hit = sim_hits.at(i_sim_hit);
448 if (!hit_count_map.count(sim_hit.getTrackID())) {
449 hit_count_map[sim_hit.getTrackID()].push_back(i_sim_hit);
456 int sensorID = tracking::sim::utils::getSensorID(sim_hit);
457 bool foundHit =
false;
459 for (
auto& i_rhit : hit_count_map[sim_hit.getTrackID()]) {
461 tracking::sim::utils::getSensorID(sim_hits.at(i_rhit));
463 if (sensorID == tmp_sensorID) {
470 hit_count_map[sim_hit.getTrackID()].push_back(i_sim_hit);
478 const std::vector<ldmx::SimTrackerHit>& ecal_sp_hits) {
494 if (
p_cut_ >= 0. && p_vec.norm() <
p_cut_)
return false;
503 bool pass_ecal_scoring_plane =
true;
505 if (p_cut_ecal_ > 0) {
507 for (
auto& e_sp_hit : ecal_sp_hits) {
508 if (e_sp_hit.getTrackID() == hit.
getTrackID() &&
509 e_sp_hit.getPdgID() == hit.
getPdgID()) {
510 Acts::Vector3 e_sp_p{e_sp_hit.getMomentum()[0],
511 e_sp_hit.getMomentum()[1],
512 e_sp_hit.getMomentum()[2]};
514 if (e_sp_p.norm() < p_cut_ecal_) pass_ecal_scoring_plane =
false;
525 if (!pass_ecal_scoring_plane)
return false;
538 const std::vector<ldmx::SimTrackerHit> scoring_hits{
543 const std::vector<ldmx::SimTrackerHit> scoring_hits_ecal{
548 const std::vector<ldmx::SimTrackerHit> tagger_sim_hits =
553 const std::vector<ldmx::SimTrackerHit> recoil_sim_hits =
558 if (tagger_sim_hits.size() == 0 && !skip_tagger_) {
559 ldmx_log(error) <<
"Tagger sim hits collection empty for event ";
561 if (recoil_sim_hits.size() == 0 && !skip_recoil_) {
562 ldmx_log(error) <<
"Recoil sim hits collection empty for event ";
566 std::map<int, std::vector<int>> hit_count_map_recoil;
569 std::map<int, std::vector<int>> hit_count_map_tagger;
573 std::vector<int> recoil_sh_idxs;
574 std::unordered_map<int, std::vector<int>> recoil_sh_count_map;
576 std::vector<int> tagger_sh_idxs;
577 std::unordered_map<int, std::vector<int>> tagger_sh_count_map;
581 for (
unsigned int i_sh = 0; i_sh < scoring_hits.size(); i_sh++) {
587 double tagger_p_max = 0.;
593 if (p_vec(2) < 0. || p_vec.norm() <
p_cut_)
continue;
596 if (abs(particleMap[hit.
getTrackID()].getCharge()) < 1e-8)
continue;
598 if (p_vec.norm() > tagger_p_max) {
599 tagger_sh_count_map[hit.
getTrackID()].push_back(i_sh);
607 if (p_vec(2) < 0. || p_vec.norm() <
p_cut_)
continue;
610 if (abs(particleMap[hit.
getTrackID()].getCharge()) < 1e-8)
continue;
612 recoil_sh_count_map[hit.
getTrackID()].push_back(i_sh);
617 for (std::pair<
int, std::vector<int>> element : recoil_sh_count_map) {
619 element.second.begin(), element.second.end(),
620 [&](
const int idx1,
int idx2) ->
bool {
621 const ldmx::SimTrackerHit& hit1 = scoring_hits.at(idx1);
622 const ldmx::SimTrackerHit& hit2 = scoring_hits.at(idx2);
624 Acts::Vector3 phit1{hit1.getMomentum()[0], hit1.getMomentum()[1],
625 hit1.getMomentum()[2]};
626 Acts::Vector3 phit2{hit2.getMomentum()[0], hit2.getMomentum()[1],
627 hit2.getMomentum()[2]};
629 return phit1.norm() > phit2.norm();
634 for (
auto& [_track_id, hit_indices] : tagger_sh_count_map) {
636 hit_indices.begin(), hit_indices.end(),
637 [&](
const int idx1,
int idx2) ->
bool {
638 const ldmx::SimTrackerHit& hit1 = scoring_hits.at(idx1);
639 const ldmx::SimTrackerHit& hit2 = scoring_hits.at(idx2);
641 Acts::Vector3 phit1{hit1.getMomentum()[0], hit1.getMomentum()[1],
642 hit1.getMomentum()[2]};
643 Acts::Vector3 phit2{hit2.getMomentum()[0], hit2.getMomentum()[1],
644 hit2.getMomentum()[2]};
646 return phit1.norm() > phit2.norm();
653 std::vector<ldmx::Track> tagger_truth_tracks;
654 std::vector<ldmx::Track> tagger_truth_seeds;
655 std::vector<ldmx::Track> recoil_truth_tracks;
656 std::vector<ldmx::Track> recoil_truth_seeds;
657 ldmx::Tracks beam_electrons;
661 auto targetSurface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
662 Acts::Vector3(0., 0., 0.))};
665 auto targetUnboundSurface = tracking::sim::utils::unboundSurface(0.);
668 auto ecalSurface = tracking::sim::utils::unboundSurface(240.5);
670 auto beamOriginSurface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
671 Acts::Vector3(beamOrigin_[0], beamOrigin_[1], beamOrigin_[2]))};
674 for (
const auto& [track_id, hit_indices] : tagger_sh_count_map) {
678 if (hit_count_map_tagger[hit.
getTrackID()].size() > n_min_hits_tagger_) {
680 createTruthTrack(phit, hit, truth_tagger_track, targetSurface);
681 truth_tagger_track.setNhits(
682 hit_count_map_tagger[hit.
getTrackID()].size());
683 tagger_truth_tracks.push_back(truth_tagger_track);
688 hit_count_map_tagger, beamOriginSurface, targetUnboundSurface);
689 beam_electrons.push_back(beamETruthSeed);
696 std::vector<ldmx::SimTrackerHit> ecal_spHits =
700 std::vector<ldmx::SimTrackerHit> sel_ecal_spHits;
702 for (
auto sp_hit : ecal_spHits) {
703 if (sp_hit.getMomentum()[2] > 0 && ((sp_hit.getID() & 0xfff) == 31)) {
704 sel_ecal_spHits.push_back(sp_hit);
710 for (std::pair<
int, std::vector<int>> element : recoil_sh_count_map) {
718 bool foundEcalHit =
false;
719 for (
auto ecal_sp_hit : sel_ecal_spHits) {
720 if (ecal_sp_hit.getTrackID() == hit.
getTrackID()) {
721 ecal_hit = ecal_sp_hit;
730 if (hit_count_map_recoil[hit.
getTrackID()].size() > n_min_hits_recoil_ &&
731 foundEcalHit && !skip_recoil_) {
734 ecal_hit, hit_count_map_recoil, targetSurface,
735 targetUnboundSurface, ecalSurface);
743 recoil_truth_tracks.push_back(truth_recoil_track);
764 for (
auto& tt : tagger_truth_tracks) {
765 ldmx::Track seed = seedFromTruth(tt, seedSmearing_);
767 tagger_truth_seeds.push_back(seed);
770 ldmx_log(debug) <<
"Forming seeds from truth" << std::endl;
771 for (
auto& tt : recoil_truth_tracks) {
772 ldmx_log(debug) <<
"Smearing truth track" << std::endl;
774 ldmx::Track seed = seedFromTruth(tt, seedSmearing_);
776 recoil_truth_seeds.push_back(seed);
781 event.add(
"beamElectrons", beam_electrons);
782 event.add(
"TaggerTruthTracks", tagger_truth_tracks);
783 event.add(
"RecoilTruthTracks", recoil_truth_tracks);
784 event.add(
"TaggerTruthSeeds", tagger_truth_seeds);
785 event.add(
"RecoilTruthSeeds", recoil_truth_seeds);
#define DECLARE_PRODUCER_NS(NS, CLASS)
Macro which allows the framework to construct a producer given its name during configuration.
Implements an event buffer system for storing event data.
Class which represents the process under execution.
Class encapsulating parameters for configuring a processor.
Class representing a simulated particle.
double getCharge() const
Get the charge of this particle.
std::vector< double > getVertex() const
Get a vector containing the vertex of this particle in mm.
int getPdgID() const
Get the PDG ID of this particle.
std::vector< double > getMomentum() const
Get a vector containing the momentum of this particle [MeV].
Represents a simulated tracker hit in the simulation.
int getPdgID() const
Get the Sim particle track ID of the hit.
std::vector< float > getPosition() const
Get the XYZ position of the hit [mm].
std::vector< double > getMomentum() const
Get the XYZ momentum of the particle at the position at which the hit took place [MeV].
int getTrackID() const
Get the Sim particle track ID of the hit.
Implementation of a track object.
void setPerigeeParameters(const std::vector< double > &par)
d_0 z_0 phi_0 theta q/p t
a helper base class providing some methods to shorten access to common conditions used within the tra...
float z_min_
Min cut on the z of the scoring hit.
void createTruthTrack(const ldmx::SimParticle &particle, ldmx::Track &trk, const std::shared_ptr< Acts::Surface > &target_surface)
Use the vertex position of the SimParticle to extract (x, y, z, px, py, pz, q) and create a track see...
ldmx::Track TaggerFullSeed(const ldmx::SimParticle &beam_electron, const int trackID, const ldmx::SimTrackerHit &hit, const std::map< int, std::vector< int > > &hit_count_map, const std::shared_ptr< Acts::Surface > &origin_surface, const std::shared_ptr< Acts::Surface > &target_surface)
This method retrieves the beam electron and forms a full seed The seed parameters are the truth param...
std::string input_pass_name_
Pass name for the sim hit collections.
std::string recoil_sim_hits_coll_name_
Sim hits to check if the truth seed is findable.
void onNewRun(const ldmx::RunHeader &rh) override
onNewRun is the first function called for each processor after the conditions are fully configured an...
std::vector< int > pdg_ids_
pdg_ids of the particles we want to select for the seeds
void produce(framework::Event &event) override
Main loop that creates the seed tracks for both the tagger and recoil tracker.
int track_id_
Only select a particular trackID.
void configure(framework::config::Parameters ¶meters) override
Callback for the EventProcessor to configure itself from the given set of parameters.
double pz_cut_
Ask for a minimum pz for the seeds.
TruthSeedProcessor(const std::string &name, framework::Process &process)
Constructor.
double p_cut_
Ask for a minimum p for the seeds.
void makeHitCountMap(const std::vector< ldmx::SimTrackerHit > &sim_hits, std::map< int, std::vector< int > > &hit_count_map)
Create a mapping from the selected scoring plane hit objects to the number of hits they associated pa...
std::string scoring_hits_coll_name_
Which scoring plane hits to use for the truth seeds generation.
std::string tagger_sim_hits_coll_name_
Sim hits to check if the truth seed is findable.
bool scoringPlaneHitFilter(const ldmx::SimTrackerHit &hit, const std::vector< ldmx::SimTrackerHit > &ecal_sp_hits)
Filter that checks if a scoring plane passes specified momentum cuts as well as if the associated Sim...
double p_cut_max_
Ask for a maximum p for the seeds.
int n_min_hits_tagger_
Minimum number of hits left in the recoil tracker to consider the seed as findable.
int n_min_hits_recoil_
Minimum number of hits left in the recoil tracker to consider the seed as findable.
ldmx::Track seedFromTruth(const ldmx::Track &tt, bool seed_smearing)
Create a track seed from a truth track applying a smearing to the truth parameters as well as an infl...
Acts::GeometryContext gctx_
The ACTS geometry context properly.