Back to home page

Project CMSSW displayed by LXR

 
 

    


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 * DAQSource data model classes for reading Run3 FRD format and unpacking into the FedRawDataCollection
0006 * FRD: standard readout of input from the event builder
0007 * FRDPreUNpack: variant unpacking events tns nto FedRawDataCollection class in reader threads
0008 * FRSStiped: more generic version able to read from multiple source
0009 * directories (Super-Fragmeng Builder DAQ)
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  * FRD unpacker equivalent to the FedRawDataInputSource
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   //non-virtual
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   //bool isRealData() const override { return event_->isRealData(); }
0056 
0057   uint32_t run() const override { return event_->run(); }
0058 
0059   //true for DAQ3 FRD
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  * FRD source prebuffering in the reader thread
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   //non-virtual
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   //used
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   //true for DAQ3 FRD
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  * FRD source reading files from multiple striped destinations (Super-Fragment Builder DAQ)
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   //non-virtual
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     //just get first event size
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   //bool isRealData() const override {
0227   //  assert(!events_.empty());
0228   //  return events_[0]->isRealData();
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  // EventFilter_Utilities_DAQSourceModelsFRD_h