File indexing completed on 2023-03-17 10:59:36
0001 #include <memory>
0002
0003
0004
0005 #include "EventFilter/EcalDigiToRaw/interface/BlockFormatter.h"
0006 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0007 #include "DataFormats/EcalDetId/interface/EcalElectronicsId.h"
0008
0009 using namespace std;
0010
0011 BlockFormatter::BlockFormatter(Config const& iC, Params const& iP)
0012 : plistDCCId_{iC.plistDCCId_},
0013 counter_{iP.counter_},
0014 orbit_number_{iP.orbit_number_},
0015 bx_{iP.bx_},
0016 lv1_{iP.lv1_},
0017 runnumber_{iP.runnumber_},
0018 debug_{iC.debug_},
0019 doBarrel_{iC.doBarrel_},
0020 doEndCap_{iC.doEndCap_},
0021 doTCC_{iC.doTCC_},
0022 doSR_{iC.doSR_},
0023 doTower_{iC.doTower_} {}
0024
0025 void BlockFormatter::DigiToRaw(FEDRawDataCollection* productRawData) {
0026 int run_number = runnumber_;
0027 int bx = bx_;
0028 int lv1 = lv1_;
0029
0030 if (debug_)
0031 cout << "in BlockFormatter::DigiToRaw run_number orbit_number bx lv1 " << dec << run_number << " " << orbit_number_
0032 << " " << bx << " " << lv1 << endl;
0033
0034 for (int idcc = 1; idcc <= 54; idcc++) {
0035 if ((!doBarrel_) && (idcc >= EcalElectronicsId::MIN_DCCID_EBM && idcc <= EcalElectronicsId::MAX_DCCID_EBP))
0036 continue;
0037 if ((!doEndCap_) && (idcc <= EcalElectronicsId::MAX_DCCID_EEM || idcc >= EcalElectronicsId::MIN_DCCID_EEP))
0038 continue;
0039
0040 int FEDid = FEDNumbering::MINECALFEDID + idcc;
0041 FEDRawData& rawdata = productRawData->FEDData(FEDid);
0042 unsigned char* pData;
0043 short int DCC_ERRORS = 0;
0044
0045 if (rawdata.size() == 0) {
0046 rawdata.resize(8);
0047 pData = rawdata.data();
0048
0049 Word64 word = 0x18 + ((FEDid & 0xFFF) << 8) + ((Word64)((Word64)bx & 0xFFF) << 20) +
0050 ((Word64)((Word64)lv1 & 0xFFFFFF) << 32) + (Word64)((Word64)0x51 << 56);
0051 Word64* pw = reinterpret_cast<Word64*>(const_cast<unsigned char*>(pData));
0052 *pw = word;
0053
0054 rawdata.resize(rawdata.size() + 8 * 8);
0055 pData = rawdata.data();
0056 pData[11] = DCC_ERRORS & 0xFF;
0057 pData[12] = run_number & 0xFF;
0058 pData[13] = (run_number >> 8) & 0xFF;
0059 pData[14] = (run_number >> 16) & 0xFF;
0060 pData[15] = 0x01;
0061
0062 for (int i = 16; i <= 22; i++) {
0063 pData[i] = 0;
0064 }
0065 pData[23] = 0x02;
0066 pData[24] = orbit_number_ & 0xFF;
0067 pData[25] = (orbit_number_ >> 8) & 0xFF;
0068 pData[26] = (orbit_number_ >> 16) & 0xFF;
0069 pData[27] = (orbit_number_ >> 24) & 0xFF;
0070 int SRenable_ = 1;
0071 int SR = SRenable_;
0072 int ZS = 0;
0073 int TZS = 0;
0074
0075 pData[28] = (SR & 0x1) + ((ZS & 0x1) << 1) + ((TZS & 0x1) << 2);
0076 pData[31] = 0x03;
0077
0078 for (int i = 0; i <= 4; i++) {
0079 for (int j = 0; j < 7; j++) {
0080 pData[32 + 8 * i + j] = 0;
0081 }
0082 pData[32 + 8 * i + 7] = 0x04;
0083 }
0084
0085 }
0086 }
0087 }
0088
0089 void BlockFormatter::print(FEDRawData& rawdata) {
0090 int size = rawdata.size();
0091 cout << "Print RawData size " << dec << size << endl;
0092 unsigned char* pData = rawdata.data();
0093
0094 int n = size / 8;
0095 for (int i = 0; i < n; i++) {
0096 for (int j = 7; j >= 0; j--) {
0097 if (8 * i + j <= size)
0098 cout << hex << (int)pData[8 * i + j] << " ";
0099 }
0100 cout << endl;
0101 }
0102 }
0103
0104 void BlockFormatter::CleanUp(FEDRawDataCollection* productRawData, map<int, map<int, int> >* FEDorder) {
0105 for (int id = 0; id < 36 + 18; id++) {
0106 if ((!doBarrel_) && (id >= 9 && id <= 44))
0107 continue;
0108 if ((!doEndCap_) && (id <= 8 || id >= 45))
0109 continue;
0110
0111 int FEDid = FEDNumbering::MINECALFEDID + id + 1;
0112 FEDRawData& rawdata = productRawData->FEDData(FEDid);
0113
0114
0115 if (find((*plistDCCId_).begin(), (*plistDCCId_).end(), (id + 1)) == (*plistDCCId_).end()) {
0116 rawdata.resize(0);
0117 continue;
0118 }
0119
0120
0121 int lastline = rawdata.size();
0122 rawdata.resize(lastline + 8);
0123 unsigned char* pData = rawdata.data();
0124 int event_length = (lastline + 8) / 8;
0125
0126 pData[lastline + 7] = 0xa0;
0127
0128 pData[lastline + 4] = event_length & 0xFF;
0129 pData[lastline + 5] = (event_length >> 8) & 0xFF;
0130 pData[lastline + 6] = (event_length >> 16) & 0xFF;
0131 int event_status = 0;
0132 pData[lastline + 1] = event_status & 0x0F;
0133 int tts = 0 << 4;
0134 pData[lastline] = tts & 0xF0;
0135
0136
0137
0138 pData[8] = event_length & 0xFF;
0139 pData[9] = (event_length >> 8) & 0xFF;
0140 pData[10] = (event_length >> 16) & 0xFF;
0141
0142
0143
0144 map<int, map<int, int> >::iterator fen = FEDorder->find(FEDid);
0145
0146 bool FED_has_data = true;
0147 if (fen == FEDorder->end())
0148 FED_has_data = false;
0149 if (debug_ && (!FED_has_data))
0150 cout << " FEDid is not in FEDorder ! " << endl;
0151 if (!FED_has_data) {
0152 int ch_status = 7;
0153 for (int iFE = 1; iFE <= 68; iFE++) {
0154 int irow = (iFE - 1) / 14;
0155 int kval = ((iFE - 1) % 14) / 2;
0156 if (iFE % 2 == 1)
0157 pData[32 + 8 * irow + kval] |= ch_status & 0xFF;
0158 else
0159 pData[32 + 8 * irow + kval] |= ((ch_status << 4) & 0xFF);
0160 }
0161 }
0162
0163 if (FED_has_data) {
0164 map<int, int>& FEorder = (*fen).second;
0165
0166 for (int iFE = 1; iFE <= 68; iFE++) {
0167 map<int, int>::iterator fe = FEorder.find(iFE);
0168 int ch_status = 0;
0169 if (fe == FEorder.end())
0170 ch_status = 7;
0171 int irow = (iFE - 1) / 14;
0172 int kval = ((iFE - 1) % 14) / 2;
0173 if (iFE % 2 == 1)
0174 pData[32 + 8 * irow + kval] |= ch_status & 0xFF;
0175 else
0176 pData[32 + 8 * irow + kval] |= ((ch_status << 4) & 0xFF);
0177 }
0178 }
0179 }
0180 }
0181
0182 void BlockFormatter::PrintSizes(FEDRawDataCollection* productRawData) {
0183 for (int id = 0; id < 36 + 18; id++) {
0184
0185
0186
0187 int FEDid = FEDNumbering::MINECALFEDID + id;
0188 FEDRawData& rawdata = productRawData->FEDData(FEDid);
0189 if (rawdata.size() > 0)
0190 cout << "Size of FED id " << dec << FEDid << " is : " << dec << rawdata.size() << endl;
0191 }
0192 }