LDMX Software
tracking::reco::SeedFinderProcessor Class Reference

Public Member Functions

 SeedFinderProcessor (const std::string &name, framework::Process &process)
 Constructor.
 
virtual ~SeedFinderProcessor ()=default
 Destructor.
 
void onProcessStart () override
 Callback for the EventProcessor to take any necessary action when the processing of events starts, such as creating histograms.
 
void onProcessEnd () override
 Callback for the EventProcessor to take any necessary action when the processing of events finishes, such as calculating job-summary quantities.
 
void configure (framework::config::Parameters &parameters) override
 Configure the processor using the given user specified parameters.
 
void produce (framework::Event &event) override
 Run the processor and create a collection of results which indicate if a charge particle can be found by the recoil tracker.
 
bool groupStrips (const std::vector< ldmx::Measurement > &measurements, const std::vector< int > strategy)
 
void findSeedsFromMap (std::vector< ldmx::Track > &seeds, const ldmx::Measurements &pmeas)
 
- 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 process (Event &event) final
 Processing an event for a Producer is calling produce.
 
- Public Member Functions inherited from framework::EventProcessor
 DECLARE_FACTORY (EventProcessor, EventProcessor *, const std::string &, Process &)
 declare that we have a factory for this class
 
 EventProcessor (const std::string &name, Process &process)
 Class constructor.
 
virtual ~EventProcessor ()=default
 Class destructor.
 
virtual void beforeNewRun (ldmx::RunHeader &run_header)
 Callback for Producers to add parameters to the run header before conditions are initialized.
 
virtual void onNewRun (const ldmx::RunHeader &run_header)
 Callback for the EventProcessor to take any necessary action when the run being processed changes.
 
