File indexing completed on 2024-04-06 12:10:25
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "EventFilter/CSCRawToDigi/interface/CSCDCCEventData.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011 #include <iostream>
0012 #include <cstdio>
0013 #include "EventFilter/CSCRawToDigi/interface/bitset_append.h"
0014
0015 #ifdef LOCAL_UNPACK
0016 bool CSCDCCEventData::debug = false;
0017 #else
0018 #include <atomic>
0019 std::atomic<bool> CSCDCCEventData::debug{false};
0020 #endif
0021
0022 CSCDCCEventData::CSCDCCEventData(int sourceId, int nDDUs, int bx, int l1a) : theDCCHeader(bx, l1a, sourceId) {
0023 theDDUData.reserve(nDDUs);
0024 }
0025
0026 CSCDCCEventData::CSCDCCEventData(const uint16_t* buf, CSCDCCExaminer* examiner) { unpack_data(buf, examiner); }
0027
0028 CSCDCCEventData::~CSCDCCEventData() {}
0029
0030 void CSCDCCEventData::unpack_data(const uint16_t* buf, CSCDCCExaminer* examiner) {
0031
0032
0033
0034
0035
0036
0037
0038 theDDUData.clear();
0039 if (debug)
0040 LogTrace("CSCDCCEventData|CSCRawToDigi") << "CSCDCCEventData::unpack_data() is called";
0041
0042
0043 if (debug)
0044 LogTrace("CSCDCCEventData|CSCRawToDigi") << "unpacking dcc header...";
0045 theDCCHeader.setFromBuffer(buf);
0046
0047 buf += theDCCHeader.sizeInWords();
0048
0049
0050
0051
0052 while ((buf[7] == 0x8000) && (buf[6] == 0x0001) && (buf[5] == 0x8000)) {
0053 CSCDDUEventData dduEventData(buf, examiner);
0054
0055
0056 if (debug)
0057 LogTrace("CSCDCCEventData|CSCRawToDigi") << " checking ddu data integrity ";
0058 if (dduEventData.check()) {
0059 theDDUData.push_back(dduEventData);
0060 buf += dduEventData.sizeInWords();
0061 } else {
0062 if (debug)
0063 LogTrace("CSCDCCEventData|CSCRawToDigi") << "DDU Data Check failed! ";
0064 break;
0065 }
0066 }
0067
0068 if (debug) {
0069 LogTrace("CSCDCCEventData|CSCRawToDigi") << "unpacking dcc trailer ";
0070 LogTrace("CSCDCCEventData|CSCRawToDigi") << std::hex << buf[3] << " " << buf[2] << " " << buf[1] << " " << buf[0];
0071 }
0072
0073
0074 if (debug)
0075 LogTrace("CSCDCCEventData|CSCRawToDigi") << "decoding DCC trailer";
0076 theDCCTrailer.setFromBuffer(buf);
0077 if (debug)
0078 LogTrace("CSCDCCEventData|CSCRawToDigi") << "checking DDU Trailer" << theDCCTrailer.check();
0079
0080
0081
0082
0083
0084 }
0085
0086 bool CSCDCCEventData::check() const {
0087
0088 if (debug) {
0089 LogTrace("CSCDCCEventData|CSCRawToDigi") << "size in Words () = " << std::dec << sizeInWords();
0090 }
0091
0092 return theDCCHeader.check() && theDCCTrailer.check();
0093 }
0094
0095 void CSCDCCEventData::addChamber(
0096 CSCEventData& chamber, int dduID, int dduSlot, int dduInput, int dmbID, uint16_t format_version) {
0097
0098 int dduIndex = -1;
0099 int nDDUs = theDDUData.size();
0100 for (int i = 0; dduIndex == -1 && i < nDDUs; ++i) {
0101 if (theDDUData[i].header().source_id() == dduID)
0102 dduIndex = i;
0103 }
0104
0105
0106 unsigned ddu_fmt_version = 0x6;
0107 if (format_version >= 2013)
0108 ddu_fmt_version = 0x7;
0109
0110 if (dduIndex == -1) {
0111
0112 CSCDDUHeader newDDUHeader(
0113 dccHeader().getCDFBunchCounter(), dccHeader().getCDFEventNumber(), dduID, ddu_fmt_version);
0114 theDDUData.push_back(CSCDDUEventData(newDDUHeader));
0115 dduIndex = nDDUs;
0116 dccHeader().setDAV(dduSlot);
0117 }
0118 theDDUData[dduIndex].add(chamber, dmbID, dduInput, format_version);
0119 }
0120
0121 boost::dynamic_bitset<> CSCDCCEventData::pack() {
0122 boost::dynamic_bitset<> result(theDCCHeader.sizeInWords() * 16);
0123 result = bitset_utilities::ushortToBitset(theDCCHeader.sizeInWords() * 16, theDCCHeader.data());
0124
0125
0126
0127
0128
0129
0130
0131 for (size_t i = 0; i < theDDUData.size(); ++i) {
0132 result = bitset_utilities::append(result, theDDUData[i].pack());
0133
0134
0135
0136
0137 }
0138
0139
0140
0141
0142
0143
0144
0145 boost::dynamic_bitset<> dccTrailer =
0146 bitset_utilities::ushortToBitset(theDCCTrailer.sizeInWords() * 16, theDCCTrailer.data());
0147 result = bitset_utilities::append(result, dccTrailer);
0148
0149 return result;
0150 }