ATLAS Offline Software
Loading...
Searching...
No Matches
jFEXFormTOBs.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5//***************************************************************************
6// jFEXFormTOBs.cxx
7// -------------------
8// begin : 11 08 2022
9// email : sergi.rodriguez@cern.ch
10// ***************************************************************************/
11
12#include "jFEXFormTOBs.h"
14
15namespace LVL1 {
16
17// default constructor for persistency
18
19jFEXFormTOBs::jFEXFormTOBs(const std::string& type, const std::string& name, const IInterface* parent):
20 AthAlgTool(type, name, parent)
21{
22 declareInterface<IjFEXFormTOBs>(this);
23}
24
27
29{
30 return StatusCode::SUCCESS;
31}
32
33
34uint32_t jFEXFormTOBs::formTauTOB(int jFEX, int iPhi, int iEta, int EtClus, int IsoRing, bool satTau, int Resolution, int ptMinToTopo ) const
35{
36 uint32_t tobWord = 0;
37
38 int eta = iEta-8; // needed to substract 8 to be in the FPGA core area
39 int phi = iPhi-8; // needed to substract 8 to be in the FPGA core area
40 bool sat = satTau;
41
42 // correcting C-side. mirror symmetry
43 if(jFEX == 1 || jFEX == 2){
44 eta = 15 - iEta;
45 }
46 else if(jFEX == 0){
47 eta = 16 - iEta ;
48 }
49
50 unsigned int et = EtClus/Resolution;
51 if (et > 0x7ff) { //0x7ff is 11 bits
52 ATH_MSG_DEBUG("Et saturated: " << et );
53 et = 0x7ff;
54 }
55
56 unsigned int iso = IsoRing/Resolution;
57 if (iso > 0x7ff) iso = 0x7ff; //0x7ff is 11 bits
58
59 //create basic tobword with 32 bits
61
62 ATH_MSG_DEBUG("tobword tau with iso, et, eta and phi: " << std::bitset<32>(tobWord) );
63
64 unsigned int minEtThreshold = ptMinToTopo/Resolution;
65
66 if (et <= minEtThreshold) return 0;
67 else return tobWord;
68
69}
70
71int jFEXFormTOBs::Get_calibrated_SRj_ET(int Energy, int res, const std::vector<int>& calibFactors) const {
72 // This is for data taken before the end of 2023
73 // ET binned calibration factors (in practice all set to the same value)
74 int Et_edge[8] = {20,30,40,50,65,80,110,150};
75 int et_range = -1;
76
77 //checking upper threshold for SRjet energy
78 for(int i=0;i<8; i++){
79 if(Energy < Et_edge[i] * 1e3){
80 et_range = i;
81 break;
82 }
83 }
84
85 //the last threshold is inf therefore, if non of the other thresholds is satisfied, the calibration parameter is set to the maximum
86 if(et_range<0){
87 et_range = 8;
88 }
89
90 int calib = calibFactors[et_range];
91
92 //Converting into 200MeV scale
93 int et_200Mev = std::floor(1.0*Energy/res);
94
95 //Applying the calibration
96 int et = std::floor( (1.0*et_200Mev*calib)/(1<<7) );
97
98 return et;
99}
100
101int jFEXFormTOBs::Get_eta_calibrated_SRj_ET(int Energy, int jfex, unsigned int coreEta, int res, const std::vector<int>& calibFactors) const {
102 // This is for data taken starting from 2024
103 // eta binned calibration factors for improved calibration w.r.t. offline jets
104
105 //checking upper threshold for SRjet energy
106 if (jfex != 0 && jfex != 5) {
107 coreEta = std::min(coreEta,7u); // 8 core eta bins for central modules
108 } else {
109 coreEta = std::min(coreEta,24u); // 25 core eta bins for forward modules
110 }
111
112 int calib = calibFactors[coreEta];
113
114 //Converting into 200MeV scale
115 int et_200Mev = std::floor(1.0*Energy/res);
116
117 //Applying the calibration
118 int et = std::floor( (1.0*et_200Mev*calib)/(1<<7) );
119
120 return et;
121}
122
123
124uint32_t jFEXFormTOBs::formSRJetTOB(int jFEX, int iPhi, int iEta, int EtClus, bool sat, int Resolution, int ptMinToTopo, const std::pair<unsigned int, const std::vector<int>&>& calibParameters ) const {
125 uint32_t tobWord = 0;
126 unsigned int eta = 0;
127 unsigned int phi = 0;
128 unsigned int jFEXSmallRJetTOBEt = 0;
129 int Res = 0; // 11 bits reserved
130 int Sat = sat;
131
132 if(jFEX == 1 || jFEX == 2) {
133
134 eta = 15 - iEta;
135 phi = iPhi - 8;
136 }
137 if(jFEX == 3 || jFEX == 4) {
138
139 eta = iEta - 8;
140 phi = iPhi - 8;
141 }
142 else if(jFEX == 5) {
143
144 eta = iEta - 8;
145 if(iEta < FEXAlgoSpaceDefs::jFEX_algoSpace_A_EMIE_eta) { // ieta lower than EMIE stats -> belong to EMB
146 phi = iPhi - 8;
147 }
148 else if(iEta < FEXAlgoSpaceDefs::jFEX_algoSpace_A_FCAL_start_eta) { // ieta lower than FCAL stats -> belong to EMIE
149 phi = iPhi - 4;
150 }
151 else { // rest ieta belongs to FCAL
152 phi = iPhi - 2;
153 }
154 }
155 else if(jFEX == 0) {
156
157 eta = 36 - iEta;
158 if(iEta < FEXAlgoSpaceDefs::jFEX_algoSpace_C_FCAL_end_eta) { // ieta lower than FCal ends -> FCAL
159 phi = iPhi -2 ;
160 }
161 else if(iEta < FEXAlgoSpaceDefs::jFEX_algoSpace_C_EMIE_end_eta) {// ieta lower than EMIE ends -> EMIE
162 phi = iPhi -4 ;
163 }
164 else {// rest of ieta -> EMB
165 phi = iPhi -8 ;
166 }
167 }
168
169 // Appliying jet calibration
170 if (calibParameters.first > m_jetEtaCalibrationBeginTimestamp || m_isMC) {
171 jFEXSmallRJetTOBEt = Get_eta_calibrated_SRj_ET(EtClus, jFEX, eta, Resolution, calibParameters.second);
172 } else {
173 jFEXSmallRJetTOBEt = Get_calibrated_SRj_ET(EtClus, Resolution, calibParameters.second);
174 }
175
176 if(jFEXSmallRJetTOBEt > 0x7ff) {
177 jFEXSmallRJetTOBEt = 0x7ff;
178 }
179 //create basic tobword with 32 bits
180 tobWord = tobWord + (Res << FEXAlgoSpaceDefs::jJ_resBit) + (jFEXSmallRJetTOBEt << FEXAlgoSpaceDefs::jJ_etBit) + (eta << FEXAlgoSpaceDefs::jJ_etaBit) + (phi << FEXAlgoSpaceDefs::jJ_phiBit) + (Sat);
181 ATH_MSG_DEBUG("tobword smallRJet with res, et, eta and phi: " << std::bitset<32>(tobWord) );
182
183 // retrieving the threshold for the TOB Et
184 unsigned int minEtThreshold = ptMinToTopo/Resolution;
185
186 if (jFEXSmallRJetTOBEt <= minEtThreshold) return 0;
187 else return tobWord;
188}
189
190
191
192uint32_t jFEXFormTOBs::formLRJetTOB(int jFEX, int iPhi, int iEta, int EtClus, bool sat, int Resolution, int ptMinToTopo ) const {
193
194 uint32_t tobWord = 0;
195 unsigned int eta = 0;
196 unsigned int phi = 0;
197 unsigned int jFEXLargeRJetTOBEt = 0;
198 int Res = 0; // 9 bits reserved
199 int Sat = sat;
200
201 if(jFEX == 1 || jFEX == 2) {
202
203 eta = 15 - iEta;
204 phi = iPhi - 8;
205 }
206 if(jFEX == 3 || jFEX == 4) {
207
208 eta = iEta - 8;
209 phi = iPhi - 8;
210 }
211 else if(jFEX == 5) {
212 eta = iEta -8;
213
214 if(iEta < FEXAlgoSpaceDefs::jFEX_algoSpace_A_EMIE_eta) { // iEta lower than EMIE stats -> belong to EMB
215 phi = iPhi-8;
216 }
217 else if(iEta < FEXAlgoSpaceDefs::jFEX_algoSpace_A_FCAL_start_eta) { // iEta lower than FCAL stats -> belong to EMIE
218 phi = iPhi -4;
219 }
220 else { // rest iEta belongs to FCAL
221 phi = iPhi -2;
222 }
223 }
224 else if(jFEX == 0) {
225 eta = 36 - iEta;
226
227 if(iEta < FEXAlgoSpaceDefs::jFEX_algoSpace_C_FCAL_end_eta) { // iEta lower than FCal ends -> FCAL
228 phi = iPhi -2 ;
229 }
230 else if(iEta < FEXAlgoSpaceDefs::jFEX_algoSpace_C_EMIE_end_eta) {// iEta lower than EMIE ends -> EMIE
231 phi = iPhi -4 ;
232 }
233 else {// rest of iEta -> EMB
234 phi = iPhi -8 ;
235 }
236 }
237
238 jFEXLargeRJetTOBEt = EtClus/Resolution;
239 if (jFEXLargeRJetTOBEt > 0x1fff) {
240 jFEXLargeRJetTOBEt = 0x1fff; //0x1fff is 13 bits
241 }
242 //create basic tobword with 32 bits
243 tobWord = tobWord + (Res << FEXAlgoSpaceDefs::jLJ_resBit) + (jFEXLargeRJetTOBEt << FEXAlgoSpaceDefs::jLJ_etBit) + (eta << FEXAlgoSpaceDefs::jLJ_etaBit) + (phi << FEXAlgoSpaceDefs::jLJ_phiBit) + (Sat);
244 ATH_MSG_DEBUG("tobword largeRJet with res, et, eta, phi: " << std::bitset<32>(tobWord) );
245
246
247 unsigned int minEtThreshold = ptMinToTopo/Resolution;
248
249 if (jFEXLargeRJetTOBEt <= minEtThreshold) return 0;
250 else return tobWord;
251}
252
253
254uint32_t jFEXFormTOBs::formSumETTOB(std::tuple<int,bool> & ETlow, std::tuple<int,bool> & EThigh, int Resolution ) const
255{
256 uint32_t tobWord = 0;
257
258 bool satlow = std::get<1>(ETlow);
259 bool sathigh = std::get<1>(EThigh);
260
261 unsigned int etlow = std::get<0>(ETlow)/Resolution;
262 if (etlow > 0x7fff) { //0x7fff is 15 bits
263 ATH_MSG_DEBUG("sumEtlow saturated: " << etlow );
264 etlow = 0x7fff;
265 }
266
267 unsigned int ethigh = std::get<0>(EThigh)/Resolution;
268 if (ethigh > 0x7fff) { //0x7fff is 15 bits
269 ATH_MSG_DEBUG("sumEthigh saturated: " << ethigh );
270 ethigh = 0x7fff;
271 }
272
273 //create basic tobword with 32 bits
275 ATH_MSG_DEBUG("tobword SumET with Sathigh, EThigh, ETlow and Satlow : " << std::bitset<32>(tobWord) );
276
277 return tobWord;
278
279}
280
281
282uint32_t jFEXFormTOBs::formMetTOB(int METX, int METY, bool sat, int Resolution ) const {
283 uint32_t tobWord = 0;
284
285 bool Sat = sat;
286 unsigned int res = 0;
287
288 int metX = std::floor(1.0*METX/Resolution);
289 int metY = std::floor(1.0*METY/Resolution);
290
291 //0x7fff is 15 bits (decimal value 32767), however as MET is a signed value (can be negative) only 14 bits are allowed (16383) the MSB is the sign
292 if (std::abs(metX) > 0x3fff) {
293 ATH_MSG_DEBUG("sumEtlow saturated: " << metX );
294 if (metX < 0) {
295 metX = 0x4000; //most negative value for 15b signed two's complement
296 } else {
297 metX = 0x3fff;
298 }
299 }
300
301
302 if (std::abs(metY) > 0x3fff) { //0x7fff is 15 bits (decimal value 32767), however as MET is a signed value (can be negative) only 14 bits are allowed (16383)
303 ATH_MSG_DEBUG("sumEthigh saturated: " << metY );
304 if (metY < 0) {
305 metY = 0x4000; //most negative value for 15b signed two's complement
306 } else {
307 metY = 0x3fff;
308 }
309 }
310
311 //create basic tobword with 32 bits
312 //note that the bit-wise and with the 15bit mask (0x7fff) inherently accounts for the conversion of negative values from 32b signed (int) to 15b signed
313 tobWord = tobWord + (res << FEXAlgoSpaceDefs::jXE_ResBit) + ((metY & 0x7fff) << FEXAlgoSpaceDefs::jXE_Ey_Bit) + ((metX & 0x7fff) << FEXAlgoSpaceDefs::jXE_Ex_Bit) + (Sat << FEXAlgoSpaceDefs::jXE_SatBit) ;
314 ATH_MSG_DEBUG("tobword MET with Res, MET_Y, MET_X, Sat: " << std::bitset<32>(tobWord) );
315
316 return tobWord;
317
318}
319
320
321
322} // end of namespace bracket
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_DEBUG(x)
std::pair< std::vector< unsigned int >, bool > res
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
static constexpr int jTE_Et_upperBit
static constexpr int jTE_Sat_upperBit
static constexpr int jFEX_algoSpace_C_FCAL_end_eta
static constexpr int jJ_phiBit
static constexpr int jLJ_phiBit
static constexpr int jFEX_algoSpace_A_FCAL_start_eta
static constexpr int jTE_Et_lowerBit
static constexpr int jFEX_algoSpace_A_EMIE_eta
static constexpr int jLJ_etaBit
static constexpr int jTau_phiBit
static constexpr int jLJ_etBit
static constexpr int jXE_ResBit
static constexpr int jJ_etBit
static constexpr int jXE_SatBit
static constexpr int jLJ_resBit
static constexpr int jJ_resBit
static constexpr int jTE_Sat_lowerBit
static constexpr int jJ_etaBit
static constexpr int jTau_etaBit
static constexpr int jXE_Ey_Bit
static constexpr int jTau_etBit
static constexpr int jTau_isoBit
static constexpr int jXE_Ex_Bit
static constexpr int jFEX_algoSpace_C_EMIE_end_eta
virtual StatusCode initialize() override
standard Athena-Algorithm method
jFEXFormTOBs(const std::string &type, const std::string &name, const IInterface *parent)
Constructors.
Gaudi::Property< bool > m_isMC
Internal data.
int Get_calibrated_SRj_ET(int, int, const std::vector< int > &) const
int Get_eta_calibrated_SRj_ET(int, int, unsigned int, int, const std::vector< int > &) const
virtual uint32_t formSRJetTOB(int, int, int, int, bool, int, int, const std::pair< unsigned int, const std::vector< int > & > &) const override
virtual uint32_t formTauTOB(int, int, int, int, int, bool, int, int) const override
virtual uint32_t formSumETTOB(std::tuple< int, bool > &, std::tuple< int, bool > &, int) const override
virtual uint32_t formMetTOB(int, int, bool, int) const override
virtual uint32_t formLRJetTOB(int, int, int, int, bool, int, int) const override
virtual ~jFEXFormTOBs()
Destructor.
UnsignedIntegerProperty m_jetEtaCalibrationBeginTimestamp
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
Extra patterns decribing particle interation process.