ATLAS Offline Software
Loading...
Searching...
No Matches
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"
8GfexInputMonitorAlgorithm::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
26StatusCode GfexInputMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
27
28 ATH_MSG_DEBUG("GfexInputMonitorAlgorithm::fillHistograms");
29
30 // Access gFex data 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 auto FillTree = Monitored::Scalar<bool>("FillTree",true);
69
70 unsigned int nTowers = 0;
71
72 for(const xAOD::gFexTower* gfexTowerRoI : *gFexTowerContainer){ //data gfex towers
73 // working with "local" fiber number, iFiber
74 unsigned int towerID = gfexTowerRoI->gFEXtowerID();
75 unsigned int offset = (towerID > 20000) ? 20000 : (towerID > 10000 && towerID < 20000) ? 10000 : 0;
76 unsigned int iFiber = (towerID - offset)/16;
77
78 // Do not exceed maximum number of fibers for FPGA
79 unsigned int maxFiberN = (towerID > 20000) ? LVL1::gFEXPos::C_FIBERS : LVL1::gFEXPos::AB_FIBERS;
80 if (iFiber >= maxFiberN) continue;
81
82 int fiber_type = (towerID < 10000) ? LVL1::gFEXPos::AMPD_NFI[iFiber] :
83 (towerID > 10000 && towerID < 20000) ? LVL1::gFEXPos::BMPD_NFI[iFiber] :
85
86 // Data Type: 1 is Tile
87 int dataType = (towerID < 10000) ? LVL1::gFEXPos::AMPD_DTYP_ARR[fiber_type][towerID%16] :
88 (towerID > 10000 && towerID < 20000) ? LVL1::gFEXPos::BMPD_DTYP_ARR[fiber_type][towerID%16] :
89 LVL1::gFEXPos::CMPD_DTYP_ARR[fiber_type][towerID%16];
90
91
92 Toweret=gfexTowerRoI->towerEt(); //returns MLE value
93 Towersaturationflag=gfexTowerRoI->isSaturated();
94 float eta = gfexTowerRoI->eta();
95 float phi = gfexTowerRoI->phi();
96 if (eta == 0.0 && phi == 0.0) continue; // skip the disconnected fibers
97
98 if(!emulatedTowers.empty()) {
99 Towereta = eta; Towerphi = phi;
100 TowerId=gfexTowerRoI->gFEXtowerID();
101 // compare to emulated towers
102 auto eTowerItr = emulatedTowers.find(gfexTowerRoI->gFEXtowerID());
103 if(eTowerItr == emulatedTowers.end()) {
104 // missing emulated tower?
105 Decision = "MissingTower";
106 fill("errors",FillTree,Decision,lbn,evtNumber,TowerId,Towereta,Towerphi,Toweret,refTowerET,refTowerSat,Towersaturationflag);
107 continue;
108 }
109
110 const auto eTower = eTowerItr->second; //accessing the emulated tower from the map created earlier
111 refTowerET = eTower->towerEt();
112 refTowerSat = eTower->isSaturated();
113
114 if(refTowerET != Toweret) {
115 Decision = "ETMismatch";
116 fill("errors",FillTree,Decision,lbn,evtNumber,TowerId,Towereta,Towerphi,Toweret,refTowerET,refTowerSat,Towersaturationflag);
117 if (dataType==1) {
118 Decision = "ETMismatch_Tile";
119 fill("errorsTile",Towereta,Towerphi);
120 }
121 else {
122 Decision = "ETMismatch_SCell";
123 if (std::abs(eta) >= 3.2 ){ //FPGAc
124 Towerphi = phi- 0.1;
125 fill("errorsSCell",Towereta,Towerphi);
126 Towerphi = phi + 0.1;
127 fill("errorsSCell",Towereta,Towerphi);
128 } else { //FPGA a&b
129 fill("errorsSCell",Towereta,Towerphi);
130 }
131 }
132 fill("errors",FillTree,Decision,lbn,evtNumber,TowerId,Towereta,Towerphi,Toweret,refTowerET,refTowerSat,Towersaturationflag);
133 }
134 if(refTowerSat != Towersaturationflag) {
135 Decision = "SatMismatch";
136 fill("errors",FillTree,Decision,lbn,evtNumber,TowerId,Towereta,Towerphi,Toweret,refTowerET,refTowerSat,Towersaturationflag);
137 }
138
139 }
140
141 // Tile gTowers have dataType ==1
142 if (dataType != 1) fill("gTowers",Toweret);
143 else fill("gTileTowers",Toweret);
144
145 if (eta < -3.17 && eta > -3.25){ eta = -3.225;}
146 if (eta < 3.3 && eta > 3.17){ eta = 3.275;}
147
148 Towereta = eta;
149
150 if(gfexTowerRoI->towerEt() >= 1662 ){
151 nTowers++;
152 }
153
154 //looking at only saturated gTowers
155 if (int(Towersaturationflag) == 1){
156 if (std::abs(eta) >= 3.2 ){ //FPGAc
157 Towerphi = phi- 0.1;
158 fill("SatgTowers",Towereta,Towerphi,Toweret);
159 Towerphi = phi + 0.1;
160 fill("SatgTowers",Towereta,Towerphi,Toweret);
161 } else { //FPGA a&b
162 Towerphi = phi;
163 fill("SatgTowers",Towereta,Towerphi,Toweret);
164 }
165 }
166
167
168 //GREATER THAN 2GEV MLE=1342
169 if (gfexTowerRoI->towerEt() >= 1342){
170 if (std::abs(eta) >= 3.2 ){
171 Towerphi = phi- 0.1;
172 binNumber = getBinNumberTower(eta,phi-0.1,0,0);
173 fill("highEtgTowers",Towereta,Towerphi,Toweret);
174 fill("highEtgTowers",lbn,binNumber);
175 Towerphi = phi + 0.1;
176 binNumber = getBinNumberTower(eta, phi+0.1,0,0);
177 fill("highEtgTowers",Towereta,Towerphi,Toweret);
178 fill("highEtgTowers",lbn,binNumber);
179 } else {
180 Towerphi = phi;
181 binNumber = getBinNumberTower(eta,phi,0,0);
182 fill("highEtgTowers",Towereta,Towerphi,Toweret);
183 fill("highEtgTowers",lbn,binNumber);
184 }
185
186 }
187 //only for h_gTower_coldtowers_etaphimap MLE = 1182
188 else if (gfexTowerRoI->towerEt() <= 1182){
189 if (std::abs(eta) >= 3.2){
190 Towerphi = phi- 0.1;
191 binNumber = getBinNumberTower(eta,phi-0.1,0,0);
192 fill("lowEtgTowers",Towereta,Towerphi,Toweret);
193 fill("lowEtgTowers",lbn,binNumber);
194 Towerphi = phi + 0.1;
195 binNumber = getBinNumberTower(eta, phi+0.1,0,0);
196 fill("lowEtgTowers",Towereta,Towerphi,Toweret);
197 fill("lowEtgTowers",lbn,binNumber);
198 } else {
199 Towerphi = phi;
200 binNumber = getBinNumberTower(eta,phi,0,0);
201 fill("lowEtgTowers",Towereta,Towerphi,Toweret);
202 fill("lowEtgTowers",lbn,binNumber);
203 }
204 }
205 }
206
207 nGfexTowers = nTowers;
208 fill ("highEtgTowers",lbn,nGfexTowers);
209
210
211 return StatusCode::SUCCESS;
212}
213
214int GfexInputMonitorAlgorithm::getBinNumberTower (const float& inputEta, const float& inputPhi, int xbin, int ybin) const{
215 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};
216
217 for (int i = 0; i <= 40; i++){
218 if (inputEta >= eta[i] && inputEta < eta[i+1]){
219 xbin = i+1;
220 continue;
221 }
222 }
223 int j=1;
224 for (float phi = -3.2; phi <= 3.2;phi = phi+ 0.2){
225 if (inputPhi >= phi && inputPhi < phi+0.2){
226 ybin = j;
227 break;
228 }
229 j++;
230 }
231 int binN = 32*(xbin-1)+ybin;
232 return binN;
233}
234
235
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
virtual StatusCode initialize() override
initialize
DataType_t dataType() const
Accessor functions for the data type.
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
int getBinNumberTower(const float &inputEta, const float &inputPhi, int xbin, int ybin) const
virtual StatusCode initialize() override
initialize
GfexInputMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::gFexTowerContainer > m_gFexEmulatedTowerKey
SG::ReadHandleKey< xAOD::gFexTowerContainer > m_gFexTowerContainerKey
Declare a monitored scalar variable.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
constexpr std::array< std::array< char, 20 >, 4 > CMPD_DTYP_ARR
Definition gFexPos.h:493
constexpr std::array< int, 100 > CMPD_NFI
Definition gFexPos.h:374
constexpr int C_FIBERS
Definition gFexPos.h:59
constexpr std::array< std::array< char, 20 >, 4 > AMPD_DTYP_ARR
Definition gFexPos.h:215
constexpr std::array< std::array< char, 20 >, 4 > BMPD_DTYP_ARR
Definition gFexPos.h:350
constexpr std::array< int, 100 > AMPD_NFI
Definition gFexPos.h:104
constexpr std::array< int, 100 > BMPD_NFI
Definition gFexPos.h:240
constexpr int AB_FIBERS
Definition gFexPos.h:58
gFexTower_v1 gFexTower
Define the latest version of the TriggerTower class.
Definition gFexTower.h:15
void fill(H5::Group &out_file, size_t iterations)