35 std::size_t iTrack)
const {
36 for (
auto i_measurement : state.measurements_per_track_[iTrack]) {
37 state.tracks_per_measurement_[i_measurement].erase(iTrack);
38 if (state.tracks_per_measurement_[i_measurement].size() == 1) {
39 auto j_track = *state.tracks_per_measurement_[i_measurement].begin();
40 --state.shared_measurements_per_track_[j_track];
43 state.selected_tracks_.erase(iTrack);
49 std::vector<ldmx::Track> tracks, std::vector<ldmx::Measurement> meas_coll,
50 State& state, geometry_t& tg, source_link_hash_t&& sourceLinkHash,
51 source_link_equality_t&& sourceLinkEquality)
const {
52 auto measurement_index_map =
53 std::unordered_map<Acts::SourceLink, std::size_t, source_link_hash_t,
54 source_link_equality_t>(0, sourceLinkHash,
61 state.number_of_tracks_ = 0;
62 for (
const auto& track : tracks) {
68 std::vector<std::size_t> measurements;
69 for (
auto imeas : track.getMeasurementsIdxs()) {
70 auto meas = meas_coll.at(imeas);
71 const Acts::Surface* hit_surface = tg.getSurface(meas.getLayerID());
74 Acts::SourceLink source_link = Acts::SourceLink(idx_sl);
76 auto emplace = measurement_index_map.try_emplace(
77 source_link, measurement_index_map.size());
78 measurements.push_back(emplace.first->second);
81 state.track_tips_.push_back(state.number_of_tracks_);
82 state.track_chi2_.push_back(track.getChi2() / track.getNdf());
83 state.measurements_per_track_.push_back(std::move(measurements));
84 state.selected_tracks_.insert(state.number_of_tracks_);
86 ++state.number_of_tracks_;
90 for (std::size_t i_track = 0; i_track < state.number_of_tracks_; ++i_track) {
91 for (
auto i_measurement : state.measurements_per_track_[i_track]) {
92 state.tracks_per_measurement_[i_measurement].insert(i_track);
97 state.shared_measurements_per_track_ =
98 std::vector<std::size_t>(state.track_tips_.size(), 0);
99 for (std::size_t i_track = 0; i_track < state.number_of_tracks_; ++i_track) {
100 for (
auto i_measurement : state.measurements_per_track_[i_track]) {
101 if (state.tracks_per_measurement_[i_measurement].size() > 1) {
102 ++state.shared_measurements_per_track_[i_track];
111 auto shared_measurements_comperator = [&state](std::size_t a, std::size_t b) {
112 return state.shared_measurements_per_track_[a] <
113 state.shared_measurements_per_track_[b];
119 auto track_comperator = [&state](std::size_t a, std::size_t b) {
121 auto relative_shared_measurements = [&state](std::size_t i) {
122 return 1.0 * state.shared_measurements_per_track_[i] /
123 state.measurements_per_track_[i].size();
126 if (relative_shared_measurements(a) != relative_shared_measurements(b)) {
127 return relative_shared_measurements(a) < relative_shared_measurements(b);
129 return state.track_chi2_[a] < state.track_chi2_[b];
134 if (state.selected_tracks_.empty()) {
135 ldmx_log(trace) <<
"No tracks left - exit loop";
141 auto maximum_shared_measurements = *std::max_element(
142 state.selected_tracks_.begin(), state.selected_tracks_.end(),
143 shared_measurements_comperator);
147 if (state.shared_measurements_per_track_[maximum_shared_measurements] <
154 *std::max_element(state.selected_tracks_.begin(),
155 state.selected_tracks_.end(), track_comperator);
156 ldmx_log(trace) <<
"Remove track " << bad_track <<
", nMeas = "
157 << state.measurements_per_track_[bad_track].size()
159 << state.shared_measurements_per_track_[bad_track]
160 <<
", chi2 =" << state.track_chi2_[bad_track];
185 auto t_start = std::chrono::high_resolution_clock::now();
188 std::vector<ldmx::Track> out_tracks;
192 if (!event.
exists(track_collection_, input_pass_name_)) {
193 ldmx_log(debug) <<
"Track collection not found, exiting";
198 event.getCollection<
ldmx::Track>(track_collection_, input_pass_name_);
200 if (!event.
exists(meas_collection_, input_pass_name_)) {
201 ldmx_log(debug) <<
"Measurement collection not found, exiting";
206 meas_collection_, input_pass_name_);
208 n_input_tracks_ +=
static_cast<int>(tracks.size());
211 tracking::sim::utils::sourceLinkHash,
212 tracking::sim::utils::sourceLinkEquality);
215 for (
auto i_track : state.selected_tracks_) {
216 auto clean_trk = tracks[state.track_tips_.at(i_track)];
218 (std::abs(1. / clean_trk.getQoP()) > 0.05)) {
219 out_tracks.push_back(clean_trk);
223 n_output_tracks_ +=
static_cast<int>(out_tracks.size());
225 event.add(out_trk_collection_, out_tracks);
227 auto t_end = std::chrono::high_resolution_clock::now();
229 std::chrono::duration<double, std::milli>(t_end - t_start).count();
235 nevents_ > 0 ?
static_cast<double>(n_input_tracks_) / nevents_ : 0.;
237 nevents_ > 0 ?
static_cast<double>(n_output_tracks_) / nevents_ : 0.;
239 n_input_tracks_ > 0 ? 100.0 * n_output_tracks_ / n_input_tracks_ : 0.;
240 ldmx_log(info) <<
"--------------------------------- ";
241 ldmx_log(info) <<
"GAS: " << n_output_tracks_ <<
" output tracks / "
242 << n_input_tracks_ <<
" input tracks";
243 ldmx_log(info) <<
"AVG Time/Event: " << std::fixed << std::setprecision(1)
244 << processing_time_ / nevents_ <<
" ms";
245 ldmx_log(info) <<
"AVG tracks in/event: " << std::fixed
246 << std::setprecision(1) << avg_in;
247 ldmx_log(info) <<
"AVG tracks out/event: " << std::fixed
248 << std::setprecision(1) << avg_out <<
" (" << std::fixed
249 << std::setprecision(1) << retention <<
"% retained)";
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.
void computeInitialState(std::vector< ldmx::Track > tracks, std::vector< ldmx::Measurement > measurements, State &state, geometry_t &tg, source_link_hash_t &&sourceLinkHash, source_link_equality_t &&sourceLinkEquality) const