Go to the documentation of this file.00001 #include "L1Trigger/GlobalCaloTrigger/interface/L1GctHtMissLut.h"
00002
00003 #include "CondFormats/L1TObjects/interface/L1CaloEtScale.h"
00004
00005 #include <math.h>
00006
00007
00008 const int L1GctHtMissLut::NAddress=2*L1GctHtMissLut::kHxOrHyMissComponentNBits;
00009 const int L1GctHtMissLut::NData =L1GctHtMissLut::kHtMissMagnitudeNBits+L1GctHtMissLut::kHtMissAngleNBits;
00010
00011 L1GctHtMissLut::L1GctHtMissLut(const L1CaloEtScale* const scale, const double lsb) :
00012 L1GctLut<NAddress,NData>(),
00013 m_etScale(scale),
00014 m_componentLsb(lsb)
00015 {
00016 if (scale != 0) m_setupOk = true;
00017 }
00018
00019 L1GctHtMissLut::L1GctHtMissLut() :
00020 L1GctLut<NAddress,NData>(),
00021 m_etScale(0),
00022 m_componentLsb(1.0)
00023 {
00024 }
00025
00026 L1GctHtMissLut::L1GctHtMissLut(const L1GctHtMissLut& lut) :
00027 L1GctLut<NAddress,NData>(),
00028 m_etScale(lut.etScale()),
00029 m_componentLsb(lut.componentLsb())
00030 {
00031 if (m_etScale != 0) m_setupOk = true;
00032 }
00033
00034 L1GctHtMissLut::~L1GctHtMissLut()
00035 {
00036 }
00037
00038
00039 uint16_t L1GctHtMissLut::value (const uint16_t lutAddress) const
00040 {
00041 uint16_t result=0;
00042
00043 if (lutAddress!=0) {
00044 static const int maxComponent = 1<<kHxOrHyMissComponentNBits;
00045 static const int componentMask = maxComponent-1;
00046
00047 static const int magnitudeMask = (1<<kHtMissMagnitudeNBits) - 1;
00048 static const int angleMask = (1<<kHtMissAngleNBits) - 1;
00049
00050
00051 int hxCompGct = static_cast<int>(lutAddress>>kHxOrHyMissComponentNBits) & componentMask;
00052 int hyCompGct = static_cast<int>(lutAddress) & componentMask;
00053
00054
00055 if (hxCompGct >= maxComponent/2) hxCompGct -= maxComponent;
00056 if (hyCompGct >= maxComponent/2) hyCompGct -= maxComponent;
00057
00058
00059 double hxCompGeV = m_componentLsb * (static_cast<double>(hxCompGct) + 0.5);
00060 double hyCompGeV = m_componentLsb * (static_cast<double>(hyCompGct) + 0.5);
00061
00062
00063 double htMissMag = sqrt(hxCompGeV * hxCompGeV + hyCompGeV * hyCompGeV);
00064 double htMissAng = atan2(hyCompGeV, hxCompGeV);
00065 if (htMissAng < 0.0) htMissAng += 2.0*M_PI;
00066
00067
00068 int htMissMagBits = static_cast<int>(m_etScale->rank(htMissMag)) & magnitudeMask;
00069 int htMissAngBits = static_cast<int>(htMissAng*9.0/M_PI) & angleMask;
00070
00071
00072 result = (htMissMagBits << kHtMissAngleNBits) | htMissAngBits ;
00073 }
00074
00075 return result;
00076
00077 }
00078
00079
00080 std::vector<double> L1GctHtMissLut::getThresholdsGeV() const
00081 {
00082 return m_etScale->getThresholds();
00083 }
00084
00085 std::vector<unsigned> L1GctHtMissLut::getThresholdsGct() const
00086 {
00087 std::vector<unsigned> result;
00088 std::vector<double> thresholdsGeV = m_etScale->getThresholds();
00089 for (std::vector<double>::const_iterator thr=thresholdsGeV.begin();
00090 thr != thresholdsGeV.end(); thr++) {
00091 result.push_back(static_cast<unsigned>((*thr)/(m_componentLsb)));
00092 }
00093 return result;
00094 }
00095
00096 L1GctHtMissLut L1GctHtMissLut::operator= (const L1GctHtMissLut& lut)
00097 {
00098 L1GctHtMissLut temp(lut);
00099 return temp;
00100 }
00101
00102 std::ostream& operator << (std::ostream& os, const L1GctHtMissLut& lut)
00103 {
00104 os << "===L1GctHtMissLut===" << std::endl;
00105 std::vector<double> thresholds = lut.m_etScale->getThresholds();
00106 std::vector<double>::const_iterator thr = thresholds.begin();
00107 os << "Thresholds are: " << *(thr++);
00108 for ( ; thr != thresholds.end(); thr++) {
00109 os << ", " << *thr;
00110 }
00111 os << std::endl;
00112 os << "Max values for input to et scale " << lut.m_etScale->linScaleMax()
00113 << " and for output " << lut.m_etScale->rankScaleMax() << std::endl;
00114 os << "LSB used for conversion is " << lut.m_componentLsb << " GeV" << std::endl;
00115 os << "\n===Lookup table contents===\n" << std::endl;
00116 const L1GctLut<L1GctHtMissLut::NAddress,L1GctHtMissLut::NData>* temp=&lut;
00117 os << *temp;
00118 return os;
00119 }
00120
00121 template class L1GctLut<L1GctHtMissLut::NAddress,L1GctHtMissLut::NData>;
00122
00123