30 std::size_t iTrack)
const {
31 for (
auto iMeasurement : state.measurements_per_track[iTrack]) {
32 state.tracks_per_measurement[iMeasurement].erase(iTrack);
33 if (state.tracks_per_measurement[iMeasurement].size() == 1) {
34 auto jTrack = *state.tracks_per_measurement[iMeasurement].begin();
35 --state.shared_measurements_per_track[jTrack];
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 measurementIndexMap =
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 sourceLink = Acts::SourceLink(idx_sl);
71 auto emplace = measurementIndexMap.try_emplace(
72 sourceLink, measurementIndexMap.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 iTrack = 0; iTrack < state.number_of_tracks; ++iTrack) {
86 for (
auto iMeasurement : state.measurements_per_track[iTrack]) {
87 state.tracks_per_measurement[iMeasurement].insert(iTrack);
92 state.shared_measurements_per_track =
93 std::vector<std::size_t>(state.track_tips.size(), 0);
94 for (std::size_t iTrack = 0; iTrack < state.number_of_tracks; ++iTrack) {
95 for (
auto iMeasurement : state.measurements_per_track[iTrack]) {
96 if (state.tracks_per_measurement[iMeasurement].size() > 1) {
97 ++state.shared_measurements_per_track[iTrack];
106 auto sharedMeasurementsComperator = [&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 trackComperator = [&state](std::size_t a, std::size_t b) {
116 auto relativeSharedMeasurements = [&state](std::size_t i) {
117 return 1.0 * state.shared_measurements_per_track[i] /
118 state.measurements_per_track[i].size();
121 if (relativeSharedMeasurements(a) != relativeSharedMeasurements(b)) {
122 return relativeSharedMeasurements(a) < relativeSharedMeasurements(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 maximumSharedMeasurements = *std::max_element(
137 state.selected_tracks.begin(), state.selected_tracks.end(),
138 sharedMeasurementsComperator);
142 if (state.shared_measurements_per_track[maximumSharedMeasurements] <
149 *std::max_element(state.selected_tracks.begin(),
150 state.selected_tracks.end(), trackComperator);
151 ldmx_log(trace) <<
"Remove track " << badTrack <<
", nMeas = "
152 << state.measurements_per_track[badTrack].size()
154 << state.shared_measurements_per_track[badTrack]
155 <<
", chi2 =" << state.track_chi2[badTrack];
166 out_trk_collection_ = parameters.getParameter<std::string>(
167 "out_trk_collection",
"TaggerTracksClean");
170 parameters.getParameter<std::string>(
"trackCollection",
"TaggerTracks");
172 meas_collection_ = parameters.getParameter<std::string>(
"measCollection",
173 "DigiTaggerSimHits");
175 parameters.getParameter<std::string>(
"input_pass_name",
"");
176 n_meas_min_ = parameters.getParameter<
int>(
"nMeasurementsMin", 5);
182 std::vector<ldmx::Track> out_tracks;
186 if (!event.
exists(track_collection_, input_pass_name_)) {
187 ldmx_log(debug) <<
"Track collection not found, exiting";
191 event.getCollection<
ldmx::Track>(track_collection_, input_pass_name_)};
193 if (!event.
exists(meas_collection_, input_pass_name_)) {
194 ldmx_log(debug) <<
"Measurement collection not found, exiting";
201 tracking::sim::utils::sourceLinkHash,
202 tracking::sim::utils::sourceLinkEquality);
205 for (
auto iTrack : state.selected_tracks) {
206 auto clean_trk = tracks[state.track_tips.at(iTrack)];
208 (std::abs(1. / clean_trk.getQoP()) > 0.05)) {
209 out_tracks.push_back(clean_trk);
213 event.add(out_trk_collection_, out_tracks);
221 ldmx_log(info) <<
" Resolved to " << state.selected_tracks.size()
223 <<
" " << 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