LDMX Software
Public Member Functions | Private Member Functions | Private Attributes | List of all members
tracking::reco::TruthSeedProcessor Class Reference

Create a track seed using truth information extracted from the corresponding SimParticle or SimTrackerHit. More...

#include <TruthSeedProcessor.h>

Public Member Functions

 TruthSeedProcessor (const std::string &name, framework::Process &process)
 Constructor.
 
 ~TruthSeedProcessor ()=default
 Destructor.
 
void configure (framework::config::Parameters &parameters) override
 Callback for the EventProcessor to configure itself from the given set of parameters.
 
void onProcessStart () override
 Callback for the EventProcessor to take any necessary action when the processing of events starts.
 
void onNewRun (const ldmx::RunHeader &rh) override
 onNewRun is the first function called for each processor after the conditions are fully configured and accessible.
 
void produce (framework::Event &event) override
 Main loop that creates the seed tracks for both the tagger and recoil tracker.
 
- Public Member Functions inherited from tracking::reco::TrackingGeometryUser
 TrackingGeometryUser (const std::string &name, framework::Process &p)
 
- Public Member Functions inherited from framework::Producer
 Producer (const std::string &name, Process &process)
 Class constructor.
 
virtual void beforeNewRun (ldmx::RunHeader &header)
 Handle allowing producers to modify run headers before the run begins.
 
- Public Member Functions inherited from framework::EventProcessor
 EventProcessor (const std::string &name, Process &process)
 Class constructor.
 
virtual ~EventProcessor ()
 Class destructor.
 
virtual void onFileOpen (EventFile &eventFile)
 Callback for the EventProcessor to take any necessary action when a new event input ROOT file is opened.
 
virtual void onFileClose (EventFile &eventFile)
 Callback for the EventProcessor to take any necessary action when a event input ROOT file is closed.
 
virtual void onProcessEnd ()
 Callback for the EventProcessor to take any necessary action when the processing of events finishes, such as calculating job-summary quantities.
 
template<class T >
const T & getCondition (const std::string &condition_name)
 Access a conditions object for the current event.
 
TDirectory * getHistoDirectory ()
 Access/create a directory in the histogram file for this event processor to create histograms and analysis tuples.
 
void setStorageHint (framework::StorageControl::Hint hint)
 Mark the current event as having the given storage control hint from this module.
 
void setStorageHint (framework::StorageControl::Hint hint, const std::string &purposeString)
 Mark the current event as having the given storage control hint from this module and the given purpose string.
 
int getLogFrequency () const
 Get the current logging frequency from the process.
 
int getRunNumber () const
 Get the run number from the process.
 
std::string getName () const
 Get the processor name.
 
void createHistograms (const std::vector< framework::config::Parameters > &histos)
 Internal function which is used to create histograms passed from the python configuration @parma histos vector of Parameters that configure histograms to create.
 

Private Member Functions

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 particle creates in the tracker.
 
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 seed.
 
void createTruthTrack (const ldmx::SimParticle &particle, const ldmx::SimTrackerHit &hit, ldmx::Track &trk, const std::shared_ptr< Acts::Surface > &target_surface)
 Use the scoring plane hit at the target to extract (x, y, z, px, py, pz) and create a track seed.
 
void createTruthTrack (const std::vector< double > &pos_vec, const std::vector< double > &p_vec, int charge, ldmx::Track &trk, const std::shared_ptr< Acts::Surface > &target_surface)
 Create a seed track from the given position, momentum and charge.
 
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 SimParticle hits the ECal.
 
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 inflation to the covariance matrix.
 
ldmx::Track RecoilFullSeed (const ldmx::SimParticle &particle, const int trackID, const ldmx::SimTrackerHit &hit, const ldmx::SimTrackerHit &ecal_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, const std::shared_ptr< Acts::Surface > &ecal_surface)
 
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 parameters from the beam electron stored at the beam origin Additionally, the foolowing track states are stored ts_smeared : the truth smeared perigee state at the beam origin ts_truth_target : the truth on-surface state at the target Linear extrapolations are done from the origin of the particle to the reference surfaces This track also contains the list of hits belonging to the beam electron on the sensitive surfaces on the tagger tracker, for acceptance studies.
 

Private Attributes

Acts::GeometryContext gctx_
 The ACTS geometry context properly.
 
std::vector< int > pdg_ids_ {11}
 pdg_ids of the particles we want to select for the seeds
 
std::string scoring_hits_coll_name_ {"TargetScoringPlaneHits"}
 Which scoring plane hits to use for the truth seeds generation.
 
std::string tagger_sim_hits_coll_name_ {"TaggerSimHits"}
 Sim hits to check if the truth seed is findable.
 
std::string recoil_sim_hits_coll_name_ {"RecoilSimHits"}
 Sim hits to check if the truth seed is findable.
 
int n_min_hits_tagger_ {7}
 Minimum number of hits left in the recoil tracker to consider the seed as findable.
 
int n_min_hits_recoil_ {7}
 Minimum number of hits left in the recoil tracker to consider the seed as findable.
 
float z_min_ {-999}
 Min cut on the z of the scoring hit.
 
int track_id_ {-999}
 Only select a particular trackID.
 
double pz_cut_ {-9999}
 Ask for a minimum pz for the seeds.
 
double p_cut_ {0.}
 Ask for a minimum p for the seeds.
 
double p_cut_max_ {100000.}
 Ask for a maximum p for the seeds.
 
double p_cut_ecal_ {-1.}
 
bool recoil_sp_ {true}
 
bool target_sp_ {true}
 
bool skip_tagger_ {false}
 
bool skip_recoil_ {false}
 
int max_track_id_ {5}
 
std::shared_ptr< LinPropagator > linpropagator_
 
std::shared_ptr< tracking::reco::TrackExtrapolatorTool< LinPropagator > > trk_extrap_
 
std::default_random_engine generator_
 
std::shared_ptr< std::normal_distribution< float > > normal_
 
bool seedSmearing_ {false}
 
std::vector< double > d0smear_
 
std::vector< double > z0smear_
 
double phismear_
 
double thetasmear_
 
double relpsmear_
 
std::vector< double > rel_smearfactors_
 
std::vector< double > inflate_factors_
 
std::vector< double > beamOrigin_ {-880.1, -44., 0.}
 

Additional Inherited Members

- Static Public Member Functions inherited from framework::EventProcessor
static void declare (const std::string &classname, int classtype, EventProcessorMaker *)
 Internal function which is part of the PluginFactory machinery.
 
- Static Public Attributes inherited from framework::Producer
static const int CLASSTYPE {1}
 Constant used to track EventProcessor types by the PluginFactory.
 
- Protected Member Functions inherited from tracking::reco::TrackingGeometryUser
const Acts::GeometryContext & geometry_context ()
 
const Acts::MagneticFieldContext & magnetic_field_context ()
 
const Acts::CalibrationContext & calibration_context ()
 
const geo::TrackersTrackingGeometrygeometry ()
 
- Protected Member Functions inherited from framework::EventProcessor
void abortEvent ()
 Abort the event immediately.
 
- Protected Attributes inherited from framework::EventProcessor
HistogramHelper histograms_
 Interface class for making and filling histograms.
 
