File indexing completed on 2025-04-29 02:41:10
0001 #ifndef EventFilter_Utilities_DAQSourceModelsFRD_h
0002 #define EventFilter_Utilities_DAQSourceModelsFRD_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <filesystem>
0013 #include <queue>
0014 #include "oneapi/tbb/concurrent_unordered_set.h"
0015
0016 #include "EventFilter/Utilities/interface/DAQSourceModels.h"
0017 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0018
0019 class FEDRawDataCollection;
0020
0021
0022
0023
0024
0025 class DataModeFRD : public DataMode {
0026 public:
0027 DataModeFRD(DAQSource* daqSource, bool verifyFEDs) : DataMode(daqSource), verifyFEDs_(verifyFEDs) {}
0028 DataModeFRD(DAQSource* daqSource) : DataMode(daqSource) {}
0029 ~DataModeFRD() override {}
0030 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>>& makeDaqProvenanceHelpers() override;
0031 void readEvent(edm::EventPrincipal& eventPrincipal) override;
0032
0033
0034 edm::Timestamp fillFEDRawDataCollection(FEDRawDataCollection& rawData,
0035 bool& tcdsInRange,
0036 unsigned char*& tcds_pointer);
0037
0038 int dataVersion() const override { return detectedFRDversion_; }
0039 void detectVersion(unsigned char* fileBuf, uint32_t fileHeaderOffset) override {
0040 detectedFRDversion_ = *((uint16_t*)(fileBuf + fileHeaderOffset));
0041 }
0042
0043 uint32_t headerSize() const override { return edm::streamer::FRDHeaderVersionSize[detectedFRDversion_]; }
0044
0045 bool versionCheck() const override { return detectedFRDversion_ <= edm::streamer::FRDHeaderMaxVersion; }
0046
0047 uint64_t dataBlockSize() const override { return event_->size(); }
0048
0049 void makeDataBlockView(unsigned char* addr, RawInputFile* rawFile) override;
0050 bool nextEventView(RawInputFile*) override;
0051 bool blockChecksumValid() override { return true; }
0052 bool checksumValid() override;
0053 std::string getChecksumError() const override;
0054
0055
0056
0057 uint32_t run() const override { return event_->run(); }
0058
0059
0060 bool dataBlockCompleted() const override { return true; }
0061
0062 bool requireHeader() const override { return true; }
0063
0064 bool fitToBuffer() const override { return false; }
0065
0066 void unpackFile(RawInputFile*) override {}
0067
0068 bool dataBlockInitialized() const override { return true; }
0069
0070 void setDataBlockInitialized(bool) override {}
0071
0072 void setTCDSSearchRange(uint16_t MINTCDSuTCAFEDID, uint16_t MAXTCDSuTCAFEDID) override {
0073 MINTCDSuTCAFEDID_ = MINTCDSuTCAFEDID;
0074 MAXTCDSuTCAFEDID_ = MAXTCDSuTCAFEDID;
0075 }
0076
0077 void makeDirectoryEntries(std::vector<std::string> const& baseDirs,
0078 std::vector<int> const& numSources,
0079 std::vector<int> const& sourceIDs,
0080 std::string const& sourceIdentifier,
0081 std::string const& runDir) override {}
0082
0083 std::pair<bool, std::vector<std::string>> defineAdditionalFiles(std::string const& primaryName, bool) const override {
0084 return std::make_pair(true, std::vector<std::string>());
0085 }
0086
0087 private:
0088 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>> daqProvenanceHelpers_;
0089 uint16_t detectedFRDversion_ = 0;
0090 size_t headerSize_ = 0;
0091 std::unique_ptr<edm::streamer::FRDEventMsgView> event_;
0092 uint32_t crc_ = 0;
0093 unsigned char* dataBlockAddr_ = nullptr;
0094 size_t dataBlockMax_ = 0;
0095 size_t fileHeaderSize_ = 0;
0096 uint16_t MINTCDSuTCAFEDID_ = FEDNumbering::MINTCDSuTCAFEDID;
0097 uint16_t MAXTCDSuTCAFEDID_ = FEDNumbering::MAXTCDSuTCAFEDID;
0098 bool eventCached_ = false;
0099 std::unordered_set<unsigned short> fedIdSet_;
0100 unsigned int expectedFedsInEvent_ = 0;
0101 bool verifyFEDs_ = true;
0102 };
0103
0104
0105
0106
0107
0108 class DataModeFRDPreUnpack : public DataMode {
0109 public:
0110 DataModeFRDPreUnpack(DAQSource* daqSource, bool verifyFEDs) : DataMode(daqSource), verifyFEDs_(verifyFEDs) {}
0111 ~DataModeFRDPreUnpack() override {};
0112 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>>& makeDaqProvenanceHelpers() override;
0113 void readEvent(edm::EventPrincipal& eventPrincipal) override;
0114
0115
0116 void unpackEvent(edm::streamer::FRDEventMsgView* eview, UnpackedRawEventWrapper* ec, unsigned int ls);
0117 void unpackFile(RawInputFile*) override;
0118 edm::Timestamp fillFEDRawDataCollection(edm::streamer::FRDEventMsgView* eview,
0119 FEDRawDataCollection& rawData,
0120 bool& tcdsInRange,
0121 unsigned char*& tcds_pointer,
0122 bool& err,
0123 std::string& errmsg);
0124
0125 int dataVersion() const override { return detectedFRDversion_; }
0126 void detectVersion(unsigned char* fileBuf, uint32_t fileHeaderOffset) override {
0127 detectedFRDversion_ = *((uint16_t*)(fileBuf + fileHeaderOffset));
0128 }
0129
0130 uint32_t headerSize() const override { return edm::streamer::FRDHeaderVersionSize[detectedFRDversion_]; }
0131
0132 bool versionCheck() const override { return detectedFRDversion_ <= edm::streamer::FRDHeaderMaxVersion; }
0133
0134
0135 uint64_t dataBlockSize() const override { return event_->size(); }
0136
0137 void makeDataBlockView(unsigned char* addr, RawInputFile* rawFile) override;
0138 bool nextEventView(RawInputFile*) override;
0139 bool blockChecksumValid() override { return true; }
0140 bool checksumValid() override;
0141 std::string getChecksumError() const override;
0142
0143 uint32_t run() const override { return ec_->run(); }
0144
0145
0146 bool dataBlockCompleted() const override { return true; }
0147
0148 bool requireHeader() const override { return true; }
0149
0150 bool fitToBuffer() const override { return true; }
0151
0152 bool dataBlockInitialized() const override { return true; }
0153
0154 void setDataBlockInitialized(bool) override {};
0155
0156 void setTCDSSearchRange(uint16_t MINTCDSuTCAFEDID, uint16_t MAXTCDSuTCAFEDID) override {
0157 MINTCDSuTCAFEDID_ = MINTCDSuTCAFEDID;
0158 MAXTCDSuTCAFEDID_ = MAXTCDSuTCAFEDID;
0159 }
0160
0161 void makeDirectoryEntries(std::vector<std::string> const& baseDirs,
0162 std::vector<int> const& numSources,
0163 std::vector<int> const& sourceIDs,
0164 std::string const& sourceIdentifier,
0165 std::string const& runDir) override {}
0166
0167 std::pair<bool, std::vector<std::string>> defineAdditionalFiles(std::string const& primaryName, bool) const override {
0168 return std::make_pair(true, std::vector<std::string>());
0169 }
0170
0171 private:
0172 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>> daqProvenanceHelpers_;
0173 uint16_t detectedFRDversion_ = 0;
0174 size_t headerSize_ = 0;
0175 std::unique_ptr<edm::streamer::FRDEventMsgView> event_;
0176 std::unique_ptr<UnpackedRawEventWrapper> ec_;
0177 uint32_t crc_ = 0;
0178 unsigned char* dataBlockAddr_ = nullptr;
0179 size_t dataBlockMax_ = 0;
0180 size_t fileHeaderSize_ = 0;
0181 uint16_t MINTCDSuTCAFEDID_ = FEDNumbering::MINTCDSuTCAFEDID;
0182 uint16_t MAXTCDSuTCAFEDID_ = FEDNumbering::MAXTCDSuTCAFEDID;
0183 bool eventCached_ = false;
0184 oneapi::tbb::concurrent_unordered_set<unsigned short> fedIdSet_;
0185 std::atomic<unsigned int> expectedFedsInEvent_ = 0;
0186 bool verifyFEDs_ = true;
0187 };
0188
0189
0190
0191
0192
0193
0194 class DataModeFRDStriped : public DataMode {
0195 public:
0196 DataModeFRDStriped(DAQSource* daqSource, bool verifyFEDs) : DataMode(daqSource), verifyFEDs_(verifyFEDs) {}
0197 ~DataModeFRDStriped() override {}
0198 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>>& makeDaqProvenanceHelpers() override;
0199 void readEvent(edm::EventPrincipal& eventPrincipal) override;
0200
0201
0202 edm::Timestamp fillFRDCollection(FEDRawDataCollection& rawData, bool& tcdsInRange, unsigned char*& tcds_pointer);
0203
0204 int dataVersion() const override { return detectedFRDversion_; }
0205 void detectVersion(unsigned char* fileBuf, uint32_t fileHeaderOffset) override {
0206 detectedFRDversion_ = *((uint16_t*)(fileBuf + fileHeaderOffset));
0207 }
0208
0209 uint32_t headerSize() const override { return edm::streamer::FRDHeaderVersionSize[detectedFRDversion_]; }
0210
0211 bool versionCheck() const override { return detectedFRDversion_ <= edm::streamer::FRDHeaderMaxVersion; }
0212
0213 uint64_t dataBlockSize() const override {
0214
0215 if (events_.empty())
0216 throw cms::Exception("DataModeFRDStriped::dataBlockSize") << " empty event array";
0217 return events_[0]->size();
0218 }
0219
0220 void makeDataBlockView(unsigned char* addr, RawInputFile* rawFile) override;
0221 bool nextEventView(RawInputFile*) override;
0222 bool blockChecksumValid() override { return true; }
0223 bool checksumValid() override;
0224 std::string getChecksumError() const override;
0225
0226
0227
0228
0229
0230
0231 uint32_t run() const override {
0232 assert(!events_.empty());
0233 return events_[0]->run();
0234 }
0235
0236 bool dataBlockCompleted() const override { return blockCompleted_; }
0237
0238 bool requireHeader() const override { return true; }
0239
0240 bool fitToBuffer() const override { return true; }
0241
0242 void unpackFile(RawInputFile*) override {}
0243
0244 bool dataBlockInitialized() const override { return dataBlockInitialized_; }
0245
0246 void setDataBlockInitialized(bool val) override { dataBlockInitialized_ = val; }
0247
0248 void setTCDSSearchRange(uint16_t MINTCDSuTCAFEDID, uint16_t MAXTCDSuTCAFEDID) override {
0249 MINTCDSuTCAFEDID_ = MINTCDSuTCAFEDID;
0250 MAXTCDSuTCAFEDID_ = MAXTCDSuTCAFEDID;
0251 }
0252
0253 void makeDirectoryEntries(std::vector<std::string> const& baseDirs,
0254 std::vector<int> const& numSources,
0255 std::vector<int> const& sourceIDs,
0256 std::string const& sourceIdentifier,
0257 std::string const& runDir) override;
0258
0259 std::pair<bool, std::vector<std::string>> defineAdditionalFiles(std::string const& primaryName,
0260 bool fileListMode) const override;
0261
0262 private:
0263 bool makeEvents();
0264 std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>> daqProvenanceHelpers_;
0265 uint16_t detectedFRDversion_ = 0;
0266 size_t fileHeaderSize_ = 0;
0267 size_t headerSize_ = 0;
0268 std::vector<std::unique_ptr<edm::streamer::FRDEventMsgView>> events_;
0269 std::string crcMsg_;
0270 unsigned char* dataBlockAddr_ = nullptr;
0271 std::vector<unsigned char*> dataBlockAddrs_;
0272 std::vector<unsigned char*> dataBlockMaxAddrs_;
0273 size_t dataBlockMax_ = 0;
0274 short numFiles_ = 0;
0275 bool dataBlockInitialized_ = false;
0276 bool blockCompleted_ = true;
0277 bool eventCached_ = false;
0278 uint16_t MINTCDSuTCAFEDID_ = FEDNumbering::MINTCDSuTCAFEDID;
0279 uint16_t MAXTCDSuTCAFEDID_ = FEDNumbering::MAXTCDSuTCAFEDID;
0280 std::vector<std::filesystem::path> buPaths_;
0281 std::unordered_set<unsigned short> fedIdSet_;
0282 unsigned int expectedFedsInEvent_ = 0;
0283 bool verifyFEDs_ = true;
0284 };
0285
0286 #endif