Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include "EventFilter/CSCRawToDigi/interface/CSCDDUEventData.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009
00010 #include <iostream>
00011 #include <cstdio>
00012
00013 #include "EventFilter/CSCRawToDigi/src/bitset_append.h"
00014
00015 bool CSCDDUEventData::debug = false;
00016 uint32_t CSCDDUEventData::errMask = 0xFFFFFFFF;
00017
00018
00019 CSCDDUEventData::CSCDDUEventData(const CSCDDUHeader & header)
00020 {
00021 theDDUHeader = header;
00022 }
00023
00024
00025 CSCDDUEventData::CSCDDUEventData(uint16_t *buf, CSCDCCExaminer* examiner)
00026 {
00027 unpack_data(buf, examiner);
00028 }
00029
00030 CSCDDUEventData::~CSCDDUEventData()
00031 {
00032 }
00033
00034
00035 void CSCDDUEventData::add(CSCEventData & cscData, int dmbId, int dduInput)
00036 {
00037 theDDUHeader.setDMBDAV(dduInput);
00038
00039
00040
00041 cscData.dmbHeader()->setdmbID(dmbId);
00042 cscData.setEventInformation(theDDUHeader.bxnum(), theDDUHeader.lvl1num());
00043 theData.push_back(cscData);
00044 }
00045
00046 void CSCDDUEventData::decodeStatus() const
00047 {
00048 this->decodeStatus(theDDUTrailer.errorstat());
00049 }
00050
00051 void CSCDDUEventData::decodeStatus(int code) const
00052 {
00053
00054
00055 if((code&errMask)>0)
00056 {
00057
00058 if((code&0x0000F000)>0)
00059 {
00060 if((0x00008000&code)>0)
00061 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Critical Error, ** needs reset **";
00062 if((0x00004000&code)>0)
00063 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Single Error, bad event";
00064 if((0x00002000&code)>0)
00065 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Single Warning";
00066 if((0x00001000&code)>0)
00067 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Near Full Warning";
00068 }
00069 if((code&0x00000F00)>0)
00070 {
00071 if((0x00000800&code)>0)
00072 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU 64-bit Alignment Error";
00073 if((0x00000400&code)>0)
00074 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Control DLL Error occured";
00075 if((0x00000200&code)>0)
00076 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU DMB Error occurred";
00077 if((0x00000100&code)>0)
00078 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Lost In Event Error";
00079 }
00080 if((code&0x000000F0)>0)
00081 {
00082 if((0x00000080&code)>0)
00083 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Lost In Data Error occurred";
00084 if((0x00000040&code)>0)
00085 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Timeout Error";
00086 if((0x00000020&code)>0)
00087 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " TMB or ALCT CRC Error";
00088 if((0x00000010&code)>0)
00089 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Multiple Transmit Errors";
00090 }
00091 if((code&0x0000000F)>0)
00092 {
00093 if((0x00000008&code)>0)
00094 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Sync Lost or FIFO Full Error";
00095 if((0x00000004&code)>0)
00096 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Fiber/FIFO Connection Error";
00097 if((0x00000002&code)>0)
00098 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU L1A Match Error";
00099 if((0x00000001&code)>0)
00100 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU DMB or CFEB CRC Error";
00101 }
00102 if((code&0xF0000000)>0)
00103 {
00104
00105 if((0x80000000&code)>0)
00106 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU DMB LCT/DAV/Movlp Mismatch";
00107 if((0x40000000&code)>0)
00108 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU-CFEB L1 Mismatch";
00109 if((0x20000000&code)>0)
00110 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU saw no good DMB CRCs";
00111 if((0x10000000&code)>0)
00112 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU CFEB Count Error";
00113 }
00114 if((code&0x0F000000)>0)
00115 {
00116 if((0x08000000&code)>0)
00117 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU FirstDat Error";
00118 if((0x04000000&code)>0)
00119 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU L1A-FIFO Full Error";
00120 if((0x02000000&code)>0)
00121 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Data Stuck in FIFO";
00122 if((0x01000000&code)>0)
00123 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU NoLiveFibers Error";
00124 }
00125 if((code&0x00F00000)>0)
00126 {
00127 if((0x00800000&code)>0)
00128 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Spwd single-bit Warning";
00129 if((0x00400000&code)>0)
00130 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Input FPGA Error";
00131 if((0x00200000&code)>0)
00132 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU DAQ Stop bit set";
00133 if((0x00100000&code)>0)
00134 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU DAQ says Not Ready";
00135 if((0x00300000&code)==0x00200000)
00136 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU DAQ Applied Backpressure";
00137 }
00138 if((code&0x000F0000)>0)
00139 {
00140 if((0x00080000&code)>0)
00141 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU TMB Error";
00142 if((0x00040000&code)>0)
00143 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU ALCT Error";
00144 if((0x00020000&code)>0)
00145 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Trigger Readout Wordcount Error";
00146 if((0x00010000&code)>0)
00147 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " DDU Trigger L1A Match Error";
00148 }
00149 }
00150 }
00151
00152 void CSCDDUEventData::unpack_data(uint16_t *buf, CSCDCCExaminer* examiner)
00153 {
00154
00155 uint16_t * inputBuf = buf;
00156 uint16_t * inputBuf0 = buf;
00157 theData.clear();
00158 if (debug) LogTrace ("CSCDDUEventData|CSCRawToDigi") << "CSCDDUEventData::unpack_data() is called";
00159 if (debug)
00160 for (int i=0;i<6;++i)
00161 {
00162 LogTrace ("CSCDDUEventData|CSCRawToDigi") << i << std::hex << buf[4*i+3] << buf[4*i+2]
00163 << buf[4*i+1] << buf[4*i];
00164 std::cout << i << " " << std::hex << buf[4*i+3] << " " << buf[4*i+2] << " "
00165 << buf[4*i+1] << " " << buf[4*i] << std::endl;
00166 }
00167
00168
00169 memcpy(&theDDUHeader, buf, theDDUHeader.sizeInWords()*2);
00170
00171 if (debug) {
00172 LogTrace ("CSCDDUEventData|CSCRawToDigi") << "size of ddu header in words = " << theDDUHeader.sizeInWords();
00173 LogTrace ("CSCDDUEventData|CSCRawToDigi") << "sizeof(DDUHeader) = " << sizeof(theDDUHeader);
00174 }
00175 buf += theDDUHeader.sizeInWords();
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 theData.clear();
00186 theData.reserve(theDDUHeader.ncsc());
00187
00188 if (examiner!= NULL) {
00189
00190 if (debug) LogTrace ("CSCDDUEventData|CSCRawToDigi") << "selective unpacking starting";
00191
00192
00193 DDUIdType dduID = theDDUHeader.source_id();
00194
00195 std::map<DDUIdType,std::map<CSCIdType,const uint16_t*> > ddus = examiner->DMB_block();
00196 std::map<DDUIdType,std::map<CSCIdType,const uint16_t*> >::iterator ddu_itr = ddus.find(dduID);
00197 uint16_t* dduBlock = (uint16_t*)((examiner->DDU_block())[dduID]);
00198 uint32_t dduBufSize = (examiner->DDU_size())[dduID];
00199
00200 if (ddu_itr != ddus.end() && dduBufSize!=0 && dduBlock==inputBuf) {
00201 std::map<CSCIdType,const uint16_t*> &cscs = ddu_itr->second;
00202 std::map<CSCIdType,const uint16_t*>::iterator csc_itr;
00203
00204 for (csc_itr=cscs.begin(); csc_itr != cscs.end(); ++csc_itr) {
00205 short cscid = csc_itr->first;
00206
00207 if(cscid != -1)
00208 {
00209 uint16_t* pos = (uint16_t*)csc_itr->second;
00210
00211
00212 ExaminerStatusType errors = examiner->errorsForChamber(cscid);
00213 if ((errors & examiner->getMask()) > 0 ) {
00214 if (debug)
00215 LogTrace ("CSCDDUEventData|CSCRawToDigi" )
00216 << "skip unpacking of CSC " << cscid << " due format errors: 0x" << std::hex << errors << std::dec;
00217 continue;
00218 }
00219
00220 theData.push_back(CSCEventData(pos));
00221 }
00222 }
00223
00224 if (debug)
00225 {
00226 LogTrace ("CSCDDUEventData|CSCRawToDigi") << "size of vector of cscData = " << theData.size();
00227 }
00228
00229
00230 memcpy(&theDDUTrailer, inputBuf+dduBufSize, theDDUTrailer.sizeInWords()*2);
00231
00232 if (debug) LogTrace ("CSCDDUEventData|CSCRawToDigi") << theDDUTrailer.check();
00233 errorstat=theDDUTrailer.errorstat();
00234 if ((errorstat&errMask) != 0)
00235 {
00236 if (theDDUTrailer.check())
00237 {
00238 if (debug) LogTrace ("CSCDDUEventData|CSCRawToDigi")
00239 << "+++ CSCDDUEventData warning: DDU Trailer errors = " << std::hex << errorstat << " +++ ";
00240 if (debug) decodeStatus(errorstat);
00241 }
00242 else
00243 {
00244 if (debug) LogTrace ("CSCDDUEventData|CSCRawToDigi" )
00245 << " Unpacking lost DDU trailer - check() failed and 8 8 ffff 8 was not found ";
00246 }
00247 }
00248
00249 if (debug) {
00250 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " Final errorstat " << std::hex << errorstat << std::dec ;
00251 }
00252
00253
00254
00255
00256
00257 }
00258 theSizeInWords = dduBufSize+12;
00259 buf=inputBuf+dduBufSize;
00260
00261 } else {
00262
00263
00264 while( (((buf[0]&0xf000) == 0x9000)||((buf[0]&0xf000) == 0xa000))
00265 && (buf[3] != 0x8000)) {
00266
00267 if (debug) LogTrace ("CSCDDUEventData|CSCRawToDigi") << "unpack csc data loop started";
00268 theData.push_back(CSCEventData(buf));
00269 buf += (theData.back()).size();
00270 if (debug) {
00271 LogTrace ("CSCDDUEventData|CSCRawToDigi") << "size of vector of cscData = " << theData.size();
00272 }
00273 }
00274
00275 if (debug) {
00276 LogTrace ("CSCDDUEventData|CSCRawToDigi") << "unpacking ddu trailer ";
00277 LogTrace ("CSCDDUEventData|CSCRawToDigi") << std::hex << buf[3]<<" " << buf[2]
00278 <<" " << buf[1]<<" " << buf[0];
00279 }
00280
00281
00282 memcpy(&theDDUTrailer, buf, theDDUTrailer.sizeInWords()*2);
00283 if (debug) LogTrace ("CSCDDUEventData|CSCRawToDigi") << theDDUTrailer.check();
00284 errorstat=theDDUTrailer.errorstat();
00285 if ((errorstat&errMask) != 0)
00286 {
00287 if (theDDUTrailer.check())
00288 {
00289 if (debug) LogTrace ("CSCDDUEventData|CSCRawToDigi")
00290 << "+++ CSCDDUEventData warning: DDU Trailer errors = " << std::hex << errorstat << " +++ ";
00291 if (debug) decodeStatus(errorstat);
00292 }
00293 else
00294 {
00295 if (debug) LogTrace ("CSCDDUEventData|CSCRawToDigi" )
00296 << " Unpacking lost DDU trailer - check() failed and 8 8 ffff 8 was not found ";
00297 }
00298 }
00299
00300 if (debug)
00301 LogTrace ("CSCDDUEventData|CSCRawToDigi") << " Final errorstat " << std::hex << errorstat << std::dec ;
00302
00303 buf += theDDUTrailer.sizeInWords();
00304
00305 theSizeInWords = buf - inputBuf;
00306 }
00307
00308
00310 theDDUTrailer0 = inputBuf0[theSizeInWords-4];
00311 }
00312
00313
00314 bool CSCDDUEventData::check() const
00315 {
00316
00317 if (debug)
00318 {
00319 LogTrace ("CSCDDUEventData|CSCRawToDigi") << sizeInWords();
00320 LogTrace ("CSCDDUEventData|CSCRawToDigi") << "wordcount = " << theDDUTrailer.wordcount()*4;
00321 }
00322
00323 return theDDUHeader.check() && theDDUTrailer.check();
00324 }
00325
00326 boost::dynamic_bitset<> CSCDDUEventData::pack()
00327 {
00328 boost::dynamic_bitset<> result = bitset_utilities::ushortToBitset( theDDUHeader.sizeInWords()*16,
00329 theDDUHeader.data());
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 for(unsigned int i = 0; i < theData.size(); ++i)
00343 {
00344 result = bitset_utilities::append(result,theData[i].pack());
00345 }
00346 theSizeInWords = result.size()/16 + theDDUTrailer.sizeInWords();
00347
00348 theDDUTrailer.setWordCount(theSizeInWords/4);
00349 boost::dynamic_bitset<> dduTrailer = bitset_utilities::ushortToBitset ( theDDUTrailer.sizeInWords()*16,
00350 theDDUTrailer.data());
00351 result = bitset_utilities::append(result,dduTrailer);
00352
00353 return result;
00354 }
00355