File indexing completed on 2024-04-06 12:10:44
0001 #include "EventFilter/HcalRawToDigi/interface/HcalUHTRData.h"
0002 #include <cstring>
0003
0004 static const int HEADER_LENGTH_16BIT = 2 * sizeof(uint64_t) / sizeof(uint16_t);
0005
0006 HcalUHTRData::const_iterator::const_iterator(const uint16_t* ptr, const uint16_t* limit)
0007 : m_ptr(ptr), m_limit(limit), m_stepclass(0), m_technicalDataType(0) {
0008 if (isHeader())
0009 determineMode();
0010 }
0011
0012 HcalUHTRData::const_iterator& HcalUHTRData::const_iterator::operator++() {
0013 if (m_ptr == m_limit)
0014 return *this;
0015 if (m_stepclass == 0)
0016 m_ptr++;
0017 else if (m_stepclass == 1) {
0018 if (m_microstep == 0) {
0019 m_ptr++;
0020 m_microstep++;
0021 } else {
0022 m_microstep--;
0023 }
0024 } else if (m_stepclass == 2) {
0025 if (isHeader()) {
0026 m_ptr++;
0027 } else {
0028 m_ptr += 2;
0029 }
0030 }
0031
0032 if (isHeader()) {
0033 determineMode();
0034 m_header_ptr = m_ptr;
0035 m_0th_data_ptr = m_header_ptr + 1;
0036 }
0037 return *this;
0038 }
0039
0040 void HcalUHTRData::const_iterator::determineMode() {
0041 if (!isHeader())
0042 return;
0043 m_flavor = flavor();
0044 m_stepclass = 0;
0045 if (m_flavor == 5) {
0046 m_stepclass = 1;
0047 m_microstep = 0;
0048 } else if (m_flavor == 2) {
0049 m_stepclass = 2;
0050 }
0051 if (m_flavor == 7) {
0052 m_technicalDataType = technicalDataType();
0053 }
0054 }
0055
0056 int HcalUHTRData::const_iterator::errFlags() const {
0057 if ((m_flavor == 7 && m_technicalDataType == 15) && !isHeader())
0058 return ((*m_ptr) >> 11) & 0x1;
0059 else
0060 return ((*m_ptr) >> 10) & 0x3;
0061 }
0062
0063 bool HcalUHTRData::const_iterator::dataValid() const {
0064 if ((m_flavor == 7 && m_technicalDataType == 15) && !isHeader())
0065 return ((*m_ptr) >> 10) & 0x1;
0066 else
0067 return !(errFlags() & 0x2);
0068 }
0069
0070 int HcalUHTRData::const_iterator::technicalDataType() const {
0071 if (m_flavor == 7)
0072 return ((*m_ptr) >> 8) & 0xF;
0073 else
0074 return 0;
0075 }
0076
0077 uint8_t HcalUHTRData::const_iterator::adc() const {
0078 if (m_flavor == 5 && m_microstep == 0)
0079 return ((*m_ptr) >> 8) & 0x7F;
0080 else if (m_flavor == 7 && m_technicalDataType == 15)
0081 return (*m_ptr) & 0x7F;
0082 else
0083 return (*m_ptr) & 0xFF;
0084 }
0085
0086 uint8_t HcalUHTRData::const_iterator::le_tdc() const {
0087 if (m_flavor == 5 || (m_flavor == 7 && m_technicalDataType == 15))
0088 return 0x80;
0089 else if (m_flavor == 2)
0090 return (m_ptr[1] & 0x3F);
0091 else
0092 return (((*m_ptr) & 0x3F00) >> 8);
0093 }
0094
0095 bool HcalUHTRData::const_iterator::soi() const {
0096 if (m_flavor == 5 || (m_flavor == 7 && m_technicalDataType == 15))
0097 return false;
0098 else if (m_flavor == 2)
0099 return (m_ptr[0] & 0x2000);
0100 else
0101 return (((*m_ptr) & 0x4000));
0102 }
0103
0104 uint8_t HcalUHTRData::const_iterator::te_tdc() const {
0105 if (m_flavor == 2)
0106 return (m_ptr[1] >> 6) & 0x1F;
0107 else
0108 return 0x80;
0109 }
0110
0111 uint8_t HcalUHTRData::const_iterator::capid() const {
0112 if (m_flavor == 2)
0113 return (m_ptr[1] >> 12) & 0x3;
0114 else if (m_flavor == 7 && m_technicalDataType == 15) {
0115 return ((*m_ptr) >> 8) & 0x3;
0116 } else if (m_flavor == 1 || m_flavor == 0) {
0117
0118
0119
0120 return 0;
0121 } else {
0122 return 0;
0123 }
0124 }
0125
0126 bool HcalUHTRData::const_iterator::ok() const {
0127 if (m_flavor == 2) {
0128 return (m_ptr[0] >> 12) & 0x1;
0129 } else if (m_flavor == 4) {
0130 return (m_ptr[0] >> 13) & 0x1;
0131 } else {
0132 return false;
0133 }
0134 }
0135
0136 HcalUHTRData::const_iterator HcalUHTRData::begin() const {
0137 return HcalUHTRData::const_iterator(m_raw16 + HEADER_LENGTH_16BIT,
0138 m_raw16 + (m_rawLength64 - 1) * sizeof(uint64_t) / sizeof(uint16_t));
0139 }
0140
0141 HcalUHTRData::const_iterator HcalUHTRData::end() const {
0142 return HcalUHTRData::const_iterator(m_raw16 + (m_rawLength64 - 1) * sizeof(uint64_t) / sizeof(uint16_t),
0143 m_raw16 + (m_rawLength64 - 1) * sizeof(uint64_t) / sizeof(uint16_t));
0144 }
0145
0146 HcalUHTRData::HcalUHTRData()
0147 : m_formatVersion(-2), m_rawLength64(0), m_raw64(nullptr), m_raw16(nullptr), m_ownData(nullptr) {}
0148
0149 HcalUHTRData::HcalUHTRData(const uint64_t* data, int length)
0150 : m_rawLength64(length), m_raw64(data), m_raw16((const uint16_t*)(data)), m_ownData(nullptr) {
0151 m_formatVersion = (m_raw16[6] >> 12) & 0xF;
0152 }
0153
0154 HcalUHTRData::HcalUHTRData(const HcalUHTRData& hd)
0155 : m_formatVersion(hd.m_formatVersion),
0156 m_rawLength64(hd.m_rawLength64),
0157 m_raw64(hd.m_raw64),
0158 m_raw16(hd.m_raw16),
0159 m_ownData(nullptr) {}
0160
0161 HcalUHTRData::HcalUHTRData(int version_to_create) : m_formatVersion(version_to_create) {
0162
0163
0164 const int needed = (0x20 + FIBERS_PER_UHTR * CHANNELS_PER_FIBER_MAX * (10 + 1)) * sizeof(uint16_t) / sizeof(uint64_t);
0165
0166 m_ownData = new uint64_t[needed];
0167 memset(m_ownData, 0, sizeof(uint64_t) * needed);
0168 m_rawLength64 = 0;
0169 m_raw64 = m_ownData;
0170 m_raw16 = (const uint16_t*)m_raw64;
0171 }
0172
0173 HcalUHTRData& HcalUHTRData::operator=(const HcalUHTRData& hd) {
0174 if (m_ownData == nullptr) {
0175 m_formatVersion = hd.m_formatVersion;
0176 m_rawLength64 = hd.m_rawLength64;
0177 m_raw64 = hd.m_raw64;
0178 m_raw16 = hd.m_raw16;
0179 }
0180 return (*this);
0181 }