NtupleManagerntuple_ {NtupleManager::getInstance()}
 Manager for any ntuples.
 
logging::logger theLog_
 The logger for this EventProcessor.
 

Detailed Description

Create a track seed using truth information extracted from the corresponding SimParticle or SimTrackerHit.

When creating seeds in the Tagger tracker, the SimParticle associated with the incident electron (trackID == 1) is used to create the seed from the parameters (x, y, z, px, py, pz, q) at the vertex. For the Recoil tracker, since the electron is produced upstream, the SimParticle can't be used to get any parameters at the target. In this case, the target scoring plane hits are used to extract the parameters above.

Definition at line 42 of file TruthSeedProcessor.h.

Constructor & Destructor Documentation

◆ TruthSeedProcessor()

tracking::reco::TruthSeedProcessor::TruthSeedProcessor ( const std::string &  name,
framework::Process process 
)

Constructor.

Parameters
nameName for this instance of the class.
processThe Process class associated with EventProcessor, provided by the framework.

Definition at line 7 of file TruthSeedProcessor.cxx.

9 : TrackingGeometryUser(name, process) {}

Member Function Documentation

◆ configure()

void tracking::reco::TruthSeedProcessor::configure ( framework::config::Parameters parameters)
overridevirtual

Callback for the EventProcessor to configure itself from the given set of parameters.

The parameters a processor has access to are the member variables of the python class in the sequence that has className equal to the EventProcessor class name.

Parameters
parametersParameters for configuration.

Reimplemented from framework::EventProcessor.

Definition at line 24 of file TruthSeedProcessor.cxx.

24 {
26 parameters.getParameter<std::string>("scoring_hits_coll_name");
28 parameters.getParameter<std::string>("recoil_sim_hits_coll_name");
30 parameters.getParameter<std::string>("tagger_sim_hits_coll_name");
31 n_min_hits_tagger_ = parameters.getParameter<int>("n_min_hits_tagger", 11);
32 n_min_hits_recoil_ = parameters.getParameter<int>("n_min_hits_recoil", 7);
33 pdg_ids_ = parameters.getParameter<std::vector<int>>("pdg_ids", {11});
34 z_min_ = parameters.getParameter<double>("z_min", -9999); // mm
35 track_id_ = parameters.getParameter<int>("track_id", -9999);
36 pz_cut_ = parameters.getParameter<double>("pz_cut", -9999); // MeV
37 p_cut_ = parameters.getParameter<double>("p_cut", 0.);
38 p_cut_max_ = parameters.getParameter<double>("p_cut_max", 100000.); // MeV
39 p_cut_ecal_ = parameters.getParameter<double>("p_cut_ecal", -1.); // MeV
40 recoil_sp_ = parameters.getParameter<double>("recoil_sp", true);
41 target_sp_ = parameters.getParameter<double>("tagger_sp", true);
42 seedSmearing_ = parameters.getParameter<bool>("seedSmearing", false);
43 max_track_id_ = parameters.getParameter<int>("max_track_id", 5);
44
45 ldmx_log(info) << "Seed Smearing is set to " << seedSmearing_;
46
47 d0smear_ = parameters.getParameter<std::vector<double>>("d0smear",
48 {0.01, 0.01, 0.01});
49 z0smear_ =
50 parameters.getParameter<std::vector<double>>("z0smear", {0.1, 0.1, 0.1});
51 phismear_ = parameters.getParameter<double>("phismear", 0.001);
52 thetasmear_ = parameters.getParameter<double>("thetasmear", 0.001);
53 relpsmear_ = parameters.getParameter<double>("relpsmear", 0.1);
54
55 // Relative smear factor terms, only used if seedSmearing_ is true.
56 rel_smearfactors_ = parameters.getParameter<std::vector<double>>(
57 "rel_smearfactors", {0.1, 0.1, 0.1, 0.1, 0.1, 0.1});
58 inflate_factors_ = parameters.getParameter<std::vector<double>>(
59 "inflate_factors", {10., 10., 10., 10., 10., 10.});
60
61 // In tracking frame: where do these numbers come from?
62 // These numbers come from approximating the path of the beam up
63 // until it is about to enter the first detector volume (TriggerPad1).
64 // In detector coordinates, (x,y,z) = (-21.7, -883) is
65 // where the beam arrives (if no smearing is applied) and we simply
66 // reorder these values so that they are in tracking coordinates.
67 beamOrigin_ = parameters.getParameter<std::vector<double>>(
68 "beamOrigin", {-883.0, -21.745876, 0.0});
69
70 // Skip the tagger or recoil trackers if wanted
71 skip_tagger_ = parameters.getParameter<bool>("skip_tagger", false);
72 skip_recoil_ = parameters.getParameter<bool>("skip_recoil", false);
73}
T getParameter(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:89
float z_min_
Min cut on the z of the scoring hit.
std::string recoil_sim_hits_coll_name_
Sim hits to check if the truth seed is findable.
std::vector< int > pdg_ids_
pdg_ids of the particles we want to select for the seeds
int track_id_
Only select a particular trackID.
double pz_cut_
Ask for a minimum pz for the seeds.
double p_cut_
Ask for a minimum p for the seeds.
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.
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.

References framework::config::Parameters::getParameter(), n_min_hits_recoil_, n_min_hits_tagger_, p_cut_, p_cut_max_, pdg_ids_, pz_cut_, recoil_sim_hits_coll_name_, scoring_hits_coll_name_, tagger_sim_hits_coll_name_, track_id_, and z_min_.

◆ createTruthTrack() [1/3]

void tracking::reco::TruthSeedProcessor::createTruthTrack ( const ldmx::SimParticle particle,
const ldmx::SimTrackerHit hit,
ldmx::Track trk,
const std::shared_ptr< Acts::Surface > &  target_surface 
)
private

Use the scoring plane hit at the target to extract (x, y, z, px, py, pz) and create a track seed.

In this case, the SimParticle is used to extract the charge of the particle.

Parameters
particleThe SimParticle to extract the charge from.
hitThe SimTrackerHit used to create the seed.

Definition at line 75 of file TruthSeedProcessor.cxx.

77 {
78 std::vector<double> pos{static_cast<double>(hit.getPosition()[0]),
79 static_cast<double>(hit.getPosition()[1]),
80 static_cast<double>(hit.getPosition()[2])};
81 createTruthTrack(pos, hit.getMomentum(), particle.getCharge(), trk,
82 target_surface);
83
84 trk.setTrackID(hit.getTrackID());
85 trk.setPdgID(hit.getPdgID());
86}
double getCharge() const
Get the charge of this particle.
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.
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...

References createTruthTrack(), ldmx::SimParticle::getCharge(), ldmx::SimTrackerHit::getMomentum(), ldmx::SimTrackerHit::getPdgID(), ldmx::SimTrackerHit::getPosition(), and ldmx::SimTrackerHit::getTrackID().

◆ createTruthTrack() [2/3]

void tracking::reco::TruthSeedProcessor::createTruthTrack ( const ldmx::SimParticle particle,
ldmx::Track trk,
const std::shared_ptr< Acts::Surface > &  target_surface 
)
private

Use the vertex position of the SimParticle to extract (x, y, z, px, py, pz, q) and create a track seed.

Parameters
particleThe SimParticle to make a seed from.

Definition at line 88 of file TruthSeedProcessor.cxx.

90 {
91 createTruthTrack(particle.getVertex(), particle.getMomentum(),
92 particle.getCharge(), trk, target_surface);
93
94 trk.setPdgID(particle.getPdgID());
95}
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.
Definition SimParticle.h:85
std::vector< double > getMomentum() const
Get a vector containing the momentum of this particle [MeV].

References createTruthTrack(), ldmx::SimParticle::getCharge(), ldmx::SimParticle::getMomentum(), ldmx::SimParticle::getPdgID(), and ldmx::SimParticle::getVertex().

Referenced by createTruthTrack(), createTruthTrack(), and TaggerFullSeed().

◆ createTruthTrack() [3/3]

void tracking::reco::TruthSeedProcessor::createTruthTrack ( const std::vector< double > &  pos_vec,
const std::vector< double > &  p_vec,
int  charge,
ldmx::Track trk,
const std::shared_ptr< Acts::Surface > &  target_surface 
)
private

Create a seed track from the given position, momentum and charge.

Parameters
posThe position at which the particle was created.
pThe momentum of the particle at the point of creation.
chargeThe charge of the particle.
target_surfacethe surface to where to express the truth track

Definition at line 97 of file TruthSeedProcessor.cxx.

100 {
101 // Get the position and momentum of the particle at the point of creation.
102 // This only works for the incident electron when creating a tagger tracker
103 // seed. For the recoil tracker, the scoring plane position will need to
104 // be used. For other particles created in the target or tracker planes,
105 // this version of the method can also be used.
106 // These are just Eigen vectors defined as
107 // Eigen::Matrix<double, kSize, 1>;
108 Acts::Vector3 pos{pos_vec[0], pos_vec[1], pos_vec[2]};
109 Acts::Vector3 mom{p_vec[0], p_vec[1], p_vec[2]};
110
111 // Rotate the position and momentum into the ACTS frame.
112 pos = tracking::sim::utils::Ldmx2Acts(pos);
113 mom = tracking::sim::utils::Ldmx2Acts(mom);
114
115 // Get the charge of the particle.
116 // TODO: Add function that uses the PDG ID to calculate this.
117 double q{charge * Acts::UnitConstants::e};
118
119 // The idea here is:
120 // 1 - Define a bound track state parameters at point P on track. Basically a
121 // curvilinear representation. 2 - Propagate to target surface to obtain the
122 // BoundTrackState there.
123
124 // Transform the position, momentum and charge to free parameters.
125 auto free_params{tracking::sim::utils::toFreeParameters(pos, mom, q)};
126
127 // Create a line surface at the perigee. The perigee position is extracted
128 // from a particle's vertex or the particle's position at a specific
129 // scoring plane.
130 auto gen_surface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
131 Acts::Vector3(free_params[Acts::eFreePos0], free_params[Acts::eFreePos1],
132 free_params[Acts::eFreePos2]))};
133
134 // std::cout<<"PF:: gen_surface"<< std::endl<<free_params[Acts::eFreePos0]<<"
135 // " <<free_params[Acts::eFreePos1]<<" " <<free_params[Acts::eFreePos2]<<
136 // std::endl;
137
138 // Transform the parameters to local positions on the perigee surface.
139 auto bound_params{
140 Acts::transformFreeToBoundParameters(free_params, *gen_surface, gctx_)
141 .value()};
142 int pdgid = 11; // electron
143 if (charge > 0) pdgid = -11; // positron
144 auto part{Acts::GenericParticleHypothesis(
145 Acts::ParticleHypothesis(Acts::PdgParticle(pdgid)))};
146 Acts::BoundTrackParameters boundTrkPars(gen_surface, bound_params,
147 std::nullopt, part);
148
149 // CAUTION:: The target surface should be close to the gen surface
150 // Linear propagation to the target surface. I assume 1mm of tolerance
151 Acts::Vector3 tgt_surf_center = target_surface->center(geometry_context());
152 Acts::Vector3 gen_surf_center = gen_surface->center(geometry_context());
153 // Tolerance
154 double tol = 1; // mm
155
156 if (abs(tgt_surf_center(0) - gen_surf_center(0)) > tol)
157 ldmx_log(error) << "Linear extrapolation to a far away surface in B field."
158 << " This will cause inaccuracies in track parameters"
159 << " Distance extrapolated = "
160 << (tgt_surf_center(0) - gen_surf_center(0)) << std::endl;
161
162 auto propBoundState = trk_extrap_->extrapolate(boundTrkPars, target_surface);
163
164 // Create the seed track object.
165 Acts::Vector3 ref = target_surface->center(geometry_context());
166 // trk.setPerigeeLocation(free_params[Acts::eFreePos0],
167 // free_params[Acts::eFreePos1],
168 // free_params[Acts::eFreePos2]);
169
170 trk.setPerigeeLocation(ref(0), ref(1), ref(2));
171
172 auto propBoundVec = (propBoundState.value()).parameters();
173
175 tracking::sim::utils::convertActsToLdmxPars(propBoundVec));
176
177 trk.setPosition(pos(0), pos(1), pos(2));
178 trk.setMomentum(mom(0), mom(1), mom(2));
179}
void setPerigeeParameters(const std::vector< double > &par)
d_0 z_0 phi_0 theta q/p t
Definition Track.h:144
Acts::GeometryContext gctx_
The ACTS geometry context properly.

