ATLAS Offline Software
Loading...
Searching...
No Matches
SCTHitsNoiseMonAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include "SCT_NameFormatter.h"
7
13
20
21#include <string>
22
23using namespace SCT_Monitoring;
24
25namespace {
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
62SCTHitsNoiseMonAlg::SCTHitsNoiseMonAlg(const std::string& name, ISvcLocator* pSvcLocator)
63 :AthMonitorAlgorithm(name,pSvcLocator)
64{
65}
66
67
69
70 ATH_CHECK(m_dataObjectName.initialize());
71 ATH_CHECK(m_SCTSPContainerName.initialize());
72 ATH_CHECK(m_dataObjectName.initialize());
73 ATH_CHECK(m_clusContainerKey.initialize());
74 ATH_CHECK(m_tracksName.initialize());
75
76 ATH_CHECK(m_SCTDetEleCollKey.initialize());
77
78 // Get the helper:
79 ATH_CHECK(detStore()->retrieve(m_pSCTHelper, "SCT_ID"));
81
82 if (m_pSCTHelper->wafer_hash_max()!=SCT_Monitoring::N_WAFERS) {
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
91StatusCode SCTHitsNoiseMonAlg::fillHistograms(const EventContext& ctx) const {
94
95 // If track hits are selected, make the vector of track rdo identifiers
96 //Total stack use for this function is 473316 bytes.
97 //coverity[STACK_USE]
98 std::array<std::unordered_set<Identifier>, N_WAFERS> rdosOnTracks;
99 if (m_doTrackHits) {
100 if (makeVectorOfTrackRDOIdentifiers(rdosOnTracks, ctx).isFailure()) {
101 ATH_MSG_WARNING("Couldn't make vector of track RDO identifiers");
102 }
103 }
104 if (generalHistsandNoise(rdosOnTracks, ctx).isFailure()) {
105 ATH_MSG_WARNING("Error in generalHists");
106 }
107 if (makeSPvsEventNumber().isFailure()) {
108 ATH_MSG_WARNING("Error in makeSPvsEventNumber");
109 }
110
111 return StatusCode::SUCCESS;
112}
113
114StatusCode SCTHitsNoiseMonAlg::generalHistsandNoise(const std::array<std::unordered_set<Identifier>, N_WAFERS>& rdosOnTracks, const EventContext& ctx) const{
115 static const unsigned int limits[N_REGIONS] = {
117 };
118
119 const EventIDBase& pEvent{ctx.eventID()};
120 const int lumi_block{static_cast<int>(pEvent.lumi_block())};
121
123 if (not rdoContainer.isValid()) {
124 ATH_MSG_WARNING("SCT_RDO_Container not valid");
125 return StatusCode::FAILURE;
126 }
127 // Get the space point container
129 if (not spacePointContainer.isValid()) {
130 ATH_MSG_WARNING("SpacePointContainer not valid");
131 return StatusCode::FAILURE;
132 }
133
134 bool isSelectedTrigger{false};
135 // EDAVIES - have now changed back to using L1_RD0_EMPTY
136 if (m_doTrigger and !m_trigDecTool.empty()) {
138 if (m_trigDecTool->isPassed(m_NOTriggerItem)) {
139 isSelectedTrigger = true;
141 }
142 }
143 }
144 m_events_lb++;
145 if (isSelectedTrigger) {
147 }
148
149 std::vector<float> occ(N_WAFERS, 0.);
150 std::vector<float> hitOcc(N_WAFERS, 0.);
151
152 int local_tothits{0};
153
154 std::vector<int> barrel_local_nhitslayer(N_BARRELSx2, 0);
155 std::vector<int> ECp_local_nhitslayer(N_DISKSx2, 0);
156 std::vector<int> ECm_local_nhitslayer(N_DISKSx2, 0);
157 std::vector<int>* hitsInLayer[N_REGIONS] = {
158 &ECm_local_nhitslayer, &barrel_local_nhitslayer, &ECp_local_nhitslayer
159 };
160 const bool doThisSubsystem[N_REGIONS] = {
162 };
163 // vectors to store data to decrease number of fill() calls for better perfomance
164 std::vector<int> vLumiBlock[N_REGIONS];
165 std::vector<int> vNumberOfHitsFromAllRDOs[N_REGIONS];
166 std::vector<int> vNumberOfHitsFromSPs[N_REGIONS];
167 std::vector<bool> vIsSelectedTriggerHits[N_REGIONS];
168 for (unsigned int jReg{0}; jReg<N_REGIONS; jReg++) {
169 unsigned int size{0};
171 else if (jReg==BARREL_INDEX) size = N_SIDES * N_MOD_BARREL;
172 vLumiBlock[jReg].reserve(size);
173 vNumberOfHitsFromAllRDOs[jReg].reserve(size);
174 vNumberOfHitsFromSPs[jReg].reserve(size);
175 vIsSelectedTriggerHits[jReg].reserve(size);
176 }
177
178 std::vector<int> vEtaOnTrack;
179 std::vector<int> vPhiOnTrack;
180 std::vector<float> vSystemIndexOnTrack;
181 std::vector<bool> vDTbinOnTrack;
182
183 std::vector<int> vEta;
184 std::vector<int> vPhi;
185 std::vector<int> vNumberOfStrips;
186
187 // Outer Loop on RDO Collection
188 for (const InDetRawDataCollection<SCT_RDORawData>* rdoCollection: *rdoContainer) {
189 // MJW new code- try getting the ID of the collection using the identify() method
190 const Identifier wafer_id{rdoCollection->identify()};
191 const IdentifierHash wafer_hash{rdoCollection->identifyHash()};
192 const Identifier module_id{m_pSCTHelper->module_id(wafer_id)};
193 const IdentifierHash theModuleHash0{m_pSCTHelper->wafer_hash(module_id)}; // This hash is not necessarily for side 0.
194 IdentifierHash theModuleHash1; // This hash is not necessarily for side 1.
195 m_pSCTHelper->get_other_side(theModuleHash0, theModuleHash1);
196 const int barrel_ec{m_pSCTHelper->barrel_ec(wafer_id)};
197 const unsigned int systemIndex{bec2Index(barrel_ec)};
198
199 const int thisLayerDisk{m_pSCTHelper->layer_disk(wafer_id)};
200 const int thisPhi{m_pSCTHelper->phi_module(wafer_id)};
201 const int thisEta{m_pSCTHelper->eta_module(wafer_id)};
202 const int thisSide{m_pSCTHelper->side(wafer_id)};
203 const int thisElement{(N_SIDES * thisLayerDisk) + thisSide};
204
205 LayerSideFormatter layerSide{static_cast<unsigned int>(thisElement), systemIndex};
206
207 int numberOfHitsFromSPs{0};
208 int numberOfHitsFromAllRDOs{0};
209 // Now we want the space point container for this module
210 // We have to compare module IDs- the SP collection is defined for the 'normal' (i.e. no stereo) module side
211 // Define a set of spIDs
212 std::unordered_set<Identifier> mySetOfSPIds;
213 for (int side{0}; side<N_SIDES; side++) {
214 auto spContainerIterator{spacePointContainer->indexFindPtr(side==0 ? theModuleHash0 : theModuleHash1)};
215 if (spContainerIterator==nullptr) continue;
216 for (const Trk::SpacePoint* sp: *spContainerIterator) {
217 const std::vector<Identifier>& rdoList{(thisSide==side ? sp->clusterList().first : sp->clusterList().second)->rdoList()};
218 mySetOfSPIds.insert(rdoList.begin(), rdoList.end());
219 }
220 }
221
222 vEtaOnTrack.clear();
223 vPhiOnTrack.clear();
224 vEta.clear();
225 vPhi.clear();
226 vNumberOfStrips.clear();
227
228 // Now we loop over the RDOs in the RDO collection, and add to the NO vector any that are in the mySetOfSPIds
229 for (const SCT_RDORawData* rdo: *rdoCollection) {
230 const int numberOfStrips{rdo->getGroupSize()};
231 (*hitsInLayer[systemIndex])[thisElement] += numberOfStrips;
232 local_tothits += numberOfStrips;
233
234 if (doThisSubsystem[systemIndex]) {
235 const SCT3_RawData* rdo3{dynamic_cast<const SCT3_RawData*>(rdo)};
236 int tbin{3};
237 if (rdo3) {
238 tbin = rdo3->getTimeBin();
239 }
240 const Identifier strip_id{rdo->identify()};
241 const int firstStrip{m_pSCTHelper->strip(strip_id)};
242 const int limit{firstStrip + numberOfStrips};
243
244 if (rdosOnTracks[wafer_hash].find(strip_id) != rdosOnTracks[wafer_hash].end()) {
245 for (int ichan{firstStrip}; ichan < limit; ++ichan) {
246 vEtaOnTrack.push_back(thisEta);
247 vPhiOnTrack.push_back(thisPhi);
248 vDTbinOnTrack.push_back((tbin == 2) or (tbin == 3));
249 vSystemIndexOnTrack.push_back(systemIndex);
250 }
251 }
252 vEta.push_back(thisEta);
253 vPhi.push_back(thisPhi);
254 vNumberOfStrips.push_back(numberOfStrips);
255
256 numberOfHitsFromAllRDOs += numberOfStrips;
257 // Record number of hits in space points if timebin filtering is on hits not in bin X1X are counted as in space
258 // points
259 if (mySetOfSPIds.find(strip_id) != mySetOfSPIds.end()) {
260 numberOfHitsFromSPs += numberOfStrips;
261 } else if (m_doTimeBinFilteringForNoise and (not timeBinInPattern(tbin, XIX))) {
262 numberOfHitsFromSPs += numberOfStrips;
263 }
264 }
265
266 } // End of Loop on rdoCollection, so end of loop over the RDOs in the RDO container
267 // We can now do the NO calculation for this wafer
268 // For the Time Dependent plots
269
270 const std::string streamhitmap{"mapsOfHitsOnTracks" + abbreviations[systemIndex] + "_" +
271 "trackhitsmap_" + layerSide.name()};
272
273 auto etaMapsOfHitsOnTracksAcc{Monitored::Collection("eta_"+streamhitmap, vEtaOnTrack)};
274 auto phiMapsOfHitsOnTracksAcc{Monitored::Collection("phi_"+streamhitmap, vPhiOnTrack)};
275 fill("SCTHitsNoiseMonitor_" + std::to_string(systemIndex), etaMapsOfHitsOnTracksAcc, phiMapsOfHitsOnTracksAcc);
276
277 const std::string hitmap{"hitsmap" + abbreviations[systemIndex] + "_" + layerSide.name()};
278
279 auto etahitsmapAcc{Monitored::Collection("eta_"+hitmap, vEta)};
280 auto phihitsmapAcc{Monitored::Collection("phi_"+hitmap, vPhi)};
281 auto numberOfStripsAcc{Monitored::Collection("numberOfStrips_"+hitmap, vNumberOfStrips)};
282 fill("SCTHitsNoiseMonitor_" + std::to_string(systemIndex), etahitsmapAcc, phihitsmapAcc, numberOfStripsAcc);
283
284 if (m_doOnline){
285 const std::string hitmaprecent{"hitsmaprecent" + abbreviations[systemIndex] + "_" + layerSide.name()};
286 auto etahitsmapRecentAcc{Monitored::Collection("eta_"+hitmaprecent, vEta)};
287 auto phihitsmapRecentAcc{Monitored::Collection("phi_"+hitmaprecent, vPhi)};
288 auto numberOfStripsRecentAcc{Monitored::Collection("numberOfStrips_"+hitmaprecent, vNumberOfStrips)};
289 fill("SCTHitsNoiseMonitor_" + std::to_string(systemIndex), etahitsmapRecentAcc, phihitsmapRecentAcc, numberOfStripsAcc);
290
291 const std::string streamhitmaprecent{"mapsOfHitsOnTracksrecent" + abbreviations[systemIndex] + "_" +
292 "trackhitsmap_" + layerSide.name()};
293
294 auto etaMapsOfHitsOnTracksRecentAcc{Monitored::Collection("eta_"+streamhitmaprecent, vEtaOnTrack)};
295 auto phiMapsOfHitsOnTracksRecentAcc{Monitored::Collection("phi_"+streamhitmaprecent, vPhiOnTrack)};
296 fill("SCTHitsNoiseMonitor_" + std::to_string(systemIndex), etaMapsOfHitsOnTracksRecentAcc, phiMapsOfHitsOnTracksRecentAcc);
297 }
298
299 if (numberOfHitsFromAllRDOs > 0) {
300 int den{N_STRIPS - numberOfHitsFromSPs};
301 int num{numberOfHitsFromAllRDOs - numberOfHitsFromSPs};
302 if (num < 0) {
303 num = 0;
304 ATH_MSG_WARNING("Too many reconstructed space points for number of real hits");
305 }
306 if (den > 0) {
307 occ[wafer_hash] = static_cast<float>(num) / static_cast<float>(den) * 1.E5;
308 }
309
310 hitOcc[wafer_hash] = static_cast<float>(numberOfHitsFromAllRDOs) / static_cast<float>(N_STRIPS) * 1.E5;
311
312 vLumiBlock[systemIndex].push_back(lumi_block);
313 vNumberOfHitsFromAllRDOs[systemIndex].push_back(numberOfHitsFromAllRDOs);
314 vNumberOfHitsFromSPs[systemIndex].push_back(numberOfHitsFromSPs);
315 vIsSelectedTriggerHits[systemIndex].push_back(isSelectedTrigger);
316 // end of hit occupancy
317 }
318 }// End of Loop on RDO container
319
320 auto Bec_TBinFracAllAcc{Monitored::Collection("Bec_TBinFracAll", vSystemIndexOnTrack)};
321 auto TBin_TBinFracAllAcc{Monitored::Collection("TBin_TBinFracAll", vDTbinOnTrack)};
322 fill("SCTHitsNoiseMonitorGeneral", Bec_TBinFracAllAcc, TBin_TBinFracAllAcc);
323
324 for (unsigned int jReg{0}; jReg<N_REGIONS; jReg++) {
325 auto lbHitsAcc{Monitored::Collection("LBHits", vLumiBlock[jReg])};
326 auto numberOfHitsFromAllRDOsAcc{Monitored::Collection("numberOfHitsFromAllRDOs", vNumberOfHitsFromAllRDOs[jReg])};
327 auto numberOfHitsFromSPsAcc{Monitored::Collection("numberOfHitsFromSPs", vNumberOfHitsFromSPs[jReg])};
328 auto isSelectedTriggerHitsAcc{Monitored::Collection("isSelectedTriggerHits", vIsSelectedTriggerHits[jReg])};
329 fill("SCTHitsNoiseMonitor_" + std::to_string(jReg), lbHitsAcc, numberOfHitsFromAllRDOsAcc, numberOfHitsFromSPsAcc, isSelectedTriggerHitsAcc);
330 }
331
332 // Fill Cluster size histogram
334 if (not clusterContainer.isValid()) {
335 ATH_MSG_WARNING("Couldn't retrieve clusters");
336 }
337
338 std::vector<long unsigned int> vGroupSize;
339 for (const InDet::SCT_ClusterCollection* clusterCollection: *clusterContainer) {
340 for (const InDet::SCT_Cluster* cluster: *clusterCollection) {
341 vGroupSize.push_back(cluster->rdoList().size());
342 }
343 }
344 auto cluSizeAcc{Monitored::Collection("clu_size", vGroupSize)};
345 fill("SCTHitsNoiseMonitorGeneral", cluSizeAcc);
346 auto hitsAcc{Monitored::Scalar<int>("sct_hits", local_tothits)};
347 fill("SCTHitsNoiseMonitorGeneral", hitsAcc);
348
349 // Fill hit occupancy and noise occupancy plots
350 // vectors for storing the data and then use only one fill call to decrease time
351 std::vector<int> vLB[N_REGIONS_INC_GENERAL];
352 std::vector<float> vNO[N_REGIONS_INC_GENERAL];
353 std::vector<float> vHO[N_REGIONS_INC_GENERAL];
354 std::vector<bool> vIsSelectedTrigger[N_REGIONS_INC_GENERAL];
355 std::vector<std::vector<float>> vNO2D[N_REGIONS];
356 std::vector<std::vector<float>> vHO2D[N_REGIONS];
357 std::vector<std::vector<int>> vEtaNOHO[N_REGIONS];
358 std::vector<std::vector<int>> vPhiNOHO[N_REGIONS];
359 std::vector<std::vector<bool>> vIsSelectedTriggerNOHO[N_REGIONS];
360 for (unsigned int jReg{0}; jReg<N_REGIONS_INC_GENERAL; jReg++) {
361 unsigned int size{N_WAFERS};
363 else if (jReg==BARREL_INDEX) size = N_SIDES * N_MOD_BARREL;
364 vLB[jReg].reserve(size);
365 vNO[jReg].reserve(size);
366 vHO[jReg].reserve(size);
367 vIsSelectedTrigger[jReg].reserve(size);
368
369 if (jReg<GENERAL_INDEX) {
370 vNO2D[jReg].resize(limits[jReg], {});
371 vHO2D[jReg].resize(limits[jReg], {});
372 vEtaNOHO[jReg].resize(limits[jReg], {});
373 vPhiNOHO[jReg].resize(limits[jReg], {});
374 vIsSelectedTriggerNOHO[jReg].resize(limits[jReg], {});
375 for (unsigned int element{0}; element< limits[jReg]; ++element) {
376 const int nWafers{getNumModules(jReg, element)*N_SIDES};
377 vNO2D[jReg][element].reserve(nWafers);
378 vHO2D[jReg][element].reserve(nWafers);
379 vEtaNOHO[jReg][element].reserve(nWafers);
380 vPhiNOHO[jReg][element].reserve(nWafers);
381 vIsSelectedTriggerNOHO[jReg][element].reserve(nWafers);
382 }
383 }
384 }
385
386 for (unsigned int iHash{0}; iHash<N_WAFERS; iHash++) {
387 const IdentifierHash wafer_hash{iHash};
388 if (not m_ConfigurationTool->isGood(wafer_hash, ctx)) continue;
389
390 const Identifier wafer_id{m_pSCTHelper->wafer_id(wafer_hash)};
391 const int barrel_ec{m_pSCTHelper->barrel_ec(wafer_id)};
392 const unsigned int systemIndex{bec2Index(barrel_ec)};
393 vLB[systemIndex].push_back(lumi_block);
394 vNO[systemIndex].push_back(occ[iHash]);
395 vHO[systemIndex].push_back(hitOcc[iHash]);
396 vIsSelectedTrigger[systemIndex].push_back(isSelectedTrigger);
397 vLB[GENERAL_INDEX].push_back(lumi_block);
398 vNO[GENERAL_INDEX].push_back(occ[iHash]);
399 vHO[GENERAL_INDEX].push_back(hitOcc[iHash]);
400 vIsSelectedTrigger[GENERAL_INDEX].push_back(isSelectedTrigger);
401 if (doThisSubsystem[systemIndex]) {
402 const int element{N_SIDES * m_pSCTHelper->layer_disk(wafer_id) + m_pSCTHelper->side(wafer_id)};
403 vNO2D[systemIndex][element].push_back(occ[iHash]);
404 vHO2D[systemIndex][element].push_back(hitOcc[iHash]);
405 vEtaNOHO[systemIndex][element].push_back(m_pSCTHelper->eta_module(wafer_id));
406 vPhiNOHO[systemIndex][element].push_back(m_pSCTHelper->phi_module(wafer_id));
407 vIsSelectedTriggerNOHO[systemIndex][element].push_back(isSelectedTrigger);
408 }
409 }
410
411 for (unsigned int jReg{0}; jReg<N_REGIONS_INC_GENERAL; jReg++) {
412 std::string monitor;
413 if (jReg==GENERAL_INDEX) monitor = "SCTHitsNoiseMonitorGeneral";
414 else monitor = "SCTHitsNoiseMonitor_" + std::to_string(jReg);
415
416 auto LBAcc{Monitored::Collection("LB", vLB[jReg])};
417 auto noAcc{Monitored::Collection("NO", vNO[jReg])};
418 auto hoAcc{Monitored::Collection("HO", vHO[jReg])};
419 auto IsSelectedTriggerAcc{Monitored::Collection("IsSelectedTrigger", vIsSelectedTrigger[jReg])};
420 fill(monitor, LBAcc, noAcc, hoAcc, IsSelectedTriggerAcc);
421 }
422
423 for (unsigned int jReg{0}; jReg<N_REGIONS; ++jReg){
424 for (unsigned int element{0}; element < limits[jReg]; ++element) {
425 LayerSideFormatter layerSide{element, jReg};
426 const std::string occMap{"occupancymap" + abbreviations[jReg] + "_" + layerSide.name()};
427 auto etaEacc{Monitored::Collection("eta_" + occMap, vEtaNOHO[jReg][element])};
428 auto phiAcc{Monitored::Collection("phi_" + occMap, vPhiNOHO[jReg][element])};
429 auto hoAcc{Monitored::Collection("HO_" + occMap, vHO2D[jReg][element])};
430 auto noAcc{Monitored::Collection("NO_" + occMap, vNO2D[jReg][element])};
431 auto isSelectedTriggerAcc{Monitored::Collection("IsSelectedTrigger_"+occMap, vIsSelectedTriggerNOHO[jReg][element])};
432 fill("SCTHitsNoiseMonitor_" + std::to_string(jReg), etaEacc, phiAcc, hoAcc, noAcc, isSelectedTriggerAcc);
433
434 if (m_doOnline){
435 auto isSelectedTriggerRecentAcc{Monitored::Collection("IsSelectedTriggerRecent_"+occMap, vIsSelectedTriggerNOHO[jReg][element])};
436 fill("SCTHitsNoiseMonitor_" + std::to_string(jReg), etaEacc, phiAcc, hoAcc, noAcc, isSelectedTriggerRecentAcc);
437 }
438
439 }
440 }
441
442 return StatusCode::SUCCESS;
443}
444
445
446StatusCode SCTHitsNoiseMonAlg::makeVectorOfTrackRDOIdentifiers(std::array<std::unordered_set<Identifier>, N_WAFERS>& rdosOnTracks, const EventContext& ctx) const{
447 // Clear the rdosOnTracks vector
448 rdosOnTracks.fill(std::unordered_set<Identifier>());
450 if (not rdoContainer.isValid()) {
451 ATH_MSG_FATAL("Could not find the data object " << m_dataObjectName.key() << " !");
452 return StatusCode::FAILURE;
453 } else {
454 ATH_MSG_DEBUG("Data object " << m_dataObjectName.key() << " found");
455 }
456
458 if (not tracks.isValid()) {
459 ATH_MSG_FATAL("No tracks for you!");
460 return StatusCode::FAILURE;
461 }
462 // Only do for events with less than some number of tracks
463 if (tracks->size() > m_maxTracks) {
464 ATH_MSG_DEBUG("The event has more than " << m_maxTracks
465 << " tracks. Don't do hits-on-track-hists");
466 return StatusCode::SUCCESS;
467 }
468 // assemble list of rdo ids associated with tracks
469 for (const Trk::Track* track : *tracks) {
470 if (track == nullptr) {
471 ATH_MSG_WARNING("no pointer to track!!!");
472 break;
473 }
474 // Get pointer to track state on surfaces
475 const Trk::TrackStates* trackStates{track->trackStateOnSurfaces()};
476 if (trackStates == nullptr) {
477 ATH_MSG_WARNING("for current track is TrackStateOnSurfaces == Null, no data will be written for this track");
478 } else {// Loop over all track states on surfaces
479 for (const Trk::TrackStateOnSurface* TSOS: *trackStates) {
480 // Get pointer to RIO of right type
481 const InDet::SiClusterOnTrack* clus{dynamic_cast<const InDet::SiClusterOnTrack*>(TSOS->measurementOnTrack())};
482 if (clus) {
483 // Get Pointer to prepRawDataObject
484 const InDet::SiCluster* RawDataClus{dynamic_cast<const InDet::SiCluster*>(clus->prepRawData())};
485 if (RawDataClus == nullptr) {
486 ATH_MSG_WARNING("SiCluster WITHOUT prepRawData!!!!");
487 break;
488 }
489 // if Cluster is in SCT ...
490 if (RawDataClus->detectorElement()->isSCT()) {
491 const std::vector<Identifier>& rdoList{RawDataClus->rdoList()};
492 rdosOnTracks[RawDataClus->detectorElement()->identifyHash()].insert(rdoList.begin(), rdoList.end());
493 }
494 }
495 }
496 }
497 }
498 return StatusCode::SUCCESS;
499}
500
502 return StatusCode::SUCCESS;
503}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
An STL vector of pointers that by default owns its pointed-to elements.
interface file for service that keeps track of configuration conditions
static Double_t sp
This is an Identifier helper class for the SCT subdetector.
Contains string formatting utility functions for use in SCT_Monitoring @ author shaun roe.
Handle class for reading from StoreGate.
size_t size() const
Number of registered mappings.
const ServiceHandle< StoreGateSvc > & detStore() const
virtual StatusCode initialize() override
initialize
DataType_t dataType() const
Accessor functions for the data type.
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecTool
Tool to tell whether a specific trigger is passed.
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
This is a "hash" representation of an Identifier.
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
RIO_OnTrack base class for Silicon detector in the InnerDetector.
virtual const InDetDD::SiDetectorElement * detectorElement() const override final
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
Declare a monitored scalar variable.
int getTimeBin() const
std::atomic< int > m_eventsTrigger_lb
std::atomic< int > m_numberOfEventsRecent
std::atomic< int > m_numberOfEventsTrigger
BooleanProperty m_doTrigger
SG::ReadHandleKey< TrackCollection > m_tracksName
Name of the Track collection to use.
const SCT_ID * m_pSCTHelper
SCT Helper class.
BooleanProperty m_doTrackHits
SCTHitsNoiseMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
StatusCode makeSPvsEventNumber() const
SG::ReadHandleKey< SpacePointContainer > m_SCTSPContainerName
SG::ReadHandleKey< SCT_RDO_Container > m_dataObjectName
Data object name: for the SCT this is "SCT_RDOs".
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
std::atomic< int > m_events_lb
BooleanProperty m_doOnline
UnsignedIntegerProperty m_maxTracks
std::atomic< int > m_numberOfEvents
virtual StatusCode fillHistograms(const EventContext &ctx) const override final
adds event to the monitoring histograms
StringProperty m_NOTriggerItem
Name of the L1 Type to use for filling the extra NO histograms.
SG::ReadHandleKey< InDet::SCT_ClusterContainer > m_clusContainerKey
virtual StatusCode initialize() override final
initialize
StatusCode makeVectorOfTrackRDOIdentifiers(std::array< std::unordered_set< Identifier >, SCT_Monitoring::N_WAFERS > &rdosOnTracks, const EventContext &ctx) const
StatusCode generalHistsandNoise(const std::array< std::unordered_set< Identifier >, SCT_Monitoring::N_WAFERS > &rdosOnTracks, const EventContext &ctx) const
BooleanProperty m_doPositiveEndcap
Switch on or off the hitmaps histograms.
BooleanProperty m_doNegativeEndcap
BooleanProperty m_doTimeBinFilteringForNoise
Add time-bin filtering to space point NO algorithm.
ToolHandle< ISCT_ConfigurationConditionsTool > m_ConfigurationTool
format an element index (e.g.
std::string name(std::string_view delimiter="_") const
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
represents the track state (measurement, material, fit parameters and quality) at a surface.
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:140
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
unsigned int bec2Index(const int becVal)
Conversion bec->index.
int getNumModules(const int reg, const int layer)
DataVector< const Trk::TrackStateOnSurface > TrackStates
void fill(H5::Group &out_file, size_t iterations)