CMS 3D CMS Logo

SiStripFEDBufferComponents.cc

Go to the documentation of this file.
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     //if there is one 64 bit word or less, print it out
00028     if (lengthInBytes <= 8) {
00029       printHexWord(bytePointer,lengthInBytes,os);
00030     }
00031     //otherwise, print word numbers etc
00032     else {
00033       //header
00034       os << "word\tbyte\t                       \t\tbyte" << std::endl;;
00035       size_t words = lengthInBytes/8;
00036       size_t extraBytes = lengthInBytes - 8*words;
00037       //print full words
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       //print part word, if any
00045       if (extraBytes) {
00046         const size_t startByte = words*8;
00047         os << words << '\t' << startByte+8 << '\t';
00048         //padding
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     //the buffer format byte is one of the valid values if we assume the buffer is not swapped
00269     const bool validFormatByteWhenNotWordSwapped = ( (headerPointer[BUFFERFORMAT] == BUFFER_FORMAT_CODE_NEW) ||
00270                                                      (headerPointer[BUFFERFORMAT] == BUFFER_FORMAT_CODE_OLD) );
00271     //the buffer format byte is the old value if we assume the buffer is swapped
00272     const bool validFormatByteWhenWordSwapped = (headerPointer[BUFFERFORMAT^4] == BUFFER_FORMAT_CODE_OLD);
00273     //if the buffer format byte is valid if the buffer is not swapped or it is never valid
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     //if it is scope mode then return as is (it cannot be fake data)
00306     if (eventTypeNibble == READOUT_MODE_SCOPE) return FEDReadoutMode(eventTypeNibble);
00307     //if not then ignore the last bit which indicates if it is real or fake
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     //if it is scope mode then it is always real
00326     if (eventTypeNibble == READOUT_MODE_SCOPE) return DATA_TYPE_REAL;
00327     //in other modes it is the lowest order bit of event type nibble
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     //bit high means no error
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 }

Generated on Tue Jun 9 17:34:51 2009 for CMSSW by  doxygen 1.5.4