virtual void onFileOpen (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a new event input ROOT file is opened.
 
virtual void onFileClose (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a event input ROOT file is closed.
 
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

ldmx::Track seedTracker (const ldmx::Measurements &vmeas, double xOrigin, const Acts::Vector3 &perigee_location, const ldmx::Measurements &pmeas_tgt)
 
void lineParabolaToHelix (const Acts::Vector< 5 > parameters, Acts::Vector< 5 > &helix_parameters, Acts::Vector3 ref)
 

Private Attributes

Acts::Vector3 b_field_
 
std::shared_ptr< tracking::sim::SeedToTrackParamMakerseed_to_track_maker_
 
double processing_time_ {0.}
 
long nevents_ {0}
 
unsigned int ntracks_ {0}
 
std::vector< double > inflate_factors_ {1., 1., 1., 1., 1.}
 
std::string out_seed_collection_ {"SeedTracks"}
 The name of the output collection of seeds to be stored.
 
std::string input_hits_collection_ {"TaggerSimHits"}
 The name of the input hits collection to use in finding seeds..
 
std::string tagger_trks_collection_ {"TaggerTracks"}
 The name of the tagger Tracks (only for Recoil Seeding)
 
std::string input_pass_name_ {""}
 
std::string sim_particles_coll_name_
 
std::string sim_particles_passname_
 
std::string tagger_trks_event_collection_passname_
 
std::string sim_particles_event_passname_
 
std::vector< double > perigee_location_ {-700., 0., 0}
 Location of the perigee for the helix track parameters.
 
double pmin_ {0.05}
 Minimum cut on the momentum of the seeds.
 
double pmax_ {8}
 Maximum cut on the momentum of the seeds.
 
double d0max_ {20.}
 Max d0 allowed for the seeds.
 
double d0min_ {20.}
 Min d0 allowed for the seeds.
 
double z0max_ {60.}
 Max z0 allowed for the seeds.
 
double piover2_ {1.5708}
 
double phicut_ {0.1}
 PhiRange.
 
double thetacut_ {0.2}
 ThetaRange.
 
double loc0cut_ {0.1}
 loc0 / loc1 cuts
 
double loc1cut_ {0.3}
 
std::vector< std::string > strategies_ {}
 List of stragies for seed finding.
 
std::vector< std::vector< int > > strategy_layers_ {}
 Layer lists parsed from strategies_, one per strategy.
 
double bfield_ {1.5}
 
std::vector< float > xhit_
 
std::vector< float > yhit_
 
std::vector< float > zhit_
 
std::vector< float > b0_
 
std::vector< float > b1_
 
std::vector< float > b2_
 
std::vector< float > b3_
 
std::vector< float > b4_
 
long ndoubles_ {0}
 
long nmissing_ {0}
 
long nfailpmin_ {0}
 
long nfailpmax_ {0}
 
long nfaild0min_ {0}
 
long nfaild0max_ {0}
 
long nfailz0max_ {0}
 
long nfailphi_ {0}
 
long nfailtheta_ {0}
 
std::map< int, std::vector< const ldmx::Measurement * > > groups_map_
 
std::shared_ptr< tracking::sim::TruthMatchingTooltruth_matching_tool_
 
double u_error_
 u error
 
double v_error_
 v error
 

Additional Inherited Members

- Protected Member Functions inherited from tracking::reco::TrackingGeometryUser
const Acts::GeometryContext & geometryContext ()
 
const Acts::MagneticFieldContext & magneticFieldContext ()
 
const Acts::CalibrationContext & calibrationContext ()
 
const geo::TrackersTrackingGeometrygeometry ()
 
void loadBField (const std::string &path, const BFieldDistortion &distortion={})
 Load the interpolated B-field map from path and cache it.
 
void loadBField (const BFieldDistortion &distortion={})
 Load B-field from the path recorded in the detector GDML.
 
std::shared_ptr< Acts::MagneticFieldProvider > bField () const
 Return the loaded B-field provider.
 
- Protected Member Functions inherited from framework::EventProcessor
void abortEvent ()
 Abort the event immediately.
 
- Static Protected Member Functions inherited from tracking::reco::TrackingGeometryUser
static BFieldDistortion bFieldDistortion (const framework::config::Parameters &parameters)
 Build a BFieldDistortion from processor configuration.
 
- Protected Attributes inherited from framework::EventProcessor
HistogramPool histograms_
 helper object for making and filling histograms
 
NtupleManagerntuple_ {NtupleManager::getInstance()}
 Manager for any ntuples.
 
logging::logger the_log_
 The logger for this EventProcessor.
 

Detailed Description

Definition at line 38 of file SeedFinderProcessor.h.

Constructor & Destructor Documentation

◆ SeedFinderProcessor()

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

Constructor.

Parameters
nameThe name of the instance of this object.
processThe process running this producer.

Definition at line 23 of file SeedFinderProcessor.cxx.

25 : TrackingGeometryUser(name, process) {
26 // TODO REMOVE FROM DEFAULT
27 /*
28 output_file_ = new TFile("seeder.root", "RECREATE");
29 output_tree_ = new TTree("seeder", "seeder");
30
31 output_tree_->Branch("nevents", &nevents_);
32 output_tree_->Branch("xhit", &xhit_);
33 output_tree_->Branch("yhit", &yhit_);
34 output_tree_->Branch("zhit", &zhit_);
35
36 output_tree_->Branch("b0", &b0_);
37 output_tree_->Branch("b1", &b1_);
38 output_tree_->Branch("b2", &b2_);
39 output_tree_->Branch("b3", &b3_);
40 output_tree_->Branch("b4", &b4_);
41 */
42}
virtual void process(Event &event) final
Processing an event for a Producer is calling produce.

Member Function Documentation

◆ configure()

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

Configure the processor using the given user specified parameters.

Parameters
parametersSet of parameters used to configure this processor.

Reimplemented from framework::EventProcessor.

Definition at line 48 of file SeedFinderProcessor.cxx.

48 {
49 // Output seed name
50 out_seed_collection_ = parameters.get<std::string>("out_seed_collection",
51 getName() + "SeedTracks");
52
53 // Input strip hits
55 parameters.get<std::string>("input_hits_collection", "TaggerSimHits");
56
57 // Tagger tracks - only for Recoil Seed finding
59 parameters.get<std::string>("tagger_trks_collection", "TaggerTracks");
60
62 parameters.get<std::vector<double>>("perigee_location", {-700, 0., 0.});
63 pmin_ = parameters.get<double>("pmin", 0.05 * Acts::UnitConstants::GeV);
64 pmax_ = parameters.get<double>("pmax", 8 * Acts::UnitConstants::GeV);
65 d0max_ = parameters.get<double>("d0max", -15. * Acts::UnitConstants::mm);
66 d0min_ = parameters.get<double>("d0min", -45. * Acts::UnitConstants::mm);
67 z0max_ = parameters.get<double>("z0max", 60. * Acts::UnitConstants::mm);
68 phicut_ = parameters.get<double>("phicut", 0.1);
69 thetacut_ = parameters.get<double>("thetacut", 0.2);
70 loc0cut_ = parameters.get<double>("loc0cut", 0.1);
71 loc1cut_ = parameters.get<double>("loc1cut", 0.3);
73 parameters.get<std::vector<std::string>>("strategies", {"0,1,2,3,4"});
74
75 // parse each "l0,l1,..." string into a layer list
76 strategy_layers_.clear();
77 for (const auto& strategy : strategies_) {
78 std::vector<int> layers;
79 std::stringstream ss(strategy);
80 std::string token;
81 while (std::getline(ss, token, ',')) {
82 if (!token.empty()) layers.push_back(std::stoi(token));
83 }
84 // the line+parabola fit needs at least 5 distinct layers
85 std::set<int> distinct(layers.begin(), layers.end());
86 if (distinct.size() < 5) {
87 EXCEPTION_RAISE("BadConf", "Seeding strategy '" + strategy +
88 "' has fewer than 5 distinct layers");
89 }
90 strategy_layers_.push_back(layers);
91 }
92 inflate_factors_ = parameters.get<std::vector<double>>(
93 "inflate_factors", {10., 10., 10., 10., 10., 10.});
94 bfield_ = parameters.get<double>("bfield", 1.5);
95 input_pass_name_ = parameters.get<std::string>("input_pass_name");
96 sim_particles_coll_name_ =
97 parameters.get<std::string>("sim_particles_coll_name");
98 sim_particles_passname_ =
99 parameters.get<std::string>("sim_particles_passname");
100 tagger_trks_event_collection_passname_ =
101 parameters.get<std::string>("tagger_trks_event_collection_passname");
102 sim_particles_event_passname_ =
103 parameters.get<std::string>("sim_particles_event_passname");
104 u_error_ = parameters.get<double>("u_error");
105 v_error_ = parameters.get<double>("v_error");
106}
std::string getName() const
Get the processor name.
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78
std::vector< std::vector< int > > strategy_layers_
Layer lists parsed from strategies_, one per strategy.
std::string out_seed_collection_
The name of the output collection of seeds to be stored.
double pmax_
Maximum cut on the momentum of the seeds.
std::vector< std::string > strategies_
List of stragies for seed finding.
std::string input_hits_collection_
The name of the input hits collection to use in finding seeds..
double pmin_
Minimum cut on the momentum of the seeds.
std::string tagger_trks_collection_
The name of the tagger Tracks (only for Recoil Seeding)
std::vector< double > perigee_location_
Location of the perigee for the helix track parameters.
double d0max_
Max d0 allowed for the seeds.
double d0min_
Min d0 allowed for the seeds.
double z0max_
Max z0 allowed for the seeds.

References d0max_, d0min_, framework::config::Parameters::get(), framework::EventProcessor::getName(), input_hits_collection_, loc0cut_, out_seed_collection_, perigee_location_, phicut_, pmax_, pmin_, strategies_, strategy_layers_, tagger_trks_collection_, thetacut_, u_error_, v_error_, and z0max_.

◆ findSeedsFromMap()

void tracking::reco::SeedFinderProcessor::findSeedsFromMap ( std::vector< ldmx::Track > & seeds,
const ldmx::Measurements & pmeas )

Definition at line 477 of file SeedFinderProcessor.cxx.

478 {
479 std::map<int, std::vector<const ldmx::Measurement*>>::iterator groups_iter =
480 groups_map_.begin();
481 // Vector of iterators, one per grouped layer
482 const int k = groups_map_.size();
483 if (k < 1) return;
484 std::vector<std::vector<const ldmx::Measurement*>::iterator> it;
485 it.resize(k);
486
487 unsigned int ikey = 0;
488 for (auto& key : groups_map_) {
489 it[ikey] = key.second.begin();
490 ikey++;
491 }
492
493 // K vectors in an array v[0],v[1].... v[K-1]
494
495 // Loop over all combinations
496 while (it[0] != groups_iter->second.end()) {
497 // process the pointed-to elements
498
499 /*
500 for (int j=0; j<K; j++) {
501 const ldmx::Measurement* meas = (*(it[j]));
502 std::cout<<meas->getGlobalPosition()[0]<<","
503 <<meas->getGlobalPosition()[1]<<","
504 <<meas->getGlobalPosition()[2]<<","<<std::endl;
505 }
506 */
507
508 std::vector<ldmx::Measurement> meas_for_seeds;
509 meas_for_seeds.reserve(k);
510
511 ldmx_log(debug) << " Grouping ";
512
513 for (int j = 0; j < k; j++) {
514 const ldmx::Measurement* meas = (*(it[j]));
515 meas_for_seeds.push_back(*meas);
516 }
517
518 std::sort(meas_for_seeds.begin(), meas_for_seeds.end(),
519 [](const ldmx::Measurement& m1, const ldmx::Measurement& m2) {
520 return m1.getGlobalPosition()[0] < m2.getGlobalPosition()[0];
521 });
522
523 if (meas_for_seeds.size() < k) {
524 nmissing_++;
525 return;
526 }
527
528 ldmx_log(debug) << "making seedTrack";
529
530 Acts::Vector3 perigee{perigee_location_[0], perigee_location_[1],
532
533 ldmx::Track seed_track = seedTracker(
534 meas_for_seeds, meas_for_seeds.at(k / 2).getGlobalPosition()[0],
535 perigee, pmeas);
536
537 bool fail = false;
538
539 // Remove failed fits
540 if (1. / abs(seed_track.getQoP()) < pmin_) {
541 nfailpmin_++;
542 fail = true;
543 } else if (1. / abs(seed_track.getQoP()) > pmax_) {
544 nfailpmax_++;
545 fail = true;
546 }
547
548 // Remove large part of fake tracks and duplicates with the following cuts
549 // for various compatibility checks.
550
551 else if (abs(seed_track.getZ0()) > z0max_) {
552 nfailz0max_++;
553 fail = true;
554 } else if (seed_track.getD0() < d0min_) {
555 nfaild0min_++;
556 fail = true;
557 } else if (seed_track.getD0() > d0max_) {
558 nfaild0max_++;
559 fail = true;
560 } else if (abs(seed_track.getPhi()) > phicut_) {
561 fail = true;
562 nfailphi_++;
563 } else if (abs(seed_track.getTheta() - piover2_) > thetacut_) {
564 fail = true;
565 nfailtheta_++;
566 }
567
568 // If I didn't use the target pseudo measurements in the track finding
569 // I can use them for compatibility with the tagger track
570
571 // TODO this should protect against running this check on tagger seeder.
572 // This is true only if this seeder is not run twice on the tagger after
573 // already having tagger tracks available.
574 if (pmeas.size() > 0) {
575 // I can have multiple target pseudo measurements
576 // A seed is rejected if it is found incompatible with all the target
577 // extrapolations
578
579 // This is set but unused, eventually we will use tagger track position at
580 // target to inform recoil tracking bool tgt_compatible = false;
581 for (auto tgt_pseudomeas : pmeas) {
582 // The d0/z0 are in a frame with the same orientation of the target
583 // surface
584 double delta_loc0 =
585 seed_track.getD0() - tgt_pseudomeas.getLocalPosition()[0];
586 double delta_loc1 =
587 seed_track.getZ0() - tgt_pseudomeas.getLocalPosition()[1];
588
589 if (abs(delta_loc0) < loc0cut_ && abs(delta_loc1) < loc1cut_) {
590 // found at least 1 compatible target location
591 // tgt_compatible = true;
592 break;
593 }
594 }
595 } // pmeas > 0
596
597 if (!fail) {
598 if (truth_matching_tool_->configured()) {
599 auto truth_info = truth_matching_tool_->truthMatch(meas_for_seeds);
600 seed_track.setTrackID(truth_info.track_id_);
601 seed_track.setPdgID(truth_info.pdg_id_);
602 seed_track.setTruthProb(truth_info.truth_prob_);
603 }
604
605 seeds.push_back(seed_track);
606 }
607
608 else {
609 b0_.pop_back();
610 b1_.pop_back();
611 b2_.pop_back();
612 b3_.pop_back();
613 b4_.pop_back();
614 }
615
616 // Go to next combination
617 ldmx_log(debug) << "Go to the next combination";
618
619 ++it[k - 1];
620 for (int i = k - 1;
621 (i > 0) && (it[i] == (std::next(groups_iter, i))->second.end()); --i) {
622 it[i] = std::next(groups_iter, i)->second.begin();
623 ++it[i - 1];
624 }
625 }
626} // find seeds
Implementation of a track object.
Definition Track.h:53

◆ groupStrips()

bool tracking::reco::SeedFinderProcessor::groupStrips ( const std::vector< ldmx::Measurement > & measurements,
const std::vector< int > strategy )

Definition at line 447 of file SeedFinderProcessor.cxx.

449 {
450 // std::cout<<"Using stratedy"<<std::endl;
451 // for (auto& e : strategy) {
452 // std::cout<<e<<" ";
453 //}
454 // std::cout<<std::endl;
455
456 for (auto& meas : measurements) {
457 ldmx_log(trace) << meas;
458
459 if (std::find(strategy.begin(), strategy.end(), meas.getLayer()) !=
460 strategy.end()) {
461 ldmx_log(debug) << "Adding measurement from layer_ = " << meas.getLayer();
462 groups_map_[meas.getLayer()].push_back(&meas);
463 }
464
465 } // loop meas
466
467 if (groups_map_.size() < strategy.size())
468 return false;
469 else
470 return true;
471}

◆ onProcessEnd()

void tracking::reco::SeedFinderProcessor::onProcessEnd ( )
overridevirtual

Callback for the EventProcessor to take any necessary action when the processing of events finishes, such as calculating job-summary quantities.

Reimplemented from framework::EventProcessor.

Definition at line 424 of file SeedFinderProcessor.cxx.

424 {
425 // output_file_->cd();
426 // output_tree_->Write();
427 // output_file_->Close();
428 ldmx_log(info) << "AVG Time/Event: " << std::fixed << std::setprecision(1)
429 << processing_time_ / nevents_ << " ms";
430 ldmx_log(info) << "Total Seeds/Events: " << ntracks_ << "/" << nevents_;
431 ldmx_log(info) << "Seeds discarded due to multiple hits on layers "
432 << ndoubles_;
433 ldmx_log(info) << "not enough seed points " << nmissing_;
434 ldmx_log(info) << " nfailpmin=" << nfailpmin_;
435 ldmx_log(info) << " nfailpmax=" << nfailpmax_;
436 ldmx_log(info) << " nfaild0max=" << nfaild0max_;
437 ldmx_log(info) << " nfaild0min=" << nfaild0min_;
438 ldmx_log(info) << " nfailphicut=" << nfailphi_;
439 ldmx_log(info) << " nfailthetacut=" << nfailtheta_;
440 ldmx_log(info) << " nfailz0max=" << nfailz0max_;
441}

◆ onProcessStart()

void tracking::reco::SeedFinderProcessor::onProcessStart ( )
overridevirtual

Callback for the EventProcessor to take any necessary action when the processing of events starts, such as creating histograms.

Reimplemented from framework::EventProcessor.

Definition at line 44 of file SeedFinderProcessor.cxx.

44 {
45 truth_matching_tool_ = std::make_shared<tracking::sim::TruthMatchingTool>();
46}

◆ produce()

void tracking::reco::SeedFinderProcessor::produce ( framework::Event & event)
overridevirtual

Run the processor and create a collection of results which indicate if a charge particle can be found by the recoil tracker.

Parameters
eventThe event to process.

Implements framework::Producer.

Definition at line 108 of file SeedFinderProcessor.cxx.

108 {
109 // tg is unused, should it be? FIXME
110 // const auto& tg{geometry()};
111 auto start = std::chrono::high_resolution_clock::now();
112 std::vector<ldmx::Track> seed_tracks;
113
114 nevents_++;
115
116 // check if SimParticleMap is available for truth matching
117 std::map<int, ldmx::SimParticle> particle_map;
118
119 const auto& measurements = event.getCollection<ldmx::Measurement>(
120 input_hits_collection_, input_pass_name_);
121
122 std::vector<ldmx::Track> tagger_tracks;
124 tagger_trks_event_collection_passname_)) {
125 tagger_tracks = event.getCollection<ldmx::Track>(tagger_trks_collection_,
126 input_pass_name_);
127 }
128
129 // Create an unbound surface at the target
130 std::shared_ptr<Acts::Surface> tgt_surf =
131 tracking::sim::utils::unboundSurface(0.);
132
133 // Create the pseudomeasurements at the target
134
135 ldmx::Measurements target_pseudo_meas;
136
137 for (auto tagtrk : tagger_tracks) {
138 // For Track, the perigee parameters are stored at the target surface.
139 // Use d0/z0 as local position and the perigee covariance for the
140 // pseudo measurement. Only create the pseudo measurement if cov is
141 // available.
142
143 // The covariance matrix passed to the pseudo measurement is considered as
144 // uncorrelated. This is an approx that considers that loc-u and loc-v from
145 // the track have small correlation.
146
147 const auto& perigee_cov = tagtrk.getPerigeeCov();
148 if (!perigee_cov.empty()) {
149 Acts::BoundMatrix cov = tracking::sim::utils::unpackCov(perigee_cov);
150 double locu = tagtrk.getD0();
151 double locv = tagtrk.getZ0();
152 double covuu =
153 cov(Acts::BoundIndices::eBoundLoc0, Acts::BoundIndices::eBoundLoc0);
154 double covvv =
155 cov(Acts::BoundIndices::eBoundLoc1, Acts::BoundIndices::eBoundLoc1);
156
157 ldmx::Measurement pseudo_meas;
158 pseudo_meas.setLocalPosition(locu, locv);
159 Acts::Vector3 dummy{0., 0., 0.};
160 Acts::Vector2 local_pos{locu, locv};
161 Acts::Vector3 global_pos =
162 tgt_surf->localToGlobal(geometryContext(), local_pos, dummy);
163
164 pseudo_meas.setGlobalPosition(global_pos(0), global_pos(1),
165 global_pos(2));
166 pseudo_meas.setTime(0.);
167 pseudo_meas.setLocalCovariance(covuu, covvv);
168
169 target_pseudo_meas.push_back(pseudo_meas);
170 }
171 }
172
173 if (event.exists(sim_particles_coll_name_, sim_particles_event_passname_)) {
174 particle_map = event.getMap<int, ldmx::SimParticle>(
175 sim_particles_coll_name_, sim_particles_passname_);
176 truth_matching_tool_->setup(particle_map, measurements);
177 }
178
179 ldmx_log(debug) << "Preparing the strategies";
180
181 // a strategy is a list of layers from which to make the seed
182 // layer_ numbering starts at 0
183 for (const auto& strategy : strategy_layers_) {
184 groups_map_.clear();
185 if (groupStrips(measurements, strategy))
186 findSeedsFromMap(seed_tracks, target_pseudo_meas);
187 }
188
189 groups_map_.clear();
190 // output_tree_->Fill();
191 ntracks_ += seed_tracks.size();
192 event.add(out_seed_collection_, seed_tracks);
193
194 auto end = std::chrono::high_resolution_clock::now();
195
196 // long long microseconds =
197 // std::chrono::duration_cast<std::chrono::microseconds>(end-start).count();
198
199 auto diff = end - start;
200 processing_time_ += std::chrono::duration<double, std::milli>(diff).count();
201
202 // Seed finding using 2D Hits
203 // - The hits should keep track if they are already associated to a track or
204 // not. This can be used for subsequent passes of seed-finding
205
206 // This should go into a digitization producer, which takes care of producing
207 // measurements from:
208 // - raw hits in data
209 // - sim hits in MC
210 // Step 0: Get the sim hits and project them on the surfaces to mimic 2d
211 // hits Step 1: Smear the hits and associate an uncertainty to those
212 // measurements.
213
214 xhit_.clear();
215 yhit_.clear();
216 zhit_.clear();
217
218 b0_.clear();
219 b1_.clear();
220 b2_.clear();
221 b3_.clear();
222 b4_.clear();
223
224} // produce
bool exists(const std::string &name, const std::string &passName, bool unique=true) const
Check for the existence of an object or collection with the given name and pass name in the event.
Definition Event.cxx:105
void setLocalPosition(const float &meas_u, const float &meas_v)
Set the local position i.e.
Definition Measurement.h:60
void setGlobalPosition(const float &meas_x, const float &meas_y, const float &meas_z)
Set the global position i.e.
Definition Measurement.h:41
void setLocalCovariance(const float &cov_uu, const float &cov_vv)
Set cov(U,U) and cov(V, V).
Definition Measurement.h:76
void setTime(const float &meas_t)
Set the measurement time in ns.
Definition Measurement.h:92
Class representing a simulated particle.
Definition SimParticle.h:24

References framework::Event::exists(), input_hits_collection_, out_seed_collection_, ldmx::Measurement::setGlobalPosition(), ldmx::Measurement::setLocalCovariance(), ldmx::Measurement::setLocalPosition(), ldmx::Measurement::setTime(), strategy_layers_, and tagger_trks_collection_.

◆ seedTracker()

ldmx::Track tracking::reco::SeedFinderProcessor::seedTracker ( const ldmx::Measurements & vmeas,
double xOrigin,
const Acts::Vector3 & perigee_location,
const ldmx::Measurements & pmeas_tgt )
private

Definition at line 236 of file SeedFinderProcessor.cxx.

239 {
240 // Fit a straight line in the non-bending plane and a parabola in the bending
241 // plane
242
243 // Each measurement is treated as a 3D point, where the v direction is in the
244 // center of the strip with sigma equal to the length of the strip / sqrt(12).
245 // In this way it's easier to incorporate the tagger track extrapolation to
246 // the fit
247
248 Acts::Matrix<5, 5> a = Acts::Matrix<5, 5>::Zero();
249 Acts::Vector<5> y = Acts::Vector<5>::Zero();
250
251 for (auto meas : vmeas) {
252 double xmeas = meas.getGlobalPosition()[0] - xOrigin;
253
254 // Get the surface
255 const Acts::Surface* hit_surface = geometry().getSurface(meas.getLayerID());
256
257 // Get the global to local transformation
258 auto rot =
259 hit_surface->localToGlobalTransform(geometryContext()).rotation();
260 auto tr =
261 hit_surface->localToGlobalTransform(geometryContext()).translation();
262
263 auto rotl2g = rot.transpose();
264
265 // Only for saving purposes
266 Acts::Vector2 loc{meas.getLocalPosition()[0], 0.};
267
268 xhit_.push_back(xmeas);
269 yhit_.push_back(meas.getGlobalPosition()[1]);
270 zhit_.push_back(meas.getGlobalPosition()[2]);
271
272 Acts::Matrix<2, 5> a_i;
273
274 a_i(0, 0) = rotl2g(0, 1);
275 a_i(0, 1) = rotl2g(0, 1) * xmeas;
276 a_i(0, 2) = rotl2g(0, 1) * xmeas * xmeas;
277 a_i(0, 3) = rotl2g(0, 2);
278 a_i(0, 4) = rotl2g(0, 2) * xmeas;
279
280 a_i(1, 0) = rotl2g(1, 1);
281 a_i(1, 1) = rotl2g(1, 1) * xmeas;
282 a_i(1, 2) = rotl2g(1, 1) * xmeas * xmeas;
283 a_i(1, 3) = rotl2g(1, 2);
284 a_i(1, 4) = rotl2g(1, 2) * xmeas;
285
286 // Fill the yprime vector
287 Acts::Vector2 offset = (rot.transpose() * tr).topRows<2>();
288 Acts::Vector2 xoffset = {rotl2g(0, 0) * xmeas, rotl2g(1, 0) * xmeas};
289
290 loc(0) = meas.getLocalPosition()[0];
291 loc(1) = 0.;
292 // weight matrix
293 Acts::Matrix<2, 2> w_i = Acts::Matrix<2, 2>::Zero();
294
295 w_i(0, 0) = 1. / (u_error_ * u_error_);
296 w_i(1, 1) = 1. / (v_error_ * v_error_);
297
298 Acts::Vector2 yprime_i = loc + offset - xoffset;
299 y += (a_i.transpose()) * w_i * yprime_i;
300
301 Acts::Matrix<2, 5> wa_i = (w_i * a_i);
302 a += a_i.transpose() * wa_i;
303 }
304
305 Acts::Vector<5> b;
306 b = a.inverse() * y;
307
308 b0_.push_back(b(0));
309 b1_.push_back(b(1));
310 b2_.push_back(b(2));
311 b3_.push_back(b(3));
312 b4_.push_back(b(4));
313
314 // Acts::Vector<5> hlx = Acts::Vector<5>::Zero();
315 Acts::Vector<3> ref{0., 0., 0.};
316
317 // relative_perigee_x is the perigee position in the fit frame (fit-x = ACTS x
318 // - xOrigin). It is used only for evaluating the fitted curve (y, z, slopes).
319 // The PerigeeSurface and seed_pos must use the absolute ACTS x coordinate,
320 // which is perigee_location(0) directly.
321 double relative_perigee_x = perigee_location(0) - xOrigin;
322
323 std::shared_ptr<const Acts::PerigeeSurface> seed_perigee =
324 Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3(
325 perigee_location(0), perigee_location(1), perigee_location(2)));
326
327 // in mm — x is absolute ACTS x; y and z evaluated at fit-x =
328 // relative_perigee_x
329 Acts::Vector3 seed_pos{perigee_location(0),
330 b(0) + b(1) * relative_perigee_x +
331 b(2) * relative_perigee_x * relative_perigee_x,
332 b(3) + b(4) * relative_perigee_x};
333 Acts::Vector3 dir{1, b(1) + 2 * b(2) * relative_perigee_x, b(4)};
334 dir /= dir.norm();
335
336 // Momentum at xmeas
337 // R in meters, p in GeV
338 double p = 0.3 * bfield_ * (1. / (2. * abs(b(2)))) * 0.001;
339 // std::cout<<"Momentum "<< p*dir << std::endl;
340
341 // Convert it to MeV since that's what TrackUtils assumes
342 Acts::Vector3 seed_mom = p * dir / Acts::UnitConstants::MeV;
343 double q =
344 b(2) < 0 ? -1 * Acts::UnitConstants::e : +1 * Acts::UnitConstants::e;
345
346 // Linear intersection with the perigee line. TODO:: Use propagator instead
347 // Project the position on the surface.
348 // This is mainly necessary for the perigee surface, where
349 // the mean might not fulfill the perigee condition.
350
351 // mg Aug 2024 .. interect has changed, but just remove boundary check
352 // and change intersection to intersections
353 // auto intersection =
354 // (*seed_perigee).intersect(geometry_context(), seed_pos, dir, false);
355
356 // Acts::FreeVector seed_free = tracking::sim::utils::toFreeParameters(
357 // intersection.intersection.position, seed_mom, q);
358
359 auto intersection =
360 (*seed_perigee).intersect(geometryContext(), seed_pos, dir);
361
362 Acts::FreeVector seed_free = tracking::sim::utils::toFreeParameters(
363 intersection[0].position(), seed_mom, q);
364
365 auto bound_params = Acts::transformFreeToBoundParameters(
366 seed_free, *seed_perigee, geometryContext())
367 .value();
368
369 ldmx_log(trace) << "bound parameters at perigee location" << bound_params;
370
371 Acts::BoundVector stddev;
372 // sigma set to 75% of momentum
373 double sigma_p = 0.75 * p * Acts::UnitConstants::GeV;
374 stddev[Acts::eBoundLoc0] =
375 inflate_factors_[Acts::eBoundLoc0] * 2 * Acts::UnitConstants::mm;
376 stddev[Acts::eBoundLoc1] =
377 inflate_factors_[Acts::eBoundLoc1] * 5 * Acts::UnitConstants::mm;
378 stddev[Acts::eBoundPhi] =
379 inflate_factors_[Acts::eBoundPhi] * 5 * Acts::UnitConstants::degree;
380 stddev[Acts::eBoundTheta] =
381 inflate_factors_[Acts::eBoundTheta] * 5 * Acts::UnitConstants::degree;
382 stddev[Acts::eBoundQOverP] =
383 inflate_factors_[Acts::eBoundQOverP] * (1. / p) * (1. / p) * sigma_p;
384 stddev[Acts::eBoundTime] =
385 inflate_factors_[Acts::eBoundTime] * 1000 * Acts::UnitConstants::ns;
386
387 ldmx_log(debug)
388 << "Making covariance matrix as diagonal matrix with inflated terms";
389 Acts::BoundMatrix bound_cov = stddev.cwiseProduct(stddev).asDiagonal();
390
391 ldmx_log(debug) << "...now putting together the seed track ...";
392
393 ldmx::Track trk = ldmx::Track();
394 // Store the perigee surface position (absolute ACTS coordinates) converted to
395 // LDMX frame so CKFProcessor can reconstruct the same surface.
396 Acts::Vector3 perigee_ldmx =
397 tracking::sim::utils::acts2Ldmx(perigee_location);
398 trk.setPerigeeLocation(perigee_ldmx(0), perigee_ldmx(1), perigee_ldmx(2));
399 trk.setChi2(0.);
400 trk.setNhits(5);
401 trk.setNdf(0);
402 trk.setNsharedHits(0);
403 trk.setCharge(q < 0 ? -1 : 1);
404 std::vector<double> v_seed_params(
405 (bound_params).data(),
406 bound_params.data() + bound_params.rows() * bound_params.cols());
407 std::vector<double> v_seed_cov;
408 tracking::sim::utils::flatCov(bound_cov, v_seed_cov);
409 trk.setPerigeeParameters(v_seed_params);
410 trk.setPerigeeCov(v_seed_cov);
411
412 ldmx_log(debug)
413 << "...making the ParticleHypothesis ...assume electron for now";
414 auto part_hypo{Acts::ParticleHypothesis::electron()};
415
416 ldmx_log(debug) << "Making BoundTrackParameters seedParameters";
417 Acts::BoundTrackParameters seed_parameters(
418 seed_perigee, std::move(bound_params), bound_cov, part_hypo);
419
420 ldmx_log(debug) << "Returning seed track";
421 return trk;
422}

