ATLAS Offline Software
Loading...
Searching...
No Matches
PositionMomentumWriter.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6// PositionMomentumWriter.cxx, (c) ATLAS Detector software
8
9// InDet include
12// Gaudi
13#include "TTree.h"
14#include "GaudiKernel/ITHistSvc.h"
15
16// constructor
17Trk::PositionMomentumWriter::PositionMomentumWriter(const std::string& t, const std::string& n, const IInterface* p) :
18 AthAlgTool(t,n,p),
19 m_treeName("PositionMomentumWriter"),
20 m_treeFolder("/val/"),
21 m_treeDescription("Position Momentum Writer"),
22 m_tree{},
23 m_pM{},
24 m_pEta{},
25 m_pPhi{},
26 m_pE{},
27 m_eEta{},
28 m_ePhi{},
29 m_eE{},
30 m_pPdg{},
32 m_pPositionY{},
36 m_pMomentumY{},
41
42
43{
44 declareInterface<Trk::IPositionMomentumWriter>(this);
45 // from outside
46 declareProperty("TreeName", m_treeName);
47 declareProperty("TreeFolder", m_treeFolder);
48 declareProperty("TreeDescription", m_treeDescription);
49}
50
51// Athena standard methods
52// initialize
54{
55 ATH_MSG_VERBOSE("Booking the Extrapolation test Tree.");
56
57 // ------------------------------> OUTPUT NTUPLE (geometry validation)
58 m_tree = new TTree(m_treeName.c_str(), m_treeDescription.c_str());
59
60 // add the Branches
61 m_tree->Branch("StartEta", &m_pEta);
62 m_tree->Branch("StartPhi", &m_pPhi);
63 m_tree->Branch("StartEnergy", &m_pE);
64 m_tree->Branch("EndEta", &m_eEta);
65 m_tree->Branch("EndPhi", &m_ePhi);
66 m_tree->Branch("EndEnergy", &m_eE);
67 m_tree->Branch("Pdg", &m_pPdg);
68 m_tree->Branch("Mass", &m_pM);
69 // the branches
70 m_pPositionX = new std::vector<float>;
71 m_pPositionY = new std::vector<float>;
72 m_pPositionZ = new std::vector<float>;
73 m_pPositionR = new std::vector<float>;
74 m_pMomentumX = new std::vector<float>;
75 m_pMomentumY = new std::vector<float>;
76 m_pMomentumZ = new std::vector<float>;
77 m_pMomentumMag = new std::vector<float>;
78 m_pMomentumEta = new std::vector<float>;
79 m_pMomentumPhi = new std::vector<float>;
80 // add the Position Branches
81 m_tree->Branch("PositionX", m_pPositionX);
82 m_tree->Branch("PositionY", m_pPositionY);
83 m_tree->Branch("PositionZ", m_pPositionZ);
84 m_tree->Branch("PositionR", m_pPositionR);
85 m_tree->Branch("MomentumX", m_pMomentumX);
86 m_tree->Branch("MomentumY", m_pMomentumY);
87 m_tree->Branch("MomentumZ", m_pMomentumZ);
88 m_tree->Branch("MomentumMag", m_pMomentumMag);
89 m_tree->Branch("MomentumEta", m_pMomentumEta);
90 m_tree->Branch("MomentumPhi", m_pMomentumPhi);
91
92 // now register the Tree
93 SmartIF<ITHistSvc> tHistSvc{service("THistSvc")};
94 if (!tHistSvc) {
95 ATH_MSG_ERROR( "initialize() Could not find Hist Service -> Switching Tree output off !" );
96 delete m_pPositionX; m_pPositionX = nullptr;
97 delete m_pPositionY; m_pPositionY = nullptr;
98 delete m_pPositionZ; m_pPositionZ = nullptr;
99 delete m_pPositionR; m_pPositionR = nullptr;
100 delete m_pMomentumX; m_pMomentumX = nullptr;
101 delete m_pMomentumY; m_pMomentumY = nullptr;
102 delete m_pMomentumZ; m_pMomentumZ = nullptr;
103 delete m_pMomentumMag; m_pMomentumMag = nullptr;
104 delete m_pMomentumEta; m_pMomentumEta = nullptr;
105 delete m_pMomentumPhi; m_pMomentumPhi = nullptr;
106 delete m_tree; m_tree = nullptr;
107 }
108 if (tHistSvc && ((tHistSvc->regTree(m_treeFolder+m_treeName, m_tree)).isFailure()) ) {
109 ATH_MSG_ERROR( "initialize() Could not register the validation Tree -> Switching Tree output off !" );
110 delete m_tree; m_tree = nullptr;
111 delete m_pPositionX; m_pPositionX = nullptr;
112 delete m_pPositionY; m_pPositionY = nullptr;
113 delete m_pPositionZ; m_pPositionZ = nullptr;
114 delete m_pPositionR; m_pPositionR = nullptr;
115 delete m_pMomentumX; m_pMomentumX = nullptr;
116 delete m_pMomentumY; m_pMomentumY = nullptr;
117 delete m_pMomentumZ; m_pMomentumZ = nullptr;
118 delete m_pMomentumMag; m_pMomentumMag = nullptr;
119 delete m_pMomentumEta; m_pMomentumEta = nullptr;
120 delete m_pMomentumPhi; m_pMomentumPhi = nullptr;
121 }
122
123 return StatusCode::SUCCESS;
124}
125
126// finalize
128{
129 // delete the memory
130 delete m_pPositionX; m_pPositionX = nullptr;
131 delete m_pPositionY; m_pPositionY = nullptr;
132 delete m_pPositionZ; m_pPositionZ = nullptr;
133 delete m_pPositionR; m_pPositionR = nullptr;
134 delete m_pMomentumX; m_pMomentumX = nullptr;
135 delete m_pMomentumY; m_pMomentumY = nullptr;
136 delete m_pMomentumZ; m_pMomentumZ = nullptr;
137 delete m_pMomentumMag; m_pMomentumMag = nullptr;
138 delete m_pMomentumEta; m_pMomentumEta = nullptr;
139 delete m_pMomentumPhi; m_pMomentumPhi = nullptr;
140 // return success
141 return StatusCode::SUCCESS;
142}
143
144
146 const Amg::Vector3D& mom,
147 double m, int pdg)
148{
149 if (m_tree){
150 // initialize the parmeters
151 m_pM = m;
152 m_pEta = mom.eta();
153 m_pPhi = mom.phi();
154 m_pE = sqrt(mom.mag()*mom.mag()+m*m);
155 m_pPdg = pdg;
156 // record the momentum / position
157 m_pPositionX->push_back(pos.x());
158 m_pPositionY->push_back(pos.y());
159 m_pPositionZ->push_back(pos.z());
160 m_pPositionR->push_back(pos.perp());
161 m_pMomentumX->push_back(mom.x());
162 m_pMomentumY->push_back(mom.y());
163 m_pMomentumZ->push_back(mom.z());
164 m_pMomentumMag->push_back(mom.mag());
165 m_pMomentumEta->push_back(mom.eta());
166 m_pMomentumPhi->push_back(mom.phi());
167 }
168}
169
171 const Amg::Vector3D& mom)
172{
173 if (m_tree){
174 // record the momentum / position
175 m_pPositionX->push_back(pos.x());
176 m_pPositionY->push_back(pos.y());
177 m_pPositionZ->push_back(pos.z());
178 m_pPositionR->push_back(pos.perp());
179 m_pMomentumX->push_back(mom.x());
180 m_pMomentumY->push_back(mom.y());
181 m_pMomentumZ->push_back(mom.z());
182 m_pMomentumMag->push_back(mom.mag());
183 m_pMomentumEta->push_back(mom.eta());
184 m_pMomentumPhi->push_back(mom.phi());
185 }
186}
187
189{
190 if (m_tree){
191
192 if (!m_pMomentumX->empty()){
193 // the index of the last momentum record
194 size_t lIndex = size_t(m_pMomentumX->size()-1);
195 Amg::Vector3D lastMom(m_pMomentumX->at(lIndex),
196 m_pMomentumY->at(lIndex),
197 m_pMomentumZ->at(lIndex));
198 // end parameters
199 m_eE = sqrt(lastMom.mag()*lastMom.mag()+m_pM*m_pM);
200 m_eEta = lastMom.eta();
201 m_ePhi = lastMom.phi();
202 }
203
204 // fill the tree
205 m_tree->Fill();
206 // re-initialize
207 m_pEta = 0.;
208 m_pPhi = 0.;
209 m_pE = 0.;
210 m_eEta = 0.;
211 m_ePhi = 0.;
212 m_eE = 0.;
213 m_pM = 0.;
214 m_pPdg = 0;
215 // clear the
216 m_pPositionX->clear();
217 m_pPositionY->clear();
218 m_pPositionZ->clear();
219 m_pPositionR->clear();
220 m_pMomentumX->clear();
221 m_pMomentumY->clear();
222 m_pMomentumZ->clear();
223 m_pMomentumMag->clear();
224 m_pMomentumEta->clear();
225 m_pMomentumPhi->clear();
226 }
227}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
virtual void initializeTrack(const Amg::Vector3D &pos, const Amg::Vector3D &mom, double m, int pdg) override
Initialize State.
std::vector< float > * m_pMomentumMag
std::vector< float > * m_pMomentumEta
virtual StatusCode finalize() override
virtual void finalizeTrack() override
Finalization State.
std::vector< float > * m_pPositionY
std::vector< float > * m_pPositionZ
std::vector< float > * m_pMomentumZ
std::vector< float > * m_pPositionR
PositionMomentumWriter(const std::string &, const std::string &, const IInterface *)
standard AlgTool constructor / destructor
virtual StatusCode initialize() override
standard Athena methods
std::vector< float > * m_pMomentumPhi
std::vector< float > * m_pMomentumX
virtual void recordTrackState(const Amg::Vector3D &pos, const Amg::Vector3D &mom) override
Record a single TrackState.
std::vector< float > * m_pPositionX
std::vector< float > * m_pMomentumY
Eigen::Matrix< double, 3, 1 > Vector3D