ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrk::detail::TrackFindingMeasurements Class Reference

#include <TrackFindingMeasurements.h>

Collaboration diagram for ActsTrk::detail::TrackFindingMeasurements:

Classes

struct  MeasurementSurfaceIndex

Public Member Functions

 TrackFindingMeasurements (std::size_t nMeasurementContainerMax)
 TrackFindingMeasurements (const TrackFindingMeasurements &)=default
TrackFindingMeasurementsoperator= (const TrackFindingMeasurements &)=default
 TrackFindingMeasurements (TrackFindingMeasurements &&) noexcept=default
TrackFindingMeasurementsoperator= (TrackFindingMeasurements &&) noexcept=default
 ~TrackFindingMeasurements ()=default
void addMeasurements (std::size_t typeIndex, const xAOD::UncalibratedMeasurementContainer &clusterContainer, const DetectorElementToActsGeometryIdMap &detectorElementToGeoid, const MeasurementIndex *measurementIndex=nullptr)
MeasurementRangeListFlat setMeasurementRangesForced (const ActsTrk::Seed &seed, const MeasurementIndex &measurementIndex) const
MeasurementRange markSurfaceInsensitive (const Acts::GeometryIdentifier &identifier)
const MeasurementRangeListmeasurementRanges () const
std::size_t nMeasurements () const
const std::vector< std::size_t > & measurementOffsets () const
const xAOD::UncalibratedMeasurementContainercontainer (std::size_t typeIndex) const

Static Private Member Functions

template<typename MeasurementRangeList_t>
static MeasurementRangeaddMeasurementToRange (MeasurementRangeList_t &measurementRanges, unsigned int typeIndex, unsigned int sl_idx, unsigned int sl_idx_end, const xAOD::UncalibratedMeasurement *measurement, Acts::GeometryIdentifier measurementSurfaceId)

Private Attributes

std::vector< std::size_t > m_measurementOffsets
MeasurementRangeList m_measurementRanges {}
std::vector< const xAOD::UncalibratedMeasurementContainer * > m_containers {}
std::vector< MeasurementSurfaceIndexm_surfaceIndices
std::size_t m_measurementsTotal {0ul}

Detailed Description

Definition at line 21 of file TrackFindingMeasurements.h.

Constructor & Destructor Documentation

◆ TrackFindingMeasurements() [1/3]

ActsTrk::detail::TrackFindingMeasurements::TrackFindingMeasurements ( std::size_t nMeasurementContainerMax)

Definition at line 12 of file TrackFindingMeasurements.cxx.

13 : m_measurementOffsets(nMeasurementContainerMax, 0ul) {
14 m_containers.reserve(nMeasurementContainerMax);
15 }
std::vector< const xAOD::UncalibratedMeasurementContainer * > m_containers

◆ TrackFindingMeasurements() [2/3]

ActsTrk::detail::TrackFindingMeasurements::TrackFindingMeasurements ( const TrackFindingMeasurements & )
default

◆ TrackFindingMeasurements() [3/3]

ActsTrk::detail::TrackFindingMeasurements::TrackFindingMeasurements ( TrackFindingMeasurements && )
defaultnoexcept

◆ ~TrackFindingMeasurements()

ActsTrk::detail::TrackFindingMeasurements::~TrackFindingMeasurements ( )
default

Member Function Documentation

◆ addMeasurements()

void ActsTrk::detail::TrackFindingMeasurements::addMeasurements ( std::size_t typeIndex,
const xAOD::UncalibratedMeasurementContainer & clusterContainer,
const DetectorElementToActsGeometryIdMap & detectorElementToGeoid,
const MeasurementIndex * measurementIndex = nullptr )

Definition at line 17 of file TrackFindingMeasurements.cxx.