References gctx_, and ldmx::Track::setPerigeeParameters().

◆ makeHitCountMap()

void tracking::reco::TruthSeedProcessor::makeHitCountMap ( const std::vector< ldmx::SimTrackerHit > &  sim_hits,
std::map< int, std::vector< int > > &  hit_count_map 
)
private

Create a mapping from the selected scoring plane hit objects to the number of hits they associated particle creates in the tracker.

Parameters
sim_hitsvector
hit_count_mapfilled with the hits lefts by each track

Definition at line 432 of file TruthSeedProcessor.cxx.

434 {
435 for (int i_sim_hit = 0; i_sim_hit < sim_hits.size(); i_sim_hit++) {
436 auto& sim_hit = sim_hits.at(i_sim_hit);
437 // This track never left a hit before
438 if (!hit_count_map.count(sim_hit.getTrackID())) {
439 hit_count_map[sim_hit.getTrackID()].push_back(i_sim_hit);
440 }
441
442 // This track left a hit before.
443 // Check if it's on a different sensor than the others
444
445 else {
446 int sensorID = tracking::sim::utils::getSensorID(sim_hit);
447 bool foundHit = false;
448
449 for (auto& i_rhit : hit_count_map[sim_hit.getTrackID()]) {
450 int tmp_sensorID =
451 tracking::sim::utils::getSensorID(sim_hits.at(i_rhit));
452
453 if (sensorID == tmp_sensorID) {
454 foundHit = true;
455 break;
456 }
457 } // loop on the already recorded hits
458
459 if (!foundHit) {
460 hit_count_map[sim_hit.getTrackID()].push_back(i_sim_hit);
461 }
462 }
463 } // loop on sim hits
464}

Referenced by produce().

◆ onNewRun()

void tracking::reco::TruthSeedProcessor::onNewRun ( const ldmx::RunHeader rh)
overridevirtual

