diff --git a/sbnobj/SBND/Timing/FrameShiftInfo.cxx b/sbnobj/SBND/Timing/FrameShiftInfo.cxx index 3c328c11..0617c974 100644 --- a/sbnobj/SBND/Timing/FrameShiftInfo.cxx +++ b/sbnobj/SBND/Timing/FrameShiftInfo.cxx @@ -12,16 +12,15 @@ #include "sbnobj/SBND/Timing/FrameShiftInfo.hh" namespace sbnd::timing { - - FrameShiftInfo::FrameShiftInfo(uint16_t timingType, double frameTdcCrtt1, double frameTdcBes, double frameTdcRwm, double frameHltCrtt1, double frameHltBeamGate, double frameApplyAtCaf) - : fTimingType(timingType) - , fFrameTdcCrtt1(frameTdcCrtt1) - , fFrameTdcBes(frameTdcBes) - , fFrameTdcRwm(frameTdcRwm) - , fFrameHltCrtt1(frameHltCrtt1) - , fFrameHltBeamGate(frameHltBeamGate) - , fFrameApplyAtCaf(frameApplyAtCaf) - {} + FrameShiftInfo::FrameShiftInfo(uint64_t frameCrtt1, uint16_t timingTypeCrtt1, uint16_t timingChannelCrtt1, + uint64_t frameBeamGate, uint16_t timingTypeBeamGate, uint16_t timingChannelBeamGate, + uint64_t frameEtrig, uint16_t timingTypeEtrig, uint16_t timingChannelEtrig, + uint64_t frameDefault, uint16_t timingTypeDefault, uint16_t timingChannelDefault) + : fFrameCrtt1(frameCrtt1), fTimingTypeCrtt1(timingTypeCrtt1), fTimingChannelCrtt1(timingChannelCrtt1), + fFrameBeamGate(frameBeamGate), fTimingTypeBeamGate(timingTypeBeamGate), fTimingChannelBeamGate(timingChannelBeamGate), + fFrameEtrig(frameEtrig), fTimingTypeEtrig(timingTypeEtrig), fTimingChannelEtrig(timingChannelEtrig), + fFrameDefault(frameDefault), fTimingTypeDefault(timingTypeDefault), fTimingChannelDefault(timingChannelDefault) + {} } #endif diff --git a/sbnobj/SBND/Timing/FrameShiftInfo.hh b/sbnobj/SBND/Timing/FrameShiftInfo.hh index a7730a3f..952ca195 100644 --- a/sbnobj/SBND/Timing/FrameShiftInfo.hh +++ b/sbnobj/SBND/Timing/FrameShiftInfo.hh @@ -12,32 +12,84 @@ #include #include +#include "sbnobj/SBND/Timing/TimingInfo.hh" + namespace sbnd::timing { /** - * @brief A class to store the shifts across different time reference frames in SBND Data + * @brief A class to store reference frames in SBND Data + * + * Each reference frame is in UNIX timestamp format [ns] + * Store duplicated information from TimingInfo.hh for easier access at downstream modules. + * + * Reference frames included: + * + * CRT T1 signal frame: + * - Either from TDC or PTB HLT, TDC has higher priority if both are available + * - If selected, TDC CRT T1 frame is shifted to agree with HLT CRT T1 frame + * - Both unshifted TDC CRT T1 and HLT CRT T1 timestamps are saved in TimingInfo + * + * Beam Gate frame: differs between beam vs offbeam stream + * - Beam stream: + * - Either from TDC RWM or PTB HLT Gate, TDC RWM has higher priority if both are available + * - If selected, TDC RWM is shifted to agree with HLT Beam Gate frame + * - Both unshifted TDC RWM and HLT Beam Gate timestamps are saved in TimingInfo + * - Offbeam stream: + * - From PTB HLT Gate only + * - Saved in TimingInfo + * + * ETRIG frame: + * - Either from TDC or PTB HLT, TDC has higher priority if both are available + * - If selected, TDC ETRIG frame is shifted to agree with HLT ETRIG frame + * - Both unshifted TDC ETRIG and HLT ETRIG timestamps are saved in TimingInfo + * + * Default frame: depends on the stream type + * - Beam stream: use Beam Gate frame + * - Offbeam stream: use Beam Gate frame + * - Xmuon stream: use ETRIG frame * - * Each shift is in [ns] - * + * Timing Type indicates which source the frame is derived from: + * 0 - SPEC TDC + * 1 - PTB HLT + * 2 - No frame found + * std::numeric_limits::max() - Not initialized + * + * Timing Channel incicates which channel the frame is derived from: + * SPEC TDC: indicates which input channel 0 to 4 + * PTB: indicates the High Level Trigger (HLT) type + * * For more information, see + * [SBN DOCDB ???] ????? + * Legacy -- no longer applied: * [SBN DocDB 43090](https://sbn-docdb.fnal.gov/cgi-bin/sso/ShowDocument?docid=43090). */ + enum TimingType : uint16_t { + kSPECTDCType, + kPTBHLTType, + kNoShiftType, + kInvalidType = std::numeric_limits::max() + }; + + static constexpr uint16_t kInvalidChannel = std::numeric_limits::max(); + class FrameShiftInfo { - - public: - static constexpr uint16_t InvalidTimingType = 99; ///< Invalid timing type for decoded frame - static constexpr uint64_t NoShift = 0; ///< No shift. - private: + uint64_t fFrameCrtt1 = kInvalidTimestamp; ///< Frame for CRT T1 signal [ns] + uint16_t fTimingTypeCrtt1 = kInvalidType; ///< Types of CRT T1 frame + uint16_t fTimingChannelCrtt1 = kInvalidChannel; ///< Channel of CRT T1 frame + + uint64_t fFrameBeamGate = kInvalidTimestamp; ///< Frame for Beam Gate [ns] + uint16_t fTimingTypeBeamGate = kInvalidType; ///< Types of Beam Gate frame + uint16_t fTimingChannelBeamGate = kInvalidChannel; ///< Channel of Beam Gate frame + + uint64_t fFrameEtrig = kInvalidTimestamp; ///< Frame for ETRIG [ns] + uint16_t fTimingTypeEtrig = kInvalidType; ///< Types of ETRIG frame + uint16_t fTimingChannelEtrig = kInvalidChannel; ///< Channel of ETRIG frame - uint16_t fTimingType = InvalidTimingType; ///< Types of decoded frames: 0 - SPEC TDC ETRIG, 1 - HLT ETRIG, 2 - Do Nothing - double fFrameTdcCrtt1 = NoShift; ///< Shift from decoded frame to SPEC-TDC CRT T1 [ns] - double fFrameTdcBes = NoShift; ///< Shift from decoded frame to SPEC-TDC BES [ns] - double fFrameTdcRwm = NoShift; ///< Shift from decoded frame to SPEC-TDC RWM [ns] - double fFrameHltCrtt1 = NoShift; ///< Shift from decoded frame to HLT CRT T1 [ns] - double fFrameHltBeamGate = NoShift; ///< Shift from decoded frame to HLT Beam Gate [ns] - double fFrameApplyAtCaf = NoShift; ///< Frame to shift to when running at CAF stage + uint64_t fFrameDefault = kInvalidTimestamp; ///< Default frame depending on the stream type [ns] + uint16_t fTimingTypeDefault = kInvalidType; ///< Types of default frame + uint16_t fTimingChannelDefault = kInvalidChannel; ///< Channel of default frame public: @@ -49,36 +101,64 @@ namespace sbnd::timing { /** * Constructor to set all frames * - * @param timingType Types of decoded frames - * @param frameTdcCrtt1 Shift from decoded frame to SPEC-TDC CRT T1 [ns] - * @param frameTdcBes Shift from decoded frame to SPEC-TDC BES [ns] - * @param frameTdcRwm Shift from decoded frame to SPEC-TDC RWM [ns] - * @param frameHltCrtt1 Shift from decoded frame to HLT CRT T1 [ns] - * @param frameHltBeamGate Shift from decoded frame to HLT Beam Gate [ns] - * @param frameApplyAtCaf Frame to shift to when running at CAF stage + * @param frameCrtt1 Frame for CRT T1 [ns] + * @param timingTypeCrtt1 Timing type for CRT T1 frame + * @param timingChannelCrtt1 Timing channel for CRT T1 frame + * + * @param frameBeamGate Frame for Beam Gate [ns] + * @param timingTypeBeamGate Timing type for Beam Gate frame + * @param timingChannelBeamGate Timing channel for Beam Gate frame + * + * @param frameEtrig Frame for ETRIG [ns] + * @param timingTypeEtrig Timing type for ETRIG frame + * @param timingChannelEtrig Timing channel for ETRIG frame + * + * @param frameDefault Default frame depending on the stream [ns] + * @param timingTypeDefault Timing type for Default frame + * @param timingChannelDefault Timing channel for Default frame + * */ - FrameShiftInfo(uint16_t timingType, double frameTdcCrtt1, double frameTdcBes, double frameTdcRwm, double frameHltCrtt1, double frameHltBeamGate, double frameApplyAtCaf); + FrameShiftInfo(uint64_t frameCrtt1, uint16_t timingTypeCrtt1, uint16_t timingChannelCrtt1, + uint64_t frameBeamGate, uint16_t timingTypeBeamGate, uint16_t timingChannelBeamGate, + uint64_t frameEtrig, uint16_t timingTypeEtrig, uint16_t timingChannelEtrig, + uint64_t frameDefault, uint16_t timingTypeDefault, uint16_t timingChannelDefault); /// @name Getters /// @{ - uint16_t TimingType() const { return fTimingType; } - double FrameTdcCrtt1() const { return fFrameTdcCrtt1; } - double FrameTdcBes() const { return fFrameTdcBes; } - double FrameTdcRwm() const { return fFrameTdcRwm; } - double FrameHltCrtt1() const { return fFrameHltCrtt1;} - double FrameHltBeamGate() const { return fFrameHltBeamGate; } - double FrameApplyAtCaf() const { return fFrameApplyAtCaf; } + uint64_t FrameCrtt1() const { return fFrameCrtt1; } + uint16_t TimingTypeCrtt1() const { return fTimingTypeCrtt1; } + uint16_t TimingChannelCrtt1() const { return fTimingChannelCrtt1; } + + uint64_t FrameBeamGate() const { return fFrameBeamGate; } + uint16_t TimingTypeBeamGate() const { return fTimingTypeBeamGate; } + uint16_t TimingChannelBeamGate() const { return fTimingChannelBeamGate; } + + uint64_t FrameEtrig() const { return fFrameEtrig; } + uint16_t TimingTypeEtrig() const { return fTimingTypeEtrig; } + uint16_t TimingChannelEtrig() const { return fTimingChannelEtrig; } + + uint64_t FrameDefault() const { return fFrameDefault; } + uint16_t TimingTypeDefault() const { return fTimingTypeDefault; } + uint16_t TimingChannelDefault() const { return fTimingChannelDefault; } /// @} /// @name Setters /// @{ - void SetTimingType(uint16_t type){ fTimingType = type; } - void SetFrameTdcCrtt1(double frame){ fFrameTdcCrtt1 = frame; } - void SetFrameTdcBes(double frame){ fFrameTdcBes = frame; } - void SetFrameTdcRwm(double frame){ fFrameTdcRwm = frame; } - void SetFrameHltCrtt1(double frame){ fFrameHltCrtt1 = frame; } - void SetFrameHltBeamGate(double frame){ fFrameHltBeamGate = frame; } - void SetFrameApplyAtCaf(double frame){ fFrameApplyAtCaf = frame; } + void SetFrameCrtt1(uint64_t frame){ fFrameCrtt1 = frame; } + void SetTimingTypeCrtt1(uint16_t type){ fTimingTypeCrtt1 = type; } + void SetTimingChannelCrtt1(uint16_t channel){ fTimingChannelCrtt1 = channel; } + + void SetFrameBeamGate(uint64_t frame){ fFrameBeamGate = frame; } + void SetTimingTypeBeamGate(uint16_t type){ fTimingTypeBeamGate = type; } + void SetTimingChannelBeamGate(uint16_t channel){ fTimingChannelBeamGate = channel; } + + void SetFrameEtrig(uint64_t frame){ fFrameEtrig = frame; } + void SetTimingTypeEtrig(uint16_t type){ fTimingTypeEtrig = type; } + void SetTimingChannelEtrig(uint16_t channel){ fTimingChannelEtrig = channel; } + + void SetFrameDefault(uint64_t frame){ fFrameDefault = frame; } + void SetTimingTypeDefault(uint16_t type){ fTimingTypeDefault = type; } + void SetTimingChannelDefault(uint16_t channel){ fTimingChannelDefault = channel; } /// @} }; } diff --git a/sbnobj/SBND/Timing/TimingInfo.cxx b/sbnobj/SBND/Timing/TimingInfo.cxx index 84ba5dd4..3409238e 100644 --- a/sbnobj/SBND/Timing/TimingInfo.cxx +++ b/sbnobj/SBND/Timing/TimingInfo.cxx @@ -13,7 +13,9 @@ namespace sbnd::timing { - TimingInfo::TimingInfo(uint64_t rawDAQHeaderTimestamp, uint64_t tdcCrtt1, uint64_t tdcBes, uint64_t tdcRwm, uint64_t tdcEtrig, uint64_t hltCrtt1, uint64_t hltEtrig, uint64_t hltBeamGate) + TimingInfo::TimingInfo(uint64_t rawDAQHeaderTimestamp, uint64_t tdcCrtt1, uint64_t tdcBes, + uint64_t tdcRwm, uint64_t tdcEtrig, uint64_t hltCrtt1, uint64_t hltEtrig, + uint64_t hltBeamGate) : fRawDAQHeaderTimestamp(rawDAQHeaderTimestamp) , fTdcCrtt1(tdcCrtt1) , fTdcBes(tdcBes) diff --git a/sbnobj/SBND/Timing/TimingInfo.hh b/sbnobj/SBND/Timing/TimingInfo.hh index 32b89e84..12e6a3eb 100644 --- a/sbnobj/SBND/Timing/TimingInfo.hh +++ b/sbnobj/SBND/Timing/TimingInfo.hh @@ -10,9 +10,13 @@ #define SBND_TIMINGINFO_HH #include +#include namespace sbnd::timing { + static constexpr uint64_t kSecondInNanoseconds = static_cast(1e9); ///< 1s = 1,000,000,000ns + static constexpr uint64_t kInvalidTimestamp = std::numeric_limits::max(); ///< Invalid timestamp + /** * @brief A class to store important timestamps in SBND Data * @@ -24,19 +28,14 @@ namespace sbnd::timing { class TimingInfo { - public: - static constexpr uint64_t InvalidTimestamp = 0; ///< Invalid timestamp - - private: - - uint64_t fRawDAQHeaderTimestamp = InvalidTimestamp; ///< Timestamp when the event is built by the event builder at DAQ-level - uint64_t fTdcCrtt1 = InvalidTimestamp; ///< Timestamp of BNB stream CRT T1 Reset recorded by the SPEC-TDC - uint64_t fTdcBes = InvalidTimestamp; ///< Timestamp of BES signal sent by MFTU recorded by the SPEC-TDC - uint64_t fTdcRwm = InvalidTimestamp; ///< Timestamp of RWM signal recorded by the SPEC-TDC - uint64_t fTdcEtrig = InvalidTimestamp; ///< Timestamp of Event Trigger (ETRIG) sent by the PTB recorded by the SPEC-TDC - uint64_t fHltCrtt1 = InvalidTimestamp; ///< Timestamp of BNB and Offbeam stream CRT T1 Reset High Level Trigger (HLT) created by the PTB - uint64_t fHltEtrig = InvalidTimestamp; ///< Timestamp of ETRIG HLT created by the PTB - uint64_t fHltBeamGate = InvalidTimestamp; ///< Timestamp of Beam Gate Acceptance HLT created by the PTB + uint64_t fRawDAQHeaderTimestamp = kInvalidTimestamp; ///< Timestamp when the event is built by the event builder at DAQ-level + uint64_t fTdcCrtt1 = kInvalidTimestamp; ///< Timestamp of BNB stream CRT T1 Reset recorded by the SPEC-TDC + uint64_t fTdcBes = kInvalidTimestamp; ///< Timestamp of BES signal sent by MFTU recorded by the SPEC-TDC + uint64_t fTdcRwm = kInvalidTimestamp; ///< Timestamp of RWM signal recorded by the SPEC-TDC + uint64_t fTdcEtrig = kInvalidTimestamp; ///< Timestamp of Event Trigger (ETRIG) sent by the PTB recorded by the SPEC-TDC + uint64_t fHltCrtt1 = kInvalidTimestamp; ///< Timestamp of BNB and Offbeam stream CRT T1 Reset High Level Trigger (HLT) created by the PTB + uint64_t fHltEtrig = kInvalidTimestamp; ///< Timestamp of ETRIG HLT created by the PTB + uint64_t fHltBeamGate = kInvalidTimestamp; ///< Timestamp of Beam Gate Acceptance HLT created by the PTB public: diff --git a/sbnobj/SBND/Timing/classes_def.xml b/sbnobj/SBND/Timing/classes_def.xml index 717e1bff..7c7a4415 100644 --- a/sbnobj/SBND/Timing/classes_def.xml +++ b/sbnobj/SBND/Timing/classes_def.xml @@ -11,7 +11,8 @@ - + +