ATLAS Offline Software
SCTHitsNoiseMonTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
14 #include "SCTHitsNoiseMonTool.h"
15 
16 #include "SCT_NameFormatter.h"
17 
20 #include "InDetIdentifier/SCT_ID.h"
22 #include "LWHists/TH1F_LW.h"
23 #include "LWHists/TH2F_LW.h"
24 #include "LWHists/TProfile_LW.h"
26 #include "StoreGate/ReadHandle.h"
32 #include "TrkTrack/Track.h"
33 
34 #include "TMath.h"
35 #include "TH1F.h"
36 #include "TProfile2D.h"
37 
38 #include <algorithm>
39 #include <fstream> // for writing an xml summary (debugging)
40 #include <iostream>
41 
42 using namespace SCT_Monitoring;
46 namespace { // use anonymous namespace to restrict scope to this file, equivalent to 'static' keyword here
47  // Possible timing patterns, IXX is 1XX etc.
48  enum
49  Pattern {
50  IXX=0, XIX, XXI
51  };
52 
53  // string names for the detector parts
54  static const std::string names[N_REGIONS] = {
55  "Endcap C", "Barrel", "Endcap A"
56  };
57  // abbreviations for detector parts
58  static const std::string abbreviations[N_REGIONS] = {
59  "ECm", "", "ECp"
60  };
61  static const std::string streamDelimiter{"_"};
62 
63  // is the timebin in the desired pattern?
64  bool
65  timeBinInPattern(const int tbin, const Pattern xxx) {
66  switch (xxx) {
67  case IXX:
68  return (tbin > 3);
69 
70  break;
71 
72  case XIX:
73  return ((tbin == 2) or (tbin == 3) or (tbin == 6) or (tbin == 7));
74 
75  break;
76 
77  case XXI:
78  return ((tbin == 1) or (tbin == 3) or (tbin == 5) or (tbin == 7));
79 
80  break;
81 
82  default:
83  // cout<<"A strange timepattern was found; this should never happen"<<endl;
84  return false;
85 
86  break;
87  }
88  }
89 }// end of anonymous namespace
90 
91 // ====================================================================================================
98 // ====================================================================================================
100  const std::string& name,
101  const IInterface* parent) :
103 }
104 
105 // ====================================================================================================
106 // ====================================================================================================
109  ATH_CHECK(m_dataObjectName.initialize());
111  ATH_CHECK(m_tracksName.initialize());
112 
114 
115  // Get the helper:
116  ATH_CHECK(detStore()->retrieve(m_pSCTHelper, "SCT_ID"));
117  ATH_CHECK(m_ConfigurationTool.retrieve());
118 
120 }
121 
122 // ====================================================================================================
123 // SCTHitsNoiseMonTool :: bookHistograms
124 // ====================================================================================================
127  ATH_MSG_DEBUG("initialize being called");
128  if (newRunFlag()) {
129  m_numberOfEvents = 0;
130  }
131 
132  const bool doSystem[N_REGIONS] = {
134  };
135  if (m_doTrackHits and bookGeneralTrackTimeHistos().isFailure()) {
136  ATH_MSG_WARNING("Error in bookGeneralTrackTimeHistos()");
137  }
138  for (unsigned int det{0}; det < N_REGIONS; ++det) {
139  if (doSystem[det]) {
140  if (m_doTrackHits and bookGeneralTrackHits(det).isFailure()) {
141  ATH_MSG_WARNING("Error in bookGeneralTrackHits()");
142  }
143  if (bookGeneralNoiseOccupancyMaps(det).isFailure()) {
144  ATH_MSG_WARNING("Error in bookGeneralNoiseOccupancyMaps()");
145  }
146  if (bookGeneralHitOccupancyMaps(det).isFailure()) {
147  ATH_MSG_WARNING("Error in bookGeneralHitOccupancyMaps()");
148  }
149  if (bookGeneralHits(det).isFailure()) {
150  ATH_MSG_WARNING("Error in bookGeneralHits()");
151  }
152  }
153  }
154 
155  if (bookNoiseDistributions().isFailure()) {
156  ATH_MSG_WARNING("Error in bookNoiseDistributions()");
157  }
158 
159  if (m_boolhitmaps) {
160  if (book1DHitHists().isFailure()) {
161  ATH_MSG_WARNING("Error in barrel book1DHitHists()");
162  }
163  // Only want these histograms when running the code offline
164  }
165 
166  if (bookClusterSize().isFailure()) {
167  ATH_MSG_WARNING("Error in bookClusterSize()");
168  }
169 
170  if (newRunFlag()) {
171  // book hits histogram
172  MonGroup clu{this, "SCT/GENERAL/hits/summary", ManagedMonitorToolBase::run, ATTRIB_UNMANAGED};
173  m_ncluHisto = new TH1F{"sct_hits", "Total SCT Hits", N_NOISE_HIT_BINS, FIRST_NOISE_HIT_BIN, LAST_NOISE_HIT_BIN};
174  m_ncluHisto->GetXaxis()->SetTitle("Total SCT Hits");
175  m_ncluHisto->GetYaxis()->SetTitle("Entries");
176  if (clu.regHist(m_ncluHisto).isFailure()) {
177  ATH_MSG_WARNING("Cannot book Histogram: SCT/GENERAL/hits/summary/sct_hits");
178  }
179  if (initializeNoiseMaps().isFailure()) {
180  ATH_MSG_WARNING("Failed to initalize noise occupancy maps!");
181  }
182  }
183 
184  return StatusCode::SUCCESS;
185 }
186 
187 // ====================================================================================================
188 // SCTHitsNoiseMonTool :: bookHistograms
189 // ====================================================================================================
192  ATH_MSG_DEBUG("bookHistogramsRecurrent being called");
193  m_numberOfEvents = 0;
194 
195  const bool doSystem[N_REGIONS] = {
197  };
198  if (m_doTrackHits and bookGeneralTrackTimeHistos().isFailure()) {
199  ATH_MSG_WARNING("Error in bookGeneralTrackTimeHistos()");
200  }
201  for (unsigned int det{0}; det < N_REGIONS; ++det) {
202  if (doSystem[det]) {
203  if (m_doTrackHits and bookGeneralTrackHits(det).isFailure()) {
204  ATH_MSG_WARNING("Error in bookGeneralTrackHits()");
205  }
206  if (bookGeneralNoiseOccupancyMaps(det).isFailure()) {
207  ATH_MSG_WARNING("Error in bookGeneralNoiseOccupancyMaps()");
208  }
209  if (bookGeneralHitOccupancyMaps(det).isFailure()) {
210  ATH_MSG_WARNING("Error in bookGeneralHitOccupancyMaps()");
211  }
212  if (bookGeneralHits(det).isFailure()) {
213  ATH_MSG_WARNING("Error in bookGeneralHits()");
214  }
215  }
216  }
217 
218  if (bookNoiseDistributions().isFailure()) {
219  ATH_MSG_WARNING("Error in bookNoiseDistributions()");
220  }
221 
222  if (m_boolhitmaps) {
223  if (book1DHitHists().isFailure()) {
224  ATH_MSG_WARNING("Error in barrel book1DHitHists()");
225  }
226  // Only want these histograms when running the code offline
227  }
228 
229  if (bookClusterSize().isFailure()) {
230  ATH_MSG_WARNING("Error in bookClusterSize()");
231  }
232 
233  // book hits histogram
234  MonGroup clu{this, "SCT/GENERAL/hits/summary", ManagedMonitorToolBase::run, ATTRIB_UNMANAGED};
235  m_ncluHisto = new TH1F("sct_hits", "Total SCT Hits", N_HIT_BINS * 20, FIRST_HIT_BIN, LAST_HIT_BIN * 3000);
236  m_ncluHisto->GetXaxis()->SetTitle("Total SCT Hits");
237  m_ncluHisto->GetYaxis()->SetTitle("Entries");
238  if (clu.regHist(m_ncluHisto).isFailure()) {
239  ATH_MSG_WARNING("Cannot book Histogram: SCT/GENERAL/hits/summary/sct_hits");
240  }
241  if (initializeNoiseMaps().isFailure()) {
242  ATH_MSG_WARNING("Failed to initalize noise occupancy maps!");
243  }
244 
245  return StatusCode::SUCCESS;
246 }
247 
248 // ====================================================================================================
249 // SCTHitsNoiseMonTool :: fillHistograms
250 // This is the real workhorse, called for each event. It retrieves the data each time
251 // ====================================================================================================
256  const EventContext& ctx{Gaudi::Hive::currentContext()};
257  const EventIDBase& pEvent{ctx.eventID()};
258  const int lb{static_cast<int>(pEvent.lumi_block())};
259  // If track hits are selected, make the vector of track rdo identifiers
260  if (m_doTrackHits) {
261  if (makeVectorOfTrackRDOIdentifiers().isFailure()) {
262  ATH_MSG_WARNING("Couldn't make vector of track RDO identifiers");
263  }
264  }
265  if (generalHistsandNoise(ctx).isFailure()) {
266  ATH_MSG_WARNING("Error in generalHists");
267  }
268 
270  if ((m_numberOfEvents % m_checkrate) == 0) {
271  if (checkNoiseMaps().isFailure()) {
272  ATH_MSG_WARNING("Error in checkNoiseMaps()");
273  }
274  }
275  if ((lb % m_checkrecent == 0) and (lb > m_last_reset_lb)) {
276  if (checkNoiseMaps().isFailure()) {
277  ATH_MSG_WARNING("Error in checkNoiseMaps()");
278  }
279  if (resetNoiseMapsRecent().isFailure()) {
280  ATH_MSG_WARNING("Error in resetNoiseMapsRecent");
281  }
282  if (resetHitMapHists().isFailure()) {
283  ATH_MSG_WARNING("Error in resetHitMapsRecent");
284  }
287  }
288  }
289 
290  return StatusCode::SUCCESS;
291 }
292 
293 // ====================================================================================================
294 // SCTHitsNoiseMonTool :: procHistograms
295 // PJB 08/08/2005
296 // Here we have the statistics by plane which can be written to the
297 // overall statistics object (the map) and then sent to the DB
298 // ====================================================================================================
301  bool endOfEventsBlock{endOfLumiBlockFlag()};
302  if (endOfEventsBlock) {
303  if (checkNoiseMaps().isFailure()) {
304  ATH_MSG_WARNING("Error in checkNoiseMaps()");
305  }
306  }
307  return StatusCode::SUCCESS;
308 }
309 
310 // ====================================================================================================
311 // SCTHitsNoiseMonTool :: checkHists
312 // DD 08/10/2010
313 // Inherited method from base class that gets called by monitoring finalize after procHists - not used
314 // at this time. Previously was and unnecessary middle function between procHistograms and
315 // checkNoiseMaps which caused checkNoiseMaps to be called twice float-filling NO histograms
316 // ====================================================================================================
318 SCTHitsNoiseMonTool::checkHists(bool /*fromFinalize*/) {
319  return StatusCode::SUCCESS;
320 }
321 
322 // ====================================================================================================
323 // SCTHitsNoiseMonTool :: generalHistsandNoise
324 //
325 // This method adds the spBasedNoise algorithm to the main RDO loop in an attempt to speed things up
326 // Once this works, it'll be the default- the old methods will be left as backups because we know they definitely work!
327 // This code was added by Martin White in June 2008
328 // Note that this is the only function with the online IPC functionality implemented- if you revert to the old methods
329 // you'll lose it
330 // ====================================================================================================
333  const EventIDBase& pEvent{ctx.eventID()};
334  const int lb{static_cast<int>(pEvent.lumi_block())};
335 
337  if (not rdoContainer.isValid()) {
338  return StatusCode::FAILURE;
339  }
340  // Get the space point container
342  if (not spacePointContainer.isValid()) {
343  return StatusCode::FAILURE;
344  }
345 
346  const unsigned int wafer_hash_max{static_cast<unsigned int>(m_pSCTHelper->wafer_hash_max())};
347  std::vector<float> occ(wafer_hash_max, 0.);
348  std::vector<float> hitOcc(wafer_hash_max, 0.);
349 
350  // Use new IDC
351  int local_tothits{0};
352 
353  bool isSelectedTrigger{false};
354  // EDAVIES - have now changed back to using L1_RD0_EMPTY
355  if (m_doTrigger) {
357  if (m_trigDecTool->isPassed(m_NOTriggerItem)) {
358  isSelectedTrigger = true;
359  }
360  }
361  }
362 
363  std::vector<int> barrel_local_nhitslayer(N_BARRELSx2, 0);
364  std::vector<int> ECp_local_nhitslayer(N_DISKSx2, 0);
365  std::vector<int> ECm_local_nhitslayer(N_DISKSx2, 0);
366  std::vector<int>* hitsInLayer[N_REGIONS] = {
367  &ECm_local_nhitslayer, &barrel_local_nhitslayer, &ECp_local_nhitslayer
368  };
369  const bool doThisSubsystem[N_REGIONS] = {
371  };
372  // Outer Loop on RDO Collection
373  for (const InDetRawDataCollection<SCT_RDORawData>* rdoCollection: *rdoContainer) {
374  if (rdoCollection==nullptr) {
375  continue; // select only SCT RDOs
376  }
377  // MJW new code- try getting the ID of the collection using the identify() method
378  const Identifier wafer_id{rdoCollection->identify()};
379  const IdentifierHash wafer_hash{rdoCollection->identifyHash()};
380  const Identifier module_id{m_pSCTHelper->module_id(wafer_id)};
381  const IdentifierHash theModuleHash0{m_pSCTHelper->wafer_hash(module_id)};
382  IdentifierHash theModuleHash1;
383  m_pSCTHelper->get_other_side(theModuleHash0, theModuleHash1);
384  const int thisBec{m_pSCTHelper->barrel_ec(wafer_id)};
385  const int thisLayerDisk{m_pSCTHelper->layer_disk(wafer_id)};
386  const int thisPhi{m_pSCTHelper->phi_module(wafer_id)};
387  const int thisEta{m_pSCTHelper->eta_module(wafer_id)};
388  const int thisSide{m_pSCTHelper->side(wafer_id)};
389  const int thisElement{(N_SIDES * thisLayerDisk) + thisSide};
390  unsigned int systemIndex{bec2Index(thisBec)};
391 
392  int numberOfHitsFromSPs{0};
393  int numberOfHitsFromAllRDOs{0};
394  // Now we want the space point container for this module
395  // We have to compare module IDs- the SP collection is defined for the 'normal' (i.e. no stereo) module side
396  // Define a set of spIDs
397  std::unordered_set<Identifier> mySetOfSPIds;
398  for (int side{0}; side<N_SIDES; side++) {
399  auto spContainer{spacePointContainer->indexFindPtr(side==0 ? theModuleHash0 : theModuleHash1)};
400  if (spContainer==nullptr) continue;
401  for (const Trk::SpacePoint* sp: *spContainer) {
402  const std::vector<Identifier>& rdoList{(side==thisSide ? sp->clusterList().first->rdoList() : sp->clusterList().second->rdoList())};
403  mySetOfSPIds.insert(rdoList.begin(), rdoList.end());
404  }
405  }
406  // Now we loop over the RDOs in the RDO collection, and add to the NO vector any that are in the mySetOfSPIds
407  for (const SCT_RDORawData* rdo: *rdoCollection) {
408  const Identifier strip_id{rdo->identify()};
409  const int firstStrip{m_pSCTHelper->strip(strip_id)};
410  const int numberOfStrips{rdo->getGroupSize()};
411  const int limit{firstStrip + numberOfStrips};
412 
413  if (doThisSubsystem[systemIndex]) {
414  const SCT3_RawData* rdo3{dynamic_cast<const SCT3_RawData*>(rdo)};
415  int tbin{3};
416  if (rdo3) {
417  tbin = rdo3->getTimeBin();
418  }
419 
420  TH2F_LW* histogram{m_phitsHistoVector[systemIndex][thisElement]};
421  TH2F_LW* histogram_recent{nullptr};
423  histogram_recent = m_phitsHistoVectorRecent[systemIndex][thisElement];
424  }
425  if (m_RDOsOnTracks[wafer_hash].find(strip_id) != m_RDOsOnTracks[wafer_hash].end()) {
426  for (int ichan{firstStrip}; ichan < limit; ++ichan) {
427  m_ptrackhitsHistoVector[systemIndex][thisElement]->Fill(thisEta, thisPhi);
429  m_ptrackhitsHistoVectorRecent[systemIndex][thisElement]->Fill(thisEta, thisPhi);
430  }
431  // Fill the track hits histogram
432  double dTbin{static_cast<double>((tbin == 2) or (tbin == 3))};
433  m_tbinfracall->Fill(systemIndex, dTbin);
434  }
435  }
436  histogram->Fill(thisEta, thisPhi, numberOfStrips);
438  histogram_recent->Fill(thisEta, thisPhi, numberOfStrips);
439  }
440  numberOfHitsFromAllRDOs += numberOfStrips;
441  // Record number of hits in space points if timebin filtering is on hits not in bin X1X are counted as in space
442  // points
443  if (mySetOfSPIds.find(strip_id) != mySetOfSPIds.end()) {
444  numberOfHitsFromSPs += numberOfStrips;
445  } else if (m_doTimeBinFilteringForNoise and (not timeBinInPattern(tbin, XIX))) {
446  numberOfHitsFromSPs += numberOfStrips;
447  }
448  }
449  (*hitsInLayer[systemIndex])[thisElement] += numberOfStrips;
450  local_tothits += numberOfStrips;
451 
452  if (m_boolhitmaps) {
453  for (int ichan{firstStrip}; ichan < limit; ++ichan) {
454  (m_phitmapHistoVector[wafer_hash])->Fill(ichan, 1.0); // increment channel hit for this plane
455  }
456  }
457  } // End of Loop on rdoCollection, so end of loop over the RDOs in the RDO container
458  // We can now do the NO calculation for this wafer
459  // For the Time Dependent plots
460 
461  if (numberOfHitsFromAllRDOs > 0) {
462  m_HallHits_vsLB[systemIndex]->Fill(lb, numberOfHitsFromAllRDOs);
463  m_HSPHits_vsLB[systemIndex]->Fill(lb, numberOfHitsFromSPs);
464  if (isSelectedTrigger) {
465  m_HallHitsTrigger_vsLB[systemIndex]->Fill(lb, numberOfHitsFromAllRDOs);
466  m_HSPHitsTrigger_vsLB[systemIndex]->Fill(lb, numberOfHitsFromSPs);
467  }
468 
469  int den{N_STRIPS - numberOfHitsFromSPs};
470  int num{numberOfHitsFromAllRDOs - numberOfHitsFromSPs};
471  if (num < 0) {
472  num = 0;
473  ATH_MSG_WARNING("Too many reconstructed space points for number of real hits");
474  }
475  if (den > 0) {
476  occ[wafer_hash] = static_cast<float>(num) / static_cast<float>(den) * 1.E5;
477  }
478  hitOcc[wafer_hash] = static_cast<float>(numberOfHitsFromAllRDOs) / static_cast<float>(N_STRIPS) * 1.E5;
479 
481  float sumocc{0.};
482  if (den > 0) {
483  sumocc = num / static_cast<float> (den);
484  m_occSumUnbiasedRecent[wafer_id] += sumocc;
485  }
486 
487  // hit occupancy
488  float sumhitocc{static_cast<float> (numberOfHitsFromAllRDOs) / static_cast<float> (N_STRIPS)};
489  m_hitoccSumUnbiasedRecent[wafer_id] += sumhitocc;
490  }
491  // end of hit occupancy*/
492  }
493  }// End of Loop on RDO container
494 
495  for (unsigned int iHash{0}; iHash<wafer_hash_max; iHash++) {
496  const IdentifierHash wafer_hash{iHash};
497  if (not m_ConfigurationTool->isGood(wafer_hash)) continue;
498 
499  const Identifier wafer_id{m_pSCTHelper->wafer_id(wafer_hash)};
500  const int barrel_ec{m_pSCTHelper->barrel_ec(wafer_id)};
501  const unsigned int systemIndex{bec2Index(barrel_ec)};
502  m_NO_vsLB[systemIndex ]->Fill(lb, occ[iHash]);
503  m_NO_vsLB[GENERAL_INDEX]->Fill(lb, occ[iHash]);
504  m_HO_vsLB[systemIndex ]->Fill(lb, hitOcc[iHash]);
505  m_HO_vsLB[GENERAL_INDEX]->Fill(lb, hitOcc[iHash]);
506  if (isSelectedTrigger) {
507  m_NOTrigger_vsLB[systemIndex ]->Fill(lb, occ[iHash]);
508  m_NOTrigger_vsLB[GENERAL_INDEX]->Fill(lb, occ[iHash]);
509  m_HOTrigger_vsLB[systemIndex ]->Fill(lb, hitOcc[iHash]);
510  m_HOTrigger_vsLB[GENERAL_INDEX]->Fill(lb, hitOcc[iHash]);
511  }
512  if (doThisSubsystem[systemIndex]) {
513  const int element{N_SIDES * m_pSCTHelper->layer_disk(wafer_id) + m_pSCTHelper->side(wafer_id)};
514  const int eta{m_pSCTHelper->eta_module(wafer_id)};
515  const int phi{m_pSCTHelper->phi_module(wafer_id)};
516  if (isSelectedTrigger) m_pnoiseoccupancymapHistoVectorTrigger[systemIndex][element]->Fill(eta, phi, occ[iHash]);
517  m_phitoccupancymapHistoVector[systemIndex][element]->Fill(eta, phi, hitOcc[iHash]);
518  }
519  }
520 
521  m_ncluHisto->Fill(local_tothits, 1);
522 
523  if (m_boolhitmaps) {
524  for (unsigned int iReg{0}; iReg<N_REGIONS; iReg++) {
525  if ((iReg==BARREL_INDEX) or
526  ((iReg==ENDCAP_A_INDEX) and m_doPositiveEndcap) or
527  ((iReg==ENDCAP_C_INDEX) and m_doNegativeEndcap)) {
528  for (int i{0}; i < ((iReg==BARREL_INDEX) ? N_BARRELSx2 : N_DISKSx2); ++i) {
529  m_ncluHistoVector[iReg][i]->Fill(barrel_local_nhitslayer[i], 1.);
530  }
531  }
532  }
533  }
534 
535  // Fill Cluster size histogram
537  if (not clusterContainer.isValid()) {
538  ATH_MSG_WARNING("Couldn't retrieve clusters");
539  }
540  for (const InDet::SCT_ClusterCollection* clusterCollection: *clusterContainer) {
541  for (const InDet::SCT_Cluster* cluster: *clusterCollection) {
542  long unsigned int GroupSize{cluster->rdoList().size()};
543  // Fill Cluster Size histogram
544  m_clusize->Fill(GroupSize, 1.);
545 
547  m_clusizeRecent->Fill(GroupSize, 1.);
548  }
549  }
550  }
551  // } // Uncomment this line as well to turn off cluster hists in online
552 
553  return StatusCode::SUCCESS;
554 }
555 
556 // ====================================================================================================
557 // SCTHitsNoiseMonTool :: book1DHitHists
558 // Book HitMaps histograms for all present SCT modules
559 // using ToolRootHistSvc()
560 // The histograms go to the subdirectory ../hitmaps/
561 // to improve readability
562 // ====================================================================================================
565  if (newRunFlag()) {
566  m_phitmapHistoVector.clear();
567  MonGroup HitHists[N_REGIONS]{{this, "SCT/SCTEC/hitmaps", ManagedMonitorToolBase::run, ATTRIB_UNMANAGED},
568  {this, "SCT/SCTB/hitmaps", ManagedMonitorToolBase::run, ATTRIB_UNMANAGED},
569  {this, "SCT/SCTEA/hitmaps", ManagedMonitorToolBase::run, ATTRIB_UNMANAGED}};
570  //
573  for (; planeIterator not_eq planeEnd; ++planeIterator) {
574  Identifier planeId{*planeIterator};
575  const int bec{m_pSCTHelper->barrel_ec(planeId)};
576  const unsigned int systemIndex{bec2Index(bec)};
577  const std::string formattedPosition{positionString(*planeIterator)};
578  std::string histotitle{std::string("SCT ") + names[systemIndex] + " Hitmap: plane " + formattedPosition};
579  h1Factory(formattedPosition, histotitle, HitHists[systemIndex], m_phitmapHistoVector,
580  FIRST_STRIP - 0.5, LAST_STRIP + 0.5, N_BINS);
581  if (bec == BARREL) ATH_MSG_DEBUG("Have registered the barrel hists");
582  ATH_MSG_DEBUG("Have registered the hists");
583  }
584  }
585  return StatusCode::SUCCESS;
586 }
587 
589 SCTHitsNoiseMonTool::bookGeneralHits(const unsigned int systemIndex) {
590  const Bec bec{index2Bec(systemIndex)};
591 
592  if (bec == INVALID_SYSTEM) {
593  ATH_MSG_FATAL("Invalid subsystem index, should be 0-2, was " << systemIndex);
594  return StatusCode::FAILURE;
595  }
596  static const std::string paths[N_REGIONS] = {
597  "SCT/SCTEC/hits", "SCT/SCTB/hits", "SCT/SCTEA/hits"
598  };
599  static const unsigned int limits[N_REGIONS] = {
601  };
602  static const std::string titles[N_REGIONS]{"Endcap C", "barrel", "Endcap A"};
603  //
604  if (newRunFlag()) {
605  m_phitsHistoVector[systemIndex].clear();
606  m_phitsHistoVectorRecent[systemIndex].clear();
607  m_ncluHistoVector[systemIndex].clear();
608  MonGroup hitHists{this, paths[systemIndex], run, ATTRIB_UNMANAGED};
609  for (unsigned int i{0}; i < limits[systemIndex]; ++i) {
610  LayerSideFormatter layerSide{i, systemIndex};
611  std::string streamhitmap{"hitsmap" + abbreviations[systemIndex] + "_" + layerSide.name()};
612  std::string streamhitmaprecent{"hitsmaprecent" + abbreviations[systemIndex] + "_" + layerSide.name()};
613  std::string streamhits{"hits" + abbreviations[systemIndex] + "_" + layerSide.name()};
614  std::string histotitle{"SCT Hitmap for " + names[systemIndex] + ": " + layerSide.title()};
615  std::string histotitlerecent{"SCT Hitmap from recent events for " + names[systemIndex] + ": " +
616  layerSide.title()};
617  h2Factory(streamhitmap, histotitle, bec, hitHists, m_phitsHistoVector[systemIndex]);
619  h2Factory(streamhitmaprecent, histotitlerecent, bec, hitHists, m_phitsHistoVectorRecent[systemIndex]);
620  }
621  histotitle = "SCT Hits for " + names[systemIndex] + ": " + layerSide.title();
622  if (m_boolhitmaps) {
623  h1Factory(streamhits, histotitle, hitHists, m_ncluHistoVector[systemIndex], FIRST_HIT_BIN, LAST_HIT_BIN,
624  N_HIT_BINS);
625  }
626  }
627  }
628  return StatusCode::SUCCESS;
629 }
630 
633  MonGroup clusizebGroup{this, "SCT/SCTB/hits", run, ATTRIB_UNMANAGED};
634  MonGroup clusizeeaGroup{this, "SCT/SCTEA/hits", run, ATTRIB_UNMANAGED};
635  MonGroup clusizeecGroup{this, "SCT/SCTEC/hits", run, ATTRIB_UNMANAGED};
636  std::string disksidenameB[N_BARRELSx2] = {
637  "0_0", "0_1", "1_0", "1_1", "2_0", "2_1", "3_0", "3_1"
638  };
639  std::string disksidenameECp[N_DISKSx2] = {
640  "0_0", "0_1", "1_0", "1_1", "2_0", "2_1", "3_0", "3_1", "4_0", "4_1", "5_0", "5_1", "6_0", "6_1", "7_0", "7_1",
641  "8_0", "8_1"
642  };
643  std::string disksidenameECm[N_DISKSx2] = {
644  "0_0", "0_1", "1_0", "1_1", "2_0", "2_1", "3_0", "3_1", "4_0", "4_1", "5_0", "5_1", "6_0", "6_1", "7_0", "7_1",
645  "8_0", "8_1"
646  };
647 
648  if (newRunFlag()) {
649  MonGroup BarrelCluSize{this, "SCT/GENERAL/hits", run, ATTRIB_UNMANAGED};
650  // book Cluster width histogram for all SCT Detector
651  m_clusize = h1Factory("clu_size", "SCT Cluster size", BarrelCluSize, 0., 200., 200);
652  m_clusize->GetXaxis()->SetTitle("Cluster Size");
653  m_clusize->GetYaxis()->SetTitle("Num of Events");
654 
656  m_clusizeRecent = h1Factory("clu_size_recent", "SCT Cluster size from recent events", BarrelCluSize, 0., 200., 200);
657  m_clusizeRecent->GetXaxis()->SetTitle("Cluster Size");
658  m_clusizeRecent->GetYaxis()->SetTitle("Num of Events");
659  }
660  }
661  return m_clusize ? (StatusCode::SUCCESS) : (StatusCode::FAILURE);
662 }
663 
665 SCTHitsNoiseMonTool::bookGeneralNoiseOccupancyMaps(const unsigned int systemIndex) {
666  static const std::string paths[N_REGIONS] = {
667  "SCT/SCTEC/Noise", "SCT/SCTB/Noise", "SCT/SCTEA/Noise"
668  };
669  static const unsigned int limits[N_REGIONS] = {
671  };
672 
673  const Bec bec{index2Bec(systemIndex)};
674 
675  if (bec == INVALID_SYSTEM) {
676  ATH_MSG_FATAL("Invalid subsystem index, should be 0-2, was " << systemIndex);
677  return StatusCode::FAILURE;
678  }
679  if (newRunFlag()) {
680  MonGroup noiseOccMaps{this, paths[systemIndex], run, ATTRIB_UNMANAGED};
681  m_pnoiseoccupancymapHistoVectorTrigger[systemIndex].clear();
682  m_pnoiseoccupancymapHistoVectorRecent[systemIndex].clear();
683  // book 2D "noise" maps, containing hits that aren't associated to tracks
684  for (unsigned int i{0}; i < limits[systemIndex]; ++i) {
685  LayerSideFormatter layerSide{i, systemIndex};
686  const std::string streamhitmaptrigger{"noiseoccupancymaptrigger" + abbreviations[systemIndex] + "_" +
687  layerSide.name()};
688  const std::string streamhitmaprecent{"noiseoccupancymaprecent" + abbreviations[systemIndex] + "_" + layerSide.name()};
689  std::string histotitle{"SCT Noise Occupancy map for " + names[systemIndex] + ": " + layerSide.title()};
690  std::string histotitletrigger{"SCT Noise Occupancy map for " + m_NOTriggerItem + " Trigger and " +
691  names[systemIndex] + ": " + layerSide.title()};
692  std::string histotitlerecent{"SCT Noise Occupancy map in recent events for " + names[systemIndex] + ": " +
693  layerSide.title()};
694  prof2Factory(streamhitmaptrigger, histotitletrigger, bec, noiseOccMaps, m_pnoiseoccupancymapHistoVectorTrigger[systemIndex]);
696  prof2Factory(streamhitmaprecent, histotitlerecent, bec, noiseOccMaps, m_pnoiseoccupancymapHistoVectorRecent[systemIndex]);
697  }
698  }
699 
700  std::string histNames[N_REGIONS]{"ECm", "BAR", "ECp"};
701  std::string histTitles[N_REGIONS]{"ECm", "Barrel", "ECp"};
702 
703  std::string histNamesNO[N_REGIONS]{"ECC", "BAR", "ECA"};
704  std::string histTitlesNO[N_REGIONS]{"EndCap C", "Barrel", "EndCap A"};
705  m_NO_vsLB[systemIndex] = TProfile_LW::create((histNamesNO[systemIndex]+"NO_vsLB").c_str(),
706  ("NO vs LB for the "+histTitlesNO[systemIndex]+" (SP noise)").c_str(),
707  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
708  m_NO_vsLB[systemIndex]->GetXaxis()->SetTitle("LumiBlock");
709  m_NO_vsLB[systemIndex]->GetYaxis()->SetTitle("Noise Occupancy [10^{-5}]");
710  if (noiseOccMaps.regHist(m_NO_vsLB[systemIndex]).isFailure()) {
711  ATH_MSG_WARNING("Couldn't book " << m_NO_vsLB[systemIndex]->GetName());
712  }
713 
714  m_NOTrigger_vsLB[systemIndex] = TProfile_LW::create((histNamesNO[systemIndex]+"NOTrigger_vsLB").c_str(),
715  ("NO with trigger vs LB for the "+histTitlesNO[systemIndex]+" (SP noise)").c_str(),
716  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
717  m_NOTrigger_vsLB[systemIndex]->GetXaxis()->SetTitle("LumiBlock");
718  m_NOTrigger_vsLB[systemIndex]->GetYaxis()->SetTitle("Noise Occupancy [10^{-5}]");
719  if (noiseOccMaps.regHist(m_NOTrigger_vsLB[systemIndex]).isFailure()) {
720  ATH_MSG_WARNING("Couldn't book " << m_NOTrigger_vsLB[systemIndex]->GetName());
721  }
722  }
723  return StatusCode::SUCCESS;
724 }
725 
727 SCTHitsNoiseMonTool::bookGeneralHitOccupancyMaps(const unsigned int systemIndex) {
728  static const std::string paths[N_REGIONS]{"SCT/SCTEC/Noise", "SCT/SCTB/Noise", "SCT/SCTEA/Noise"};
729  static const unsigned int limits[N_REGIONS]{N_DISKSx2, N_BARRELSx2, N_DISKSx2};
730  static const std::string profileNames[N_REGIONS]{"ECm", "BAR", "ECp"};
731  static const std::string profileTitles[N_REGIONS]{"ECm", "Barrel", "ECp"};
732  static const std::string profileNames2[N_REGIONS]{"ECC", "BAR", "ECA"};
733  static const std::string profileTitles2[N_REGIONS]{"EndCap C", "Barrel", "EndCap A"};
734 
735  const Bec bec{index2Bec(systemIndex)};
736 
737  if (bec == INVALID_SYSTEM) {
738  ATH_MSG_FATAL("Invalid subsystem index, should be 0-2, was " << systemIndex);
739  return StatusCode::FAILURE;
740  }
741  if (newRunFlag()) {
742  MonGroup hitOccMaps{this, paths[systemIndex], run, ATTRIB_UNMANAGED};
743 
744  m_phitoccupancymapHistoVector[systemIndex].clear();
745  m_phitoccupancymapHistoVectorRecent[systemIndex].clear();
746 
747  // book 2D "noise" maps, containing hits that aren't associated to tracks
748  for (unsigned int i{0}; i < limits[systemIndex]; ++i) {
749  LayerSideFormatter layerSide{i, systemIndex};
750  const std::string streamhitmapR{"hitoccupancymap" + abbreviations[systemIndex] + "_" + layerSide.name()};
751  const std::string streamhitmaprecentR{"hitoccupancymaprecent" + abbreviations[systemIndex] + "_" + layerSide.name()};
752  std::string histotitleR{"SCT Hit Occupancy map for " + names[systemIndex] + ": " + layerSide.title()};
753  std::string histotitletriggerR{"SCT Hit Occupancy map for " + m_NOTriggerItem + " Trigger and " + names[systemIndex] + ": " + layerSide.title()};
754  std::string histotitlerecentR{"SCT Hit Occupancy map in recent events for " + names[systemIndex] + ": " + layerSide.title()};
755  prof2Factory(streamhitmapR, histotitleR, bec, hitOccMaps, m_phitoccupancymapHistoVector[systemIndex]);
757  prof2Factory(streamhitmaprecentR, histotitlerecentR, bec, hitOccMaps, m_phitoccupancymapHistoVectorRecent[systemIndex]);
758  }
759  }
760 
761  m_HallHits_vsLB[systemIndex] = TProfile_LW::create(("h_HallHits"+profileNames[systemIndex]+"_vsLB").c_str(),
762  ("Average num of all Hits in "+profileNames[systemIndex]+" vs LB").c_str(),
763  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
764  m_HallHits_vsLB[systemIndex]->GetXaxis()->SetTitle("LumiBlock");
765  m_HallHits_vsLB[systemIndex]->GetYaxis()->SetTitle("Average number of all Hits");
766  if (hitOccMaps.regHist(m_HallHits_vsLB[systemIndex]).isFailure()) {
767  ATH_MSG_WARNING("Couldn't book " << m_HallHits_vsLB[systemIndex]->GetName());
768  }
769 
770  m_HallHitsTrigger_vsLB[systemIndex] = TProfile_LW::create(("h_HallHitsTrigger"+profileNames[systemIndex]+"_vsLB").c_str(),
771  ("Average num of all Hits in "+profileNames[systemIndex]+" with trigger vs LB").c_str(),
772  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
773  m_HallHitsTrigger_vsLB[systemIndex]->GetXaxis()->SetTitle("LumiBlock");
774  m_HallHitsTrigger_vsLB[systemIndex]->GetYaxis()->SetTitle("Average number of all Hits");
775  if (hitOccMaps.regHist(m_HallHitsTrigger_vsLB[systemIndex]).isFailure()) {
776  ATH_MSG_WARNING("Couldn't book " << m_HallHitsTrigger_vsLB[systemIndex]->GetName());
777  }
778 
779  m_HSPHits_vsLB[systemIndex] = TProfile_LW::create(("h_HSPHits"+profileNames[systemIndex]+"_vsLB").c_str(),
780  ("Average num of SP Hits in "+profileNames[systemIndex]+" vs LB").c_str(),
781  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
782  m_HSPHits_vsLB[systemIndex]->GetXaxis()->SetTitle("LumiBlock");
783  m_HSPHits_vsLB[systemIndex]->GetYaxis()->SetTitle("Average number of SP Hits");
784  if (hitOccMaps.regHist(m_HSPHits_vsLB[systemIndex]).isFailure()) {
785  ATH_MSG_WARNING("Couldn't book " << m_HSPHits_vsLB[systemIndex]->GetName());
786  }
787 
788  m_HSPHitsTrigger_vsLB[systemIndex] = TProfile_LW::create(("h_HSPHitsTrigger"+profileNames[systemIndex]+"_vsLB").c_str(),
789  ("Average num of SP Hits in "+profileNames[systemIndex]+" with trigger vs LB").c_str(),
790  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
791  m_HSPHitsTrigger_vsLB[systemIndex]->GetXaxis()->SetTitle("LumiBlock");
792  m_HSPHitsTrigger_vsLB[systemIndex]->GetYaxis()->SetTitle("Average number of SP Hits");
793  if (hitOccMaps.regHist(m_HSPHitsTrigger_vsLB[systemIndex]).isFailure()) {
794  ATH_MSG_WARNING("Couldn't book " << m_HSPHitsTrigger_vsLB[systemIndex]->GetName());
795  }
796 
797  m_HO_vsLB[systemIndex] = TProfile_LW::create((profileNames2[systemIndex]+"HO_vsLB").c_str(),
798  ("HO vs LB for the "+profileTitles2[systemIndex]+" (SP noise)").c_str(),
799  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
800  m_HO_vsLB[systemIndex]->GetXaxis()->SetTitle("LumiBlock");
801  m_HO_vsLB[systemIndex]->GetYaxis()->SetTitle("Hit Occupancy [10^{-5}]");
802  if (hitOccMaps.regHist(m_HO_vsLB[systemIndex]).isFailure()) {
803  ATH_MSG_WARNING("Couldn't book " << m_HO_vsLB[systemIndex]->GetName());
804  }
805 
806  m_HOTrigger_vsLB[systemIndex] = TProfile_LW::create((profileNames2[systemIndex]+"HOTrigger_vsLB").c_str(),
807  ("HO with trigger vs LB for the "+profileTitles2[systemIndex]+" (SP noise)").c_str(),
808  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
809  m_HOTrigger_vsLB[systemIndex]->GetXaxis()->SetTitle("LumiBlock");
810  m_HOTrigger_vsLB[systemIndex]->GetYaxis()->SetTitle("Hit Occupancy [10^{-5}]");
811  if (hitOccMaps.regHist(m_HOTrigger_vsLB[systemIndex]).isFailure()) {
812  ATH_MSG_WARNING("Couldn't book " << m_HOTrigger_vsLB[systemIndex]->GetName());
813  }
814  }
815  return StatusCode::SUCCESS;
816 }
817 
818 // ====================================================================================================
819 // SCTHitsNoiseMonTool :: checkNoiseMaps
820 // LF 13/01/2006
821 // Here we have the check of the histograms and we can also build
822 // efficiency, occupancy, rms histograms, etc from the basic ones
823 // ====================================================================================================
826  std::vector<float> vectorOfOccupancies;
827 
829  // CAM Added code for track and SP algorithms
831  if (m_environment == AthenaMonManager::online) { // Reset histos for online so there is proper weighting of events
832  if (resetNoiseMapHists().isFailure()) {
833  ATH_MSG_WARNING("Failed to reset noise occupancy maps!");
834  }
835 
837  for (std::pair<const Identifier, float>& val: m_occSumUnbiasedRecent) {
838  Identifier wafer_id{val.first};
839  int element{N_SIDES * m_pSCTHelper->layer_disk(wafer_id) + m_pSCTHelper->side(wafer_id)};
840  float occ{(m_numberOfEventsRecent > 0) ? val.second / (m_numberOfEventsRecent) : val.second};
841  int eta{m_pSCTHelper->eta_module(wafer_id)};
842  int phi{m_pSCTHelper->phi_module(wafer_id)};
843  int barrel_ec{m_pSCTHelper->barrel_ec(wafer_id)};
844  unsigned int systemIndex{bec2Index(barrel_ec)};
845  if ((barrel_ec == BARREL) or
846  ((barrel_ec == ENDCAP_A) and m_doPositiveEndcap) or
847  ((barrel_ec == ENDCAP_C) and m_doNegativeEndcap)) {
848  m_pnoiseoccupancymapHistoVectorRecent[systemIndex][element]->Fill(eta, phi, occ * 1.E5);
849  }
850  }
851  }
852 
854  for (std::pair<const Identifier, float>& val: m_hitoccSumUnbiasedRecent) {
855  Identifier wafer_id{val.first};
856  int element{N_SIDES * m_pSCTHelper->layer_disk(wafer_id) + m_pSCTHelper->side(wafer_id)};
857  float hitocc{(m_numberOfEventsRecent > 0) ? val.second / (m_numberOfEventsRecent) : val.second};
858  int eta{m_pSCTHelper->eta_module(wafer_id)};
859  int phi{m_pSCTHelper->phi_module(wafer_id)};
860  int barrel_ec{m_pSCTHelper->barrel_ec(wafer_id)};
861  unsigned int systemIndex{bec2Index(barrel_ec)};
862  if ((barrel_ec==BARREL) or
863  ((barrel_ec==ENDCAP_A) and m_doPositiveEndcap) or
864  ((barrel_ec==ENDCAP_C) and m_doNegativeEndcap)) {
865  m_phitoccupancymapHistoVectorRecent[systemIndex][element]->Fill(eta, phi, hitocc * 1.E5);
866  }
867  }
868  }
869  }
870 
871  }
872  return StatusCode::SUCCESS;
873 }
874 
875 // ====================================================================================================
876 // SCTHitsNoiseMonTool :: initializeNoiseMaps
877 // DD 12/06/2011
878 // Here we initialize the noise occupancy maps to avoid a bug that is present
879 // when adding TProfiles when no noise hit has occured in a module side
880 // ====================================================================================================
883  for (SCT_ID::const_id_iterator planeIterator{m_pSCTHelper->wafer_begin()};
884  planeIterator != m_pSCTHelper->wafer_end(); ++planeIterator) {
885  // Don't initialize a value for disabled modules
886  if (not m_ConfigurationTool->isGood(*planeIterator, InDetConditions::SCT_SIDE)) {
887  continue;
888  }
889  m_occSumUnbiasedRecent[*planeIterator] = 0.;
890  m_hitoccSumUnbiasedRecent[*planeIterator] = 0.;
891  }
892 
893  return StatusCode::SUCCESS;
894 }
895 
896 // ====================================================================================================
897 // SCTHitsNoiseMonTool :: resetNoiseMapHists
898 // DD 12/06/2011
899 // Resets entries for all the noise occupancy histograms
900 //
901 // ====================================================================================================
904  for (unsigned int iReg{0}; iReg<N_REGIONS; iReg++) {
905  if (resetVecProf2(m_pnoiseoccupancymapHistoVectorTrigger[iReg]).isFailure()) {
906  ATH_MSG_WARNING("Failed to reset m_pnoiseoccupancymapHistoVectorTrigger[" << iReg << "]!");
907  }
908  if (resetVecProf2(m_phitoccupancymapHistoVector[iReg]).isFailure()) {
909  ATH_MSG_WARNING("Failed to reset m_phitoccupancymapHistoVector[" << iReg << "]!");
910  }
912  if (resetVecProf2(m_pnoiseoccupancymapHistoVectorRecent[iReg]).isFailure()) {
913  ATH_MSG_WARNING("Failed to reset m_pnoiseoccupancymapHistoVectorRecent[" << iReg << "]!");
914  }
915  if (resetVecProf2(m_phitoccupancymapHistoVectorRecent[iReg]).isFailure()) {
916  ATH_MSG_WARNING("Failed to reset hitoccupancymapHistoVectorRecent[" << iReg << "]!");
917  }
918  }
919  }
920 
921  return StatusCode::SUCCESS;
922 }
923 
924 // ====================================================================================================
925 // SCTHitsNoiseMonTool :: resetNoiseMapsRecent
926 // DD 19/07/2011
927 // Resets all the values in the recent noise occ maps to zero
928 //
929 // ====================================================================================================
932  for (std::pair<const Identifier, float>& val: m_occSumUnbiasedRecent) {
933  val.second = 0.0;
934  }
935  for (std::pair<const Identifier, float>& val: m_hitoccSumUnbiasedRecent) {
936  val.second = 0.0;
937  }
938  return StatusCode::SUCCESS;
939 }
940 
941 // ====================================================================================================
942 // SCTHitsNoiseMonTool :: resetHitMapHists
943 // DD 23/07/2011
944 // Resets all the values in the recent hit maps to zero
945 //
946 // ====================================================================================================
950  for (unsigned int iReg{0}; iReg<N_REGIONS; iReg++) {
951  if (resetVecH2(m_ptrackhitsHistoVectorRecent[iReg]).isFailure()) {
952  ATH_MSG_WARNING("Failed to reset m_ptrackhitsHistoVectorRecent[" << iReg << "]!");
953  }
954  if (resetVecH2(m_phitsHistoVectorRecent[iReg]).isFailure()) {
955  ATH_MSG_WARNING("Failed to reset m_phitsHistoVectorRecent[" << iReg << "]!");
956  }
957  }
959  }
960 
961  return StatusCode::SUCCESS;
962 }
963 
964 // ====================================================================================================
965 // SCTHitsNoiseMonTool :: resetVecProf2
966 // DD 12/06/2011
967 // Resets entries for all histograms in a vector of TProfile2Ds
968 //
969 // ====================================================================================================
971 SCTHitsNoiseMonTool::resetVecProf2(std::vector<TProfile2D*>& hists) const {
972  for (unsigned int i{0}; i < hists.size(); ++i) {
973  if (hists[i]==nullptr) {
974  continue;
975  }
976  hists[i]->Reset();
977  }
978  return StatusCode::SUCCESS;
979 }
980 
981 // ====================================================================================================
982 // SCTHitsNoiseMonTool :: resetVecProf2
983 // DD 23/07/2011
984 // Resets entries for all histograms in a vector of TH2s
985 //
986 // ====================================================================================================
988 SCTHitsNoiseMonTool::resetVecH2(std::vector<TH2F_LW*>& hists) const {
989  for (unsigned int i{0}; i < hists.size(); ++i) {
990  if (hists[i]==nullptr) {
991  continue;
992  }
993  hists[i]->Reset();
994  }
995  return StatusCode::SUCCESS;
996 }
997 
998 // ====================================================================================================
999 // SCTHitsNoiseMonTool :: book1DNoiseHists
1000 // Book noise occupancy histograms for all present SCT modules
1001 // using ToolRootHistSvc()
1002 // The histograms go to the subdirectory ../Modulemaps/
1003 // to improve readability
1004 //
1005 // ====================================================================================================
1006 StatusCode
1008  if (newRunFlag()) {
1009  MonGroup NoiseDistributions{this, "SCT/GENERAL/noise", ManagedMonitorToolBase::run, ATTRIB_UNMANAGED};
1010 
1011  m_NO_vsLB[GENERAL_INDEX] = TProfile_LW::create("NO_vsLB", "NO vs LB for all region (SP noise)", NBINS_LBs, 0.5, NBINS_LBs + 0.5);
1012  m_NO_vsLB[GENERAL_INDEX]->GetXaxis()->SetTitle("LumiBlock");
1013  m_NO_vsLB[GENERAL_INDEX]->GetYaxis()->SetTitle("Noise Occupancy [10^{-5}]");
1014  if (NoiseDistributions.regHist(m_NO_vsLB[GENERAL_INDEX]).isFailure()) {
1015  ATH_MSG_WARNING("Couldn't book SCTNO_vsLB");
1016  }
1017 
1018  m_NOTrigger_vsLB[GENERAL_INDEX] = TProfile_LW::create("NOTrigger_vsLB", "NO with trigger vs LB for all region (SP noise)",
1019  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
1020  m_NOTrigger_vsLB[GENERAL_INDEX]->GetXaxis()->SetTitle("LumiBlock");
1021  m_NOTrigger_vsLB[GENERAL_INDEX]->GetYaxis()->SetTitle("Noise Occupancy [10^{-5}]");
1022  if (NoiseDistributions.regHist(m_NOTrigger_vsLB[GENERAL_INDEX]).isFailure()) {
1023  ATH_MSG_WARNING("Couldn't book SCTNOTrigger_vsLB");
1024  }
1025 
1026  m_HO_vsLB[GENERAL_INDEX] = TProfile_LW::create("HO_vsLB", "HO vs LB for all region (SP noise)",
1027  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
1028  m_HO_vsLB[GENERAL_INDEX]->GetXaxis()->SetTitle("LumiBlock");
1029  m_HO_vsLB[GENERAL_INDEX]->GetYaxis()->SetTitle("Hit Occupancy [10^{-5}]");
1030  if (NoiseDistributions.regHist(m_HO_vsLB[GENERAL_INDEX]).isFailure()) {
1031  ATH_MSG_WARNING("Couldn't book " << m_HO_vsLB[GENERAL_INDEX]->GetName());
1032  }
1033 
1034  m_HOTrigger_vsLB[GENERAL_INDEX] = TProfile_LW::create("HOTrigger_vsLB", "HO with trigger vs LB for all region (SP noise)",
1035  NBINS_LBs, 0.5, NBINS_LBs + 0.5);
1036  m_HOTrigger_vsLB[GENERAL_INDEX]->GetXaxis()->SetTitle("LumiBlock");
1037  m_HOTrigger_vsLB[GENERAL_INDEX]->GetYaxis()->SetTitle("Hit Occupancy [10^{-5}]");
1038  if (NoiseDistributions.regHist(m_HOTrigger_vsLB[GENERAL_INDEX]).isFailure()) {
1039  ATH_MSG_WARNING("Couldn't book " << m_HOTrigger_vsLB[GENERAL_INDEX]->GetName());
1040  }
1041  }
1042  return StatusCode::SUCCESS;
1043 }
1044 
1045 std::string
1046 SCTHitsNoiseMonTool::positionString(const Identifier& plane) const {
1047  std::ostringstream position_txt;
1048 
1049  position_txt << m_pSCTHelper->barrel_ec(plane) << "_" << m_pSCTHelper->layer_disk(plane) << "_" <<
1050  m_pSCTHelper->phi_module(plane) << "_" << m_pSCTHelper->eta_module(plane) << "_" << m_pSCTHelper->side(plane);
1051  return position_txt.str();
1052 }
1053 
1054 StatusCode
1056  // Clear the RDOsOnTracks vector
1057  m_RDOsOnTracks.fill(std::unordered_set<Identifier>());
1059  if (not rdoContainer.isValid()) {
1060  ATH_MSG_FATAL("Could not find the data object " << m_dataObjectName.key() << " !");
1061  return StatusCode::FAILURE;
1062  } else {
1063  ATH_MSG_DEBUG("Data object " << m_dataObjectName.key() << " found");
1064  }
1065 
1067  if (not tracks.isValid()) {
1068  ATH_MSG_FATAL("No tracks for you!");
1069  return StatusCode::FAILURE;
1070  }
1071  // Only do for events with less than some number of tracks
1072  if (tracks->size() > m_maxTracks) {
1073  ATH_MSG_DEBUG("The event has more than " << m_maxTracks
1074  << " tracks. Don't do hits-on-track-hists");
1075  return StatusCode::SUCCESS;
1076  }
1077  // assemble list of rdo ids associated with tracks
1078  for (const Trk::Track* track : *tracks) {
1079  // Get pointer to track state on surfaces
1080  const Trk::TrackStates* trackStates{track->trackStateOnSurfaces()};
1081  if (trackStates == nullptr) {
1082  ATH_MSG_WARNING("for current track is TrackStateOnSurfaces == Null, no data will be written for this track");
1083  } else {// Loop over all track states on surfaces
1084  for (const Trk::TrackStateOnSurface* TSOS: *trackStates) {
1085  // Get pointer to RIO of right type
1086  const InDet::SiClusterOnTrack* clus{dynamic_cast<const InDet::SiClusterOnTrack*>(TSOS->measurementOnTrack())};
1087  if (clus) {
1088  // Get Pointer to prepRawDataObject
1089  const InDet::SiCluster* RawDataClus{dynamic_cast<const InDet::SiCluster*>(clus->prepRawData())};
1090  if (RawDataClus == nullptr) {
1091  ATH_MSG_WARNING("SiCluster WITHOUT prepRawData!!!!");
1092  break;
1093  }
1094  // if Cluster is in SCT ...
1095  if (RawDataClus->detectorElement()->isSCT()) {
1096  const std::vector<Identifier>& rdoList{RawDataClus->rdoList()};
1097  m_RDOsOnTracks[RawDataClus->detectorElement()->identifyHash()].insert(rdoList.begin(), rdoList.end());
1098  }
1099  }
1100  }
1101  }
1102  }
1103  return StatusCode::SUCCESS;
1104 }
1105 
1106 StatusCode
1107 SCTHitsNoiseMonTool::bookGeneralTrackHits(const unsigned int systemIndex) {
1108  static const std::string paths[N_REGIONS] = {
1109  "SCT/SCTEC/hits/", "SCT/SCTB/hits/", "SCT/SCTEA/hits/"
1110  };
1111  static const unsigned int limits[N_REGIONS] = {
1113  };
1114 
1115  const Bec bec{index2Bec(systemIndex)};
1116 
1117  if (bec == INVALID_SYSTEM) {
1118  ATH_MSG_FATAL("Invalid subsystem index, should be 0-2, was " << systemIndex);
1119  return StatusCode::FAILURE;
1120  }
1121  MonGroup tracksMon{this, paths[systemIndex] + "mapsOfHitsOnTracks", run, ATTRIB_UNMANAGED};
1122  if (newRunFlag()) {
1123  m_ptrackhitsHistoVector[systemIndex].clear();
1124  m_ptrackhitsHistoVectorRecent[systemIndex].clear();
1125  // book Hitmaps and hits per layer histograms
1126  for (unsigned int i{0}; i < limits[systemIndex]; ++i) {
1127  LayerSideFormatter layerSide{i, systemIndex};
1128  const std::string streamhitmap{"mapsOfHitsOnTracks" + abbreviations[systemIndex] + streamDelimiter +
1129  "trackhitsmap_" + layerSide.name()};
1130  const std::string streamhitmaprecent{"mapsOfHitsOnTracksRecent" + abbreviations[systemIndex] + streamDelimiter +
1131  "trackhitsmap_" + layerSide.name()};
1132  std::string histotitle{"SCT hits on tracks for " + names[systemIndex] + " " + layerSide.title()};
1133  std::string histotitlerecent{"SCT hits on tracks from recent events for " + names[systemIndex] + " " +
1134  layerSide.title()};
1135  h2Factory(streamhitmap, histotitle, bec, tracksMon, m_ptrackhitsHistoVector[systemIndex]);
1137  h2Factory(streamhitmaprecent, histotitlerecent, bec, tracksMon, m_ptrackhitsHistoVectorRecent[systemIndex]);
1138  }
1139  }
1140  }
1141  return StatusCode::SUCCESS;
1142 }
1143 
1144 StatusCode
1146  if (newRunFlag()) {
1147  MonGroup tbinGroup{this, "SCT/GENERAL/tbin", ManagedMonitorToolBase::run, ATTRIB_UNMANAGED};
1148  m_tbinfracall = profFactory("TBinFracAll", "fraction of 01X for each region", tbinGroup);
1149  }
1150  return StatusCode::SUCCESS;
1151 }
1152 
1153 TH2F_LW*
1154 SCTHitsNoiseMonTool::h2Factory(const std::string& name, const std::string& title, const Bec bec,
1155  MonGroup& registry, std::vector<TH2F_LW*>& storageVector) const {
1156  int firstEta{FIRST_ETA_BIN}, lastEta{LAST_ETA_BIN}, nEta{N_ETA_BINS},
1157  firstPhi{FIRST_PHI_BIN}, lastPhi{LAST_PHI_BIN}, nPhi{N_PHI_BINS};
1158 
1159  if (bec != BARREL) {
1160  firstEta = FIRST_ETA_BIN_EC;
1161  lastEta = LAST_ETA_BIN_EC;
1162  firstPhi = FIRST_PHI_BIN_EC;
1163  lastPhi = LAST_PHI_BIN_EC;
1164  nEta = N_ETA_BINS_EC;
1165  nPhi = N_PHI_BINS_EC;
1166  }
1167  TH2F_LW* tmp{TH2F_LW::create(name.c_str(), title.c_str(), nEta, firstEta - 0.5, lastEta + 0.5, nPhi, firstPhi - 0.5, lastPhi + 0.5)};
1168  tmp->SetXTitle("Index in the direction of #eta");
1169  tmp->SetYTitle("Index in the direction of #phi");
1170  bool success{registry.regHist(tmp).isSuccess()};
1171  if (not success) {
1172  ATH_MSG_WARNING("Cannot book SCT histogram: " << name);
1173  }
1174  storageVector.push_back(tmp);
1175  return success ? tmp : nullptr;
1176 }
1177 
1178 TProfile2D*
1179 SCTHitsNoiseMonTool::prof2DFactory(const std::string& name, const std::string& title, MonGroup& registry, int nbinx,
1180  float xlo, float xhi, int nbiny, float ylo, float yhi) const {
1181  TProfile2D* tmp{new TProfile2D{name.c_str(), title.c_str(), nbinx, xlo - 0.5, xhi + 0.5, nbiny, ylo - 0.5, yhi + 0.5}};
1182 
1183  tmp->SetXTitle("Index in the direction of #eta");
1184  tmp->SetYTitle("Index in the direction of #phi");
1185  bool success{registry.regHist(tmp).isSuccess()};
1186  if (not success) {
1187  ATH_MSG_WARNING("Cannot book SCT histogram: " << name);
1188  }
1189  return success ? tmp : nullptr;
1190 }
1191 
1192 TProfile_LW*
1193 SCTHitsNoiseMonTool::profFactory(const std::string& name, const std::string& title, MonGroup& registry) const {
1194  TProfile_LW* tmp{TProfile_LW::create(name.c_str(), title.c_str(), 3, 0, 3)};
1195 
1196  tmp->SetYTitle("Fraction of 01X");
1197  tmp->GetXaxis()->SetBinLabel(1, "Endcap C");
1198  tmp->GetXaxis()->SetBinLabel(2, "Barrel");
1199  tmp->GetXaxis()->SetBinLabel(3, "Endcap A");
1200  bool success{registry.regHist(tmp).isSuccess()};
1201  if (not success) {
1202  ATH_MSG_WARNING("Cannot book SCT histogram: " << name);
1203  }
1204  return success ? tmp : nullptr;
1205 }
1206 
1207 TProfile2D*
1208 SCTHitsNoiseMonTool::prof2Factory(const std::string& name, const std::string& title, const Bec bec,
1209  MonGroup& registry, std::vector<TProfile2D*>& storageVector) const {
1210  int firstEta{FIRST_ETA_BIN}, lastEta{LAST_ETA_BIN}, nEta{N_ETA_BINS},
1211  firstPhi{FIRST_PHI_BIN}, lastPhi{LAST_PHI_BIN}, nPhi{N_PHI_BINS};
1212 
1213  if (bec != BARREL) {
1214  firstEta = FIRST_ETA_BIN_EC;
1215  lastEta = LAST_ETA_BIN_EC;
1216  firstPhi = FIRST_PHI_BIN_EC;
1217  lastPhi = LAST_PHI_BIN_EC;
1218  nEta = N_ETA_BINS_EC;
1219  nPhi = N_PHI_BINS_EC;
1220  }
1221  TProfile2D* tmp{new TProfile2D{name.c_str(), title.c_str(), nEta, firstEta - 0.5, lastEta + 0.5, nPhi, firstPhi - 0.5, lastPhi + 0.5}};
1222  tmp->SetXTitle("Index in the direction of #eta");
1223  tmp->SetYTitle("Index in the direction of #phi");
1224  bool success{registry.regHist(tmp).isSuccess()};
1225  if (not success) {
1226  ATH_MSG_WARNING("Cannot book SCT histogram: " << name);
1227  }
1228  storageVector.push_back(tmp);
1229  return success ? tmp : nullptr;
1230 }
1231 
1232 TH1F_LW*
1233 SCTHitsNoiseMonTool::h1Factory(const std::string& name, const std::string& title, MonGroup& registry, const float lo,
1234  const float hi, const unsigned int nbins) const {
1235  TH1F_LW* tmp{TH1F_LW::create(name.c_str(), title.c_str(), static_cast<int>(nbins), lo, hi)};
1236  bool success{registry.regHist(tmp).isSuccess()};
1237 
1238  if (not success) {
1239  ATH_MSG_WARNING("Cannot book SCT histogram: " << name);
1240  }
1241  return success ? tmp : nullptr;
1242 }
1243 
1244 TH1F_LW*
1245 SCTHitsNoiseMonTool::h1Factory(const std::string& name, const std::string& title, MonGroup& registry,
1246  std::vector<TH1F_LW*>& storageVector, const float lo, const float hi, const unsigned int nbins) const {
1247  TH1F_LW* tmp{TH1F_LW::create(name.c_str(), title.c_str(), static_cast<int>(nbins), lo, hi)};
1248  bool success{registry.regHist(tmp).isSuccess()};
1249 
1250  if (not success) {
1251  ATH_MSG_WARNING("Cannot book SCT histogram: " << name);
1252  }
1253  storageVector.push_back(tmp);
1254  return success ? tmp : nullptr;
1255 }
SCTHitsNoiseMonTool::bookGeneralNoiseOccupancyMaps
StatusCode bookGeneralNoiseOccupancyMaps(const unsigned int systemIndex)
Definition: SCTHitsNoiseMonTool.cxx:665
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
python.Dso.registry
registry
Definition: Control/AthenaServices/python/Dso.py:159
SCT_NameFormatter.h
SCTHitsNoiseMonTool::m_HallHits_vsLB
TProfile_LW * m_HallHits_vsLB[SCT_Monitoring::N_REGIONS]
Definition: SCTHitsNoiseMonTool.h:155
SCTHitsNoiseMonTool::bookGeneralTrackHits
StatusCode bookGeneralTrackHits(const unsigned int systemIndex)
Definition: SCTHitsNoiseMonTool.cxx:1107
WritePulseShapeToCool.yhi
yhi
Definition: WritePulseShapeToCool.py:153
SCT_CalibAlgs::bec2Index
unsigned int bec2Index(const int bec)
Definition: SCT_CalibUtilities.cxx:60
Trk::SpacePoint
Definition: Tracking/TrkEvent/TrkSpacePoint/TrkSpacePoint/SpacePoint.h:35
SCTHitsNoiseMonTool::m_occSumUnbiasedRecent
std::map< Identifier, float > m_occSumUnbiasedRecent
Definition: SCTHitsNoiseMonTool.h:131
SCTHitsNoiseMonTool::prof2DFactory
TProfile2D * prof2DFactory(const std::string &name, const std::string &title, MonGroup &registry, int nbinx, float xlo, float xhi, int nbiny, float ylo, float yhi) const
Definition: SCTHitsNoiseMonTool.cxx:1179
SCTHitsNoiseMonTool::m_dataObjectName
SG::ReadHandleKey< SCT_RDO_Container > m_dataObjectName
Data object name: for the SCT this is "SCT_RDOs".
Definition: SCTHitsNoiseMonTool.h:101
SCTHitsNoiseMonTool::initializeNoiseMaps
StatusCode initializeNoiseMaps()
Definition: SCTHitsNoiseMonTool.cxx:882
TH1F_LW.h
SCT_Monitoring::N_REGIONS
@ N_REGIONS
Definition: SCT_MonitoringNumbers.h:19
TH2F_LW.h
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...
SCTHitsNoiseMonTool::resetHitMapHists
StatusCode resetHitMapHists()
Definition: SCTHitsNoiseMonTool.cxx:948
SCTHitsNoiseMonTool::m_ptrackhitsHistoVectorRecent
std::vector< TH2F_LW * > m_ptrackhitsHistoVectorRecent[SCT_Monitoring::N_REGIONS]
Definition: SCTHitsNoiseMonTool.h:189
SCTHitsNoiseMonTool::m_clusContainerKey
SG::ReadHandleKey< InDet::SCT_ClusterContainer > m_clusContainerKey
Definition: SCTHitsNoiseMonTool.h:97
SCTHitsNoiseMonTool::book1DHitHists
StatusCode book1DHitHists()
Definition: SCTHitsNoiseMonTool.cxx:564
SCTHitsNoiseMonTool::m_ncluHistoVector
std::vector< TH1F_LW * > m_ncluHistoVector[SCT_Monitoring::N_REGIONS]
Vector of pointers to 1D histogram of Number of SCT Clusters per Event; 1 histo per layer and side.
Definition: SCTHitsNoiseMonTool.h:164
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
TH1F_LW::Fill
virtual void Fill(const double &x) override
Definition: TH1F_LW.cxx:246
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
SCT_Monitoring::FIRST_NOISE_HIT_BIN
@ FIRST_NOISE_HIT_BIN
Definition: SCT_MonitoringNumbers.h:40
SCTHitsNoiseMonTool::m_checkrate
IntegerProperty m_checkrate
CheckHists() frequency.
Definition: SCTHitsNoiseMonTool.h:89
SCT_ConditionsData::N_REGIONS
@ N_REGIONS
Definition: SCT_ConditionsParameters.h:28
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
SCT_Monitoring::INVALID_SYSTEM
@ INVALID_SYSTEM
Definition: SCT_MonitoringNumbers.h:21
SCTHitsNoiseMonTool::m_numberOfEventsRecent
int m_numberOfEventsRecent
Definition: SCTHitsNoiseMonTool.h:129
ParticleGun_SamplingFraction.bec
int bec
Definition: ParticleGun_SamplingFraction.py:89
SCT_Monitoring::LAST_HIT_BIN
@ LAST_HIT_BIN
Definition: SCT_MonitoringNumbers.h:39
TH1F_LW::create
static TH1F_LW * create(const char *name, const char *title, unsigned nbinsx, const double &xlow, const double &xup)
Definition: TH1F_LW.cxx:33
SCTHitsNoiseMonTool::m_numberOfEvents
int m_numberOfEvents
Definition: SCTHitsNoiseMonTool.h:120
ManagedMonitorToolBase
Provides functionality for users to implement and save histograms, ntuples, and summary data,...
Definition: ManagedMonitorToolBase.h:74
SCT_Monitoring::FIRST_ETA_BIN_EC
@ FIRST_ETA_BIN_EC
Definition: SCT_MonitoringNumbers.h:47
SCTHitsNoiseMonTool::bookHistograms
virtual StatusCode bookHistograms() override final
Book is called at the beginning.
Definition: SCTHitsNoiseMonTool.cxx:126
SCTHitsNoiseMonTool::h2Factory
TH2F_LW * h2Factory(const std::string &name, const std::string &title, const SCT_Monitoring::Bec bec, MonGroup &registry, std::vector< TH2F_LW * > &storageVector) const
Definition: SCTHitsNoiseMonTool.cxx:1154
SCTHitsNoiseMonTool::bookGeneralTrackTimeHistos
StatusCode bookGeneralTrackTimeHistos()
Definition: SCTHitsNoiseMonTool.cxx:1145
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
ManagedMonitorToolBase::endOfLumiBlockFlag
bool endOfLumiBlockFlag() const
Definition: ManagedMonitorToolBase.h:858
AthenaMonManager::cosmics
@ cosmics
Definition: AthenaMonManager.h:58
SCTHitsNoiseMonTool::bookClusterSize
StatusCode bookClusterSize()
Definition: SCTHitsNoiseMonTool.cxx:632
ManagedMonitorToolBase::m_trigDecTool
PublicToolHandle< Trig::ITrigDecisionTool > m_trigDecTool
Definition: ManagedMonitorToolBase.h:908
SCTHitsNoiseMonTool::m_HSPHitsTrigger_vsLB
TProfile_LW * m_HSPHitsTrigger_vsLB[SCT_Monitoring::N_REGIONS]
Definition: SCTHitsNoiseMonTool.h:161
SCTHitsNoiseMonTool::m_HallHitsTrigger_vsLB
TProfile_LW * m_HallHitsTrigger_vsLB[SCT_Monitoring::N_REGIONS]
Definition: SCTHitsNoiseMonTool.h:160
SCTHitsNoiseMonTool::m_ncluHisto
TH1F * m_ncluHisto
Pointer to 1D histogram of Number of SCT Clusters per Event.
Definition: SCTHitsNoiseMonTool.h:151
TProfile2D
Definition: rootspy.cxx:531
SCT::N_SIDES
constexpr unsigned int N_SIDES
Definition: SCT_ChipUtils.h:16
SCTHitsNoiseMonTool::m_ConfigurationTool
ToolHandle< ISCT_ConfigurationConditionsTool > m_ConfigurationTool
Definition: SCTHitsNoiseMonTool.h:107
SCT_ID::wafer_begin
const_id_iterator wafer_begin(void) const
Iterators over full set of ids. Wafer iterator is sorted.
Definition: SCT_ID.cxx:648
SCT_Monitoring::LAST_ETA_BIN
@ LAST_ETA_BIN
Definition: SCT_MonitoringNumbers.h:41
SCTHitsNoiseMonTool::checkNoiseMaps
StatusCode checkNoiseMaps()
Definition: SCTHitsNoiseMonTool.cxx:825
SCT_Monitoring::FIRST_PHI_BIN_EC
@ FIRST_PHI_BIN_EC
Definition: SCT_MonitoringNumbers.h:48
makeHists.thisPhi
thisPhi
Definition: makeHists.py:127
SCT_Monitoring::N_BARRELSx2
@ N_BARRELSx2
Definition: SCT_MonitoringNumbers.h:43
SCTHitsNoiseMonTool::m_phitmapHistoVector
std::vector< TH1F_LW * > m_phitmapHistoVector
Vector of pointers to hitmaps histograms.
Definition: SCTHitsNoiseMonTool.h:142
SCT_ID::const_id_iterator
std::vector< Identifier >::const_iterator const_id_iterator
Definition: SCT_ID.h:73
TProfile_LW.h
SiClusterOnTrack.h
SCT_RDORawData
Definition: SCT_RDORawData.h:24
SCT_Monitoring::N_HIT_BINS
@ N_HIT_BINS
Definition: SCT_MonitoringNumbers.h:39
SCT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: SCT_ID.h:728
SCTHitsNoiseMonTool::m_NOTrigger_vsLB
TProfile_LW * m_NOTrigger_vsLB[SCT_Monitoring::N_REGIONS_INC_GENERAL]
Definition: SCTHitsNoiseMonTool.h:176
SCT_Monitoring::BARREL_INDEX
@ BARREL_INDEX
Definition: SCT_MonitoringNumbers.h:19
SCT_Monitoring::FIRST_HIT_BIN
@ FIRST_HIT_BIN
Definition: SCT_MonitoringNumbers.h:39
SCT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: SCT_ID.h:740
SCT_Monitoring::N_STRIPS
@ N_STRIPS
Definition: SCT_MonitoringNumbers.h:36
SCTHitsNoiseMonTool::fillHistograms
virtual StatusCode fillHistograms() override final
fill is called on each event loop
Definition: SCTHitsNoiseMonTool.cxx:253
TProfile_LW
Definition: TProfile_LW.h:24
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
SCTHitsNoiseMonTool::bookGeneralHits
StatusCode bookGeneralHits(const unsigned int systemIndex)
Definition: SCTHitsNoiseMonTool.cxx:589
TrigVSI::AlgConsts::nPhi
constexpr int nPhi
Default bin number of phi for vertex map.
Definition: Trigger/TrigTools/TrigVrtSecInclusive/TrigVrtSecInclusive/Constants.h:27
SCT_Monitoring::N_PHI_BINS
@ N_PHI_BINS
Definition: SCT_MonitoringNumbers.h:42
SCTHitsNoiseMonTool::m_ptrackhitsHistoVector
std::vector< TH2F_LW * > m_ptrackhitsHistoVector[SCT_Monitoring::N_REGIONS]
Definition: SCTHitsNoiseMonTool.h:188
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
SCTHitsNoiseMonTool::m_HOTrigger_vsLB
TProfile_LW * m_HOTrigger_vsLB[SCT_Monitoring::N_REGIONS_INC_GENERAL]
Definition: SCTHitsNoiseMonTool.h:178
SCTHitsNoiseMonTool::makeVectorOfTrackRDOIdentifiers
StatusCode makeVectorOfTrackRDOIdentifiers()
Definition: SCTHitsNoiseMonTool.cxx:1055
TRT::Hit::side
@ side
Definition: HitInfo.h:83
Track.h
SCT_Monitoring::index2Bec
Bec index2Bec(const unsigned int i)
Conversion index->bec.
Definition: SCT_MonitoringNumbers.h:29
SCT_Monitoring::ENDCAP_A_INDEX
@ ENDCAP_A_INDEX
Definition: SCT_MonitoringNumbers.h:19
LWHist::GetXaxis
LWHistAxis * GetXaxis()
Definition: LWHist.cxx:309
RoT_Extractor.h
SCTHitsNoiseMonTool::resetNoiseMapHists
StatusCode resetNoiseMapHists()
Definition: SCTHitsNoiseMonTool.cxx:903
SCT_CalibAlgs::nbins
@ nbins
Definition: SCT_CalibNumbers.h:10
SCTHitsNoiseMonTool::m_SCTSPContainerName
SG::ReadHandleKey< SpacePointContainer > m_SCTSPContainerName
Definition: SCTHitsNoiseMonTool.h:99
SCTHitsNoiseMonTool::m_RDOsOnTracks
std::array< std::unordered_set< Identifier >, SCT_Monitoring::N_WAFERS > m_RDOsOnTracks
Definition: SCTHitsNoiseMonTool.h:124
SCT_Monitoring::LAST_STRIP
@ LAST_STRIP
Definition: SCT_MonitoringNumbers.h:36
ManagedMonitorToolBase::MonGroup
A container of information describing a monitoring object.
Definition: ManagedMonitorToolBase.h:138
SCTHitsNoiseMonTool::bookGeneralHitOccupancyMaps
StatusCode bookGeneralHitOccupancyMaps(const unsigned int systemIndex)
Definition: SCTHitsNoiseMonTool.cxx:727
SpacePointCollection.h
SCTHitsNoiseMonTool::SCTHitsNoiseMonTool
SCTHitsNoiseMonTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor, calls base class constructor with parameters.
Definition: SCTHitsNoiseMonTool.cxx:99
SCT_Monitoring::LAST_ETA_BIN_EC
@ LAST_ETA_BIN_EC
Definition: SCT_MonitoringNumbers.h:47
TH1F_LW
Definition: TH1F_LW.h:23
AthenaMonManager::dataType
static DataType_t dataType()
Returns the data type that the monitoring application is running over to help ManagedMonitorToolBase ...
Definition: AthenaMonManager.cxx:338
python.BunchSpacingUtils.lb
lb
Definition: BunchSpacingUtils.py:88
SCT3_RawData.h
SCTHitsNoiseMonTool::m_phitsHistoVectorRecent
std::vector< TH2F_LW * > m_phitsHistoVectorRecent[SCT_Monitoring::N_REGIONS]
Vector of pointers to histogram of SCT modules hits; 1 histo per layer and side.
Definition: SCTHitsNoiseMonTool.h:183
ManagedMonitorToolBase::initialize
virtual StatusCode initialize()
Definition: ManagedMonitorToolBase.cxx:669
SCTHitsNoiseMonTool::m_pnoiseoccupancymapHistoVectorTrigger
std::vector< TProfile2D * > m_pnoiseoccupancymapHistoVectorTrigger[SCT_Monitoring::N_REGIONS]
Definition: SCTHitsNoiseMonTool.h:193
LWHist::LWHistAxis::SetTitle
void SetTitle(const char *)
Definition: LWHist.cxx:359
WritePulseShapeToCool.xhi
xhi
Definition: WritePulseShapeToCool.py:152
TProfile_LW::create
static TProfile_LW * create(const char *name, const char *title, unsigned nbinsx, const double &xlow, const double &xup, const char *option=" ")
Definition: TProfile_LW.cxx:32
lumiFormat.i
int i
Definition: lumiFormat.py:92
SCTHitsNoiseMonTool::m_boolhitmaps
BooleanProperty m_boolhitmaps
Switch on or off the hitmaps histograms.
Definition: SCTHitsNoiseMonTool.h:80
SCT3_RawData
Definition: SCT3_RawData.h:24
SCTHitsNoiseMonTool::bookHistogramsRecurrent
virtual StatusCode bookHistogramsRecurrent() override final
An inheriting class should either override this function, bookHists() or bookHistograms().
Definition: SCTHitsNoiseMonTool.cxx:191
SCTHitsNoiseMonTool::m_hitoccSumUnbiasedRecent
std::map< Identifier, float > m_hitoccSumUnbiasedRecent
Definition: SCTHitsNoiseMonTool.h:133
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SpacePoint.h
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
python.subdetectors.mmg.names
names
Definition: mmg.py:8
AthenaMonManager::online
@ online
Definition: AthenaMonManager.h:49
SCT_Monitoring::LayerSideFormatter
format an element index (e.g.
Definition: SCT_NameFormatter.h:20
WritePulseShapeToCool.det
det
Definition: WritePulseShapeToCool.py:204
SCTHitsNoiseMonTool::m_phitoccupancymapHistoVector
std::vector< TProfile2D * > m_phitoccupancymapHistoVector[SCT_Monitoring::N_REGIONS]
Vector of pointers to histogram of SCT modules hits; 1 histo per layer and side.
Definition: SCTHitsNoiseMonTool.h:192
covarianceTool.title
title
Definition: covarianceTool.py:542
SpacePointCLASS_DEF.h
SpacePointOverlapCollection.h
InDetRawDataCollection
Definition: InDetRawDataCollection.h:31
ManagedMonitorToolBase::ATTRIB_UNMANAGED
@ ATTRIB_UNMANAGED
Definition: ManagedMonitorToolBase.h:131
test_pyathena.parent
parent
Definition: test_pyathena.py:15
SCTHitsNoiseMonTool::m_phitsHistoVector
std::vector< TH2F_LW * > m_phitsHistoVector[SCT_Monitoring::N_REGIONS]
Vector of pointers to histogram of SCT modules hits; 1 histo per layer and side.
Definition: SCTHitsNoiseMonTool.h:145
SCTHitsNoiseMonTool::m_last_reset_lb
int m_last_reset_lb
Definition: SCTHitsNoiseMonTool.h:122
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MakeTH3DFromTH2Ds.hists
hists
Definition: MakeTH3DFromTH2Ds.py:72
SCT3_RawData::getTimeBin
int getTimeBin() const
Definition: SCT3_RawData.h:92
SCT_ID::wafer_hash
IdentifierHash wafer_hash(const Identifier &wafer_id) const
wafer hash from id - optimized
Definition: SCT_ID.h:492
SCTHitsNoiseMonTool::m_tracksName
SG::ReadHandleKey< TrackCollection > m_tracksName
Name of the Track collection to use.
Definition: SCTHitsNoiseMonTool.h:96
WritePulseShapeToCool.xlo
xlo
Definition: WritePulseShapeToCool.py:133
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
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
SCT_Monitoring::ENDCAP_A
@ ENDCAP_A
Definition: SCT_MonitoringNumbers.h:21
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
SCTHitsNoiseMonTool::bookNoiseDistributions
StatusCode bookNoiseDistributions()
Definition: SCTHitsNoiseMonTool.cxx:1007
InDet::SCT_Cluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SCT_Cluster.h:34
DataVector< const Trk::TrackStateOnSurface >
SCTHitsNoiseMonTool::m_phitoccupancymapHistoVectorRecent
std::vector< TProfile2D * > m_phitoccupancymapHistoVectorRecent[SCT_Monitoring::N_REGIONS]
Definition: SCTHitsNoiseMonTool.h:200
WritePulseShapeToCool.ylo
ylo
Definition: WritePulseShapeToCool.py:134
SCT_Monitoring::N_ETA_BINS_EC
@ N_ETA_BINS_EC
Definition: SCT_MonitoringNumbers.h:47
TProfile_LW::Fill
void Fill(const double &x, const double &y)
Definition: TProfile_LW.cxx:223
ManagedMonitorToolBase::m_environment
AthenaMonManager::Environment_t m_environment
Definition: ManagedMonitorToolBase.h:902
SCT_Monitoring::FIRST_STRIP
@ FIRST_STRIP
Definition: SCT_MonitoringNumbers.h:36
SCT_Monitoring::N_NOISE_HIT_BINS
@ N_NOISE_HIT_BINS
Definition: SCT_MonitoringNumbers.h:40
SCTHitsNoiseMonTool::m_doPositiveEndcap
BooleanProperty m_doPositiveEndcap
Switch on or off the endcaps.
Definition: SCTHitsNoiseMonTool.h:82
trigbs_pickEvents.num
num
Definition: trigbs_pickEvents.py:76
SCT_Monitoring::LAST_NOISE_HIT_BIN
@ LAST_NOISE_HIT_BIN
Definition: SCT_MonitoringNumbers.h:40
SCTHitsNoiseMonTool::resetVecH2
StatusCode resetVecH2(std::vector< TH2F_LW * > &hists) const
Definition: SCTHitsNoiseMonTool.cxx:988
SCTHitsNoiseMonTool::profFactory
TProfile_LW * profFactory(const std::string &name, const std::string &title, MonGroup &registry) const
Definition: SCTHitsNoiseMonTool.cxx:1193
SCTHitsNoiseMonTool::checkHists
virtual StatusCode checkHists(bool fromFinalize) override final
checkHists not currently used
Definition: SCTHitsNoiseMonTool.cxx:318
SCTHitsNoiseMonTool::resetNoiseMapsRecent
StatusCode resetNoiseMapsRecent()
Definition: SCTHitsNoiseMonTool.cxx:931
SCT_Monitoring::GENERAL_INDEX
@ GENERAL_INDEX
Definition: SCT_MonitoringNumbers.h:19
SCT_Monitoring::FIRST_PHI_BIN
@ FIRST_PHI_BIN
Definition: SCT_MonitoringNumbers.h:42
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
defineDB.ichan
int ichan
Definition: JetTagCalibration/share/defineDB.py:28
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
SCT_ID::wafer_hash_max
size_type wafer_hash_max(void) const
Definition: SCT_ID.cxx:639
SCTHitsNoiseMonTool::m_SCTDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
Definition: SCTHitsNoiseMonTool.h:103
TH2F_LW::create
static TH2F_LW * create(const char *name, const char *title, unsigned nbinsx, const double &xmin, const double &xmax, unsigned nbinsy, const double &ymin, const double &ymax)
Definition: TH2F_LW.cxx:33
SCTHitsNoiseMonTool::m_HSPHits_vsLB
TProfile_LW * m_HSPHits_vsLB[SCT_Monitoring::N_REGIONS]
Definition: SCTHitsNoiseMonTool.h:156
SCT_Monitoring::LAST_PHI_BIN
@ LAST_PHI_BIN
Definition: SCT_MonitoringNumbers.h:42
SCTHitsNoiseMonTool::m_clusizeRecent
TH1F_LW * m_clusizeRecent
Pointers to histogram of SCT cluster width.
Definition: SCTHitsNoiseMonTool.h:186
SCT_ID::layer_disk
int layer_disk(const Identifier &id) const
Definition: SCT_ID.h:734
SCT_Monitoring::ENDCAP_C
@ ENDCAP_C
Definition: SCT_MonitoringNumbers.h:21
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
SCTHitsNoiseMonTool::m_doTrigger
BooleanProperty m_doTrigger
Definition: SCTHitsNoiseMonTool.h:78
SCTHitsNoiseMonTool::initialize
virtual StatusCode initialize() override final
Definition: SCTHitsNoiseMonTool.cxx:107
SCTHitsNoiseMonTool::m_clusize
TH1F_LW * m_clusize
Pointers to histogram of SCT cluster width.
Definition: SCTHitsNoiseMonTool.h:148
SCT_Monitoring::N_ETA_BINS
@ N_ETA_BINS
Definition: SCT_MonitoringNumbers.h:41
ISCT_ConfigurationConditionsTool.h
SCTHitsNoiseMonTool::m_doTimeBinFilteringForNoise
BooleanProperty m_doTimeBinFilteringForNoise
Add time-bin filtering to space point NO algorithm.
Definition: SCTHitsNoiseMonTool.h:87
SCTHitsNoiseMonTool.h
SCT_Monitoring::N_PHI_BINS_EC
@ N_PHI_BINS_EC
Definition: SCT_MonitoringNumbers.h:48
ManagedMonitorToolBase::run
@ run
Definition: ManagedMonitorToolBase.h:116
DataVector.h
An STL vector of pointers that by default owns its pointed-to elements.
SCTHitsNoiseMonTool::m_NOTriggerItem
StringProperty m_NOTriggerItem
Name of the L1 Type to use for filling the extra NO histograms.
Definition: SCTHitsNoiseMonTool.h:77
SCTHitsNoiseMonTool::procHistograms
virtual StatusCode procHistograms() override final
procHistograms is called at the end
Definition: SCTHitsNoiseMonTool.cxx:300
SCTHitsNoiseMonTool::resetVecProf2
StatusCode resetVecProf2(std::vector< TProfile2D * > &hists) const
Format the position as a string.
Definition: SCTHitsNoiseMonTool.cxx:971
Trk::Pattern
@ Pattern
Definition: ParametersCommon.h:29
SCTHitsNoiseMonTool::m_doSpacePointBasedNoise
BooleanProperty m_doSpacePointBasedNoise
Select the noise algorithm.
Definition: SCTHitsNoiseMonTool.h:85
SCTHitsNoiseMonTool::m_checkrecent
IntegerProperty m_checkrecent
Definition: SCTHitsNoiseMonTool.h:90
SCTHitsNoiseMonTool::m_pnoiseoccupancymapHistoVectorRecent
std::vector< TProfile2D * > m_pnoiseoccupancymapHistoVectorRecent[SCT_Monitoring::N_REGIONS]
Vector of pointers to histogram of SCT modules hits; 1 histo per layer and side.
Definition: SCTHitsNoiseMonTool.h:198
SCTHitsNoiseMonTool::m_HO_vsLB
TProfile_LW * m_HO_vsLB[SCT_Monitoring::N_REGIONS_INC_GENERAL]
Definition: SCTHitsNoiseMonTool.h:172
SCTHitsNoiseMonTool::m_maxTracks
UnsignedIntegerProperty m_maxTracks
Definition: SCTHitsNoiseMonTool.h:93
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
SCT_ID::strip
int strip(const Identifier &id) const
Definition: SCT_ID.h:764
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
TH1F_LW::Reset
virtual void Reset() override
Definition: TH1F_LW.cxx:183
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
SCT_ID::eta_module
int eta_module(const Identifier &id) const
Definition: SCT_ID.h:746
BARREL
@ BARREL
Definition: TRTRadiatorParameters.h:10
SCT_Monitoring::LAST_PHI_BIN_EC
@ LAST_PHI_BIN_EC
Definition: SCT_MonitoringNumbers.h:48
SCT_ID::side
int side(const Identifier &id) const
Definition: SCT_ID.h:752
SCTHitsNoiseMonTool::h1Factory
TH1F_LW * h1Factory(const std::string &name, const std::string &title, MonGroup &registry, std::vector< TH1F_LW * > &storageVector, const float lo, const float hi, const unsigned int nbins) const
Definition: SCTHitsNoiseMonTool.cxx:1245
SCT_ID::wafer_end
const_id_iterator wafer_end(void) const
Definition: SCT_ID.cxx:652
SCT_CalibAlgs::firstStrip
@ firstStrip
Definition: SCT_CalibNumbers.h:10
SCT_Monitoring::FIRST_ETA_BIN
@ FIRST_ETA_BIN
Definition: SCT_MonitoringNumbers.h:41
SCTHitsNoiseMonTool::m_tbinfracall
TProfile_LW * m_tbinfracall
Definition: SCTHitsNoiseMonTool.h:166
python.TrigEgammaMonitorHelper.TH1F
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:24
TH2F_LW
Definition: TH2F_LW.h:23
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
SCTHitsNoiseMonTool::m_doTrackHits
BooleanProperty m_doTrackHits
Definition: SCTHitsNoiseMonTool.h:92
ReadHandle.h
Handle class for reading from StoreGate.
SCTHitsNoiseMonTool::prof2Factory
TProfile2D * prof2Factory(const std::string &name, const std::string &title, const SCT_Monitoring::Bec bec, MonGroup &registry, std::vector< TProfile2D * > &storageVector) const
Definition: SCTHitsNoiseMonTool.cxx:1208
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
TrigVSI::AlgConsts::nEta
constexpr int nEta
Default bin number of eta for vertex map.
Definition: Trigger/TrigTools/TrigVrtSecInclusive/TrigVrtSecInclusive/Constants.h:26
InDetConditions::SCT_SIDE
@ SCT_SIDE
Definition: InDetHierarchy.h:14
SCTHitsNoiseMonTool::m_NO_vsLB
TProfile_LW * m_NO_vsLB[SCT_Monitoring::N_REGIONS_INC_GENERAL]
Definition: SCTHitsNoiseMonTool.h:170
InDet::SCT_ClusterCollection
Trk::PrepRawDataCollection< SCT_Cluster > SCT_ClusterCollection
Definition: SCT_ClusterCollection.h:26
SCTHitsNoiseMonTool::m_pSCTHelper
const SCT_ID * m_pSCTHelper
SCT Helper class.
Definition: SCTHitsNoiseMonTool.h:114
updateCoolNtuple.limit
int limit
Definition: updateCoolNtuple.py:45
LWHist::GetYaxis
LWHistAxis * GetYaxis()
Definition: LWHist.cxx:319
SCTHitsNoiseMonTool::positionString
std::string positionString(const Identifier &plane) const
Definition: SCTHitsNoiseMonTool.cxx:1046
InDet::SiCluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SiCluster.h:40
SCT_Monitoring::N_BINS
@ N_BINS
Definition: SCT_MonitoringNumbers.h:35
SCT_Monitoring::N_DISKSx2
@ N_DISKSx2
Definition: SCT_MonitoringNumbers.h:44
SCTHitsNoiseMonTool::generalHistsandNoise
StatusCode generalHistsandNoise(const EventContext &ctx)
Definition: SCTHitsNoiseMonTool.cxx:332
histogram
std::string histogram
Definition: chains.cxx:52
SCT_Monitoring::Bec
Bec
Possible values of the 'BEC' (Barrel or EndCap) value.
Definition: SCT_MonitoringNumbers.h:21
InDet::SiClusterOnTrack
Definition: SiClusterOnTrack.h:39
test_athena_ntuple_dumper.paths
paths
Definition: test_athena_ntuple_dumper.py:7
SCTHitsNoiseMonTool::m_doNegativeEndcap
BooleanProperty m_doNegativeEndcap
Definition: SCTHitsNoiseMonTool.h:83
ManagedMonitorToolBase::newRunFlag
bool newRunFlag() const
Definition: ManagedMonitorToolBase.h:854