4 #ifndef ACTSTRACKRECONSTRUCTION_TRACKFINDINGDATA_H
5 #define ACTSTRACKRECONSTRUCTION_TRACKFINDINGDATA_H 1
10 #include "Acts/EventData/VectorTrackContainer.hpp"
11 #include "Acts/EventData/TrackContainer.hpp"
12 #include "Acts/EventData/TrackProxy.hpp"
13 #include "Acts/Definitions/Common.hpp"
14 #include "Acts/Definitions/Algebra.hpp"
15 #include "Acts/Propagator/EigenStepper.hpp"
16 #include "Acts/Propagator/Navigator.hpp"
17 #include "Acts/Propagator/Propagator.hpp"
18 #include "Acts/TrackFitting/GainMatrixSmoother.hpp"
19 #include "Acts/TrackFitting/GainMatrixUpdater.hpp"
20 #include "Acts/TrackFinding/MeasurementSelector.hpp"
21 #include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp"
22 #include "Acts/TrackFinding/TrackSelector.hpp"
23 #include "Acts/Surfaces/Surface.hpp"
39 #include <unordered_map>
59 using Stepper = Acts::EigenStepper<>;
60 using Navigator = Acts::Navigator;
61 using Propagator = Acts::Propagator<Stepper, Navigator>;
62 using CKF = Acts::CombinatorialKalmanFilter<Propagator, RecoTrackStateContainer>;
63 using Extrapolator = Propagator;
72 Extrapolator extrapolator;
76 Acts::MeasurementSelector measurementSelector;
77 Acts::PropagatorPlainOptions pOptions;
78 Acts::PropagatorPlainOptions pSecondOptions;
79 Acts::CombinatorialKalmanFilterExtensions<RecoTrackStateContainer> ckfExtensions;
81 Acts::TrackSelector trackSelector;
87 class DuplicateSeedDetector
90 DuplicateSeedDetector(
size_t numSeeds,
bool enabled)
91 : m_disabled(!enabled),
92 m_nUsedMeasurements(enabled ? numSeeds : 0
u, 0
u),
93 m_nSeedMeasurements(enabled ? numSeeds : 0
u, 0
u),
94 m_isDuplicateSeed(enabled ? numSeeds : 0
u, false)
98 m_seedIndex.reserve(6 * numSeeds);
99 m_seedOffset.reserve(2);
102 DuplicateSeedDetector() =
delete;
103 DuplicateSeedDetector(
const DuplicateSeedDetector &) =
delete;
104 DuplicateSeedDetector &operator=(
const DuplicateSeedDetector &) =
delete;
112 if (!(typeIndex < m_seedOffset.size()))
113 m_seedOffset.resize(typeIndex + 1);
114 m_seedOffset[typeIndex] = m_numSeed;
116 for (
const auto *seed : seeds)
120 for (
const auto *sp :
seed->sp())
122 const auto &els = sp->measurements();
125 m_seedIndex.insert({meas, m_numSeed});
126 ++m_nSeedMeasurements[m_numSeed];
135 if (m_disabled || m_found == 0 || m_nextSeed == m_nUsedMeasurements.size())
137 auto beg = m_nUsedMeasurements.begin();
138 if (m_nextSeed < m_nUsedMeasurements.size())
139 std::advance(
beg, m_nextSeed);
145 if (m_disabled || m_nextSeed == m_nUsedMeasurements.size())
149 size_t iseed = iiseed->second;
150 assert(iseed < m_nUsedMeasurements.size());
151 if (iseed < m_nextSeed || m_isDuplicateSeed[iseed])
153 if (++m_nUsedMeasurements[iseed] >= m_nSeedMeasurements[iseed])
155 assert(m_nUsedMeasurements[iseed] == m_nSeedMeasurements[iseed]);
156 m_isDuplicateSeed[iseed] =
true;
163 bool isDuplicate(
size_t typeIndex,
size_t iseed)
167 if (typeIndex < m_seedOffset.size())
168 iseed += m_seedOffset[typeIndex];
169 assert(iseed < m_isDuplicateSeed.size());
171 if (iseed >= m_nextSeed)
172 m_nextSeed = iseed + 1;
173 return m_isDuplicateSeed[iseed];
177 bool m_disabled =
false;
178 std::unordered_multimap<const xAOD::UncalibratedMeasurement *, size_t> m_seedIndex;
179 std::vector<size_t> m_nUsedMeasurements;
180 std::vector<size_t> m_nSeedMeasurements;
181 std::vector<bool> m_isDuplicateSeed;
182 std::vector<size_t> m_seedOffset;
183 size_t m_numSeed = 0
u;
184 size_t m_nextSeed = 0
u;
191 class TrackFindingMeasurements {
193 TrackFindingMeasurements(std::size_t measTotal) {
194 m_orderedGeoIds.reserve(measTotal);
195 m_measurementOffsets.reserve(2);
198 TrackFindingMeasurements() =
delete;
199 TrackFindingMeasurements(
const TrackFindingMeasurements &) =
delete;
200 TrackFindingMeasurements &operator=(
const TrackFindingMeasurements &) =
delete;
204 const ToolHandle<ActsTrk::IActsToTrkConverterTool> &ATLASConverterTool) {
205 assert (m_sorted ==
false);
208 std::stringstream
msg;
210 throw std::runtime_error(
msg.str());
214 m_trackingSurfaceHelper.setSiDetectorElements(measType, &detElems);
217 auto &actsSurfaces = m_trackingSurfaceHelper.actsSurfaces(measType);
218 actsSurfaces.reserve(actsSurfaces.size() + detElems.size());
219 for (
const auto *det_el : detElems)
221 const Acts::Surface &surface = ATLASConverterTool->trkSurfaceToActsSurface(det_el->surface());
222 m_orderedGeoIds.push_back(surface.geometryId());
223 actsSurfaces.push_back(&surface);
229 void addMeasurements(
size_t typeIndex,
232 const ToolHandle<ActsTrk::IActsToTrkConverterTool> &ATLASConverterTool) {
234 std::sort(m_orderedGeoIds.begin(), m_orderedGeoIds.end());
236 m_measurementRanges.resize(m_orderedGeoIds.size());
240 if (!(typeIndex < m_measurementOffsets.size()))
241 m_measurementOffsets.resize(typeIndex + 1);
242 m_measurementOffsets[typeIndex] = m_measurementsTotal;
244 m_measurementRanges.setContainer(typeIndex, &clusterContainer);
248 unsigned int range_idx = m_measurementRanges.size();
249 std::size_t sl_idx = 0;
250 for (
auto *measurement : clusterContainer)
256 throw std::domain_error(
"No detector element for measurement");
259 if (measurement->identifierHash() != last_id_hash || measurement->type() != last_measurement_type)
261 const Acts::Surface &surface = ATLASConverterTool->trkSurfaceToActsSurface(elem->
surface());
262 std::vector<Acts::GeometryIdentifier>::const_iterator
263 geo_iter = std::lower_bound(m_orderedGeoIds.begin(), m_orderedGeoIds.end(), surface.geometryId());
264 if (geo_iter == m_orderedGeoIds.end() || *geo_iter != surface.geometryId())
266 std::stringstream
msg;
267 msg <<
"Measurement with unexpected Acts geometryId: " << surface.geometryId()
268 <<
" type = " <<
static_cast<unsigned int>(measurement->type())
269 <<
" idHash=" << measurement->identifierHash();
270 throw std::runtime_error(
msg.str());
272 range_idx = geo_iter - m_orderedGeoIds.begin();
275 std::stringstream
msg;
276 msg <<
"Measurement not clustered by identifierHash / geometryId. New measurement "
277 << sl_idx <<
" with geo Id " << surface.geometryId()
278 <<
" type = " <<
static_cast<unsigned int>(measurement->type())
279 <<
" idHash=" << measurement->identifierHash()
280 <<
" but already recorded for this geo ID the range : " << m_measurementRanges[range_idx].first
281 <<
" .. " << m_measurementRanges[range_idx].second;
282 throw std::runtime_error(
msg.str());
284 m_measurementRanges[range_idx].setRangeBegin(typeIndex, sl_idx);
285 last_id_hash = measurement->identifierHash();
286 last_measurement_type = measurement->type();
288 m_measurementRanges[range_idx].setRangeEnd(typeIndex, sl_idx + 1);
291 m_measurementsTotal += clusterContainer.size();
294 std::vector<std::pair<const xAOD::UncalibratedMeasurementContainer *, size_t>> measurementContainerOffsets()
const
296 std::vector<std::pair<const xAOD::UncalibratedMeasurementContainer *, size_t>> offsets;
297 if (m_measurementRanges.numContainers() == 0)
return offsets;
298 offsets.reserve(m_measurementRanges.numContainers() - 1);
299 for (std::size_t typeIndex = 0; typeIndex < m_measurementRanges.numContainers(); ++typeIndex)
303 m_measurementRanges.container(typeIndex));
304 if (measurementOffset(typeIndex) > 0 && the_container !=
nullptr)
306 offsets.emplace_back(the_container, measurementOffset(typeIndex));
312 size_t measurementOffset(
size_t typeIndex)
const {
return typeIndex < m_measurementOffsets.size() ? m_measurementOffsets[typeIndex] : 0
u; }
313 const std::vector<size_t>& measurementOffsets()
const {
return m_measurementOffsets; }
314 const std::vector<Acts::GeometryIdentifier> &orderedGeoIds()
const {
return m_orderedGeoIds; }
320 std::vector<size_t> m_measurementOffsets;
321 std::vector<Acts::GeometryIdentifier> m_orderedGeoIds;
324 std::size_t m_measurementsTotal = 0;
325 bool m_sorted =
false;