Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-31 04:19:42

0001 /**
0002  * This class is used to view the contents of "FED Raw Data" (FRD) events.
0003  * Initially, the only time that such events are created is
0004  * when an error occurs in the HLT.
0005  * So, in the beginning, "error event" == "FRD event".
0006  * However, if new ways of creating events of this type are added
0007  * to the HLT, hopefully this class can be used or upgraded to handle those
0008  * events as well.
0009  *
0010  */
0011 
0012 #include "IOPool/Streamer/interface/FRDEventMessage.h"
0013 #include "FWCore/Utilities/interface/Exception.h"
0014 
0015 using namespace edm::streamer;
0016 
0017 /**
0018  * Constructor for the FRD event message viewer.
0019  */
0020 FRDEventMsgView::FRDEventMsgView(void* buf)
0021     : buf_((uint8*)buf),
0022       payload_(nullptr),
0023       size_(0),
0024       version_(0),
0025       flags_(0),
0026       run_(0),
0027       lumi_(0),
0028       event_(0),
0029       eventSize_(0),
0030       paddingSize_(0),
0031       adler32_(0),
0032       crc32c_(0) {
0033   uint32* bufPtr = static_cast<uint32*>(buf);
0034 
0035   // In version one of the format, there was no version number in the data,
0036   // and the run number (32-bit) appeared first.
0037   // This format is no longer supported
0038   version_ = *(uint16*)bufPtr;
0039 
0040   if (version_ < 2 || version_ > 6) {
0041     throw cms::Exception("FRDEventMsgView") << "FRD version " << version_ << " is not supported";
0042   }
0043 
0044   // Version 6 repurposes unused high 16-bits of 32-bit version
0045   // assuming we no longer need version 1 support
0046   flags_ = *((uint16*)bufPtr + 1);
0047 
0048   if (version_ < 6 && flags_) {
0049     throw cms::Exception("FRDEventMsgView") << "FRD flags can not be used in version " << version_;
0050   }
0051 
0052   size_ = sizeof(uint32);
0053   ++bufPtr;
0054 
0055   // run number
0056   run_ = *bufPtr;
0057   size_ += sizeof(uint32);
0058   ++bufPtr;
0059 
0060   // lumi number
0061   if (version_ >= 2) {
0062     lumi_ = *bufPtr;
0063     size_ += sizeof(uint32);
0064     ++bufPtr;
0065   }
0066 
0067   // event number
0068   if (version_ == 4) {
0069     uint64 eventLow = *bufPtr;
0070     size_ += sizeof(uint32);
0071     ++bufPtr;
0072 
0073     uint64 eventHigh = *bufPtr;
0074     size_ += sizeof(uint32);
0075     ++bufPtr;
0076 
0077     event_ = (eventHigh << 32) | eventLow;
0078 
0079   } else {
0080     event_ = *bufPtr;
0081     size_ += sizeof(uint32);
0082     ++bufPtr;
0083   }
0084 
0085   if (version_ >= 3) {
0086     // event size
0087     eventSize_ = *bufPtr;
0088     size_ += sizeof(uint32) + eventSize_;
0089     ++bufPtr;
0090 
0091     if (version_ >= 5) {
0092       crc32c_ = *bufPtr;
0093       size_ += sizeof(uint32);
0094       ++bufPtr;
0095     } else {
0096       // padding size up to V4
0097       paddingSize_ = *bufPtr;
0098       size_ += sizeof(uint32) + paddingSize_;
0099       ++bufPtr;
0100 
0101       adler32_ = *bufPtr;
0102       size_ += sizeof(uint32);
0103       ++bufPtr;
0104     }
0105   } else {
0106     for (int idx = 0; idx < 1024; idx++) {
0107       size_ += sizeof(uint32);  // FED N size
0108       size_ += *bufPtr;         // FED N data
0109       eventSize_ += *bufPtr;
0110       ++bufPtr;
0111     }
0112   }
0113 
0114   payload_ = (void*)bufPtr;
0115 }