CMS 3D CMS Logo

Stage2Layer2EtSumAlgorithmFirmwareImp1.cc
Go to the documentation of this file.
1 
8 
12 #include <cmath>
13 
14 
16  params_(params)
17 {
18 
19  // Add some LogDebug for these settings
24 
27 }
28 
29 
30 void l1t::Stage2Layer2EtSumAlgorithmFirmwareImp1::processEvent(const std::vector<l1t::CaloTower> & towers,
31  std::vector<l1t::EtSum> & etsums) {
32 
33  unsigned int ntowers(0);
35 
36  int nTT4 = CaloTools::calNrTowers(-1*params_->egPUSParam(1),
37  params_->egPUSParam(1),
38  1,72,towers,1+params_->pileUpTowerThreshold(),999,CaloTools::CALO);
39  if(nTT4 > 255) nTT4 = 255;
40  unsigned int compNTT4 = params_->egCompressShapesLUT()->data((0x1<<7)+(0x1<<8)+(0x1<<5)+nTT4);
41 
42 
43  // etaSide=1 is positive eta, etaSide=-1 is negative eta
44  for (int etaSide=1; etaSide>=-1; etaSide-=2) {
45 
46  int ex(0), ey(0), et(0);
47  int exHF(0), eyHF(0), etHF(0);
48  int etem(0);
49  unsigned int mb0(0), mb1(0);
50 
51  bool ettSat(false), ettHFSat(false), ecalEtSat(false), metSat(false), metHFSat(false);
52 
53  for (unsigned absieta=1; absieta<=(unsigned int)CaloTools::mpEta(CaloTools::kHFEnd); absieta++) {
54 
55  int ieta = etaSide * absieta;
56 
57  towEtMetThresh_ = 0;
60 
61  if(!params_->etSumBypassMetPUS()){
62  if(params_->etSumMetPUSType() == "LUT"){
63  unsigned int towEtMetLUTAddr = (compNTT4<<6) | (abs(ieta));
64  if(abs(ieta)<13) towEtMetLUTAddr = abs(ieta);
65  towEtMetThresh_ = params_->etSumMetPUSLUT()->data(towEtMetLUTAddr);
66  } else {
67  if(params_->etSumMetPUSType() != "None" && params_->etSumMetPUSType() != "none") {
68  edm::LogError("l1t|stage 2") << "Invalid PUS type in calo params. Not applying PUS to Stage 2 MET" << std::endl;
69  return;
70  }
71  }
72  }
73 
74  if(!params_->etSumBypassEttPUS()){
75  if(params_->etSumEttPUSType() == "LUT"){
76  unsigned int towEtSumEtLUTAddr = (compNTT4<<6) | (abs(ieta));
77  if(abs(ieta)<13) towEtSumEtLUTAddr = abs(ieta);
78  towEtSumEtThresh_ = params_->etSumEttPUSLUT()->data(towEtSumEtLUTAddr);
79  } else {
80  if(params_->etSumEttPUSType() != "None" && params_->etSumEttPUSType() != "none") {
81  edm::LogError("l1t|stage 2") << "Invalid PUS type in calo params. Not applying PUS to Stage 2 ETT" << std::endl;
82  return;
83  }
84  }
85  }
86 
88  if(params_->etSumEcalSumPUSType() == "LUT"){
89  unsigned int towEtEcalSumLUTAddr = (compNTT4<<6) | (abs(ieta));
90  if(abs(ieta)<13) towEtEcalSumLUTAddr = abs(ieta);
91  towEtEcalSumThresh_ = params_->etSumEcalSumPUSLUT()->data(towEtEcalSumLUTAddr);
92  } else {
93  if(params_->etSumEcalSumPUSType() != "None" && params_->etSumEcalSumPUSType() != "none") {
94  edm::LogError("l1t|stage 2") << "Invalid PUS type in calo params. Not applying PUS to Stage 2 Ecal ETT" << std::endl;
95  return;
96  }
97  }
98  }
99 
100  int ringEx(0), ringEy(0), ringEt(0);
101  int ringExHF(0), ringEyHF(0), ringEtHF(0);
102  int ringEtEm(0);
103  unsigned int ringMB0(0), ringMB1(0);
104  unsigned int ringNtowers(0);
105 
106  for (int iphi=1; iphi<=CaloTools::kHBHENrPhi; iphi++) {
107 
108  l1t::CaloTower tower = l1t::CaloTools::getTower(towers, CaloTools::caloEta(ieta), iphi);
109 
110 
111  // MET without HF
112 
113  if (tower.hwPt()>towEtMetThresh_ && CaloTools::mpEta(abs(tower.hwEta()))<=CaloTools::mpEta(metEtaMax_) && !metSat) {
114 
115  // x- and -y coefficients are truncated by after multiplication of Et by trig coefficient.
116  // The trig coefficients themselves take values [-1023,1023] and so were scaled by
117  // 2^10 = 1024, which requires bitwise shift to the right of the final value by 10 bits.
118  // This is accounted for at ouput of demux (see Stage2Layer2DemuxSumsAlgoFirmwareImp1.cc)
119  if(tower.hwPt() == CaloTools::kSatHcal || tower.hwPt() == CaloTools::kSatEcal || tower.hwPt() == CaloTools::kSatTower) metSat=true;
120  ringEx += (int) (tower.hwPt() * CaloTools::cos_coeff[iphi - 1] );
121  ringEy += (int) (tower.hwPt() * CaloTools::sin_coeff[iphi - 1] );
122  }
123 
124  // MET *with* HF
125  if (tower.hwPt()>towEtMetThresh_ && CaloTools::mpEta(abs(tower.hwEta()))<=CaloTools::mpEta(metEtaMaxHF_) && !metHFSat) {
126  if(tower.hwPt() == CaloTools::kSatHcal || tower.hwPt() == CaloTools::kSatEcal || tower.hwPt() == CaloTools::kSatTower) metHFSat=true;
127  ringExHF += (int) (tower.hwPt() * CaloTools::cos_coeff[iphi - 1] );
128  ringEyHF += (int) (tower.hwPt() * CaloTools::sin_coeff[iphi - 1] );
129  }
130 
131  // scalar sum
132  if (tower.hwPt()>towEtSumEtThresh_ && CaloTools::mpEta(abs(tower.hwEta()))<=CaloTools::mpEta(ettEtaMax_) && !ettSat){
133  if(tower.hwPt() == CaloTools::kSatHcal || tower.hwPt() == CaloTools::kSatEcal || tower.hwPt() == CaloTools::kSatTower) ettSat=true;
134  ringEt += tower.hwPt();
135  }
136 
137  // scalar sum including HF
138  if (tower.hwPt()>towEtSumEtThresh_ && CaloTools::mpEta(abs(tower.hwEta()))<=CaloTools::mpEta(ettEtaMaxHF_) && !ettHFSat) {
139  if(tower.hwPt() == CaloTools::kSatHcal || tower.hwPt() == CaloTools::kSatEcal || tower.hwPt() == CaloTools::kSatTower) ettHFSat=true;
140  ringEtHF += tower.hwPt();
141  }
142 
143  // scalar sum (EM)
144  if (tower.hwPt()>towEtEcalSumThresh_ && CaloTools::mpEta(abs(tower.hwEta()))<=CaloTools::mpEta(ettEtaMax_) && !ecalEtSat){
145  if(tower.hwPt() == CaloTools::kSatEcal || tower.hwPt() == CaloTools::kSatTower) ecalEtSat=true;
146  ringEtEm += tower.hwEtEm();
147  }
148 
149  // count HF tower HCAL flags
152  (tower.hwQual() & 0x4) > 0)
153  ringMB0 += 1;
156  (tower.hwQual() & 0x8) > 0)
157  ringMB1 += 1;
158 
159  // tower counting
160  if (tower.hwPt()>nTowThresholdHw_ && CaloTools::mpEta(abs(tower.hwEta()))<=nTowEtaMax_)
161  ringNtowers += 1;
162  }
163 
164  ex += ringEx;
165  ey += ringEy;
166  et += ringEt;
167  etHF += ringEtHF;
168  exHF += ringExHF;
169  eyHF += ringEyHF;
170 
171  etem += ringEtEm;
172 
173  mb0 += ringMB0;
174  mb1 += ringMB1;
175 
176  ntowers += ringNtowers;
177  }
178 
179  if (mb0>0xf) mb0 = 0xf;
180  if (mb1>0xf) mb1 = 0xf;
181 
182 
183  // saturate energy sums if saturated TP/tower
184 
185  if(ecalEtSat || etem > 0xffff) etem = 0xffff;
186  if(ettSat || et > 0xffff) et = 0xffff;
187  if(ettHFSat || etHF > 0xffff) etHF = 0xffff;
188  if(metSat || ex > 0x7fffffff) ex = 0x7fffffff;
189  if(metSat || ey > 0x7fffffff) ey = 0x7fffffff;
190  if(metHFSat || exHF > 0x7fffffff) exHF = 0x7fffffff;
191  if(metHFSat || eyHF > 0x7fffffff) eyHF = 0x7fffffff;
192 
193  l1t::EtSum etSumTotalEt(p4,l1t::EtSum::EtSumType::kTotalEt,et,0,0,0);
194  l1t::EtSum etSumEx(p4,l1t::EtSum::EtSumType::kTotalEtx,ex,0,0,0);
195  l1t::EtSum etSumEy(p4,l1t::EtSum::EtSumType::kTotalEty,ey,0,0,0);
196 
197  l1t::EtSum etSumTotalEtHF(p4,l1t::EtSum::EtSumType::kTotalEtHF,etHF,0,0,0);
198  l1t::EtSum etSumExHF(p4,l1t::EtSum::EtSumType::kTotalEtxHF,exHF,0,0,0);
199  l1t::EtSum etSumEyHF(p4,l1t::EtSum::EtSumType::kTotalEtyHF,eyHF,0,0,0);
200 
201  l1t::EtSum etSumTotalEtEm(p4,l1t::EtSum::EtSumType::kTotalEtEm,etem,0,0,0);
202 
205  if (etaSide<0) {
208  }
209  l1t::EtSum etSumMinBias0(p4,type0,mb0,0,0,0);
210  l1t::EtSum etSumMinBias1(p4,type1,mb1,0,0,0);
211 
212  etsums.push_back(etSumTotalEt);
213  etsums.push_back(etSumEx);
214  etsums.push_back(etSumEy);
215 
216  etsums.push_back(etSumTotalEtHF);
217  etsums.push_back(etSumExHF);
218  etsums.push_back(etSumEyHF);
219 
220  etsums.push_back(etSumTotalEtEm);
221 
222  etsums.push_back(etSumMinBias0);
223  etsums.push_back(etSumMinBias1);
224 
225  }
226 
227  //tower count is in aux: only on eta- side!!
228  l1t::EtSum etSumNtowers(p4,l1t::EtSum::EtSumType::kTowerCount,ntowers,0,0,0);
229  etsums.push_back(etSumNtowers);
230 
231 }
void processEvent(const std::vector< l1t::CaloTower > &towers, std::vector< l1t::EtSum > &sums) override
static int mpEta(int ieta)
Definition: CaloTools.cc:200
static const int64_t cos_coeff[72]
Definition: CaloTools.h:120
std::string const & etSumEttPUSType() const
double etSumEtThreshold(unsigned isum) const
int hwEtEm() const
Definition: CaloTower.cc:64
static const int64_t sin_coeff[72]
Definition: CaloTools.h:121
static const int kSatHcal
Definition: CaloTools.h:53
int etSumEtaMax(unsigned isum) const
std::string const & etSumEcalSumPUSType() const
static const int kHFBegin
Definition: CaloTools.h:40
unsigned etSumBypassEttPUS() const
l1t::LUT * egCompressShapesLUT()
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
unsigned etSumBypassMetPUS() const
std::string const & etSumMetPUSType() const
static size_t calNrTowers(int iEtaMin, int iEtaMax, int iPhiMin, int iPhiMax, const std::vector< l1t::CaloTower > &towers, int minHwEt, int maxHwEt, SubDet etMode=CALO)
Definition: CaloTools.cc:139
double p4[4]
Definition: TauolaWrapper.h:92
static const int kHFEnd
Definition: CaloTools.h:41
int pileUpTowerThreshold() const
static const int kSatTower
Definition: CaloTools.h:55
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int hwEta() const
Definition: L1Candidate.h:49
int hwQual() const
Definition: L1Candidate.h:51
double egPUSParam(int ipar) const
int hwPt() const
Definition: L1Candidate.h:48
static const int kHBHENrPhi
Definition: CaloTools.h:44
unsigned etSumBypassEcalSumPUS() const
et
define resolution functions of each parameter
static int caloEta(int ietaMP)
Definition: CaloTools.cc:210
static const l1t::CaloTower & getTower(const std::vector< l1t::CaloTower > &towers, int iEta, int iPhi)
Definition: CaloTools.cc:37
double towerLsbSum() const
int data(unsigned int address) const
Definition: LUT.h:46
static const int kSatEcal
Definition: CaloTools.h:54
EtSumType
Definition: EtSum.h:25
l1t::LUT * etSumEcalSumPUSLUT()