00001 #include "EventFilter/SiStripRawToDigi/interface/SiStripFEDBufferComponents.h"
00002 #include <iomanip>
00003 #include <ostream>
00004
00005 namespace sistrip {
00006
00007 void printHexValue(uint8_t value, std::ostream& os)
00008 {
00009 std::ios_base::fmtflags originalFormatFlags = os.flags();
00010 os << std::hex << std::setfill('0') << std::setw(2);
00011 os << uint16_t(value);
00012 os.flags(originalFormatFlags);
00013 }
00014
00015 void printHexWord(const uint8_t* pointer, size_t lengthInBytes, std::ostream& os)
00016 {
00017 size_t i = lengthInBytes-1;
00018 do{
00019 printHexValue(pointer[i],os);
00020 if (i != 0) os << " ";
00021 } while (i-- != 0);
00022 }
00023
00024 void printHex(const void* pointer, size_t lengthInBytes, std::ostream& os)
00025 {
00026 const uint8_t* bytePointer = reinterpret_cast<const uint8_t*>(pointer);
00027
00028 if (lengthInBytes <= 8) {
00029 printHexWord(bytePointer,lengthInBytes,os);
00030 }
00031
00032 else {
00033
00034 os << "word\tbyte\t \t\tbyte" << std::endl;;
00035 size_t words = lengthInBytes/8;
00036 size_t extraBytes = lengthInBytes - 8*words;
00037
00038 for (size_t w = 0; w < words; w++) {
00039 const size_t startByte = w*8;
00040 os << w << '\t' << startByte+8 << '\t';
00041 printHexWord(bytePointer+startByte,8,os);
00042 os << "\t\t" << startByte << std::endl;
00043 }
00044
00045 if (extraBytes) {
00046 const size_t startByte = words*8;
00047 os << words << '\t' << startByte+8 << '\t';
00048
00049 size_t p = 8;
00050 while (p-- > extraBytes) {
00051 os << "00 ";
00052 }
00053 printHexWord(bytePointer+startByte,extraBytes,os);
00054 os << "\t\t" << startByte << std::endl;
00055 }
00056 os << std::endl;
00057 }
00058 }
00059
00060
00061 std::ostream& operator<<(std::ostream& os, const FEDBufferFormat& value)
00062 {
00063 switch (value) {
00064 case BUFFER_FORMAT_OLD_VME:
00065 os << "Old VME";
00066 break;
00067 case BUFFER_FORMAT_OLD_SLINK:
00068 os << "Old S-Link";
00069 break;
00070 case BUFFER_FORMAT_NEW:
00071 os << "New";
00072 break;
00073 case BUFFER_FORMAT_INVALID:
00074 os << "Invalid";
00075 break;
00076 default:
00077 os << "Unrecognized";
00078 break;
00079 }
00080 return os;
00081 }
00082
00083 std::ostream& operator<<(std::ostream& os, const FEDHeaderType& value)
00084 {
00085 switch (value) {
00086 case HEADER_TYPE_FULL_DEBUG:
00087 os << "Full debug";
00088 break;
00089 case HEADER_TYPE_APV_ERROR:
00090 os << "APV error";
00091 break;
00092 case HEADER_TYPE_INVALID:
00093 os << "Invalid";
00094 break;
00095 default:
00096 os << "Unrecognized";
00097 break;
00098 }
00099 return os;
00100 }
00101
00102 std::ostream& operator<<(std::ostream& os, const FEDReadoutMode& value)
00103 {
00104 switch (value) {
00105 case READOUT_MODE_SCOPE:
00106 os << "Scope mode";
00107 break;
00108 case READOUT_MODE_VIRGIN_RAW:
00109 os << "Virgin raw";
00110 break;
00111 case READOUT_MODE_PROC_RAW:
00112 os << "Processed raw";
00113 break;
00114 case READOUT_MODE_ZERO_SUPPRESSED:
00115 os << "Zero suppressed";
00116 break;
00117 case READOUT_MODE_ZERO_SUPPRESSED_LITE:
00118 os << "Zero suppressed lite";
00119 break;
00120 case READOUT_MODE_INVALID:
00121 os << "Invalid";
00122 break;
00123 default:
00124 os << "Unrecognized";
00125 break;
00126 }
00127 return os;
00128 }
00129
00130 std::ostream& operator<<(std::ostream& os, const FEDDataType& value)
00131 {
00132 switch (value) {
00133 case DATA_TYPE_REAL:
00134 os << "Real data";
00135 break;
00136 case DATA_TYPE_FAKE:
00137 os << "Fake data";
00138 break;
00139 default:
00140 os << "Unrecognized";
00141 break;
00142 }
00143 return os;
00144 }
00145
00146 std::ostream& operator<<(std::ostream& os, const FEDDAQEventType& value)
00147 {
00148 switch (value) {
00149 case DAQ_EVENT_TYPE_PHYSICS:
00150 os << "Physics trigger";
00151 break;
00152 case DAQ_EVENT_TYPE_CALIBRATION:
00153 os << "Calibration trigger";
00154 break;
00155 case DAQ_EVENT_TYPE_TEST:
00156 os << "Test trigger";
00157 break;
00158 case DAQ_EVENT_TYPE_TECHNICAL:
00159 os << "Technical trigger";
00160 break;
00161 case DAQ_EVENT_TYPE_SIMULATED:
00162 os << "Simulated event";
00163 break;
00164 case DAQ_EVENT_TYPE_TRACED:
00165 os << "Traced event";
00166 break;
00167 case DAQ_EVENT_TYPE_ERROR:
00168 os << "Error";
00169 break;
00170 case DAQ_EVENT_TYPE_INVALID:
00171 os << "Unknown";
00172 break;
00173 default:
00174 os << "Unrecognized";
00175 break;
00176 }
00177 return os;
00178 }
00179
00180 std::ostream& operator<<(std::ostream& os, const FEDTTSBits& value)
00181 {
00182 switch (value) {
00183 case TTS_DISCONNECTED1:
00184 os << "Disconected 1";
00185 break;
00186 case TTS_WARN_OVERFLOW:
00187 os << "Warning overflow";
00188 break;
00189 case TTS_OUT_OF_SYNC:
00190 os << "Out of sync";
00191 break;
00192 case TTS_BUSY:
00193 os << "Busy";
00194 break;
00195 case TTS_READY:
00196 os << "Ready";
00197 break;
00198 case TTS_ERROR:
00199 os << "Error";
00200 break;
00201 case TTS_INVALID:
00202 os << "Invalid";
00203 break;
00204 case TTS_DISCONNECTED2:
00205 os << "Disconected 2";
00206 break;
00207 default:
00208 os << "Unrecognized";
00209 break;
00210 }
00211 return os;
00212 }
00213
00214
00215
00216
00217 void FEDStatusRegister::printFlags(std::ostream& os) const
00218 {
00219 if (slinkFullFlag()) os << "SLINK_FULL ";
00220 if (trackerHeaderMonitorDataReadyFlag()) os << "HEADER_MONITOR_READY ";
00221 if (qdrMemoryFullFlag()) os << "QDR_FULL ";
00222 if (qdrMemoryPartialFullFlag()) os << "QDR_PARTIAL_FULL ";
00223 if (qdrMemoryEmptyFlag()) os << "QDR_EMPTY ";
00224 if (l1aBxFIFOFullFlag()) os << "L1A_FULL ";
00225 if (l1aBxFIFOPartialFullFlag()) os << "L1A_PARTIAL_FULL ";
00226 if (l1aBxFIFOEmptyFlag()) os << "L1A_EMPTY ";
00227 }
00228
00229
00230
00231
00232 void FEDBackendStatusRegister::printFlags(std::ostream& os) const
00233 {
00234 if (internalFreezeFlag()) os << "INTERNAL_FREEZE ";
00235 if (slinkDownFlag()) os << "SLINK_DOWN ";
00236 if (slinkFullFlag()) os << "SLINK_FULL ";
00237 if (backpressureFlag()) os << "BACKPRESSURE ";
00238 if (ttcReadyFlag()) os << "TTC_READY ";
00239 if (trackerHeaderMonitorDataReadyFlag()) os << "HEADER_MONITOR_READY ";
00240 if (qdrMemoryFullFlag()) os << "QDR_FULL ";
00241 if (qdrMemoryPartialFullFlag()) os << "QDR_PARTIAL_FULL ";
00242 if (qdrMemoryEmptyFlag()) os << "QDR_EMPTY ";
00243 if (frameAddressFIFOFullFlag()) os << "FRAME_ADDRESS_FULL ";
00244 if (frameAddressFIFOPartialFullFlag()) os << "FRAME_ADDRESS_PARTIAL_FULL ";
00245 if (frameAddressFIFOEmptyFlag()) os << "FRAME_ADDRESS_EMPTY ";
00246 if (totalLengthFIFOFullFlag()) os << "TOTAL_LENGTH_FULL ";
00247 if (totalLengthFIFOPartialFullFlag()) os << "TOTAL_LENGTH_PARTIAL_FULL ";
00248 if (totalLengthFIFOEmptyFlag()) os << "TOTAL_LENGTH_EMPTY ";
00249 if (trackerHeaderFIFOFullFlag()) os << "TRACKER_HEADER_FULL ";
00250 if (trackerHeaderFIFOPartialFullFlag()) os << "TRACKER_HEADER_PARTIAL_FULL ";
00251 if (trackerHeaderFIFOEmptyFlag()) os << "TRACKER_HEADER_EMPTY ";
00252 if (l1aBxFIFOFullFlag()) os << "L1A_FULL ";
00253 if (l1aBxFIFOPartialFullFlag()) os << "L1A_PARTIAL_FULL ";
00254 if (l1aBxFIFOEmptyFlag()) os << "L1A_EMPTY ";
00255 if (feEventLengthFIFOFullFlag()) os << "FE_LENGTH_FULL ";
00256 if (feEventLengthFIFOPartialFullFlag()) os << "FE_LENGTH_PARTIAL_FULL ";
00257 if (feEventLengthFIFOEmptyFlag()) os << "FE_LENGTH_EMPTY ";
00258 if (feFPGAFullFlag()) os << "FE_FPGA_FULL ";
00259 if (feFPGAPartialFullFlag()) os << "FE_FPGA_PARTIAL_FULL ";
00260 if (feFPGAEmptyFlag()) os << "FE_FPGA_EMPTY ";
00261 }
00262
00263
00264
00265
00266 TrackerSpecialHeader::TrackerSpecialHeader(const uint8_t* headerPointer)
00267 {
00268
00269 const bool validFormatByteWhenNotWordSwapped = ( (headerPointer[BUFFERFORMAT] == BUFFER_FORMAT_CODE_NEW) ||
00270 (headerPointer[BUFFERFORMAT] == BUFFER_FORMAT_CODE_OLD) );
00271
00272 const bool validFormatByteWhenWordSwapped = (headerPointer[BUFFERFORMAT^4] == BUFFER_FORMAT_CODE_OLD);
00273
00274 if (validFormatByteWhenNotWordSwapped || (!validFormatByteWhenNotWordSwapped && !validFormatByteWhenWordSwapped) ) {
00275 memcpy(specialHeader_,headerPointer,8);
00276 wordSwapped_ = false;
00277 } else {
00278 memcpy(specialHeader_,headerPointer+4,4);
00279 memcpy(specialHeader_+4,headerPointer,4);
00280 wordSwapped_ = true;
00281 }
00282 }
00283
00284 FEDBufferFormat TrackerSpecialHeader::bufferFormat() const
00285 {
00286 if (bufferFormatByte() == BUFFER_FORMAT_CODE_NEW) return BUFFER_FORMAT_NEW;
00287 else if (bufferFormatByte() == BUFFER_FORMAT_CODE_OLD) {
00288 if (wordSwapped_) return BUFFER_FORMAT_OLD_VME;
00289 else return BUFFER_FORMAT_OLD_SLINK;
00290 }
00291 else return BUFFER_FORMAT_INVALID;
00292 }
00293
00294 FEDHeaderType TrackerSpecialHeader::headerType() const
00295 {
00296 if ( (headerTypeNibble() == HEADER_TYPE_FULL_DEBUG) ||
00297 (headerTypeNibble() == HEADER_TYPE_APV_ERROR) )
00298 return FEDHeaderType(headerTypeNibble());
00299 else return HEADER_TYPE_INVALID;
00300 }
00301
00302 FEDReadoutMode TrackerSpecialHeader::readoutMode() const
00303 {
00304 const uint8_t eventTypeNibble = trackerEventTypeNibble();
00305
00306 if (eventTypeNibble == READOUT_MODE_SCOPE) return FEDReadoutMode(eventTypeNibble);
00307
00308 else {
00309 const uint8_t mode = (eventTypeNibble & 0xE);
00310 switch(mode) {
00311 case READOUT_MODE_VIRGIN_RAW:
00312 case READOUT_MODE_PROC_RAW:
00313 case READOUT_MODE_ZERO_SUPPRESSED:
00314 case READOUT_MODE_ZERO_SUPPRESSED_LITE:
00315 return FEDReadoutMode(mode);
00316 default:
00317 return READOUT_MODE_INVALID;
00318 }
00319 }
00320 }
00321
00322 FEDDataType TrackerSpecialHeader::dataType() const
00323 {
00324 uint8_t eventTypeNibble = trackerEventTypeNibble();
00325
00326 if (eventTypeNibble == READOUT_MODE_SCOPE) return DATA_TYPE_REAL;
00327
00328 else return FEDDataType(eventTypeNibble & 0x1);
00329 }
00330
00331
00332
00333
00334 FEDDAQEventType FEDDAQHeader::eventType() const
00335 {
00336 switch(eventTypeNibble()) {
00337 case DAQ_EVENT_TYPE_PHYSICS:
00338 case DAQ_EVENT_TYPE_CALIBRATION:
00339 case DAQ_EVENT_TYPE_TEST:
00340 case DAQ_EVENT_TYPE_TECHNICAL:
00341 case DAQ_EVENT_TYPE_SIMULATED:
00342 case DAQ_EVENT_TYPE_TRACED:
00343 case DAQ_EVENT_TYPE_ERROR:
00344 return FEDDAQEventType(eventTypeNibble());
00345 default:
00346 return DAQ_EVENT_TYPE_INVALID;
00347 }
00348 }
00349
00350
00351
00352
00353 FEDTTSBits FEDDAQTrailer::ttsBits() const
00354 {
00355 switch(ttsNibble()) {
00356 case TTS_DISCONNECTED1:
00357 case TTS_WARN_OVERFLOW:
00358 case TTS_OUT_OF_SYNC:
00359 case TTS_BUSY:
00360 case TTS_READY:
00361 case TTS_ERROR:
00362 case TTS_DISCONNECTED2:
00363 return FEDTTSBits(ttsNibble());
00364 default:
00365 return TTS_INVALID;
00366 }
00367 }
00368
00369
00370
00371
00372 FEDAPVErrorHeader::~FEDAPVErrorHeader()
00373 {
00374 }
00375
00376 size_t FEDAPVErrorHeader::lengthInBytes() const
00377 {
00378 return APV_ERROR_HEADER_SIZE_IN_BYTES;
00379 }
00380
00381 void FEDAPVErrorHeader::print(std::ostream& os) const
00382 {
00383 printHex(header_,APV_ERROR_HEADER_SIZE_IN_BYTES,os);
00384 }
00385
00386 bool FEDAPVErrorHeader::checkStatusBits(uint8_t internalFEDChannelNum, uint8_t apvNum) const
00387 {
00388 uint8_t byteNumber = internalFEDChannelNum * 2 / 8;
00389 uint8_t bitInByte = internalFEDChannelNum * 2 % 8;
00390
00391 return (!(header_[byteNumber] & (0x1<<bitInByte) ));
00392 }
00393
00394 bool FEDAPVErrorHeader::checkChannelStatusBits(uint8_t internalFEDChannelNum) const
00395 {
00396 return (checkStatusBits(internalFEDChannelNum,0) && checkStatusBits(internalFEDChannelNum,1));
00397 }
00398
00399
00400 FEDFullDebugHeader::~FEDFullDebugHeader()
00401 {
00402 }
00403
00404 size_t FEDFullDebugHeader::lengthInBytes() const
00405 {
00406 return FULL_DEBUG_HEADER_SIZE_IN_BYTES;
00407 }
00408
00409 void FEDFullDebugHeader::print(std::ostream& os) const
00410 {
00411 printHex(header_,FULL_DEBUG_HEADER_SIZE_IN_BYTES,os);
00412 }
00413
00414 bool FEDFullDebugHeader::checkStatusBits(uint8_t internalFEDChannelNum, uint8_t apvNum) const
00415 {
00416 return ( !unlockedFromBit(internalFEDChannelNum) &&
00417 !outOfSyncFromBit(internalFEDChannelNum) &&
00418 !apvError(internalFEDChannelNum,apvNum) &&
00419 !apvAddressError(internalFEDChannelNum,apvNum) );
00420 }
00421
00422 bool FEDFullDebugHeader::checkChannelStatusBits(uint8_t internalFEDChannelNum) const
00423 {
00424 return ( !unlockedFromBit(internalFEDChannelNum) &&
00425 !outOfSyncFromBit(internalFEDChannelNum) &&
00426 !apvErrorFromBit(internalFEDChannelNum,0) &&
00427 !apvAddressErrorFromBit(internalFEDChannelNum,0) &&
00428 !apvErrorFromBit(internalFEDChannelNum,1) &&
00429 !apvAddressErrorFromBit(internalFEDChannelNum,1) );
00430 }
00431
00432 FEDFEHeader::~FEDFEHeader()
00433 {
00434 }
00435
00436 }