DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
tpglibs::TPGenerator Class Reference

TPG driving class. More...

#include <TPGenerator.hpp>

Public Member Functions

void configure (const std::vector< std::pair< std::string, nlohmann::json > > &configs, const std::vector< std::pair< dunedaq::trgdataformats::channel_t, int16_t > > channel_plane_numbers, const float sample_tick_difference)
 Setup and configure the AVX pipelines.
 
void reset ()
 Remove all pipelines and reset member variables to default state.
 
void set_sot_minima (const std::vector< uint16_t > &sot_minima)
 Set the minimum samples over threshold for a TP according to plane.
 
std::vector< std::pair< std::shared_ptr< AbstractProcessor< __m256i > >, int > > get_all_processor_references_with_pipeline_index ()
 Return reference to all processors, under all pipelines, where the index of the pipeline is tagged along with the reference.
 
template<typename T >
std::vector< dunedaq::trgdataformats::TriggerPrimitiveoperator() (const T *frame)
 Driving function for the TPG.
 

Private Member Functions

__m256i expand_frame (const __m256i &regi)
 
__m256i old_expand_frame (const __m256i &regi)
 Expansion from 14-bit signals to 16-bit.
 

Private Attributes

bool m_configured {false}
 
uint8_t m_num_pipelines = 0
 
std::vector< AVXPipelinem_tpg_pipelines
 
float m_sample_tick_difference = 0
 
std::vector< uint16_t > m_sot_minima {1,1,1}
 

Static Private Attributes

static const uint8_t m_num_channels_per_pipeline = 16
 

Detailed Description

TPG driving class.

This is the interface that receives raw data frames to process and outputs the TPs accordingly.

Definition at line 31 of file TPGenerator.hpp.

Member Function Documentation

◆ configure()

void tpglibs::TPGenerator::configure ( const std::vector< std::pair< std::string, nlohmann::json > > & configs,
const std::vector< std::pair< dunedaq::trgdataformats::channel_t, int16_t > > channel_plane_numbers,
const float sample_tick_difference )

Setup and configure the AVX pipelines.

Parameters
configsA vector of pairs: AVX pipeline to use and its configuration.
channel_plane_numbersA vector of channel numbers and their plane numbers.
sample_tick_differenceNumber of ticks between time samples in expected data frames.

Definition at line 14 of file TPGenerator.cpp.

16 {
17 if (m_configured) {
18 reset();
19 }
20
21 m_num_pipelines = channel_plane_numbers.size() / m_num_channels_per_pipeline;
22 m_sample_tick_difference = sample_tick_difference;
23
24 for (int p = 0; p < m_num_pipelines; p++) {
25 AVXPipeline new_pipe = AVXPipeline();
26 auto begin_channel_plane = channel_plane_numbers.begin() + p*m_num_channels_per_pipeline;
27 auto end_channel_plane = begin_channel_plane + m_num_channels_per_pipeline;
28 new_pipe.configure(configs, std::vector<std::pair<dunedaq::trgdataformats::channel_t, int16_t>>(begin_channel_plane, end_channel_plane));
29 new_pipe.set_sot_minima(m_sot_minima);
30 m_tpg_pipelines.push_back(new_pipe);
31 }
32
33 m_configured = true;
34}
void reset()
Remove all pipelines and reset member variables to default state.
std::vector< uint16_t > m_sot_minima
std::vector< AVXPipeline > m_tpg_pipelines
static const uint8_t m_num_channels_per_pipeline

◆ expand_frame()

__m256i tpglibs::TPGenerator::expand_frame ( const __m256i & regi)
private

Definition at line 63 of file TPGenerator.cpp.

63 {
64 // Refer to the diagram and documentation on frame expansion for details.
65
66 // Prepare even (2,4,6,8), odd (1,3,5,7) rows in 64-bit sense.
67 __m256i odd = _mm256_permutevar8x32_epi32(regi, _mm256_setr_epi32(1, 0, 1, 2, 3, 4, 5, 6));
68
69 // Shift into place.
70 __m256i even = _mm256_sllv_epi64(regi, _mm256_setr_epi64x(6, 14, 22, 30));
71 odd = _mm256_srlv_epi64(odd, _mm256_setr_epi64x(30, 22, 14, 6));
72
73 // Everything is center aligned in 32-bit. Mask and right-align the right side.
74 __m256i both = _mm256_blend_epi32(even, odd, 0b01010101);
75 __m256i right = _mm256_and_si256(_mm256_set1_epi32(0xFFFFu), both);
76 __m256i left = _mm256_and_si256(_mm256_set1_epi32(0x3FFF0000u), both);
77
78 right = _mm256_srli_epi32(right, 2);
79 return _mm256_or_si256(left, right);
80}

