24 declareInterface<IgFEXFPGA>(
this);
41 return StatusCode::SUCCESS;
48 return StatusCode::SUCCESS;
84 if (!gFEXFPGA_gTower50Container.
isValid())
89 int rows = gTowersIDs_central.size();
90 int cols = gTowersIDs_central[0].size();
92 for (
int myrow = 0; myrow < rows; myrow++)
94 for (
int mycol = 0; mycol < cols; mycol++)
97 output_gTower_energies[myrow][mycol] = 0;
98 output_gTower50_energies[myrow][mycol] = 0;
99 output_saturation[myrow][mycol] = 0;
101 int towerID = gTowersIDs_central[myrow][mycol];
105 const LVL1::gTower *tmpTower = gFEXFPGA_gTowerContainer->findTower(towerID);
109 tmpTower50 = gFEXFPGA_gTower50Container->findTower(towerID);
112 if (tmpTower ==
nullptr)
115 TowerEt = tmpTower->
getET();
116 Eta = tmpTower->
eta();
117 Phi = tmpTower->
phi();
122 uint32_t gFEXtowerID = tmpTower->
getFWID(iPhiFW, iEtaFW);
125 gTowersContainer->push_back(std::move(gTowerEDM));
126 gTowersContainer->back()->initialize(iEtaFW, iPhiFW, Eta, Phi, TowerEt, Fpga, IsSaturated, gFEXtowerID);
128 output_gTower_energies[myrow][mycol] = tmpTower->
getET();
129 output_gTower50_energies[myrow][mycol] = is_mc ? tmpTower50->
getET() * 4. : tmpTower50->
getET();
130 output_saturation[myrow][mycol] = tmpTower->
isSaturated();
165 char IsSaturated = 0;
171 if (!gFEXFPGA_gTower50Container.
isValid())
179 int rows = gTowersIDs_forward_n.size();
180 int cols = gTowersIDs_forward_n[0].size();
182 for (
int myrow = 0; myrow < rows; myrow++)
184 for (
int mycol = 0; mycol < cols; mycol++)
187 int towerID = gTowersIDs_forward_n[myrow][mycol];
191 const LVL1::gTower *tmpTower = gFEXFPGA_gTowerContainer->findTower(towerID);
195 tmpTower50 = gFEXFPGA_gTower50Container->findTower(towerID);
198 if (tmpTower ==
nullptr)
201 int TowerEt = tmpTower->
getET();
202 float Eta = tmpTower->
eta();
203 float Phi = tmpTower->
phi();
206 uint32_t gFEXtowerID = tmpTower->
getFWID(iPhiFW, iEtaFW);
209 gTowersContainer->push_back(std::move(gTowerEDM));
210 gTowersContainer->back()->initialize(iEtaFW, iPhiFW, Eta, Phi, TowerEt, Fpga, IsSaturated, gFEXtowerID);
212 output_gTower_energies[iPhiFW][iEtaFW - 2] = tmpTower->
getET();
213 output_gTower50_energies[iPhiFW][iEtaFW - 2] = is_mc ? tmpTower50->
getET() * 4. : tmpTower50->
getET();
214 output_saturation[iPhiFW][iEtaFW - 2] = tmpTower->
isSaturated();
221 rows = gTowersIDs_forward_p.size();
222 cols = gTowersIDs_forward_p[0].size();
224 for (
int myrow = 0; myrow < rows; myrow++)
226 for (
int mycol = 0; mycol < cols; mycol++)
229 int towerID = gTowersIDs_forward_p[myrow][mycol];
233 const LVL1::gTower *tmpTower = gFEXFPGA_gTowerContainer->findTower(towerID);
237 tmpTower50 = gFEXFPGA_gTower50Container->findTower(towerID);
240 if (tmpTower ==
nullptr)
243 int TowerEt = tmpTower->
getET();
244 float Eta = tmpTower->
eta();
245 float Phi = tmpTower->
phi();
248 uint32_t gFEXtowerID = tmpTower->
getFWID(iPhiFW, iEtaFW);
251 gTowersContainer->push_back(std::move(gTowerEDM));
252 gTowersContainer->back()->initialize(iEtaFW, iPhiFW, Eta, Phi, TowerEt, Fpga, IsSaturated, gFEXtowerID);
254 output_gTower_energies[iPhiFW][iEtaFW - 32 + 6] = tmpTower->
getET();
255 output_gTower50_energies[iPhiFW][iEtaFW - 32 + 6] = is_mc ? tmpTower50->
getET() * 4. : tmpTower50->
getET();
256 output_saturation[iPhiFW][iEtaFW - 32 + 6] = tmpTower->
isSaturated();
268 int rows = twrs.size();
269 int cols = twrs[0].size();
270 for (
int irow = 0; irow < rows; irow++)
272 for (
int jcolumn = 0; jcolumn < cols; jcolumn++)
274 twrs[irow][jcolumn] = twrs[irow][jcolumn] + offsets[irow][jcolumn];
275 calLookup(&twrs[irow][jcolumn], offsets[irow][jcolumn], noiseCuts[irow][jcolumn], slopes[irow][jcolumn]);
282 int address = *tower;
286 ATH_MSG_DEBUG(
"gTower lookup address out of range " << address);
291 ATH_MSG_DEBUG(
"gTower lookup address out of range " << address);
296 if ((address - offset) < noiseCut)
299 int calTower = ((calib * address + 511) >> 10) - ((calib * offset + 511) >> 10);
301 if (calTower < -2048)
305 if (address == 2047) calTower = 2047;
313 int rows = offsets.size();
314 int cols = offsets[0].size();
315 for (
int irow = 0; irow < rows; irow++)
317 for (
int jcolumn = 0; jcolumn < cols; jcolumn++)
319 offsets[irow][jcolumn] = offset;
320 noiseCuts[irow][jcolumn] = columnNoiseCuts[jcolumn];
321 slopes[irow][jcolumn] = columnSlopes[jcolumn];
#define ATH_CHECK
Evaluate an expression and check for errors.
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
virtual void FillgTowerEDMForward(SG::WriteHandle< xAOD::gFexTowerContainer > &, gTowersForward &, gTowersForward &, gTowersType &, gTowersType &, gTowersType &) override
SG::ReadCondHandleKey< gFEXDBCondData > m_DBToolKey
Internal data.
gTowersType m_slopesDefaultB
gTowersType m_noiseCutsDefaultC
gTowersType m_offsetsDefaultB
SG::ReadHandleKey< LVL1::gTowerContainer > m_gFEXFPGA_gTowerContainerKey
void calLookup(int *tower, const int offset, const int noiseCut, const int slope) const
gTowersType m_noiseCutsDefaultA
virtual void FillgTowerEDMCentral(SG::WriteHandle< xAOD::gFexTowerContainer > &, gTowersCentral &, gTowersType &, gTowersType &, gTowersType &) override
virtual StatusCode initialize() override
standard Athena-Algorithm method
virtual ~gFEXFPGA()
Destructor.
SG::ReadHandleKey< LVL1::gTowerContainer > m_gFEXFPGA_gTower50ContainerKey
virtual void reset() override
void calExpand(gTowersType &offsets, gTowersType &noiseCuts, gTowersType &slopes, const int offset, const std::array< int, 12 > &columnNoiseCuts, const std::array< int, 12 > &columnSlopes) const
gTowersType m_slopesDefaultC
gTowersType m_offsetsDefaultC
gTowersType m_slopesDefaultA
virtual StatusCode init(int id) override
gFEXFPGA(const std::string &type, const std::string &name, const IInterface *parent)
Constructors.
gTowersType m_offsetsDefaultA
void gtCalib(gTowersType &twrs, const gTowersType &offsets, const gTowersType &noiseCuts, const gTowersType &slopes) const
gTowersType m_noiseCutsDefaultB
The gTower class is an interface object for gFEX trigger algorithms The purposes are twofold:
int getFWID(int &iPhiFW, int &iEtaFW) const
Calculates and returns the firmware ID, as well as iPhi and iEta in FT/global scheme.
char isSaturated() const
Returns true if is saturated.
int getET() const
Get ET (total) in MeV.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
std::array< std::array< int, 8 >, 32 > gTowersForward
std::array< std::array< int, 12 >, 32 > gTowersCentral
std::array< std::array< int, 12 >, 32 > gTowersType
gFexTower_v1 gFexTower
Define the latest version of the TriggerTower class.