ATLAS Offline Software
SCTHitEffMonTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
8 // Athena
13 #include "StoreGate/ReadHandle.h"
14 
15 // InDet
17 #include "InDetIdentifier/SCT_ID.h"
18 #include "InDetIdentifier/TRT_ID.h"
20 // Conditions
24 
26 
27 // Track
28 #include "TrkSurfaces/Surface.h"
31 
33 
34 // SCT
35 #include "SCTHitEffMonTool.h"
36 #include "SCT_NameFormatter.h"
38 
39 // ROOT
40 #include "TH2I.h"
41 #include "TProfile2D.h"
42 #include "TProfile.h"
43 #include "TGraphErrors.h"
44 
45 // std and STL includes
46 #include <algorithm>
47 #include <array>
48 #include <cmath>
49 #include <limits> // std::numeric_limits
50 #include <memory>
51 #include <sstream>
52 
53 using namespace SCT_Monitoring;
54 using std::ostringstream;
55 using std::string;
56 
57 namespace {// anonymous namespace for functions at file scope
58  static const bool testOffline(false);
59 
60  static const string histogramPath[N_REGIONS_INC_GENERAL] = {
61  "SCT/SCTEC/eff", "SCT/SCTB/eff", "SCT/SCTEA/eff", "SCT/GENERAL/eff"
62  };
63  static const string histogramPathRe[N_REGIONS] = {
64  "SCT/SCTEC/eff/perLumiBlock", "SCT/SCTB/eff/perLumiBlock", "SCT/SCTEA/eff/perLumiBlock"
65  };
66 
67  template< typename T > Identifier
68  surfaceOnTrackIdentifier(const T& tsos, const bool useTrackParameters = true) {
69  Identifier result; // default constructor produces invalid value
70  const Trk::MeasurementBase* mesb{tsos->measurementOnTrack()};
71 
72  if (mesb and mesb->associatedSurface().associatedDetectorElement()) {
73  result = mesb->associatedSurface().associatedDetectorElement()->identify();
74  } else if (useTrackParameters and tsos->trackParameters()) {
75  result = tsos->trackParameters()->associatedSurface().associatedDetectorElementIdentifier();
76  }
77  return result;
78  }
79 
80  constexpr double radianDegrees{180. / M_PI};
81 
82  static const double stripWidth{79.95e-3}; // in mm
83 
84  // Booking efficiency maps
85  static const std::array < TString, 3 > mapName = {
86  "m_eff_", "eff_", "p_eff_"
87  };
88  static const std::array < TString, 3 > effLumiName = {
89  "m_eff_Lumi_", "eff_Lumi_", "p_eff_Lumi_"
90  };
91  // inefficiency plots, i.e. 1 - efficiency
92  static const std::array < TString, N_REGIONS > ineffMapName = {
93  "ineffm_", "ineff_", "ineffp_"
94  };
95  //
96  static const std::array < TString, N_REGIONS > sumeff = {
97  "summaryeffm", "summaryeff", "summaryeffp"
98  };
99  static const std::array < TString, N_REGIONS > sumeffBCID = {
100  "summaryeffmBCID", "summaryeffBCID", "summaryeffpBCID"
101  };
102  static const std::array < TString, N_REGIONS > sumefftitle = {
103  "Summary Module Efficiency in Endcap C", "Summary Module Efficiency in Barrel",
104  "Summary Module Efficiency in Endcap A"
105  };
106  static const std::array < TString, N_REGIONS > sumefftitleBCID = {
107  "Summary Module Efficiency in Endcap C for First BC", "Summary Module Efficiency in Barrel for First BC",
108  "Summary Module Efficiency in Endcap A for First BC"
109  };
110 
111 }// namespace end
112 
113 // Constructor with parameters:
114 //cppcheck-suppress uninitMemberVar
115 SCTHitEffMonTool::SCTHitEffMonTool(const string& type, const string& name, const IInterface* parent) :
117  m_Eff_summaryHisto.fill(nullptr);
118  m_Eff_summaryHistoFirstBCID.fill(nullptr);
119  m_Eff_LumiBlockHisto.fill(nullptr);
120  // assume zero inefficiency
121  for (unsigned int i{0}; i < m_ineffMap.size(); ++i) {
122  m_ineffMap[i].fill(nullptr);
123  }
124  for (unsigned int i{0}; i < m_effMap.size(); ++i) {
125  m_effMap[i].fill(nullptr);
126  }
127  for (unsigned int i{0}; i < m_effMapFirstBCID.size(); ++i) {
128  m_effMapFirstBCID[i].fill(nullptr);
129  }
130  for (unsigned int i{0}; i < m_effLumiBlock.size(); ++i) {
131  m_effLumiBlock[i].fill(nullptr);
132  }
133 }
134 
135 /*---------------------------------------------------------*/
138  ATH_MSG_INFO("Initializing SCTHitEffMonTool");
139 
140  ATH_CHECK(detStore()->retrieve(m_sctId, "SCT_ID"));
141  ATH_CHECK(detStore()->retrieve(m_pixelId, "PixelID"));
142  ATH_CHECK(detStore()->retrieve(m_trtId, "TRT_ID"));
143 
145  ATH_CHECK(m_holeSearchTool.retrieve());
146  ATH_MSG_INFO("Retrieved hole search tool " << m_holeSearchTool);
148  ATH_MSG_INFO("Retrieved pull calculator tool " << m_residualPullCalculator);
149  ATH_CHECK(m_rotcreator.retrieve());
150  ATH_MSG_INFO("Retrieved tool " << m_rotcreator);
152  ATH_MSG_INFO("Initialized bunch crossing conditions key: " << m_bunchCrossingKey);
153  ATH_CHECK(m_configConditions.retrieve());
154 
155  m_gpath = (m_useIDGlobal) ? ("/InDetGlobal/") : ("");
156 
157  if ((m_minSCTHits == -1) and (m_minTRTHits == -1) and (m_minOtherHits == -1)) {
158  if (m_isCosmic) {
159  m_minTRTHits = 45;
160  m_minSCTHits = 7;
161  m_minOtherHits = 5;
162  } else {
163  m_minTRTHits = 30;
164  m_minSCTHits = 4;
165  m_minOtherHits = 3;
166  }
167  }
168 
170  ATH_CHECK( m_TrackName.initialize() );
172 
175 
176  return StatusCode::SUCCESS;
177 }
178 
181  if (not newRunFlag()) {
182  return StatusCode::SUCCESS;
183  }
184  if (m_isCosmic) {
185  ATH_MSG_WARNING("Running on cosmics: releasing d0 cut and forcing use of TRT timing");
186  }
187  if (newRunFlag()) {
188  m_badChips = m_configConditions->badChips();
189  ATH_MSG_INFO("Found " << m_badChips->size() << " bad chips");
190  for (const std::pair<const Identifier, unsigned int>& chip: *m_badChips) {
191  ATH_MSG_VERBOSE("Module " << m_sctId->wafer_hash(chip.first) << ", chip " << chip.second);
192  }
193 
194  std::array < MonGroup, N_REGIONS_INC_GENERAL > histGroupE = {
195  MonGroup{this, m_gpath + histogramPath[ENDCAP_C_INDEX], run, ATTRIB_UNMANAGED},
196  MonGroup{this, m_gpath + histogramPath[BARREL_INDEX], run, ATTRIB_UNMANAGED},
197  MonGroup{this, m_gpath + histogramPath[ENDCAP_A_INDEX], run, ATTRIB_UNMANAGED},
198  MonGroup{this, m_gpath + histogramPath[GENERAL_INDEX], run, ATTRIB_UNMANAGED}
199  };
200 
201  std::array < MonGroup, N_REGIONS > histGroupL = {
202  MonGroup{this, m_gpath + histogramPathRe[ENDCAP_C_INDEX], run, ATTRIB_UNMANAGED},
203  MonGroup{this, m_gpath + histogramPathRe[BARREL_INDEX], run, ATTRIB_UNMANAGED},
204  MonGroup{this, m_gpath + histogramPathRe[ENDCAP_A_INDEX], run, ATTRIB_UNMANAGED}
205  };
206 
207  std::array < MonGroup, N_REGIONS_INC_GENERAL > histGroupShift = {
208  MonGroup{this, m_gpath + histogramPath[ENDCAP_C_INDEX], run, ATTRIB_UNMANAGED},
209  MonGroup{this, m_gpath + histogramPath[BARREL_INDEX], run, ATTRIB_UNMANAGED},
210  MonGroup{this, m_gpath + histogramPath[ENDCAP_A_INDEX], run, ATTRIB_UNMANAGED},
211  MonGroup{this, m_gpath + histogramPath[GENERAL_INDEX], run, ATTRIB_UNMANAGED}
212  };
213 
214  ATH_CHECK(bookEffHisto(m_Eff_Total, histGroupE[GENERAL_INDEX], "SctTotalEff", "SCT Total Efficiency", N_REGIONS, 0,
215  N_REGIONS));
216  for (int i{0}; i < N_REGIONS; ++i) {
217  m_Eff_Total->GetXaxis()->SetBinLabel(i + 1, subDetName[i]);
218  }
219  ATH_CHECK(bookEffHisto(m_Eff_TotalBCID, histGroupE[GENERAL_INDEX], "SctTotalEffBCID",
220  "SCT Total Efficiency for First BCID", N_REGIONS, 0, N_REGIONS));
221  for (int i{0}; i < N_REGIONS; ++i) {
222  m_Eff_TotalBCID->GetXaxis()->SetBinLabel(i + 1, subDetName[i]);
223  }
224  ATH_CHECK(bookEffHisto(m_Eff_hashCodeHisto, histGroupE[GENERAL_INDEX], "effHashCode", "Efficiency vs module Hash code",
225  n_mod[GENERAL_INDEX] * 2, -0.5, n_mod[GENERAL_INDEX] * 2 - 0.5));
226  m_Eff_hashCodeHisto->GetXaxis()->SetTitle("Module Hash Code");
227  m_Eff_hashCodeHisto->GetYaxis()->SetTitle("Efficiency");
228  ATH_CHECK(bookEffHisto(m_Eff_LumiBlockHisto_Total, histGroupE[GENERAL_INDEX], "effLumiBlock",
229  "Efficiency vs Luminosity block", NBINS_LBs, 0.5, NBINS_LBs + 0.5));
230  m_Eff_LumiBlockHisto_Total->GetXaxis()->SetTitle("Luminosity block");
231  m_Eff_LumiBlockHisto_Total->GetYaxis()->SetTitle("Efficiency");
232  ATH_CHECK(bookEffHisto(m_effdistribution, histGroupE[GENERAL_INDEX], "SctEffDistribution",
233  "SCT Efficiency Distribution", 500, 0, 1));
234  m_effdistribution->GetXaxis()->SetTitle("Efficiency");
235  m_effdistribution->GetYaxis()->SetTitle("Links");
236 
237  // Booking efficiency maps
238  // inefficiency plots, i.e. 1 - efficiency
239  for (unsigned int isub{0}; isub < N_REGIONS; ++isub) {
240  for (int i{0}; i < n_layers[isub]; ++i) {
241  const int detIndex{becIdxLayer2Index(isub, i)};
242  if (detIndex == -1) {
243  ATH_MSG_WARNING("Subdetector region (barrel, endcap A, endcap C) could not be determined");
244  continue;
245  }
246  for (int j{0}; j < 2; ++j) {
247  // book inefficiency histogram
248  ATH_CHECK(bookEffHisto(m_ineffMap[detIndex][j], histGroupE[isub],
249  ineffMapName[isub] + i + "_" + j,
250  "Hit inefficiency of" + layerName[isub] + i + " / side " + j + " in " + subDetName[isub],
251  n_etabins[isub], f_etabin[isub] - .5, l_etabin[isub] + .5,
252  n_phibins[isub], f_phibin[isub] - .5, l_phibin[isub] + .5));
253  m_ineffMap[detIndex][j]->GetXaxis()->SetTitle("Index in the direction of #eta");
254  m_ineffMap[detIndex][j]->GetYaxis()->SetTitle("Index in the direction of #phi");
255  //
256 
257  ATH_CHECK(bookEffHisto(m_effMap[detIndex][j], histGroupE[isub],
258  mapName[isub] + i + "_" + j,
259  "Hit efficiency of" + layerName[isub] + i + " / side " + j + " in " + subDetName[isub],
260  n_etabins[isub], f_etabin[isub] - .5, l_etabin[isub] + .5,
261  n_phibins[isub], f_phibin[isub] - .5, l_phibin[isub] + .5));
262  m_effMap[detIndex][j]->GetXaxis()->SetTitle("Index in the direction of #eta");
263  m_effMap[detIndex][j]->GetYaxis()->SetTitle("Index in the direction of #phi");
264 
265  ATH_CHECK(bookEffHisto(m_effMapFirstBCID[detIndex][j], histGroupE[isub],
266  mapName[isub] + i + "_" + j + "_bcid",
267  "Hit efficiency of" + layerName[isub] + i + " / side " + j + " in " + subDetName[isub] + " for first BCID",
268  n_etabins[isub], f_etabin[isub] - .5, l_etabin[isub] + .5,
269  n_phibins[isub], f_phibin[isub] - .5, l_phibin[isub] + .5));
270  m_effMapFirstBCID[detIndex][j]->GetXaxis()->SetTitle("Index in the direction of #eta");
271  m_effMapFirstBCID[detIndex][j]->GetYaxis()->SetTitle("Index in the direction of #phi");
272 
273  ATH_CHECK(bookEffHisto(m_effLumiBlock[detIndex][j], histGroupL[isub],
274  effLumiName[isub] + i + "_" + j,
275  "Efficiency vs LumiBlock of" + layerName[isub] + i + " / side " + j + " in " +
276  subDetName[isub],
277  NBINS_LBs, 0.5, NBINS_LBs + 0.5));
278  m_effLumiBlock[detIndex][j]->GetXaxis()->SetTitle("Luminosity Block");
279  m_effLumiBlock[detIndex][j]->GetYaxis()->SetTitle("Efficiency");
280  }
281 
282  }
283 
284  ATH_CHECK(bookEffHisto(m_Eff_summaryHisto[isub], histGroupShift[isub], sumeff[isub], sumefftitle[isub],
285  2 * n_layers[isub], 0., n_layers[isub]));
286  ATH_CHECK(bookEffHisto(m_Eff_summaryHistoFirstBCID[isub], histGroupShift[isub], sumeffBCID[isub],
287  sumefftitleBCID[isub], 2 * n_layers[isub], 0., n_layers[isub]));
288  unsigned int limit[N_REGIONS] = {
290  };
291  for (unsigned int i{0}; i < limit[isub]; i++) {
292  LayerSideFormatter layerSide{i, isub};
293  // use dedicated title for the bin labels (from 0_1 to 3_0)
294  m_Eff_summaryHisto[isub]->GetXaxis()->SetBinLabel(i + 1, layerSide.dedicated_title().c_str());
295  m_Eff_summaryHistoFirstBCID[isub]->GetXaxis()->SetBinLabel(i + 1, layerSide.dedicated_title().c_str());
296  }
297  m_Eff_summaryHisto[isub]->GetYaxis()->SetTitle("Efficiency");
298  m_Eff_summaryHistoFirstBCID[isub]->GetYaxis()->SetTitle("Efficiency");
299 
300  ATH_CHECK(bookEffHisto(m_Eff_LumiBlockHisto[isub], histGroupE[isub], "effLumiBlock",
301  "Efficiency vs Luminosity block in " + subDetName[isub], NBINS_LBs, 0.5, NBINS_LBs + 0.5));
302  m_Eff_LumiBlockHisto[isub]->GetXaxis()->SetTitle("Luminosity block");
303  m_Eff_LumiBlockHisto[isub]->GetYaxis()->SetTitle("Efficiency");
304 
305  }
306  }
307  return StatusCode::SUCCESS;
308 }
309 
312  if (m_isCosmic) {
313  ATH_MSG_WARNING("Running on cosmics: releasing d0 cut and forcing use of TRT timing");
314  }
315  if (newRunFlag()) {
316  m_badChips = m_configConditions->badChips();
317  ATH_MSG_INFO("Found " << m_badChips->size() << " bad chips");
318  for (const std::pair<const Identifier, unsigned int>& chip: *m_badChips) {
319  ATH_MSG_VERBOSE("Module " << m_sctId->wafer_hash(chip.first) << ", chip " << chip.second);
320  }
321 
322  std::array < MonGroup, N_REGIONS_INC_GENERAL > histGroupE = {
323  MonGroup{this, m_gpath + histogramPath[ENDCAP_C_INDEX], run, ATTRIB_UNMANAGED},
324  MonGroup{this, m_gpath + histogramPath[BARREL_INDEX], run, ATTRIB_UNMANAGED},
325  MonGroup{this, m_gpath + histogramPath[ENDCAP_A_INDEX], run, ATTRIB_UNMANAGED},
326  MonGroup{this, m_gpath + histogramPath[GENERAL_INDEX], run, ATTRIB_UNMANAGED}
327  };
328 
329  std::array < MonGroup, N_REGIONS > histGroupL = {
330  MonGroup{this, m_gpath + histogramPathRe[ENDCAP_C_INDEX], run, ATTRIB_UNMANAGED},
331  MonGroup{this, m_gpath + histogramPathRe[BARREL_INDEX], run, ATTRIB_UNMANAGED},
332  MonGroup{this, m_gpath + histogramPathRe[ENDCAP_A_INDEX], run, ATTRIB_UNMANAGED}
333  };
334 
335  std::array < MonGroup, N_REGIONS_INC_GENERAL > histGroupShift = {
336  MonGroup{this, m_gpath + histogramPath[ENDCAP_C_INDEX], run, ATTRIB_UNMANAGED},
337  MonGroup{this, m_gpath + histogramPath[BARREL_INDEX], run, ATTRIB_UNMANAGED},
338  MonGroup{this, m_gpath + histogramPath[ENDCAP_A_INDEX], run, ATTRIB_UNMANAGED},
339  MonGroup{this, m_gpath + histogramPath[GENERAL_INDEX], run, ATTRIB_UNMANAGED}
340  };
341 
342  ATH_CHECK(bookEffHisto(m_Eff_Total, histGroupE[GENERAL_INDEX], "SctTotalEff", "SCT Total Efficiency", N_REGIONS, 0,
343  N_REGIONS));
344  for (int i{0}; i < N_REGIONS; ++i) {
345  m_Eff_Total->GetXaxis()->SetBinLabel(i + 1, subDetName[i]);
346  }
347  ATH_CHECK(bookEffHisto(m_Eff_TotalBCID, histGroupE[GENERAL_INDEX], "SctTotalEffBCID",
348  "SCT Total Efficiency for First BCID", N_REGIONS, 0, N_REGIONS));
349  for (int i{0}; i < N_REGIONS; ++i) {
350  m_Eff_TotalBCID->GetXaxis()->SetBinLabel(i + 1, subDetName[i]);
351  }
352  ATH_CHECK(bookEffHisto(m_Eff_hashCodeHisto, histGroupE[GENERAL_INDEX], "effHashCode", "Efficiency vs module Hash code",
353  n_mod[GENERAL_INDEX] * 2, -0.5, n_mod[GENERAL_INDEX] * 2 - 0.5));
354  m_Eff_hashCodeHisto->GetXaxis()->SetTitle("Module Hash Code");
355  m_Eff_hashCodeHisto->GetYaxis()->SetTitle("Efficiency");
356  ATH_CHECK(bookEffHisto(m_Eff_LumiBlockHisto_Total, histGroupE[GENERAL_INDEX], "effLumiBlock",
357  "Efficiency vs Luminosity block", NBINS_LBs, 0.5, NBINS_LBs + 0.5));
358 
359  for (unsigned int isub{0}; isub < N_REGIONS; ++isub) {
360  for (int i{0}; i < n_layers[isub]; ++i) {
361  const int detIndex{becIdxLayer2Index(isub, i)};
362  if (detIndex == -1) {
363  ATH_MSG_WARNING("Detector region (barrel, endcap A, endcap C) could not be determined");
364  continue;
365  }
366  for (int j{0}; j < 2; ++j) {
367  // book inefficiency histogram
368  ATH_CHECK(bookEffHisto(m_ineffMap[detIndex][j], histGroupE[isub],
369  ineffMapName[isub] + i + "_" + j,
370  "Hit inefficiency of" + layerName[isub] + i + " / side " + j + " in " + subDetName[isub],
371  n_etabins[isub], f_etabin[isub] - .5, l_etabin[isub] + .5,
372  n_phibins[isub], f_phibin[isub] - .5, l_phibin[isub] + .5));
373  m_ineffMap[detIndex][j]->GetXaxis()->SetTitle("Index in the direction of #eta");
374  m_ineffMap[detIndex][j]->GetYaxis()->SetTitle("Index in the direction of #phi");
375  //
376 
377  ATH_CHECK(bookEffHisto(m_effMap[detIndex][j], histGroupE[isub],
378  mapName[isub] + i + "_" + j,
379  "Hit efficiency of" + layerName[isub] + i + " / side " + j + " in " + subDetName[isub],
380  n_etabins[isub], f_etabin[isub] - .5, l_etabin[isub] + .5,
381  n_phibins[isub], f_phibin[isub] - .5, l_phibin[isub] + .5));
382  m_effMap[detIndex][j]->GetXaxis()->SetTitle("Index in the direction of #eta");
383  m_effMap[detIndex][j]->GetYaxis()->SetTitle("Index in the direction of #phi");
384 
385  ATH_CHECK(bookEffHisto(m_effMapFirstBCID[detIndex][j], histGroupE[isub],
386  mapName[isub] + i + "_" + j + "_bcid",
387  "Hit efficiency of" + layerName[isub] + i + " / side " + j + " in " + subDetName[isub] + " for first BCID",
388  n_etabins[isub], f_etabin[isub] - .5, l_etabin[isub] + .5,
389  n_phibins[isub], f_phibin[isub] - .5, l_phibin[isub] + .5));
390  m_effMapFirstBCID[detIndex][j]->GetXaxis()->SetTitle("Index in the direction of #eta");
391  m_effMapFirstBCID[detIndex][j]->GetYaxis()->SetTitle("Index in the direction of #phi");
392 
393  ATH_CHECK(bookEffHisto(m_effLumiBlock[detIndex][j], histGroupL[isub],
394  effLumiName[isub] + i + "_" + j,
395  "Efficiency vs LumiBlock" + layerName[isub] + i + " / side " + j + " in " +
396  subDetName[isub],
397  150, 1, 3001));
398  m_effLumiBlock[detIndex][j]->GetXaxis()->SetTitle("Luminosity Block");
399  m_effLumiBlock[detIndex][j]->GetYaxis()->SetTitle("Efficiency");
400  }
401  }
402 
403  ATH_CHECK(bookEffHisto(m_Eff_summaryHisto[isub], histGroupShift[isub], sumeff[isub], sumefftitle[isub],
404  2 * n_layers[isub], 0., n_layers[isub]));
405  ATH_CHECK(bookEffHisto(m_Eff_summaryHistoFirstBCID[isub], histGroupShift[isub], sumeffBCID[isub],
406  sumefftitleBCID[isub], 2 * n_layers[isub], 0., n_layers[isub]));
407  unsigned int limit[N_REGIONS] = {
409  };
410  for (unsigned int i{0}; i < limit[isub]; i++) {
411  LayerSideFormatter layerSide{i, isub};
412  m_Eff_summaryHisto[isub]->GetXaxis()->SetBinLabel(i + 1, layerSide.dedicated_title().c_str());
413  m_Eff_summaryHistoFirstBCID[isub]->GetXaxis()->SetBinLabel(i + 1, layerSide.dedicated_title().c_str());
414  }
415  m_Eff_summaryHisto[isub]->GetYaxis()->SetTitle("Efficiency");
416  m_Eff_summaryHistoFirstBCID[isub]->GetYaxis()->SetTitle("Efficiency");
417  ATH_CHECK(bookEffHisto(m_Eff_LumiBlockHisto[isub], histGroupE[isub], "effLumiBlock",
418  "Efficiency vs Luminosity block in " + subDetName[isub], NBINS_LBs, 0.5, NBINS_LBs + 0.5));
419  m_Eff_LumiBlockHisto[isub]->GetXaxis()->SetTitle("Luminosity block");
420  m_Eff_LumiBlockHisto[isub]->GetYaxis()->SetTitle("Efficiency");
421 
422  }
423  }
424  return StatusCode::SUCCESS;
425 }
426 
427 // This is the real workhorse, called for each event. It retrieves the data each time
428 /*---------------------------------------------------------*/
432 
433  ATH_MSG_VERBOSE("SCTHitEffMonTool::fillHistograms()");
434  double timecor{-20.};
435  if (m_useTRTPhase or m_isCosmic) {
437  if (theComTime.isValid()) {
438  timecor = theComTime->getTime();
439  ATH_MSG_VERBOSE("Retrieved ComTime object with name " << m_comTimeName.key() << " found: Time = " << timecor);
440  } else {
441  timecor = -18.;
442  ATH_MSG_WARNING("ComTime object not found with name " << m_comTimeName.key());
443  }
444  }
445  // If we are going to use TRT phase in anger, need run-dependent corrections.
446  const EventContext& ctx{Gaudi::Hive::currentContext()};
447  const EventIDBase& pEvent{ctx.eventID()};
448  unsigned BCID{pEvent.bunch_crossing_id()};
449 
451  if (!bcidHdl.isValid()) {
452  ATH_MSG_ERROR( "Unable to retrieve BunchCrossing conditions object" );
453  return StatusCode::FAILURE;
454  }
455 
457 
459  const AtlasFieldCacheCondObj* fieldCondObj{*fieldHandle};
460  if (fieldCondObj==nullptr) {
461  ATH_MSG_ERROR("AtlasFieldCacheCondObj cannot be retrieved.");
462  return StatusCode::RECOVERABLE;
463  }
464  MagField::AtlasFieldCache fieldCache;
465  fieldCondObj->getInitializedCache(fieldCache);
466  const bool solenoidOn{fieldCache.solenoidOn()};
467 
468  // ---- First try if m_tracksName is a TrackCollection
470  if (not tracks.isValid()) {
471  ATH_MSG_WARNING("Tracks not found: " << tracks << " / " << m_TrackName.key());
472  return StatusCode::SUCCESS;
473  } else {
474  ATH_MSG_VERBOSE("Successfully retrieved " << m_TrackName.key() << " : " << tracks->size() << " items");
475  }
476 
478  if (not p_sctclcontainer.isValid()) {
479  ATH_MSG_WARNING("SCT clusters container not found: " << m_sctContainerName.key());
480  return StatusCode::SUCCESS;
481  }
482 
483  // cut on number of tracks (skip this cut for online)
485  if (failCut(tracks->size() <= m_maxTracks, "# of tracks cut")) {
486  return StatusCode::SUCCESS;
487  }
488  }
489 
491  const InDetDD::SiDetectorElementCollection* elements{sctDetEle.retrieve()};
492  if (elements==nullptr) {
493  ATH_MSG_FATAL(m_SCTDetEleCollKey.fullKey() << " could not be retrieved in fillHistograms()");
494  return StatusCode::FAILURE;
495  }
496 
497 
498  // Loop over track collection to count tracks
499  for (const Trk::Track* pthisTrack: *tracks) {
500  if (pthisTrack==nullptr) {
501  continue;
502  }
503  if (failCut(pthisTrack and pthisTrack->trackParameters() and pthisTrack->trackParameters()->size(),
504  "track cut: presence")) {
505  continue;
506  }
507 
508  if (m_insideOutOnly and failCut(pthisTrack->info().patternRecoInfo(Trk::TrackInfo::SiSPSeededFinder),
509  "track cut: inside-out only")) {
510  continue;
511  }
512  if (pthisTrack->perigeeParameters() == nullptr) {
513  continue;
514  }
515  const Trk::Perigee* perigee{pthisTrack->perigeeParameters()};
516  const AmgVector(5)& perigeeParameters{perigee->parameters()};
517  const double d0{perigeeParameters[Trk::d0]};
518  const double z0{perigeeParameters[Trk::z0]};
519  const double perigeeTheta{perigeeParameters[Trk::theta]};
520 
521  if (solenoidOn and failCut(perigee->pT() >= m_minPt, "track cut: Min Pt")) {
522  continue;
523  }
524  if (not m_isCosmic and failCut(std::abs(d0) <= m_maxD0, "track cut: max D0")) {
525  continue;
526  }
527  if (m_maxZ0sinTheta and failCut(std::abs(z0 * sin(perigeeTheta)) <= m_maxZ0sinTheta, "track cut: Max Z0sinTheta")) {
528  continue;
529  }
530  }
531 
532  // Loop over original track collection
533  for (const Trk::Track* pthisTrack: *tracks) {
534  ATH_MSG_VERBOSE("Starting new track");
535  if (pthisTrack==nullptr) {
536  continue;
537  }
538  if (failCut(pthisTrack and pthisTrack->trackParameters() and pthisTrack->trackParameters()->size(),
539  "track cut: presence")) {
540  continue;
541  }
542 
543  if (m_insideOutOnly and failCut(pthisTrack->info().patternRecoInfo(Trk::TrackInfo::SiSPSeededFinder),
544  "track cut: inside-out only")) {
545  continue;
546  }
547  if (pthisTrack->perigeeParameters() == nullptr) {
548  continue;
549  }
550  const Trk::Perigee* perigee{pthisTrack->perigeeParameters()};
551  const AmgVector(5)& perigeeParameters{perigee->parameters()};
552  const double d0{perigeeParameters[Trk::d0]};
553  const double z0{perigeeParameters[Trk::z0]};
554  const double perigeeTheta{perigeeParameters[Trk::theta]};
555 
556  if (failCut(perigee->pT() >= m_minPt, "track cut: Min Pt")) {
557  continue;
558  }
559  if (not m_isCosmic and failCut(std::abs(d0) <= m_maxD0, "track cut: max D0")) {
560  continue;
561  }
562  if (m_maxZ0sinTheta and failCut(std::abs(z0 * sin(perigeeTheta)) <= m_maxZ0sinTheta, "track cut: Max Z0sinTheta")) {
563  continue;
564  }
565 
566  const Trk::TrackSummary* summary{pthisTrack->trackSummary()};
567 
568  if (summary and (summary->get(Trk::numberOfSCTHits) < 1)) {
569  continue;
570  }
571 
572  std::unique_ptr<const Trk::Track> trackWithHoles(m_holeSearchTool->getTrackWithHoles(*pthisTrack));
573  if (not trackWithHoles) {
574  ATH_MSG_WARNING("trackWithHoles pointer is invalid");
575  continue;
576  }
577  ATH_MSG_VERBOSE("Found " << trackWithHoles->trackStateOnSurfaces()->size() << " states on track");
578 
579  int NHits[N_REGIONS] = {
580  0, 0, 0
581  };
582  int pixelNHits{0};
583  int trtNHits{0};
584  std::map < Identifier, double > mapOfTrackHitResiduals;
587  double zpos{0.};
588  float layerSide{-1};
589  float min_layerSide{999.};
590  float max_layerSide{-1.};
591  Identifier surfaceID;
592 
593  // loop over all hits on track
594  for (const Trk::TrackStateOnSurface* tsos: *(trackWithHoles->trackStateOnSurfaces())) {
595  surfaceID = surfaceOnTrackIdentifier(tsos);
596 
597  if (not surfaceID.is_valid()) {
598  continue;
599  }
601  if (m_pixelId->is_pixel(surfaceID)) {
602  pixelNHits++;
603  }
604  if (m_trtId->is_trt(surfaceID)) {
605  trtNHits++;
606  }
607  if (m_sctId->is_sct(surfaceID)) {
608  NHits[bec2Index(m_sctId->barrel_ec(surfaceID))]++;
609  mapOfTrackHitResiduals[surfaceID] = getResidual(surfaceID, tsos->trackParameters(), &*p_sctclcontainer);
610  }
611  }
612 
613  if (tsos->type(Trk::TrackStateOnSurface::Measurement)) { // Determine zmin and zmax taking multiple
614  // hits/side into account
615  if (m_isCosmic) { // If this is cosmics use z, bad method but ok...
616  if (tsos->trackParameters()) {
617  zpos = tsos->trackParameters()->position().z();
618  zmax = std::max(zpos, zmax);
619  zmin = std::min(zpos, zmin);
620  } else {
621  ATH_MSG_WARNING("No track parameter found. Zmin and Zmax not recalculated.");
622  }
623  } else { // else use layer/side number : better but does not work for cosmics
624  if (m_sctId->is_sct(surfaceID)) {
625  layerSide = (m_sctId->barrel_ec(surfaceID) != 0) * N_BARRELS +
626  static_cast<float>(m_sctId->layer_disk(surfaceID)) + (static_cast<float>(m_sctId->side(surfaceID)) == 0) * 0.5;
627  min_layerSide = std::min(min_layerSide, layerSide);
628  max_layerSide = std::max(max_layerSide, layerSide);
629  } else if (m_pixelId->is_pixel(surfaceID)) {
630  min_layerSide = -1;
631  } else if (m_trtId->is_trt(surfaceID)) {
632  max_layerSide = N_BARRELS + N_ENDCAPS + 1;
633  }
634  }
635  }
636  }
637 
638  int sctNHits{NHits[ENDCAP_C_INDEX] + NHits[BARREL_INDEX] + NHits[ENDCAP_A_INDEX]};
639  std::vector<bool> layersCrossedByTrack[N_REGIONS];
640  std::vector<int> nHolesOnLayer[N_REGIONS];
641  std::vector<int> nHolesDistOnLayer[N_REGIONS];
642  for (int i{0}; i < N_REGIONS; ++i) {
643  nHolesDistOnLayer[i].resize(n_layers[i] * 2, 0);
644  nHolesOnLayer[i].resize(n_layers[i] * 2, 0);
645  layersCrossedByTrack[i].resize(n_layers[i] * 2, false);
646  }
647 
648  for (const Trk::TrackStateOnSurface* tsos: *(trackWithHoles->trackStateOnSurfaces())) {
649  ATH_MSG_VERBOSE("Starting new hit");
650  surfaceID = surfaceOnTrackIdentifier(tsos);
651 
652  if (failCut(m_sctId->is_sct(surfaceID), "hit cut: is in SCT")) {
653  continue;
654  }
655 
656  unsigned int isub{bec2Index(m_sctId->barrel_ec(surfaceID))};
657  ATH_MSG_VERBOSE("New SCT candidate: " << m_sctId->print_to_string(surfaceID));
658 
659  int side{m_sctId->side(surfaceID)};
660  int layer{m_sctId->layer_disk(surfaceID)};
661  const int detIndex{becIdxLayer2Index(isub, layer)};
662  if (detIndex == -1) {
663  ATH_MSG_WARNING("The detector region (barrel, endcap A, endcap C) could not be determined");
664  continue;
665  }
666  int histnumber{detIndex};
667  float eff{0.};
668  IdentifierHash sideHash{m_sctId->wafer_hash(surfaceID)};
669  Identifier module_id{m_sctId->module_id(surfaceID)};
670  float layerPlusHalfSide{static_cast<float>(layer) + static_cast<float>(side) * 0.5f};
671  float dedicated_layerPlusHalfSide{static_cast<float>(layer) + static_cast<float>((side + 1) % 2) * 0.5f};
672  const Trk::TrackParameters* trkParamOnSurface{tsos->trackParameters()};
673  double trackHitResidual{getResidual(surfaceID, trkParamOnSurface, &*p_sctclcontainer)};
674 
675 
676  float distCut{m_effdistcut};
677 
679  eff = 1.;
680  } else if (tsos->type(Trk::TrackStateOnSurface::Hole) and (std::abs(trackHitResidual) < distCut)) {
681  eff = 1.;
682  }
683 
684  bool otherFaceFound{false};
685  IdentifierHash otherSideHash;
686  Identifier otherSideSurfaceID;
687  IdContext context{m_sctId->wafer_context()};
688  m_sctId->get_other_side(sideHash, otherSideHash);
689  m_sctId->get_id(otherSideHash, otherSideSurfaceID, &context);
690  otherFaceFound = mapOfTrackHitResiduals.find(otherSideSurfaceID) != mapOfTrackHitResiduals.end();
691 
692  int nOther{sctNHits};
694  --nOther;
695  }
696 
697  // Get the track phi; we may cut on it.
698  double phiUp{90.};
699  double theta{90.};
700  if (trkParamOnSurface and (not findAnglesToWaferSurface(trkParamOnSurface->momentum(), surfaceID, elements, theta, phiUp))) {
701  ATH_MSG_WARNING("Error from findAngles");
702  }
703 
704  if (m_useSCTorTRT) {
705  if (failCut(trtNHits >= m_minTRTHits or
706  sctNHits >= m_minSCTHits, "track cut: min TRT or SCT hits")) {
707  continue;
708  }
709  } else {
710  if (failCut(trtNHits >= m_minTRTHits, "track cut: min TRT hits")) {
711  continue;
712  }
713  if (failCut(sctNHits >= m_minSCTHits, "track cut: min SCT hits")) {
714  continue;
715  }
716  if (failCut(pixelNHits >= m_minPixelHits, "track cut: min Pixel hits")) {
717  continue;
718  }
719  }
720 
721  if (failCut(nOther >= m_minOtherHits, "track cut: minOtherHits")) {
722  continue;
723  }
724 
725  ATH_MSG_DEBUG("Use TRT phase " << m_useTRTPhase << " is cosmic? " << m_isCosmic << " timecor " << timecor);
726  if (m_useTRTPhase or m_isCosmic) {
727  if (timecor == 0) {
728  continue;
729  }
730  static const double tmin{-15.};
731  static const double tmax{10.};
732  if (failCut((timecor >= tmin) and (timecor <= tmax), "track cut: timing cut")) {
733  continue;
734  }
735  ATH_MSG_DEBUG(timecor << " " << tmin << " " << tmax);
736  }
737 
738  bool enclosingHits{true};
739  if (m_isCosmic) {
740  if (tsos->trackParameters()) {
741  zpos = tsos->trackParameters()->position().z();
742  enclosingHits = ((zpos > zmin) and (zpos < zmax));
743  } else {
744  ATH_MSG_WARNING("No track parameters found. Cannot determine whether it is an enclosed hit.");
745  enclosingHits = false;
746  }
747  } else {
748  layerSide = (m_sctId->barrel_ec(surfaceID) != 0) * N_BARRELS
749  + static_cast<float>(m_sctId->layer_disk(surfaceID))
750  + (static_cast<float>(m_sctId->side(surfaceID)) == 0) * 0.5;
751  enclosingHits = ((layerSide > min_layerSide) and (layerSide < max_layerSide));
752  }
753 
754  if (m_requireEnclosingHits and
755  (not (layerPlusHalfSide == 0.5)) and
756  (not ((isub == 1) and (layerPlusHalfSide == 3))) and
757  (not (layerPlusHalfSide == 8))) {
758  if (failCut(enclosingHits, "hit cut: enclosing hits")) {
759  continue;
760  }
761  }
762 
763  // Now fill with the local z
764  double chi2{trackWithHoles->fitQuality()->chiSquared()};
765  int ndf{trackWithHoles->fitQuality()->numberDoF()};
766  double chi2_div_ndf{ndf > 0. ? chi2 / ndf : -1.};
767 
768  if (failCut(std::abs(phiUp) <= m_maxPhiAngle, "hit cut: incidence angle")) {
769  continue;
770  }
771 
772  if (failCut((ndf > 0) and (chi2_div_ndf <= m_maxChi2), "track cut: chi2 cut")) {
773  continue;
774  }
775 
776  if (m_requireOtherFace and failCut(otherFaceFound, "hit cut: other face found")) {
777  continue;
778  }
779 
780  if (not trkParamOnSurface) continue;
781  double xl{trkParamOnSurface->localPosition()[0]};
782  double yl{trkParamOnSurface->localPosition()[1]};
783 
784  // Check guard ring
785  bool insideGuardRing{true};
786  if (isub == BARREL_INDEX) {
787  const float xGuard{m_effdistcut};
788  static const float yGuard{3.};
789  if (xl < -30.7 + xGuard) {
790  insideGuardRing = false;
791  }
792  if (xl > 30.7 - xGuard) {
793  insideGuardRing = false;
794  }
795 
796  static const double yend{63.960 + 0.03 - 1.}; // The far sensitive end
797  static const double ydead{2.06 / 2.}; // the near sensitive end
798  if (yl > yend - yGuard) {
799  insideGuardRing = false;
800  }
801  if (yl < -yend + yGuard) {
802  insideGuardRing = false;
803  }
804  if ((yl < ydead + yGuard) and (yl > -ydead - yGuard)) {
805  insideGuardRing = false;
806  }
807  } else {
808  // No guard ring for the endcaps for now...just set true.
809  insideGuardRing = true;
810  }
811 
812  if (m_requireGuardRing and failCut(insideGuardRing, "hit cut: inside guard ring")) {
813  continue;
814  }
815 
816  // Check bad chips
817  bool nearBadChip{false};
818  IdentifierHash waferHash{m_sctId->wafer_hash(surfaceID)};
819  const InDetDD::SiDetectorElement* pElement{elements->getDetectorElement(waferHash)};
820  bool swap{(pElement->swapPhiReadoutDirection()) ? true : false};
821  int chipPos{previousChip(xl, side, swap)};
822  unsigned int status{0};
823  std::map<Identifier, unsigned int>::const_iterator badChip{m_badChips->find(module_id)};
824  if (badChip != m_badChips->end()) {
825  status = (*badChip).second;
826  // Veto if either of closest two chips is dead
827  const bool nearBadChipDead{(status & (1 << chipPos)) != 0};
828  const bool nextBadChipDead{(status & (1 << (chipPos + 1))) != 0};
829  const bool isNotEndChip{(chipPos != 5) and (chipPos != 11)}; // cant have a 'next' if its the end chip on that
830  // side
831  // nearBadChip = status & (1 << chipPos) or
832  // (chipPos != 5 and chipPos != 11 and status & (1 << (chipPos + 1)));
833  // clarify logic:
834  nearBadChip = nearBadChipDead or (isNotEndChip and nextBadChipDead);
835  }
836  if (m_vetoBadChips and failCut(not nearBadChip, "hit cut: not near bad chip")) {
837  continue;
838  }
839  ATH_MSG_VERBOSE("Candidate passed all cuts");
840  m_Eff_summaryHisto[isub]->Fill(dedicated_layerPlusHalfSide, eff); // adjustment for dedicated_title()
841  m_Eff_hashCodeHisto->Fill(static_cast<double>(sideHash), eff);
842  m_Eff_LumiBlockHisto[isub]->Fill(pEvent.lumi_block(), eff);
843  m_Eff_LumiBlockHisto_Total->Fill(pEvent.lumi_block(), eff);
844  if (BCIDpos <= 0) {
845  m_Eff_summaryHistoFirstBCID[isub]->Fill(dedicated_layerPlusHalfSide, eff); // adjustment for dedicated_title()
846  }
847  m_Eff_Total->Fill(static_cast<double>(isub), eff);
848  if (BCIDpos <= 0) {
849  m_Eff_TotalBCID->Fill(static_cast<double>(isub), eff);
850  }
851  const int ieta{m_sctId->eta_module(surfaceID)};
852  const int iphi{m_sctId->phi_module(surfaceID)};
853  m_effMap[histnumber][side]->Fill(ieta, iphi, eff);
854  if ( BCIDpos <= 0 ) {
855  m_effMapFirstBCID[histnumber][side]->Fill(ieta, iphi, eff);
856  }
857  m_effLumiBlock[histnumber][side]->Fill(pEvent.lumi_block(), eff);
858 
859  m_ineffMap[histnumber][side]->Fill(ieta, iphi, (testOffline ? 1. : 1.-eff));
860  if (testOffline) {
861  ATH_MSG_INFO("Filling " << histnumber << ", " << side << " eta " << ieta << " phi " << iphi);
862  }
863  } // End of loop over hits/holes
864  }
865  ATH_MSG_VERBOSE("finished loop over tracks = " << tracks->size());
866  return StatusCode::SUCCESS;
867 }
868 
871 
872  m_effdistribution->Reset();
873  for (int isub{0}; isub < N_REGIONS; ++isub) {
874  for (int i{0}; i < n_layers[isub]; ++i) {
875  const int detIndex{becIdxLayer2Index(isub, i)};
876  if (detIndex != -1) {
877  for (int j{0}; j < 2; ++j) {
878  for (int xbin{1}; xbin < m_effMap[detIndex][j]->GetNbinsX() + 1; xbin++) {
879  for (int ybin{1}; ybin < m_effMap[detIndex][j]->GetNbinsY() + 1; ybin++) {
880  if (m_effMap[detIndex][j]->GetBinEntries(m_effMap[detIndex][j]->GetBin(xbin, ybin)) == 0) {
881  continue;
882  }
883  m_effdistribution->Fill(m_effMap[detIndex][j]->GetBinContent(xbin, ybin));
884  }
885  }
886  }
887  }//if detIndex !=-1
888  }
889  }
890  return StatusCode::SUCCESS;
891 }
892 
894 SCTHitEffMonTool::failCut(bool value, const string & name) const {
895  if (value) {
896  ATH_MSG_VERBOSE("Passed " << name);
897  return StatusCode::FAILURE;
898  }
899  ATH_MSG_VERBOSE("Failed " << name);
900  return StatusCode::SUCCESS;
901 }
902 
903 int
904 SCTHitEffMonTool::previousChip(double xl, int side, bool swap) const {
905  double xLeftEdge{xl + N_STRIPS / 2. * stripWidth}; // xl defined wrt center of module, convert to edge of module
906  int chipPos{static_cast<int>(xLeftEdge / (stripWidth * N_STRIPS) * N_CHIPS)};
907 
908  if (side == 0) {
909  chipPos = swap ? 5 - chipPos : chipPos;
910  } else {
911  chipPos = swap ? 11 - chipPos : 6 + chipPos;
912  }
913  return chipPos;
914 }
915 
918  const InDetDD::SiDetectorElementCollection* elements,
919  double& theta, double& phi) const {
920  phi = 90.;
921  theta = 90.;
922 
923  const Identifier waferId{m_sctId->wafer_id(id)};
924  const IdentifierHash waferHash{m_sctId->wafer_hash(waferId)};
925  const InDetDD::SiDetectorElement* element{elements->getDetectorElement(waferHash)};
926  if (not element) {
927  ATH_MSG_VERBOSE("findAnglesToWaferSurface: failed to find detector element for id = " << m_sctId->print_to_string(id));
928  return StatusCode::FAILURE;
929  }
930  double pNormal{mom.dot(element->normal())};
931  double pEta{mom.dot(element->etaAxis())};
932  double pPhi{mom.dot(element->phiAxis())};
933  if (pPhi < 0.) {
934  phi = -90.;
935  }
936  if (pEta < 0.) {
937  theta = -90.;
938  }
939  if (pNormal != 0.) {
940  phi = std::atan(pPhi / pNormal) * radianDegrees;
941  theta = std::atan(pEta / pNormal) * radianDegrees;
942  }
943  return StatusCode::SUCCESS;
944 }
945 
946 template <class T> StatusCode
947 SCTHitEffMonTool::bookEffHisto(T*& histo, MonGroup& MG, TString name, TString title, int nbin, double x1,
948  double x2) const {
949  histo = new T(name, title, nbin, x1, x2);
950  ATH_CHECK(MG.regHist(histo));
951  ATH_MSG_VERBOSE("Registered " << name << " at " << histo);
952  return StatusCode::SUCCESS;
953 }
954 
955 template <class T> StatusCode
957  int nbinx, double x1, double x2,
958  int nbiny, double y1, double y2) const {
959  histo = new T(name, title, nbinx, x1, x2, nbiny, y1, y2);
960  ATH_CHECK(MG.regHist(histo));
961  ATH_MSG_VERBOSE("Registered " << name << " at " << histo);
962  return StatusCode::SUCCESS;
963 }
964 
965 template <class T> StatusCode
967  int nbinx, double* xbins, int nbiny, double* ybins) const {
968  histo = new T(name, title, nbinx, xbins, nbiny, ybins);
969  ATH_CHECK(MG.regHist(histo));
970  ATH_MSG_VERBOSE("Registered " << name << " at " << histo);
971  return StatusCode::SUCCESS;
972 }
973 
974 // Find the residual to track.
975 double
976 SCTHitEffMonTool::getResidual(const Identifier& surfaceID, const Trk::TrackParameters* trkParam,
977  const InDet::SCT_ClusterContainer* p_sctclcontainer) const {
978  double trackHitResidual{-999.};
979 
980  if (trkParam==nullptr) {
981  ATH_MSG_WARNING("Not track parameters found. Returning default residual value.");
982  return trackHitResidual;
983  }
984  IdentifierHash idh{m_sctId->wafer_hash(surfaceID)};
985  const InDet::SCT_ClusterCollection *containerIterator{p_sctclcontainer->indexFindPtr(idh)};
986  if (containerIterator != nullptr) {
987  for (const InDet::SCT_Cluster* cluster: *containerIterator) {
988  if ((cluster==nullptr) or (cluster->detectorElement()==nullptr)) {
989  ATH_MSG_WARNING("nullptr to RIO or detElement");
990  continue;
991  }
992  if (m_sctId->wafer_id(surfaceID) == m_sctId->wafer_id(cluster->detectorElement()->identify())) {
993  const Trk::PrepRawData* rioo{dynamic_cast<const Trk::PrepRawData *>(cluster)};
994  std::unique_ptr<const Trk::RIO_OnTrack> rio{m_rotcreator->correct(*rioo, *trkParam)};
995  if (not m_residualPullCalculator.empty()) {
996  std::optional<Trk::ResidualPull> residualPull{m_residualPullCalculator->residualPull(rio.get(), trkParam,
998  if (not residualPull) continue;
999  if (std::abs(residualPull->residual()[Trk::loc1]) < std::abs(trackHitResidual)) {
1000  trackHitResidual = residualPull->residual()[Trk::loc1];
1001  }
1002  }
1003  }
1004  }
1005  }
1006  return trackHitResidual;
1007 }
1008 
1011  if ((index< 0) or (index>21)) return SCT_Monitoring::INVALID_INDEX;
1012  if (index< 9) return SCT_Monitoring::ENDCAP_C_INDEX;
1013  if (index< 13) return SCT_Monitoring::BARREL_INDEX;
1014  if (index< 22) return SCT_Monitoring::ENDCAP_A_INDEX;
1016 }
1017 
1018 int
1020  if ((index < 0) or (index > 21)) return SCT_Monitoring::INVALID_INDEX;
1021  if (index < 9) return index;
1022  if (index < 13) return index-9;
1023  if (index < 22) return index-13;
1025 }
1026 
1027 int
1028 SCTHitEffMonTool::becIdxLayer2Index(const int becIdx, const int layer) const {
1029  switch( becIdx ) {
1031  return layer;
1033  return layer + SCT_Monitoring::N_DISKS;
1036  default:
1037  return -1;
1038  }
1039 }
SCT_Monitoring::ENDCAP_C_INDEX
@ ENDCAP_C_INDEX
Definition: SCT_MonitoringNumbers.h:19
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
AtlasDetectorID::is_pixel
bool is_pixel(Identifier id) const
Definition: AtlasDetectorID.h:760
covarianceTool.ndf
ndf
Definition: covarianceTool.py:678
SCT_NameFormatter.h
SCT_CalibAlgs::bec2Index
unsigned int bec2Index(const int bec)
Definition: SCT_CalibUtilities.cxx:60
SCT_ClusterOnTrack.h
SCT_Monitoring::BecIndex
BecIndex
what array indices mean when looping over subsystems
Definition: SCT_MonitoringNumbers.h:19
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
SCTHitEffMonTool::m_maxD0
FloatProperty m_maxD0
Definition: SCTHitEffMonTool.h:154
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
SCT_Monitoring::N_REGIONS
@ N_REGIONS
Definition: SCT_MonitoringNumbers.h:19
SCTHitEffMonTool::m_effMap
std::array< std::array< TProfile2D *, 2 >, SCT_Monitoring::N_LAYERS_TOTAL > m_effMap
Definition: SCTHitEffMonTool.h:170
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
get_generator_info.result
result
Definition: get_generator_info.py:21
max
#define max(a, b)
Definition: cfImp.cxx:41
perigeeParameters
Definition: ExtrapolatorComparisonTest.h:42
TrackParameters.h
MeasurementBase.h
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
SCTHitEffMonTool::m_rotcreator
ToolHandle< Trk::IRIO_OnTrackCreator > m_rotcreator
Definition: SCTHitEffMonTool.h:136
SCT_ConditionsData::N_REGIONS
@ N_REGIONS
Definition: SCT_ConditionsParameters.h:28
Surface.h
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
AtlasFieldCacheCondObj
Definition: AtlasFieldCacheCondObj.h:19
SCTHitEffMonTool::layerIndex2becIndex
SCT_Monitoring::BecIndex layerIndex2becIndex(const int index) const
Convert a layer/disk number (0-21) to a bec index (0,1,2) according to position of that layer Numberi...
Definition: SCTHitEffMonTool.cxx:1010
SCTHitEffMonTool::m_useTRTPhase
BooleanProperty m_useTRTPhase
Definition: SCTHitEffMonTool.h:162
SCTHitEffMonTool::m_maxTracks
UnsignedIntegerProperty m_maxTracks
Definition: SCTHitEffMonTool.h:158
ManagedMonitorToolBase
Provides functionality for users to implement and save histograms, ntuples, and summary data,...
Definition: ManagedMonitorToolBase.h:74
AtlasDetectorID::is_sct
bool is_sct(Identifier id) const
Definition: AtlasDetectorID.h:770
PixelAthClusterMonAlgCfg.zmin
zmin
Definition: PixelAthClusterMonAlgCfg.py:176
SCT_Monitoring::INVALID_INDEX
@ INVALID_INDEX
Definition: SCT_MonitoringNumbers.h:19
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
index
Definition: index.py:1
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
SCT_Monitoring::N_ENDCAPS
@ N_ENDCAPS
Definition: SCT_MonitoringNumbers.h:46
SCTHitEffMonTool::failCut
StatusCode failCut(bool value, const std::string &name) const
Method to cut on track or hit variables and automatize DEBUG statements.
Definition: SCTHitEffMonTool.cxx:894
SCTHitEffMonTool::m_bunchCrossingKey
SG::ReadCondHandleKey< BunchCrossingCondData > m_bunchCrossingKey
Definition: SCTHitEffMonTool.h:133
plotBeamSpotCompare.x2
x2
Definition: plotBeamSpotCompare.py:218
theta
Scalar theta() const
theta method
Definition: AmgMatrixBasePlugin.h:71
Trk::ResidualPull::Unbiased
@ Unbiased
RP with track state that has measurement not included.
Definition: ResidualPull.h:57
SCTHitEffMonTool::m_Eff_summaryHisto
TProfArray m_Eff_summaryHisto
Definition: SCTHitEffMonTool.h:181
TRT_ID.h
This is an Identifier helper class for the TRT subdetector. This class is a factory for creating comp...
PixelAthClusterMonAlgCfg.ybins
ybins
Definition: PixelAthClusterMonAlgCfg.py:163
M_PI
#define M_PI
Definition: ActiveFraction.h:11
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:205
SCTHitEffMonTool::m_minPixelHits
IntegerProperty m_minPixelHits
Definition: SCTHitEffMonTool.h:150
SCT_Monitoring::N_BARRELSx2
@ N_BARRELSx2
Definition: SCT_MonitoringNumbers.h:43
Trk::z0
@ z0
Definition: ParamDefs.h:70
SCTHitEffMonTool::m_requireGuardRing
BooleanProperty m_requireGuardRing
Definition: SCTHitEffMonTool.h:166
athena.value
value
Definition: athena.py:122
InDet::SCT_ClusterContainer
Trk::PrepRawDataContainer< SCT_ClusterCollection > SCT_ClusterContainer
Definition: SCT_ClusterContainer.h:27
SCTHitEffMonTool::m_badChips
const std::map< Identifier, unsigned int > * m_badChips
Definition: SCTHitEffMonTool.h:126
SCT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: SCT_ID.h:728
SCT_Monitoring::BARREL_INDEX
@ BARREL_INDEX
Definition: SCT_MonitoringNumbers.h:19
AtlasDetectorID::is_trt
bool is_trt(Identifier id) const
Definition: AtlasDetectorID.h:782
SCT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: SCT_ID.h:740
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SCTHitEffMonTool::m_requireOtherFace
BooleanProperty m_requireOtherFace
Definition: SCTHitEffMonTool.h:165
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SCT_Monitoring::N_STRIPS
@ N_STRIPS
Definition: SCT_MonitoringNumbers.h:36
SCTHitEffMonTool::m_configConditions
ToolHandle< ISCT_ConfigurationConditionsTool > m_configConditions
Definition: SCTHitEffMonTool.h:138
SCTHitEffMonTool::m_maxChi2
FloatProperty m_maxChi2
Definition: SCTHitEffMonTool.h:153
SCT_Monitoring
Definition: SCT_MonitoringNumbers.h:17
SCT_ID::module_id
Identifier module_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition: SCT_ID.h:416
ReadCondHandle.h
makeTRTBarrelCans.y1
tuple y1
Definition: makeTRTBarrelCans.py:15
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
SCTHitEffMonTool::m_ineffMap
std::array< std::array< TProfile2D *, 2 >, SCT_Monitoring::N_LAYERS_TOTAL > m_ineffMap
Definition: SCTHitEffMonTool.h:172
SCT_ID::get_id
virtual int get_id(const IdentifierHash &hash_id, Identifier &id, const IdContext *context=0) const override final
Create compact id from hash id (return == 0 for OK)
Definition: SCT_ID.cxx:666
Trk::TrackStateOnSurface::Outlier
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
Definition: TrackStateOnSurface.h:122
TRT::Hit::side
@ side
Definition: HitInfo.h:83
SCT_Monitoring::ENDCAP_A_INDEX
@ ENDCAP_A_INDEX
Definition: SCT_MonitoringNumbers.h:19
PixelByteStreamErrors::BCID
@ BCID
Definition: PixelByteStreamErrors.h:13
SCTHitEffMonTool::procHistograms
virtual StatusCode procHistograms() override final
An inheriting class should either override this function or finalHists().
Definition: SCTHitEffMonTool.cxx:870
SCTHitEffMonTool::m_vetoBadChips
BooleanProperty m_vetoBadChips
Definition: SCTHitEffMonTool.h:167
SCTHitEffMonTool::m_Eff_LumiBlockHisto_Total
TProfile * m_Eff_LumiBlockHisto_Total
Definition: SCTHitEffMonTool.h:178
SCT_Monitoring::N_REGIONS_INC_GENERAL
@ N_REGIONS_INC_GENERAL
Definition: SCT_MonitoringNumbers.h:19
SCTHitEffMonTool::findAnglesToWaferSurface
StatusCode findAnglesToWaferSurface(const Amg::Vector3D &mom, const Identifier id, const InDetDD::SiDetectorElementCollection *elements, double &theta, double &phi) const
Method to compute incident angle of track to wafer.
Definition: SCTHitEffMonTool.cxx:917
ManagedMonitorToolBase::MonGroup
A container of information describing a monitoring object.
Definition: ManagedMonitorToolBase.h:138
SCT_Monitoring::N_BARRELS
@ N_BARRELS
Definition: SCT_MonitoringNumbers.h:43
SCTHitEffMonTool::m_SCTDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
Definition: SCTHitEffMonTool.h:131
SCTHitEffMonTool::m_Eff_summaryHistoFirstBCID
TProfArray m_Eff_summaryHistoFirstBCID
Definition: SCTHitEffMonTool.h:182
ParticleGun_EoverP_Config.mom
mom
Definition: ParticleGun_EoverP_Config.py:63
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
SCT3_RawData.h
ManagedMonitorToolBase::initialize
virtual StatusCode initialize()
Definition: ManagedMonitorToolBase.cxx:669
SCTHitEffMonTool::m_isCosmic
BooleanProperty m_isCosmic
Definition: SCTHitEffMonTool.h:161
Trk::TrackStateOnSurface::Hole
@ Hole
A hole on the track - this is defined in the following way.
Definition: TrackStateOnSurface.h:128
SCTHitEffMonTool::m_effLumiBlock
std::array< std::array< TProfile *, 2 >, SCT_Monitoring::N_LAYERS_TOTAL > m_effLumiBlock
Definition: SCTHitEffMonTool.h:173
lumiFormat.i
int i
Definition: lumiFormat.py:92
SCTHitEffMonTool::m_sctId
const SCT_ID * m_sctId
Definition: SCTHitEffMonTool.h:142
SCTHitEffMonTool::m_Eff_TotalBCID
TProfile * m_Eff_TotalBCID
Definition: SCTHitEffMonTool.h:176
Trk::theta
@ theta
Definition: ParamDefs.h:72
SCTHitEffMonTool::bookHistogramsRecurrent
virtual StatusCode bookHistogramsRecurrent() override final
An inheriting class should either override this function, bookHists() or bookHistograms().
Definition: SCTHitEffMonTool.cxx:311
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Trk::numberOfSCTHits
@ numberOfSCTHits
number of SCT holes
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:71
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
AthenaMonManager::online
@ online
Definition: AthenaMonManager.h:49
SCT_Monitoring::LayerSideFormatter
format an element index (e.g.
Definition: SCT_NameFormatter.h:20
AmgVector
AmgVector(4) T2BSTrackFilterTool
Definition: T2BSTrackFilterTool.cxx:114
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
makeTRTBarrelCans.y2
tuple y2
Definition: makeTRTBarrelCans.py:18
covarianceTool.title
title
Definition: covarianceTool.py:542
SCTHitEffMonTool::fillHistograms
virtual StatusCode fillHistograms() override final
Histogram filling method.
Definition: SCTHitEffMonTool.cxx:430
SCTHitEffMonTool::m_effMapFirstBCID
std::array< std::array< TProfile2D *, 2 >, SCT_Monitoring::N_LAYERS_TOTAL > m_effMapFirstBCID
Definition: SCTHitEffMonTool.h:171
SCTHitEffMonTool::m_sctContainerName
SG::ReadHandleKey< InDet::SCT_ClusterContainer > m_sctContainerName
Definition: SCTHitEffMonTool.h:128
BunchCrossingCondData::BunchCrossings
@ BunchCrossings
Distance in units of 25 nanoseconds.
Definition: BunchCrossingCondData.h:132
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:522
AtlasFieldCache.h
ManagedMonitorToolBase::ATTRIB_UNMANAGED
@ ATTRIB_UNMANAGED
Definition: ManagedMonitorToolBase.h:131
TRT::Track::d0
@ d0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:62
SCTHitEffMonTool::previousChip
int previousChip(double xl, int side, bool swap) const
Method to find the chip just before a given hit.
Definition: SCTHitEffMonTool.cxx:904
SCTHitEffMonTool::m_maxPhiAngle
FloatProperty m_maxPhiAngle
Definition: SCTHitEffMonTool.h:152
PixelAthClusterMonAlgCfg.zmax
zmax
Definition: PixelAthClusterMonAlgCfg.py:176
test_pyathena.parent
parent
Definition: test_pyathena.py:15
SCTHitEffMonTool::m_TrackName
SG::ReadHandleKey< TrackCollection > m_TrackName
Definition: SCTHitEffMonTool.h:129
AthenaMonManager.h
InDetHierarchy.h
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SCTHitEffMonTool::m_trtId
const TRT_ID * m_trtId
Definition: SCTHitEffMonTool.h:143
SCT_ID::wafer_context
IdContext wafer_context(void) const
Definition: SCT_ID.h:705
SCT_ID::wafer_hash
IdentifierHash wafer_hash(const Identifier &wafer_id) const
wafer hash from id - optimized
Definition: SCT_ID.h:492
TrackSummary.h
Trk::ParametersBase
Definition: ParametersBase.h:55
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
SH::MetaObject::swap
void swap(MetaObject &a, MetaObject &b)
standard swap
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
SCT_ID::get_other_side
int get_other_side(const IdentifierHash &id, IdentifierHash &other) const
Wafer hash on other side.
Definition: SCT_ID.cxx:435
InDet::SCT_Cluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SCT_Cluster.h:34
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
SCTHitEffMonTool::m_comTimeName
SG::ReadHandleKey< ComTime > m_comTimeName
Definition: SCTHitEffMonTool.h:130
MagField::AtlasFieldCache::solenoidOn
bool solenoidOn() const
status of the magnets
SCTHitEffMonTool.h
ManagedMonitorToolBase::MonGroup::regHist
StatusCode regHist(TH1 *h)
Registers a TH1 (including TH2, TH3, and TProfile) to be included in the output stream using logical ...
Definition: ManagedMonitorToolBase.cxx:195
ManagedMonitorToolBase::m_environment
AthenaMonManager::Environment_t m_environment
Definition: ManagedMonitorToolBase.h:902
SCTHitEffMonTool::layerIndex2layer
int layerIndex2layer(const int index) const
Convert a layer/disk number (0-21) to a layer number (0-8 for endcaps, 0-3 for barrel)
Definition: SCTHitEffMonTool.cxx:1019
min
#define min(a, b)
Definition: cfImp.cxx:40
BunchCrossingCondData::distanceFromFront
int distanceFromFront(const bcid_type bcid, const BunchDistanceType type=NanoSec) const
The distance of the specific bunch crossing from the front of the train.
Definition: BunchCrossingCondData.cxx:35
Trk::PrepRawData
Definition: PrepRawData.h:62
SCTHitEffMonTool::bookEffHisto
StatusCode bookEffHisto(T *&histo, MonGroup &MG, TString name, TString title, int nbin, double x1, double x2) const
Single histogram booking method.
Definition: SCTHitEffMonTool.cxx:947
Trk::MeasurementBase
Definition: MeasurementBase.h:58
SCTHitEffMonTool::m_minTRTHits
IntegerProperty m_minTRTHits
Definition: SCTHitEffMonTool.h:147
AtlasDetectorID::print_to_string
std::string print_to_string(Identifier id, const IdContext *context=0) const
or provide the printout in string form
Definition: AtlasDetectorID.cxx:655
SCT_Monitoring::GENERAL_INDEX
@ GENERAL_INDEX
Definition: SCT_MonitoringNumbers.h:19
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
errorcheck::ReportMessage::hideErrorLocus
static void hideErrorLocus(bool flag=true)
If set to true, hide the source file and line number in the output.
Definition: errorcheck.cxx:197
SCTHitEffMonTool::m_effdistcut
FloatProperty m_effdistcut
Definition: SCTHitEffMonTool.h:156
Trk::TrackSummary
A summary of the information contained by a track.
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:287
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
Trk::d0
@ d0
Definition: ParamDefs.h:69
IdentifierHash.h
errorcheck.h
Helpers for checking error return status codes and reporting errors.
SCT_ID::layer_disk
int layer_disk(const Identifier &id) const
Definition: SCT_ID.h:734
SCTHitEffMonTool::m_Eff_hashCodeHisto
TProfile * m_Eff_hashCodeHisto
Definition: SCTHitEffMonTool.h:177
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
SCTHitEffMonTool::getResidual
double getResidual(const Identifier &surfaceID, const Trk::TrackParameters *trkParam, const InDet::SCT_ClusterContainer *p_sctclcontainer) const
Computes residual of a hit to a track.
Definition: SCTHitEffMonTool.cxx:976
SCTHitEffMonTool::m_maxZ0sinTheta
FloatProperty m_maxZ0sinTheta
Definition: SCTHitEffMonTool.h:157
SiDetectorElement.h
SCTHitEffMonTool::m_residualPullCalculator
ToolHandle< Trk::IResidualPullCalculator > m_residualPullCalculator
Definition: SCTHitEffMonTool.h:135
SCTHitEffMonTool::m_useSCTorTRT
BooleanProperty m_useSCTorTRT
Definition: SCTHitEffMonTool.h:163
ISCT_ConfigurationConditionsTool.h
LArCellBinning.xbins
int xbins
Definition: LArCellBinning.py:163
SCTHitEffMonTool::m_requireEnclosingHits
BooleanProperty m_requireEnclosingHits
Definition: SCTHitEffMonTool.h:164
Trk::TrackInfo::SiSPSeededFinder
@ SiSPSeededFinder
Tracks from SiSPSeedFinder.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:102
ManagedMonitorToolBase::run
@ run
Definition: ManagedMonitorToolBase.h:116
SCTHitEffMonTool::m_effdistribution
TH1F * m_effdistribution
Definition: SCTHitEffMonTool.h:179
DeMoScan.index
string index
Definition: DeMoScan.py:362
SCTHitEffMonTool::m_minOtherHits
IntegerProperty m_minOtherHits
Definition: SCTHitEffMonTool.h:148
SCT_Monitoring::N_CHIPS
@ N_CHIPS
Definition: SCT_MonitoringNumbers.h:37
SCTHitEffMonTool::m_minSCTHits
IntegerProperty m_minSCTHits
Definition: SCTHitEffMonTool.h:146
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
SCT_Monitoring::N_DISKS
@ N_DISKS
Definition: SCT_MonitoringNumbers.h:44
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
SCT_ID::eta_module
int eta_module(const Identifier &id) const
Definition: SCT_ID.h:746
MagField::AtlasFieldCache
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
Definition: AtlasFieldCache.h:43
SCTHitEffMonTool::becIdxLayer2Index
int becIdxLayer2Index(const int becIdx, const int layer) const
Definition: SCTHitEffMonTool.cxx:1028
SCTHitEffMonTool::initialize
virtual StatusCode initialize() override final
Definition: SCTHitEffMonTool.cxx:137
SCT_ID::side
int side(const Identifier &id) const
Definition: SCT_ID.h:752
SCTHitEffMonTool::m_fieldCondObjInputKey
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
Definition: SCTHitEffMonTool.h:132
dqt_zlumi_alleff_HIST.eff
int eff
Definition: dqt_zlumi_alleff_HIST.py:113
SCTHitEffMonTool::m_Eff_LumiBlockHisto
TProfArray m_Eff_LumiBlockHisto
Definition: SCTHitEffMonTool.h:183
merge.status
status
Definition: merge.py:17
SCTHitEffMonTool::m_gpath
std::string m_gpath
Definition: SCTHitEffMonTool.h:125
SCTHitEffMonTool::m_useIDGlobal
BooleanProperty m_useIDGlobal
Definition: SCTHitEffMonTool.h:168
SCTHitEffMonTool::m_minPt
FloatProperty m_minPt
Definition: SCTHitEffMonTool.h:155
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
SCTHitEffMonTool::bookHistograms
virtual StatusCode bookHistograms() override final
Histogram booking method.
Definition: SCTHitEffMonTool.cxx:180
ReadHandle.h
Handle class for reading from StoreGate.
SCT_ID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side) const
For a single side of module.
Definition: SCT_ID.h:464
SCTHitEffMonTool::m_insideOutOnly
BooleanProperty m_insideOutOnly
Definition: SCTHitEffMonTool.h:160
SCTHitEffMonTool::SCTHitEffMonTool
SCTHitEffMonTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
Definition: SCTHitEffMonTool.cxx:115
Trk::loc1
@ loc1
Definition: ParamDefs.h:40
plotBeamSpotCompare.histo
histo
Definition: plotBeamSpotCompare.py:415
InDet::SCT_ClusterCollection
Trk::PrepRawDataCollection< SCT_Cluster > SCT_ClusterCollection
Definition: SCT_ClusterCollection.h:26
IdContext
class IdContext
Definition: IdContext.h:34
updateCoolNtuple.limit
int limit
Definition: updateCoolNtuple.py:45
InDetDD::SiDetectorElementCollection::getDetectorElement
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Definition: SiDetectorElementCollection.cxx:15
Trk::TrackStateOnSurface::Measurement
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
Definition: TrackStateOnSurface.h:101
SCT_Monitoring::N_DISKSx2
@ N_DISKSx2
Definition: SCT_MonitoringNumbers.h:44
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
SCTHitEffMonTool::m_pixelId
const PixelID * m_pixelId
Definition: SCTHitEffMonTool.h:141
SCTHitEffMonTool::m_holeSearchTool
ToolHandle< Trk::ITrackHoleSearchTool > m_holeSearchTool
Definition: SCTHitEffMonTool.h:137
ManagedMonitorToolBase::newRunFlag
bool newRunFlag() const
Definition: ManagedMonitorToolBase.h:854
SCTHitEffMonTool::m_Eff_Total
TProfile * m_Eff_Total
Definition: SCTHitEffMonTool.h:175
SCT_Monitoring::summary
@ summary
Definition: SCT_MonitoringNumbers.h:65