◆ get_all_processor_references_with_pipeline_index()

std::vector< std::pair< std::shared_ptr< AbstractProcessor< __m256i > >, int > > tpglibs::TPGenerator::get_all_processor_references_with_pipeline_index ( )

Return reference to all processors, under all pipelines, where the index of the pipeline is tagged along with the reference.

Returns
A vector of all processor references.

Definition at line 36 of file TPGenerator.cpp.

36 {
37 std::vector<std::pair<std::shared_ptr<AbstractProcessor<__m256i>>, int>> processor_references;
38
39 for (int pipeline_id = 0; pipeline_id < m_num_pipelines; ++pipeline_id) {
40 for (auto& processor : m_tpg_pipelines[pipeline_id].get_all_processor_references()) {
41 processor_references.push_back(std::make_pair(processor, pipeline_id));
42 }
43 }
44 return processor_references;
45}

◆ old_expand_frame()

__m256i tpglibs::TPGenerator::old_expand_frame ( const __m256i & regi)
private

Expansion from 14-bit signals to 16-bit.

Definition at line 83 of file TPGenerator.cpp.

83 {
84 // Refer to the diagram and documentation on frame expansion for details.
85
86 // Rearrange original with row 3 doubled.
87 __m256i idx = _mm256_set_epi32(6, 5, 4, 3, 3, 2, 1, 0);
88 __m256i shuf1 = _mm256_permutevar8x32_epi32(regi, idx);
89
90 // Left shift each row.
91 __m256i count = _mm256_set_epi32(12, 8, 4, 0, 14, 10, 6, 2);
92 __m256i high_half = _mm256_sllv_epi32(shuf1, count);
93 high_half = _mm256_and_si256(high_half, _mm256_set1_epi32(0x3FFF0000u)); // Mask out the low half.
94
95 // Left shift for low half later.
96 count = _mm256_set_epi32(10, 6, 2, 0, 12, 8, 4, 0);
97 __m256i shift2 = _mm256_sllv_epi32(shuf1, count);
98
99 // Rearrange original and doubled rows 2 and 0.
100 idx = _mm256_set_epi32(5, 4, 3, 2, 2, 1, 0, 0);
101 __m256i shuf2 = _mm256_permutevar8x32_epi32(regi, idx);
102
103 // Right shift each row.
104 count = _mm256_set_epi32(22, 26, 30, 0, 20, 24, 28, 0);
105 __m256i shift3 = _mm256_srlv_epi32(shuf2, count);
106
107 // "Complete" the low half. Still more.
108 __m256i low_half = _mm256_or_si256(shift2, shift3);
109 low_half = _mm256_and_si256(low_half, _mm256_set1_epi32(0x3FFFu)); // Mask out the high half.
110
111 // Combine halves and clear space for an odd entry.
112 __m256i both = _mm256_or_si256(low_half, high_half);
113 both = _mm256_andnot_si256(_mm256_set_epi32(0, 0, 0, 0xFFFFu, 0, 0, 0, 0), both);
114
115 // There is a specific 16-bit entry that needs special handling.
116 // Align it.
117 __m256i shift4 = _mm256_srli_epi32(regi, 18);
118 // Mask it.
119 shift4 = _mm256_and_si256(_mm256_set_epi32(0, 0x3FFFu, 0, 0, 0, 0, 0, 0), shift4);
120
121 // Permute into the right spot
122 idx = _mm256_set_epi32(0, 0, 0, 6, 0, 0, 0, 0);
123 __m256i shuf3 = _mm256_permutevar8x32_epi32(shift4, idx);
124
125 // Add it in.
126 both = _mm256_or_si256(both, shuf3);
127 return both;
128}

◆ operator()()

template<typename T >
std::vector< dunedaq::trgdataformats::TriggerPrimitive > tpglibs::TPGenerator::operator() ( const T * frame)
inline

Driving function for the TPG.

This function receives the frames, expands, sends down AVX pipelines, and returns TPs that were generated.

Parameters
frameA data frame to process and generate TPs from.
Returns
A vector of TPs.

Definition at line 80 of file TPGenerator.hpp.

80 {
81 // Max number of TPs for a channel: number of time samples / 2.
82 std::vector<dunedaq::trgdataformats::TriggerPrimitive> tp_aggr;
83 tp_aggr.reserve(T::s_num_channels * T::s_time_samples_per_frame / 2);
84
85 const typename T::word_t (*words_ptr)[T::s_bits_per_adc] = frame->adc_words;
86 const uint64_t timestamp = frame->get_timestamp();
87
88 const int register_alignment = T::s_bits_per_adc * m_num_channels_per_pipeline;
89 // Loop in time.
90 for (int t = 0; t < T::s_time_samples_per_frame; t++) {
91 const typename T::word_t *time_sample = *(words_ptr + t);
92 char* cursor = (char*) time_sample; // Need to walk in terms of bytes/bits.
93
94 // Loop in pipelines.
95 for (int p = 0; p < m_num_pipelines; p++) {
96 if (p == m_num_pipelines - 1)
97 cursor -= 4; // Take a step of 32 bit backwards for the last sub-frame.
98
99 __m256i regi = _mm256_lddqu_si256((__m256i*)cursor);
100
101 if (p == m_num_pipelines - 1) // Permute the row order to use the same operation.
102 regi = _mm256_permutevar8x32_epi32(regi, _mm256_setr_epi32(1, 2, 3, 4, 5, 6, 7, 0));
103
104 __m256i expanded_subframe = expand_frame(regi);
105 std::vector<dunedaq::trgdataformats::TriggerPrimitive> tps = m_tpg_pipelines[p].process(expanded_subframe);
106
107 for (auto tp : tps) {
108 tp.time_start = static_cast<int64_t>((t - tp.samples_over_threshold) * m_sample_tick_difference) + timestamp;
109 tp_aggr.push_back(tp);
110 }
111 cursor += register_alignment / 8; // Numerator is in bits. Need bytes.
112 }
113 }
114
115 return tp_aggr;
116 }
__m256i expand_frame(const __m256i &regi)

◆ reset()

void tpglibs::TPGenerator::reset ( )

Remove all pipelines and reset member variables to default state.

Definition at line 48 of file TPGenerator.cpp.

48 {
50 m_tpg_pipelines.clear();
52 m_sot_minima = {1, 1, 1};
53 m_configured = false;
54}

◆ set_sot_minima()

void tpglibs::TPGenerator::set_sot_minima ( const std::vector< uint16_t > & sot_minima)

Set the minimum samples over threshold for a TP according to plane.

Parameters
sot_minimaTPs from plane i will have at least sot_minima[i] value for its samples_over_threshold.

Definition at line 57 of file TPGenerator.cpp.

57 {
58 m_sot_minima = sot_minima;
59}

Member Data Documentation

◆ m_configured

bool tpglibs::TPGenerator::m_configured {false}
private

Definition at line 33 of file TPGenerator.hpp.

33{false};

◆ m_num_channels_per_pipeline

const uint8_t tpglibs::TPGenerator::m_num_channels_per_pipeline = 16
staticprivate

Definition at line 32 of file TPGenerator.hpp.

◆ m_num_pipelines

uint8_t tpglibs::TPGenerator::m_num_pipelines = 0
private

Definition at line 34 of file TPGenerator.hpp.

◆ m_sample_tick_difference

float tpglibs::TPGenerator::m_sample_tick_difference = 0
private

Definition at line 36 of file TPGenerator.hpp.

◆ m_sot_minima

std::vector<uint16_t> tpglibs::TPGenerator::m_sot_minima {1,1,1}
private

Definition at line 37 of file TPGenerator.hpp.

37{1,1,1}; // Defaults to 1 for all planes.

◆ m_tpg_pipelines

std::vector<AVXPipeline> tpglibs::TPGenerator::m_tpg_pipelines
private

Definition at line 35 of file TPGenerator.hpp.


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