File indexing completed on 2024-04-06 12:22:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include "L1TriggerConfig/DTTPGConfig/interface/DTConfigLUTs.h"
0018
0019
0020
0021
0022 #include <cmath>
0023 #include <cstring>
0024
0025
0026
0027
0028
0029 #include "FWCore/Utilities/interface/Exception.h"
0030
0031
0032
0033
0034 DTConfigLUTs::DTConfigLUTs(const edm::ParameterSet& ps) { setDefaults(ps); }
0035
0036 DTConfigLUTs::DTConfigLUTs(bool debugLUTS, unsigned short int* buffer) {
0037 m_debug = debugLUTS;
0038
0039
0040 if (buffer[2] != 0xA8) {
0041 throw cms::Exception("DTTPG") << "===> ConfigLUTs constructor : not a LUT string!" << std::endl;
0042 }
0043
0044
0045 short int memory_lut[7];
0046 int c = 3;
0047 for (int i = 0; i < 7; i++) {
0048 memory_lut[i] = (buffer[c] << 8) | buffer[c + 1];
0049 c += 2;
0050
0051 }
0052
0053
0054 int btic = memory_lut[0];
0055 float d;
0056 DSPtoIEEE32(memory_lut[1], memory_lut[2], &d);
0057 float Xcn;
0058 DSPtoIEEE32(memory_lut[3], memory_lut[4], &Xcn);
0059 int wheel = memory_lut[5];
0060
0061
0062 setBTIC(btic);
0063 setD(d);
0064 setXCN(Xcn);
0065 setWHEEL(wheel);
0066
0067 return;
0068 }
0069
0070
0071
0072
0073 DTConfigLUTs::~DTConfigLUTs() {}
0074
0075
0076
0077
0078
0079 void DTConfigLUTs::setDefaults(const edm::ParameterSet& m_ps) {
0080
0081 m_debug = m_ps.getUntrackedParameter<bool>("Debug");
0082
0083
0084 m_btic = m_ps.getUntrackedParameter<int>("BTIC");
0085
0086
0087 m_d = m_ps.getUntrackedParameter<double>("D");
0088
0089
0090 m_Xcn = m_ps.getUntrackedParameter<double>("XCN");
0091
0092
0093 m_wheel = m_ps.getUntrackedParameter<int>("WHEEL");
0094 }
0095
0096 void DTConfigLUTs::print() const {
0097 std::cout << "******************************************************************************" << std::endl;
0098 std::cout << "* DTTrigger configuration : LUT parameters *" << std::endl;
0099 std::cout << "******************************************************************************" << std::endl
0100 << std::endl;
0101 std::cout << "Debug flag : " << debug() << std::endl;
0102 std::cout << "BTIC parameter : " << m_btic << std::endl;
0103 std::cout << "d: distance vertex to normal, unit cm. " << m_d << std::endl;
0104 std::cout << "Xcn: distance vertex to normal, unit cm. " << m_Xcn << std::endl;
0105 std::cout << "wheel sign " << m_wheel << std::endl;
0106 std::cout << "******************************************************************************" << std::endl;
0107 }
0108
0109 void DTConfigLUTs::DSPtoIEEE32(short DSPmantissa, short DSPexp, float* f) const {
0110 DSPexp -= 15;
0111 *f = DSPmantissa * (float)pow(2.0, DSPexp);
0112 return;
0113 }
0114
0115 void DTConfigLUTs::IEEE32toDSP(float f, short int& DSPmantissa, short int& DSPexp) const {
0116 long int pl = 0;
0117 static_assert(sizeof(decltype(pl)) >= sizeof(float));
0118
0119 DSPmantissa = 0;
0120 DSPexp = 0;
0121
0122 if (f != 0.0) {
0123
0124 memcpy(&pl, &f, sizeof(float));
0125 bool sign = false;
0126 if ((pl & 0x80000000) != 0)
0127 sign = true;
0128 long int lm = (0x800000 | (pl & 0x7FFFFF));
0129 lm >>= 9;
0130 lm &= 0x7FFF;
0131 DSPexp = ((pl >> 23) & 0xFF) - 126;
0132 DSPmantissa = (short)lm;
0133 if (sign)
0134 DSPmantissa = -DSPmantissa;
0135 }
0136 return;
0137 }