Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-10-25 09:53:46

0001 #ifndef IOPool_Streamer_FRDFileHeader_h
0002 #define IOPool_Streamer_FRDFileHeader_h
0003 
0004 #include <array>
0005 #include <cstddef>
0006 #include <cstdint>
0007 
0008 /*
0009  * FRD File Header optionally found at the beginning of the FRD RAW file
0010  *
0011  * Version 1 Format:
0012  *   uint8_t [4] - id contanining 4 characters: 0x52, 0x41, 0x57, 0x5f  "RAW_"
0013  *   uint8_t [4] - version string 4 characters: 0x30, 0x30, 0x30, 0x31  "0001"
0014  *   uint16_t - header size: 24
0015  *   uint16_t - number of events in the RAW file
0016  *   uint32_t - lumisection
0017  *   uint64_t - total size of the raw file (including header)
0018  *
0019  * */
0020 
0021 constexpr std::array<unsigned char, 4> FRDFileHeader_id{{0x52, 0x41, 0x57, 0x5f}};
0022 constexpr std::array<unsigned char, 4> FRDFileVersion_1{{0x30, 0x30, 0x30, 0x31}};
0023 constexpr std::array<unsigned char, 4> FRDFileVersion_2{{0x30, 0x30, 0x30, 0x32}};
0024 
0025 struct FRDFileHeaderIdentifier {
0026   FRDFileHeaderIdentifier(const std::array<uint8_t, 4>& id, const std::array<uint8_t, 4>& version)
0027       : id_(id), version_(version) {}
0028 
0029   std::array<uint8_t, 4> id_;
0030   std::array<uint8_t, 4> version_;
0031 };
0032 
0033 struct FRDFileHeaderContent_v1 {
0034   FRDFileHeaderContent_v1(uint16_t eventCount, uint32_t lumiSection, uint64_t fileSize)
0035       : headerSize_(sizeof(FRDFileHeaderContent_v1) + sizeof(FRDFileHeaderIdentifier)),
0036         eventCount_(eventCount),
0037         lumiSection_(lumiSection),
0038         fileSize_(fileSize) {}
0039 
0040   uint16_t headerSize_;
0041   uint16_t eventCount_;
0042   uint32_t lumiSection_;
0043   uint64_t fileSize_;
0044 };
0045 
0046 struct FRDFileHeader_v1 {
0047   FRDFileHeader_v1(uint16_t eventCount, uint32_t lumiSection, uint64_t fileSize)
0048       : id_(FRDFileHeader_id, FRDFileVersion_1), c_(eventCount, lumiSection, fileSize) {}
0049 
0050   FRDFileHeaderIdentifier id_;
0051   FRDFileHeaderContent_v1 c_;
0052 };
0053 
0054 struct FRDFileHeaderContent_v2 {
0055   FRDFileHeaderContent_v2(
0056       uint16_t dataType, uint16_t eventCount, uint32_t runNumber, uint32_t lumiSection, uint64_t fileSize)
0057       : headerSize_(sizeof(FRDFileHeaderContent_v2) + sizeof(FRDFileHeaderIdentifier)),
0058         dataType_(dataType),
0059         eventCount_(eventCount),
0060         runNumber_(runNumber),
0061         lumiSection_(lumiSection),
0062         fileSize_(fileSize) {}
0063 
0064   uint16_t headerSize_;
0065   uint16_t dataType_;
0066   uint32_t eventCount_;
0067   uint32_t runNumber_;
0068   uint32_t lumiSection_;
0069   uint64_t fileSize_;
0070 };
0071 
0072 struct FRDFileHeader_v2 {
0073   FRDFileHeader_v2(uint16_t dataType, uint16_t eventCount, uint32_t runNumber, uint32_t lumiSection, uint64_t fileSize)
0074       : id_(FRDFileHeader_id, FRDFileVersion_2), c_(dataType, eventCount, runNumber, lumiSection, fileSize) {}
0075 
0076   FRDFileHeaderIdentifier id_;
0077   FRDFileHeaderContent_v2 c_;
0078 };
0079 
0080 inline uint16_t getFRDFileHeaderVersion(const std::array<uint8_t, 4>& id, const std::array<uint8_t, 4>& version) {
0081   size_t i;
0082   for (i = 0; i < 4; i++)
0083     if (id[i] != FRDFileHeader_id[i])
0084       return 0;  //not FRD file header
0085   uint16_t ret = 0;
0086   for (i = 0; i < 4; i++) {
0087     if (version[i] > '9' || version[i] < '0')
0088       return 0;  //NaN sequence
0089     ret = ret * 10 + (uint16_t)(version[i] - '0');
0090   }
0091   return ret;
0092 }
0093 
0094 #endif