Member Data Documentation

◆ b0_

std::vector<float> tracking::reco::SeedFinderProcessor::b0_
private

Definition at line 157 of file SeedFinderProcessor.h.

◆ b1_

std::vector<float> tracking::reco::SeedFinderProcessor::b1_
private

Definition at line 158 of file SeedFinderProcessor.h.

◆ b2_

std::vector<float> tracking::reco::SeedFinderProcessor::b2_
private

Definition at line 159 of file SeedFinderProcessor.h.

◆ b3_

std::vector<float> tracking::reco::SeedFinderProcessor::b3_
private

Definition at line 160 of file SeedFinderProcessor.h.

◆ b4_

std::vector<float> tracking::reco::SeedFinderProcessor::b4_
private

Definition at line 161 of file SeedFinderProcessor.h.

◆ b_field_

Acts::Vector3 tracking::reco::SeedFinderProcessor::b_field_
private

Definition at line 91 of file SeedFinderProcessor.h.

◆ bfield_

double tracking::reco::SeedFinderProcessor::bfield_ {1.5}
private

Definition at line 151 of file SeedFinderProcessor.h.

151{1.5};

◆ d0max_

double tracking::reco::SeedFinderProcessor::d0max_ {20.}
private

Max d0 allowed for the seeds.

Definition at line 127 of file SeedFinderProcessor.h.

