ATLAS Offline Software
Loading...
Searching...
No Matches
TRTMonitoringRun3ESD_Alg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
14#include "TrkTrack/Track.h"
21
24
25#include <sstream>
26#include <iomanip>
27#include <memory>
28#include <cmath>
29using namespace std;
30
31//Private Static Const data member initialization
34const int TRTMonitoringRun3ESD_Alg::s_Straw_max[2] = {1642, 3840};
35const int TRTMonitoringRun3ESD_Alg::s_iStack_max[2] = {32, 64};
36const int TRTMonitoringRun3ESD_Alg::s_iChip_max[2] = {104, 240};
37const int TRTMonitoringRun3ESD_Alg::s_numberOfStacks[2] = {32, 32};
38const int TRTMonitoringRun3ESD_Alg::s_moduleNum[2] = {96, 64};
39
40TRTMonitoringRun3ESD_Alg::TRTMonitoringRun3ESD_Alg( const std::string& name, ISvcLocator* pSvcLocator )
41:AthMonitorAlgorithm(name,pSvcLocator)
42{
43}
44
46
48 using namespace Monitored;
49
50 ATH_MSG_VERBOSE("Initializing TRT Monitoring");
51
52 // Initialize superclass
54
55 // Retrieve detector manager
56 ATH_CHECK( detStore()->retrieve(m_mgr, "TRT") );
57 // Get ID helper for TRT to access various detector components like straw, straw_layer, layer_or_wheel, phi_module, etc.
58 ATH_CHECK( detStore()->retrieve(m_pTRTHelper, "TRT_ID") );
59 ATH_CHECK( detStore()->retrieve(m_idHelper, "AtlasID") );
60
61 // InDetTrackSelectionTools initialization:
62 ATH_CHECK( m_trackSelTool.retrieve() );
63
64 if (m_doExpert) {
65 // Retrieve the TRT_Straw Status Service
66 if (m_sumTool.name().empty()) {
67 ATH_MSG_WARNING("TRT_StrawStatusTool not given.");
68 } else {
69 ATH_CHECK( m_sumTool.retrieve() );
70 }
71
72 Identifier ident;
73
74 if (m_sumTool.name() != "") {
75 ATH_MSG_VERBOSE("Trying " << m_sumTool << " isGood");
76 ATH_MSG_VERBOSE("TRT_StrawStatusTool reports status = " << m_sumTool->getStatus(ident, Gaudi::Hive::currentContext()));
77 }
78 } //If do expert
79
80 // Retrieve TRT_StrawNeighbourService
81 if (m_TRTStrawNeighbourSvc.name().empty()) {
82 ATH_MSG_WARNING("TRT_StrawNeighbourSvc not given.");
83 } else {
84 if (m_TRTStrawNeighbourSvc.retrieve().isFailure()) {
85 ATH_MSG_FATAL("Could not get StrawNeighbourSvc.");
86 }
87 }
88
89 // Get Track summary tool
90 if (m_TrackSummaryTool.retrieve().isFailure())
91 ATH_MSG_ERROR("Cannot get TrackSummaryTool");
92 else
93 ATH_MSG_DEBUG("Retrieved succesfully the track summary tool" << m_TrackSummaryTool);
94
95 //Get TRTCalDbTool
96 if (m_TRTCalDbTool.name().empty()) {
97 ATH_MSG_WARNING("TRT_CalDbTool not given.");
98 } else {
99 if (m_TRTCalDbTool.retrieve().isFailure()) {
100 ATH_MSG_ERROR("Cannot get TRTCalDBTool.");
101 }
102 }
103
104 ATH_CHECK(m_drifttool.retrieve());
105
106 // Initialize arrays
107 // These arrays store information about each entry to the HitMap histograms
108
109 if (true) {
110 //loop over straw hash index to create straw number mapping for TRTViewer
111 unsigned int maxHash = m_pTRTHelper->straw_layer_hash_max();
112
113 for (int ibe = 0; ibe < 2; ibe++) { // ibe=0(barrel), ibe=1(endcap)
114 for (unsigned int index = 0; index < maxHash; index++) {
115 IdentifierHash idHash = index;
116 Identifier id = m_pTRTHelper->layer_id(idHash);
117 int idBarrelEndcap = m_pTRTHelper->barrel_ec(id);
118 int idLayerWheel = m_pTRTHelper->layer_or_wheel(id);
119 int idPhiModule = m_pTRTHelper->phi_module(id);
120 int idStrawLayer = m_pTRTHelper->straw_layer(id);
121 bool isBarrel = m_pTRTHelper->is_barrel(id);
122 int idSide;
123 int sectorflag = 0;
124 const InDetDD::TRT_BaseElement *element = nullptr;
125
126 if (ibe == 0) { // barrel
127 idSide = idBarrelEndcap ? 1 : -1;
128
129 if (isBarrel && (idBarrelEndcap == -1)) {
130 sectorflag = 1;
131 element = m_mgr->getBarrelElement(idSide, idLayerWheel, idPhiModule, idStrawLayer);
132 }
133 } else if (ibe == 1) { // endcap
134 idSide = idBarrelEndcap ? 1 : 0;
135
136 if (!isBarrel && ((idBarrelEndcap == -2) || (idBarrelEndcap == 2))) {
137 sectorflag = 1;
138 element = m_mgr->getEndcapElement(idSide, idLayerWheel, idStrawLayer, idPhiModule);//, idStrawLayer_ec);
139 }
140 }
141
142 if (sectorflag == 1) {
143 if (!element) continue;
144
145 for (unsigned int istraw = 0; istraw < element->nStraws(); istraw++) {
146 std::vector<Identifier> neighbourIDs;
147 Identifier strawID = m_pTRTHelper->straw_id(id, int(istraw));
148 int i_chip, i_pad;
149 m_TRTStrawNeighbourSvc->getChip(strawID, i_chip);
150 m_TRTStrawNeighbourSvc->getPad(id, i_pad);
151
152 if (ibe == 0) { //barrel
153 if (idLayerWheel == 1) i_chip += 21;
154
155 if (idLayerWheel == 2) i_chip += 54;
156
157 int tempStrawNumber = strawNumber(istraw, idStrawLayer, idLayerWheel);
158
159 if (tempStrawNumber < 0 || tempStrawNumber > (s_Straw_max[ibe] - 1)) {
160 ATH_MSG_WARNING("Found tempStrawNumber = " << tempStrawNumber << " out of range.");
161 } else {
162 m_mat_chip_B.at(idPhiModule).at(tempStrawNumber) = i_chip;
163 m_mat_chip_B.at(idPhiModule + 32).at(tempStrawNumber) = i_chip;
164 }
165 } else if (ibe == 1) { //endcap
166 ++i_chip -= 104;
167 int tempStrawNumber = strawNumberEndCap(istraw, idStrawLayer, idLayerWheel, idPhiModule, idSide);
168
169 if (tempStrawNumber < 0 || tempStrawNumber > (s_Straw_max[ibe] - 1)) {
170 ATH_MSG_WARNING("Found tempStrawNumber = " << tempStrawNumber << " out of range.");
171 } else {
172 m_mat_chip_E.at(idPhiModule).at(tempStrawNumber) = i_chip;
173 m_mat_chip_E.at(idPhiModule + 32).at(tempStrawNumber) = i_chip;
174 }
175 }
176 }
177 }
178 }
179 }
180 }
181
182 // Initialization of VarHandleKeys
183 ATH_CHECK( m_trackCollectionKey.initialize() );
184 ATH_CHECK( m_xAODEventInfoKey.initialize() );
185 ATH_CHECK( m_TRT_BCIDCollectionKey.initialize() );
188
189 return StatusCode::SUCCESS;
190}
191
192
193//----------------------------------------------------------------------------------//
195//----------------------------------------------------------------------------------//
196 switch (LayerNumber) {
197 case 0:
198 return strawLayerNumber;
199
200 case 1:
201 return strawLayerNumber + 19;
202
203 case 2:
204 return strawLayerNumber + 43;
205
206 default:
207 return strawLayerNumber;
208 }
209}
210
211//----------------------------------------------------------------------------------//
212int TRTMonitoringRun3ESD_Alg::strawNumber(int strawNumber, int strawlayerNumber, int LayerNumber) const {
213//----------------------------------------------------------------------------------//
214 int addToStrawNumber = 0;
215 int addToStrawNumberNext = 0;
216 int i = 0;
217 const int numberOfStraws[75] = {
218 0,
219 15,
220 16, 16, 16, 16,
221 17, 17, 17, 17, 17,
222 18, 18, 18, 18, 18,
223 19, 19, 19,
224 18,
225 19,
226 20, 20, 20, 20, 20,
227 21, 21, 21, 21, 21,
228 22, 22, 22, 22, 22,
229 23, 23, 23, 23, 23,
230 24, 24,
231 23, 23,
232 24, 24, 24, 24,
233 25, 25, 25, 25, 25,
234 26, 26, 26, 26, 26,
235 27, 27, 27, 27, 27,
236 28, 28, 28, 28, 28,
237 29, 29, 29, 29,
238 28,
239 0
240 };
241
242 do {
243 i++;
244 addToStrawNumber += numberOfStraws[i - 1];
245 addToStrawNumberNext = addToStrawNumber + numberOfStraws[i];
246 } while (strawLayerNumber(strawlayerNumber, LayerNumber) != i - 1);
247
248 strawNumber = addToStrawNumberNext - strawNumber - 1;
249
250 if (strawNumber < 0 || strawNumber > s_Straw_max[0] - 1) {
251 ATH_MSG_WARNING("strawNumber = " << strawNumber << " out of range. Will set to 0.");
252 strawNumber = 0;
253 }
254
255 return strawNumber;
256}
257
258
259//----------------------------------------------------------------------------------//
260int TRTMonitoringRun3ESD_Alg::strawNumberEndCap(int strawNumber, int strawLayerNumber, int LayerNumber, int phi_stack, int side) const {
261//----------------------------------------------------------------------------------//
262 // Before perfoming map, corrections need to be perfomed.
263 // apply special rotations for endcap mappings
264 // for eca, rotate triplets by 180 for stacks 9-16, and 25-32.
265 static const int TripletOrientation[2][32] = {
266 {
267 1, 1, 1, 1, 1, 1, 1, 1,
268 0, 0, 0, 0, 0, 0, 0, 0,
269 1, 1, 1, 1, 1, 1, 1, 1,
270 0, 0, 0, 0, 0, 0, 0, 0
271 },
272 {
273 1, 1, 1, 1, 1, 1, 1, 1,
274 0, 0, 0, 0, 0, 0, 0, 0,
275 1, 1, 1, 1, 1, 1, 1, 1,
276 0, 0, 0, 0, 0, 0, 0, 0
277 }
278 };
279 int phi1 = -1;
280
281 if (side == 2) phi1 = phi_stack, side = 1;
282 else if (side == -2) phi1 = 31 - phi_stack, side = 0;
283
284 if (phi1 > -1) {
285 if (TripletOrientation[side][phi1]) {
286 // Change straw number from 0-23 in straw layer to 0-192
288
290
291 strawNumber = (192 - 1) * TripletOrientation[side][phi1] + strawNumber * (1 - 2 * TripletOrientation[side][phi1]); //actual rotation
292
293 // Take strawNumber back to 0-23
294 if (strawLayerNumber < 8) strawLayerNumber = int(strawNumber / 24);
295
296 if (strawLayerNumber > 7) strawLayerNumber = int(strawNumber / 24) + 8;
297
299 }
300
301 // Finish rotation
302 // Flip straw in layer.
303
304 if (side == 0) strawNumber = 23 - strawNumber;
305
306 // Finish Flipping
307 }
308
309 // Done with corrections
310 // Start mapping from athena identifiers to TRTViewer maps
311 int strawNumberNew = 0;
312
313 if (LayerNumber < 6 && strawLayerNumber > 7) {
314 strawNumberNew = strawNumberNew + (384 * LayerNumber);
315 strawNumberNew = strawNumberNew + 192 + (strawLayerNumber % 8) + (strawNumber * 8);
316 } else if (LayerNumber < 6 && strawLayerNumber < 8) {
317 strawNumberNew = strawNumberNew + (384 * LayerNumber);
318 strawNumberNew = strawNumberNew + (strawLayerNumber % 8) + (strawNumber * 8);
319 } else if (LayerNumber > 5 && strawLayerNumber > 7) {
320 strawNumberNew = strawNumberNew + 2304 + 192 * (LayerNumber - 6);
321 strawNumberNew = strawNumberNew + 192 + (strawLayerNumber % 8) + (8 * strawNumber);
322 } else if (LayerNumber > 5 && strawLayerNumber < 8) {
323 strawNumberNew = strawNumberNew + 2304 + 192 * (LayerNumber - 6);
324 strawNumberNew = strawNumberNew + (strawLayerNumber % 8) + (8 * strawNumber);
325 }
326
327 strawNumber = strawNumberNew;
328
329 if (strawNumber < 0 || strawNumber > s_Straw_max[1] - 1) {
330 ATH_MSG_WARNING("strawNumber = " << strawNumber << " out of range. Will set to 0.");
331 strawNumber = 0;
332 }
333
334 return strawNumber;
335}
336
337//----------------------------------------------------------------------------------//
338float TRTMonitoringRun3ESD_Alg::radToDegrees(float radValue) const {
339//----------------------------------------------------------------------------------//
340 float degreeValue = radValue / M_PI * 180;
341
342 if (degreeValue < 0) degreeValue += 360;
343
344 return degreeValue;
345}
346
347
348// Check for EventBurst: Counts high level hits and returns true if the count is less than m_passEventBurstCut.
349// If m_EventBurstCut is less than zero, returns allways true
350//----------------------------------------------------------------------------------//
352//----------------------------------------------------------------------------------//
353 if (m_EventBurstCut <= 0) return true;
354
355 int nHLHits = 0;
356 TRT_RDO_Container::const_iterator RDO_CollectionBegin = rdoContainer.begin();
357 TRT_RDO_Container::const_iterator RDO_CollectionEnd = rdoContainer.end();
358
359 for (; RDO_CollectionBegin != RDO_CollectionEnd; ++RDO_CollectionBegin) {
360 const InDetRawDataCollection<TRT_RDORawData> *TRT_Collection(*RDO_CollectionBegin);
361
362 if (!TRT_Collection) continue;
363 else {
364 DataVector<TRT_RDORawData>::const_iterator p_rdo = TRT_Collection->begin();
365
366 for (; p_rdo != TRT_Collection->end(); ++p_rdo) {
367 const TRT_LoLumRawData *p_lolum = dynamic_cast<const TRT_LoLumRawData *>(*p_rdo);
368
369 if (!p_lolum) continue;
370
371 if (p_lolum->highLevel()) nHLHits++;
372 }
373 }
374 }
375
376 if (nHLHits > m_EventBurstCut) return false;
377 else return true;
378}
379
380
381// Fill the TRT Track level histograms
382//----------------------------------------------------------------------------------//
383StatusCode TRTMonitoringRun3ESD_Alg::fillTRTTracks(const EventContext& ctx,
384 const xAOD::TrackParticleContainer& trackCollection,
385 const xAOD::TrigDecision* trigDecision,
386 const ComTime* comTimeObject,
387 const xAOD::EventInfo& eventInfo) const {
388//----------------------------------------------------------------------------------//
389 ATH_MSG_VERBOSE("Filling TRT Tracks Histos");
390
391
392 // TProfile
393 auto ValidRawDriftTimeonTrkS_x = Monitored::Scalar<float>("ValidRawDriftTimeonTrkS_x", 0.0);
394 auto ValidRawDriftTimeonTrkS_y = Monitored::Scalar<float>("ValidRawDriftTimeonTrkS_y", 0.0);
395 auto ValidRawDriftTimeonTrkC_x = Monitored::Scalar<float>("ValidRawDriftTimeonTrkC_x", 0.0);
396 auto ValidRawDriftTimeonTrkC_y = Monitored::Scalar<float>("ValidRawDriftTimeonTrkC_y", 0.0);
397 auto HitTronTMapC_x = Monitored::Scalar<float>("HitTronTMapC_x", 0.0);
398 auto HitTronTMapC_y = Monitored::Scalar<float>("HitTronTMapC_y", 0.0);
399 auto HitTronTwEPCMapS_x = Monitored::Scalar<float>("HitTronTwEPCMapS_x", 0.0);
400 auto HitTronTwEPCMapS_y = Monitored::Scalar<float>("HitTronTwEPCMapS_y", 0.0);
401 auto HitTronTwEPCMapC_x = Monitored::Scalar<float>("HitTronTwEPCMapC_x", 0.0);
402 auto HitTronTwEPCMapC_y = Monitored::Scalar<float>("HitTronTwEPCMapC_y", 0.0);
403 auto AvgTroTDetPhi_B_Ar_x = Monitored::Scalar<float>("AvgTroTDetPhi_B_Ar_x", 0.0);
404 auto AvgTroTDetPhi_B_Ar_y = Monitored::Scalar<float>("AvgTroTDetPhi_B_Ar_y", 0.0);
405 auto AvgTroTDetPhi_B_x = Monitored::Scalar<float>("AvgTroTDetPhi_B_x", 0.0);
406 auto AvgTroTDetPhi_B_y = Monitored::Scalar<float>("AvgTroTDetPhi_B_y", 0.0);
407 auto AvgTroTDetPhi_E_Ar_x = Monitored::Scalar<float>("AvgTroTDetPhi_E_Ar_x", 0.0);
408 auto AvgTroTDetPhi_E_Ar_y = Monitored::Scalar<float>("AvgTroTDetPhi_E_Ar_y", 0.0);
409 auto AvgTroTDetPhi_E_x = Monitored::Scalar<float>("AvgTroTDetPhi_E_x", 0.0);
410 auto AvgTroTDetPhi_E_y = Monitored::Scalar<float>("AvgTroTDetPhi_E_y", 0.0);
411 auto NumHoTDetPhi_B_x = Monitored::Scalar<float>("NumHoTDetPhi_B_x", 0.0);
412 auto NumHoTDetPhi_B_y = Monitored::Scalar<float>("NumHoTDetPhi_B_y", 0.0);
413 auto NumHoTDetPhi_E_x = Monitored::Scalar<float>("NumHoTDetPhi_E_x", 0.0);
414 auto NumHoTDetPhi_E_y = Monitored::Scalar<float>("NumHoTDetPhi_E_y", 0.0);
415 auto EvtPhaseDetPhi_B_x = Monitored::Scalar<float>("EvtPhaseDetPhi_B_x", 0.0);
416 auto EvtPhaseDetPhi_B_y = Monitored::Scalar<float>("EvtPhaseDetPhi_B_y", 0.0);
417 auto EvtPhaseDetPhi_E_x = Monitored::Scalar<float>("EvtPhaseDetPhi_E_x", 0.0);
418 auto EvtPhaseDetPhi_E_y = Monitored::Scalar<float>("EvtPhaseDetPhi_E_y", 0.0);
419 auto NTrksperLB_x = Monitored::Scalar<float>("NTrksperLB_x", 0.0);
420 auto NTrksperLB_y = Monitored::Scalar<float>("NTrksperLB_y", 0.0);
421
422
423 // TH1F
424 auto DriftTimeonTrkDist_B = Monitored::Scalar<float>("DriftTimeonTrkDist_B", 0.0);
425 auto DriftTimeonTrkDist_B_Ar = Monitored::Scalar<float>("DriftTimeonTrkDist_B_Ar", 0.0);
426 auto DriftTimeonTrkDist_E_Ar = Monitored::Scalar<float>("DriftTimeonTrkDist_E_Ar", 0.0);
427 auto DriftTimeonTrkDist_E = Monitored::Scalar<float>("DriftTimeonTrkDist_E", 0.0);
428 auto NumTrksDetPhi_B = Monitored::Scalar<float>("NumTrksDetPhi_B", 0.0);
429 auto NumTrksDetPhi_E = Monitored::Scalar<float>("NumTrksDetPhi_E", 0.0);
430 auto Pull_Biased_Barrel = Monitored::Scalar<float>("Pull_Biased_Barrel", 0.0);
431 auto Pull_Biased_EndCap = Monitored::Scalar<float>("Pull_Biased_EndCap", 0.0);
432 auto Residual_B = Monitored::Scalar<float>("Residual_B", 0.0);
433 auto Residual_B_Ar = Monitored::Scalar<float>("Residual_B_Ar", 0.0);
434 auto Residual_B_20GeV = Monitored::Scalar<float>("Residual_B_20GeV", 0.0);
435 auto Residual_B_Ar_20GeV = Monitored::Scalar<float>("Residual_B_Ar_20GeV", 0.0);
436 auto Residual_E = Monitored::Scalar<float>("Residual_E", 0.0);
437 auto Residual_E_Ar = Monitored::Scalar<float>("Residual_E_Ar", 0.0);
438 auto Residual_E_20GeV = Monitored::Scalar<float>("Residual_E_20GeV", 0.0);
439 auto Residual_E_Ar_20GeV = Monitored::Scalar<float>("Residual_E_Ar_20GeV", 0.0);
440 auto Residual_noTubeHits_B = Monitored::Scalar<float>("Residual_noTubeHits_B", 0.0);
441 auto Residual_noTubeHits_B_Ar = Monitored::Scalar<float>("Residual_noTubeHits_B_Ar", 0.0);
442 auto Residual_noTubeHits_B_20GeV = Monitored::Scalar<float>("Residual_noTubeHits_B_20GeV", 0.0);
443 auto Residual_noTubeHits_B_Ar_20GeV = Monitored::Scalar<float>("Residual_noTubeHits_B_Ar_20GeV", 0.0);
444 auto Residual_noTubeHits_E = Monitored::Scalar<float>("Residual_noTubeHits_E", 0.0);
445 auto Residual_noTubeHits_E_Ar = Monitored::Scalar<float>("Residual_noTubeHits_E_Ar", 0.0);
446 auto Residual_noTubeHits_E_20GeV = Monitored::Scalar<float>("Residual_noTubeHits_E_20GeV", 0.0);
447 auto Residual_noTubeHits_E_Ar_20GeV = Monitored::Scalar<float>("Residual_noTubeHits_E_Ar_20GeV", 0.0);
448 auto TimeResidual_B = Monitored::Scalar<float>("TimeResidual_B", 0.0);
449 auto TimeResidual_B_Ar = Monitored::Scalar<float>("TimeResidual_B_Ar", 0.0);
450 auto TimeResidual_E = Monitored::Scalar<float>("TimeResidual_E", 0.0);
451 auto TimeResidual_E_Ar = Monitored::Scalar<float>("TimeResidual_E_Ar", 0.0);
452 auto TimeResidual_noTubeHits_B = Monitored::Scalar<float>("TimeResidual_noTubeHits_B", 0.0);
453 auto TimeResidual_noTubeHits_B_Ar = Monitored::Scalar<float>("TimeResidual_noTubeHits_B_Ar", 0.0);
454 auto TimeResidual_noTubeHits_E = Monitored::Scalar<float>("TimeResidual_noTubeHits_E", 0.0);
455 auto TimeResidual_noTubeHits_E_Ar = Monitored::Scalar<float>("TimeResidual_noTubeHits_E_Ar", 0.0);
456 auto TronTDist_E = Monitored::Scalar<float>("TronTDist_E", 0.0);
457 auto TronTDist_B = Monitored::Scalar<float>("TronTDist_B", 0.0);
458 auto TronTDist_B_Ar = Monitored::Scalar<float>("TronTDist_B_Ar", 0.0);
459 auto TronTDist_E_Ar = Monitored::Scalar<float>("TronTDist_E_Ar", 0.0);
460 auto WireToTrkPosition_B_Ar = Monitored::Scalar<float>("WireToTrkPosition_B_Ar", 0.0);
461 auto WireToTrkPosition_B = Monitored::Scalar<float>("WireToTrkPosition_B", 0.0);
462 auto WireToTrkPosition_E_Ar = Monitored::Scalar<float>("WireToTrkPosition_E_Ar", 0.0);
463 auto WireToTrkPosition_E = Monitored::Scalar<float>("WireToTrkPosition_E", 0.0);
464 auto EvtPhase = Monitored::Scalar<float>("EvtPhase", 0.0);
465 auto Summary = Monitored::Scalar<float>("Summary", 0.0);
466 auto SummaryWeight = Monitored::Scalar<float>("SummaryWeight", 0.0);
467
468 // TH2F
469 auto RtRelation_B_Ar_x = Monitored::Scalar<float>("RtRelation_B_Ar_x", 0.0);
470 auto RtRelation_B_Ar_y = Monitored::Scalar<float>("RtRelation_B_Ar_y", 0.0);
471 auto RtRelation_B_x = Monitored::Scalar<float>("RtRelation_B_x", 0.0);
472 auto RtRelation_B_y = Monitored::Scalar<float>("RtRelation_B_y", 0.0);
473 auto RtRelation_E_Ar_x = Monitored::Scalar<float>("RtRelation_E_Ar_x", 0.0);
474 auto RtRelation_E_Ar_y = Monitored::Scalar<float>("RtRelation_E_Ar_y", 0.0);
475 auto RtRelation_E_x = Monitored::Scalar<float>("RtRelation_E_x", 0.0);
476 auto RtRelation_E_y = Monitored::Scalar<float>("RtRelation_E_y", 0.0);
477 auto EvtPhaseVsTrig_x = Monitored::Scalar<float>("EvtPhaseVsTrig_x", 0.0);
478 auto EvtPhaseVsTrig_y = Monitored::Scalar<float>("EvtPhaseVsTrig_y", 0.0);
479
480 // Initialize a bunch of stuff before looping over the track collection. Fill some basic histograms.
481 const float timeCor = comTimeObject ? comTimeObject->getTime() : 0;
482
483 auto p_trk = trackCollection.begin();
484
485 const Trk::Perigee *mPer = nullptr;
486 const DataVector<const Trk::TrackParameters> *AllTrkPar(nullptr);
488
489 int ntrackstack[2][64];
490 int nTotalTracks = 0;
491 int nTracksB[2] = {0, 0};
492 int nTracksEC[2] = {0, 0};
493 int nTracksEC_B[2] = {0, 0};
494 int nTrksperLB_B = 0;
495 int nTrksperLB_E[2] = {0, 0};
496
497 for (int ibe = 0; ibe < 2; ibe++) {
498 std::fill(ntrackstack[ibe], ntrackstack[ibe] + 64, 0);
499 }
500
501for (; p_trk != trackCollection.end(); ++p_trk) {
502
503 uint8_t tempHitsVariable(0);
504 (*p_trk)->summaryValue(tempHitsVariable, xAOD::SummaryType::numberOfTRTHits);
505 int nTRTHits = unsigned(tempHitsVariable);
506
507
508 if (nTRTHits < m_minTRThits) continue;
509
510 AllTrkPar = ((*p_trk)->track())->trackParameters();
511
512 // Search of MeasuredPerigee in TrackParameters
513 // The following algorithm only finds the First perigee measurement.
514 // As there should be one and only one perigee measurement then this assumption should be valid.
515 // But no check is done to see if there is more than one perigee measurement.
516 for (p_trkpariter = AllTrkPar->begin(); p_trkpariter != AllTrkPar->end(); ++p_trkpariter) {
517 // If track parameter does have a measured perigee then the track parameter is a keeper and break out of the loop
518 if ((mPer = dynamic_cast<const Trk::Perigee *>(*p_trkpariter))) break;
519 }
520
521 if (!mPer) continue;
522
523 float theta = mPer->parameters()[Trk::theta];
524 float p = (mPer->parameters()[Trk::qOverP] != 0.) ? std::abs(1. / (mPer->parameters()[Trk::qOverP])) : 10e7;
525 float pT = (p * std::sin(theta));
526 pT = pT * 1e-3; // GeV
527
528 if (p < m_minP) continue;
529
530 const Trk::TrackStates *trackStates = ((*p_trk)->track())->trackStateOnSurfaces();
531
532 if (trackStates == nullptr) continue;
533
534 Trk::TrackStates::const_iterator TSOSItBegin0 = trackStates->begin();
535 Trk::TrackStates::const_iterator TSOSItBegin = trackStates->begin();
536 Trk::TrackStates::const_iterator TSOSItBeginTemp = trackStates->begin();
537 Trk::TrackStates::const_iterator TSOSItEnd = trackStates->end();
538
539 (*p_trk)->summaryValue(tempHitsVariable, xAOD::SummaryType::numberOfTRTHits);
540 int n_trt_hits = unsigned(tempHitsVariable);
541
542 bool is_pT_over_20GeV = false;
543
544 if (mPer->pT() > 20 * CLHEP::GeV) {
545 is_pT_over_20GeV = true;
546 } else {
547 is_pT_over_20GeV = false;
548 }
549
550 const bool cnst_is_pT_over_20GeV = is_pT_over_20GeV;
551
552 const bool passed_track_preselection = (static_cast<bool>(m_trackSelTool->accept(**p_trk)) || m_isCosmics) &&
553 n_trt_hits >= m_min_trt_hits &&
554 mPer->pT() > (m_isCosmics?m_min_pT.value() : 2.0 * CLHEP::GeV); // Hardcoded cut for pT 2.0 GeV for collision setup
555 if (!passed_track_preselection) continue;
556
557 nTotalTracks++;
558 int checkB[2] = {0, 0};
559 int checkEC[2] = {0, 0};
560 int checkEC_B[2] = {0, 0};
561 int nTRTHitsW[2][2];
562 int nTRTHits_side[2][2];
563 int nTRTHitsW_perwheel[2][18];
564 int hitontrack[2] = {0, 0};
565 int hitontrack_E_side[2] = {0, 0};
566
567 for (int ibe = 0; ibe < 2; ibe++) {
568 for (int iside = 0; iside < 2; iside++) {
569 nTRTHits_side[ibe][iside] = -1;
570 nTRTHitsW[ibe][iside] = 0;
571 }
572 std::fill(nTRTHitsW_perwheel[ibe], nTRTHitsW_perwheel[ibe] + 18, 0);
573 }
574
575 int barrel_ec = 0;
576 int layer_or_wheel = 0;
577 int phi_module = 0;
578 int straw_layer = 0;
579 int straw = 0;
580 int nearest_straw_layer[2] = {100, 100};
581 int nearest_straw[2] = {0, 0};
582 int testLayer[2] = {100, 100};
583 float phi2D[2] = {-100, -100};
584
585 for (TSOSItBeginTemp = TSOSItBegin0; TSOSItBeginTemp != TSOSItEnd; ++TSOSItBeginTemp) {
586 if ((*TSOSItBeginTemp) == nullptr) continue;
587
588 if (! ((*TSOSItBeginTemp)->type(Trk::TrackStateOnSurface::Measurement)) ) continue;
589 const InDet::TRT_DriftCircleOnTrack *trtCircle = dynamic_cast<const InDet::TRT_DriftCircleOnTrack *>((*TSOSItBeginTemp)->measurementOnTrack());
590
591 if (!trtCircle) continue;
592 const Trk::TrackParameters *aTrackParam = dynamic_cast<const Trk::TrackParameters *>((*TSOSItBeginTemp)->trackParameters());
593
594 if (!aTrackParam) continue;
595 Identifier DCoTId = trtCircle->identify();
596 barrel_ec = m_pTRTHelper->barrel_ec(DCoTId);
597 int ibe = std::abs(barrel_ec) - 1;
598 layer_or_wheel = m_pTRTHelper->layer_or_wheel (DCoTId);
599 straw_layer = m_pTRTHelper->straw_layer(DCoTId);
600 straw = m_pTRTHelper->straw(DCoTId);
601
602 // Restrict ourselves to the inner most TRT layers To get detector phi.
603 if (layer_or_wheel >= testLayer[ibe]) continue;
604 testLayer[ibe] = layer_or_wheel;
605
606 if (straw_layer < nearest_straw_layer[ibe]) {
607 nearest_straw_layer[ibe] = straw_layer;
608 nearest_straw[ibe] = straw;
609 const InDetDD::TRT_BaseElement *circleElement = nullptr;
610 circleElement = trtCircle->detectorElement();
611 phi2D[ibe] = radToDegrees(circleElement->strawCenter(nearest_straw[ibe]).phi());
612 circleElement = nullptr;
613 }
614 }
615
616 if (phi2D[0] == -999) {
617 ATH_MSG_DEBUG("Track did not go through inner layer of Barrel.");
618 } else {
619 ATH_MSG_VERBOSE("Track's closest approach is m_layer_or_wheel: " <<
620 testLayer[0] << " m_straw_layer: " <<
621 nearest_straw_layer[0] << " (in the Barrel).");
622 }
623
624 if (phi2D[1] == -999) {
625 ATH_MSG_DEBUG("Track did not go through any inner layer of EndCap A or C.");
626 } else {
627 ATH_MSG_VERBOSE("Track's closest approach is m_layer_or_wheel: " <<
628 testLayer[1] << " m_straw_layer: " <<
629 nearest_straw_layer[1] << " (in the EndCaps).");
630 }
631
632 bool trackfound[2][64];
633
634 for (int i = 0; i < 2; i++) {
635 std::fill(trackfound[i], trackfound[i] + 64, false);
636 }
637
638 for (TSOSItBegin = TSOSItBegin0; TSOSItBegin != TSOSItEnd; ++TSOSItBegin) {
639 // Select a TSOS which is non-empty, measurement type and contains both drift circle and track parameters informations
640 if ((*TSOSItBegin) == nullptr) continue;
641
642 if ( !((*TSOSItBegin)->type(Trk::TrackStateOnSurface::Measurement)) ) continue;
643
644 const InDet::TRT_DriftCircleOnTrack *trtCircle = dynamic_cast<const InDet::TRT_DriftCircleOnTrack *>((*TSOSItBegin)->measurementOnTrack());
645
646 if (!trtCircle) continue;
647
648 const Trk::TrackParameters *aTrackParam = dynamic_cast<const Trk::TrackParameters *>((*TSOSItBegin)->trackParameters());
649
650 if (!aTrackParam) continue;
651
652 Identifier DCoTId = trtCircle->identify();
653 barrel_ec = m_pTRTHelper->barrel_ec(DCoTId);
654 layer_or_wheel = m_pTRTHelper->layer_or_wheel(DCoTId);
655 phi_module = m_pTRTHelper->phi_module(DCoTId);
656 straw_layer = m_pTRTHelper->straw_layer(DCoTId);
657 straw = m_pTRTHelper->straw(DCoTId);
658 int ibe = std::abs(barrel_ec) - 1; // ibe = 0 (Barrel), ibe = 1 (Endcap)
659 int iside = barrel_ec > 0 ? 0 : 1; // iside = 0 (Side A), iside = 1 (Side C)
660 int thisStrawNumber[2] = {-1, -1};
661 int chip[2] = {0, 0};
662
663 if (ibe == 0) {
664 thisStrawNumber[ibe] = strawNumber(straw, straw_layer, layer_or_wheel);
665
666 if (thisStrawNumber[ibe] >= 0 && thisStrawNumber[ibe] < s_Straw_max[ibe]) {
667 chip[ibe] = m_mat_chip_B.at(phi_module).at(thisStrawNumber[ibe]);
668 }
669 } else if (ibe == 1) {
670 thisStrawNumber[ibe] = strawNumberEndCap(straw, straw_layer, layer_or_wheel, phi_module, barrel_ec);
671
672 if (thisStrawNumber[ibe] >= 0 && thisStrawNumber[ibe] < s_Straw_max[ibe]) {
673 chip[ibe] = m_mat_chip_E.at(phi_module).at(thisStrawNumber[ibe]);
674 }
675 } else {
676 thisStrawNumber[ibe] = -1;
677 }
678
679 if (thisStrawNumber[ibe] < 0 || thisStrawNumber[ibe] >= s_Straw_max[ibe]) continue;
680
681 if (checkB[iside] == 0 && ibe == 0) {
682 nTracksB[iside]++;
683 checkB[iside] = 1;
684 }
685
686 if (checkEC[iside] == 0 && ibe == 1) {
687 nTracksEC[iside]++;
688 checkEC[iside] = 1;
689 }
690
691 if (checkEC_B[iside] == 0 && checkB[iside] == 1 && ibe == 1 ) {
692 nTracksEC_B[iside]++;
693 checkEC_B[iside] = 1;
694 }
695
696 Identifier surfaceID;
697 const Trk::MeasurementBase *mesb = (*TSOSItBegin)->measurementOnTrack();
698 surfaceID = trtCircle->identify();
699 const bool isArgonStraw = ( Straw_Gastype( m_sumTool->getStatusHT(surfaceID, ctx) ) == GasType::Ar );
700 // Assume always Xe if m_ArgonXenonSplitter is not enabled, otherwise check the straw status (good is Xe, non-good is Ar)
701 float temp_locr = aTrackParam->parameters()[Trk::driftRadius];
702 TRTCond::RtRelation const *rtr = m_TRTCalDbTool->getRtRelation(surfaceID);
703 int iphi_module = -9999;
704
705 if (iside == 0) iphi_module = phi_module;
706 else if (iside == 1) iphi_module = phi_module + 32;
707
708 if (iphi_module >= 0 && iphi_module < 64) trackfound[ibe][iphi_module] = true;
709 else ATH_MSG_ERROR("Variable iphi_module is out of range!");
710
711 if (((ibe == 0) && (temp_locr < m_DistToStraw)) ||
712 ((ibe == 1) && ((*TSOSItBegin)->type(Trk::TrackStateOnSurface::Measurement) ||
713 (*TSOSItBegin)->type(Trk::TrackStateOnSurface::Outlier) ||
714 (*TSOSItBegin)->type(Trk::TrackStateOnSurface::Hole)) &&
715 (temp_locr < m_DistToStraw))) {
716 if (m_idHelper->is_trt(DCoTId)) {
717 if (ibe == 0) {
718 hitontrack[ibe]++;
719 } else if (ibe == 1) {
720 hitontrack[ibe]++;
721 hitontrack_E_side[iside]++;
722 }
723 }
724 }
725 const InDet::TRT_DriftCircle *RawDriftCircle = dynamic_cast<const InDet::TRT_DriftCircle *>(trtCircle->prepRawData());
726 bool isTubeHit = (mesb->localCovariance()(Trk::locX, Trk::locX) > 1.0) ? 1 : 0;
727 if (RawDriftCircle) {
728 nTRTHits_side[ibe][iside]++;
730
731 const bool driftTimeValid = RawDriftCircle->driftTimeValid();
732
733 if (driftTimeValid) {
734 const float validRawDriftTime = RawDriftCircle->rawDriftTime();
735
736 if (m_doExpert && m_doStraws) {
737 ValidRawDriftTimeonTrkS_x = thisStrawNumber[ibe];
738 ValidRawDriftTimeonTrkS_y = validRawDriftTime;
739 fill("TRTTrackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), ValidRawDriftTimeonTrkS_x, ValidRawDriftTimeonTrkS_y);
740 }
741
742 if (m_doExpert && m_doChips) {
743 ValidRawDriftTimeonTrkC_x = chip[ibe] - 1;
744 ValidRawDriftTimeonTrkC_y = validRawDriftTime;
745 fill("TRTTrackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), ValidRawDriftTimeonTrkC_x, ValidRawDriftTimeonTrkC_y);
746 }
747 }
748
749 if (m_doShift && m_doStraws) {
750 if (ibe == 0) {
751 if (isArgonStraw) {
752 DriftTimeonTrkDist_B_Ar = RawDriftCircle->rawDriftTime();
753 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), DriftTimeonTrkDist_B_Ar);
754 }
755 else {
756 DriftTimeonTrkDist_B = RawDriftCircle->rawDriftTime();
757 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), DriftTimeonTrkDist_B);
758 }
759 } else if (ibe == 1) {
760 if (isArgonStraw) {
761 DriftTimeonTrkDist_E_Ar = RawDriftCircle->rawDriftTime();
762 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), DriftTimeonTrkDist_E_Ar);
763 }
764 else {
765 DriftTimeonTrkDist_E = RawDriftCircle->rawDriftTime();
766 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), DriftTimeonTrkDist_E);
767 }
768 }
769 }
770
771 float locR_err = 0.0;
772 const AmgSymMatrix(5)* b_err = aTrackParam->covariance();
773
774 if (b_err) {
775 if (!Amg::hasPositiveDiagElems(*b_err)) {
776 ATH_MSG_WARNING("Some diagonal element(s) of the covariance matrix is (are) infinite or smaller than / too close to zero or above the covariance cutoff");
777 }
778 else {
779 locR_err = Amg::error(*b_err, Trk::locR);
780 }
781 } else {
782 ATH_MSG_ERROR("Track parameters have no covariance attached.");
783 }
784
785 float loc_err = Amg::error(trtCircle->localCovariance(), Trk::driftRadius);
786 float locR = aTrackParam->parameters()[Trk::driftRadius];
787 float loc = trtCircle->localParameters()[Trk::driftRadius];
788
789 if (isTubeHit) {
790 bool isOK = false;
791 loc = m_drifttool->driftRadius(RawDriftCircle->rawDriftTime(), DCoTId, t0, isOK);
792
793 if ((loc * locR) < 0) loc = -loc;
794 }
795
796 // Calculate Residuals for hit
797 if (m_doShift && m_doStraws) {
798 bool pull_b_fill;
799 double pull_b = -999.;
800 const double diff_loc_err = std::abs(loc_err-locR_err);
801 if ( diff_loc_err > 0 ) {
802 pull_b = (loc - locR) /diff_loc_err ;
803 pull_b_fill = true;
804 }
805 else pull_b_fill = false;
806 const double thist0 = m_TRTCalDbTool->getT0(surfaceID);
807 const double trkdrifttime = (!rtr) ? 0 : rtr->drifttime(std::abs(locR));
808 const double timeresidual = RawDriftCircle->rawDriftTime() - thist0 - trkdrifttime;
809
810 if (ibe == 0) {
811 if (!isTubeHit) {
812 if (pull_b_fill) {
813 Pull_Biased_Barrel = pull_b;
814 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Pull_Biased_Barrel);
815 }
816 }
817
818 if (isArgonStraw) {
819 Residual_B_Ar = loc - locR;
820 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Residual_B_Ar);
821 Residual_noTubeHits_B_Ar = loc - locR;
822 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Residual_noTubeHits_B_Ar);
823
824 if (cnst_is_pT_over_20GeV) {
825 Residual_B_Ar_20GeV = loc - locR;
826 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Residual_B_Ar_20GeV);
827 Residual_noTubeHits_B_Ar_20GeV = loc - locR;
828 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Residual_noTubeHits_B_Ar_20GeV);
829 }
830 TimeResidual_B_Ar = timeresidual;
831 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), TimeResidual_B_Ar);
832 TimeResidual_noTubeHits_B_Ar = timeresidual;
833 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe), TimeResidual_noTubeHits_B_Ar);
834 } else {
835 Residual_B = loc - locR;
836 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Residual_B);
837 Residual_noTubeHits_B = loc - locR;
838 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Residual_noTubeHits_B);
839 TimeResidual_B = timeresidual;
840 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), TimeResidual_B);
841 TimeResidual_noTubeHits_B = timeresidual;
842 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe), TimeResidual_noTubeHits_B);
843
844 if (cnst_is_pT_over_20GeV) {
845 Residual_B_20GeV = loc - locR;
846 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Residual_B_20GeV);
847 Residual_noTubeHits_B_20GeV = loc - locR;
848 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Residual_noTubeHits_B_20GeV);
849 }
850 }
851 } else if (ibe == 1) {
852 if (!isTubeHit) {
853 if (pull_b_fill) {
854 Pull_Biased_EndCap = pull_b;
855 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), Pull_Biased_EndCap);
856 }
857 }
858
859 if (isArgonStraw) {
860 Residual_E_Ar = loc - locR;
861 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), Residual_E_Ar);
862 Residual_noTubeHits_E_Ar = loc - locR;
863 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), Residual_noTubeHits_E_Ar);
864 TimeResidual_E_Ar = timeresidual;
865 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), TimeResidual_E_Ar);
866 TimeResidual_noTubeHits_E_Ar = timeresidual;
867 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), TimeResidual_noTubeHits_E_Ar);
868
869 if (cnst_is_pT_over_20GeV) {
870 Residual_E_Ar_20GeV = loc - locR;
871 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), Residual_E_Ar_20GeV);
872 Residual_noTubeHits_E_Ar_20GeV = loc - locR;
873 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), Residual_noTubeHits_E_Ar_20GeV);
874 }
875 } else {
876 Residual_E = loc - locR;
877 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), Residual_E);
878 Residual_noTubeHits_E = loc - locR;
879 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), Residual_noTubeHits_E);
880 TimeResidual_E = timeresidual;
881 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), TimeResidual_E);
882 TimeResidual_noTubeHits_E = timeresidual;
883 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), TimeResidual_noTubeHits_E);
884
885 if (cnst_is_pT_over_20GeV) {
886 Residual_E_20GeV = loc - locR;
887 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), Residual_E_20GeV);
888 Residual_noTubeHits_E_20GeV = loc - locR;
889 if (!isTubeHit) fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), Residual_noTubeHits_E_20GeV);
890 }
891 }
892 }
893 }
894
895 if (m_doShift) {
896 if (ibe == 0) {
897 if (isArgonStraw) {
898 WireToTrkPosition_B_Ar = locR;
899 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), WireToTrkPosition_B_Ar);
900 } else {
901 WireToTrkPosition_B = locR;
902 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), WireToTrkPosition_B);
903 }
904 } else if (ibe == 1) {
905 if (isArgonStraw) {
906 WireToTrkPosition_E_Ar = locR;
907 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), WireToTrkPosition_E_Ar);
908 } else {
909 WireToTrkPosition_E = locR;
910 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), WireToTrkPosition_E);
911 }
912 }
913 }
914
915 const float LE = (RawDriftCircle->driftTimeBin()) * 3.125;
916 const float EP = timeCor;
917
918 if (m_doShift && m_doStraws) {
919 if (ibe == 0) {
920 if (isArgonStraw) {
921 if (m_isCosmics) {
922 RtRelation_B_Ar_x = LE - EP - t0;
923 RtRelation_B_Ar_y = std::abs(locR);
924 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), RtRelation_B_Ar_x, RtRelation_B_Ar_y);
925 } else {
926 RtRelation_B_Ar_x = LE - t0;
927 RtRelation_B_Ar_y = std::abs(locR);
928 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), RtRelation_B_Ar_x, RtRelation_B_Ar_y);
929 }
930 } else {
931 if (m_isCosmics) {
932 RtRelation_B_x = LE - EP - t0;
933 RtRelation_B_y = std::abs(locR);
934 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), RtRelation_B_x, RtRelation_B_y);
935 } else {
936 RtRelation_B_x = LE - t0;
937 RtRelation_B_y = std::abs(locR);
938 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), RtRelation_B_x, RtRelation_B_y);
939 }
940 }
941 } else if (ibe == 1) {
942 if (isArgonStraw) {
943 if (m_isCosmics) {
944 RtRelation_E_Ar_x = LE - EP - t0;
945 RtRelation_E_Ar_y = std::abs(locR);
946 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), RtRelation_E_Ar_x, RtRelation_E_Ar_y);
947 } else {
948 RtRelation_E_Ar_x = LE - t0;
949 RtRelation_E_Ar_y = std::abs(locR);
950 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), RtRelation_E_Ar_x, RtRelation_E_Ar_y);
951 }
952 } else {
953 if (m_isCosmics) {
954 RtRelation_E_x = LE - EP - t0;
955 RtRelation_E_y = std::abs(locR);
956 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), RtRelation_E_x, RtRelation_E_y);
957 } else {
958 RtRelation_E_x = LE - t0;
959 RtRelation_E_y = std::abs(locR);
960 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), RtRelation_E_x, RtRelation_E_y);
961 }
962 }
963 }
964 }
965
966 const int driftTimeBin = RawDriftCircle->driftTimeBin();
967 const int firstBinHigh = RawDriftCircle->firstBinHigh();
968 const int lastBinHigh = RawDriftCircle->lastBinHigh();
969 const int trailingEdge = RawDriftCircle->trailingEdge();
970 float trailingEdgeScaled = (trailingEdge + 1) * 3.125;
971
972 if (firstBinHigh || lastBinHigh || driftTimeBin > 0 || trailingEdge < 23) nTRTHitsW[ibe][iside]++;
973
974 if ((trailingEdge < 23) &&
975 !(RawDriftCircle->lastBinHigh()) &&
976 !(RawDriftCircle->firstBinHigh())) {
977
978 if (m_doExpert && m_doChips) {
979 HitTronTMapC_x = chip[ibe] - 1;
980 HitTronTMapC_y = trailingEdgeScaled;
981 fill("TRTTrackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitTronTMapC_x, HitTronTMapC_y);
982 }
983
984 if (m_doExpert && m_doStraws) {
985 HitTronTwEPCMapS_x = thisStrawNumber[ibe];
986 HitTronTwEPCMapS_y = trailingEdgeScaled - timeCor;
987 fill("TRTTrackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitTronTwEPCMapS_x, HitTronTwEPCMapS_y);
988 }
989
990 if (m_doExpert && m_doChips) {
991 HitTronTwEPCMapC_x = chip[ibe] - 1;
992 HitTronTwEPCMapC_y = trailingEdgeScaled - timeCor;
993 fill("TRTTrackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitTronTwEPCMapC_x, HitTronTwEPCMapC_y);
994 }
995
996 if (m_doShift && m_doStraws) {
997 if (RawDriftCircle->driftTimeValid()) {
998 if (ibe == 0) {
999 if (isArgonStraw) {
1000 TronTDist_B_Ar = trailingEdgeScaled;
1001 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), TronTDist_B_Ar);
1002 AvgTroTDetPhi_B_Ar_x = phi2D[ibe];
1003 AvgTroTDetPhi_B_Ar_y = trailingEdgeScaled;
1004 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), AvgTroTDetPhi_B_Ar_x, AvgTroTDetPhi_B_Ar_y);
1005 } else {
1006 TronTDist_B = trailingEdgeScaled;
1007 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), TronTDist_B);
1008 AvgTroTDetPhi_B_x = phi2D[ibe];
1009 AvgTroTDetPhi_B_y = trailingEdgeScaled;
1010 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), AvgTroTDetPhi_B_x, AvgTroTDetPhi_B_y);
1011 }
1012 } else if (ibe == 1) {
1013 if (isArgonStraw) {
1014 TronTDist_E_Ar = trailingEdgeScaled;
1015 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), TronTDist_E_Ar);
1016 AvgTroTDetPhi_E_Ar_x = phi2D[ibe];
1017 AvgTroTDetPhi_E_Ar_y = trailingEdgeScaled;
1018 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), AvgTroTDetPhi_E_Ar_x, AvgTroTDetPhi_E_Ar_y);
1019 } else {
1020 TronTDist_E = trailingEdgeScaled;
1021 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), TronTDist_E);
1022 AvgTroTDetPhi_E_x = phi2D[ibe];
1023 AvgTroTDetPhi_E_y = trailingEdgeScaled;
1024 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), AvgTroTDetPhi_E_x, AvgTroTDetPhi_E_y);
1025 }
1026 }
1027 }
1028 }
1029 }
1030 }
1031 }
1032
1033 // ToDo: work on the part below
1034 for (int ibe = 0; ibe < 2; ibe++) {
1035 for (int i = 0; i < 64; i++)
1036 if (trackfound[ibe][i])
1037 ntrackstack[ibe][i]++;
1038
1039 if (m_doShift) {
1040 if (ibe == 0) {
1041 if (hitontrack[ibe] >= m_minTRThits) {
1042 NumHoTDetPhi_B_x = phi2D[ibe];
1043 NumHoTDetPhi_B_y = hitontrack[ibe];
1044 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), NumHoTDetPhi_B_x, NumHoTDetPhi_B_y);
1045 }
1046 }
1047
1048 if (ibe == 1) {
1049 if (hitontrack_E_side[0] >= m_minTRThits) {
1050 NumHoTDetPhi_E_x = phi2D[ibe];
1051 NumHoTDetPhi_E_y = hitontrack_E_side[0];
1052 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+"0", NumHoTDetPhi_E_x, NumHoTDetPhi_E_y);
1053 }
1054
1055 if (hitontrack_E_side[1] >= m_minTRThits) {
1056 NumHoTDetPhi_E_x = phi2D[ibe];
1057 NumHoTDetPhi_E_y = hitontrack_E_side[1];
1058 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+"1", NumHoTDetPhi_E_x, NumHoTDetPhi_E_y);
1059 }
1060 }
1061 }
1062
1063 if (phi2D[ibe] < 0) continue;
1064
1065 if (m_doShift) {
1066 if (ibe == 0) {
1067 if (nTRTHitsW[ibe][0] + nTRTHitsW[ibe][1] > 0) {
1068 NumTrksDetPhi_B = phi2D[ibe];
1069 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), NumTrksDetPhi_B);
1070 }
1071 } else if (ibe == 1) {
1072 if (nTRTHitsW[ibe][0] > 0) {
1073 NumTrksDetPhi_E = phi2D[ibe];
1074 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+"0", NumTrksDetPhi_E);
1075 }
1076
1077 if (nTRTHitsW[ibe][1] > 0) {
1078 NumTrksDetPhi_E = phi2D[ibe];
1079 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+"1", NumTrksDetPhi_E);
1080 }
1081 }
1082 }
1083
1084 if (ibe == 0) {
1085 if ((nTRTHitsW[ibe][0] + nTRTHitsW[ibe][1]) > 0) {
1086 nTrksperLB_B++;
1087 }
1088 if (comTimeObject) {
1089 if (m_doShift && (phi2D[ibe] > 0) && (std::abs(timeCor) > 1e-8)) {
1090 EvtPhaseDetPhi_B_x = phi2D[ibe];
1091 EvtPhaseDetPhi_B_y = timeCor;
1092 fill("ShiftTRTTrackHistograms"+std::to_string(ibe), EvtPhaseDetPhi_B_x, EvtPhaseDetPhi_B_y);
1093 }
1094 }
1095 } else if (ibe == 1) {
1096 for (int iside = 0; iside < 2; iside++) {
1097 if (nTRTHitsW[ibe][iside] > 0) nTrksperLB_E[iside]++;
1098 if (comTimeObject) {
1099 if (nTRTHits_side[ibe][iside] > 5 && (std::abs(timeCor)
1100 > 1e-8)) {
1101 if (m_doShift) {
1102 EvtPhaseDetPhi_E_x = phi2D[ibe];
1103 EvtPhaseDetPhi_E_y = timeCor;
1104 fill("ShiftTRTTrackHistograms"+std::to_string(ibe)+std::to_string(iside), EvtPhaseDetPhi_E_x, EvtPhaseDetPhi_E_y);
1105 }
1106 }
1107 }
1108 }
1109 }
1110 }
1111 }
1112
1113 if (comTimeObject) {
1114 static const std::string histoName{"ShiftTRTTrackHistograms0"};
1115 if (std::abs(timeCor) > 1e-8) {
1116 if (m_doShift) {
1117 EvtPhase = timeCor;
1118 fill(histoName, EvtPhase);
1119 }
1120
1121 if (m_doShift && trigDecision) {
1122 std::vector<int> trigid;
1123 trigid.clear(); // Trigger ID
1124 // Get bits for trigger after veto
1125 std::vector<unsigned int> level1TAV = trigDecision->tav();
1126
1127 for (unsigned int j = 0; j < 8 && j < level1TAV.size(); ++j) {
1128 for (unsigned int i = 0; i < 32; ++i) {
1129 if ((level1TAV[j] >> i) & 0x1) {
1130 trigid.push_back(i + (j % 8) * 32); // Found the ID
1131 }
1132 }
1133 }
1134
1135 for (unsigned int j = 0; j < trigid.size(); ++j) {
1136 EvtPhaseVsTrig_x = timeCor;
1137 EvtPhaseVsTrig_y = trigid[j];
1138 fill(histoName, EvtPhaseVsTrig_x, EvtPhaseVsTrig_y);
1139 }
1140 }
1141 }
1142 }
1143
1144 if (m_doShift) {
1145 Summary = 0;
1146 SummaryWeight = 1.;
1147 fill("SmryHistograms", SummaryWeight, Summary);
1148
1149 if (m_doTracksMon) {
1150 Summary = 1;
1151 SummaryWeight = nTotalTracks;
1152 fill("SmryHistograms", SummaryWeight, Summary);
1153 Summary = 2;
1154 SummaryWeight = nTracksB[0];
1155 fill("SmryHistograms", SummaryWeight, Summary);
1156 Summary = 3;
1157 SummaryWeight = nTracksB[1];
1158 fill("SmryHistograms", SummaryWeight, Summary);
1159 Summary = 4;
1160 SummaryWeight = nTracksEC[0];
1161 fill("SmryHistograms", SummaryWeight, Summary);
1162 Summary = 5;
1163 SummaryWeight = nTracksEC[1];
1164 fill("SmryHistograms", SummaryWeight, Summary);
1165 Summary = 6;
1166 SummaryWeight = nTracksEC_B[0];
1167 fill("SmryHistograms", SummaryWeight, Summary);
1168 Summary = 7;
1169 SummaryWeight = nTracksEC_B[1];
1170 fill("SmryHistograms", SummaryWeight, Summary);
1171 }
1172
1173 const unsigned int lumiBlock = eventInfo.lumiBlock();
1174 ATH_MSG_VERBOSE("This is lumiblock : " << lumiBlock);
1175 int lastLumiBlock = -99; // ToDo - last lumiblock calculation is not correct
1176 if ((int)lumiBlock != lastLumiBlock) {
1177 lastLumiBlock = lumiBlock;
1178 }
1179 float evtLumiBlock = 1.;
1180 float lumiBlockScale = (evtLumiBlock > 0) ? (1. / evtLumiBlock) : 0;
1181
1182 if (m_doTracksMon && evtLumiBlock > 0) {
1183 NTrksperLB_x = lastLumiBlock;
1184 NTrksperLB_y = (float)nTrksperLB_B * lumiBlockScale;
1185 fill("ShiftTRTTrackHistograms0", NTrksperLB_x, NTrksperLB_y);
1186
1187 for (int iside = 0; iside < 2; iside++) {
1188 NTrksperLB_x = lastLumiBlock;
1189 NTrksperLB_y = (float)nTrksperLB_E[iside] * lumiBlockScale;
1190 fill("ShiftTRTTrackHistograms1"+std::to_string(iside), NTrksperLB_x, NTrksperLB_y);
1191 }
1192
1193 nTrksperLB_B = 0;
1194
1195 for (int iside = 0; iside < 2; iside++) {
1196 nTrksperLB_E[iside] = 0;
1197 }
1198 }
1199 }
1200
1201 ATH_MSG_DEBUG("end of event and lumi block");
1202 //number of events in lumiblock counter setted to zero since it is end of the run or the lumiblock
1203
1204 return StatusCode::SUCCESS;
1205}
1206
1207//----------------------------------------------------------------------------------//
1209 const xAOD::EventInfo& eventInfo, const EventContext& ctx) const {
1210//----------------------------------------------------------------------------------//
1211
1212 auto IntLum = Monitored::Scalar<float>("IntLum", 0.0);
1213 auto LBvsLum = Monitored::Scalar<float>("LBvsLum", 0.0);
1214 auto LBvsTime_x = Monitored::Scalar<float>("LBvsTime_x", 0.0);
1215 auto LBvsTime_y = Monitored::Scalar<float>("LBvsTime_y", 0.0);
1216 auto IntLumWeight = Monitored::Scalar<float>("IntLumWeight", 0.0);
1217 auto LBvsLumWeight = Monitored::Scalar<float>("LBvsLumWeight", 0.0);
1218
1219 int lumiBlockNumber;
1220 int timeStamp;
1221 lumiBlockNumber = eventInfo.lumiBlock();
1222 timeStamp = eventInfo.timeStamp();
1223
1224 int runNumber;
1225 runNumber = eventInfo.runNumber();
1226 // get Online Luminosity
1227 double intLum = (lbDuration(ctx) * lbAverageLuminosity(ctx));
1228 IntLum = 0.5;
1229 IntLumWeight = intLum;
1230 fill("SmryHistograms", IntLumWeight, IntLum);
1231 LBvsLum = lumiBlockNumber;
1232 LBvsLumWeight = intLum;
1233 fill("SmryHistograms", LBvsLumWeight, LBvsLum);
1234 LBvsTime_x = lumiBlockNumber;
1235 LBvsTime_y = timeStamp;
1236 fill("SmryHistograms", LBvsTime_x, LBvsTime_y);
1237
1238 ATH_MSG_VERBOSE("Filling TRT Aging Histos");
1239
1240 auto Trackr_HT = Monitored::Scalar<float>("Trackr_HT", 0.0);
1241 auto Trackr_All = Monitored::Scalar<float>("Trackr_All", 0.0);
1242 auto Trackz_HT = Monitored::Scalar<float>("Trackz_HT", 0.0);
1243 auto Trackz_All = Monitored::Scalar<float>("Trackz_All", 0.0);
1244
1245 auto p_trk = trackCollection.begin();
1246 const Trk::Perigee *perigee = nullptr;
1247 const DataVector<const Trk::TrackParameters> *AllTrkPar(nullptr);
1249
1250 for (; p_trk != trackCollection.end(); ++p_trk) {
1251 AllTrkPar = ((*p_trk)->track())->trackParameters();
1252
1253 for (p_trkpariter = AllTrkPar->begin(); p_trkpariter != AllTrkPar->end(); ++p_trkpariter) {
1254 if ((perigee = dynamic_cast<const Trk::Perigee *>(*p_trkpariter))) break;
1255 }
1256
1257 // If you went through all of the track parameters and found no perigee mearsurement
1258 // then something is wrong with the track and so don't use the track.
1259 // i.e. continue to the next track.
1260 if (!perigee) {
1261 ATH_MSG_DEBUG("No perigee mearsurement found for the track. This entry will not be propogated to aging histograms.");
1262 continue;
1263 }
1264
1265 float track_eta = perigee->eta();
1266 float track_p = (perigee->parameters()[Trk::qOverP] != 0.) ? std::abs(1. / (perigee->parameters()[Trk::qOverP])) : 10e7;
1267 const Trk::TrackStates *trackStates = ((*p_trk)->track())->trackStateOnSurfaces();
1268
1269 if (trackStates == nullptr) continue;
1270
1271 Trk::TrackStates::const_iterator TSOSItBegin = trackStates->begin();
1272 Trk::TrackStates::const_iterator TSOSItEnd = trackStates->end();
1273
1274 uint8_t tempHitsVariable = 0;
1275 (*p_trk)->summaryValue(tempHitsVariable, xAOD::SummaryType::numberOfTRTHits);
1276 int trt_hits = unsigned(tempHitsVariable);
1277
1278 const bool passed_track_preselection = (static_cast<bool>(m_trackSelTool->accept(**p_trk)) || m_isCosmics) &&
1279 trt_hits >= 6. &&
1280 std::abs(track_p) >= 5000.;
1281
1282 if (!passed_track_preselection) continue;
1283
1284 // Now we have hit informations
1285 const Trk::TrackStates *track_states = ((*p_trk)->track())->trackStateOnSurfaces();
1286
1287 if (track_states) {
1288 ATH_MSG_DEBUG("This track has " << track_states->size() << " track states on surface.");
1289 } else {
1290 ATH_MSG_DEBUG("This track has null track states on surface.");
1291 continue;
1292 }
1293
1294 int barrel_ec_side = 0;
1295 int layer_or_wheel = 0;
1296 int phi_module = 0;
1297 int straw_layer = 0;
1298
1299 for (; TSOSItBegin != TSOSItEnd; ++TSOSItBegin) {
1300 if ((*TSOSItBegin) == nullptr) continue;
1301 if ( !((*TSOSItBegin)->type(Trk::TrackStateOnSurface::Measurement)) ) continue;
1302
1303 const InDet::TRT_DriftCircleOnTrack *trtCircle = dynamic_cast<const InDet::TRT_DriftCircleOnTrack *>((*TSOSItBegin)->measurementOnTrack());
1304 const Trk::TrackParameters *aTrackParam = dynamic_cast<const Trk::TrackParameters *>((*TSOSItBegin)->trackParameters());
1305
1306 if (!trtCircle) continue;
1307 if (!aTrackParam) continue;
1308
1309
1310 Identifier DCoTId = trtCircle->identify();
1311 barrel_ec_side = m_pTRTHelper->barrel_ec(DCoTId);
1312 layer_or_wheel = m_pTRTHelper->layer_or_wheel(DCoTId);
1313 phi_module = m_pTRTHelper->phi_module(DCoTId);
1314 straw_layer = m_pTRTHelper->straw_layer(DCoTId);
1315 int Ba_Ec = abs(barrel_ec_side) - 1; // Ba_Ec: 0 is barrel, 1 is Endcap
1316 int Side = barrel_ec_side > 0 ? 0 : 1; // Side : 0 is side_A, 1 is side_C
1317 double xPos = trtCircle->globalPosition().x(); // Global x coordinate
1318 double yPos = trtCircle->globalPosition().y(); // Global y coordinate
1319 double zPos = trtCircle->globalPosition().z(); // Global z coordinate
1320 double RPos = sqrt(xPos * xPos + yPos * yPos);
1321 Identifier surfaceID;
1322 surfaceID = trtCircle->identify();
1323 // Assume always Xe if m_ArgonXenonSplitter is not enabled, otherwise check the straw status (good is Xe, non-good is Ar)
1324 const InDet::TRT_DriftCircle *RawDriftCircle = dynamic_cast<const InDet::TRT_DriftCircle *>(trtCircle->prepRawData());
1325
1326 if (!RawDriftCircle) { //coverity 25097
1327 // This shouldn't happen in normal conditions because trtCircle is a TRT_DriftCircleOnTrack object
1328 ATH_MSG_WARNING("RawDriftCircle object returned null");
1329 continue;
1330 }
1331
1332 int middleHTbit = RawDriftCircle->getWord() & 0x00020000;
1333 //0x00020000 = 0000 0000 0000 0000 0000 0010 0000 0000 0000 0000
1334 bool is_middleHTbit_high = (middleHTbit != 0);
1335 // bool isHighLevel= RawDriftCircle->highLevel();
1336 bool isHighLevel = is_middleHTbit_high; // Hardcoded HT Middle Bit
1337 bool shortStraw = false;
1338 int InputBar = 0;
1339
1340 if (std::abs(track_eta) < 2. && Ba_Ec == 0.) {
1341 if ((layer_or_wheel == 0) && (phi_module < 4 || (phi_module > 7 && phi_module < 12) || (phi_module > 15 && phi_module < 20) || (phi_module > 23 && phi_module < 28))) InputBar = 1;
1342 else if ((runNumber >= 296939) && (layer_or_wheel == 0) && (phi_module > 27)) InputBar = 1;
1343 else if (layer_or_wheel == 0)
1344 InputBar = 0;
1345 else if ((layer_or_wheel == 1) && ((phi_module > 1 && phi_module < 6) || (phi_module > 9 && phi_module < 14) || (phi_module > 17 && phi_module < 22) || (phi_module > 25 && phi_module < 30)))
1346 InputBar = 1;
1347 else if (layer_or_wheel == 1)
1348 InputBar = 0;
1349 else if (layer_or_wheel == 2 && phi_module % 2 != 0)
1350 InputBar = 1;
1351 else if (layer_or_wheel == 2)
1352 InputBar = 0;
1353 else {
1354 ATH_MSG_WARNING("Should not pass here");
1355 continue;
1356 }
1357
1358 if ((layer_or_wheel == 0) && straw_layer < 9.)
1359 shortStraw = true;
1360 }
1361
1362 // Fill Barrel Plots
1363 if ((!shortStraw) && (Ba_Ec == 0)) {
1364 Trackz_All = zPos;
1365 fill("TRTAgingHistograms0"+std::to_string(layer_or_wheel)+std::to_string(InputBar), Trackz_All);
1366 if (isHighLevel) {
1367 Trackz_HT = zPos;
1368 fill("TRTAgingHistograms"+std::to_string(Ba_Ec)+std::to_string(layer_or_wheel)+std::to_string(InputBar), Trackz_HT);
1369 }
1370 }
1371
1372 if (shortStraw) {
1373 if (zPos > 0.) {
1374 Trackz_All = zPos;
1375 fill("TRTAgingHistograms"+std::to_string(Ba_Ec)+"3"+std::to_string(InputBar), Trackz_All);
1376 if (isHighLevel) {
1377 Trackz_HT = zPos;
1378 fill("TRTAgingHistograms"+std::to_string(Ba_Ec)+"3"+std::to_string(InputBar), Trackz_HT);
1379 }
1380 } else {
1381 Trackz_All = zPos;
1382 fill("TRTAgingHistograms"+std::to_string(Ba_Ec)+"4"+std::to_string(InputBar), Trackz_All);
1383
1384 if (isHighLevel) {
1385 Trackz_HT = zPos;
1386 fill("TRTAgingHistograms"+std::to_string(Ba_Ec)+"4"+std::to_string(InputBar), Trackz_HT);
1387 }
1388 }
1389 }
1390
1391 // End of Barrel plots, moving to Endcap plots
1392 int WType = -1;
1393
1394 if ((Ba_Ec == 1) && (layer_or_wheel < 6) &&
1395 ((straw_layer > 3 && straw_layer < 8) ||
1396 (straw_layer > 11))) {
1397 WType = 0;
1398 }
1399 if ((Ba_Ec == 1) && (layer_or_wheel >= 6) &&
1400 (straw_layer > 3)) {
1401 WType = 3;
1402 }
1403 if ((Ba_Ec == 1) && (layer_or_wheel < 6) &&
1404 ((straw_layer > -1 && straw_layer < 4) ||
1405 (straw_layer > 7 && straw_layer < 12))) {
1406 WType = 2;
1407 }
1408 if ((Ba_Ec == 1) && (layer_or_wheel >= 6) &&
1409 ((straw_layer > -1 && straw_layer < 4))) {
1410 WType = 1;
1411 }
1412
1413 if (WType < 0 && Ba_Ec == 1) { // Coverity CID 25096
1414 ATH_MSG_WARNING("The variable \"WType\" is less than zero!.");
1415 continue;
1416 }
1417
1418 if (Ba_Ec == 1) {
1419 Trackr_All = RPos;
1420 fill("TRTAgingHistograms"+std::to_string(Ba_Ec)+std::to_string(WType)+std::to_string(Side), Trackr_All);
1421 if (isHighLevel) {
1422 Trackr_HT = RPos;
1423 fill("TRTAgingHistograms"+std::to_string(Ba_Ec)+std::to_string(WType)+std::to_string(Side), Trackr_HT);
1424 }
1425 }
1426 }
1427 }
1428
1429 return StatusCode::SUCCESS;
1430}
1431
1432
1433StatusCode TRTMonitoringRun3ESD_Alg::fillHistograms( const EventContext& ctx ) const {
1434 using namespace Monitored;
1435 bool passEventBurst = true;
1436
1437 // Declare the quantities which should be monitored
1438
1439 // Set the values of the monitored variables for the event
1440
1441 ATH_MSG_VERBOSE("Monitoring Histograms being filled");
1442
1446
1447 if (!xAODEventInfo.isValid()) {
1448 ATH_MSG_ERROR("Could not find event info object " << m_xAODEventInfoKey.key() <<
1449 " in store");
1450 return StatusCode::FAILURE;
1451 }
1452
1453 if (m_doTracksMon) {
1454 if (!trackCollection.isValid()) {
1455 ATH_MSG_ERROR("Could not find track collection " << m_trackCollectionKey.key() <<
1456 " in store");
1457 return StatusCode::FAILURE;
1458 }
1459 const xAOD::TrigDecision* trigDecision = nullptr;
1460 if (! m_trigDecisionKey.empty()) {
1461 trigDecision = SG::get(m_trigDecisionKey, ctx);
1462 if (!trigDecision) {
1463 ATH_MSG_INFO("Could not find trigger decision object " << m_trigDecisionKey.key() <<
1464 " in store");
1465 }
1466 }
1467 const ComTime *comTimeObject=nullptr;
1468 if (!m_comTimeObjectKey.empty()) {
1469 SG::ReadHandle<ComTime> tmp_comTimeObject(m_comTimeObjectKey, ctx);
1470 if (!tmp_comTimeObject.isValid()) {
1471 // NOTE: failing to retrieve ComTime from store for some reason
1472 ATH_MSG_DEBUG("Could not find com time object " << m_comTimeObjectKey.key() << " in store" );
1473 }
1474 else {
1475 comTimeObject = tmp_comTimeObject.cptr();
1476 }
1477 }
1478 ATH_CHECK( fillTRTTracks(ctx, *trackCollection, trigDecision, comTimeObject, *xAODEventInfo) );
1479 }
1480
1481 if (!m_doTracksMon) {
1482 if (!trackCollection.isValid()) {
1483 ATH_MSG_ERROR("Could not find track collection " << m_trackCollectionKey.key() <<
1484 " in store");
1485 return StatusCode::FAILURE;
1486 }
1487 }
1488
1489 if (passEventBurst) { // ESD files does not have an RDO container to pass event burst, what to do?
1490 ATH_CHECK( fillTRTHighThreshold(*trackCollection, *xAODEventInfo, ctx) );
1491 }
1492
1493
1494
1495 return StatusCode::SUCCESS;
1496}
#define M_PI
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
An STL vector of pointers that by default owns its pointed-to elements.
#define AmgSymMatrix(dim)
abstract interface to TRT calibration constants
Abstract interface to information on straws electronic grouping.
static Double_t t0
This is an Identifier helper class for the TRT subdetector.
InDetRawDataContainer< InDetRawDataCollection< TRT_RDORawData > > TRT_RDO_Container
const ServiceHandle< StoreGateSvc > & detStore() const
virtual StatusCode initialize() override
initialize
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
double getTime() const
Definition ComTime.h:44
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
const_iterator end() const
return const_iterator for end of container
const_iterator begin() const
return const_iterator for first entry
This is a "hash" representation of an Identifier.
Virtual base class of TRT readout elements.
unsigned int nStraws() const
Number of straws in the element.
const Amg::Vector3D & strawCenter(int straw) const
Straw Surface: Local -> global transform of the straw via integer.
Represents 'corrected' measurements from the TRT (for example, corrected for wire sag).
virtual const InDetDD::TRT_BaseElement * detectorElement() const override final
returns the detector element, assoicated with the PRD of this class
virtual const TRT_DriftCircle * prepRawData() const override final
returns the PrepRawData - is a TRT_DriftCircle in this scope
virtual const Amg::Vector3D & globalPosition() const override final
return the global position of this RIO_OnTrack
unsigned int getWord() const
returns the TRT dataword
bool driftTimeValid() const
return true if the corrected drift time is OK
int driftTimeBin() const
returns the leading edge bin defined as in TRT_LoLumRawData to be the first 0-1 transition
bool lastBinHigh() const
returns true if the last bin is high
bool firstBinHigh() const
returns true if the first bin is high
double rawDriftTime() const
returns the raw driftTime
int trailingEdge() const
returns the trailing edge bin
Declare a monitored scalar variable.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
Base class for rt-relations in the TRT.
Definition RtRelation.h:27
virtual float drifttime(float radius) const =0
drifttime for given radius
ToolHandle< InDet::IInDetTrackSelectionTool > m_trackSelTool
float radToDegrees(float radValue) const
SG::ReadHandleKey< xAOD::TrigDecision > m_trigDecisionKey
int strawNumberEndCap(int strawNumber, int strawLayerNumber, int LayerNumber, int phi_stack, int side) const
const AtlasDetectorID * m_idHelper
Gaudi::Property< int > m_min_trt_hits
Gaudi::Property< bool > m_doStraws
Gaudi::Property< float > m_min_pT
SG::ReadHandleKey< InDetTimeCollection > m_TRT_BCIDCollectionKey
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
ToolHandle< Trk::ITrackSummaryTool > m_TrackSummaryTool
bool checkEventBurst(const TRT_RDO_Container &rdoContainer) const
std::vector< std::vector< unsigned char > > m_mat_chip_E
Gaudi::Property< int > m_minTRThits
Gaudi::Property< bool > m_doShift
StatusCode fillTRTHighThreshold(const xAOD::TrackParticleContainer &trackCollection, const xAOD::EventInfo &eventInfo, const EventContext &ctx) const
Gaudi::Property< float > m_DistToStraw
virtual StatusCode initialize() override
initialize
std::vector< std::vector< unsigned char > > m_mat_chip_B
ToolHandle< ITRT_CalDbTool > m_TRTCalDbTool
Gaudi::Property< float > m_minP
ServiceHandle< ITRT_StrawNeighbourSvc > m_TRTStrawNeighbourSvc
SG::ReadHandleKey< xAOD::EventInfo > m_xAODEventInfoKey
int strawNumber(int strawNumber, int strawlayerNumber, int LayerNumber) const
SG::ReadHandleKey< ComTime > m_comTimeObjectKey
Gaudi::Property< bool > m_doExpert
Gaudi::Property< bool > m_doTracksMon
ToolHandle< ITRT_DriftFunctionTool > m_drifttool
TRTMonitoringRun3ESD_Alg(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< bool > m_doChips
const InDetDD::TRT_DetectorManager * m_mgr
int strawLayerNumber(int strawLayerNumber, int LayerNumber) const
GasType Straw_Gastype(int stat) const
StatusCode fillTRTTracks(const EventContext &ctx, const xAOD::TrackParticleContainer &trackCollection, const xAOD::TrigDecision *trigDecision, const ComTime *comTimeObject, const xAOD::EventInfo &eventInfo) const
ToolHandle< ITRT_StrawStatusSummaryTool > m_sumTool
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackCollectionKey
virtual bool highLevel() const override final
This class is the pure abstract base class for all fittable tracking measurements.
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
const Amg::MatrixX & localCovariance() const
Interface method to get the localError.
double eta() const
Access method for pseudorapidity - from momentum.
double pT() const
Access method for transverse momentum.
Identifier identify() const
return the identifier -extends MeasurementBase
@ 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 ...
@ Hole
A hole on the track - this is defined in the following way.
uint32_t lumiBlock() const
The current event's luminosity block number.
uint32_t timeStamp() const
POSIX time in seconds from 1970. January 1st.
uint32_t runNumber() const
The current event's run number.
const std::vector< uint32_t > & tav() const
Get the Trigger After Veto bits.
int trailingEdge(unsigned int m_word)
Definition driftCircle.h:64
int driftTimeBin(unsigned int m_word)
Definition driftCircle.h:50
bool lastBinHigh(unsigned int m_word)
bool firstBinHigh(unsigned int m_word)
virtual float lbAverageLuminosity(const EventContext &ctx) const
Calculate average luminosity (in ub-1 s-1 => 10^30 cm-2 s-1).
virtual double lbDuration(const EventContext &ctx) const
Calculate the duration of the luminosity block (in seconds).
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
bool hasPositiveDiagElems(const AmgSymMatrix(N) &mat)
Returns true if all diagonal elements of the covariance matrix are finite aka sane in the above defin...
Generic monitoring tool for athena components.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
DataVector< const Trk::TrackStateOnSurface > TrackStates
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ driftRadius
trt, straws
Definition ParamDefs.h:53
@ locX
Definition ParamDefs.h:37
@ locR
Definition ParamDefs.h:44
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
ParametersBase< TrackParametersDim, Charged > TrackParameters
Definition index.py:1
STL namespace.
EventInfo_v1 EventInfo
Definition of the latest event info version.
TrigDecision_v1 TrigDecision
Define the latest version of the trigger decision class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
@ numberOfTRTHits
number of TRT hits [unit8_t].
void fill(H5::Group &out_file, size_t iterations)