DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
AVXFrugalPedestalSubtractProcessor.cpp
Go to the documentation of this file.
1
8
10
11namespace tpglibs {
12
13REGISTER_AVXPROCESSOR_CREATOR("AVXFrugalPedestalSubtractProcessor", AVXFrugalPedestalSubtractProcessor)
14
15void
16AVXFrugalPedestalSubtractProcessor::configure(const nlohmann::json& config, const int16_t* /* plane_numbers */)
17{
18#ifdef TPGLIBS_ENABLE_STATE_MONITORING
19 m_internal_state_name_registry.register_internal_state("pedestal",
20 std::shared_ptr<__m256i>(&m_pedestal, [](auto*) {}));
21 m_internal_state_name_registry.register_internal_state("accum", std::shared_ptr<__m256i>(&m_accum, [](auto*) {}));
23#endif
24
25 m_accum_limit = config["accum_limit"];
26}
27
28__m256i
30{
31#ifdef TPGLIBS_ENABLE_STATE_MONITORING
32 m_samples++;
33 if (m_collect_internal_state_flag && (m_samples % m_sample_period == 0)) {
34 m_internal_state_buffer_manager.write_to_active_buffer();
35 }
36#endif
37
38 // Find the channels that are above or below the pedestal.
39 __m256i is_gt = _mm256_cmpgt_epi16(signal, m_pedestal);
40 __m256i is_lt = _mm256_cmpgt_epi16(m_pedestal, signal);
41
42 // Update m_accum.
43 __m256i to_add = _mm256_setzero_si256(); // Assumes equal to pedestal.
44 to_add = _mm256_blendv_epi8(to_add, _mm256_set1_epi16(1), is_gt); // Set the above pedestal case.
45 to_add = _mm256_blendv_epi8(to_add, _mm256_set1_epi16(-1), is_lt); // Set the below pedestal case.
46
47 m_accum = _mm256_add_epi16(m_accum, to_add);
48
49 // Check the accum limit condition.
50 is_gt = _mm256_cmpgt_epi16(m_accum, _mm256_set1_epi16(m_accum_limit)); // m_accum > +limit.
51 is_lt = _mm256_cmpgt_epi16(_mm256_set1_epi16(-1 * m_accum_limit), m_accum); // m_accum < -limit = -limit > m_accum.
52
53 to_add = _mm256_setzero_si256();
54 to_add = _mm256_blendv_epi8(to_add, _mm256_set1_epi16(1), is_gt);
55 to_add = _mm256_blendv_epi8(to_add, _mm256_set1_epi16(-1), is_lt);
56
57 // Update pedestal.
58 m_pedestal = _mm256_adds_epi16(m_pedestal, to_add);
59
60 // Reset too high/low m_accum channels.
61 __m256i need_reset = _mm256_or_si256(is_lt, is_gt);
62 m_accum = _mm256_blendv_epi8(m_accum, _mm256_setzero_si256(), need_reset);
63
64 return AVXProcessor::process(_mm256_sub_epi16(signal, m_pedestal));
65}
66
67} // namespace tpglibs
#define REGISTER_AVXPROCESSOR_CREATOR(processor_name, processor_class)
Factory registration macro.
AVX signal processor: Estimates the pedestal and subtracts.
void configure(const nlohmann::json &config, const int16_t *plane_numbers) override
Configure the accumulation limit according to plane number.
__m256i process(const __m256i &signal) override
Estimate the pedestal using the given signal and subtract.
__m256i m_pedestal
Vector of estimated pedestals for each channel.
int16_t m_accum_limit
Count limit before committing to a pedestal shift.
__m256i m_accum
Vector of counts that a channel's signal was above or below m_pedestal.
virtual __m256i process(const __m256i &signal) override
Simple signal pass-through on __m256i type.
virtual void configure_internal_state_collection(const nlohmann::json &)