onNewRun is the first function called for each processor after the conditions are fully configured and accessible.

This is where you could create single-processors, multi-event calculation objects.

Reimplemented from framework::EventProcessor.

Definition at line 11 of file TruthSeedProcessor.cxx.

11 {
12 gctx_ = Acts::GeometryContext();
13 normal_ = std::make_shared<std::normal_distribution<float>>(0., 1.);
14
15 Acts::StraightLineStepper stepper;
16 Acts::Navigator::Config navCfg{geometry().getTG()};
17 const Acts::Navigator navigator(navCfg);
18
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());
22}

References gctx_.

◆ onProcessStart()

void tracking::reco::TruthSeedProcessor::onProcessStart ( )
inlineoverridevirtual

Callback for the EventProcessor to take any necessary action when the processing of events starts.

For this class, the callback is used to retrieve the GeometryContext from ACTS.

Reimplemented from framework::EventProcessor.

Definition at line 73 of file TruthSeedProcessor.h.

73{};

◆ produce()

void tracking::reco::TruthSeedProcessor::produce ( framework::Event event)
overridevirtual

Main loop that creates the seed tracks for both the tagger and recoil tracker.

Parameters
eventThe event containing the collections to process.

Implements framework::Producer.

Definition at line 520 of file TruthSeedProcessor.cxx.

520 {
521 // Retrieve the particleMap
522 auto particleMap{event.getMap<int, ldmx::SimParticle>("SimParticles")};
523
524 // Retrieve the target scoring hits
525 // Information is extracted using the
526 // scoring plane hit left by the particle at the target.
527
528 const std::vector<ldmx::SimTrackerHit> scoring_hits{
529 event.getCollection<ldmx::SimTrackerHit>(scoring_hits_coll_name_)};
530
531 // Retrieve the scoring plane hits at the ECAL
532 const std::vector<ldmx::SimTrackerHit> scoring_hits_ecal{
533 event.getCollection<ldmx::SimTrackerHit>("EcalScoringPlaneHits")};
534
535 // Retrieve the sim hits in the tagger tracker
536 const std::vector<ldmx::SimTrackerHit> tagger_sim_hits =
538
539 // Retrieve the sim hits in the recoil tracker
540 const std::vector<ldmx::SimTrackerHit> recoil_sim_hits =
542
543 // If sim hit collections are empty throw a warning
544 if (tagger_sim_hits.size() == 0 && !skip_tagger_)
545 ldmx_log(error) << "Tagger sim hits collection empty for event "
546 << event.getEventNumber() << " in run "
547 << event.getEventHeader().getRun() << std::endl;
548 if (recoil_sim_hits.size() == 0 && !skip_recoil_)
549 ldmx_log(error) << "Recoil sim hits collection empty for event "
550 << event.getEventNumber() << " in run "
551 << event.getEventHeader().getRun() << std::endl;
552
553 // The map stores which track leaves which sim hits
554 std::map<int, std::vector<int>> hit_count_map_recoil;
555 makeHitCountMap(recoil_sim_hits, hit_count_map_recoil);
556
557 std::map<int, std::vector<int>> hit_count_map_tagger;
558 makeHitCountMap(tagger_sim_hits, hit_count_map_tagger);
559
560 // to keep track of how many sim particles leave hits on the scoring plane
561 std::vector<int> recoil_sh_idxs;
562 std::unordered_map<int, std::vector<int>> recoil_sh_count_map;
563
564 std::vector<int> tagger_sh_idxs;
565 std::unordered_map<int, std::vector<int>> tagger_sh_count_map;
566
567 // Target scoring hits for Tagger will have Z<0, Recoil scoring hits will have
568 // Z>0
569 for (unsigned int i_sh = 0; i_sh < scoring_hits.size(); i_sh++) {
570 const ldmx::SimTrackerHit& hit = scoring_hits.at(i_sh);
571 double zhit = hit.getPosition()[2];
572
573 Acts::Vector3 p_vec{hit.getMomentum()[0], hit.getMomentum()[1],
574 hit.getMomentum()[2]};
575 double tagger_p_max = 0.;
576
577 // Check if it is a tagger track going fwd that passes basic cuts
578 if (zhit < 0.) {
579 // Tagger selection cuts
580 // Negative scoring plane hit, with momentum > p_cut
581 if (p_vec(2) < 0. || p_vec.norm() < p_cut_) continue;
582
583 // Check that the hit was left by a charged particle
584 if (abs(particleMap[hit.getTrackID()].getCharge()) < 1e-8) continue;
585
586 if (p_vec.norm() > tagger_p_max) {
587 tagger_sh_count_map[hit.getTrackID()].push_back(i_sh);
588 }
589 } // Tagger loop
590
591 // Check the recoil hits
592 else {
593 // Recoil selection cuts
594 // Positive scoring plane hit, forward direction with momentum > p_cut
595 if (p_vec(2) < 0. || p_vec.norm() < p_cut_) continue;
596
597 // Check that the hit was left by a charged particle
598 if (abs(particleMap[hit.getTrackID()].getCharge()) < 1e-8) continue;
599
600 recoil_sh_count_map[hit.getTrackID()].push_back(i_sh);
601
602 } // Recoil
603 } // loop on Target scoring plane hits
604
605 for (std::pair<int, std::vector<int>> element : recoil_sh_count_map) {
606 std::sort(
607 element.second.begin(), element.second.end(),
608 [&](const int idx1, int idx2) -> bool {
609 const ldmx::SimTrackerHit& hit1 = scoring_hits.at(idx1);
610 const ldmx::SimTrackerHit& hit2 = scoring_hits.at(idx2);
611
612 Acts::Vector3 phit1{hit1.getMomentum()[0], hit1.getMomentum()[1],
613 hit1.getMomentum()[2]};
614 Acts::Vector3 phit2{hit2.getMomentum()[0], hit2.getMomentum()[1],
615 hit2.getMomentum()[2]};
616
617 return phit1.norm() > phit2.norm();
618 });
619 }
620
621 // Sort tagger hits.
622 for (auto& [_track_id, hit_indices] : tagger_sh_count_map) {
623 std::sort(
624 hit_indices.begin(), hit_indices.end(),
625 [&](const int idx1, int idx2) -> bool {
626 const ldmx::SimTrackerHit& hit1 = scoring_hits.at(idx1);
627 const ldmx::SimTrackerHit& hit2 = scoring_hits.at(idx2);
628
629 Acts::Vector3 phit1{hit1.getMomentum()[0], hit1.getMomentum()[1],
630 hit1.getMomentum()[2]};
631 Acts::Vector3 phit2{hit2.getMomentum()[0], hit2.getMomentum()[1],
632 hit2.getMomentum()[2]};
633
634 return phit1.norm() > phit2.norm();
635 });
636 }
637
638 // Building of the event truth information and the truth seeds
639 // TODO remove the truthtracks in the future as the truth seeds are enough
640
641 std::vector<ldmx::Track> tagger_truth_tracks;
642 std::vector<ldmx::Track> tagger_truth_seeds;
643 std::vector<ldmx::Track> recoil_truth_tracks;
644 std::vector<ldmx::Track> recoil_truth_seeds;
645 ldmx::Tracks beam_electrons;
646
647 // TODO:: The target should be taken from some conditions DB in the future.
648 // Define the perigee_surface at 0.0.0
649 auto targetSurface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
650 Acts::Vector3(0., 0., 0.))};
651
652 // Define the target_surface
653 auto targetUnboundSurface = tracking::sim::utils::unboundSurface(0.);
654
655 // ecal
656 auto ecalSurface = tracking::sim::utils::unboundSurface(240.5);
657
658 auto beamOriginSurface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
659 Acts::Vector3(beamOrigin_[0], beamOrigin_[1], beamOrigin_[2]))};
660
661 if (!skip_tagger_) {
662 for (const auto& [track_id, hit_indices] : tagger_sh_count_map) {
663 const ldmx::SimTrackerHit& hit = scoring_hits.at(hit_indices.at(0));
664 const ldmx::SimParticle& phit = particleMap[hit.getTrackID()];
665
666 if (hit_count_map_tagger[hit.getTrackID()].size() > n_min_hits_tagger_) {
667 ldmx::Track truth_tagger_track;
668 createTruthTrack(phit, hit, truth_tagger_track, targetSurface);
669 truth_tagger_track.setNhits(
670 hit_count_map_tagger[hit.getTrackID()].size());
671 tagger_truth_tracks.push_back(truth_tagger_track);
672
673 if (hit.getPdgID() == 11 && hit.getTrackID() < max_track_id_) {
674 ldmx::Track beamETruthSeed = TaggerFullSeed(
675 particleMap[hit.getTrackID()], hit.getTrackID(), hit,
676 hit_count_map_tagger, beamOriginSurface, targetUnboundSurface);
677 beam_electrons.push_back(beamETruthSeed);
678 }
679 }
680 }
681 }
682
683 // Recover the EcalScoring hits
684 std::vector<ldmx::SimTrackerHit> ecal_spHits =
685 event.getCollection<ldmx::SimTrackerHit>("EcalScoringPlaneHits");
686 // Select ECAL hits
687 std::vector<ldmx::SimTrackerHit> sel_ecal_spHits;
688
689 for (auto sp_hit : ecal_spHits) {
690 if (sp_hit.getMomentum()[2] > 0 && ((sp_hit.getID() & 0xfff) == 31)) {
691 sel_ecal_spHits.push_back(sp_hit);
692 }
693 }
694
695 // Recoil target surface for truth and seed tracks is the target
696
697 for (std::pair<int, std::vector<int>> element : recoil_sh_count_map) {
698 // Only take the first entry of the vector: it should be the scoring plane
699 // hit with the highest momentum.
700 const ldmx::SimTrackerHit& hit = scoring_hits.at(element.second.at(0));
701 [[maybe_unused]] const ldmx::SimParticle& phit =
702 particleMap[hit.getTrackID()];
703 ldmx::SimTrackerHit ecal_hit;
704
705 bool foundEcalHit = false;
706 for (auto ecal_sp_hit : sel_ecal_spHits) {
707 if (ecal_sp_hit.getTrackID() == hit.getTrackID()) {
708 ecal_hit = ecal_sp_hit;
709 foundEcalHit = true;
710 break;
711 }
712 }
713
714 // Findable particle selection
715 if (hit_count_map_recoil[hit.getTrackID()].size() > n_min_hits_recoil_ &&
716 foundEcalHit && !skip_recoil_) {
717 ldmx::Track truth_recoil_track =
718 RecoilFullSeed(particleMap[hit.getTrackID()], hit.getTrackID(), hit,
719 ecal_hit, hit_count_map_recoil, targetSurface,
720 targetUnboundSurface, ecalSurface);
721 recoil_truth_tracks.push_back(truth_recoil_track);
722 }
723 }
724
725 /*
726 for (std::pair<int,std::vector<int>> element : recoil_sh_count_map) {
727
728 const ldmx::SimTrackerHit& hit = scoring_hits.at(element.second.at(0));
729 const ldmx::SimParticle& phit = particleMap[hit.getTrackID()];
730
731 if (hit_count_map_recoil[hit.getTrackID()].size() > n_min_hits_recoil_) {
732 ldmx::Track truth_recoil_track;
733 createTruthTrack(phit,hit,truth_recoil_track,targetSurface);
734 truth_recoil_track.setNhits(hit_count_map_recoil[hit.getTrackID()].size());
735 recoil_truth_tracks.push_back(truth_recoil_track);
736 }
737 }
738 */
739
740 // Form a truth seed from a truth track
741
742 for (auto& tt : tagger_truth_tracks) {
743 ldmx::Track seed = seedFromTruth(tt, seedSmearing_);
744
745 tagger_truth_seeds.push_back(seed);
746 }
747
748 ldmx_log(debug) << "Forming seeds from truth" << std::endl;
749 for (auto& tt : recoil_truth_tracks) {
750 ldmx_log(debug) << "Smearing truth track" << std::endl;
751
752 ldmx::Track seed = seedFromTruth(tt, seedSmearing_);
753
754 recoil_truth_seeds.push_back(seed);
755 }
756
757 // even if skip_tagger/recoil_ is true, still make the collections in the
758 // event
759 event.add("beamElectrons", beam_electrons);
760 event.add("TaggerTruthTracks", tagger_truth_tracks);
761 event.add("RecoilTruthTracks", recoil_truth_tracks);
762 event.add("TaggerTruthSeeds", tagger_truth_seeds);
763 event.add("RecoilTruthSeeds", recoil_truth_seeds);
764}
Class representing a simulated particle.
Definition SimParticle.h:23
Represents a simulated tracker hit in the simulation.
Implementation of a track object.
Definition Track.h:52
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...
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...
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...