20 {
21 unsigned int typeIndex32 = static_cast<unsigned int>(typeIndex);
22 if (typeIndex < m_measurementOffsets.size())
24 if (!(typeIndex < m_containers.size()))
25 m_containers.resize(typeIndex + 1);
26 m_containers[typeIndex] = &clusterContainer;
27 if (measurementIndex)
28 m_surfaceIndices.resize(measurementIndex->size());
29
30 if (m_measurementRanges.empty()) {
31 // try to reserve needed space,
32 // this however will reserve more than necessary not just the space needed for the surfaces of
33 // all the measurements that are going to be added (e.g. pixel+strips).
34 m_measurementRanges.reserve(detectorElementToGeoid.size());
35 }
36 m_measurementRanges.setContainer(typeIndex32, &clusterContainer);
37
38 xAOD::DetectorIDHashType lastIdHash = std::numeric_limits<xAOD::DetectorIDHashType>::max();
39 MeasurementRange *currentRange = nullptr;
40
41 std::size_t n_elements = clusterContainer.size();
42 unsigned int sl_idx = 0;
43 Acts::GeometryIdentifier measurementSurfaceId{};
44 for (; sl_idx < n_elements; ++sl_idx) {
45 const auto *measurement = clusterContainer[sl_idx];
46 xAOD::DetectorIDHashType idHash = measurement->identifierHash();
47 if (idHash != lastIdHash) {
48 if (currentRange) {
49 currentRange->updateEnd(typeIndex, sl_idx);
50 }
51 lastIdHash = idHash;
52
53 measurementSurfaceId = ActsTrk::getSurfaceGeometryIdOfMeasurement(detectorElementToGeoid, *measurement);
54
55 currentRange = addMeasurementToRange(m_measurementRanges, typeIndex32, sl_idx, sl_idx, measurement, measurementSurfaceId);
56 }
57 if (measurementIndex) {
58 // sl_idx may be different from measurement->index() if we aren't passed the owning container (eg. with cached mode).
59 // So we save the mapping here. This is only needed by setMeasurementRangesForced(), so measurementIndex is optional.
60 // We also save the measurementSurfaceId for quick access. Note that this may have been calculated on a previous iteration for the same id hash.
61 std::size_t idx = measurementIndex->index(*measurement);
62 if (idx < m_surfaceIndices.size())
63 m_surfaceIndices.at(idx) = {measurementSurfaceId, typeIndex32, sl_idx};
64 }
65 }
66
67 if (currentRange) {
68 currentRange->updateEnd(typeIndex, sl_idx);
69 }
70
71 m_measurementsTotal += clusterContainer.size();
72 }
std::vector< MeasurementSurfaceIndex > m_surfaceIndices
static MeasurementRange * addMeasurementToRange(MeasurementRangeList_t &measurementRanges, unsigned int typeIndex, unsigned int sl_idx, unsigned int sl_idx_end, const xAOD::UncalibratedMeasurement *measurement, Acts::GeometryIdentifier measurementSurfaceId)
size_type size() const noexcept
Returns the number of elements in the collection.
Acts::GeometryIdentifier getSurfaceGeometryIdOfMeasurement(const DetectorElementToActsGeometryIdMap &detector_element_to_geoid, const xAOD::UncalibratedMeasurement &measurement)
unsigned int DetectorIDHashType
@ detector ID element hash

◆ addMeasurementToRange()

template<typename MeasurementRangeList_t>
MeasurementRange * ActsTrk::detail::TrackFindingMeasurements::addMeasurementToRange ( MeasurementRangeList_t & measurementRanges,
unsigned int typeIndex,
unsigned int sl_idx,
unsigned int sl_idx_end,
const xAOD::UncalibratedMeasurement * measurement,
Acts::GeometryIdentifier measurementSurfaceId )
staticprivate

Definition at line 76 of file TrackFindingMeasurements.cxx.

81 {
82 if (measurementSurfaceId.value() == 0u) {
83 std::stringstream msg;
84 msg << "No Acts surface associated to measurement "
85 << sl_idx << " type = " << static_cast<unsigned int>(measurement->type())
86 << " idHash=" << measurement->identifierHash();
87 throw std::domain_error(msg.str());
88 }
89
90 // start with en empty range which is updated later.
91 auto ret = measurementRanges.insert(std::make_pair(measurementSurfaceId.value(),
92 MeasurementRange(typeIndex, sl_idx, sl_idx_end)));
93 if (!ret.second) {
94 std::stringstream msg;
95 msg << "Measurement not clustered by identifierHash / geometryId. New measurement "
96 << sl_idx << " with geo Id " << measurementSurfaceId
97 << " type = " << static_cast<unsigned int>(measurement->type())
98 << " idHash=" << measurement->identifierHash()
99 << " but already recorded for this geo ID the range : [" << ret.first->second.containerIndex() << "]"
100 << ret.first->second.elementBeginIndex()
101 << " .. " << ret.first->second.elementEndIndex()
102 << (ret.first->second.isConsistentRange() ? "" : " !Container index inconsistent or not in increasing order!");
103 throw std::runtime_error(msg.str());
104 }
105 return &ret.first->second;
106 }
const MeasurementRangeList & measurementRanges() const
DetectorIDHashType identifierHash() const
Returns the IdentifierHash of the measurement (corresponds to the detector element IdentifierHash)
virtual xAOD::UncalibMeasType type() const =0
Returns the type of the measurement type as a simple enumeration.
MsgStream & msg
Definition testRead.cxx:32

◆ container()

const xAOD::UncalibratedMeasurementContainer * ActsTrk::detail::TrackFindingMeasurements::container ( std::size_t typeIndex) const
inline

