ATLAS Offline Software
gFEXFPGA.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 //***************************************************************************
5 // gFEXFPGA - Defines FPGA tools
6 // -------------------
7 // begin : 01 04 2021
8 // email : cecilia.tosciri@cern.ch
9 //***************************************************************************
10 
11 #include "L1CaloFEXSim/gFEXFPGA.h"
13 #include "StoreGate/WriteHandle.h"
14 #include "StoreGate/ReadHandle.h"
15 #include <algorithm>
16 
17 
18 namespace LVL1 {
19 
20  // default constructor for persistency
21 
22  gFEXFPGA::gFEXFPGA(const std::string& type,const std::string& name,const IInterface* parent):
24  {
25  declareInterface<IgFEXFPGA>(this);
26  }
27 
30  {
31  }
32 
33  //---------------- Initialisation -------------------------------------------------
34 
36  {
37 
40 
41  return StatusCode::SUCCESS;
42  }
43 
44 
46  {
47  m_fpgaId = id;
48 
49  return StatusCode::SUCCESS;
50  }
51 
53 
54  m_fpgaId = -1;
55  }
56 
57 
59  gTowersCentral & gTowersIDs_central, // input, IDs
60  gTowersType & output_gTower_energies, // output, 200 MeV
61  gTowersType & output_gTower50_energies, // output, 50 MeV
62  gTowersType & output_saturation) { // output, saturation
63 
64  float Eta = 99;
65  float Phi = 99;
66  int TowerEt = -99;
67  int Fpga = m_fpgaId;
68  char IsSaturated = 0;
69 
70  SG::ReadHandle<gTowerContainer> gFEXFPGA_gTowerContainer(m_gFEXFPGA_gTowerContainerKey/*,ctx*/); // 200 MeV
71  SG::ReadHandle<gTowerContainer> gFEXFPGA_gTower50Container(m_gFEXFPGA_gTower50ContainerKey/*,ctx*/); // 50 MeV
72 
73  bool is_mc = false;
74  if (!gFEXFPGA_gTower50Container.isValid()) {
75  is_mc = true;
76  }
77 
78  int rows = gTowersIDs_central.size();
79  int cols = gTowersIDs_central[0].size();
80 
81  for (int myrow = 0; myrow<rows; myrow++){
82  for (int mycol = 0; mycol<cols; mycol++){
83 
84  output_gTower_energies[myrow][mycol] = 0;
85  output_gTower50_energies[myrow][mycol] = 0;
86  output_saturation[myrow][mycol] = 0;
87 
88 
89  int towerID = gTowersIDs_central[myrow][mycol];
90  if(towerID == 0) continue;
91 
92  const LVL1::gTower * tmpTower = gFEXFPGA_gTowerContainer->findTower(towerID);
93  const LVL1::gTower * tmpTower50 = tmpTower;
94  if (!is_mc) {
95  tmpTower50 = gFEXFPGA_gTower50Container->findTower(towerID);
96  }
97 
98  if (tmpTower == nullptr) continue;
99 
100  TowerEt = tmpTower->getET();
101  Eta = tmpTower->eta();
102  Phi = tmpTower->phi();
103  int iPhiFW, iEtaFW;
104  uint32_t gFEXtowerID = tmpTower->getFWID(iPhiFW, iEtaFW);
105  IsSaturated = tmpTower->isSaturated();
106  std::unique_ptr<xAOD::gFexTower> gTowerEDM (new xAOD::gFexTower());
107  gTowersContainer->push_back(std::move(gTowerEDM));
108  gTowersContainer->back()->initialize(iEtaFW, iPhiFW, Eta, Phi, TowerEt, Fpga, IsSaturated, gFEXtowerID);
109 
110  output_gTower_energies[myrow][mycol] = tmpTower->getET();
111  output_gTower50_energies[myrow][mycol] = is_mc ? tmpTower50->getET() * 4. : tmpTower50->getET();
112  output_saturation[myrow][mycol] = tmpTower->isSaturated();
113  }
114  }
115  }
116 
118  gTowersForward & gTowersIDs_forward_n,
119  gTowersForward & gTowersIDs_forward_p,
120  gTowersType & output_gTower_energies,
121  gTowersType & output_gTower50_energies,
122  gTowersType & output_saturation) {
123 
124  char IsSaturated = 0;
125 
126  SG::ReadHandle<gTowerContainer> gFEXFPGA_gTowerContainer(m_gFEXFPGA_gTowerContainerKey/*,ctx*/);
127  SG::ReadHandle<gTowerContainer> gFEXFPGA_gTower50Container(m_gFEXFPGA_gTower50ContainerKey/*,ctx*/);
128 
129  bool is_mc = false;
130  if (!gFEXFPGA_gTower50Container.isValid()) {
131  is_mc = true;
132  }
133 
134 
135  //
136  // C-N
137  //
138  int rows = gTowersIDs_forward_n.size();
139  int cols = gTowersIDs_forward_n[0].size();
140 
141  for (int myrow = 0; myrow<rows; myrow++){
142  for (int mycol = 0; mycol<cols; mycol++){
143 
144  int towerID = gTowersIDs_forward_n[myrow][mycol];
145  if(towerID == 0) continue;
146 
147  const LVL1::gTower * tmpTower = gFEXFPGA_gTowerContainer->findTower(towerID);
148  const LVL1::gTower * tmpTower50 = tmpTower;
149  if (!is_mc) {
150  tmpTower50 = gFEXFPGA_gTower50Container->findTower(towerID);
151  }
152 
153  if (tmpTower == nullptr) continue;
154 
155  int TowerEt = tmpTower->getET();
156  float Eta = tmpTower->eta();
157  float Phi = tmpTower->phi();
158  int Fpga = m_fpgaId;
159  int iPhiFW, iEtaFW;
160  uint32_t gFEXtowerID = tmpTower->getFWID(iPhiFW, iEtaFW);
161  IsSaturated = tmpTower->isSaturated();
162  std::unique_ptr<xAOD::gFexTower> gTowerEDM (new xAOD::gFexTower());
163  gTowersContainer->push_back(std::move(gTowerEDM));
164  gTowersContainer->back()->initialize(iEtaFW, iPhiFW, Eta, Phi, TowerEt, Fpga, IsSaturated, gFEXtowerID);
165 
166  output_gTower_energies[iPhiFW][iEtaFW - 2] = tmpTower->getET();
167  output_gTower50_energies[iPhiFW][iEtaFW - 2] = is_mc ? tmpTower50->getET() * 4. : tmpTower50->getET();
168  output_saturation[iPhiFW][iEtaFW - 2] = tmpTower->isSaturated();
169  }
170  }
171 
172  //
173  // C-P
174  //
175  rows = gTowersIDs_forward_p.size();
176  cols = gTowersIDs_forward_p[0].size();
177 
178  for (int myrow = 0; myrow<rows; myrow++){
179  for (int mycol = 0; mycol<cols; mycol++){
180 
181  int towerID = gTowersIDs_forward_p[myrow][mycol];
182  if(towerID == 0) continue;
183 
184  const LVL1::gTower * tmpTower = gFEXFPGA_gTowerContainer->findTower(towerID);
185  const LVL1::gTower * tmpTower50 = tmpTower;
186  if (!is_mc) {
187  tmpTower50 = gFEXFPGA_gTower50Container->findTower(towerID);
188  }
189 
190  if (tmpTower == nullptr) continue;
191 
192  int TowerEt = tmpTower->getET();
193  float Eta = tmpTower->eta();
194  float Phi = tmpTower->phi();
195  int Fpga = m_fpgaId;
196  int iPhiFW, iEtaFW;
197  uint32_t gFEXtowerID = tmpTower->getFWID(iPhiFW, iEtaFW);
198  IsSaturated = tmpTower->isSaturated();
199  std::unique_ptr<xAOD::gFexTower> gTowerEDM (new xAOD::gFexTower());
200  gTowersContainer->push_back(std::move(gTowerEDM));
201  gTowersContainer->back()->initialize(iEtaFW, iPhiFW, Eta, Phi, TowerEt, Fpga, IsSaturated, gFEXtowerID);
202 
203  output_gTower_energies[iPhiFW][iEtaFW - 32 + 6] = tmpTower->getET();
204  output_gTower50_energies[iPhiFW][iEtaFW - 32 + 6] = is_mc ? tmpTower50->getET() * 4. : tmpTower50->getET();
205  output_saturation[iPhiFW][iEtaFW - 32 + 6] = tmpTower->isSaturated();
206  }
207  }
208  }
209 
210 
211 } // end of namespace bracket
LVL1::gFEXFPGA::gFEXFPGA
gFEXFPGA(const std::string &type, const std::string &name, const IInterface *parent)
Constructors.
Definition: gFEXFPGA.cxx:22
LVL1::gFEXFPGA::reset
virtual void reset() override
Definition: gFEXFPGA.cxx:52
LVL1::gTower::getFWID
int getFWID(int &iPhiFW, int &iEtaFW) const
Calculates and returns the firmware ID, as well as iPhi and iEta in FT/global scheme.
Definition: gTower.cxx:202
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
LVL1::gFEXFPGA::~gFEXFPGA
virtual ~gFEXFPGA()
Destructor.
Definition: gFEXFPGA.cxx:29
gTowerContainer.h
LVL1::gTower::isSaturated
char isSaturated() const
Returns true if is saturated.
Definition: gTower.cxx:179
LVL1::gTower
The gTower class is an interface object for gFEX trigger algorithms The purposes are twofold:
Definition: gTower.h:38
LVL1::gFEXFPGA::m_fpgaId
int m_fpgaId
Internal data.
Definition: gFEXFPGA.h:51
LVL1::gTower::phi
float phi() const
Definition: gTower.h:69
Phi
@ Phi
Definition: RPCdef.h:8
LVL1
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
Definition: ICMMCPHitsCnvTool.h:18
LVL1::gFEXFPGA::FillgTowerEDMCentral
virtual void FillgTowerEDMCentral(SG::WriteHandle< xAOD::gFexTowerContainer > &, gTowersCentral &, gTowersType &, gTowersType &, gTowersType &) override
Definition: gFEXFPGA.cxx:58
LVL1::gTower::getET
int getET() const
Get ET (total) in MeV.
Definition: gTower.cxx:147
WriteHandle.h
Handle class for recording to StoreGate.
beamspotnt.cols
list cols
Definition: bin/beamspotnt.py:1114
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
LVL1::gFEXFPGA::m_gFEXFPGA_gTower50ContainerKey
SG::ReadHandleKey< LVL1::gTowerContainer > m_gFEXFPGA_gTower50ContainerKey
Definition: gFEXFPGA.h:58
test_pyathena.parent
parent
Definition: test_pyathena.py:15
gFEXFPGA.h
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
beamspotnt.rows
list rows
Definition: bin/beamspotnt.py:1112
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DataVector::back
const T * back() const
Access the last element in the collection as an rvalue.
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
TrigConf::name
Definition: HLTChainList.h:35
LVL1::gTower::eta
float eta() const
Definition: gTower.h:68
LVL1::gTowersCentral
std::array< std::array< int, 12 >, 32 > gTowersCentral
Definition: IgFEXaltMetAlgo.h:19
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:191
LVL1::gFEXFPGA::initialize
virtual StatusCode initialize() override
standard Athena-Algorithm method
Definition: gFEXFPGA.cxx:35
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
LVL1::gFEXFPGA::m_gFEXFPGA_gTowerContainerKey
SG::ReadHandleKey< LVL1::gTowerContainer > m_gFEXFPGA_gTowerContainerKey
Definition: gFEXFPGA.h:57
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
LVL1::gTowersForward
std::array< std::array< int, 8 >, 32 > gTowersForward
Definition: IgFEXaltMetAlgo.h:20
LVL1::gTowersType
std::array< std::array< int, 12 >, 32 > gTowersType
Definition: IgFEXFPGA.h:25
LVL1::gFEXFPGA::init
virtual StatusCode init(int id) override
Definition: gFEXFPGA.cxx:45
ReadHandle.h
Handle class for reading from StoreGate.
AthAlgTool
Definition: AthAlgTool.h:26
LVL1::gFEXFPGA::FillgTowerEDMForward
virtual void FillgTowerEDMForward(SG::WriteHandle< xAOD::gFexTowerContainer > &, gTowersForward &, gTowersForward &, gTowersType &, gTowersType &, gTowersType &) override
Definition: gFEXFPGA.cxx:117
Eta
@ Eta
Definition: RPCdef.h:8