Go to the documentation of this file.00001 #include "L1Trigger/GlobalCaloTrigger/interface/L1GctGlobalHfSumAlgos.h"
00002
00003 #include "CondFormats/L1TObjects/interface/L1CaloEtScale.h"
00004
00005 #include "L1Trigger/GlobalCaloTrigger/interface/L1GctWheelJetFpga.h"
00006 #include "L1Trigger/GlobalCaloTrigger/interface/L1GctHfBitCountsLut.h"
00007 #include "L1Trigger/GlobalCaloTrigger/interface/L1GctHfEtSumsLut.h"
00008
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010
00011 L1GctGlobalHfSumAlgos::L1GctGlobalHfSumAlgos(std::vector<L1GctWheelJetFpga*> wheelJetFpga) :
00012 L1GctProcessor(),
00013 m_plusWheelJetFpga(wheelJetFpga.at(1)),
00014 m_minusWheelJetFpga(wheelJetFpga.at(0)),
00015 m_bitCountLuts(), m_etSumLuts(),
00016 m_hfInputSumsPlusWheel(),
00017 m_hfInputSumsMinusWheel(),
00018 m_hfOutputSumsPipe(),
00019 m_setupOk(true)
00020 {
00021 if(wheelJetFpga.size() != 2)
00022 {
00023 m_setupOk = false;
00024 if (m_verbose) {
00025 edm::LogWarning("L1GctSetupError")
00026 << "L1GctGlobalHfSumAlgos::L1GctGlobalHfSumAlgos() : Global HfSum Algos has been incorrectly constructed!\n"
00027 << "This class needs two wheel jet fpga pointers. "
00028 << "Number of wheel jet fpga pointers present is " << wheelJetFpga.size() << ".\n";
00029 }
00030 }
00031
00032 if(m_plusWheelJetFpga == 0)
00033 {
00034 m_setupOk = false;
00035 if (m_verbose) {
00036 edm::LogWarning("L1GctSetupError")
00037 << "L1GctGlobalHfSumAlgos::L1GctGlobalHfSumAlgos() has been incorrectly constructed!\n"
00038 << "Plus Wheel Jet Fpga pointer has not been set!\n";
00039 }
00040 }
00041 if(m_minusWheelJetFpga == 0)
00042 {
00043 m_setupOk = false;
00044 if (m_verbose) {
00045 edm::LogWarning("L1GctSetupError")
00046 << "L1GctGlobalHfSumAlgos::L1GctGlobalHfSumAlgos() has been incorrectly constructed!\n"
00047 << "Minus Wheel Jet Fpga pointer has not been set!\n";
00048 }
00049 }
00050
00051 if (!m_setupOk && m_verbose) {
00052 edm::LogError("L1GctSetupError") << "L1GctGlobalEnergyAlgos has been incorrectly constructed";
00053 }
00054 }
00055
00056 L1GctGlobalHfSumAlgos::~L1GctGlobalHfSumAlgos()
00057 {
00058 std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfBitCountsLut*>::const_iterator bclut = m_bitCountLuts.begin();
00059 while (bclut != m_bitCountLuts.end()) {
00060 delete bclut->second;
00061 bclut++;
00062 }
00063 std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfEtSumsLut*>::const_iterator eslut = m_etSumLuts.begin();
00064 while (eslut != m_etSumLuts.end()) {
00065 delete eslut->second;
00066 eslut++;
00067 }
00068 }
00069
00070 std::ostream& operator << (std::ostream& os, const L1GctGlobalHfSumAlgos& fpga)
00071 {
00072 os << "===L1GctGlobalHfSumAlgos===" << std::endl;
00073 os << "WheelJetFpga* plus = " << fpga.m_plusWheelJetFpga << std::endl;
00074 os << "Plus wheel inputs:" << std::endl;
00075 os << "Bit counts ring 1: " << fpga.m_hfInputSumsPlusWheel.nOverThreshold0
00076 << ", ring 2: " << fpga.m_hfInputSumsPlusWheel.nOverThreshold1 << std::endl;
00077 os << "Et sums ring 1: " << fpga.m_hfInputSumsPlusWheel.etSum0
00078 << ", ring 2: " << fpga.m_hfInputSumsPlusWheel.etSum1 << std::endl;
00079 os << "WheelJetFpga* minus = " << fpga.m_minusWheelJetFpga << std::endl;
00080 os << "Minus wheel inputs:" << std::endl;
00081 os << "Bit counts ring 1: " << fpga.m_hfInputSumsMinusWheel.nOverThreshold0
00082 << ", ring 2: " << fpga.m_hfInputSumsMinusWheel.nOverThreshold1 << std::endl;
00083 os << "Et sums ring 1: " << fpga.m_hfInputSumsMinusWheel.etSum0
00084 << ", ring 2: " << fpga.m_hfInputSumsMinusWheel.etSum1 << std::endl;
00085
00086 int bxZero = -fpga.bxMin();
00087 if (bxZero>=0 && bxZero<fpga.numOfBx()) {
00088 os << "Output word " << std::hex << fpga.hfSumsWord().at(bxZero) << std::dec << std::endl;
00089 }
00090
00091 return os;
00092 }
00093
00094 void L1GctGlobalHfSumAlgos::resetProcessor() {
00095 m_hfInputSumsPlusWheel.reset();
00096 m_hfInputSumsMinusWheel.reset();
00097 }
00098
00099 void L1GctGlobalHfSumAlgos::resetPipelines() {
00100 m_hfOutputSumsPipe.clear();
00101 Pipeline<uint16_t> temp(numOfBx());
00102
00103 unsigned nTypes = (unsigned) L1GctHfEtSumsLut::numberOfLutTypes;
00104 for (unsigned t=0; t<nTypes; ++t) {
00105 m_hfOutputSumsPipe[ (L1GctHfEtSumsLut::hfLutType) t] = temp;
00106 }
00107 }
00108
00109 void L1GctGlobalHfSumAlgos::fetchInput() {
00110 if (m_setupOk) {
00111 m_hfInputSumsPlusWheel = m_plusWheelJetFpga->getOutputHfSums();
00112 m_hfInputSumsMinusWheel = m_minusWheelJetFpga->getOutputHfSums();
00113 }
00114 }
00115
00116
00117
00118 void L1GctGlobalHfSumAlgos::process()
00119 {
00120 if (m_setupOk) {
00121
00122
00123
00124
00125 storeBitCount(L1GctHfEtSumsLut::bitCountPosEtaRing1, m_hfInputSumsPlusWheel.nOverThreshold0.value() );
00126
00127
00128 storeBitCount(L1GctHfEtSumsLut::bitCountNegEtaRing1, m_hfInputSumsMinusWheel.nOverThreshold0.value() );
00129
00130
00131 storeBitCount(L1GctHfEtSumsLut::bitCountPosEtaRing2, m_hfInputSumsPlusWheel.nOverThreshold1.value() );
00132
00133
00134 storeBitCount(L1GctHfEtSumsLut::bitCountNegEtaRing2, m_hfInputSumsMinusWheel.nOverThreshold1.value() );
00135
00136
00137 storeEtSum(L1GctHfEtSumsLut::etSumPosEtaRing1, m_hfInputSumsPlusWheel.etSum0.value() );
00138
00139
00140 storeEtSum(L1GctHfEtSumsLut::etSumNegEtaRing1, m_hfInputSumsMinusWheel.etSum0.value() );
00141
00142
00143 storeEtSum(L1GctHfEtSumsLut::etSumPosEtaRing2, m_hfInputSumsPlusWheel.etSum1.value() );
00144
00145
00146 storeEtSum(L1GctHfEtSumsLut::etSumNegEtaRing2, m_hfInputSumsMinusWheel.etSum1.value() );
00147
00148 }
00149 }
00150
00151
00152 void L1GctGlobalHfSumAlgos::storeBitCount(L1GctHfEtSumsLut::hfLutType type, uint16_t value) {
00153 std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfBitCountsLut*>::const_iterator bclut = m_bitCountLuts.find(type);
00154 if (bclut != m_bitCountLuts.end()) {
00155 m_hfOutputSumsPipe[type].store( (*bclut->second)[value], bxRel() );
00156 }
00157 }
00158
00159
00160 void L1GctGlobalHfSumAlgos::storeEtSum(L1GctHfEtSumsLut::hfLutType type, uint16_t value) {
00161 std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfEtSumsLut*>::const_iterator eslut = m_etSumLuts.find(type);
00162 if (eslut != m_etSumLuts.end()) {
00163 m_hfOutputSumsPipe[type].store( (*eslut->second)[value], bxRel() );
00164 }
00165 }
00166
00167
00168
00170 std::vector<uint16_t> L1GctGlobalHfSumAlgos::hfSumsOutput(const L1GctHfEtSumsLut::hfLutType type) const
00171 {
00172 std::vector<uint16_t> result(numOfBx());
00173 std::map<L1GctHfEtSumsLut::hfLutType, Pipeline<uint16_t> >::const_iterator lut=m_hfOutputSumsPipe.find(type);
00174 if (lut != m_hfOutputSumsPipe.end()) {
00175 result = (lut->second).contents;
00176 }
00177
00178 return result;
00179
00180 }
00181
00182 std::vector<unsigned> L1GctGlobalHfSumAlgos::hfSumsWord() const {
00183 std::vector<unsigned> result(numOfBx(), 0x00001000);
00184 std::vector<uint16_t> outputBits;
00185
00186 outputBits = hfSumsOutput(L1GctHfEtSumsLut::bitCountPosEtaRing1);
00187 for (unsigned bx=0; bx<outputBits.size(); bx++) { result.at(bx) |= outputBits.at(bx); }
00188
00189 outputBits = hfSumsOutput(L1GctHfEtSumsLut::bitCountNegEtaRing1);
00190 for (unsigned bx=0; bx<outputBits.size(); bx++) { result.at(bx) |= outputBits.at(bx) << 3; }
00191
00192 outputBits = hfSumsOutput(L1GctHfEtSumsLut::bitCountPosEtaRing2);
00193 for (unsigned bx=0; bx<outputBits.size(); bx++) { result.at(bx) |= outputBits.at(bx) << 6; }
00194
00195 outputBits = hfSumsOutput(L1GctHfEtSumsLut::bitCountNegEtaRing2);
00196 for (unsigned bx=0; bx<outputBits.size(); bx++) { result.at(bx) |= outputBits.at(bx) << 9; }
00197
00198 outputBits = hfSumsOutput(L1GctHfEtSumsLut::etSumPosEtaRing1);
00199 for (unsigned bx=0; bx<outputBits.size(); bx++) { result.at(bx) |= outputBits.at(bx) << 12; }
00200
00201 outputBits = hfSumsOutput(L1GctHfEtSumsLut::etSumNegEtaRing1);
00202 for (unsigned bx=0; bx<outputBits.size(); bx++) { result.at(bx) |= outputBits.at(bx) << 16; }
00203
00204 outputBits = hfSumsOutput(L1GctHfEtSumsLut::etSumPosEtaRing2);
00205 for (unsigned bx=0; bx<outputBits.size(); bx++) { result.at(bx) |= outputBits.at(bx) << 19; }
00206
00207 outputBits = hfSumsOutput(L1GctHfEtSumsLut::etSumNegEtaRing2);
00208 for (unsigned bx=0; bx<outputBits.size(); bx++) { result.at(bx) |= outputBits.at(bx) << 22; }
00209
00210 return result;
00211 }
00212
00214 void L1GctGlobalHfSumAlgos::setupLuts(const L1CaloEtScale* scale)
00215 {
00216
00217 while (!m_bitCountLuts.empty()) {
00218 delete m_bitCountLuts.begin()->second;
00219 m_bitCountLuts.erase(m_bitCountLuts.begin());
00220 }
00221 m_bitCountLuts[L1GctHfEtSumsLut::bitCountPosEtaRing1] = new L1GctHfBitCountsLut(L1GctHfEtSumsLut::bitCountPosEtaRing1);
00222 m_bitCountLuts[L1GctHfEtSumsLut::bitCountPosEtaRing2] = new L1GctHfBitCountsLut(L1GctHfEtSumsLut::bitCountPosEtaRing2);
00223 m_bitCountLuts[L1GctHfEtSumsLut::bitCountNegEtaRing1] = new L1GctHfBitCountsLut(L1GctHfEtSumsLut::bitCountNegEtaRing1);
00224 m_bitCountLuts[L1GctHfEtSumsLut::bitCountNegEtaRing2] = new L1GctHfBitCountsLut(L1GctHfEtSumsLut::bitCountNegEtaRing2);
00225
00226 while (!m_etSumLuts.empty()) {
00227 delete m_etSumLuts.begin()->second;
00228 m_etSumLuts.erase(m_etSumLuts.begin());
00229 }
00230 m_etSumLuts[L1GctHfEtSumsLut::etSumPosEtaRing1] = new L1GctHfEtSumsLut(L1GctHfEtSumsLut::etSumPosEtaRing1, scale);
00231 m_etSumLuts[L1GctHfEtSumsLut::etSumPosEtaRing2] = new L1GctHfEtSumsLut(L1GctHfEtSumsLut::etSumPosEtaRing2, scale);
00232 m_etSumLuts[L1GctHfEtSumsLut::etSumNegEtaRing1] = new L1GctHfEtSumsLut(L1GctHfEtSumsLut::etSumNegEtaRing1, scale);
00233 m_etSumLuts[L1GctHfEtSumsLut::etSumNegEtaRing2] = new L1GctHfEtSumsLut(L1GctHfEtSumsLut::etSumNegEtaRing2, scale);
00234
00235 }
00236
00238 const L1GctHfBitCountsLut* L1GctGlobalHfSumAlgos::getBCLut(const L1GctHfEtSumsLut::hfLutType type) const
00239 {
00240 std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfBitCountsLut*>::const_iterator bclut = m_bitCountLuts.find(type);
00241 if (bclut != m_bitCountLuts.end()) {
00242 return (bclut->second);
00243 } else {
00244 return 0;
00245 }
00246 }
00247
00248 const L1GctHfEtSumsLut* L1GctGlobalHfSumAlgos::getESLut(const L1GctHfEtSumsLut::hfLutType type) const
00249 {
00250 std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfEtSumsLut*>::const_iterator eslut = m_etSumLuts.find(type);
00251 if (eslut != m_etSumLuts.end()) {
00252 return (eslut->second);
00253 } else {
00254 return 0;
00255 }
00256 }
00257
00259 std::vector<double> L1GctGlobalHfSumAlgos::getThresholds(const L1GctHfEtSumsLut::hfLutType type) const
00260 {
00261 std::vector<double> result;
00262 const L1GctHfEtSumsLut* ESLut = getESLut(type);
00263 if (ESLut != 0) { result = ESLut->lutFunction()->getThresholds(); }
00264 return result;
00265 }
00266