ATLAS Offline Software
SCTHitsNoiseMonAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "SCTHitsNoiseMonAlg.h"
6 #include "SCT_NameFormatter.h"
7 
10 #include "InDetIdentifier/SCT_ID.h"
13 
15 #include "StoreGate/ReadHandle.h"
20 
21 #include <string>
22 
23 using namespace SCT_Monitoring;
24 
25 namespace {
26  static const std::string abbreviations[N_REGIONS] = {
27  "ECm", "", "ECp"
28  };
29 
30  enum
31  Pattern {
32  IXX=0, XIX, XXI
33  };
34 
35  // is the timebin in the desired pattern?
36  bool timeBinInPattern(const int tbin, const Pattern xxx) {
37  switch (xxx) {
38  case IXX:
39  return (tbin > 3);
40 
41  break;
42 
43  case XIX:
44  return ((tbin == 2) or (tbin == 3) or (tbin == 6) or (tbin == 7));
45 
46  break;
47 
48  case XXI:
49  return ((tbin == 1) or (tbin == 3) or (tbin == 5) or (tbin == 7));
50 
51  break;
52 
53  default:
54  return false;
55 
56  break;
57  }
58  }
59 }
60 
61 
62 SCTHitsNoiseMonAlg::SCTHitsNoiseMonAlg(const std::string& name, ISvcLocator* pSvcLocator)
63  :AthMonitorAlgorithm(name,pSvcLocator)
64 {
65 }
66 
67 
69 
74  ATH_CHECK(m_tracksName.initialize());
75 
77 
78  // Get the helper:
79  ATH_CHECK(detStore()->retrieve(m_pSCTHelper, "SCT_ID"));
80  ATH_CHECK(m_ConfigurationTool.retrieve());
81 
83  ATH_MSG_ERROR("wafer_hash_max()=" << m_pSCTHelper->wafer_hash_max() <<
84  " differs from SCT_Monitoring::N_WAFERS=" << SCT_Monitoring::N_WAFERS);
85  return StatusCode::RECOVERABLE;
86  }
88 }
89 
90 
91 StatusCode SCTHitsNoiseMonAlg::fillHistograms(const EventContext& ctx) const {
94 
95  // If track hits are selected, make the vector of track rdo identifiers
96  std::array<std::unordered_set<Identifier>, N_WAFERS> rdosOnTracks;
97  if (m_doTrackHits) {
98  if (makeVectorOfTrackRDOIdentifiers(rdosOnTracks, ctx).isFailure()) {
99  ATH_MSG_WARNING("Couldn't make vector of track RDO identifiers");
100  }
101  }
102  if (generalHistsandNoise(rdosOnTracks, ctx).isFailure()) {
103  ATH_MSG_WARNING("Error in generalHists");
104  }
105  if (makeSPvsEventNumber().isFailure()) {
106  ATH_MSG_WARNING("Error in makeSPvsEventNumber");
107  }
108 
109  return StatusCode::SUCCESS;
110 }
111 
112 StatusCode SCTHitsNoiseMonAlg::generalHistsandNoise(const std::array<std::unordered_set<Identifier>, N_WAFERS>& rdosOnTracks, const EventContext& ctx) const{
113  static const unsigned int limits[N_REGIONS] = {
115  };
116 
117  const EventIDBase& pEvent{ctx.eventID()};
118  const int lumi_block{static_cast<int>(pEvent.lumi_block())};
119 
121  if (not rdoContainer.isValid()) {
122  ATH_MSG_WARNING("SCT_RDO_Container not valid");
123  return StatusCode::FAILURE;
124  }
125  // Get the space point container
127  if (not spacePointContainer.isValid()) {
128  ATH_MSG_WARNING("SpacePointContainer not valid");
129  return StatusCode::FAILURE;
130  }
131 
132  bool isSelectedTrigger{false};
133  // EDAVIES - have now changed back to using L1_RD0_EMPTY
134  if (m_doTrigger and !m_trigDecTool.empty()) {
136  if (m_trigDecTool->isPassed(m_NOTriggerItem)) {
137  isSelectedTrigger = true;
139  }
140  }
141  }
142  m_events_lb++;
143  if (isSelectedTrigger) {
145  }
146 
147  std::vector<float> occ(N_WAFERS, 0.);
148  std::vector<float> hitOcc(N_WAFERS, 0.);
149 
150  int local_tothits{0};
151 
152  std::vector<int> barrel_local_nhitslayer(N_BARRELSx2, 0);
153  std::vector<int> ECp_local_nhitslayer(N_DISKSx2, 0);
154  std::vector<int> ECm_local_nhitslayer(N_DISKSx2, 0);
155  std::vector<int>* hitsInLayer[N_REGIONS] = {
156  &ECm_local_nhitslayer, &barrel_local_nhitslayer, &ECp_local_nhitslayer
157  };
158  const bool doThisSubsystem[N_REGIONS] = {
160  };
161  // vectors to store data to decrease number of fill() calls for better perfomance
162  std::vector<int> vLumiBlock[N_REGIONS];
163  std::vector<int> vNumberOfHitsFromAllRDOs[N_REGIONS];
164  std::vector<int> vNumberOfHitsFromSPs[N_REGIONS];
165  std::vector<bool> vIsSelectedTriggerHits[N_REGIONS];
166  for (unsigned int jReg{0}; jReg<N_REGIONS; jReg++) {
167  unsigned int size{0};
168  if (jReg==ENDCAP_C_INDEX or jReg==ENDCAP_A_INDEX) size = N_SIDES * N_MOD_ENDCAPS;
169  else if (jReg==BARREL_INDEX) size = N_SIDES * N_MOD_BARREL;
170  vLumiBlock[jReg].reserve(size);
171  vNumberOfHitsFromAllRDOs[jReg].reserve(size);
172  vNumberOfHitsFromSPs[jReg].reserve(size);
173  vIsSelectedTriggerHits[jReg].reserve(size);
174  }
175 
176  std::vector<int> vEtaOnTrack;
177  std::vector<int> vPhiOnTrack;
178  std::vector<float> vSystemIndexOnTrack;
179  std::vector<bool> vDTbinOnTrack;
180 
181  std::vector<int> vEta;
182  std::vector<int> vPhi;
183  std::vector<int> vNumberOfStrips;
184 
185  // Outer Loop on RDO Collection
186  for (const InDetRawDataCollection<SCT_RDORawData>* rdoCollection: *rdoContainer) {
187  // MJW new code- try getting the ID of the collection using the identify() method
188  const Identifier wafer_id{rdoCollection->identify()};
189  const IdentifierHash wafer_hash{rdoCollection->identifyHash()};
190  const Identifier module_id{m_pSCTHelper->module_id(wafer_id)};
191  const IdentifierHash theModuleHash0{m_pSCTHelper->wafer_hash(module_id)}; // This hash is not necessarily for side 0.
192  IdentifierHash theModuleHash1; // This hash is not necessarily for side 1.
193  m_pSCTHelper->get_other_side(theModuleHash0, theModuleHash1);
194  const int barrel_ec{m_pSCTHelper->barrel_ec(wafer_id)};
195  const unsigned int systemIndex{bec2Index(barrel_ec)};
196 
197  const int thisLayerDisk{m_pSCTHelper->layer_disk(wafer_id)};
198  const int thisPhi{m_pSCTHelper->phi_module(wafer_id)};
199  const int thisEta{m_pSCTHelper->eta_module(wafer_id)};
200  const int thisSide{m_pSCTHelper->side(wafer_id)};
201  const int thisElement{(N_SIDES * thisLayerDisk) + thisSide};
202 
203  LayerSideFormatter layerSide{static_cast<unsigned int>(thisElement), systemIndex};
204 
205  int numberOfHitsFromSPs{0};
206  int numberOfHitsFromAllRDOs{0};
207  // Now we want the space point container for this module
208  // We have to compare module IDs- the SP collection is defined for the 'normal' (i.e. no stereo) module side
209  // Define a set of spIDs
210  std::unordered_set<Identifier> mySetOfSPIds;
211  for (int side{0}; side<N_SIDES; side++) {
212  auto spContainerIterator{spacePointContainer->indexFindPtr(side==0 ? theModuleHash0 : theModuleHash1)};
213  if (spContainerIterator==nullptr) continue;
214  for (const Trk::SpacePoint* sp: *spContainerIterator) {
215  const std::vector<Identifier>& rdoList{(thisSide==side ? sp->clusterList().first : sp->clusterList().second)->rdoList()};
216  mySetOfSPIds.insert(rdoList.begin(), rdoList.end());
217  }
218  }
219 
220  vEtaOnTrack.clear();
221  vPhiOnTrack.clear();
222  vEta.clear();
223  vPhi.clear();
224  vNumberOfStrips.clear();
225 
226  // Now we loop over the RDOs in the RDO collection, and add to the NO vector any that are in the mySetOfSPIds
227  for (const SCT_RDORawData* rdo: *rdoCollection) {
228  const int numberOfStrips{rdo->getGroupSize()};
229  (*hitsInLayer[systemIndex])[thisElement] += numberOfStrips;
230  local_tothits += numberOfStrips;
231 
232  if (doThisSubsystem[systemIndex]) {
233  const SCT3_RawData* rdo3{dynamic_cast<const SCT3_RawData*>(rdo)};
234  int tbin{3};
235  if (rdo3) {
236  tbin = rdo3->getTimeBin();
237  }
238  const Identifier strip_id{rdo->identify()};
239  const int firstStrip{m_pSCTHelper->strip(strip_id)};
240  const int limit{firstStrip + numberOfStrips};
241 
242  if (rdosOnTracks[wafer_hash].find(strip_id) != rdosOnTracks[wafer_hash].end()) {
243  for (int ichan{firstStrip}; ichan < limit; ++ichan) {
244  vEtaOnTrack.push_back(thisEta);
245  vPhiOnTrack.push_back(thisPhi);
246  vDTbinOnTrack.push_back((tbin == 2) or (tbin == 3));
247  vSystemIndexOnTrack.push_back(systemIndex);
248  }
249  }
250  vEta.push_back(thisEta);
251  vPhi.push_back(thisPhi);
252  vNumberOfStrips.push_back(numberOfStrips);
253 
254  numberOfHitsFromAllRDOs += numberOfStrips;
255  // Record number of hits in space points if timebin filtering is on hits not in bin X1X are counted as in space
256  // points
257  if (mySetOfSPIds.find(strip_id) != mySetOfSPIds.end()) {
258  numberOfHitsFromSPs += numberOfStrips;
259  } else if (m_doTimeBinFilteringForNoise and (not timeBinInPattern(tbin, XIX))) {
260  numberOfHitsFromSPs += numberOfStrips;
261  }
262  }
263 
264  } // End of Loop on rdoCollection, so end of loop over the RDOs in the RDO container
265  // We can now do the NO calculation for this wafer
266  // For the Time Dependent plots
267 
268  const std::string streamhitmap{"mapsOfHitsOnTracks" + abbreviations[systemIndex] + "_" +
269  "trackhitsmap_" + layerSide.name()};
270 
271  auto etaMapsOfHitsOnTracksAcc{Monitored::Collection("eta_"+streamhitmap, vEtaOnTrack)};
272  auto phiMapsOfHitsOnTracksAcc{Monitored::Collection("phi_"+streamhitmap, vPhiOnTrack)};
273  fill("SCTHitsNoiseMonitor_" + std::to_string(systemIndex), etaMapsOfHitsOnTracksAcc, phiMapsOfHitsOnTracksAcc);
274 
275  const std::string hitmap{"hitsmap" + abbreviations[systemIndex] + "_" + layerSide.name()};
276 
277  auto etahitsmapAcc{Monitored::Collection("eta_"+hitmap, vEta)};
278  auto phihitsmapAcc{Monitored::Collection("phi_"+hitmap, vPhi)};
279  auto numberOfStripsAcc{Monitored::Collection("numberOfStrips_"+hitmap, vNumberOfStrips)};
280  fill("SCTHitsNoiseMonitor_" + std::to_string(systemIndex), etahitsmapAcc, phihitsmapAcc, numberOfStripsAcc);
281 
282  if (m_doOnline){
283  const std::string hitmaprecent{"hitsmaprecent" + abbreviations[systemIndex] + "_" + layerSide.name()};
284  auto etahitsmapRecentAcc{Monitored::Collection("eta_"+hitmaprecent, vEta)};
285  auto phihitsmapRecentAcc{Monitored::Collection("phi_"+hitmaprecent, vPhi)};
286  auto numberOfStripsRecentAcc{Monitored::Collection("numberOfStrips_"+hitmaprecent, vNumberOfStrips)};
287  fill("SCTHitsNoiseMonitor_" + std::to_string(systemIndex), etahitsmapRecentAcc, phihitsmapRecentAcc, numberOfStripsAcc);
288 
289  const std::string streamhitmaprecent{"mapsOfHitsOnTracksrecent" + abbreviations[systemIndex] + "_" +
290  "trackhitsmap_" + layerSide.name()};
291 
292  auto etaMapsOfHitsOnTracksRecentAcc{Monitored::Collection("eta_"+streamhitmaprecent, vEtaOnTrack)};
293  auto phiMapsOfHitsOnTracksRecentAcc{Monitored::Collection("phi_"+streamhitmaprecent, vPhiOnTrack)};
294  fill("SCTHitsNoiseMonitor_" + std::to_string(systemIndex), etaMapsOfHitsOnTracksRecentAcc, phiMapsOfHitsOnTracksRecentAcc);
295  }
296 
297  if (numberOfHitsFromAllRDOs > 0) {
298  int den{N_STRIPS - numberOfHitsFromSPs};
299  int num{numberOfHitsFromAllRDOs - numberOfHitsFromSPs};
300  if (num < 0) {
301  num = 0;
302  ATH_MSG_WARNING("Too many reconstructed space points for number of real hits");
303  }
304  if (den > 0) {
305  occ[wafer_hash] = static_cast<float>(num) / static_cast<float>(den) * 1.E5;
306  }
307 
308  hitOcc[wafer_hash] = static_cast<float>(numberOfHitsFromAllRDOs) / static_cast<float>(N_STRIPS) * 1.E5;
309 
310  vLumiBlock[systemIndex].push_back(lumi_block);
311  vNumberOfHitsFromAllRDOs[systemIndex].push_back(numberOfHitsFromAllRDOs);
312  vNumberOfHitsFromSPs[systemIndex].push_back(numberOfHitsFromSPs);
313  vIsSelectedTriggerHits[systemIndex].push_back(isSelectedTrigger);
314  // end of hit occupancy
315  }
316  }// End of Loop on RDO container
317 
318  auto Bec_TBinFracAllAcc{Monitored::Collection("Bec_TBinFracAll", vSystemIndexOnTrack)};
319  auto TBin_TBinFracAllAcc{Monitored::Collection("TBin_TBinFracAll", vDTbinOnTrack)};
320  fill("SCTHitsNoiseMonitorGeneral", Bec_TBinFracAllAcc, TBin_TBinFracAllAcc);
321 
322  for (unsigned int jReg{0}; jReg<N_REGIONS; jReg++) {
323  auto lbHitsAcc{Monitored::Collection("LBHits", vLumiBlock[jReg])};
324  auto numberOfHitsFromAllRDOsAcc{Monitored::Collection("numberOfHitsFromAllRDOs", vNumberOfHitsFromAllRDOs[jReg])};
325  auto numberOfHitsFromSPsAcc{Monitored::Collection("numberOfHitsFromSPs", vNumberOfHitsFromSPs[jReg])};
326  auto isSelectedTriggerHitsAcc{Monitored::Collection("isSelectedTriggerHits", vIsSelectedTriggerHits[jReg])};
327  fill("SCTHitsNoiseMonitor_" + std::to_string(jReg), lbHitsAcc, numberOfHitsFromAllRDOsAcc, numberOfHitsFromSPsAcc, isSelectedTriggerHitsAcc);
328  }
329 
330  // Fill Cluster size histogram
332  if (not clusterContainer.isValid()) {
333  ATH_MSG_WARNING("Couldn't retrieve clusters");
334  }
335 
336  std::vector<long unsigned int> vGroupSize;
337  for (const InDet::SCT_ClusterCollection* clusterCollection: *clusterContainer) {
338  for (const InDet::SCT_Cluster* cluster: *clusterCollection) {
339  vGroupSize.push_back(cluster->rdoList().size());
340  }
341  }
342  auto cluSizeAcc{Monitored::Collection("clu_size", vGroupSize)};
343  fill("SCTHitsNoiseMonitorGeneral", cluSizeAcc);
344  auto hitsAcc{Monitored::Scalar<int>("sct_hits", local_tothits)};
345  fill("SCTHitsNoiseMonitorGeneral", hitsAcc);
346 
347  // Fill hit occupancy and noise occupancy plots
348  // vectors for storing the data and then use only one fill call to decrease time
349  std::vector<int> vLB[N_REGIONS_INC_GENERAL];
350  std::vector<float> vNO[N_REGIONS_INC_GENERAL];
351  std::vector<float> vHO[N_REGIONS_INC_GENERAL];
352  std::vector<bool> vIsSelectedTrigger[N_REGIONS_INC_GENERAL];
353  std::vector<std::vector<float>> vNO2D[N_REGIONS];
354  std::vector<std::vector<float>> vHO2D[N_REGIONS];
355  std::vector<std::vector<int>> vEtaNOHO[N_REGIONS];
356  std::vector<std::vector<int>> vPhiNOHO[N_REGIONS];
357  std::vector<std::vector<bool>> vIsSelectedTriggerNOHO[N_REGIONS];
358  for (unsigned int jReg{0}; jReg<N_REGIONS_INC_GENERAL; jReg++) {
359  unsigned int size{N_WAFERS};
360  if (jReg==ENDCAP_C_INDEX or jReg==ENDCAP_A_INDEX) size = N_SIDES * N_MOD_ENDCAPS;
361  else if (jReg==BARREL_INDEX) size = N_SIDES * N_MOD_BARREL;
362  vLB[jReg].reserve(size);
363  vNO[jReg].reserve(size);
364  vHO[jReg].reserve(size);
365  vIsSelectedTrigger[jReg].reserve(size);
366 
367  if (jReg<GENERAL_INDEX) {
368  vNO2D[jReg].resize(limits[jReg], {});
369  vHO2D[jReg].resize(limits[jReg], {});
370  vEtaNOHO[jReg].resize(limits[jReg], {});
371  vPhiNOHO[jReg].resize(limits[jReg], {});
372  vIsSelectedTriggerNOHO[jReg].resize(limits[jReg], {});
373  for (unsigned int element{0}; element< limits[jReg]; ++element) {
374  const int nWafers{getNumModules(jReg, element)*N_SIDES};
375  vNO2D[jReg][element].reserve(nWafers);
376  vHO2D[jReg][element].reserve(nWafers);
377  vEtaNOHO[jReg][element].reserve(nWafers);
378  vPhiNOHO[jReg][element].reserve(nWafers);
379  vIsSelectedTriggerNOHO[jReg][element].reserve(nWafers);
380  }
381  }
382  }
383 
384  for (unsigned int iHash{0}; iHash<N_WAFERS; iHash++) {
385  const IdentifierHash wafer_hash{iHash};
386  if (not m_ConfigurationTool->isGood(wafer_hash)) continue;
387 
388  const Identifier wafer_id{m_pSCTHelper->wafer_id(wafer_hash)};
389  const int barrel_ec{m_pSCTHelper->barrel_ec(wafer_id)};
390  const unsigned int systemIndex{bec2Index(barrel_ec)};
391  vLB[systemIndex].push_back(lumi_block);
392  vNO[systemIndex].push_back(occ[iHash]);
393  vHO[systemIndex].push_back(hitOcc[iHash]);
394  vIsSelectedTrigger[systemIndex].push_back(isSelectedTrigger);
395  vLB[GENERAL_INDEX].push_back(lumi_block);
396  vNO[GENERAL_INDEX].push_back(occ[iHash]);
397  vHO[GENERAL_INDEX].push_back(hitOcc[iHash]);
398  vIsSelectedTrigger[GENERAL_INDEX].push_back(isSelectedTrigger);
399  if (doThisSubsystem[systemIndex]) {
400  const int element{N_SIDES * m_pSCTHelper->layer_disk(wafer_id) + m_pSCTHelper->side(wafer_id)};
401  vNO2D[systemIndex][element].push_back(occ[iHash]);
402  vHO2D[systemIndex][element].push_back(hitOcc[iHash]);
403  vEtaNOHO[systemIndex][element].push_back(m_pSCTHelper->eta_module(wafer_id));
404  vPhiNOHO[systemIndex][element].push_back(m_pSCTHelper->phi_module(wafer_id));
405  vIsSelectedTriggerNOHO[systemIndex][element].push_back(isSelectedTrigger);
406  }
407  }
408 
409  for (unsigned int jReg{0}; jReg<N_REGIONS_INC_GENERAL; jReg++) {
410  std::string monitor;
411  if (jReg==GENERAL_INDEX) monitor = "SCTHitsNoiseMonitorGeneral";
412  else monitor = "SCTHitsNoiseMonitor_" + std::to_string(jReg);
413 
414  auto LBAcc{Monitored::Collection("LB", vLB[jReg])};
415  auto noAcc{Monitored::Collection("NO", vNO[jReg])};
416  auto hoAcc{Monitored::Collection("HO", vHO[jReg])};
417  auto IsSelectedTriggerAcc{Monitored::Collection("IsSelectedTrigger", vIsSelectedTrigger[jReg])};
418  fill(monitor, LBAcc, noAcc, hoAcc, IsSelectedTriggerAcc);
419  }
420 
421  for (unsigned int jReg{0}; jReg<N_REGIONS; ++jReg){
422  for (unsigned int element{0}; element < limits[jReg]; ++element) {
423  LayerSideFormatter layerSide{element, jReg};
424  const std::string occMap{"occupancymap" + abbreviations[jReg] + "_" + layerSide.name()};
425  auto etaEacc{Monitored::Collection("eta_" + occMap, vEtaNOHO[jReg][element])};
426  auto phiAcc{Monitored::Collection("phi_" + occMap, vPhiNOHO[jReg][element])};
427  auto hoAcc{Monitored::Collection("HO_" + occMap, vHO2D[jReg][element])};
428  auto noAcc{Monitored::Collection("NO_" + occMap, vNO2D[jReg][element])};
429  auto isSelectedTriggerAcc{Monitored::Collection("IsSelectedTrigger_"+occMap, vIsSelectedTriggerNOHO[jReg][element])};
430  fill("SCTHitsNoiseMonitor_" + std::to_string(jReg), etaEacc, phiAcc, hoAcc, noAcc, isSelectedTriggerAcc);
431 
432  if (m_doOnline){
433  auto isSelectedTriggerRecentAcc{Monitored::Collection("IsSelectedTriggerRecent_"+occMap, vIsSelectedTriggerNOHO[jReg][element])};
434  fill("SCTHitsNoiseMonitor_" + std::to_string(jReg), etaEacc, phiAcc, hoAcc, noAcc, isSelectedTriggerRecentAcc);
435  }
436 
437  }
438  }
439 
440  return StatusCode::SUCCESS;
441 }
442 
443 
444 StatusCode SCTHitsNoiseMonAlg::makeVectorOfTrackRDOIdentifiers(std::array<std::unordered_set<Identifier>, N_WAFERS>& rdosOnTracks, const EventContext& ctx) const{
445  // Clear the rdosOnTracks vector
446  rdosOnTracks.fill(std::unordered_set<Identifier>());
448  if (not rdoContainer.isValid()) {
449  ATH_MSG_FATAL("Could not find the data object " << m_dataObjectName.key() << " !");
450  return StatusCode::FAILURE;
451  } else {
452  ATH_MSG_DEBUG("Data object " << m_dataObjectName.key() << " found");
453  }
454 
456  if (not tracks.isValid()) {
457  ATH_MSG_FATAL("No tracks for you!");
458  return StatusCode::FAILURE;
459  }
460  // Only do for events with less than some number of tracks
461  if (tracks->size() > m_maxTracks) {
462  ATH_MSG_DEBUG("The event has more than " << m_maxTracks
463  << " tracks. Don't do hits-on-track-hists");
464  return StatusCode::SUCCESS;
465  }
466  // assemble list of rdo ids associated with tracks
467  for (const Trk::Track* track : *tracks) {
468  if (track == nullptr) {
469  ATH_MSG_WARNING("no pointer to track!!!");
470  break;
471  }
472  // Get pointer to track state on surfaces
473  const Trk::TrackStates* trackStates{track->trackStateOnSurfaces()};
474  if (trackStates == nullptr) {
475  ATH_MSG_WARNING("for current track is TrackStateOnSurfaces == Null, no data will be written for this track");
476  } else {// Loop over all track states on surfaces
477  for (const Trk::TrackStateOnSurface* TSOS: *trackStates) {
478  // Get pointer to RIO of right type
479  const InDet::SiClusterOnTrack* clus{dynamic_cast<const InDet::SiClusterOnTrack*>(TSOS->measurementOnTrack())};
480  if (clus) {
481  // Get Pointer to prepRawDataObject
482  const InDet::SiCluster* RawDataClus{dynamic_cast<const InDet::SiCluster*>(clus->prepRawData())};
483  if (RawDataClus == nullptr) {
484  ATH_MSG_WARNING("SiCluster WITHOUT prepRawData!!!!");
485  break;
486  }
487  // if Cluster is in SCT ...
488  if (RawDataClus->detectorElement()->isSCT()) {
489  const std::vector<Identifier>& rdoList{RawDataClus->rdoList()};
490  rdosOnTracks[RawDataClus->detectorElement()->identifyHash()].insert(rdoList.begin(), rdoList.end());
491  }
492  }
493  }
494  }
495  }
496  return StatusCode::SUCCESS;
497 }
498 
500  return StatusCode::SUCCESS;
501 }
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
SCT_NameFormatter.h
SCT_CalibAlgs::bec2Index
unsigned int bec2Index(const int bec)
Definition: SCT_CalibUtilities.cxx:60
Trk::SpacePoint
Definition: Tracking/TrkEvent/TrkSpacePoint/TrkSpacePoint/SpacePoint.h:35
SCTHitsNoiseMonAlg::makeSPvsEventNumber
StatusCode makeSPvsEventNumber() const
Definition: SCTHitsNoiseMonAlg.cxx:499
SCTHitsNoiseMonAlg::m_SCTDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
Definition: SCTHitsNoiseMonAlg.h:97
AthMonitorAlgorithm::dataType
DataType_t dataType() const
Accessor functions for the data type.
Definition: AthMonitorAlgorithm.h:221
SCT_Monitoring::N_REGIONS
@ N_REGIONS
Definition: SCT_MonitoringNumbers.h:19
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...
SCT_Monitoring::N_WAFERS
@ N_WAFERS
Definition: SCT_MonitoringNumbers.h:51
AthMonitorAlgorithm::m_trigDecTool
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecTool
Tool to tell whether a specific trigger is passed.
Definition: AthMonitorAlgorithm.h:340
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
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
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
SCTHitsNoiseMonAlg::m_maxTracks
UnsignedIntegerProperty m_maxTracks
Definition: SCTHitsNoiseMonAlg.h:85
defineDB.ichan
ichan
Definition: JetTagCalibration/share/defineDB.py:28
SCTHitsNoiseMonAlg::m_events_lb
std::atomic< int > m_events_lb
Definition: SCTHitsNoiseMonAlg.h:51
SCT::N_SIDES
constexpr unsigned int N_SIDES
Definition: SCT_ChipUtils.h:16
SCT_Monitoring::LayerSideFormatter::name
std::string name(const std::string &delimiter="_") const
Definition: SCT_NameFormatter.h:72
makeHists.thisPhi
thisPhi
Definition: makeHists.py:127
SCT_Monitoring::N_BARRELSx2
@ N_BARRELSx2
Definition: SCT_MonitoringNumbers.h:43
SCTHitsNoiseMonAlg::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override final
adds event to the monitoring histograms
Definition: SCTHitsNoiseMonAlg.cxx:91
TrigDecisionTool.h
SiClusterOnTrack.h
SCT_RDORawData
Definition: SCT_RDORawData.h:24
SCT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: SCT_ID.h:686
SCT_Monitoring::BARREL_INDEX
@ BARREL_INDEX
Definition: SCT_MonitoringNumbers.h:19
SCT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: SCT_ID.h:698
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
MuonR4::to_string
std::string to_string(const SectorProjector proj)
Definition: MsTrackSeeder.cxx:74
SCT_Monitoring::N_STRIPS
@ N_STRIPS
Definition: SCT_MonitoringNumbers.h:36
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
SCTHitsNoiseMonAlg::m_doNegativeEndcap
BooleanProperty m_doNegativeEndcap
Definition: SCTHitsNoiseMonAlg.h:72
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
TRT::Hit::side
@ side
Definition: HitInfo.h:83
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
SCT_Monitoring::ENDCAP_A_INDEX
@ ENDCAP_A_INDEX
Definition: SCT_MonitoringNumbers.h:19
SCTHitsNoiseMonAlg::m_doTimeBinFilteringForNoise
BooleanProperty m_doTimeBinFilteringForNoise
Add time-bin filtering to space point NO algorithm.
Definition: SCTHitsNoiseMonAlg.h:77
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
SCTHitsNoiseMonAlg::initialize
virtual StatusCode initialize() override final
initialize
Definition: SCTHitsNoiseMonAlg.cxx:68
SCT_Monitoring::N_REGIONS_INC_GENERAL
@ N_REGIONS_INC_GENERAL
Definition: SCT_MonitoringNumbers.h:19
SCTHitsNoiseMonAlg::m_SCTSPContainerName
SG::ReadHandleKey< SpacePointContainer > m_SCTSPContainerName
Definition: SCTHitsNoiseMonAlg.h:93
SpacePointCollection.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
SCT3_RawData.h
SCT_ID::wafer_hash_max
size_type wafer_hash_max() const
Definition: SCT_ID.cxx:650
SCTHitsNoiseMonAlg::m_doOnline
BooleanProperty m_doOnline
Definition: SCTHitsNoiseMonAlg.h:67
SCT3_RawData
Definition: SCT3_RawData.h:24
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
SCT_Monitoring::LayerSideFormatter
format an element index (e.g.
Definition: SCT_NameFormatter.h:20
SCTHitsNoiseMonAlg::m_pSCTHelper
const SCT_ID * m_pSCTHelper
SCT Helper class.
Definition: SCTHitsNoiseMonAlg.h:108
InDetRawDataCollection
Definition: InDetRawDataCollection.h:31
SCT_Monitoring::N_MOD_ENDCAPS
@ N_MOD_ENDCAPS
Definition: SCT_MonitoringNumbers.h:49
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SCTHitsNoiseMonAlg::m_doTrackHits
BooleanProperty m_doTrackHits
Definition: SCTHitsNoiseMonAlg.h:84
SCTHitsNoiseMonAlg::m_clusContainerKey
SG::ReadHandleKey< InDet::SCT_ClusterContainer > m_clusContainerKey
Definition: SCTHitsNoiseMonAlg.h:91
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
AthMonitorAlgorithm::fill
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable >> &&variables) const
Fills a vector of variables to a group by reference.
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:448
InDet::SCT_Cluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SCT_Cluster.h:34
DataVector< const Trk::TrackStateOnSurface >
SCTHitsNoiseMonAlg::m_numberOfEventsRecent
std::atomic< int > m_numberOfEventsRecent
Definition: SCTHitsNoiseMonAlg.h:47
AthMonitorAlgorithm::DataType_t::cosmics
@ cosmics
lumiFormat.array
array
Definition: lumiFormat.py:91
trigbs_pickEvents.num
num
Definition: trigbs_pickEvents.py:76
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
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
RIO_OnTrack.h
SCT_ID::layer_disk
int layer_disk(const Identifier &id) const
Definition: SCT_ID.h:692
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
SCTHitsNoiseMonAlg::m_eventsTrigger_lb
std::atomic< int > m_eventsTrigger_lb
Definition: SCTHitsNoiseMonAlg.h:52
ISCT_ConfigurationConditionsTool.h
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
DataVector.h
An STL vector of pointers that by default owns its pointed-to elements.
Trk::Pattern
@ Pattern
Definition: ParametersCommon.h:29
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:722
SCTHitsNoiseMonAlg::m_dataObjectName
SG::ReadHandleKey< SCT_RDO_Container > m_dataObjectName
Data object name: for the SCT this is "SCT_RDOs".
Definition: SCTHitsNoiseMonAlg.h:95
SCTHitsNoiseMonAlg::m_NOTriggerItem
StringProperty m_NOTriggerItem
Name of the L1 Type to use for filling the extra NO histograms.
Definition: SCTHitsNoiseMonAlg.h:65
SCT_ID::eta_module
int eta_module(const Identifier &id) const
Definition: SCT_ID.h:704
SCT_ClusterContainer.h
SCTHitsNoiseMonAlg::makeVectorOfTrackRDOIdentifiers
StatusCode makeVectorOfTrackRDOIdentifiers(std::array< std::unordered_set< Identifier >, SCT_Monitoring::N_WAFERS > &rdosOnTracks, const EventContext &ctx) const
Definition: SCTHitsNoiseMonAlg.cxx:444
SCTHitsNoiseMonAlg.h
SCT_ID::side
int side(const Identifier &id) const
Definition: SCT_ID.h:710
SCTHitsNoiseMonAlg::m_tracksName
SG::ReadHandleKey< TrackCollection > m_tracksName
Name of the Track collection to use.
Definition: SCTHitsNoiseMonAlg.h:90
SCT_Monitoring::getNumModules
int getNumModules(const int reg, const int layer)
Definition: SCT_MonitoringNumbers.h:99
SCT_CalibAlgs::firstStrip
@ firstStrip
Definition: SCT_CalibNumbers.h:10
SCTHitsNoiseMonAlg::SCTHitsNoiseMonAlg
SCTHitsNoiseMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: SCTHitsNoiseMonAlg.cxx:62
SCTHitsNoiseMonAlg::m_numberOfEventsTrigger
std::atomic< int > m_numberOfEventsTrigger
Definition: SCTHitsNoiseMonAlg.h:45
SCTHitsNoiseMonAlg::m_doPositiveEndcap
BooleanProperty m_doPositiveEndcap
Switch on or off the hitmaps histograms.
Definition: SCTHitsNoiseMonAlg.h:71
xAOD::track
@ track
Definition: TrackingPrimitives.h:513
SCTHitsNoiseMonAlg::m_ConfigurationTool
ToolHandle< ISCT_ConfigurationConditionsTool > m_ConfigurationTool
Definition: SCTHitsNoiseMonAlg.h:101
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
SCTHitsNoiseMonAlg::m_numberOfEvents
std::atomic< int > m_numberOfEvents
Definition: SCTHitsNoiseMonAlg.h:43
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
SCT_Monitoring::N_MOD_BARREL
@ N_MOD_BARREL
Definition: SCT_MonitoringNumbers.h:49
InDet::SCT_ClusterCollection
Trk::PrepRawDataCollection< SCT_Cluster > SCT_ClusterCollection
Definition: SCT_ClusterCollection.h:26
updateCoolNtuple.limit
int limit
Definition: updateCoolNtuple.py:44
InDet::SiCluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SiCluster.h:40
SCTHitsNoiseMonAlg::m_doTrigger
BooleanProperty m_doTrigger
Definition: SCTHitsNoiseMonAlg.h:66
SCT_Monitoring::N_DISKSx2
@ N_DISKSx2
Definition: SCT_MonitoringNumbers.h:44
SCTHitsNoiseMonAlg::generalHistsandNoise
StatusCode generalHistsandNoise(const std::array< std::unordered_set< Identifier >, SCT_Monitoring::N_WAFERS > &rdosOnTracks, const EventContext &ctx) const
Definition: SCTHitsNoiseMonAlg.cxx:112
InDet::SiClusterOnTrack
Definition: SiClusterOnTrack.h:39
Identifier
Definition: IdentifierFieldParser.cxx:14