CMS 3D CMS Logo

Stage2TowerDecompressAlgorithmFirmwareImp1.cc
Go to the documentation of this file.
1 
10 //#include "DataFormats/Math/interface/LorentzVector.h "
11 
13 
15  params_(params)
16 {
17 
18 }
19 
20 
22 
23 
24 }
25 
26 
27 void l1t::Stage2TowerDecompressAlgorithmFirmwareImp1::processEvent(const std::vector<l1t::CaloTower> & inTowers,
28  std::vector<l1t::CaloTower> & outTowers) {
29 
30 
31  for ( auto tow = inTowers.begin();
32  tow != inTowers.end();
33  ++tow ) {
34 
35  if (!params_->doTowerEncoding()) {
36 
37  outTowers.push_back( *tow );
38 
39  }
40 
41  else {
42 
43 
44  int sum = tow->hwPt();
45  int ratio = tow->hwEtRatio();
46  int qual = tow->hwQual();
47 
48  int denomCoeff = int ( ( 128./ ( 1. + pow(2,ratio) ) ) + 0.5 );
49  int numCoeff = 128 - denomCoeff;
50 
51  // if ((qual & 0x1)==0) {
52  // switch (ratio) {
53  // case 000 :
54  // numCoeff = 64;
55  // denomCoeff = 64;
56  // break;
57  // case 001 :
58  // numCoeff = 43;
59  // denomCoeff = 85;
60  // break;
61  // case 010 :
62  // numCoeff = 26;
63  // denomCoeff = 102;
64  // break;
65  // case 011 :
66  // numCoeff = 14;
67  // denomCoeff = 114;
68  // break;
69  // case 100 :
70  // numCoeff = 8;
71  // denomCoeff = 120;
72  // break;
73  // case 101 :
74  // numCoeff = 4;
75  // denomCoeff = 124;
76  // break;
77  // case 110 :
78  // numCoeff = 2;
79  // denomCoeff = 126;
80  // break;
81  // case 111 :
82  // numCoeff = 1;
83  // denomCoeff = 127;
84  // break;
85  // }
86  // }
87  // else {
88  // numCoeff = 128;
89  // denomCoeff = 0;
90  // }
91 
92  int em = 0;
93  int had = 0;
94 
95  bool denomZeroFlag = ((qual&0x1) > 0);
96  bool eOverHFlag = ((qual&0x2) > 0);
97 
98  if (denomZeroFlag && !eOverHFlag) had = sum;
99 
100  if (denomZeroFlag && eOverHFlag) em = sum;
101 
102  if (!denomZeroFlag && !eOverHFlag) { // H > E, ratio = log(H/E)
103  em = (denomCoeff * sum) >> 7;
104  had = (numCoeff * sum) >> 7;
105  }
106 
107  if (!denomZeroFlag && eOverHFlag) { // E >= H , so ratio==log(E/H)
108  em = (numCoeff * sum) >> 7;
109  had = (denomCoeff * sum) >> 7;
110  }
111 
112  em &= params_->towerMaskE();
113  had &= params_->towerMaskH();
114 
115  l1t::CaloTower newTow;
116  newTow.setHwEta( tow->hwEta() );
117  newTow.setHwPhi( tow->hwPhi() );
118  newTow.setHwEtEm( em );
119  newTow.setHwEtHad( had );
120 
121  newTow.setHwPt( sum );
122  newTow.setHwEtRatio( ratio );
123  newTow.setHwQual( qual );
124 
125  outTowers.push_back(newTow);
126 
127  }
128 
129  }
130 
131 }
bool doTowerEncoding() const
void setHwQual(int qual)
Definition: L1Candidate.h:44
void setHwEtHad(int et)
Definition: CaloTower.cc:44
void processEvent(const std::vector< l1t::CaloTower > &inTowers, std::vector< l1t::CaloTower > &outTowers) override
void setHwEtRatio(int ratio)
Definition: CaloTower.cc:49
void setHwPhi(int phi)
Definition: L1Candidate.h:43
void setHwPt(int pt)
Definition: L1Candidate.h:41
void setHwEta(int eta)
Definition: L1Candidate.h:42
void setHwEtEm(int et)
Definition: CaloTower.cc:39
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40