File indexing completed on 2023-03-17 11:00:26
0001 #ifndef EventFilter_Utilities_DAQSourceModelsFRD_h
0002 #define EventFilter_Utilities_DAQSourceModelsFRD_h
0003
0004 #include <filesystem>
0005
0006 #include "EventFilter/Utilities/interface/DAQSourceModels.h"
0007
0008 class FEDRawDataCollection;
0009
0010 class DataModeFRD : public DataMode {
0011 public:
0012 DataModeFRD(DAQSource* daqSource) : DataMode(daqSource) {}
0013 ~DataModeFRD() override{};
0014 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>>& makeDaqProvenanceHelpers() override;
0015 void readEvent(edm::EventPrincipal& eventPrincipal) override;
0016
0017
0018 edm::Timestamp fillFEDRawDataCollection(FEDRawDataCollection& rawData,
0019 bool& tcdsInRange,
0020 unsigned char*& tcds_pointer);
0021
0022 int dataVersion() const override { return detectedFRDversion_; }
0023 void detectVersion(unsigned char* fileBuf, uint32_t fileHeaderOffset) override {
0024 detectedFRDversion_ = *((uint16_t*)(fileBuf + fileHeaderOffset));
0025 }
0026
0027 uint32_t headerSize() const override { return FRDHeaderVersionSize[detectedFRDversion_]; }
0028
0029 bool versionCheck() const override { return detectedFRDversion_ <= FRDHeaderMaxVersion; }
0030
0031 uint64_t dataBlockSize() const override { return event_->size(); }
0032
0033 void makeDataBlockView(unsigned char* addr,
0034 size_t maxSize,
0035 std::vector<uint64_t> const& fileSizes,
0036 size_t fileHeaderSize) override {
0037 dataBlockAddr_ = addr;
0038 dataBlockMax_ = maxSize;
0039 eventCached_ = false;
0040 nextEventView();
0041 eventCached_ = true;
0042 }
0043
0044 bool nextEventView() override;
0045 bool checksumValid() override;
0046 std::string getChecksumError() const override;
0047
0048 bool isRealData() const override { return event_->isRealData(); }
0049
0050 uint32_t run() const override { return event_->run(); }
0051
0052
0053 bool dataBlockCompleted() const override { return true; }
0054
0055 bool requireHeader() const override { return true; }
0056
0057 bool fitToBuffer() const override { return false; }
0058 bool dataBlockInitialized() const override { return true; }
0059
0060 void setDataBlockInitialized(bool) override{};
0061
0062 void setTCDSSearchRange(uint16_t MINTCDSuTCAFEDID, uint16_t MAXTCDSuTCAFEDID) override {
0063 MINTCDSuTCAFEDID_ = MINTCDSuTCAFEDID;
0064 MAXTCDSuTCAFEDID_ = MAXTCDSuTCAFEDID;
0065 }
0066
0067 void makeDirectoryEntries(std::vector<std::string> const& baseDirs, std::string const& runDir) override {}
0068
0069 std::pair<bool, std::vector<std::string>> defineAdditionalFiles(std::string const& primaryName, bool) const override {
0070 return std::make_pair(true, std::vector<std::string>());
0071 }
0072
0073 private:
0074 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>> daqProvenanceHelpers_;
0075 uint16_t detectedFRDversion_ = 0;
0076 size_t headerSize_ = 0;
0077 std::unique_ptr<FRDEventMsgView> event_;
0078 uint32_t crc_ = 0;
0079 unsigned char* dataBlockAddr_ = nullptr;
0080 size_t dataBlockMax_ = 0;
0081 size_t fileHeaderSize_ = 0;
0082 uint16_t MINTCDSuTCAFEDID_ = FEDNumbering::MINTCDSuTCAFEDID;
0083 uint16_t MAXTCDSuTCAFEDID_ = FEDNumbering::MAXTCDSuTCAFEDID;
0084 bool eventCached_ = false;
0085 };
0086
0087
0088
0089
0090
0091
0092 class DataModeFRDStriped : public DataMode {
0093 public:
0094 DataModeFRDStriped(DAQSource* daqSource) : DataMode(daqSource) {}
0095 ~DataModeFRDStriped() override{};
0096 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>>& makeDaqProvenanceHelpers() override;
0097 void readEvent(edm::EventPrincipal& eventPrincipal) override;
0098
0099
0100 edm::Timestamp fillFRDCollection(FEDRawDataCollection& rawData, bool& tcdsInRange, unsigned char*& tcds_pointer);
0101
0102 int dataVersion() const override { return detectedFRDversion_; }
0103 void detectVersion(unsigned char* fileBuf, uint32_t fileHeaderOffset) override {
0104 detectedFRDversion_ = *((uint16_t*)(fileBuf + fileHeaderOffset));
0105 }
0106
0107 uint32_t headerSize() const override { return FRDHeaderVersionSize[detectedFRDversion_]; }
0108
0109 bool versionCheck() const override { return detectedFRDversion_ <= FRDHeaderMaxVersion; }
0110
0111 uint64_t dataBlockSize() const override {
0112
0113 if (events_.empty())
0114 throw cms::Exception("DataModeFRDStriped::dataBlockSize") << " empty event array";
0115 return events_[0]->size();
0116 }
0117
0118 void makeDataBlockView(unsigned char* addr,
0119 size_t maxSize,
0120 std::vector<uint64_t> const& fileSizes,
0121 size_t fileHeaderSize) override {
0122 fileHeaderSize_ = fileHeaderSize;
0123 numFiles_ = fileSizes.size();
0124
0125 dataBlockAddrs_.clear();
0126 dataBlockAddrs_.push_back(addr);
0127 dataBlockMaxAddrs_.clear();
0128 dataBlockMaxAddrs_.push_back(addr + fileSizes[0] - fileHeaderSize);
0129 auto fileAddr = addr;
0130 for (unsigned int i = 1; i < fileSizes.size(); i++) {
0131 fileAddr += fileSizes[i - 1];
0132 dataBlockAddrs_.push_back(fileAddr);
0133 dataBlockMaxAddrs_.push_back(fileAddr + fileSizes[i] - fileHeaderSize);
0134 }
0135
0136 dataBlockMax_ = maxSize;
0137 blockCompleted_ = false;
0138
0139 bool result = makeEvents();
0140 assert(result);
0141 eventCached_ = true;
0142 setDataBlockInitialized(true);
0143 }
0144
0145 bool nextEventView() override;
0146 bool checksumValid() override;
0147 std::string getChecksumError() const override;
0148
0149 bool isRealData() const override {
0150 assert(!events_.empty());
0151 return events_[0]->isRealData();
0152 }
0153
0154 uint32_t run() const override {
0155 assert(!events_.empty());
0156 return events_[0]->run();
0157 }
0158
0159 bool dataBlockCompleted() const override { return blockCompleted_; }
0160
0161 bool requireHeader() const override { return true; }
0162
0163 bool fitToBuffer() const override { return true; }
0164
0165 bool dataBlockInitialized() const override { return dataBlockInitialized_; }
0166
0167 void setDataBlockInitialized(bool val) override { dataBlockInitialized_ = val; };
0168
0169 void setTCDSSearchRange(uint16_t MINTCDSuTCAFEDID, uint16_t MAXTCDSuTCAFEDID) override {
0170 MINTCDSuTCAFEDID_ = MINTCDSuTCAFEDID;
0171 MAXTCDSuTCAFEDID_ = MAXTCDSuTCAFEDID;
0172 }
0173
0174 void makeDirectoryEntries(std::vector<std::string> const& baseDirs, std::string const& runDir) override;
0175
0176 std::pair<bool, std::vector<std::string>> defineAdditionalFiles(std::string const& primaryName,
0177 bool fileListMode) const override;
0178
0179 private:
0180 bool makeEvents();
0181 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>> daqProvenanceHelpers_;
0182 uint16_t detectedFRDversion_ = 0;
0183 size_t fileHeaderSize_ = 0;
0184 size_t headerSize_ = 0;
0185 std::vector<std::unique_ptr<FRDEventMsgView>> events_;
0186 std::string crcMsg_;
0187 unsigned char* dataBlockAddr_ = nullptr;
0188 std::vector<unsigned char*> dataBlockAddrs_;
0189 std::vector<unsigned char*> dataBlockMaxAddrs_;
0190 size_t dataBlockMax_ = 0;
0191 short numFiles_ = 0;
0192 bool dataBlockInitialized_ = false;
0193 bool blockCompleted_ = true;
0194 bool eventCached_ = false;
0195 uint16_t MINTCDSuTCAFEDID_ = FEDNumbering::MINTCDSuTCAFEDID;
0196 uint16_t MAXTCDSuTCAFEDID_ = FEDNumbering::MAXTCDSuTCAFEDID;
0197 std::vector<std::filesystem::path> buPaths_;
0198 };
0199
0200 #endif