ATLAS Offline Software
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
17 Trk::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{},
31  m_pPositionX{},
32  m_pPositionY{},
33  m_pPositionZ{},
34  m_pPositionR{},
35  m_pMomentumX{},
36  m_pMomentumY{},
37  m_pMomentumZ{},
38  m_pMomentumMag{},
39  m_pMomentumEta{},
40  m_pMomentumPhi{}
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 }
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
Trk::PositionMomentumWriter::initialize
virtual StatusCode initialize() override
standard Athena methods
Definition: PositionMomentumWriter.cxx:53
Trk::PositionMomentumWriter::recordTrackState
virtual void recordTrackState(const Amg::Vector3D &pos, const Amg::Vector3D &mom) override
Record a single TrackState.
Definition: PositionMomentumWriter.cxx:170
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
ParticleGun_EoverP_Config.mom
mom
Definition: ParticleGun_EoverP_Config.py:63
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
PositionMomentumWriter.h
ParticleHypothesis.h
Trk::PositionMomentumWriter::finalizeTrack
virtual void finalizeTrack() override
Finalization State.
Definition: PositionMomentumWriter.cxx:188
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
Trk::PositionMomentumWriter::PositionMomentumWriter
PositionMomentumWriter(const std::string &, const std::string &, const IInterface *)
standard AlgTool constructor / destructor
Definition: PositionMomentumWriter.cxx:17
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
Trk::PositionMomentumWriter::finalize
virtual StatusCode finalize() override
Definition: PositionMomentumWriter.cxx:127
Trk::PositionMomentumWriter::initializeTrack
virtual void initializeTrack(const Amg::Vector3D &pos, const Amg::Vector3D &mom, double m, int pdg) override
Initialize State.
Definition: PositionMomentumWriter.cxx:145
AthAlgTool
Definition: AthAlgTool.h:26