127{20.};

Referenced by configure().

◆ d0min_

double tracking::reco::SeedFinderProcessor::d0min_ {20.}
private

Min d0 allowed for the seeds.

Definition at line 130 of file SeedFinderProcessor.h.

130{20.};

Referenced by configure().

◆ groups_map_

std::map<int, std::vector<const ldmx::Measurement*> > tracking::reco::SeedFinderProcessor::groups_map_
private

Definition at line 175 of file SeedFinderProcessor.h.

◆ inflate_factors_

std::vector<double> tracking::reco::SeedFinderProcessor::inflate_factors_ {1., 1., 1., 1., 1.}
private

Definition at line 104 of file SeedFinderProcessor.h.

104{1., 1., 1., 1., 1.};

◆ input_hits_collection_

std::string tracking::reco::SeedFinderProcessor::input_hits_collection_ {"TaggerSimHits"}
private

The name of the input hits collection to use in finding seeds..

Definition at line 109 of file SeedFinderProcessor.h.

109{"TaggerSimHits"};

Referenced by configure(), and produce().

◆ input_pass_name_

std::string tracking::reco::SeedFinderProcessor::input_pass_name_ {""}
private

Definition at line 112 of file SeedFinderProcessor.h.

112{""};

◆ loc0cut_

double tracking::reco::SeedFinderProcessor::loc0cut_ {0.1}
private

