Skip to content
Open
19 changes: 9 additions & 10 deletions sbnobj/SBND/Timing/FrameShiftInfo.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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
154 changes: 117 additions & 37 deletions sbnobj/SBND/Timing/FrameShiftInfo.hh
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,84 @@
#include <stdint.h>
#include <limits>

#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<uint16_t>::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<uint16_t>::max()
};

static constexpr uint16_t kInvalidChannel = std::numeric_limits<uint16_t>::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:

Expand All @@ -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; }
/// @}
};
}
Expand Down
4 changes: 3 additions & 1 deletion sbnobj/SBND/Timing/TimingInfo.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
25 changes: 12 additions & 13 deletions sbnobj/SBND/Timing/TimingInfo.hh
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,13 @@
#define SBND_TIMINGINFO_HH

#include <stdint.h>
#include <limits>

namespace sbnd::timing {

static constexpr uint64_t kSecondInNanoseconds = static_cast<uint64_t>(1e9); ///< 1s = 1,000,000,000ns
static constexpr uint64_t kInvalidTimestamp = std::numeric_limits<uint64_t>::max(); ///< Invalid timestamp

/**
* @brief A class to store important timestamps in SBND Data
*
Expand All @@ -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:

Expand Down
3 changes: 2 additions & 1 deletion sbnobj/SBND/Timing/classes_def.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
</class>
<class name="art::Wrapper<sbnd::timing::TimingInfo>"/>

<class name="sbnd::timing::FrameShiftInfo" ClassVersion="10" >
<class name="sbnd::timing::FrameShiftInfo" ClassVersion="11" >
<version ClassVersion="11" checksum="1513384194"/>
<version ClassVersion="10" checksum="515138667"/>
</class>
<class name="art::Wrapper<sbnd::timing::FrameShiftInfo>"/>
Expand Down