References ldmx::SimTrackerHit::getMomentum(), ldmx::SimTrackerHit::getPosition(), ldmx::SimTrackerHit::getTrackID(), makeHitCountMap(), p_cut_, recoil_sim_hits_coll_name_, scoring_hits_coll_name_, and tagger_sim_hits_coll_name_.

◆ RecoilFullSeed()

ldmx::Track tracking::reco::TruthSeedProcessor::RecoilFullSeed ( const ldmx::SimParticle particle,
const int  trackID,
const ldmx::SimTrackerHit hit,
const ldmx::SimTrackerHit ecal_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,
const std::shared_ptr< Acts::Surface > &  ecal_surface 
)
private

Definition at line 183 of file TruthSeedProcessor.cxx.

189 {
190 ldmx::Track truth_recoil_track;
191 createTruthTrack(particle, hit, truth_recoil_track, origin_surface);
192 truth_recoil_track.setTrackID(trackID);
193
194 // Seed at the target location
195 ldmx::Track smearedTruthTrack = seedFromTruth(truth_recoil_track, false);
196
197 // Add the track state at the target
198 ldmx::Track truth_track_target;
199 createTruthTrack(particle, hit, truth_track_target, target_surface);
200
201 // Store the truth track state on the seed track
202 ldmx::Track::TrackState ts_truth_target;
203 Acts::Vector3 ref = target_surface->center(geometry_context());
204 ts_truth_target.refX = ref(0);
205 ts_truth_target.refY = ref(1);
206 ts_truth_target.refZ = ref(2);
207 ts_truth_target.params = truth_track_target.getPerigeeParameters();
208 // empty cov
209 ts_truth_target.ts_type = ldmx::TrackStateType::AtTarget;
210 smearedTruthTrack.addTrackState(ts_truth_target);
211
212 // Add the track state at the ecal
213 ldmx::Track truth_track_ecal;
214 createTruthTrack(particle, ecal_hit, truth_track_ecal, ecal_surface);
215
216 ldmx::Track::TrackState ts_truth_ecal;
217 Acts::Vector3 ref_ecal = ecal_surface->center(geometry_context());
218 ts_truth_ecal.refX = ref_ecal(0);
219 ts_truth_ecal.refY = ref_ecal(1);
220 ts_truth_ecal.refZ = ref_ecal(2);
221 ts_truth_ecal.params = truth_track_ecal.getPerigeeParameters();
222 // empty cov
223 ts_truth_ecal.ts_type = ldmx::TrackStateType::AtECAL;
224 smearedTruthTrack.addTrackState(ts_truth_ecal);
225
226 // Add the hits
227 int nhits = 0;
228
229 for (auto sim_hit_idx : hit_count_map.at(smearedTruthTrack.getTrackID())) {
230 smearedTruthTrack.addMeasurementIndex(sim_hit_idx);
231 nhits += 1;
232 }
233
234 smearedTruthTrack.setNhits(nhits);
235
236 return smearedTruthTrack;
237}