loc0 / loc1 cuts

Definition at line 144 of file SeedFinderProcessor.h.

144{0.1};

Referenced by configure().

◆ loc1cut_

double tracking::reco::SeedFinderProcessor::loc1cut_ {0.3}
private

Definition at line 145 of file SeedFinderProcessor.h.

145{0.3};

◆ ndoubles_

long tracking::reco::SeedFinderProcessor::ndoubles_ {0}
private

Definition at line 164 of file SeedFinderProcessor.h.

164{0};

◆ nevents_

long tracking::reco::SeedFinderProcessor::nevents_ {0}
private

Definition at line 101 of file SeedFinderProcessor.h.

101{0};

◆ nfaild0max_

long tracking::reco::SeedFinderProcessor::nfaild0max_ {0}
private

Definition at line 169 of file SeedFinderProcessor.h.

169{0};

◆ nfaild0min_

long tracking::reco::SeedFinderProcessor::nfaild0min_ {0}
private

Definition at line 168 of file SeedFinderProcessor.h.

168{0};

◆ nfailphi_

long tracking::reco::SeedFinderProcessor::nfailphi_ {0}
private

Definition at line 171 of file SeedFinderProcessor.h.

171{0};

◆ nfailpmax_

long tracking::reco::SeedFinderProcessor::nfailpmax_ {0}
private

