24 #include "L1TCaloLayer1FetchLUTs.hh"
25 #include "UCTLogging.hh"
28 std::vector< std::vector< std::vector < uint32_t > > > &eLUT,
29 std::vector< std::vector< std::vector < uint32_t > > > &hLUT,
30 std::vector< std::vector< uint32_t > > &hfLUT,
41 edm::LogError(
"L1TCaloLayer1FetchLUTs") <<
"Using Stage2-Layer1 but HCAL Geometry has use1x1 = 0! HF will be suppressed. Check Global Tag, etc.";
49 edm::LogError(
"L1TCaloLayer1FetchLUTs") <<
"Missing CaloParams object! Check Global Tag, etc.";
56 if ( caloLSB != 0.5 ) {
58 edm::LogError(
"L1TCaloLayer1FetchLUTs") <<
"caloLSB (caloParams.towerLsbSum()) != 0.5, actually = " << caloLSB;
65 auto ecalScaleETBins =
caloParams.layer1ECalScaleETBins();
66 auto ecalSF =
caloParams.layer1ECalScaleFactors();
67 if ( ecalSF.size() != ecalScaleETBins.size()*28 ) {
68 edm::LogError(
"L1TCaloLayer1FetchLUTs") <<
"caloParams.layer1ECalScaleFactors().size() != caloParams.layer1ECalScaleETBins().size()*28 !!";
71 auto hcalScaleETBins =
caloParams.layer1HCalScaleETBins();
72 auto hcalSF =
caloParams.layer1HCalScaleFactors();
73 if ( hcalSF.size() != hcalScaleETBins.size()*28 ) {
74 edm::LogError(
"L1TCaloLayer1FetchLUTs") <<
"caloParams.layer1HCalScaleFactors().size() != caloParams.layer1HCalScaleETBins().size()*28 !!";
82 auto hfScaleETBins =
caloParams.layer1HFScaleETBins();
84 if ( hfSF.size() != hfScaleETBins.size()*12 ) {
85 edm::LogError(
"L1TCaloLayer1FetchLUTs") <<
"caloParams.layer1HFScaleFactors().size() != caloParams.layer1HFScaleETBins().size()*12 !!";
90 const double ecalLSB = 0.5;
96 edm::LogError(
"L1TCaloLayer1FetchLUTs") <<
"Missing CaloTPGTranscoder object! Check Global Tag, etc.";
102 auto decodeHcalEt = [&decoder](uint32_t iEta, uint32_t compressedEt, uint32_t iPhi=3) ->
double {
105 if (
abs(iEta) >= 30 ) {
108 return decoder->hcaletValue(
id, sample);
113 for(
int absCaloEta = 1; absCaloEta <= 28; absCaloEta++) {
114 uint32_t iEta = absCaloEta - 1;
115 for(uint32_t
fb = 0;
fb < 2;
fb++) {
116 for(uint32_t ecalInput = 0; ecalInput <= 0xFF; ecalInput++) {
117 uint32_t
value = ecalInput;
119 double linearizedECalInput = ecalInput*ecalLSB;
122 for(; etBin < ecalScaleETBins.size(); etBin++) {
123 if(linearizedECalInput < ecalScaleETBins[etBin])
break;
125 if ( etBin >= ecalScaleETBins.size() ) etBin = ecalScaleETBins.size()-1;
127 double calibratedECalInput = linearizedECalInput;
128 if (useCalib) calibratedECalInput *= ecalSF.at(etBin*28 + iEta);
129 if (useLSB) calibratedECalInput /= caloLSB;
131 value = calibratedECalInput;
140 uint32_t et_log2 = ((uint32_t) log2(value)) & 0x7;
141 value |= (et_log2 << 12);
144 eLUT[iEta][
fb][ecalInput] =
value;
150 for(
int absCaloEta = 1; absCaloEta <= 28; absCaloEta++) {
151 uint32_t iEta = absCaloEta - 1;
152 for(uint32_t
fb = 0;
fb < 2;
fb++) {
153 for(uint32_t hcalInput = 0; hcalInput <= 0xFF; hcalInput++) {
154 uint32_t
value = hcalInput;
157 double linearizedHcalInput = decodeHcalEt(absCaloEta, hcalInput);
158 if(linearizedHcalInput != decodeHcalEt(-absCaloEta, hcalInput)) {
159 edm::LogError(
"L1TCaloLayer1FetchLUTs") <<
"L1TCaloLayer1FetchLUTs - hcal scale factors are different for positive and negative eta ! :(" << std::endl;
163 for(; etBin < hcalScaleETBins.size(); etBin++) {
164 if(linearizedHcalInput < hcalScaleETBins[etBin])
break;
166 if ( etBin >= hcalScaleETBins.size() ) etBin = hcalScaleETBins.size()-1;
168 double calibratedHcalInput = linearizedHcalInput;
169 if(useCalib) calibratedHcalInput *= hcalSF.at(etBin*28 + iEta);
170 if(useLSB) calibratedHcalInput /= caloLSB;
172 value = calibratedHcalInput;
181 uint32_t et_log2 = ((uint32_t) log2(value)) & 0x7;
182 value |= (et_log2 << 12);
185 hLUT[iEta][
fb][hcalInput] =
value;
191 for(uint32_t etaBin = 0; etaBin < 12; etaBin++) {
192 for(uint32_t etCode = 0; etCode < 256; etCode++) {
193 uint32_t
value = etCode;
196 double linearizedHFInput = 0;
198 linearizedHFInput = decodeHcalEt(30+etaBin, value);
199 if(linearizedHFInput != decodeHcalEt(-30-etaBin, value)) {
200 edm::LogError(
"L1TCaloLayer1FetchLUTs") <<
"L1TCaloLayer1FetchLUTs - HF scale factors are different for positive and negative eta ! :(" << std::endl;
205 for(; etBin < hfScaleETBins.size(); etBin++) {
206 if(linearizedHFInput < hfScaleETBins[etBin])
break;
208 if ( etBin >= hfScaleETBins.size() ) etBin = hfScaleETBins.size()-1;
210 double calibratedHFInput = linearizedHFInput;
211 if(useCalib) calibratedHFInput *= hfSF.at(etBin*12+etaBin);
212 if(useLSB) calibratedHFInput /= caloLSB;
214 value = calibratedHFInput;
219 hfLUT[etaBin][etCode] =
value;
Abs< T >::type abs(const T &t)
T const * product() const
bool L1TCaloLayer1FetchLUTs(const edm::EventSetup &iSetup, std::vector< std::vector< std::vector< uint32_t > > > &eLUT, std::vector< std::vector< std::vector< uint32_t > > > &hLUT, std::vector< std::vector< uint32_t > > &hfLUT, bool useLSB, bool useCalib, bool useECALLUT, bool useHCALLUT, bool useHFLUT)