◆ markSurfaceInsensitive()

MeasurementRange ActsTrk::detail::TrackFindingMeasurements::markSurfaceInsensitive ( const Acts::GeometryIdentifier & identifier)

Definition at line 108 of file TrackFindingMeasurements.cxx.

108 {
109 auto ret = m_measurementRanges.insert(std::make_pair(identifier.value(),
111 if (!ret.second) {
112 return ret.first->second;
113 } else {
114 return MeasurementRange();
115 }
116 }

◆ measurementOffsets()

const std::vector< std::size_t > & ActsTrk::detail::TrackFindingMeasurements::measurementOffsets ( ) const
inline

◆ measurementRanges()

const MeasurementRangeList & ActsTrk::detail::TrackFindingMeasurements::measurementRanges ( ) const
inline

◆ nMeasurements()

std::size_t ActsTrk::detail::TrackFindingMeasurements::nMeasurements ( ) const
inline

◆ operator=() [1/2]

TrackFindingMeasurements & ActsTrk::detail::TrackFindingMeasurements::operator= ( const TrackFindingMeasurements & )
default

◆ operator=() [2/2]

TrackFindingMeasurements & ActsTrk::detail::TrackFindingMeasurements::operator= ( TrackFindingMeasurements && )
defaultnoexcept

◆ setMeasurementRangesForced()

MeasurementRangeListFlat ActsTrk::detail::TrackFindingMeasurements::setMeasurementRangesForced ( const ActsTrk::Seed & seed,
const MeasurementIndex & measurementIndex ) const

Definition at line 119 of file TrackFindingMeasurements.cxx.

120 {
121 ActsTrk::detail::MeasurementRangeListFlat measurementRangesForced;
122 measurementRangesForced.reserve(seed.sp().size()); // wrong for strip seeds, but just means an extra allocation in this rare case
123 for (const xAOD::SpacePoint *sp : seed.sp()) {
124 for (const xAOD::UncalibratedMeasurement *measurement : sp->measurements()) {
125 std::size_t idx = measurementIndex.index(*measurement);
126 if (!(idx < m_surfaceIndices.size())) {
127 // The measurement was not found in the measurementIndex.
128 // This could happen if no measurements in the same owning container were provided to addMeasurements().
129 continue;
130 }
131 auto [measurementSurfaceId, typeIndex, sl_idx] = m_surfaceIndices.at(idx);
132 if (measurementSurfaceId.value() == 0ul) {
133 // This measurement was not provided to addMeasurements(), so we can't force the track onto it.
134 // This happens in secondary passes, which are given a reduced set of measurements.
135 // Note that the test uses measurementSurfaceId=0, since 0 is valid for the other members.
136 continue;
137 }
138 assert(container(typeIndex)->at(sl_idx) == measurement);
139 measurementRangesForced.setContainer(typeIndex, container(typeIndex));
140 addMeasurementToRange(measurementRangesForced,
141 typeIndex,
142 sl_idx,
143 sl_idx + 1,
144 measurement,
145 measurementSurfaceId);
146 }
147 }
148 return measurementRangesForced;
149 }
static Double_t sp
void setContainer(unsigned int container_index, const xAOD::UncalibratedMeasurementContainer *container)
const xAOD::UncalibratedMeasurementContainer * container(std::size_t typeIndex) const
GenMeasurementRangeListFlat< AtlasMeasurementContainerList > MeasurementRangeListFlat
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.

Member Data Documentation

◆ m_containers

std::vector<const xAOD::UncalibratedMeasurementContainer *> ActsTrk::detail::TrackFindingMeasurements::m_containers {}
private

Definition at line 61 of file TrackFindingMeasurements.h.

61{};

◆ m_measurementOffsets

std::vector<std::size_t> ActsTrk::detail::TrackFindingMeasurements::m_measurementOffsets
private

Definition at line 58 of file TrackFindingMeasurements.h.

◆ m_measurementRanges

MeasurementRangeList ActsTrk::detail::TrackFindingMeasurements::m_measurementRanges {}
private

Definition at line 60 of file TrackFindingMeasurements.h.

60{};

◆ m_measurementsTotal

std::size_t ActsTrk::detail::TrackFindingMeasurements::m_measurementsTotal {0ul}
private

Definition at line 64 of file TrackFindingMeasurements.h.

64{0ul};
unsigned long ul

◆ m_surfaceIndices

std::vector<MeasurementSurfaceIndex> ActsTrk::detail::TrackFindingMeasurements::m_surfaceIndices
private

Definition at line 62 of file TrackFindingMeasurements.h.


The documentation for this class was generated from the following files: