Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 ???] ?????
Comment thread
VCLanNguyen marked this conversation as resolved.
Outdated
* 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; }
Comment thread
VCLanNguyen marked this conversation as resolved.
/// @}

/// @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
Comment thread
VCLanNguyen marked this conversation as resolved.
Outdated
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