26   static const std::string abbreviations[
N_REGIONS] = {
 
   36   bool timeBinInPattern(
const int tbin, 
const Pattern xxx) {
 
   44       return ((tbin == 2) or (tbin == 3) or (tbin == 6) or (tbin == 7));
 
   49       return ((tbin == 1) or (tbin == 3) or (tbin == 5) or (tbin == 7));
 
   85     return StatusCode::RECOVERABLE;
 
   96   std::array<std::unordered_set<Identifier>, 
N_WAFERS> rdosOnTracks;
 
  109   return StatusCode::SUCCESS;
 
  113   static const unsigned int limits[
N_REGIONS] = {
 
  117   const EventIDBase& pEvent{ctx.eventID()};
 
  118   const int lumi_block{
static_cast<int>(pEvent.lumi_block())};
 
  121   if (not rdoContainer.isValid()) {
 
  123     return StatusCode::FAILURE;
 
  127   if (not spacePointContainer.isValid()) {
 
  129     return StatusCode::FAILURE;
 
  132   bool isSelectedTrigger{
false};
 
  137         isSelectedTrigger = 
true;
 
  143   if (isSelectedTrigger) {
 
  147   std::vector<float> occ(
N_WAFERS, 0.);
 
  148   std::vector<float> hitOcc(
N_WAFERS, 0.);
 
  150   int local_tothits{0};
 
  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
 
  158   const bool doThisSubsystem[
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};
 
  170     vLumiBlock[jReg].reserve(
size);
 
  171     vNumberOfHitsFromAllRDOs[jReg].reserve(
size);
 
  172     vNumberOfHitsFromSPs[jReg].reserve(
size);
 
  173     vIsSelectedTriggerHits[jReg].reserve(
size);
 
  176   std::vector<int> vEtaOnTrack;
 
  177   std::vector<int> vPhiOnTrack;
 
  178   std::vector<float> vSystemIndexOnTrack;
 
  179   std::vector<bool> vDTbinOnTrack;
 
  181   std::vector<int> vEta;
 
  182   std::vector<int> vPhi;
 
  183   std::vector<int> vNumberOfStrips;
 
  188     const Identifier wafer_id{rdoCollection->identify()};
 
  189     const IdentifierHash wafer_hash{rdoCollection->identifyHash()};
 
  192     IdentifierHash theModuleHash1; 
 
  195     const unsigned int systemIndex{
bec2Index(barrel_ec)};
 
  201     const int thisElement{(
N_SIDES * thisLayerDisk) + thisSide};
 
  205     int numberOfHitsFromSPs{0};
 
  206     int numberOfHitsFromAllRDOs{0};
 
  210     std::unordered_set<Identifier> mySetOfSPIds;
 
  212       auto spContainerIterator{spacePointContainer->indexFindPtr(
side==0 ? theModuleHash0 : theModuleHash1)};
 
  213       if (spContainerIterator==
nullptr) 
continue;
 
  215         const std::vector<Identifier>& rdoList{(thisSide==
side ? sp->clusterList().first : sp->clusterList().second)->rdoList()};
 
  216         mySetOfSPIds.insert(rdoList.begin(), rdoList.end());
 
  224     vNumberOfStrips.clear();
 
  228       const int numberOfStrips{rdo->getGroupSize()};
 
  229       (*hitsInLayer[systemIndex])[thisElement] += numberOfStrips;
 
  230       local_tothits += numberOfStrips;
 
  232       if (doThisSubsystem[systemIndex]) {
 
  242         if (rdosOnTracks[wafer_hash].
find(strip_id) != rdosOnTracks[wafer_hash].end()) {
 
  244             vEtaOnTrack.push_back(thisEta);
 
  245             vPhiOnTrack.push_back(
thisPhi);
 
  246             vDTbinOnTrack.push_back((tbin == 2) or (tbin == 3));
 
  247             vSystemIndexOnTrack.push_back(systemIndex);
 
  250         vEta.push_back(thisEta);
 
  252         vNumberOfStrips.push_back(numberOfStrips);
 
  254         numberOfHitsFromAllRDOs += numberOfStrips;
 
  257         if (mySetOfSPIds.find(strip_id) != mySetOfSPIds.end()) {
 
  258           numberOfHitsFromSPs += numberOfStrips;
 
  260           numberOfHitsFromSPs += numberOfStrips;
 
  268     const std::string streamhitmap{
"mapsOfHitsOnTracks" + abbreviations[systemIndex] + 
"_" +
 
  269         "trackhitsmap_" + layerSide.name()};
 
  273     fill(
"SCTHitsNoiseMonitor_" + 
std::to_string(systemIndex), etaMapsOfHitsOnTracksAcc, phiMapsOfHitsOnTracksAcc);
 
  275     const std::string hitmap{
"hitsmap" + abbreviations[systemIndex] + 
"_" + layerSide.name()};
 
  280     fill(
"SCTHitsNoiseMonitor_" + 
std::to_string(systemIndex), etahitsmapAcc, phihitsmapAcc, numberOfStripsAcc);
 
  283       const std::string hitmaprecent{
"hitsmaprecent" + abbreviations[systemIndex] + 
"_" + layerSide.name()};
 
  286       auto numberOfStripsRecentAcc{
Monitored::Collection(
"numberOfStrips_"+hitmaprecent, vNumberOfStrips)};
 
  287       fill(
"SCTHitsNoiseMonitor_" + 
std::to_string(systemIndex), etahitsmapRecentAcc, phihitsmapRecentAcc, numberOfStripsAcc);
 
  289       const std::string streamhitmaprecent{
"mapsOfHitsOnTracksrecent" + abbreviations[systemIndex] + 
"_" +
 
  290         "trackhitsmap_" + layerSide.name()};
 
  294       fill(
"SCTHitsNoiseMonitor_" + 
std::to_string(systemIndex), etaMapsOfHitsOnTracksRecentAcc, phiMapsOfHitsOnTracksRecentAcc);
 
  297     if (numberOfHitsFromAllRDOs > 0) {
 
  298       int den{
N_STRIPS - numberOfHitsFromSPs};
 
  299       int num{numberOfHitsFromAllRDOs - numberOfHitsFromSPs};
 
  302         ATH_MSG_WARNING(
"Too many reconstructed space points for number of real hits");
 
  305         occ[wafer_hash] = 
static_cast<float>(
num) / 
static_cast<float>(den) * 1.E5;
 
  308       hitOcc[wafer_hash] = 
static_cast<float>(numberOfHitsFromAllRDOs) / 
static_cast<float>(
N_STRIPS) * 1.E5;
 
  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);
 
  320   fill(
"SCTHitsNoiseMonitorGeneral", Bec_TBinFracAllAcc, TBin_TBinFracAllAcc);
 
  322   for (
unsigned int jReg{0}; jReg<
N_REGIONS; 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);
 
  332   if (not clusterContainer.isValid()) {
 
  336   std::vector<long unsigned int> vGroupSize;
 
  339       vGroupSize.push_back(cluster->rdoList().size());
 
  343   fill(
"SCTHitsNoiseMonitorGeneral", cluSizeAcc);
 
  345   fill(
"SCTHitsNoiseMonitorGeneral", hitsAcc);
 
  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];
 
  362     vLB[jReg].reserve(
size);
 
  363     vNO[jReg].reserve(
size);
 
  364     vHO[jReg].reserve(
size);
 
  365     vIsSelectedTrigger[jReg].reserve(
size);
 
  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) {
 
  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);
 
  384   for (
unsigned int iHash{0}; iHash<
N_WAFERS; iHash++) {
 
  385     const IdentifierHash wafer_hash{iHash};
 
  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);
 
  398     vIsSelectedTrigger[
GENERAL_INDEX].push_back(isSelectedTrigger);
 
  399     if (doThisSubsystem[systemIndex]) {
 
  401       vNO2D[systemIndex][element].push_back(occ[iHash]);
 
  402       vHO2D[systemIndex][element].push_back(hitOcc[iHash]);
 
  405       vIsSelectedTriggerNOHO[systemIndex][element].push_back(isSelectedTrigger);
 
  411     if (jReg==
GENERAL_INDEX) monitor = 
"SCTHitsNoiseMonitorGeneral";
 
  418     fill(monitor, LBAcc, noAcc, hoAcc, IsSelectedTriggerAcc);
 
  421   for (
unsigned int jReg{0}; jReg<
N_REGIONS; ++jReg){
 
  422     for (
unsigned int element{0}; element < limits[jReg]; ++element) {
 
  424       const std::string occMap{
"occupancymap" + abbreviations[jReg] + 
"_" + layerSide.
name()};
 
  429       auto isSelectedTriggerAcc{
Monitored::Collection(
"IsSelectedTrigger_"+occMap, vIsSelectedTriggerNOHO[jReg][element])};
 
  430       fill(
"SCTHitsNoiseMonitor_" + 
std::to_string(jReg), etaEacc, phiAcc, hoAcc, noAcc, isSelectedTriggerAcc);
 
  433             auto isSelectedTriggerRecentAcc{
Monitored::Collection(
"IsSelectedTriggerRecent_"+occMap, vIsSelectedTriggerNOHO[jReg][element])};
 
  434             fill(
"SCTHitsNoiseMonitor_" + 
std::to_string(jReg), etaEacc, phiAcc, hoAcc, noAcc, isSelectedTriggerRecentAcc);
 
  440   return StatusCode::SUCCESS;
 
  446   rdosOnTracks.fill(std::unordered_set<Identifier>());
 
  448   if (not rdoContainer.isValid()) {
 
  450     return StatusCode::FAILURE;
 
  456   if (not tracks.isValid()) {
 
  458     return StatusCode::FAILURE;
 
  463                   << 
" tracks. Don't do hits-on-track-hists");
 
  464     return StatusCode::SUCCESS;
 
  468     if (
track == 
nullptr) {
 
  474     if (trackStates == 
nullptr) {
 
  475       ATH_MSG_WARNING(
"for current track is TrackStateOnSurfaces == Null, no data will be written for this track");
 
  483           if (RawDataClus == 
nullptr) {
 
  488           if (RawDataClus->detectorElement()->isSCT()) {
 
  489             const std::vector<Identifier>& rdoList{RawDataClus->rdoList()};
 
  490             rdosOnTracks[RawDataClus->detectorElement()->identifyHash()].insert(rdoList.begin(), rdoList.end());
 
  496   return StatusCode::SUCCESS;
 
  500   return StatusCode::SUCCESS;