ATLAS Offline Software
Loading...
Searching...
No Matches
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
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 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
112StatusCode 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
444StatusCode 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}
#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.
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(const std::string &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:138
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)