CMS 3D CMS Logo

UCTTower.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <iomanip>
3 #include <string>
4 #include <vector>
5 #include <math.h>
6 #include <stdlib.h>
7 #include <stdint.h>
8 
9 #include "UCTTower.hh"
10 #include "UCTLogging.hh"
11 
12 using namespace l1tcalo;
13 
14 bool UCTTower::process() {
15  if(region >= NRegionsInCard) {
16  return processHFTower();
17  }
18  if(ecalET > etInputMax) ecalET = etInputMax;
19  if(hcalET > etInputMax) hcalET = etInputMax;
20  uint32_t calibratedECALET = ecalET;
21  uint32_t logECALET = (uint32_t) log2((double) ecalET);
22  if(logECALET > erMaxV) logECALET = erMaxV;
23  if(ecalLUT != 0) {
24  uint32_t etaAddress = region * NEtaInRegion + iEta;
25  uint32_t fbAddress = 0;
26  if(ecalFG) fbAddress = 1;
27  uint32_t value = (*ecalLUT)[etaAddress][fbAddress][ecalET];
28  calibratedECALET = value & etInputMax;
29  logECALET = (value & 0x7000) >> 12;
30  }
31  uint32_t calibratedHCALET = hcalET;
32  uint32_t logHCALET = (uint32_t) log2((double) hcalET);
33  if(logHCALET > erMaxV) logHCALET = erMaxV;
34  if(hcalLUT != 0) {
35  uint32_t etaAddress = region * NEtaInRegion + iEta;
36  uint32_t fbAddress = 0;
37  if((hcalFB & 0x1) != 0) fbAddress = 1;
38  uint32_t value = (*hcalLUT)[etaAddress][fbAddress][hcalET];
39  calibratedHCALET = value & etInputMax;
40  logHCALET = (value & 0x7000) >> 12;
41  }
42 
43  // Saturation codes implemented in fwVersion 1
44  if(fwVersion >= 1) {
45  if(calibratedECALET==0xFF && calibratedHCALET==0xFF)
46  towerData = 0x1FF;
47  else if(calibratedECALET==0xFF)
48  towerData = 0x1FE;
49  else if(calibratedHCALET==0xFF)
50  towerData = 0x1FD;
51  else
52  towerData = calibratedECALET + calibratedHCALET;
53  } else {
54  towerData = calibratedECALET + calibratedHCALET;
55  }
56 
57  if(towerData > etMask) towerData = etMask;
58  uint32_t er = 0;
59  if(calibratedECALET == 0 || calibratedHCALET == 0) {
60  er = 0;
61  towerData |= zeroFlagMask;
62  if(calibratedHCALET == 0 && calibratedECALET != 0)
63  towerData |= eohrFlagMask;
64  }
65  else if(calibratedECALET == calibratedHCALET) {
66  er = 0;
67  towerData |= eohrFlagMask;
68  }
69  else if(calibratedECALET > calibratedHCALET) {
70  er = logECALET - logHCALET;
71  if(er > erMaxV) er = erMaxV;
72  towerData |= eohrFlagMask;
73  }
74  else {
75  er = logHCALET - logECALET;
76  if(er > erMaxV) er = erMaxV;
77  }
78  towerData |= (er << erShift);
79  // Unfortunately, hcalFlag is presently bogus :(
80  // It has never been studied nor used in Run-1
81  // The same status persists in Run-2, but it is available usage
82  // Currently, summarize all hcalFeatureBits in one flag bit
83  if((hcalFB & 0x1) != 0) towerData |= hcalFlagMask; // FIXME - ignore top bits if(hcalFB != 0)
84  if(ecalFG) towerData |= ecalFlagMask;
85  // Store ecal and hcal calibrated ET in unused upper bits
86  towerData |= (calibratedECALET << ecalShift);
87  towerData |= (calibratedHCALET << hcalShift);
88  // All done!
89  return true;
90 }
91 
92 bool UCTTower::processHFTower() {
93  uint32_t calibratedET = hcalET;
94  if(hfLUT != 0) {
95  uint32_t etaAddress = (region - NRegionsInCard) * NHFEtaInRegion + iEta;
96  const std::array< uint32_t, 256> a = hfLUT->at(etaAddress);
97  calibratedET = a[hcalET] & 0xFF;
98  }
99  uint32_t absCaloEta = abs(caloEta());
100  if(absCaloEta > 29 && absCaloEta < 40) {
101  // Divide by two (since two duplicate towers are sent)
102  calibratedET /= 2;
103  }
104  else if(absCaloEta == 40 || absCaloEta == 41) {
105  // Divide by four
106  calibratedET /= 4;
107  }
108  towerData = calibratedET | zeroFlagMask;
109  if((hcalFB & 0x1) == 0x1) towerData |= ecalFlagMask; // LSB defines short over long fiber ratio
110  if((hcalFB & 0x2) == 0x2) towerData |= hcalFlagMask; // MSB defines minbias flag
111  return true;
112 }
113 
114 bool UCTTower::setECALData(bool eFG, uint32_t eET) {
115  ecalFG = eFG;
116  ecalET = eET;
117  if(eET > etInputMax) {
118  LOG_ERROR << "UCTTower::setData - ecalET too high " << eET << "; Pegged to etInputMax" << std::endl;
119  ecalET = etInputMax;
120  }
121  return true;
122 }
123 
124 bool UCTTower::setHCALData(uint32_t hFB, uint32_t hET) {
125  hcalET = hET;
126  hcalFB = hFB;
127  if(hET > etInputMax) {
128  LOG_ERROR << "UCTTower::setData - hcalET too high " << hET << "; Pegged to etInputMax" << std::endl;
129  hcalET = etInputMax;
130  }
131  if(hFB > 0x3F) {
132  LOG_ERROR << "UCTTower::setData - too many hcalFeatureBits " << std::hex << hFB
133  << "; Used only bottom 6 bits" << std::endl;
134  hcalFB &= 0x3F;
135  }
136  return true;
137 }
138 
139 bool UCTTower::setHFData(uint32_t fbIn, uint32_t etIn) {
140  ecalFG = false; // HF has no separate ecal section
141  ecalET = 0;
142  hcalET = etIn; // We reuse HCAL place as HF
143  hcalFB = fbIn;
144  if(etIn > etInputMax) {
145  LOG_ERROR << "UCTTower::setData - HF ET too high " << etIn << "; Pegged to etInputMax" << std::endl;
146  hcalET = etInputMax;
147  }
148  if(fbIn > 0x3) {
149  LOG_ERROR << "UCTTower::setData - too many HF FeatureBits " << std::hex << fbIn
150  << "; Used only bottom 2 bits" << std::endl;
151  hcalFB &= 0x3;
152  }
153  return true;
154 }
155 
156 const uint16_t UCTTower::location() const {
157  uint16_t l = 0;
158  if(negativeEta) l = 0x8000; // Used top bit for +/- eta-side
159  l |= iPhi; // Max iPhi is 4, so bottom 2 bits for iPhi
160  l |= (iEta << 2); // Max iEta is 4, so 2 bits needed
161  l |= (region << 4); // Max region number 14, so 4 bits needed
162  l |= (card << 8); // Max card number is 6, so 3 bits needed
163  l |= (crate << 11); // Max crate number is 2, so 2 bits needed
164  return l;
165 }
166 
167 UCTTower::UCTTower(uint16_t location, int fwv) :
168  fwVersion(fwv) {
169  if((location & 0x8000) != 0) negativeEta = true;
170  crate = (location & 0x1800) >> 11;
171  card = (location & 0x0700) >> 8;
172  region = (location & 0x00F0) >> 4;
173  iEta = (location & 0x000C) >> 2;
174  iPhi = (location & 0x0003);
175  towerData = 0;
176 }
177 
178 const uint64_t UCTTower::extendedData() const {
179  uint64_t d = rawData();
180  uint64_t l = location();
181  uint64_t r = (l << 48) + d;
182  return r;
183 }
184 
185 std::ostream& operator<<(std::ostream& os, const UCTTower& t) {
186  // if((t.ecalET + t.hcalET) == 0) return os;
187 
188  os << "Side Crt Crd Rgn iEta iPhi cEta cPhi eET eFG hET hFB Summary" << std::endl;
189 
190  UCTGeometry g;
191  std::string side = "+eta ";
192  if(t.negativeEta) side = "-eta ";
193  os << side
194  << std::showbase << std::internal << std::setfill('0') << std::setw(4) << std::hex
195  << t.crate << " "
196  << std::showbase << std::internal << std::setfill('0') << std::setw(4) << std::hex
197  << t.card << " "
198  << std::showbase << std::internal << std::setfill('0') << std::setw(4) << std::hex
199  << t.region << " "
200  << std::showbase << std::internal << std::setfill('0') << std::setw(4) << std::hex
201  << t.iEta << " "
202  << std::showbase << std::internal << std::setfill('0') << std::setw(4) << std::hex
203  << t.iPhi << " "
204  << std::setw(4) << std::setfill(' ') << std::dec
205  << g.getCaloEtaIndex(t.negativeEta, t.region, t.iEta) << " "
206  << std::setw(4) << std::setfill(' ') << std::dec
207  << g.getCaloPhiIndex(t.crate, t.card, t.region, t.iPhi) << " "
208  << std::showbase << std::internal << std::setfill('0') << std::setw(4) << std::hex
209  << t.ecalET << " "
210  << std::showbase << std::internal << std::setfill('0') << std::setw(4) << std::hex
211  << t.ecalFG << " "
212  << std::showbase << std::internal << std::setfill('0') << std::setw(4) << std::hex
213  << t.hcalET << " "
214  << std::showbase << std::internal << std::setfill('0') << std::setw(4) << std::hex
215  << t.hcalFB << " "
216  << std::showbase << std::internal << std::setfill('0') << std::setw(10) << std::hex
217  << t.towerData
218  << std::endl;
219  return os;
220 
221 }
std::ostream & operator<<(std::ostream &os, const UCTTower &t)
Definition: UCTTower.cc:185
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Definition: value.py:1
unsigned long long uint64_t
Definition: Time.h:15
double a
Definition: hdecay.h:121
#define LOG_ERROR
Definition: CSCDQM_Logger.h:41