ATLAS Offline Software
TruthHitDecoratorAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
10 #include "TruthHitDecoratorAlg.h"
12 
14 #include "xAODTruth/TruthVertex.h"
15 #include "TrkParameters/TrackParameters.h" // Contains typedef to Trk::CurvilinearParameters
17 
19 #include "TDatabasePDG.h"
20 #include "TParticlePDG.h"
21 
23 #include <cmath>
24 //#include <limits>
25 
26 
31  const std::string& name,
32  ISvcLocator* pSvcLocator) :
33  AthReentrantAlgorithm( name, pSvcLocator ) { }
34 
35 
40 
41  ATH_CHECK( m_extrapolator.retrieve() );
42  ATH_CHECK( m_beamSpotDecoKey.initialize() );
43  ATH_CHECK( m_truthPixelClusterName.initialize() );
44  ATH_CHECK( m_truthSCTClusterName.initialize() );
45  ATH_CHECK( m_truthParticleName.initialize() );
46 
49  *this, m_truthParticleName,
50  m_prefix.value(), m_decor_names, m_decor );
51 
52  if( m_decor.size() != NDecorations ) {
53  ATH_MSG_ERROR( "Incorrect booking of truth hits decorations" );
54  return StatusCode::FAILURE;
55  }
56 
57  return StatusCode::SUCCESS;
58 }
59 
60 
65  const EventContext& ctx ) const {
66 
68  SG::ReadHandle< xAOD::TruthParticleContainer > ptruth( m_truthParticleName, ctx );
69  if( not ptruth.isValid() ) {
70  ATH_MSG_ERROR( "Failed to retrieve truth particle container" );
71  return StatusCode::FAILURE;
72  }
73 
74  std::vector< IDTPM::OptionalDecoration< xAOD::TruthParticleContainer, float > >
76  *ptruth, m_decor, ctx, msgLvl(MSG::DEBUG) ) );
77 
79  // FIXME barcode-based requires xAOD::TrackMeasurementValidation to be migrated to use unique ID
80  std::unordered_map< int, float > barcodeSCTclustercount;
81  std::unordered_map< int, float > barcodePIXclustercount;
82 
85  SG::ReadHandle< xAOD::TrackMeasurementValidationContainer > sctClusters( m_truthSCTClusterName, ctx );
86  SG::ReadHandle< xAOD::TrackMeasurementValidationContainer > pixelClusters( m_truthPixelClusterName, ctx );
87 
88  //only decorate the truth particles with truth silicon hits if both containers are available
89  if( sctClusters.isValid() && pixelClusters.isValid() ) {
90 
91  static const SG::AuxElement::ConstAccessor< std::vector<int> > barcodeAcc( "truth_barcode" );
92 
94  for( const xAOD::TrackMeasurementValidation* sctCluster : *sctClusters ) {
95  std::vector<int> truth_barcode;
96  if( barcodeAcc.isAvailable( *sctCluster ) ) {
97  truth_barcode = barcodeAcc( *sctCluster );
98  for( const int& barcode : truth_barcode ) {
99  auto result = barcodeSCTclustercount.emplace( std::pair<int, float>(barcode, 0.0) );
100  if( !result.second ) ++( result.first->second );
101  }
102  }
103  } // close loop over truth SCT clusters
104 
106  for( const xAOD::TrackMeasurementValidation* pixCluster : *pixelClusters ) {
107  std::vector<int> truth_barcode;
108  if( barcodeAcc.isAvailable( *pixCluster ) ) {
109  truth_barcode = barcodeAcc( *pixCluster );
110  for( const int& barcode : truth_barcode ) {
111  auto result = barcodePIXclustercount.emplace( std::pair<int, float>(barcode, 0.0) );
112  if( !result.second ) ++( result.first->second );
113  }
114  }
115  } // close loop over truth Pixel clusters
116  } // close if sctClusters and pixelClusters isValid
117 
118  if( float_decor.empty() ) {
119  ATH_MSG_ERROR( "Failed to book Truth particles Hit decorations" );
120  return StatusCode::FAILURE;
121  }
122 
124  SG::ReadDecorHandle< xAOD::EventInfo, float > beamPosX( m_beamSpotDecoKey[0], ctx );
125  SG::ReadDecorHandle< xAOD::EventInfo, float > beamPosY( m_beamSpotDecoKey[1], ctx );
126  SG::ReadDecorHandle< xAOD::EventInfo, float > beamPosZ( m_beamSpotDecoKey[2], ctx );
127  if( (not beamPosX.isValid()) or (not beamPosY.isValid()) or (not beamPosZ.isValid()) ) {
128  ATH_MSG_WARNING( "Failed to retrieve beam position" );
129  return StatusCode::RECOVERABLE;
130  }
131  Amg::Vector3D beamPos = Amg::Vector3D( beamPosX(0), beamPosY(0), beamPosZ(0) );
132 
133  for( const xAOD::TruthParticle* truth_particle : *ptruth ) {
135  ATH_CHECK( decorateTruth(
136  *truth_particle, float_decor, beamPos,
137  barcodePIXclustercount, barcodeSCTclustercount, ctx ) );
138  }
139 
140  return StatusCode::SUCCESS;
141 }
142 
143 
150  const Amg::Vector3D& beamPos,
151  std::unordered_map<int, float>& pixelMap,
152  std::unordered_map<int, float>& sctMap,
153  const EventContext& ctx ) const {
154 
156  if( particle.isNeutral() ) {
157  return StatusCode::SUCCESS;
158  }
159 
160  const Amg::Vector3D momentum( particle.px(), particle.py(), particle.pz() );
161  const int pid( particle.pdgId() );
162  double charge = particle.charge();
163 
164  if( std::isnan(charge) ) {
165  ATH_MSG_DEBUG( "Charge not found on particle with pid " << pid );
166  return StatusCode::SUCCESS;
167  }
168 
171  it1 = pixelMap.find( HepMC::barcode(particle) ); // FIXME barcode-based
172  it2 = sctMap.find( HepMC::barcode(particle) ); // FIXME barcode-based
173  float nSiHits = 0;
174  if( it1 !=pixelMap.end() ) nSiHits += (*it1).second;
175  if( it2 !=sctMap.end() ) nSiHits += (*it2).second;
176 
178  IDTPM::decorateOrRejectQuietly( particle, float_decor[NSilHits], nSiHits );
179 
180  const xAOD::TruthVertex* ptruthVertex(nullptr);
181  try {
182  ptruthVertex = particle.prodVtx();
183  } catch( const std::exception& e ) {
184  if ( not m_errorEmitted ) {
185  ATH_MSG_WARNING( "A non existent production vertex was requested in calculating the track parameters d0 etc" );
186  }
187  m_errorEmitted = true;
188  return StatusCode::RECOVERABLE; //SUCCESS;
189  }
190 
191  if( not ptruthVertex ) {
192  ATH_MSG_DEBUG( "A production vertex pointer was retrieved, but it is NULL" );
193  return StatusCode::SUCCESS;
194  }
195 
196  const auto xPos = ptruthVertex->x();
197  const auto yPos = ptruthVertex->y();
198  const auto z_truth = ptruthVertex->z();
199  const Amg::Vector3D position( xPos, yPos, z_truth );
200  const float prodR_truth = std::sqrt( xPos * xPos + yPos * yPos );
201  const Trk::CurvilinearParameters cParameters( position, momentum, charge );
202 
203  Trk::PerigeeSurface persf( beamPos );
204 
205  std::unique_ptr< const Trk::TrackParameters > tP(
206  m_extrapolator->extrapolate( ctx, cParameters,
207  persf, Trk::anyDirection, false ) );
208  if( not tP ) {
209  ATH_MSG_DEBUG( "The TrackParameters pointer for this TruthParticle is NULL" );
210  return StatusCode::SUCCESS;
211  }
212 
214  float d0_truth = tP->parameters()[ Trk::d0 ];
215  float theta_truth = tP->parameters()[ Trk::theta ];
216  float z0_truth = tP->parameters()[ Trk::z0 ];
217  float phi_truth = tP->parameters()[ Trk::phi ];
218  float qOverP_truth = tP->parameters()[ Trk::qOverP ]; // P or Pt ??
219  float z0st_truth = z0_truth * std::sin( theta_truth );
220 
221  ATH_MSG_DEBUG( "Truth particle (pT = " << particle.pt() <<
222  " has impact parameter (d0, z0) = (" << d0_truth <<
223  " ," << z0_truth << ")" );
224 
225  IDTPM::decorateOrRejectQuietly( particle, float_decor[D0], d0_truth );
226  IDTPM::decorateOrRejectQuietly( particle, float_decor[Z0], z0_truth );
227  IDTPM::decorateOrRejectQuietly( particle, float_decor[Phi], phi_truth );
228  IDTPM::decorateOrRejectQuietly( particle, float_decor[Theta], theta_truth );
229  IDTPM::decorateOrRejectQuietly( particle, float_decor[Z0st], z0st_truth );
230  IDTPM::decorateOrRejectQuietly( particle, float_decor[QOverP], qOverP_truth );
231  IDTPM::decorateOrRejectQuietly( particle, float_decor[ProdR], prodR_truth );
232  IDTPM::decorateOrRejectQuietly( particle, float_decor[ProdZ], z_truth );
233 
234  return StatusCode::SUCCESS;
235 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
Trk::anyDirection
@ anyDirection
Definition: PropDirection.h:22
Trk::ParticleSwitcher::particle
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:76
get_generator_info.result
result
Definition: get_generator_info.py:21
TrackParameters.h
Trk::PerigeeSurface
Definition: PerigeeSurface.h:43
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
TruthHitDecoratorAlg.h
Algorithm to decorate xAOD::TruthParticles with additional information regarding the corresponding tr...
IDTPM::decorateOrRejectQuietly
void decorateOrRejectQuietly(const T_Cont_Elm &particle, OptionalDecoration< T_Cont, T > &decorator, const T &value)
Safe method to fill the decoration if decor flag is true.
Definition: SafeDecorator.h:197
Trk::z0
@ z0
Definition: ParamDefs.h:70
Phi
@ Phi
Definition: RPCdef.h:8
IDTPM::createDecoratorsIfNeeded
std::vector< OptionalDecoration< T_Cont, T > > createDecoratorsIfNeeded(const T_Cont &container, const std::vector< WriteKeyAccessorPair< T_Cont, T > > &keys, const EventContext &ctx, bool verbose=false)
Like above - FIXME: maybe not needed.
Definition: SafeDecorator.h:114
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:54
Trk::Z0
@ Z0
Definition: ParameterType.h:18
IDTPM::TruthHitDecoratorAlg::initialize
virtual StatusCode initialize() override
Definition: TruthHitDecoratorAlg.cxx:39
IDTPM::TruthHitDecoratorAlg::TruthHitDecoratorAlg
TruthHitDecoratorAlg(const std::string &name, ISvcLocator *pSvcLocator)
Local includes.
Definition: TruthHitDecoratorAlg.cxx:30
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
xAOD::TrackMeasurementValidation_v1
Class describing a TrackMeasurementValidation.
Definition: TrackMeasurementValidation_v1.h:27
TauGNNUtils::Variables::Track::nSiHits
bool nSiHits(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:691
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
SG::ReadDecorHandle
Handle class for reading a decoration on an object.
Definition: StoreGate/StoreGate/ReadDecorHandle.h:94
ParticleGun_EoverP_Config.momentum
momentum
Definition: ParticleGun_EoverP_Config.py:63
Trk::theta
@ theta
Definition: ParamDefs.h:72
DetDescrDictionaryDict::it1
std::vector< HWIdentifier >::iterator it1
Definition: DetDescrDictionaryDict.h:17
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
calibdata.exception
exception
Definition: calibdata.py:496
ParticleGun_EoverP_Config.pid
pid
Definition: ParticleGun_EoverP_Config.py:62
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::CurvilinearParametersT
Definition: CurvilinearParametersT.h:48
IDTPM::TruthHitDecoratorAlg::decorateTruth
StatusCode decorateTruth(const xAOD::TruthParticle &particle, std::vector< IDTPM::OptionalDecoration< xAOD::TruthParticleContainer, float > > &float_decor, const Amg::Vector3D &beamPos, std::unordered_map< int, float > &pixelMap, std::unordered_map< int, float > &sctMap, const EventContext &ctx) const
Definition: TruthHitDecoratorAlg.cxx:147
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
TruthVertex.h
IDTPM::TruthHitDecoratorAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: TruthHitDecoratorAlg.cxx:64
xAOD::TruthVertex_v1
Class describing a truth vertex in the MC record.
Definition: TruthVertex_v1.h:41
IDTPM::createDecoratorKeysAndAccessor
void createDecoratorKeysAndAccessor(T_Parent &parent, const SG::ReadHandleKey< T_Cont > &container_key, const std::string &prefix, const std::vector< std::string > &decor_names, std::vector< WriteKeyAccessorPair< T_Cont, T > > &decor_out)
create a pair composed of a WriteDecorHandleKey to create a decorator handle and an accessor to check...
Definition: SafeDecorator.h:52
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
Trk::d0
@ d0
Definition: ParamDefs.h:69
MagicNumbers.h
charge
double charge(const T &p)
Definition: AtlasPID.h:494
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DEBUG
#define DEBUG
Definition: page_access.h:11
Trk::qOverP
@ qOverP
perigee
Definition: ParamDefs.h:73
SG::ConstAccessor::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
Trk::phi
@ phi
Definition: ParamDefs.h:81
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
IDTPM::OptionalDecoration
std::pair< SG::WriteDecorHandle< ContainerType, VariableType >, bool > OptionalDecoration
Definition: SafeDecorator.h:47