1#include "Tracking/Reco/LinearTrackFinder.h"
22 parameters.
get<std::string>(
"seed_collection",
"LinearRecoilSeedTracks");
25 parameters.
get<std::string>(
"out_trk_collection",
"LinearRecoilTracks");
27 input_pass_name_ = parameters.
get<std::string>(
"input_pass_name");
32 std::vector<ldmx::StraightTrack> straight_tracks;
34 auto start = std::chrono::high_resolution_clock::now();
37 if (n_events_ % 1000 == 0) ldmx_log(info) <<
"events processed:" << n_events_;
39 ldmx_log(debug) <<
"Retrieve the seeds::" << seed_collection_;
42 seed_collection_, input_pass_name_);
44 n_seeds_ = seed_tracks.size();
45 ldmx_log(debug) <<
"Number of seeds::" << n_seeds_;
48 straight_tracks = findTracks(seed_tracks);
51 n_tracks_ += straight_tracks.size();
54 event.add(out_trk_collection_, straight_tracks);
56 auto end = std::chrono::high_resolution_clock::now();
57 auto diff = end - start;
58 processing_time_ += std::chrono::duration<double, std::milli>(diff).count();
60 straight_tracks.clear();
64 ldmx_log(info) <<
"found " << n_tracks_ <<
" tracks / " << n_events_
66 ldmx_log(info) <<
"AVG Time/Event: " << std::fixed << std::setprecision(1)
67 << processing_time_ / n_events_ <<
" ms";
70std::vector<ldmx::StraightTrack> LinearTrackFinder::findTracks(
71 const std::vector<ldmx::StraightTrack>& track_seeds) {
72 std::vector<ldmx::StraightTrack> best_tracks;
73 std::map<std::array<double, 3>, std::vector<ldmx::StraightTrack>>
77 for (
const auto& seed : track_seeds) {
78 auto rec_hit_point = seed.getFirstLayerEcalRecHit();
79 seeds_by_rec_hit[rec_hit_point].push_back(seed);
83 std::set<std::tuple<float, float, float>> used_sensor_positions;
87 for (
auto& entry : seeds_by_rec_hit) {
88 const auto& rec_hit_point = entry.first;
89 auto& seeds_with_same_rec_hit = entry.second;
91 ldmx_log(debug) <<
"Processing RecHit at: (" << rec_hit_point[0] <<
", "
92 << rec_hit_point[1] <<
", " << rec_hit_point[2] <<
")\n";
95 seeds_with_same_rec_hit.erase(
97 seeds_with_same_rec_hit.begin(), seeds_with_same_rec_hit.end(),
99 for (const auto& measurement : seed.getAllSensorPoints()) {
101 if (isPositionUsed(measurement, used_sensor_positions)) {
109 seeds_with_same_rec_hit.end());
112 if (seeds_with_same_rec_hit.empty())
continue;
115 auto best_seed_it = std::min_element(
116 seeds_with_same_rec_hit.begin(), seeds_with_same_rec_hit.end(),
118 return trk_a.getChi2() < trk_b.getChi2();
123 best_tracks.push_back(best_seed);
125 ldmx_log(debug) <<
"For RecHit at: (" << rec_hit_point[0] <<
", "
126 << rec_hit_point[1] <<
", " << rec_hit_point[2] <<
")\n";
129 auto best_seed_measurement = best_seed.getAllSensorPoints();
131 for (
auto& position_object : best_seed_measurement) {
132 used_sensor_positions.insert(
133 std::make_tuple(position_object.getGlobalPosition()[0],
134 position_object.getGlobalPosition()[1],
135 position_object.getGlobalPosition()[2]));
136 ldmx_log(debug) <<
"We used the following point: ("
137 << position_object.getGlobalPosition()[0] <<
", "
138 << position_object.getGlobalPosition()[1] <<
", "
139 << position_object.getGlobalPosition()[2] <<
")\n";
140 ldmx_log(debug) <<
"Which gave a track a distance: "
141 << best_seed.getDistanceToRecHit()
142 <<
" to the closest ECalRecHit\n";
152bool LinearTrackFinder::isPositionUsed(
154 const std::set<std::tuple<float, float, float>>& used_sensor_positions) {
159 return used_sensor_positions.find(position) != used_sensor_positions.end();
#define DECLARE_PRODUCER(CLASS)
Macro which allows the framework to construct a producer given its name during configuration.
Implements an event buffer system for storing event data.
Class which represents the process under execution.
Class encapsulating parameters for configuring a processor.
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
std::array< float, 3 > getGlobalPosition() const
void onProcessEnd() override
Output event statistics.
LinearTrackFinder(const std::string &name, framework::Process &process)
Constructor.
void configure(framework::config::Parameters ¶meters) override
Configure the processor using the given user specified parameters.
void produce(framework::Event &event) override
Run the processor.
a helper base class providing some methods to shorten access to common conditions used within the tra...
The measurement calibrator can be a function or a class/struct able to retrieve the sim hits containe...