Definition at line 167 of file SeedFinderProcessor.h.

167{0};

◆ nfailpmin_

long tracking::reco::SeedFinderProcessor::nfailpmin_ {0}
private

Definition at line 166 of file SeedFinderProcessor.h.

166{0};

◆ nfailtheta_

long tracking::reco::SeedFinderProcessor::nfailtheta_ {0}
private

Definition at line 172 of file SeedFinderProcessor.h.

172{0};

◆ nfailz0max_

long tracking::reco::SeedFinderProcessor::nfailz0max_ {0}
private

Definition at line 170 of file SeedFinderProcessor.h.

170{0};

◆ nmissing_

long tracking::reco::SeedFinderProcessor::nmissing_ {0}
private

Definition at line 165 of file SeedFinderProcessor.h.

165{0};

◆ ntracks_

unsigned int tracking::reco::SeedFinderProcessor::ntracks_ {0}
private

Definition at line 102 of file SeedFinderProcessor.h.

102{0};

◆ out_seed_collection_

std::string tracking::reco::SeedFinderProcessor::out_seed_collection_ {"SeedTracks"}
private

The name of the output collection of seeds to be stored.

Definition at line 107 of file SeedFinderProcessor.h.

107{"SeedTracks"};

Referenced by configure(), and produce().