◆ scoringPlaneHitFilter()

bool tracking::reco::TruthSeedProcessor::scoringPlaneHitFilter ( const ldmx::SimTrackerHit hit,
const std::vector< ldmx::SimTrackerHit > &  ecal_sp_hits 
)
private

Filter that checks if a scoring plane passes specified momentum cuts as well as if the associated SimParticle hits the ECal.

Parameters
hitThe target scoring plane hit to check.
ecal_sp_hitsThe ECal scoring plane hit used to check if the associated particle hits the ECal.

Definition at line 466 of file TruthSeedProcessor.cxx.

468 {
469 // Clean some of the hits we don't want
470 if (hit.getPosition()[2] < z_min_) return false;
471
472 // Check if the track_id was requested
473 if (track_id_ > 0 && hit.getTrackID() != track_id_) return false;
474
475 // Check if we are requesting particular particles
476 if (std::find(pdg_ids_.begin(), pdg_ids_.end(), hit.getPdgID()) ==
477 pdg_ids_.end())
478 return false;
479
480 Acts::Vector3 p_vec{hit.getMomentum()[0], hit.getMomentum()[1],
481 hit.getMomentum()[2]};
482
483 // p cut
484 if (p_cut_ >= 0. && p_vec.norm() < p_cut_) return false;
485
486 // p cut Max
487 if (p_cut_ < 100000. && p_vec.norm() > p_cut_max_) return false;
488
489 // pz cut
490 if (pz_cut_ > -9999 && p_vec(2) < pz_cut_) return false;
491
492 // Check the ecal scoring plane
493 bool pass_ecal_scoring_plane = true;
494
495 if (p_cut_ecal_ > 0) { // only check if we care about it.
496
497 for (auto& e_sp_hit : ecal_sp_hits) {
498 if (e_sp_hit.getTrackID() == hit.getTrackID() &&
499 e_sp_hit.getPdgID() == hit.getPdgID()) {
500 Acts::Vector3 e_sp_p{e_sp_hit.getMomentum()[0],
501 e_sp_hit.getMomentum()[1],
502 e_sp_hit.getMomentum()[2]};
503
504 if (e_sp_p.norm() < p_cut_ecal_) pass_ecal_scoring_plane = false;
505
506 // Skip the rest of the scoring plane hits since we already found the
507 // track we care about
508 break;
509
510 } // check that the hit belongs to the inital particle from the target
511 // scoring plane hit
512 } // loop on Ecal scoring plane hits
513 } // pcutEcal
514
515 if (!pass_ecal_scoring_plane) return false;
516
517 return true;
518}

References ldmx::SimTrackerHit::getMomentum(), ldmx::SimTrackerHit::getPdgID(), ldmx::SimTrackerHit::getPosition(), ldmx::SimTrackerHit::getTrackID(), p_cut_, p_cut_max_, pdg_ids_, pz_cut_, track_id_, and z_min_.

◆ seedFromTruth()

ldmx::Track tracking::reco::TruthSeedProcessor::seedFromTruth ( const ldmx::Track tt,
bool  seed_smearing 
)
private

Create a track seed from a truth track applying a smearing to the truth parameters as well as an inflation to the covariance matrix.

Parameters
ttTruthTrack to be used to form a seed
Returns
seed The seed track

Definition at line 316 of file TruthSeedProcessor.cxx.

