Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-05 08:26:13

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2023-2024 CERN for the benefit of the Acts project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 #include "Acts/AmbiguityResolution/GreedyAmbiguityResolution.hpp"
0012 #include "Acts/EventData/TrackStateType.hpp"
0013 
0014 #include <unordered_map>
0015 
0016 namespace Acts {
0017 
0018 template <typename track_container_t, typename traj_t,
0019           template <typename> class holder_t, typename source_link_hash_t,
0020           typename source_link_equality_t>
0021 void GreedyAmbiguityResolution::computeInitialState(
0022     const TrackContainer<track_container_t, traj_t, holder_t>& tracks,
0023     State& state, source_link_hash_t&& sourceLinkHash,
0024     source_link_equality_t&& sourceLinkEquality) const {
0025   auto measurementIndexMap =
0026       std::unordered_map<SourceLink, std::size_t, source_link_hash_t,
0027                          source_link_equality_t>(0, sourceLinkHash,
0028                                                  sourceLinkEquality);
0029 
0030   // Iterate through all input tracks, collect their properties like measurement
0031   // count and chi2 and fill the measurement map in order to relate tracks to
0032   // each other if they have shared hits.
0033   for (const auto& track : tracks) {
0034     // Kick out tracks that do not fulfill our initial requirements
0035     if (track.nMeasurements() < m_cfg.nMeasurementsMin) {
0036       continue;
0037     }
0038     std::vector<std::size_t> measurements;
0039     for (auto ts : track.trackStatesReversed()) {
0040       bool isMeasurement = ts.typeFlags().test(TrackStateFlag::MeasurementFlag);
0041       bool isOutlier = ts.typeFlags().test(TrackStateFlag::OutlierFlag);
0042       if (isMeasurement && !isOutlier) {
0043         SourceLink sourceLink = ts.getUncalibratedSourceLink();
0044         // assign a new measurement index if the source link was not seen yet
0045         auto emplace = measurementIndexMap.try_emplace(
0046             sourceLink, measurementIndexMap.size());
0047         measurements.push_back(emplace.first->second);
0048       }
0049     }
0050 
0051     state.trackTips.push_back(track.index());
0052     state.trackChi2.push_back(track.chi2() / track.nDoF());
0053     state.measurementsPerTrack.push_back(std::move(measurements));
0054     state.selectedTracks.insert(state.numberOfTracks);
0055 
0056     ++state.numberOfTracks;
0057   }
0058 
0059   // Now we relate measurements to tracks
0060   for (std::size_t iTrack = 0; iTrack < state.numberOfTracks; ++iTrack) {
0061     for (auto iMeasurement : state.measurementsPerTrack[iTrack]) {
0062       state.tracksPerMeasurement[iMeasurement].insert(iTrack);
0063     }
0064   }
0065 
0066   // Finally, we can accumulate the number of shared measurements per track
0067   state.sharedMeasurementsPerTrack =
0068       std::vector<std::size_t>(state.trackTips.size(), 0);
0069   for (std::size_t iTrack = 0; iTrack < state.numberOfTracks; ++iTrack) {
0070     for (auto iMeasurement : state.measurementsPerTrack[iTrack]) {
0071       if (state.tracksPerMeasurement[iMeasurement].size() > 1) {
0072         ++state.sharedMeasurementsPerTrack[iTrack];
0073       }
0074     }
0075   }
0076 }
0077 
0078 }  // namespace Acts