◆ perigee_location_

std::vector<double> tracking::reco::SeedFinderProcessor::perigee_location_ {-700., 0., 0}
private

Location of the perigee for the helix track parameters.

Definition at line 119 of file SeedFinderProcessor.h.

119{-700., 0., 0};

Referenced by configure().

◆ phicut_

double tracking::reco::SeedFinderProcessor::phicut_ {0.1}
private

PhiRange.

Definition at line 138 of file SeedFinderProcessor.h.

138{0.1};

Referenced by configure().

◆ piover2_

double tracking::reco::SeedFinderProcessor::piover2_ {1.5708}
private

Definition at line 135 of file SeedFinderProcessor.h.

135{1.5708};

◆ pmax_

double tracking::reco::SeedFinderProcessor::pmax_ {8}
private

Maximum cut on the momentum of the seeds.

Definition at line 124 of file SeedFinderProcessor.h.

124{8};

Referenced by configure().

◆ pmin_

double tracking::reco::SeedFinderProcessor::pmin_ {0.05}
private

Minimum cut on the momentum of the seeds.

Definition at line 121 of file SeedFinderProcessor.h.

121{0.05};

Referenced by configure().

◆ processing_time_

double tracking::reco::SeedFinderProcessor::processing_time_ {0.}
private

Definition at line 100 of file SeedFinderProcessor.h.

