ATLAS Offline Software
Loading...
Searching...
No Matches
InDetGlobalLRTMonAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5
15
16//main header
18
19//Standard c++
20#include <vector>
21#include <memory>
22
23
24InDetGlobalLRTMonAlg::InDetGlobalLRTMonAlg( const std::string& name, ISvcLocator* pSvcLocator ) :
25 AthMonitorAlgorithm(name, pSvcLocator),
26 m_trackSelTool ( "InDet::InDetTrackSelectionTool/TrackSelectionTool", this),
27 m_IBLParameterSvc("IBLParameterSvc",name),
28 m_doIBL(true)
29{
30 //jo flags go here, keys and some tools -> in class
31 declareProperty("DoIBL", m_doIBL,"IBL present?");
32 declareProperty( "TrackSelectionTool", m_trackSelTool);
33}
34
35
37
38
40 ATH_CHECK( m_IBLParameterSvc.retrieve() );
41
42 m_doIBL = m_IBLParameterSvc->containsIBL();
43
44 if (!m_trackSelTool.empty() ) ATH_CHECK( m_trackSelTool.retrieve() );
45
46 ATH_CHECK( m_trackParticleName.initialize() );
47
49}
50
51
52StatusCode InDetGlobalLRTMonAlg::fillHistograms( const EventContext& ctx ) const {
53 using namespace Monitored;
54
55 //*******************************************************************************
56 //************************** Begin of filling Track Histograms ******************
57 //*******************************************************************************
58
59 ATH_MSG_DEBUG("Filling InDetGlobalLRTMonAlg");
60
61 // For histogram naming
62 auto lrtGroup = getGroup("LRT");
63
64 int lb = GetEventInfo(ctx)->lumiBlock();
65 auto lb_m = Monitored::Scalar<int>( "m_lb", lb );
66
67
68 float lumiPerBCID = lbAverageInteractionsPerCrossing(ctx);
69 auto lumiPerBCID_m = Monitored::Scalar<float>( "m_lumiPerBCID", lumiPerBCID );
70
71
72 // retrieving tracks
73 auto LRT_trackParticles = SG::makeHandle(m_trackParticleName, ctx);
74
75 // check for tracks
76 if ( !(LRT_trackParticles.isValid()) ) {
77 ATH_MSG_ERROR("InDetGlobalMonitoringRun3Test: Track container "<< m_trackParticleName.key() << " could not be found.");
78 return StatusCode::RECOVERABLE;
79 } else {
80 ATH_MSG_DEBUG("InDetGlobalMonitoringRun3Test: Track container "<< LRT_trackParticles.name() <<" is found.");
81 }
82
83 // counters
84 int nBase = 0;
85 int nNoIBL = 0;
86 int nNoBL = 0;
87 int nNoTRText = 0;
88
89 uint8_t iSummaryValue(0); // Dummy counter to retrieve summary values
90
91 for (const auto trackPart: *LRT_trackParticles) {
92 const Trk::Track * track = trackPart->track();
93 if ( !track )
94 {
95 ATH_MSG_DEBUG( "InDetGlobalMonitoringRun3Test: NULL track pointer in collection" );
96 continue;
97 }
98
99 const Trk::Perigee *perigee = track->perigeeParameters();
100 if ( !perigee )
101 {
102 ATH_MSG_DEBUG( "InDetGlobalMonitoringRun3Test: NULL track->perigeeParameters pointer " );
103 continue;
104 }
105
106 // Loose primary tracks
107 if ( !m_trackSelTool->accept(*track) )
108 continue;
109
110 nBase++;
111
112
113 // =================================== //
114 // Fill hits BEGINS
115
116 float eta_perigee = perigee->eta();
117 float phi_perigee = perigee->parameters()[Trk::phi0];
118
119 auto eta_perigee_m = Monitored::Scalar<float>( "m_eta_perigee", eta_perigee);
120 auto phi_perigee_m = Monitored::Scalar<float>( "m_phi_perigee", phi_perigee);
121 fill(lrtGroup, eta_perigee_m, phi_perigee_m); // Trk_Base_eta_phi
122 fill(lrtGroup, eta_perigee_m);
123 fill(lrtGroup, phi_perigee_m);
124
125 float d0_perigee = perigee->parameters()[Trk::d0];
126 auto d0_perigee_m = Monitored::Scalar<float>( "m_d0_perigee", d0_perigee);
127 fill(lrtGroup, d0_perigee_m);
128
129 float z0_perigee = perigee->parameters()[Trk::z0];
130 auto z0_perigee_m = Monitored::Scalar<float>( "m_z0_perigee", z0_perigee);
131 fill(lrtGroup, z0_perigee_m);
132
133 float theta = perigee->parameters()[Trk::theta];
134 float qOverPt = perigee->parameters()[Trk::qOverP]/sin(theta);
135 float charge = perigee->charge();
136 float pT = 0;
137 if ( qOverPt != 0 ) {
138 pT = (1/qOverPt)*(charge);
139 auto pT_m = Monitored::Scalar<float>("m_trkPt", pT/1000);
140 fill(lrtGroup, pT_m);
141 }
142
143 if ( m_doIBL )
144 {
145 int numberOfInnermostPixelLayerHits = trackPart->summaryValue(iSummaryValue, xAOD::numberOfInnermostPixelLayerHits) ? iSummaryValue : 0;
146 auto numberOfInnermostPixelLayerHits_m = Monitored::Scalar<int>( "m_numberOfInnermostPixelLayerHits", numberOfInnermostPixelLayerHits);
147 fill(lrtGroup, eta_perigee_m, phi_perigee_m, numberOfInnermostPixelLayerHits_m);
148
149 fill(lrtGroup, lb_m, numberOfInnermostPixelLayerHits_m);
150 }
151
152 int numberOfPixelHits = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelHits) ? iSummaryValue : 0;
153 int numberOfPixelDeadSensors = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelDeadSensors) ? iSummaryValue : 0;
154 int pixHits = numberOfPixelHits + numberOfPixelDeadSensors;
155 auto pixHits_m = Monitored::Scalar<int>( "m_pixHits", pixHits );
156 fill(lrtGroup, eta_perigee_m, phi_perigee_m, pixHits_m);
157 fill(lrtGroup, lb_m, pixHits_m);
158
159 auto numberOfPixelDeadSensors_m = Monitored::Scalar<int>( "m_numberOfPixelDeadSensors", numberOfPixelDeadSensors );
160 fill(lrtGroup, eta_perigee_m, phi_perigee_m, numberOfPixelDeadSensors_m);
161
162 int numberOfPixelSharedHits = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelSharedHits) ? iSummaryValue : 0;
163 auto numberOfPixelSharedHits_m = Monitored::Scalar<int>( "m_numberOfPixelSharedHits", numberOfPixelSharedHits);
164 fill(lrtGroup, eta_perigee_m, phi_perigee_m, numberOfPixelSharedHits_m);
165
166 int numberOfPixelHoles = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelHoles) ? iSummaryValue : 0;
167 auto numberOfPixelHoles_m = Monitored::Scalar<int>( "m_numberOfPixelHoles", numberOfPixelHoles);
168 fill(lrtGroup, eta_perigee_m, phi_perigee_m, numberOfPixelHoles_m);
169
170 int numberOfPixelSplitHits = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelSplitHits) ? iSummaryValue : 0;
171 auto numberOfPixelSplitHits_m = Monitored::Scalar<int>( "m_numberOfPixelSplitHits", numberOfPixelSplitHits);
172 fill(lrtGroup, eta_perigee_m, phi_perigee_m, numberOfPixelSplitHits_m);
173
174 int numberOfSCTHits = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTHits) ? iSummaryValue : 0;
175 int numberOfSCTDeadSensors = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTDeadSensors) ? iSummaryValue : 0;
176 int sctHits = numberOfSCTHits + numberOfSCTDeadSensors;
177 auto sctHits_m = Monitored::Scalar<int>( "m_sctHits", sctHits );
178 fill(lrtGroup, eta_perigee_m, phi_perigee_m, sctHits_m);
179 fill(lrtGroup, lb_m, sctHits_m);
180
181 auto numberOfSCTDeadSensors_m = Monitored::Scalar<int>( "m_numberOfSCTDeadSensors", numberOfSCTDeadSensors );
182 fill(lrtGroup, eta_perigee_m, phi_perigee_m, numberOfSCTDeadSensors_m);
183
184 int numberOfSCTSharedHits = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTSharedHits) ? iSummaryValue : 0;
185 auto numberOfSCTSharedHits_m = Monitored::Scalar<int>( "m_numberOfSCTSharedHits", numberOfSCTSharedHits);
186 fill(lrtGroup, eta_perigee_m, phi_perigee_m, numberOfSCTSharedHits_m);
187
188 int numberOfSCTHoles = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTHoles) ? iSummaryValue : 0;
189 auto numberOfSCTHoles_m = Monitored::Scalar<int>( "m_numberOfSCTHoles", numberOfSCTHoles);
190 fill(lrtGroup, eta_perigee_m, phi_perigee_m, numberOfSCTHoles_m);
191
192 int numberOfTRTHits = trackPart->summaryValue(iSummaryValue, xAOD::numberOfTRTHits) ? iSummaryValue : 0;
193 int numberOfTRTDeadStraws = trackPart->summaryValue(iSummaryValue, xAOD::numberOfTRTDeadStraws) ? iSummaryValue : 0;
194 int trtHits = numberOfTRTHits + numberOfTRTDeadStraws;
195 auto trtHits_m = Monitored::Scalar<int>( "m_trtHits", trtHits );
196 fill(lrtGroup, eta_perigee_m, phi_perigee_m, trtHits_m);
197 fill(lrtGroup, lb_m, trtHits_m);
198
199 auto numberOfTRTDeadStraws_m = Monitored::Scalar<int>( "m_numberOfTRTDeadStraws", numberOfTRTDeadStraws);
200 fill(lrtGroup, eta_perigee_m, phi_perigee_m, numberOfTRTDeadStraws_m);
201
202 // Fill hits ENDS
203 // =================================== //
204
205 // =================================== //
206 // FillEtaPhi BEGINS
207
208 int InnermostPixelLayerHit = 0;
209 int NextToInnermostPixelLayerHit = 0;
210
211 int expInHit = trackPart->summaryValue(iSummaryValue, xAOD::expectInnermostPixelLayerHit) ? iSummaryValue : 0;
212 int nInHits = trackPart->summaryValue(iSummaryValue, xAOD::numberOfInnermostPixelLayerHits) ? iSummaryValue : 0;
213
216 int expNInHit = trackPart->summaryValue(iSummaryValue, expNInHitField) ? iSummaryValue : 0;
217 int nNInHits = trackPart->summaryValue(iSummaryValue, nNInHitField) ? iSummaryValue : 0;
218
219 if ( m_doIBL )
220 {
221 // no IBL hit but a hit is expected
222 if ( expInHit==1 && nInHits==0 ) InnermostPixelLayerHit = 1;
223 auto InnermostPixelLayerHit_m = Monitored::Scalar<int>( "m_InnermostPixelLayerHit", InnermostPixelLayerHit);
224 fill(lrtGroup, eta_perigee_m, phi_perigee_m, InnermostPixelLayerHit_m);
225 }
226
227 // no b-layer hit but a hit is expected
228 if ( expNInHit==1 && nNInHits==0 ) NextToInnermostPixelLayerHit = 1 ;
229 auto NextToInnermostPixelLayerHit_m = Monitored::Scalar<int>( "m_NextToInnermostPixelLayerHit", NextToInnermostPixelLayerHit);
230 fill(lrtGroup, eta_perigee_m, phi_perigee_m, NextToInnermostPixelLayerHit_m);
231
232 // No TRT extension
233 int noTRTHits = 0;
234 if ( numberOfTRTHits == 0 ) noTRTHits = 1;
235 auto noTRTHits_m = Monitored::Scalar<int>( "m_noTRTHits", noTRTHits);
236 fill(lrtGroup, eta_perigee_m, phi_perigee_m, noTRTHits_m);
237
238 // =================================== //
239 // FillEtaPhi ENDS
240
241 int NoIBL = 0;
242 if ( m_doIBL )
243 {
244 // no IBL hit but a hit is expected
245 if ( expInHit==1 && nInHits==0 ) NoIBL = 1;
246 if (NoIBL == 1) nNoIBL++;
247 auto NoIBL_m = Monitored::Scalar<int>( "m_NoIBL_LB", NoIBL);
248 fill(lrtGroup, lb_m, NoIBL_m);
249 }
250
251 int NoBL = 0;
252 if ( expNInHit==1 && nNInHits==0 ) NoBL = 1;
253 if (NoBL == 1) nNoBL++;
254 auto NoBL_m = Monitored::Scalar<int>( "m_NoBL_LB", NoBL);
255 fill(lrtGroup, lb_m, NoBL_m);
256
257 int NoTRText = 0;
258 int numberOfTRTOutliers = trackPart->summaryValue(iSummaryValue, xAOD::numberOfTRTOutliers) ? iSummaryValue : 0;
259 if ( numberOfTRTHits + numberOfTRTOutliers == 0 ) NoTRText = 1;
260 if (NoTRText == 1) nNoTRText++;
261 auto NoTRText_m = Monitored::Scalar<int>( "m_NoTRText_LB", NoTRText);
262 fill(lrtGroup, lb_m, NoTRText_m);
263
264 // FillHitMaps is false for now
265 // FillHoles is false for now
266
267
268 } // end of track loop
269
270 // Filling per-event histograms
271 auto nBase_m = Monitored::Scalar<int>( "m_nBase", nBase);
272 fill(lrtGroup, nBase_m);
273
274 auto nBaseLB_m = Monitored::Scalar<int>( "m_nBase_LB", nBase);
275 fill(lrtGroup, lb_m, nBaseLB_m);
276
277 fill(lrtGroup, lumiPerBCID_m, nBaseLB_m);
278
279 if ( m_doIBL ) {
280 auto nNoIBL_m = Monitored::Scalar<int>( "m_nNoIBL_LB", nNoIBL);
281 fill(lrtGroup, lb_m, nNoIBL_m);
282 }
283
284 auto nNoBL_m = Monitored::Scalar<int>( "m_nNoBL_LB", nNoBL);
285 fill(lrtGroup, lb_m, nNoBL_m);
286
287 auto nNoTRText_m = Monitored::Scalar<int>( "m_nNoTRText_LB", nNoTRText);
288 fill(lrtGroup, lb_m, nNoTRText_m);
289
290 //*******************************************************************************
291 //**************************** End of filling Track Histograms ******************
292 //*******************************************************************************
293
294 return StatusCode::SUCCESS;
295}
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
Implementation of inner detector global LRT monitoring tool.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
virtual StatusCode initialize() override
initialize
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
ToolHandle< InDet::IInDetTrackSelectionTool > m_trackSelTool
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
ServiceHandle< IIBLParameterSvc > m_IBLParameterSvc
virtual StatusCode initialize() override
initialize
InDetGlobalLRTMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleName
Declare a monitored scalar variable.
double eta() const
Access method for pseudorapidity - from momentum.
double charge() const
Returns the charge.
int lb
Definition globals.cxx:23
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable > > &&variables) const
Fills a vector of variables to a group by reference.
virtual float lbAverageInteractionsPerCrossing(const EventContext &ctx=Gaudi::Hive::currentContext()) const
Calculate the average mu, i.e.
Generic monitoring tool for athena components.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi0
Definition ParamDefs.h:65
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
SummaryType
Enumerates the different types of information stored in Summary.
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfTRTDeadStraws
number of dead TRT straws crossed [unit8_t].
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfPixelSplitHits
number of Pixel all-layer hits split by cluster splitting [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
@ numberOfSCTDeadSensors
number of dead SCT sensors crossed [unit8_t].
@ expectNextToInnermostPixelLayerHit
Do we expect a 1st-layer barrel hit for this track?
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfTRTOutliers
number of TRT outliers [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].