ATLAS Offline Software
TrackToVertexWrapper.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // TrackToVertexWrapper.cxx, (c) ATLAS Detector software
8 // Author: James Catmore (james.catmore@cern.ch)
9 //
10 
13 #include <vector>
14 #include <string>
17 
18 namespace DerivationFramework {
19 
21  const std::string& n,
22  const IInterface* p) :
23  AthAlgTool(t,n,p)
24  {
25  declareInterface<DerivationFramework::IAugmentationTool>(this);
26  }
27 
29  {
30  if (m_sgName.empty()) {
31  ATH_MSG_ERROR("No decoration prefix name provided for the output of TracktoVertexWrapper!");
32  return StatusCode::FAILURE;
33  }
34  if (m_containerName.key().empty()) {
35  ATH_MSG_ERROR("No TrackParticle collection provided for TracktoVertexWrapper!");
36  return StatusCode::FAILURE;
37  }
39  ATH_CHECK(m_tool.retrieve());
40  ATH_CHECK(m_vertexKey.initialize());
41  {
42  std::vector<std::string> names;
43  names.resize(kNFloatDecor);
44  names[kdecnD0Decor] = "unbiased_d0";
45  names[kdecnZ0Decor] = "unbiased_z0";
46  names[kdecnZ0SinThetaDecor] = "unbiased_z0SinTheta";
47  names[kdecnD0ErrDecor] = "unbiased_d0Sigma";
48  names[kdecnZ0ErrDecor] = "unbiased_z0Sigma";
49  names[kdecnZ0SinThetaErrDecor] = "unbiased_z0SigmaSinTheta";
50  names[kdecnPVD0ErrDecor] = "unbiased_PVd0Sigma";
51  names[kdecnPVZ0ErrDecor] = "unbiased_PVz0Sigma";
52  names[kdecnPVZ0SinThetaErrDecor] = "unbiased_PVz0SigmaSinTheta";
53  names[kdecn_b_D0Decor] = "biased_d0";
54  names[kdecn_b_Z0Decor] = "biased_z0";
55  names[kdecn_b_Z0SinThetaDecor] = "biased_z0SinTheta";
56  names[kdecn_b_D0ErrDecor] = "biased_d0Sigma";
57  names[kdecn_b_Z0ErrDecor] = "biased_z0Sigma";
58  names[kdecn_b_Z0SinThetaErrDecor] = "biased_z0SigmaSinTheta";
59  names[kdecn_b_PVD0ErrDecor] = "biased_PVd0Sigma";
60  names[kdecn_b_PVZ0ErrDecor] = "biased_PVz0Sigma";
61  names[kdecn_b_PVZ0SinThetaErrDecor] = "biased_PVz0SigmaSinTheta";
63  }
64  return StatusCode::SUCCESS;
65  }
66 
68  {
69  return StatusCode::SUCCESS;
70  }
71 
73  {
74  const EventContext& ctx = Gaudi::Hive::currentContext();
75 
76  // retrieve track container
78  if( ! tracks.isValid() ) {
79  ATH_MSG_ERROR ("Couldn't retrieve TrackParticles with key: " << m_containerName.key() );
80  return StatusCode::FAILURE;
81  }
83  if ( !vertices.isValid() )
84  {
85  ATH_MSG_ERROR ("Couldn't retrieve Vertices with key: " << m_vertexKey.key());
86  return StatusCode::FAILURE;
87  }
88 
89  std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer,float> >
90  track_decorators = createDecorators<xAOD::TrackParticleContainer,float>(m_trackFloatDecorKeys,ctx);
91  // Run tool for each element and calculate the impact parameters/errors
92  for (const auto *trItr : *tracks) {
93  std::unique_ptr<Trk::ImpactParametersAndSigma> iPandSigma;
94  std::unique_ptr<Trk::ImpactParametersAndSigma> iPandSigmaBiased;
95  const xAOD::Vertex* foundVertex { nullptr };
96  for (const auto *const vx : *vertices) {
97  for (const auto& tpLink : vx->trackParticleLinks()) {
98  if (*tpLink == trItr) {
99  foundVertex = vx;
100  break;
101  }
102  }
103  if (foundVertex) break;
104  }
105  if ( foundVertex ) {
106  iPandSigma= m_tool->estimate(trItr,foundVertex,true);
107  iPandSigmaBiased = m_tool->estimate(trItr,foundVertex,false);
108  if( !iPandSigma ) ATH_MSG_WARNING ("trackToVertexIPEstimator failed !");
109  if( !iPandSigmaBiased ) ATH_MSG_WARNING ("trackToVertexIPEstimator biased IP failed !");
110  }
111  else {
112  ATH_MSG_DEBUG("No vertex associated to the track. Skipping it.");
113  }
114 
115  // Do the decoration for each track
116  if (iPandSigma) {
117  track_decorators[kdecnD0Decor]( *trItr ) = iPandSigma->IPd0;
118  track_decorators[kdecnZ0Decor]( *trItr ) = iPandSigma->IPz0;
119  track_decorators[kdecnZ0SinThetaDecor]( *trItr ) = iPandSigma->IPz0SinTheta;
120  track_decorators[kdecnD0ErrDecor]( *trItr ) = iPandSigma->sigmad0;
121  track_decorators[kdecnZ0ErrDecor]( *trItr ) = iPandSigma->sigmaz0;
122  track_decorators[kdecnZ0SinThetaErrDecor]( *trItr ) = iPandSigma->sigmaz0SinTheta;
123  track_decorators[kdecnPVD0ErrDecor] (*trItr ) = iPandSigma->PVsigmad0;
124  track_decorators[kdecnPVZ0ErrDecor] (*trItr ) = iPandSigma->PVsigmaz0;
125  track_decorators[kdecnPVZ0SinThetaErrDecor] (*trItr ) = iPandSigma->PVsigmaz0SinTheta;
126  }
127  else {
128  track_decorators[kdecnD0Decor]( *trItr ) = 999.;
129  track_decorators[kdecnZ0Decor]( *trItr ) = 999.;
130  track_decorators[kdecnZ0SinThetaDecor]( *trItr ) = 999.;
131  track_decorators[kdecnD0ErrDecor]( *trItr ) = 999.;
132  track_decorators[kdecnZ0ErrDecor]( *trItr ) = 999.;
133  track_decorators[kdecnZ0SinThetaErrDecor]( *trItr ) = 999.;
134  track_decorators[kdecnPVD0ErrDecor] (*trItr ) = 999.;
135  track_decorators[kdecnPVZ0ErrDecor] (*trItr ) = 999.;
136  track_decorators[kdecnPVZ0SinThetaErrDecor] (*trItr ) = 999.;
137  }
138 
139  if (iPandSigmaBiased) {
140  track_decorators[kdecn_b_D0Decor]( *trItr ) = iPandSigmaBiased->IPd0;
141  track_decorators[kdecn_b_Z0Decor]( *trItr ) = iPandSigmaBiased->IPz0;
142  track_decorators[kdecn_b_Z0SinThetaDecor]( *trItr ) = iPandSigmaBiased->IPz0SinTheta;
143  track_decorators[kdecn_b_D0ErrDecor]( *trItr ) = iPandSigmaBiased->sigmad0;
144  track_decorators[kdecn_b_Z0ErrDecor]( *trItr ) = iPandSigmaBiased->sigmaz0;
145  track_decorators[kdecn_b_Z0SinThetaErrDecor]( *trItr ) = iPandSigmaBiased->sigmaz0SinTheta;
146  track_decorators[kdecn_b_PVD0ErrDecor] (*trItr ) = iPandSigmaBiased->PVsigmad0;
147  track_decorators[kdecn_b_PVZ0ErrDecor] (*trItr ) = iPandSigmaBiased->PVsigmaz0;
148  track_decorators[kdecn_b_PVZ0SinThetaErrDecor] (*trItr ) = iPandSigmaBiased->PVsigmaz0SinTheta;
149  }
150  else {
151  track_decorators[kdecn_b_D0Decor]( *trItr ) = 999.;
152  track_decorators[kdecn_b_Z0Decor]( *trItr ) = 999.;
153  track_decorators[kdecn_b_Z0SinThetaDecor]( *trItr ) = 999.;
154  track_decorators[kdecn_b_D0ErrDecor]( *trItr ) = 999.;
155  track_decorators[kdecn_b_Z0ErrDecor]( *trItr ) = 999.;
156  track_decorators[kdecn_b_Z0SinThetaErrDecor]( *trItr ) = 999.;
157  track_decorators[kdecn_b_PVD0ErrDecor] (*trItr ) = 999.;
158  track_decorators[kdecn_b_PVZ0ErrDecor] (*trItr ) = 999.;
159  track_decorators[kdecn_b_PVZ0SinThetaErrDecor] (*trItr ) = 999.;
160  }
161  } // end of loop over tracks
162 
163  return StatusCode::SUCCESS;
164  }
165 
166 }
DecoratorUtils.h
DerivationFramework::TrackToVertexWrapper::m_vertexKey
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexKey
Definition: TrackToVertexWrapper.h:42
DerivationFramework::TrackToVertexWrapper::kdecn_b_D0ErrDecor
@ kdecn_b_D0ErrDecor
Definition: TrackToVertexWrapper.h:56
DerivationFramework::TrackToVertexWrapper::kdecnD0ErrDecor
@ kdecnD0ErrDecor
Definition: TrackToVertexWrapper.h:47
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
DerivationFramework::createDecoratorKeys
void createDecoratorKeys(T_Parent &parent, const SG::ReadHandleKey< T_Cont > &container_key, const std::string &prefix, const std::vector< std::string > &decor_names, std::vector< SG::WriteDecorHandleKey< T_Cont > > &decor_out)
Definition: DecoratorUtils.h:20
DerivationFramework::TrackToVertexWrapper::kdecnZ0SinThetaDecor
@ kdecnZ0SinThetaDecor
Definition: TrackToVertexWrapper.h:46
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
Trk::ImpactParametersAndSigma::PVsigmaz0
double PVsigmaz0
Definition: ITrackToVertexIPEstimator.h:41
Trk::ImpactParametersAndSigma::PVsigmaz0SinTheta
double PVsigmaz0SinTheta
Definition: ITrackToVertexIPEstimator.h:42
DerivationFramework::TrackToVertexWrapper::finalize
StatusCode finalize()
Definition: TrackToVertexWrapper.cxx:67
DerivationFramework::TrackToVertexWrapper::kdecnZ0Decor
@ kdecnZ0Decor
Definition: TrackToVertexWrapper.h:45
Trk::ImpactParametersAndSigma::IPd0
double IPd0
Definition: ITrackToVertexIPEstimator.h:34
DerivationFramework::TrackToVertexWrapper::kdecn_b_PVD0ErrDecor
@ kdecn_b_PVD0ErrDecor
Definition: TrackToVertexWrapper.h:59
Trk::ImpactParametersAndSigma::IPz0SinTheta
double IPz0SinTheta
Definition: ITrackToVertexIPEstimator.h:36
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
DerivationFramework::TrackToVertexWrapper::kdecn_b_D0Decor
@ kdecn_b_D0Decor
Definition: TrackToVertexWrapper.h:53
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
DerivationFramework::TrackToVertexWrapper::TrackToVertexWrapper
TrackToVertexWrapper(const std::string &t, const std::string &n, const IInterface *p)
Definition: TrackToVertexWrapper.cxx:20
DerivationFramework::TrackToVertexWrapper::kdecnZ0SinThetaErrDecor
@ kdecnZ0SinThetaErrDecor
Definition: TrackToVertexWrapper.h:49
DerivationFramework::TrackToVertexWrapper::kdecnPVD0ErrDecor
@ kdecnPVD0ErrDecor
Definition: TrackToVertexWrapper.h:50
DerivationFramework::TrackToVertexWrapper::kdecnPVZ0ErrDecor
@ kdecnPVZ0ErrDecor
Definition: TrackToVertexWrapper.h:51
DerivationFramework::TrackToVertexWrapper::kdecn_b_Z0SinThetaErrDecor
@ kdecn_b_Z0SinThetaErrDecor
Definition: TrackToVertexWrapper.h:58
DerivationFramework::TrackToVertexWrapper::m_trackFloatDecorKeys
std::vector< SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > > m_trackFloatDecorKeys
Definition: TrackToVertexWrapper.h:63
Trk::ImpactParametersAndSigma::PVsigmad0
double PVsigmad0
Definition: ITrackToVertexIPEstimator.h:40
DerivationFramework::TrackToVertexWrapper::kdecnZ0ErrDecor
@ kdecnZ0ErrDecor
Definition: TrackToVertexWrapper.h:48
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
DerivationFramework::TrackToVertexWrapper::kNFloatDecor
@ kNFloatDecor
Definition: TrackToVertexWrapper.h:62
beamspotman.n
n
Definition: beamspotman.py:731
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
python.subdetectors.mmg.names
names
Definition: mmg.py:8
DerivationFramework::TrackToVertexWrapper::kdecn_b_Z0SinThetaDecor
@ kdecn_b_Z0SinThetaDecor
Definition: TrackToVertexWrapper.h:55
WriteDecorHandle.h
Handle class for adding a decoration to an object.
Trk::ImpactParametersAndSigma::IPz0
double IPz0
Definition: ITrackToVertexIPEstimator.h:35
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
DerivationFramework::TrackToVertexWrapper::m_containerName
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_containerName
Definition: TrackToVertexWrapper.h:40
Trk::ImpactParametersAndSigma::sigmad0
double sigmad0
Definition: ITrackToVertexIPEstimator.h:37
DerivationFramework
THE reconstruction tool.
Definition: ParticleSortingAlg.h:24
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
DerivationFramework::TrackToVertexWrapper::kdecnPVZ0SinThetaErrDecor
@ kdecnPVZ0SinThetaErrDecor
Definition: TrackToVertexWrapper.h:52
DerivationFramework::TrackToVertexWrapper::addBranches
virtual StatusCode addBranches() const
Pass the thinning service
Definition: TrackToVertexWrapper.cxx:72
DerivationFramework::TrackToVertexWrapper::kdecn_b_Z0ErrDecor
@ kdecn_b_Z0ErrDecor
Definition: TrackToVertexWrapper.h:57
DerivationFramework::TrackToVertexWrapper::kdecn_b_Z0Decor
@ kdecn_b_Z0Decor
Definition: TrackToVertexWrapper.h:54
DerivationFramework::TrackToVertexWrapper::kdecnD0Decor
@ kdecnD0Decor
Definition: TrackToVertexWrapper.h:44
DerivationFramework::TrackToVertexWrapper::kdecn_b_PVZ0ErrDecor
@ kdecn_b_PVZ0ErrDecor
Definition: TrackToVertexWrapper.h:60
Trk::ImpactParametersAndSigma::sigmaz0SinTheta
double sigmaz0SinTheta
Definition: ITrackToVertexIPEstimator.h:39
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
DerivationFramework::TrackToVertexWrapper::kdecn_b_PVZ0SinThetaErrDecor
@ kdecn_b_PVZ0SinThetaErrDecor
Definition: TrackToVertexWrapper.h:61
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DerivationFramework::TrackToVertexWrapper::m_sgName
Gaudi::Property< std::string > m_sgName
Definition: TrackToVertexWrapper.h:38
DerivationFramework::TrackToVertexWrapper::initialize
StatusCode initialize()
Definition: TrackToVertexWrapper.cxx:28
Trk::ImpactParametersAndSigma::sigmaz0
double sigmaz0
Definition: ITrackToVertexIPEstimator.h:38
ITrackToVertexIPEstimator.h
TrackToVertexWrapper.h
AthAlgTool
Definition: AthAlgTool.h:26
DerivationFramework::TrackToVertexWrapper::m_tool
ToolHandle< Trk::ITrackToVertexIPEstimator > m_tool
Definition: TrackToVertexWrapper.h:36