100{0.};

◆ seed_to_track_maker_

std::shared_ptr<tracking::sim::SeedToTrackParamMaker> tracking::reco::SeedFinderProcessor::seed_to_track_maker_
private

Definition at line 98 of file SeedFinderProcessor.h.

◆ sim_particles_coll_name_

std::string tracking::reco::SeedFinderProcessor::sim_particles_coll_name_
private

Definition at line 114 of file SeedFinderProcessor.h.

◆ sim_particles_event_passname_

std::string tracking::reco::SeedFinderProcessor::sim_particles_event_passname_
private

Definition at line 117 of file SeedFinderProcessor.h.

◆ sim_particles_passname_

std::string tracking::reco::SeedFinderProcessor::sim_particles_passname_
private

Definition at line 115 of file SeedFinderProcessor.h.

◆ strategies_

std::vector<std::string> tracking::reco::SeedFinderProcessor::strategies_ {}
private

List of stragies for seed finding.

Definition at line 148 of file SeedFinderProcessor.h.

148{};

Referenced by configure().

◆ strategy_layers_

std::vector<std::vector<int> > tracking::reco::SeedFinderProcessor::strategy_layers_ {}
private

Layer lists parsed from strategies_, one per strategy.

Definition at line 150 of file SeedFinderProcessor.h.

150{};

Referenced by configure(), and produce().

◆ tagger_trks_collection_

std::string tracking::reco::SeedFinderProcessor::tagger_trks_collection_ {"TaggerTracks"}
private

The name of the tagger Tracks (only for Recoil Seeding)

Definition at line 111 of file SeedFinderProcessor.h.

111{"TaggerTracks"};

Referenced by configure(), and produce().

◆ tagger_trks_event_collection_passname_

std::string tracking::reco::SeedFinderProcessor::tagger_trks_event_collection_passname_
private

Definition at line 116 of file SeedFinderProcessor.h.

◆ thetacut_

double tracking::reco::SeedFinderProcessor::thetacut_ {0.2}
private

ThetaRange.

Definition at line 141 of file SeedFinderProcessor.h.

141{0.2};

Referenced by configure().

◆ truth_matching_tool_

std::shared_ptr<tracking::sim::TruthMatchingTool> tracking::reco::SeedFinderProcessor::truth_matching_tool_
private
Initial value:
=
nullptr

Definition at line 178 of file SeedFinderProcessor.h.

◆ u_error_

double tracking::reco::SeedFinderProcessor::u_error_
private

u error

Definition at line 182 of file SeedFinderProcessor.h.

Referenced by configure().

◆ v_error_

double tracking::reco::SeedFinderProcessor::v_error_
private

v error

Definition at line 184 of file SeedFinderProcessor.h.

Referenced by configure().

◆ xhit_

std::vector<float> tracking::reco::SeedFinderProcessor::xhit_
private

Definition at line 153 of file SeedFinderProcessor.h.

◆ yhit_

std::vector<float> tracking::reco::SeedFinderProcessor::yhit_
private

Definition at line 154 of file SeedFinderProcessor.h.

◆ z0max_

double tracking::reco::SeedFinderProcessor::z0max_ {60.}
private

Max z0 allowed for the seeds.

Definition at line 133 of file SeedFinderProcessor.h.

133{60.};

Referenced by configure().

◆ zhit_

std::vector<float> tracking::reco::SeedFinderProcessor::zhit_
private

Definition at line 155 of file SeedFinderProcessor.h.


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