32#include "Acts/Utilities/Helpers.hpp"
60 return StatusCode::SUCCESS;
94 measurement_to_truth_association_maps{};
103 return assoc ? assoc->size() : 0ul;
113 if (!tracksContainer.
isValid()) {
115 return StatusCode::FAILURE;
128 *uncalibratedMeasurementContainer,
130 primaryExpectedLookup));
139 if (!link_to_truth.
isValid()) {
140 layerClusterTruthClassHandle(*trackParticle) = {-1, -1, -1, -1};
141 layerClusterShadowedHandle(*trackParticle) = {
false,
false,
false,
false};
142 layerClusterMergedHandle(*trackParticle) = {
false,
false,
false,
false};
143 layerPrimaryExpectedHandle(*trackParticle) = {
false,
false,
false,
false};
144 ATH_MSG_DEBUG(
"TrackParticle " << trackParticle->index() <<
": invalid truth link");
148 truthParticle = *link_to_truth;
153 if (!link_to_track.
isValid()) {
154 ATH_MSG_DEBUG(
"TrackParticle " << trackParticle->index() <<
": invalid extension link");
155 data.truthClassVec = {-1, -1, -1, -1};
156 data.isShadowedVec = {
false,
false,
false,
false};
157 data.isMergedVec = {
false,
false,
false,
false};
160 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = *link_to_track;
161 const ActsTrk::TrackContainer::ConstTrackProxy& track = optional_track.value();
162 ATH_MSG_DEBUG(
"TrackParticle " << trackParticle->index() <<
": extension with chi2 " << track.chi2() <<
" and nHits " << track.nMeasurements());
169 if (
auto itr = primaryExpectedLookup.find(truthParticle->index());
170 itr != primaryExpectedLookup.end()) {
171 std::copy(itr->second.begin(), itr->second.end(), data.primaryExistsVec.begin());
174 layerClusterTruthClassHandle(*trackParticle) = data.truthClassVec;
175 layerClusterShadowedHandle(*trackParticle) = data.isShadowedVec;
176 layerClusterMergedHandle(*trackParticle) = data.isMergedVec;
177 layerPrimaryExpectedHandle(*trackParticle) = data.primaryExistsVec;
182 return StatusCode::SUCCESS;
187 const typename ActsTrk::TrackContainer::ConstTrackProxy trackProxy,
192 std::vector<int> truthClassPerLayer = {-1, -1, -1, -1};
193 std::vector<char> isShadowedPerLayer = {
false,
false,
false,
false};
194 std::vector<char> isMergedPerLayer = {
false,
false,
false,
false};
195 std::vector<char> isPrimaryExistsVec = {
false,
false,
false,
false};
197 for (
auto state : trackProxy.trackStatesReversed()) {
198 auto flags = state.typeFlags();
199 if (flags.isMeasurement()) {
201 const auto& surface = state.referenceSurface();
207 Acts::GeometryIdentifier geoID = surface.geometryId();
208 std::size_t layerIndex =
m_id_helper->layer(detElem->identify());
212 assert( state.hasUncalibratedSourceLink() );
214 if (association_map->at(uncalibMeas->index()).empty()) {
216 ATH_MSG_DEBUG(
" \\__Layer "<< layerIndex <<
" SECONDARY: hit doesnt have truth particle associated with it");
218 else if(association_map->at(uncalibMeas->index()).size() == 1) {
219 const xAOD::TruthParticle *truth_particle = association_map->at(uncalibMeas->index()).at(0);
220 if(truthParticle->index() == truth_particle->index()){
222 ATH_MSG_DEBUG(
" \\__Layer "<< layerIndex<<
" TRUTH_PARTICLE: hit matches ITk track");
226 ATH_MSG_DEBUG(
" \\__Layer "<< layerIndex<<
" UNRELATED_PARTICLE: hit doesnt match ITk track");
232 ATH_MSG_DEBUG(
" \\__Layer "<< layerIndex<<
" MERGED: hit with more than one contributing particle");
233 for (
const xAOD::TruthParticle *truth_particle : association_map->at(uncalibMeas->index()) ) {
234 if(truthParticle->index() == truth_particle->index()){
241 ATH_MSG_VERBOSE(__func__<<
"() "<<__LINE__<<
" - "<<uncalibMeas->type()<<
", geoID: "<<geoID<<
", layerIndex: "<<layerIndex);
242 if (layerIndex >= truthClassPerLayer.size()) {
243 ATH_MSG_WARNING(__func__<<
"() "<<__LINE__<<
" - "<<uncalibMeas->type()<<
", geoID: "<<geoID<<
" results in an invalid index "<<layerIndex);
246 truthClassPerLayer.at(layerIndex) = Acts::toUnderlying(cluster_truth_info.
origin);
247 isShadowedPerLayer.at(layerIndex) = cluster_truth_info.
is_shadowed;
248 isMergedPerLayer.at(layerIndex) = cluster_truth_info.
is_merged;
253 data.truthClassVec = std::move(truthClassPerLayer);
254 data.isShadowedVec = std::move(isShadowedPerLayer);
255 data.isMergedVec = std::move(isMergedPerLayer);
256 data.primaryExistsVec = std::move(isPrimaryExistsVec);
265 if (association_map ==
nullptr) {
266 return StatusCode::SUCCESS;
271 const Acts::Surface* surface =
m_surfAcc.get(uncalibMeas);
277 const std::size_t layerIndex =
m_id_helper->layer(detElem->identify());
280 <<
", geoID: "<<surface->geometryId()<<
", layerIndex: "<<layerIndex);
283 <<
", geoID: "<<surface->geometryId()<<
" results in an invalid index "<<layerIndex);
287 for (
const xAOD::TruthParticle* measTruthParticle : association_map->at(uncalibMeas->index())) {
289 .first->second[layerIndex] =
true;
293 return StatusCode::SUCCESS;
const ActsDetectorElement * getActsDetectorElement(const Acts::Surface &surf)
Attempts to retrieve the ActsDetectorElement associated to the passed ActsSurface.
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
Handle class for reading a decoration on an object.
Handle class for adding a decoration to an object.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerName
ServiceHandle< ActsTrk::ITrackingGeometrySvc > m_trackingGeometrySvc
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterShadowedKey
const HGTD_ID * m_id_helper
Handle to the ID helper.
SG::ReadHandleKey< MeasurementToTruthParticleAssociation > m_hgtdClustersToTruth
SG::ReadHandleKey< xAOD::UncalibratedMeasurementContainer > m_uncalibratedMeasurementContainerKey_HGTD
StatusCode buildPrimaryExpectedLookup(const xAOD::UncalibratedMeasurementContainer &measurementContainer, const ActsTrk::MeasurementToTruthParticleAssociation *association_map, PrimaryExpectedLookup &lookup) const
Builds, once per event, the map from truth particle index onto the set of HGTD layers in which that p...
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterMergedKey
std::array< char, s_nHgtdLayers > HgtdLayerFlags
Per-layer flags for a single truth particle.
virtual StatusCode execute(const EventContext &) const override
static constexpr std::size_t s_nHgtdLayers
Number of HGTD layers the per-track decorations are indexed by.
std::unordered_map< std::size_t, HgtdLayerFlags > PrimaryExpectedLookup
Maps the index of a truth particle onto the HGTD layers it deposited a hit in.
virtual StatusCode initialize() override
SG::ReadHandleKey< ActsTrk::TrackContainer > m_trackContainerKey
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_truthParticleLinkKey
ActsTrk::detail::xAODUncalibMeasSurfAcc m_surfAcc
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerPrimaryExpectedKey
TruthTrackExtensionData createTruthDecoration(const xAOD::TruthParticle *truthParticle, const typename ActsTrk::TrackContainer::ConstTrackProxy trackProxy, const ActsTrk::MeasurementToTruthParticleAssociation *association_map) const
Generate TruthTrackExtensionData from extension.
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_hgtdTrackLinkKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterTruthClassKey
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
Helper class to access the Acts::surface associated with an Uncalibrated xAOD measurement.
const ServiceHandle< StoreGateSvc > & detStore() const
size_type size() const noexcept
Returns the number of elements in the collection.
ElementLink implementation for ROOT usage.
bool isValid() const
Check if the element can be found.
Handle class for reading a decoration on an object.
bool isAvailable()
Test to see if this variable exists in the store, for the referenced object.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Handle class for adding a decoration to an object.
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.
UncalibMeasType
Define the type of the uncalibrated measurement.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
UncalibratedMeasurementContainer_v1 UncalibratedMeasurementContainer
Define the version of the uncalibrated measurement container.
bool is_merged
A cluster is considered to be merged if more than one particle deposited energy in a given pad.
bool is_shadowed
Shadowing means that a deposit was left by the truth particle, but it was not the first deposit and i...
ClusterTruthOrigin origin
Data structure to hold truth information about the HGTD track extension.