ATLAS Offline Software
GfexInputMonitorAlgorithm.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3  */
4 
6 #include "TProfile2D.h"
7 #include "TMath.h"
8 GfexInputMonitorAlgorithm::GfexInputMonitorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
9  : AthMonitorAlgorithm(name,pSvcLocator)
10 {
11 }
12 
14 
15  ATH_MSG_DEBUG("GfexInputMonitorAlgorith::initialize");
16  ATH_MSG_DEBUG("Package Name "<< m_packageName);
17  ATH_MSG_DEBUG("m_gFexTowerContainer"<< m_gFexTowerContainerKey);
18 
19  // we initialise all the containers that we need
20  ATH_CHECK( m_gFexTowerContainerKey.initialize() );
22 
24 }
25 
26 StatusCode GfexInputMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
27 
28  ATH_MSG_DEBUG("GfexInputMonitorAlgorithm::fillHistograms");
29 
30  // Access gFex gTower container
32  if(!gFexTowerContainer.isValid()){
33  ATH_MSG_ERROR("No gFex Tower container found in storegate "<< m_gFexTowerContainerKey);
34  return StatusCode::SUCCESS;
35  }
36 
37  // monitored variables for histograms
38  auto nGfexTowers = Monitored::Scalar<int>("NGfexTowers",0.0);
39  auto Towereta = Monitored::Scalar<float>("TowerEta",0.0);
40  auto Towerphi = Monitored::Scalar<float>("TowerPhi",0.0);
41  auto Towersaturationflag = Monitored::Scalar<char>("TowerSaturationflag",0.0);
42  auto Toweret = Monitored::Scalar<int>("TowerEt",0);
43  auto TowerId = Monitored::Scalar<uint32_t>("TowerId",0);
44  auto evtNumber = Monitored::Scalar<ULong64_t>("EventNumber",GetEventInfo(ctx)->eventNumber());
45  auto lbnString = Monitored::Scalar<std::string>("LBNString",std::to_string(GetEventInfo(ctx)->lumiBlock()));
46  auto lbn = Monitored::Scalar<int>("LBN",GetEventInfo(ctx)->lumiBlock());
47  auto binNumber = Monitored::Scalar<int>("binNumber",0);
48 
49  std::map<uint32_t, const xAOD::gFexTower*> emulatedTowers;
50  if(!m_gFexEmulatedTowerKey.empty()) {
52  if(!gFexEmulatedTowerContainer.isValid()){
53  ATH_MSG_ERROR("No gFex Emulated Tower container found in storegate "<< m_gFexEmulatedTowerKey);
54  return StatusCode::FAILURE;
55  }
56 
57  for(const xAOD::gFexTower* tower : *gFexEmulatedTowerContainer){
58  if(emulatedTowers.find(tower->gFEXtowerID())!=emulatedTowers.end()) {
59  ATH_MSG_WARNING("Duplicate towers with ID = " << tower->gFEXtowerID());
60  }
61  emulatedTowers[tower->gFEXtowerID()] = tower;
62  }
63  }
64 
65  auto Decision = Monitored::Scalar<std::string>("Error", "");
66  auto refTowerET = Monitored::Scalar<int>("RefTowerEt",0);
67  auto refTowerSat = Monitored::Scalar<char>("RefTowerSat",0.0);
68 
69  unsigned int nTowers = 0;
70  for(const xAOD::gFexTower* gfexTowerRoI : *gFexTowerContainer){
71 
72  Toweret=gfexTowerRoI->towerEt(); //returns MLE value
73  Towersaturationflag=gfexTowerRoI->isSaturated();
74  float eta = gfexTowerRoI->eta();
75  float phi = gfexTowerRoI->phi();
76 
77  if(!emulatedTowers.empty()) {
78  Towereta = eta; Towerphi = phi;
79  TowerId=gfexTowerRoI->gFEXtowerID();
80  // compare to emulated towers
81  auto eTowerItr = emulatedTowers.find(gfexTowerRoI->gFEXtowerID());
82  if(eTowerItr == emulatedTowers.end()) {
83  // missing emulated tower?
84  Decision = "MissingTower";
85  fill("errors",Decision,lbn,evtNumber,TowerId,Towereta,Towerphi,Toweret,refTowerET,refTowerSat,Towersaturationflag);
86  continue;
87  }
88 
89  const auto eTower = eTowerItr->second;
90  refTowerET = eTower->towerEt();
91  refTowerSat = eTower->isSaturated();
92 
93  if(refTowerET != Toweret) {
94  Decision = "ETMismatch";
95  fill("errors",Decision,lbn,evtNumber,TowerId,Towereta,Towerphi,Toweret,refTowerET,refTowerSat,Towersaturationflag);
96  }
97  if(refTowerSat != Towersaturationflag) {
98  Decision = "SatMismatch";
99  fill("errors",Decision,lbn,evtNumber,TowerId,Towereta,Towerphi,Toweret,refTowerET,refTowerSat,Towersaturationflag);
100  }
101 
102  }
103 
104 
105 
106  fill("gTowers",Toweret);
107 
108  if (eta < -3.17 && eta > -3.25){ eta = -3.225;}
109  if (eta < 3.3 && eta > 3.17){ eta = 3.275;}
110 
111  Towereta = eta;
112 
113  if(gfexTowerRoI->towerEt() >= 1662 ){
114  nTowers++;
115  }
116 
117  //looking at only saturated gTowers
118  if (int(Towersaturationflag) == 1){
119  if (std::abs(eta) >= 3.2 ){ //FPGAc
120  Towerphi = phi- 0.1;
121  fill("SatgTowers",Towereta,Towerphi,Toweret);
122  Towerphi = phi + 0.1;
123  fill("SatgTowers",Towereta,Towerphi,Toweret);
124  } else { //FPGA a&b
125  Towerphi = phi;
126  fill("SatgTowers",Towereta,Towerphi,Toweret);
127  }
128  }
129 
130 
131  //GREATER THAN 2GEV MLE=1342
132  if (gfexTowerRoI->towerEt() >= 1342){
133  if (std::abs(eta) >= 3.2 ){
134  Towerphi = phi- 0.1;
135  binNumber = getBinNumberTower(eta,phi-0.1,0,0);
136  fill("highEtgTowers",Towereta,Towerphi,Toweret);
137  fill("highEtgTowers",lbn,binNumber);
138  Towerphi = phi + 0.1;
139  binNumber = getBinNumberTower(eta, phi+0.1,0,0);
140  fill("highEtgTowers",Towereta,Towerphi,Toweret);
141  fill("highEtgTowers",lbn,binNumber);
142  } else {
143  Towerphi = phi;
144  binNumber = getBinNumberTower(eta,phi,0,0);
145  fill("highEtgTowers",Towereta,Towerphi,Toweret);
146  fill("highEtgTowers",lbn,binNumber);
147  }
148 
149  }
150  //only for h_gTower_coldtowers_etaphimap MLE = 1182
151  else if (gfexTowerRoI->towerEt() <= 1182){
152  if (std::abs(eta) >= 3.2){
153  Towerphi = phi- 0.1;
154  binNumber = getBinNumberTower(eta,phi-0.1,0,0);
155  fill("lowEtgTowers",Towereta,Towerphi,Toweret);
156  fill("lowEtgTowers",lbn,binNumber);
157  Towerphi = phi + 0.1;
158  binNumber = getBinNumberTower(eta, phi+0.1,0,0);
159  fill("lowEtgTowers",Towereta,Towerphi,Toweret);
160  fill("lowEtgTowers",lbn,binNumber);
161  } else {
162  Towerphi = phi;
163  binNumber = getBinNumberTower(eta,phi,0,0);
164  fill("lowEtgTowers",Towereta,Towerphi,Toweret);
165  fill("lowEtgTowers",lbn,binNumber);
166  }
167  }
168  }
169 
170  nGfexTowers = nTowers;
171  fill ("highEtgTowers",lbn,nGfexTowers);
172 
173 
174  return StatusCode::SUCCESS;
175 }
176 
177 int GfexInputMonitorAlgorithm::getBinNumberTower (const float& inputEta, const float& inputPhi, int xbin, int ybin) const{
178  const std::vector<float> eta = {-4.9, -4.1,-3.5,-3.25,-3.2,-3.1,-2.9,-2.7,-2.5,-2.2,-2.0,-1.8,-1.6,-1.4,-1.2,-1.0,-0.8,-0.6,-0.4,-0.2,0.0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0,2.2,2.5,2.7,2.9,3.1,3.25,3.3,3.5,4.1,4.9};
179 
180  for (int i = 0; i <= 40; i++){
181  if (inputEta >= eta[i] && inputEta < eta[i+1]){
182  xbin = i+1;
183  continue;
184  }
185  }
186  int j=1;
187  for (float phi = -3.2; phi <= 3.2;phi = phi+ 0.2){
188  if (inputPhi >= phi && inputPhi < phi+0.2){
189  ybin = j;
190  break;
191  }
192  j++;
193  }
194  int binN = 32*(xbin-1)+ybin;
195  return binN;
196 }
197 
198 
GfexInputMonitorAlgorithm::m_packageName
StringProperty m_packageName
Definition: GfexInputMonitorAlgorithm.h:23
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
GfexInputMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: GfexInputMonitorAlgorithm.cxx:13
GfexInputMonitorAlgorithm::GfexInputMonitorAlgorithm
GfexInputMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Definition: GfexInputMonitorAlgorithm.cxx:8
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
GfexInputMonitorAlgorithm.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::gFexTower_v1
Class describing input data of a LVL1 eFEX.
Definition: gFexTower_v1.h:22
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
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.
AthMonitorAlgorithm::GetEventInfo
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
Definition: AthMonitorAlgorithm.cxx:107
GfexInputMonitorAlgorithm::m_gFexTowerContainerKey
SG::ReadHandleKey< xAOD::gFexTowerContainer > m_gFexTowerContainerKey
Definition: GfexInputMonitorAlgorithm.h:26
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
TrigCompositeUtils::Decision
xAOD::TrigComposite Decision
Definition: Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h:20
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
xAOD::gFexTowerContainer
gFexTowerContainer_v1 gFexTowerContainer
Define the latest version of the TriggerTower container.
Definition: gFexTowerContainer.h:14
GfexInputMonitorAlgorithm::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: GfexInputMonitorAlgorithm.cxx:26
GfexInputMonitorAlgorithm::getBinNumberTower
int getBinNumberTower(const float &inputEta, const float &inputPhi, int xbin, int ybin) const
Definition: GfexInputMonitorAlgorithm.cxx:177
GfexInputMonitorAlgorithm::m_gFexEmulatedTowerKey
SG::ReadHandleKey< xAOD::gFexTowerContainer > m_gFexEmulatedTowerKey
Definition: GfexInputMonitorAlgorithm.h:27
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
xAOD::lumiBlock
setTeId lumiBlock
Definition: L2StandAloneMuon_v1.cxx:328
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30