317 {
318 ldmx::Track seed = ldmx::Track();
319 seed.setPerigeeLocation(tt.getPerigeeLocation()[0],
320 tt.getPerigeeLocation()[1],
321 tt.getPerigeeLocation()[2]);
322 seed.setChi2(0.);
323 seed.setNhits(tt.getNhits());
324 seed.setNdf(0);
325 seed.setNsharedHits(0);
326 seed.setTrackID(tt.getTrackID());
327 seed.setPdgID(tt.getPdgID());
328 seed.setTruthProb(1.);
329
330 Acts::BoundVector bound_params;
331 Acts::BoundVector stddev;
332
333 if (seed_smearing) {
334 ldmx_log(debug) << "Smear track and inflate covariance" << std::endl;
335
336 /*
337 double sigma_d0 = rel_smearfactors_[Acts::eBoundLoc0] * tt.getD0();
338 double sigma_z0 = rel_smearfactors_[Acts::eBoundLoc1] * tt.getZ0();
339 double sigma_phi = rel_smearfactors_[Acts::eBoundPhi] * tt.getPhi();
340 double sigma_theta = rel_smearfactors_[Acts::eBoundTheta] *
341 tt.getTheta(); double sigma_p = rel_smearfactors_[Acts::eBoundQOverP]
342 * abs(1/tt.getQoP()); double sigma_t =
343 rel_smearfactors_[Acts::eBoundTime] * tt.getT();
344 */
345
346 double sigma_d0 = d0smear_[0];
347 double sigma_z0 = z0smear_[0];
348 double sigma_phi = phismear_;
349 double sigma_theta = thetasmear_;
350 double sigma_p = relpsmear_ * abs(1 / tt.getQoP());
351 double sigma_t = 1. * Acts::UnitConstants::ns;
352
353 double smear = (*normal_)(generator_);
354 double d0smear = tt.getD0() + smear * sigma_d0;
355
356 smear = (*normal_)(generator_);
357 double z0smear = tt.getZ0() + smear * sigma_z0;
358
359 smear = (*normal_)(generator_);
360 double Phismear = tt.getPhi() + smear * sigma_phi;
361
362 smear = (*normal_)(generator_);
363 double Thetasmear = tt.getTheta() + smear * sigma_theta;
364
365 double p = std::abs(1. / tt.getQoP());
366 smear = (*normal_)(generator_);
367 double Psmear = p + smear * sigma_p;
368
369 double Q = tt.getQoP() < 0 ? -1. : 1.;
370 double QoPsmear = Q / Psmear;
371
372 smear = (*normal_)(generator_);
373 double Tsmear = tt.getT() + smear * sigma_t;
374
375 bound_params << d0smear, z0smear, Phismear, Thetasmear, QoPsmear, Tsmear;
376
377 stddev[Acts::eBoundLoc0] =
378 inflate_factors_[Acts::eBoundLoc0] * sigma_d0 * Acts::UnitConstants::mm;
379 stddev[Acts::eBoundLoc1] =
380 inflate_factors_[Acts::eBoundLoc1] * sigma_z0 * Acts::UnitConstants::mm;
381 stddev[Acts::eBoundPhi] = inflate_factors_[Acts::eBoundPhi] * sigma_phi;
382 stddev[Acts::eBoundTheta] =
383 inflate_factors_[Acts::eBoundTheta] * sigma_theta;
384 stddev[Acts::eBoundQOverP] =
385 inflate_factors_[Acts::eBoundQOverP] * (1. / p) * (1. / p) * sigma_p;
386 stddev[Acts::eBoundTime] =
387 inflate_factors_[Acts::eBoundTime] * sigma_t * Acts::UnitConstants::ns;
388
389 ldmx_log(debug) << stddev << std::endl;
390
391 std::vector<double> v_seed_params(
392 (bound_params).data(),
393 bound_params.data() + bound_params.rows() * bound_params.cols());
394
395 Acts::BoundSquareMatrix bound_cov =
396 stddev.cwiseProduct(stddev).asDiagonal();
397 std::vector<double> v_seed_cov;
398 tracking::sim::utils::flatCov(bound_cov, v_seed_cov);
399 seed.setPerigeeParameters(v_seed_params);
400 seed.setPerigeeCov(v_seed_cov);
401
402 } else {
403 // Do not smear the seed
404
405 bound_params << tt.getD0(), tt.getZ0(), tt.getPhi(), tt.getTheta(),
406 tt.getQoP(), tt.getT();
407
408 std::vector<double> v_seed_params(
409 (bound_params).data(),
410 bound_params.data() + bound_params.rows() * bound_params.cols());
411
412 double p = std::abs(1. / tt.getQoP());
413 double sigma_p = 0.75 * p * Acts::UnitConstants::GeV;
414 stddev[Acts::eBoundLoc0] = 2 * Acts::UnitConstants::mm;
415 stddev[Acts::eBoundLoc1] = 5 * Acts::UnitConstants::mm;
416 stddev[Acts::eBoundTime] = 1000 * Acts::UnitConstants::ns;
417 stddev[Acts::eBoundPhi] = 5 * Acts::UnitConstants::degree;
418 stddev[Acts::eBoundTheta] = 5 * Acts::UnitConstants::degree;
419 stddev[Acts::eBoundQOverP] = (1. / p) * (1. / p) * sigma_p;
420
421 Acts::BoundSquareMatrix bound_cov =
422 stddev.cwiseProduct(stddev).asDiagonal();
423 std::vector<double> v_seed_cov;
424 tracking::sim::utils::flatCov(bound_cov, v_seed_cov);
425 seed.setPerigeeParameters(v_seed_params);
426 seed.setPerigeeCov(v_seed_cov);
427 }
428
429 return seed;
430}

References ldmx::Track::setPerigeeParameters().

Referenced by TaggerFullSeed().

◆ TaggerFullSeed()

ldmx::Track tracking::reco::TruthSeedProcessor::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 
)
private

This method retrieves the beam electron and forms a full seed The seed parameters are the truth parameters from the beam electron stored at the beam origin Additionally, the foolowing track states are stored ts_smeared : the truth smeared perigee state at the beam origin ts_truth_target : the truth on-surface state at the target Linear extrapolations are done from the origin of the particle to the reference surfaces This track also contains the list of hits belonging to the beam electron on the sensitive surfaces on the tagger tracker, for acceptance studies.

Parameters
beam_electron: the beam electron particle
hit: the scoring hit at the target from the beam electron particle survived
hit_count_map: the sim hit on track map
origin_surface: where to express the track origin parameters. Can be perigee, plane...
target_surface: the target surface for the truth target state

Definition at line 239 of file TruthSeedProcessor.cxx.

244 {
245 ldmx::Track truth_track;
246
247 createTruthTrack(beam_electron, truth_track, origin_surface);
248 truth_track.setTrackID(trackID);
249
250 // Smeared track at the beam origin
251 ldmx::Track smearedTruthTrack = seedFromTruth(truth_track, true);
252
253 ldmx_log(debug) << "Truth parameters at beam origin" << std::endl;
254 for (auto par : truth_track.getPerigeeParameters())
255 ldmx_log(debug) << par << " ";
256 ldmx_log(debug) << std::endl;
257
258 // Add the truth track state at the target
259 // Truth track target will be obtained from the scoring plane hit then
260 // extrapolated linearly to the target surface
261
262 ldmx::Track truth_track_target;
263 createTruthTrack(beam_electron, hit, truth_track_target, target_surface);
264
265 // Store the truth track state on the seed track
266 ldmx::Track::TrackState ts_truth_target;
267 Acts::Vector3 ref = target_surface->center(geometry_context());
268 ts_truth_target.refX = ref(0);
269 ts_truth_target.refY = ref(1);
270 ts_truth_target.refZ = ref(2);
271 ts_truth_target.params = truth_track_target.getPerigeeParameters();
272 // empty cov
273 ts_truth_target.ts_type = ldmx::TrackStateType::AtTarget;
274 smearedTruthTrack.addTrackState(ts_truth_target);
275
276 ldmx_log(debug) << "Truth parameters at target" << std::endl;
277 for (auto par : truth_track_target.getPerigeeParameters())
278 ldmx_log(debug) << par << " ";
279 ldmx_log(debug) << std::endl;
280
281 // This is the un-smeared truth track that can be used for pulls and residuals
282 ldmx::Track seedTruthTrack = seedFromTruth(truth_track, false);
283
284 ldmx::Track::TrackState ts_truth_beam_origin;
285 Acts::Vector3 ref_origin = origin_surface->center(geometry_context());
286 ts_truth_beam_origin.refX = ref_origin(0);
287 ts_truth_beam_origin.refY = ref_origin(1);
288 ts_truth_beam_origin.refZ = ref_origin(2);
289 ts_truth_beam_origin.params = seedTruthTrack.getPerigeeParameters();
290 // ts_truth_beam_origin.cov = seedTruthTrack.getPerigeeCov();
291 ts_truth_beam_origin.ts_type = ldmx::TrackStateType::AtBeamOrigin;
292 smearedTruthTrack.addTrackState(ts_truth_beam_origin);
293
294 ldmx_log(debug) << "Smeared parameters at origin" << std::endl;
295 for (auto par : smearedTruthTrack.getPerigeeParameters())
296 ldmx_log(debug) << par << " ";
297 ldmx_log(debug) << std::endl;
298
299 // assign the sim hit indices
300 // TODO this is not fully correct as the sim hits
301 // might be duplicated on sensors
302 // and should be merged if that is the case
303
304 int nhits = 0;
305
306 for (auto sim_hit_idx : hit_count_map.at(smearedTruthTrack.getTrackID())) {
307 smearedTruthTrack.addMeasurementIndex(sim_hit_idx);
308 nhits += 1;
309 }
310
311 smearedTruthTrack.setNhits(nhits);
312
313 return smearedTruthTrack;
314}

