102 {
103 std::unique_ptr<TrackToTruthParticleAssociation>
104 track_association( std::make_unique<TrackToTruthParticleAssociation>() );
105
107 if (!pixelClustersToTruthAssociation.
isValid()) {
109 return StatusCode::FAILURE;
110 }
112 if (!stripClustersToTruthAssociation.
isValid()) {
114 return StatusCode::FAILURE;
115 }
116
118 if (!tracksContainer.
isValid()) {
120 return StatusCode::FAILURE;
121 }
122 track_association->resize( tracksContainer->size() );
123 track_association->setSourceContainer(DataLink<ActsTrk::TrackContainer>(*tracksContainer,ctx));
124 Acts::GeometryContext tgContext =
m_ctxProvider.getGeometryContext(ctx);
125
126 std::array<const ActsTrk::MeasurementToTruthParticleAssociation *,
128 measurement_to_truth_association_maps{};
129
132
135 if (!hgtdClustersToTruthAssociation.
isValid()) {
137 }
139 }
140
142 const ActsTrk::MeasurementToTruthParticleAssociation *assoc = measurement_to_truth_association_maps[Acts::toUnderlying(type)];
143 return assoc ? assoc->size() : 0
ul;
144 };
145
149 );
150 unsigned int track_i=0;
151 std::array<unsigned int,s_NCounterForAssociatedTruth> tracks_with_associated_truth{};
152 std::pair<unsigned int, unsigned int> compatible_assoc_container_counts{};
154
156 ++compatible_assoc_container_counts.second;
157 }
158
159 std::vector<unsigned int> counted_truth_particles;
160 counted_truth_particles.reserve(10);
161
162 for (const typename ActsTrk::TrackContainer::ConstTrackProxy track : *tracksContainer) {
163 const auto lastMeasurementIndex =
track.tipIndex();
164
165 unsigned int n_measurements=0
u;
166
167 HitCounterArray &reco_hits = track_association->at(track_i).totalCounts();
168 HitCounterArray &noise_hits = track_association->at(track_i).noiseCounts();
170 tracksContainer->trackStateContainer().visitBackwards(
171 lastMeasurementIndex,
172 [this,
173 &n_measurements,
174 &measurement_to_truth_association_maps,
175 &truth_particle_counts,
176 &reco_hits,
177 &noise_hits,
178 &counted_truth_particles,
179 &compatible_assoc_container_counts
180 ](const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy &state) -> void
181 {
182 if (!state.typeFlags().isOutlier() && state.hasUncalibratedSourceLink()) {
184
185 const ActsTrk::MeasurementToTruthParticleAssociation *association_map = measurement_to_truth_association_maps.at(Acts::toUnderlying(uncalibMeas->type()));
186 if (association_map) {
188 if (compatible_assoc_container_counts.second==0) {
189 ATH_MSG_ERROR(
"MeasurementToTruthParticleAssociation for measurement type " << uncalibMeas->type()
190 << " is not compatible with the measurement on track.");
191 }
192 ++compatible_assoc_container_counts.second;
193 return;
194 }
195 else {
196 ++compatible_assoc_container_counts.first;
197 }
198 ++n_measurements;
199 counted_truth_particles.clear();
200 for (
const xAOD::TruthParticle *truth_particle : association_map->at(uncalibMeas->index()) ) {
202
203
204 if (std::find(counted_truth_particles.begin(), counted_truth_particles.end(), mother_particle->index())
205 ==counted_truth_particles.end()) {
206 counted_truth_particles.push_back(mother_particle->index());
207
208 ActsTrk::HitCountsPerTrack::container::iterator
209 hit_count_iter = std::find_if(truth_particle_counts.begin(),
210 truth_particle_counts.end(),
211 [mother_particle](
const std::pair<const xAOD::TruthParticle *, HitCounterArray > &
a) {
212 return a.first == mother_particle;
213 });
214 if (hit_count_iter == truth_particle_counts.end()) {
215 truth_particle_counts.push_back( std::make_pair(mother_particle, HitCounterArray{}));
216 hit_count_iter = truth_particle_counts.end()-1;
217 }
218 ++(hit_count_iter->second.at( Acts::toUnderlying(uncalibMeas->type())));
219 }
220 }
221 if (association_map->at(uncalibMeas->index()).empty()) {
222 ++noise_hits.at( Acts::toUnderlying(uncalibMeas->type()));
223 }
224 }
225 ++reco_hits.at( Acts::toUnderlying(uncalibMeas->type()));
226 }
227
228 });
229 std::sort( truth_particle_counts.begin(),
230 truth_particle_counts.end(),
231 [](
const std::pair<const xAOD::TruthParticle *, HitCounterArray > &
a,
232 const std::pair<const xAOD::TruthParticle *, HitCounterArray > &b) {
233 return std::accumulate(a.second.begin(),a.second.end(),0u) > std::accumulate(b.second.begin(),b.second.end(),0u);
234 });
236 ++(tracks_with_associated_truth[std::min(truth_particle_counts.size(),tracks_with_associated_truth.size()-1u)]);
237 ++track_i;
238 }
240 for (unsigned int elm : tracks_with_associated_truth) {
241 m_nTracksWithAssociatedTruth[
idx] += elm;
243 }
246
247 SG::WriteHandle<TrackToTruthParticleAssociation> associationOutHandle(
m_trackToTruthOut, ctx);
248 if (associationOutHandle.record( std::move(track_association)).isFailure()) {
250 return StatusCode::FAILURE;
251 }
252 return StatusCode::SUCCESS;
253 }
boost::container::small_vector< std::pair< const xAOD::TruthParticle *, HitCounterArray >, NTruthParticlesPerTrack > container
bool isCompatibleWith(const xAOD::UncalibratedMeasurementContainer *container) const
Gaudi::Property< float > m_maxEnergyLoss
std::atomic< std::size_t > m_nCcompatibleMeasurementContainer
AssociationCounter< TrackToTruthParticleAssociationDebugHists > m_associationCounter
SG::WriteHandleKey< TrackToTruthParticleAssociation > m_trackToTruthOut
std::atomic< std::size_t > m_nIncompatibleMeasurementContainer
SG::ReadHandleKey< ActsTrk::TrackContainer > m_tracksContainerKey
ContextUtility m_ctxProvider
Context provider for geometry, magnetic field and calibration contexts.
SG::ReadHandleKey< MeasurementToTruthParticleAssociation > m_hgtdClustersToTruth
ElasticDecayUtil< TrackToTruthParticleAssociationDebugHists > m_elasticDecayUtil
SG::ReadHandleKey< MeasurementToTruthParticleAssociation > m_pixelClustersToTruth
SG::ReadHandleKey< MeasurementToTruthParticleAssociation > m_stripClustersToTruth
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
@ u
Enums for curvilinear frames.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
TruthParticle_v1 TruthParticle
Typedef to implementation.
UncalibMeasType
Define the type of the uncalibrated measurement.
UncalibratedMeasurementContainer_v1 UncalibratedMeasurementContainer
Define the version of the uncalibrated measurement container.