108 std::unique_ptr<TrackToTruthParticleAssociation>
109 track_association( std::make_unique<TrackToTruthParticleAssociation>() );
112 if (!pixelClustersToTruthAssociation.
isValid()) {
114 return StatusCode::FAILURE;
117 if (!stripClustersToTruthAssociation.
isValid()) {
119 return StatusCode::FAILURE;
123 if (!tracksContainer.
isValid()) {
125 return StatusCode::FAILURE;
127 track_association->resize( tracksContainer->size() );
133 measurement_to_truth_association_maps{};
140 if (!hgtdClustersToTruthAssociation.
isValid()) {
148 return assoc ? assoc->size() : 0ul;
155 unsigned int track_i=0;
156 std::array<unsigned int,s_NCounterForAssociatedTruth> tracks_with_associated_truth{};
157 std::pair<unsigned int, unsigned int> compatible_assoc_container_counts{};
161 ++compatible_assoc_container_counts.second;
164 std::vector<unsigned int> counted_truth_particles;
165 counted_truth_particles.reserve(10);
167 for (
const typename ActsTrk::TrackContainer::ConstTrackProxy track : *tracksContainer) {
168 const auto lastMeasurementIndex = track.tipIndex();
170 unsigned int n_measurements=0u;
172 HitCounterArray &reco_hits = track_association->at(track_i).totalCounts();
173 HitCounterArray &noise_hits = track_association->at(track_i).noiseCounts();
175 tracksContainer->trackStateContainer().visitBackwards(
176 lastMeasurementIndex,
179 &measurement_to_truth_association_maps,
180 &truth_particle_counts,
183 &counted_truth_particles,
184 &compatible_assoc_container_counts
185 ](
const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy &state) ->
void
187 if (!state.typeFlags().isOutlier() && state.hasUncalibratedSourceLink()) {
189 assert( sl !=
nullptr );
193 if (association_map) {
195 if (compatible_assoc_container_counts.second==0) {
196 ATH_MSG_ERROR(
"MeasurementToTruthParticleAssociation for measurement type " << Acts::toUnderlying(uncalibMeas.
type())
197 <<
" is not compatible with the measurement on track.");
199 ++compatible_assoc_container_counts.second;
203 ++compatible_assoc_container_counts.first;
206 counted_truth_particles.clear();
207 for (
const xAOD::TruthParticle *truth_particle : association_map->at(uncalibMeas.index()) ) {
211 if (std::find(counted_truth_particles.begin(), counted_truth_particles.end(), mother_particle->index())
212 ==counted_truth_particles.end()) {
213 counted_truth_particles.push_back(mother_particle->index());
215 ActsTrk::HitCountsPerTrack::container::iterator
216 hit_count_iter = std::find_if(truth_particle_counts.begin(),
217 truth_particle_counts.end(),
218 [mother_particle](
const std::pair<const xAOD::TruthParticle *, HitCounterArray > &
a) {
219 return a.first == mother_particle;
221 if (hit_count_iter == truth_particle_counts.end()) {
222 truth_particle_counts.push_back( std::make_pair(mother_particle,
HitCounterArray{}));
223 hit_count_iter = truth_particle_counts.end()-1;
225 ++(hit_count_iter->second.at( Acts::toUnderlying(uncalibMeas.
type())));
228 if (association_map->at(uncalibMeas.index()).empty()) {
229 ++noise_hits.at( Acts::toUnderlying(uncalibMeas.
type()));
232 ++reco_hits.at( Acts::toUnderlying(uncalibMeas.
type()));
236 std::sort( truth_particle_counts.begin(),
237 truth_particle_counts.end(),
238 [](
const std::pair<const xAOD::TruthParticle *, HitCounterArray > &
a,
239 const std::pair<const xAOD::TruthParticle *, HitCounterArray > &b) {
240 return std::accumulate(a.second.begin(),a.second.end(),0u) > std::accumulate(b.second.begin(),b.second.end(),0u);
243 ++(tracks_with_associated_truth[std::min(truth_particle_counts.size(),tracks_with_associated_truth.size()-1u)]);
247 for (
unsigned int elm : tracks_with_associated_truth) {
248 m_nTracksWithAssociatedTruth[idx] += elm;
255 if (associationOutHandle.
record( std::move(track_association)).isFailure()) {
257 return StatusCode::FAILURE;
259 return StatusCode::SUCCESS;