30 std::size_t iTrack)
const {
31 for (
auto i_measurement : state.measurements_per_track_[iTrack]) {
32 state.tracks_per_measurement_[i_measurement].erase(iTrack);
33 if (state.tracks_per_measurement_[i_measurement].size() == 1) {
34 auto j_track = *state.tracks_per_measurement_[i_measurement].begin();
35 --state.shared_measurements_per_track_[j_track];
38 state.selected_tracks_.erase(iTrack);
44 std::vector<ldmx::Track> tracks, std::vector<ldmx::Measurement> meas_coll,
45 State& state, geometry_t& tg, source_link_hash_t&& sourceLinkHash,
46 source_link_equality_t&& sourceLinkEquality)
const {
47 auto measurement_index_map =
48 std::unordered_map<Acts::SourceLink, std::size_t, source_link_hash_t,
49 source_link_equality_t>(0, sourceLinkHash,
56 state.number_of_tracks_ = 0;
57 for (
const auto& track : tracks) {
63 std::vector<std::size_t> measurements;
64 for (
auto imeas : track.getMeasurementsIdxs()) {
65 auto meas = meas_coll.at(imeas);
66 const Acts::Surface* hit_surface = tg.getSurface(meas.getLayerID());
69 Acts::SourceLink source_link = Acts::SourceLink(idx_sl);
71 auto emplace = measurement_index_map.try_emplace(
72 source_link, measurement_index_map.size());
73 measurements.push_back(emplace.first->second);
76 state.track_tips_.push_back(state.number_of_tracks_);
77 state.track_chi2_.push_back(track.getChi2() / track.getNdf());
78 state.measurements_per_track_.push_back(std::move(measurements));
79 state.selected_tracks_.insert(state.number_of_tracks_);
81 ++state.number_of_tracks_;
85 for (std::size_t i_track = 0; i_track < state.number_of_tracks_; ++i_track) {
86 for (
auto i_measurement : state.measurements_per_track_[i_track]) {
87 state.tracks_per_measurement_[i_measurement].insert(i_track);
92 state.shared_measurements_per_track_ =
93 std::vector<std::size_t>(state.track_tips_.size(), 0);
94 for (std::size_t i_track = 0; i_track < state.number_of_tracks_; ++i_track) {
95 for (
auto i_measurement : state.measurements_per_track_[i_track]) {
96 if (state.tracks_per_measurement_[i_measurement].size() > 1) {
97 ++state.shared_measurements_per_track_[i_track];
106 auto shared_measurements_comperator = [&state](std::size_t a, std::size_t b) {
107 return state.shared_measurements_per_track_[a] <
108 state.shared_measurements_per_track_[b];
114 auto track_comperator = [&state](std::size_t a, std::size_t b) {
116 auto relative_shared_measurements = [&state](std::size_t i) {
117 return 1.0 * state.shared_measurements_per_track_[i] /
118 state.measurements_per_track_[i].size();
121 if (relative_shared_measurements(a) != relative_shared_measurements(b)) {
122 return relative_shared_measurements(a) < relative_shared_measurements(b);
124 return state.track_chi2_[a] < state.track_chi2_[b];
129 if (state.selected_tracks_.empty()) {
130 ldmx_log(trace) <<
"No tracks left - exit loop";
136 auto maximum_shared_measurements = *std::max_element(
137 state.selected_tracks_.begin(), state.selected_tracks_.end(),
138 shared_measurements_comperator);
142 if (state.shared_measurements_per_track_[maximum_shared_measurements] <
149 *std::max_element(state.selected_tracks_.begin(),
150 state.selected_tracks_.end(), track_comperator);
151 ldmx_log(trace) <<
"Remove track " << bad_track <<
", nMeas = "
152 << state.measurements_per_track_[bad_track].size()
154 << state.shared_measurements_per_track_[bad_track]
155 <<
", chi2 =" << state.track_chi2_[bad_track];
181 std::vector<ldmx::Track> out_tracks;
185 if (!event.
exists(track_collection_, input_pass_name_)) {
186 ldmx_log(debug) <<
"Track collection not found, exiting";
190 event.getCollection<
ldmx::Track>(track_collection_, input_pass_name_)};
192 if (!event.
exists(meas_collection_, input_pass_name_)) {
193 ldmx_log(debug) <<
"Measurement collection not found, exiting";
200 tracking::sim::utils::sourceLinkHash,
201 tracking::sim::utils::sourceLinkEquality);
204 for (
auto i_track : state.selected_tracks_) {
205 auto clean_trk = tracks[state.track_tips_.at(i_track)];
207 (std::abs(1. / clean_trk.getQoP()) > 0.05)) {
208 out_tracks.push_back(clean_trk);
212 event.add(out_trk_collection_, out_tracks);
220 ldmx_log(info) <<
" Resolved to " << state.selected_tracks_.size()
221 <<
" tracks from " <<
" " << tracks.size();
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