#ifndef __JFRAME__ #define __JFRAME__ #include #include "JDAQ/JDAQClock.hh" #include "JDAQ/JDAQChronometer.hh" #include "JDAQ/JDAQPMTIdentifier.hh" #include "JDAQ/JDAQSuperFrameHeader.hh" #include "JGeometry3D/JAxis3D.hh" #include "JTrigger/JHitToolkit.hh" #include "JTrigger/JCalibration.hh" namespace JTRIGGER { namespace { using KM3NETDAQ::JDAQChronometer; using KM3NETDAQ::JDAQPMTIdentifier; using KM3NETDAQ::JDAQSuperFrameHeader; using KM3NETDAQ::getFrameTime; using JGEOMETRY3D::JAxis3D; } /** * Data frame of one PMT. */ template > class JFrame : public JDAQChronometer, public JDAQPMTIdentifier, public JAxis3D, public JCalibration, public std::vector, public JHitToolkit { public: using std::vector::push_back; /** * Default constructor. */ JFrame() : JDAQChronometer (), JDAQPMTIdentifier(), JAxis3D (), JCalibration (), std::vector(), JHitToolkit() {} /** * Constructor. * * \param chronometer DAQ chronometer * \param pmt PMT identifier * \param axis PMT axis */ JFrame(const JDAQChronometer& chronometer, const JDAQPMTIdentifier& pmt, const JAxis3D& axis) : JDAQChronometer (chronometer), JDAQPMTIdentifier(pmt), JAxis3D (axis), JCalibration (), std::vector(), JHitToolkit() {} /** * Constructor. * * \param chronometer DAQ chronometer * \param pmt PMT identifier * \param axis PMT axis * \param calibration calibration */ JFrame(const JDAQChronometer& chronometer, const JDAQPMTIdentifier& pmt, const JAxis3D& axis, const JCalibration& calibration) : JDAQChronometer (chronometer), JDAQPMTIdentifier(pmt), JAxis3D (axis), JCalibration (calibration), std::vector(), JHitToolkit() {} /** * Get data. * * \return data */ const std::vector& getData() const { return static_cast&>(*this); } /** * Get data. * * \return data */ std::vector& getData() { return static_cast&>(*this); } /** * Add DAQ hit. * The (time) calibration is applied before the hit is appended to the existing list. * * \param hit DAQ hit */ void push_back(const JDAQHit& hit) { std::vector::push_back(this->getHit(hit, this->getCalibration())); } /** * Put end marker to data. */ void putEndMarker() { this->push_back(this->getEndMarker()); } /** * Apply high-rate veto. * If vetoed, the contents of this frame is reduced to a single end marker. * * \param rate_Hz high-rate veto [Hz] * \return true if veto; else false */ bool applyHighRateVeto(const double rate_Hz) { if (this->size() * 1.0e9 / getFrameTime() > rate_Hz) { this->clear(); this->putEndMarker(); return true; } else return false; } }; } #endif