32#include "Acts/Utilities/Helpers.hpp"
57 return StatusCode::SUCCESS;
91 measurement_to_truth_association_maps{};
100 return assoc ? assoc->size() : 0ul;
110 if (!tracksContainer.
isValid()) {
112 return StatusCode::FAILURE;
127 if (!link_to_truth.
isValid()) {
128 layerClusterTruthClassHandle(*trackParticle) = {-1, -1, -1, -1};
129 layerClusterShadowedHandle(*trackParticle) = {
false,
false,
false,
false};
130 layerClusterMergedHandle(*trackParticle) = {
false,
false,
false,
false};
131 layerPrimaryExpectedHandle(*trackParticle) = {
false,
false,
false,
false};
132 ATH_MSG_WARNING(
"TrackParticle " << trackParticle->index() <<
": invalid truth link");
136 truthParticle = *link_to_truth;
141 if (!link_to_track.
isValid()) {
142 ATH_MSG_DEBUG(
"TrackParticle " << trackParticle->index() <<
": invalid extension link");
143 data.truthClassVec = {-1, -1, -1, -1};
144 data.isShadowedVec = {
false,
false,
false,
false};
145 data.isMergedVec = {
false,
false,
false,
false};
148 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = *link_to_track;
149 const ActsTrk::TrackContainer::ConstTrackProxy& track = optional_track.value();
150 ATH_MSG_DEBUG(
"TrackParticle " << trackParticle->index() <<
": extension with chi2 " << track.chi2() <<
" and nHits " << track.nMeasurements());
157 *uncalibratedMeasurementContainer,
159 data.primaryExistsVec));
161 layerClusterTruthClassHandle(*trackParticle) = data.truthClassVec;
162 layerClusterShadowedHandle(*trackParticle) = data.isShadowedVec;
163 layerClusterMergedHandle(*trackParticle) = data.isMergedVec;
164 layerPrimaryExpectedHandle(*trackParticle) = data.primaryExistsVec;
169 return StatusCode::SUCCESS;
174 const typename ActsTrk::TrackContainer::ConstTrackProxy trackProxy,
179 std::vector<int> truthClassPerLayer = {-1, -1, -1, -1};
180 std::vector<char> isShadowedPerLayer = {
false,
false,
false,
false};
181 std::vector<char> isMergedPerLayer = {
false,
false,
false,
false};
182 std::vector<char> isPrimaryExistsVec = {
false,
false,
false,
false};
184 for (
auto state : trackProxy.trackStatesReversed()) {
185 auto flags = state.typeFlags();
186 if (flags.isMeasurement()) {
188 const auto& surface = state.referenceSurface();
189 Acts::GeometryIdentifier geoID = surface.geometryId();
194 assert( state.hasUncalibratedSourceLink() );
197 if (association_map->at(uncalibMeas->index()).empty()) {
199 ATH_MSG_DEBUG(
" \\__Layer "<< layerIndex <<
" SECONDARY: hit doesnt have truth particle associated with it");
201 else if(association_map->at(uncalibMeas->index()).size() == 1) {
202 const xAOD::TruthParticle *truth_particle = association_map->at(uncalibMeas->index()).at(0);
203 if(truthParticle->index() == truth_particle->index()){
205 ATH_MSG_DEBUG(
" \\__Layer "<< layerIndex<<
" TRUTH_PARTICLE: hit matches ITk track");
209 ATH_MSG_DEBUG(
" \\__Layer "<< layerIndex<<
" UNRELATED_PARTICLE: hit doesnt match ITk track");
215 ATH_MSG_DEBUG(
" \\__Layer "<< layerIndex<<
" MERGED: hit with more than one contributing particle");
216 for (
const xAOD::TruthParticle *truth_particle : association_map->at(uncalibMeas->index()) ) {
217 if(truthParticle->index() == truth_particle->index()){
225 truthClassPerLayer[layerIndex] = (int) cluster_truth_info.
origin;
226 isShadowedPerLayer[layerIndex] = cluster_truth_info.
is_shadowed;
227 isMergedPerLayer[layerIndex] = cluster_truth_info.
is_merged;
232 data.truthClassVec = std::move(truthClassPerLayer);
233 data.isShadowedVec = std::move(isShadowedPerLayer);
234 data.isMergedVec = std::move(isMergedPerLayer);
235 data.primaryExistsVec = std::move(isPrimaryExistsVec);
243 std::vector<char> &isPrimaryExistsVec)
const{
245 isPrimaryExistsVec = {
false,
false,
false,
false};
247 for(
auto uncalibMeas: measurementContainer) {
249 auto measurementTruthParticles = association_map->at(uncalibMeas->index());
250 const Acts::Surface* surface =
m_surfAcc.get(uncalibMeas);
251 Acts::GeometryIdentifier geoID = surface->geometryId();
253 if(measurementTruthParticles.size() > 0){
254 for(
auto measTruthParticle : measurementTruthParticles){
255 if ( truthParticle->index() == measTruthParticle->index()){
256 isPrimaryExistsVec[layerIndex] =
true;
263 return StatusCode::SUCCESS;
268 std::uint32_t volume = geoID.volume();
269 std::uint32_t layer = geoID.layer();
272 bool isPositiveEndcap = (volume == 25);
273 bool isNegativeEndcap = (volume == 2);
276 if (isPositiveEndcap) {
285 }
else if (isNegativeEndcap) {
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(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
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterShadowedKey
SG::ReadHandleKey< MeasurementToTruthParticleAssociation > m_hgtdClustersToTruth
SG::ReadHandleKey< xAOD::UncalibratedMeasurementContainer > m_uncalibratedMeasurementContainerKey_HGTD
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterMergedKey
StatusCode isPrimaryExpected(const xAOD::TruthParticle *truthParticle, const xAOD::UncalibratedMeasurementContainer measurementContainer, const ActsTrk::MeasurementToTruthParticleAssociation *association_map, std::vector< char > &isPrimaryExistsVec) const
Checks if truth particle produced hits at each one of the HGTD layers.
virtual StatusCode execute(const EventContext &) const override
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
std::size_t getHGTDLayerIndex(const Acts::GeometryIdentifier &geoID) const
returns the index of HGTD layer where surfaces lies.
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.
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())
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.