References createTruthTrack(), and seedFromTruth().

Member Data Documentation

◆ beamOrigin_

std::vector<double> tracking::reco::TruthSeedProcessor::beamOrigin_ {-880.1, -44., 0.}
private

Definition at line 274 of file TruthSeedProcessor.h.

274{-880.1, -44., 0.};

◆ d0smear_

std::vector<double> tracking::reco::TruthSeedProcessor::d0smear_
private

Definition at line 267 of file TruthSeedProcessor.h.

◆ gctx_

Acts::GeometryContext tracking::reco::TruthSeedProcessor::gctx_
private

The ACTS geometry context properly.

Definition at line 192 of file TruthSeedProcessor.h.

Referenced by createTruthTrack(), and onNewRun().

◆ generator_

std::default_random_engine tracking::reco::TruthSeedProcessor::generator_
private

Definition at line 262 of file TruthSeedProcessor.h.

◆ inflate_factors_

std::vector<double> tracking::reco::TruthSeedProcessor::inflate_factors_
private

Definition at line 273 of file TruthSeedProcessor.h.

◆ linpropagator_

std::shared_ptr<LinPropagator> tracking::reco::TruthSeedProcessor::linpropagator_
private

Definition at line 254 of file TruthSeedProcessor.h.

◆ max_track_id_

int tracking::reco::TruthSeedProcessor::max_track_id_ {5}
private

Definition at line 252 of file TruthSeedProcessor.h.

252{5};

◆ n_min_hits_recoil_

int tracking::reco::TruthSeedProcessor::n_min_hits_recoil_ {7}
private

Minimum number of hits left in the recoil tracker to consider the seed as findable.

Definition at line 216 of file TruthSeedProcessor.h.

216{7};

Referenced by configure().

◆ n_min_hits_tagger_

int tracking::reco::TruthSeedProcessor::n_min_hits_tagger_ {7}
private

Minimum number of hits left in the recoil tracker to consider the seed as findable.

Definition at line 210 of file TruthSeedProcessor.h.

210{7};

Referenced by configure().

◆ normal_

std::shared_ptr<std::normal_distribution<float> > tracking::reco::TruthSeedProcessor::normal_
private

Definition at line 263 of file TruthSeedProcessor.h.

◆ p_cut_

double tracking::reco::TruthSeedProcessor::p_cut_ {0.}
private

Ask for a minimum p for the seeds.

Definition at line 231 of file TruthSeedProcessor.h.

231{0.};

Referenced by configure(), produce(), and scoringPlaneHitFilter().

◆ p_cut_ecal_

double tracking::reco::TruthSeedProcessor::p_cut_ecal_ {-1.}
private

Definition at line 237 of file TruthSeedProcessor.h.

237{-1.};

◆ p_cut_max_

double tracking::reco::TruthSeedProcessor::p_cut_max_ {100000.}
private

Ask for a maximum p for the seeds.

Definition at line 234 of file TruthSeedProcessor.h.

234{100000.};

Referenced by configure(), and scoringPlaneHitFilter().

◆ pdg_ids_

std::vector<int> tracking::reco::TruthSeedProcessor::pdg_ids_ {11}
private

pdg_ids of the particles we want to select for the seeds

Definition at line 195 of file TruthSeedProcessor.h.

195{11};

Referenced by configure(), and scoringPlaneHitFilter().

◆ phismear_

double tracking::reco::TruthSeedProcessor::phismear_
private

Definition at line 269 of file TruthSeedProcessor.h.

◆ pz_cut_

double tracking::reco::TruthSeedProcessor::pz_cut_ {-9999}
private

Ask for a minimum pz for the seeds.

Definition at line 228 of file TruthSeedProcessor.h.

228{-9999};

Referenced by configure(), and scoringPlaneHitFilter().

◆ recoil_sim_hits_coll_name_

std::string tracking::reco::TruthSeedProcessor::recoil_sim_hits_coll_name_ {"RecoilSimHits"}
private

Sim hits to check if the truth seed is findable.

Definition at line 204 of file TruthSeedProcessor.h.

204{"RecoilSimHits"};

Referenced by configure(), and produce().

◆ recoil_sp_

bool tracking::reco::TruthSeedProcessor::recoil_sp_ {true}
private

Definition at line 240 of file TruthSeedProcessor.h.

240{true};

◆ rel_smearfactors_

std::vector<double> tracking::reco::TruthSeedProcessor::rel_smearfactors_
private

Definition at line 272 of file TruthSeedProcessor.h.

◆ relpsmear_

double tracking::reco::TruthSeedProcessor::relpsmear_
private

Definition at line 271 of file TruthSeedProcessor.h.

◆ scoring_hits_coll_name_

std::string tracking::reco::TruthSeedProcessor::scoring_hits_coll_name_ {"TargetScoringPlaneHits"}
private

Which scoring plane hits to use for the truth seeds generation.

Definition at line 198 of file TruthSeedProcessor.h.

198{"TargetScoringPlaneHits"};

Referenced by configure(), and produce().

◆ seedSmearing_

bool tracking::reco::TruthSeedProcessor::seedSmearing_ {false}
private

Definition at line 265 of file TruthSeedProcessor.h.

265{false};

◆ skip_recoil_

bool tracking::reco::TruthSeedProcessor::skip_recoil_ {false}
private

Definition at line 249 of file TruthSeedProcessor.h.

249{false};

◆ skip_tagger_

bool tracking::reco::TruthSeedProcessor::skip_tagger_ {false}
private

Definition at line 246 of file TruthSeedProcessor.h.

246{false};

◆ tagger_sim_hits_coll_name_

std::string tracking::reco::TruthSeedProcessor::tagger_sim_hits_coll_name_ {"TaggerSimHits"}
private

Sim hits to check if the truth seed is findable.

Definition at line 201 of file TruthSeedProcessor.h.

201{"TaggerSimHits"};

Referenced by configure(), and produce().

◆ target_sp_

bool tracking::reco::TruthSeedProcessor::target_sp_ {true}
private

Definition at line 243 of file TruthSeedProcessor.h.

243{true};

◆ thetasmear_

double tracking::reco::TruthSeedProcessor::thetasmear_
private

Definition at line 270 of file TruthSeedProcessor.h.

◆ track_id_

int tracking::reco::TruthSeedProcessor::track_id_ {-999}
private

Only select a particular trackID.

Definition at line 225 of file TruthSeedProcessor.h.

225{-999};

Referenced by configure(), and scoringPlaneHitFilter().

◆ trk_extrap_

std::shared_ptr<tracking::reco::TrackExtrapolatorTool<LinPropagator> > tracking::reco::TruthSeedProcessor::trk_extrap_
private

Definition at line 258 of file TruthSeedProcessor.h.

◆ z0smear_

std::vector<double> tracking::reco::TruthSeedProcessor::z0smear_
private

Definition at line 268 of file TruthSeedProcessor.h.

◆ z_min_

float tracking::reco::TruthSeedProcessor::z_min_ {-999}
private

Min cut on the z of the scoring hit.

It could be used to clean the scoring hits if desired.

Definition at line 222 of file TruthSeedProcessor.h.

222{-999};

Referenced by configure(), and scoringPlaneHitFilter().


The documentation for this class was generated from the following files: