DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::fddetdataformats::TDEEthFrame Class Reference

Class for accessing raw WIB eth frames, as used in ProtoDUNE-II. More...

#include <TDEEthFrame.hpp>

Collaboration diagram for dunedaq::fddetdataformats::TDEEthFrame:
[legend]

Classes

struct  TDEEthHeader
 

Public Types

typedef uint64_t word_t
 

Public Member Functions

uint16_t get_adc (int i, int sample=0) const
 Get the ith ADC value in the frame.
 
void set_adc (int i, int sample, uint16_t val)
 Set the ith ADC value in the frame to val.
 
uint64_t get_timestamp () const
 Get the starting 64-bit timestamp of the frame.
 
void set_timestamp (const uint64_t new_timestamp)
 Set the starting 64-bit timestamp of the frame.
 
uint8_t get_channel () const
 Get the channel identifier of the frame.
 
void set_channel (const uint8_t new_channel)
 Set the channel identifier of the frame.
 

Public Attributes

detdataformats::DAQEthHeader daq_header
 
TDEEthHeader header
 
word_t adc_words [s_time_samples_per_frame][s_num_adc_words_per_ts]
 

Static Public Attributes

static constexpr int s_bits_per_adc = 14
 
static constexpr int s_bits_per_word = 8 * sizeof(word_t)
 
static constexpr int s_time_samples_per_frame = 64
 
static constexpr int s_channels_per_half_femb = 64
 
static constexpr int s_half_fembs_per_frame = 1
 
static constexpr int s_num_channels = s_channels_per_half_femb * s_half_fembs_per_frame
 
static constexpr int s_num_adc_words_per_ts = s_num_channels * s_bits_per_adc / s_bits_per_word
 
static constexpr int s_num_adc_words = s_time_samples_per_frame * s_num_channels * s_bits_per_adc / s_bits_per_word
 

Detailed Description

Class for accessing raw WIB eth frames, as used in ProtoDUNE-II.

The canonical definition of the WIB format is given in EDMS document 2088713: https://edms.cern.ch/document/2088713/XXX

Definition at line 33 of file TDEEthFrame.hpp.

Member Typedef Documentation

◆ word_t

Member Function Documentation

◆ get_adc()

uint16_t dunedaq::fddetdataformats::TDEEthFrame::get_adc ( int i,
int sample = 0 ) const
inline

Get the ith ADC value in the frame.

The ADC words are 14 bits long; wrod_t stored packed in the data structure. The order is: 64 channels repeated for 64 time samples

Definition at line 83 of file TDEEthFrame.hpp.

84 {
85 if (i < 0 || i >= s_num_channels)
86 throw std::out_of_range("ADC index out of range");
87
88 // The index of the first (and sometimes only) word containing the required ADC value
89 int word_index = s_bits_per_adc * i / s_bits_per_word;
90 assert(word_index < s_num_adc_words_per_ts);
91 // Where in the word the lowest bit of our ADC value is located
92 int first_bit_position = (s_bits_per_adc * i) % s_bits_per_word;
93 // How many bits of our desired ADC are located in the `word_index`th word
94 int bits_from_first_word = std::min(s_bits_per_adc, s_bits_per_word - first_bit_position);
95 // uint16_t adc = adc_words[word_index][sample] >> first_bit_position; // NOLINT(build/unsigned)
96 uint16_t adc = adc_words[sample][word_index] >> first_bit_position; // NOLINT(build/unsigned)
97 // If we didn't get the full 14 bits from this word, we need the rest from the next word
98 if (bits_from_first_word < s_bits_per_adc) {
99 assert(word_index + 1 < s_num_adc_words_per_ts);
100 // adc |= adc_words[word_index + 1][sample] << bits_from_first_word;
101 adc |= adc_words[sample][word_index + 1] << bits_from_first_word;
102 }
103 // Mask out all but the lowest 14 bits;
104 return adc & 0x3FFFu;
105 }
static constexpr int s_num_adc_words_per_ts
word_t adc_words[s_time_samples_per_frame][s_num_adc_words_per_ts]

◆ get_channel()

uint8_t dunedaq::fddetdataformats::TDEEthFrame::get_channel ( ) const
inline

Get the channel identifier of the frame.

Definition at line 150 of file TDEEthFrame.hpp.

151 {
152 return header.channel ; // NOLINT(build/unsigned)
153 }

◆ get_timestamp()

uint64_t dunedaq::fddetdataformats::TDEEthFrame::get_timestamp ( ) const
inline

Get the starting 64-bit timestamp of the frame.

Definition at line 136 of file TDEEthFrame.hpp.

137 {
138 return daq_header.get_timestamp() ; // NOLINT(build/unsigned)
139 }
detdataformats::DAQEthHeader daq_header

◆ set_adc()

void dunedaq::fddetdataformats::TDEEthFrame::set_adc ( int i,
int sample,
uint16_t val )
inline

Set the ith ADC value in the frame to val.

Definition at line 110 of file TDEEthFrame.hpp.

111 {
112 if (i < 0 || i >= s_num_channels)
113 throw std::out_of_range("ADC index out of range");
114 if (val >= (1 << s_bits_per_adc))
115 throw std::out_of_range("ADC value out of range");
116
117 // The index of the first (and sometimes only) word containing the required ADC value
118 int word_index = s_bits_per_adc * i / s_bits_per_word;
119 assert(word_index < s_num_adc_words);
120 // Where in the word the lowest bit of our ADC value is located
121 int first_bit_position = (s_bits_per_adc * i) % s_bits_per_word;
122 // How many bits of our desired ADC are located in the `word_index`th word
123 int bits_in_first_word = std::min(s_bits_per_adc, s_bits_per_word - first_bit_position);
124 uint64_t mask = (static_cast<uint64_t>(1) << first_bit_position) - 1;
125 adc_words[sample][word_index] = ((static_cast<uint64_t>(val) << first_bit_position) & ~mask) | (adc_words[sample][word_index] & mask);
126 // If we didn't put the full 14 bits in this word, we need to put the rest in the next word
127 if (bits_in_first_word < s_bits_per_adc) {
128 assert(word_index + 1 < s_num_adc_words);
129 mask = (1 << (s_bits_per_adc - bits_in_first_word)) - 1;
130 adc_words[sample][word_index + 1] = ((val >> bits_in_first_word) & mask) | (adc_words[sample][word_index + 1] & ~mask);
131 }
132 }

◆ set_channel()

void dunedaq::fddetdataformats::TDEEthFrame::set_channel ( const uint8_t new_channel)
inline

Set the channel identifier of the frame.

Definition at line 157 of file TDEEthFrame.hpp.

158 {
159 header.channel = new_channel;
160 }

◆ set_timestamp()

void dunedaq::fddetdataformats::TDEEthFrame::set_timestamp ( const uint64_t new_timestamp)
inline

Set the starting 64-bit timestamp of the frame.

Definition at line 143 of file TDEEthFrame.hpp.

144 {
145 daq_header.timestamp = new_timestamp;
146 }

Member Data Documentation

◆ adc_words

word_t dunedaq::fddetdataformats::TDEEthFrame::adc_words[s_time_samples_per_frame][s_num_adc_words_per_ts]

Definition at line 69 of file TDEEthFrame.hpp.

◆ daq_header

detdataformats::DAQEthHeader dunedaq::fddetdataformats::TDEEthFrame::daq_header

Definition at line 66 of file TDEEthFrame.hpp.

◆ header

TDEEthHeader dunedaq::fddetdataformats::TDEEthFrame::header

Definition at line 67 of file TDEEthFrame.hpp.

◆ s_bits_per_adc

int dunedaq::fddetdataformats::TDEEthFrame::s_bits_per_adc = 14
staticconstexpr

Definition at line 43 of file TDEEthFrame.hpp.

◆ s_bits_per_word

int dunedaq::fddetdataformats::TDEEthFrame::s_bits_per_word = 8 * sizeof(word_t)
staticconstexpr

Definition at line 44 of file TDEEthFrame.hpp.

◆ s_channels_per_half_femb

int dunedaq::fddetdataformats::TDEEthFrame::s_channels_per_half_femb = 64
staticconstexpr

Definition at line 46 of file TDEEthFrame.hpp.

◆ s_half_fembs_per_frame

int dunedaq::fddetdataformats::TDEEthFrame::s_half_fembs_per_frame = 1
staticconstexpr

Definition at line 47 of file TDEEthFrame.hpp.

◆ s_num_adc_words

int dunedaq::fddetdataformats::TDEEthFrame::s_num_adc_words = s_time_samples_per_frame * s_num_channels * s_bits_per_adc / s_bits_per_word
staticconstexpr

Definition at line 50 of file TDEEthFrame.hpp.

◆ s_num_adc_words_per_ts

int dunedaq::fddetdataformats::TDEEthFrame::s_num_adc_words_per_ts = s_num_channels * s_bits_per_adc / s_bits_per_word
staticconstexpr

Definition at line 49 of file TDEEthFrame.hpp.

◆ s_num_channels

int dunedaq::fddetdataformats::TDEEthFrame::s_num_channels = s_channels_per_half_femb * s_half_fembs_per_frame
staticconstexpr

Definition at line 48 of file TDEEthFrame.hpp.

◆ s_time_samples_per_frame

int dunedaq::fddetdataformats::TDEEthFrame::s_time_samples_per_frame = 64
staticconstexpr

Definition at line 45 of file TDEEthFrame.hpp.


The documentation for this class was generated from the following file: