#pragma once #include "TbRawFile.h" #include "Event/TbHit.h" #include "Event/TbTrigger.h" #include "TbKernel/TbFunctors.h" #include "GaudiAlg/GaudiTool.h" #include "TbKernel/TbConstants.h" static const InterfaceID IID_TbRawStream("TbRawStream", 1, 0); class TbRawStream : public GaudiTool { public: /// Constructor TbRawStream(const std::string& type, const std::string& name, const IInterface* parent); static const InterfaceID& interfaceID() { return IID_TbRawStream; } uint64_t timer() const { return m_timer; } unsigned int lsb() const { return m_lsb; } // this is for explicitly setting the clock, if device sync fails void setGlobalClock(const uint64_t timer) { m_timer = timer; } unsigned int size() const { return m_size; } void setLSB(const unsigned int lsb) { m_lsb = lsb; } bool setMSB(uint64_t msb); std::vector<LHCb::TbHit*>& hitCache() { return m_hitCache; } std::vector<LHCb::TbTrigger*>& trgCache() { return m_trgCache; } void addFile(TbRawFile* file) { m_files.push_back(file); } void close() { for (auto& raw_file : m_files) { if (raw_file->is_open()) raw_file->close(); } } uint64_t getNext() { return (*m_currentFile)->getNext(); } uint64_t getPrevious() { return (*m_currentFile)->getPrevious(); } bool eos() { if (unlikely( m_currentFile == m_files.end() ) ) return true; if (unlikely((*m_currentFile)->eof() == true)) { (*m_currentFile)->close(); m_currentFile++; if (m_currentFile != m_files.end()) (*m_currentFile)->initialise(); } return unlikely(m_currentFile == m_files.end()); } double hClock() const { return (double)m_timer / (double) Tb::second; } void prepare(); // these functions collectively control fast forwarding to some point in the // stream void fastForward(const uint64_t timeToSkipTo); void coarseFastForward(const double timeToSkipTo); void fineFastForward(const uint64_t timeToSkipTo); uint64_t getCurrentTime(); int addTimingPacket(const uint64_t data_packet); std::vector<TbRawFile*>& files() { return m_files; } unsigned int plane() const { return m_plane; } void setOffset(const int colOffset) { m_colOffset = colOffset; } void setDevice(const unsigned int device) { m_device = device; } void setPlane(const unsigned int plane) { m_plane = plane; } unsigned int col() const { return m_colOffset; } unsigned int device() const { return m_device; } template <typename T> std::vector<T>* cache(); void insert(LHCb::TbTrigger* packet); void insert(LHCb::TbHit* packet); uint64_t m_tpx3Timer = 0; private: static const int64_t m_tenSeconds; static const int64_t m_maxTimeDifference; std::vector<TbRawFile*>::iterator m_currentFile; std::vector<TbRawFile*> m_files; std::vector<LHCb::TbHit*> m_hitCache; std::vector<LHCb::TbTrigger*> m_trgCache; unsigned int m_plane; unsigned int m_device; uint64_t m_size = 0; /// Temporary lsb of the global timer unsigned int m_lsb = 0; uint64_t m_timer = 0; unsigned int m_colOffset; };