ATLAS Offline Software
Loading...
Searching...
No Matches
TrackInformationNtupleTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6// BasicValidationNtupleTool.cxx
7// Source file for class BasicValidationNtupleTool
9// (c) ATLAS Detector software
11// Sebastian.Fleischmann -at- cern.ch, Wolfgang.Liebig -at- cern.ch
13#include "TTree.h"
14// Trk
17#include "TrkTrack/Track.h"
19
21#include "TrkTrack/TrackInfo.h"
23
24// constructor
26 const std::string& t,
27 const std::string& n,
28 const IInterface* p )
29 :
30 AthAlgTool(t,n,p),
33 m_runNumber{},
35 m_TrackID{},
36 m_iterIndex{},
42 m_ndof{},
43 m_nHits{}
44{
45 declareInterface<ITrackValidationNtupleTool>(this);
46}
47
48// destructor
50
51
53// initialize
56
57 ATH_CHECK( m_evt.initialize() );
58 return StatusCode::SUCCESS;
59}
60
62// finalize
65
66 ATH_MSG_DEBUG ("nothing specific finalized in " << name());
67 return StatusCode::SUCCESS;
68}
69
71 if (!tree) return StatusCode::FAILURE;
72 //-----------------
73 // add items *** Note: Documentation is in the header file, doxygen and wikis! ***
74 //
75 // event info:
76 tree->Branch("RunNumber", &m_runNumber );
77 tree->Branch("EventNumber", &m_eventNumber );
78 tree->Branch("TrackID", &m_TrackID );
79 tree->Branch("IterationIndex", &m_iterIndex );
80 tree->Branch("nHits", &m_nHits );
81 tree->Branch("Chi2overNdof", &m_Rec_chi2overNdof );
82 tree->Branch("Ndof", &m_ndof );
83 tree->Branch("FitterStatusCode", &m_fitStatusCode );
84 tree->Branch("TrackFitAuthor", &m_trackFitAuthor );
85 tree->Branch("TrackSeedAuthor", &m_trackSeedAuthor );
86 tree->Branch("TrackParticleHypo", &m_particleHypothesis);
87
88 ATH_MSG_VERBOSE ("added branches to ntuple");
89 return StatusCode::SUCCESS;
90}
91
96 const Trk::Track& track,
97 const int iterationIndex,
98 const unsigned int fitStatCode ) {
99
100 ATH_MSG_VERBOSE ("in fillTrackData(trk, indx)");
101 // ---------------------------------------
102 // detect new event, reset Track counter if new event
104 if(!evt.isValid()) {
105 msg(MSG::WARNING) << "Could not retrieve event info" << endmsg;
108 } else {
109 if (m_lastEventNumber!=evt->eventNumber()) {
110 // we have a new event, reset TrackID:
112 m_lastEventNumber = evt->eventNumber();
113 }
114 // ---------------------------------------------
115 // track id (increase if a new iteration was started = iterationIndex==0)
116 if (iterationIndex == 0) m_TrackIDcounter++;
118 m_iterIndex = iterationIndex;
119 m_eventNumber = evt->eventNumber();
120 m_runNumber = evt->runNumber();
121 }
122 ATH_MSG_VERBOSE ("Event: " << m_eventNumber << ", Run: "
123 << m_runNumber << " TrackID: " << m_TrackID
124 << " iteration index: " << m_iterIndex);
125
126 m_fitStatusCode = int(fitStatCode);
127 m_trackFitAuthor = track.info().trackFitter() ;
128 m_trackSeedAuthor = getSeed(track.info());
129 m_particleHypothesis = int(track.info().particleHypothesis());
130 if (track.fitQuality() != nullptr) {
131 m_Rec_chi2overNdof = (track.fitQuality()->numberDoF()>0) ? track.fitQuality()->chiSquared()/track.fitQuality()->numberDoF() : 0.0; // 0.0 expected for underconstrained fit anyway
132 m_ndof=track.fitQuality()->numberDoF();
133 } else {
136 }
137
138 ATH_MSG_VERBOSE ("counts # of track states with measurement or outlier");
139 // Get pointer to track state on surfaces
140 const Trk::TrackStates* trackStates=track.trackStateOnSurfaces();
141 m_nHits = 0;
142 if (trackStates != nullptr) {
143
144 for (const auto *trackState : *trackStates) {
145
146 if (!trackState) {
147 msg(MSG::WARNING) << "TrackStateOnSurface == Null" << endmsg;
148 continue;
149 }
150 if (trackState->type(Trk::TrackStateOnSurface::Measurement) ||
151 trackState->type(Trk::TrackStateOnSurface::Outlier) ) {
152
153 const Trk::MeasurementBase *measurement = trackState->measurementOnTrack();
154 if (!measurement) {
155 msg(MSG::WARNING) << "measurementOnTrack == Null for a TrackStateOnSurface "
156 << "of type Measurement or Outlier" << endmsg;
157 return StatusCode::FAILURE;
158 } else ++m_nHits;
159
160 }
161 }
162 }
163 return StatusCode::SUCCESS;
164}
165
170( const Trk::TrackParticleBase& particle)
171{
172 ATH_MSG_VERBOSE ("in fillTrackData(trk, indx)");
173 // ---------------------------------------
174 // detect new event, reset Track counter if new event
176 if(!evt.isValid()) {
177 msg(MSG::WARNING) << "Could not retrieve event info" << endmsg;
180 } else {
181 if (m_lastEventNumber!=evt->eventNumber()) {
182 // we have a new event, reset TrackID:
184 m_lastEventNumber = evt->eventNumber();
185 }
186 // ---------------------------------------------
188 m_eventNumber = evt->eventNumber();
189 m_runNumber = evt->runNumber();
190 }
191 ATH_MSG_VERBOSE ("Event: " << m_eventNumber << ", Run: "
192 << m_runNumber << " TrackID: " << m_TrackID);
193
194 m_trackFitAuthor = particle.info().trackFitter() ;
195 m_trackSeedAuthor = getSeed(particle.info());
196 m_particleHypothesis = int(particle.info().particleHypothesis());
197 if (particle.fitQuality() != nullptr) {
198 m_Rec_chi2overNdof = (particle.fitQuality()->numberDoF()>0) ? particle.fitQuality()->chiSquared()/particle.fitQuality()->numberDoF() : 0.0; // 0.0 expected for underconstrained fit anyway
199 m_ndof=particle.fitQuality()->numberDoF();
200 } else {
203 }
204
205 // fill variable nHits (more for compatibility with track-based filling)
206 const Trk::TrackSummary* summary = particle.trackSummary();
207 if (summary==nullptr) m_nHits = -1;
208 else {
209 m_nHits = (unsigned char)summary->get(Trk::numberOfPixelHits);
210 m_nHits += (unsigned char)summary->get(Trk::numberOfSCTHits);
211 m_nHits += (unsigned char)summary->get(Trk::numberOfTRTHits);
212 m_nHits += (unsigned char)summary->get(Trk::numberOfMdtHits);
213 m_nHits += (unsigned char)summary->get(Trk::numberOfTgcEtaHits);
214 m_nHits += (unsigned char)summary->get(Trk::numberOfTgcPhiHits);
215 m_nHits += (unsigned char)summary->get(Trk::numberOfRpcEtaHits);
216 m_nHits += (unsigned char)summary->get(Trk::numberOfRpcPhiHits);
217 m_nHits += (unsigned char)summary->get(Trk::numberOfCscEtaHits);
218 m_nHits += (unsigned char)summary->get(Trk::numberOfCscPhiHits);
219 }
220 return StatusCode::SUCCESS;
221}
222
224// reset variables
227 // reset the counters
228 m_nHits = 0;
229}
230
231
233{
234 int seed = -1;
235 if (info.patternRecoInfo(Trk::TrackInfo::Muonboy))
236 seed = (int)(Trk::TrackInfo::Muonboy);
237 else if (info.patternRecoInfo(Trk::TrackInfo::Moore))
238 seed = (int)(Trk::TrackInfo::Moore);
239 else if (info.patternRecoInfo(Trk::TrackInfo::SiSpacePointsSeedMaker_Cosmic))
241 else if (info.patternRecoInfo(Trk::TrackInfo::SiSpacePointsSeedMaker_BeamGas))
243 else if (info.patternRecoInfo(Trk::TrackInfo::SiSpacePointsSeedMaker_LowMomentum))
245 else if (info.patternRecoInfo(Trk::TrackInfo::SiSpacePointsSeedMaker_HeavyIon))
247 else if (info.patternRecoInfo(Trk::TrackInfo::SiSPSeededFinder))
249 else if (info.patternRecoInfo(Trk::TrackInfo::SiCTBTracking))
250 seed = (int)(Trk::TrackInfo::SiCTBTracking);
251 else if (info.patternRecoInfo(Trk::TrackInfo::InDetAmbiguitySolver))
253 else if (info.patternRecoInfo(Trk::TrackInfo::TRTSeededTrackFinder))
255 else if (info.patternRecoInfo(Trk::TrackInfo::TRTSeededSingleSpTrackFinder))
257 else if (info.patternRecoInfo(Trk::TrackInfo::TRTStandalone))
258 seed = (int)(Trk::TrackInfo::TRTStandalone);
259 else if (info.patternRecoInfo(Trk::TrackInfo::iPatRec))
260 seed = (int)(Trk::TrackInfo::iPatRec);
261 else if (info.patternRecoInfo(Trk::TrackInfo::xKalmanLegacyCnv))
263 else if (info.patternRecoInfo(Trk::TrackInfo::SimpleAmbiguityProcessorTool))
265 else if (info.patternRecoInfo(Trk::TrackInfo::InDetAmbiTrackSelectionTool))
267 else if (info.patternRecoInfo(Trk::TrackInfo::TrigIDSCAN))
268 seed = (int)(Trk::TrackInfo::TrigIDSCAN);
269 else if (info.patternRecoInfo(Trk::TrackInfo::TrigSiTrack))
270 seed = (int)(Trk::TrackInfo::TrigSiTrack);
271 else if (info.patternRecoInfo(Trk::TrackInfo::TrigTRTxK))
272 seed = (int)(Trk::TrackInfo::TrigTRTxK);
273 else if (info.patternRecoInfo(Trk::TrackInfo::TrigTRTLUT))
274 seed = (int)(Trk::TrackInfo::TrigTRTLUT);
275 else if (info.patternRecoInfo(Trk::TrackInfo::MuidStandAlone))
276 seed = (int)(Trk::TrackInfo::MuidStandAlone);
277 else if (info.patternRecoInfo(Trk::TrackInfo::MuidCombined))
278 seed = (int)(Trk::TrackInfo::MuidCombined);
279 else if (info.patternRecoInfo(Trk::TrackInfo::MuidVertexAssociator))
281 else if (info.patternRecoInfo(Trk::TrackInfo::MuGirl))
282 seed = (int)(Trk::TrackInfo::MuGirl);
283 else if (info.patternRecoInfo(Trk::TrackInfo::MuGirlLowBeta))
284 seed = (int)(Trk::TrackInfo::MuGirlLowBeta);
285 else if (info.patternRecoInfo(Trk::TrackInfo::MuGirlUnrefitted))
287 else if (info.patternRecoInfo(Trk::TrackInfo::STACO))
288 seed = (int)(Trk::TrackInfo::STACO);
289 else if (info.patternRecoInfo(Trk::TrackInfo::MuTag))
290 seed = (int)(Trk::TrackInfo::MuTag);
291 else if (info.patternRecoInfo(Trk::TrackInfo::Fatras))
292 seed = (int)(Trk::TrackInfo::Fatras);
293 else if (info.patternRecoInfo(Trk::TrackInfo::FatrasSimulation))
295 ATH_MSG_VERBOSE ("got seed "<<seed<<" for info " << info);
296 return seed;
297}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
static const float s_errorEntry
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
This class is the pure abstract base class for all fittable tracking measurements.
Contains information about the 'fitter' of this track.
@ SiSpacePointsSeedMaker_Cosmic
Entries allowing to distinguish different seed makers.
@ TRTSeededTrackFinder
Tracks from TRT Seeded Track finder.
@ TrigTRTxK
TrigInDetTracks produced by TrigTRTxK, running at trigger LVL2.
@ MuGirlUnrefitted
Tracks from MuGirl not refitted with iPat.
@ TrigIDSCAN
TrigInDetTracks produced by TrigIDSCAN, running at trigger LVL2.
@ InDetAmbiguitySolver
Tracks with InDetAmbiguitySolver used.
@ TrigSiTrack
TrigInDetTracks produced by TrigSiTrack, running at trigger LVL2.
@ SimpleAmbiguityProcessorTool
Added because of compilation problems.
@ SiSPSeededFinder
Tracks from SiSPSeedFinder.
@ InDetAmbiTrackSelectionTool
Added because of compilation problems.
@ TRTSeededSingleSpTrackFinder
TRTSeededSingleSpTrackFinder.
@ TrigTRTLUT
TrigInDetTracks produced by TrigTRTLUT, running at trigger LVL2.
@ xKalmanLegacyCnv
Added because of compilation problems.
int m_nHits
number of measurements on the track (including outliers)
int m_eventNumber
event number the track belongs to
virtual StatusCode fillTrackData(const Trk::Track &, const int iterationIndex, const unsigned int fitStatCode)
fill ntuple data of a given track without writing the record.
int m_fitStatusCode
return status code of the track fitter (for fit debugging)
TrackInformationNtupleTool(const std::string &, const std::string &, const IInterface *)
int m_trackSeedAuthor
author (main seed finder) of the current track.
int m_TrackID
number of the track within the current event
int m_iterIndex
iteration index of the track (for DAF & internal call, EDM tracks always 0)
int m_ndof
number of degrees of freedom of track fit
virtual void resetVariables()
reset the variables after writing the record to disk ntuple
int m_particleHypothesis
particle hypothesis with which track was fitted
float m_Rec_chi2overNdof
chi2 / n.d.o.f of reconstructed track
virtual StatusCode fillTrackParticleData(const Trk::TrackParticleBase &)
fill ntuple data of a given TrackParticle without writing the record.
SG::ReadHandleKey< xAOD::EventInfo > m_evt
int m_runNumber
run number the track belongs to
virtual StatusCode addNtupleItems(TTree *tree)
add branches to the tree Should be called once (per track collection and tree) dunring the initialisa...
int m_trackFitAuthor
author (fitter) of the current track
int getSeed(const Trk::TrackInfo &info) const
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
A summary of the information contained by a track.
DataVector< const Trk::TrackStateOnSurface > TrackStates
@ numberOfPixelHits
number of pixel layers on track with absence of hits
MsgStream & msg
Definition testRead.cxx:32
TChain * tree