Line data Source code
1 : /**
2 : * @file NaiveFrugalPedestalSubtractProcessor.cpp
3 : *
4 : * @copyright This is part of the DUNE DAQ Software Suite, copyright 2020.
5 : * Licensing/copyright details are in the COPYING file that you should have
6 : * received with this code.
7 : */
8 :
9 : #include "tpglibs/NaiveFrugalPedestalSubtractProcessor.hpp"
10 :
11 : namespace tpglibs {
12 :
13 15 : REGISTER_NAIVEPROCESSOR_CREATOR("NaiveFrugalPedestalSubtractProcessor", NaiveFrugalPedestalSubtractProcessor)
14 :
15 7 : void NaiveFrugalPedestalSubtractProcessor::configure(const nlohmann::json& config, const int16_t* plane_numbers) {
16 : // Configure common metric collection parameters
17 : // Register pointers to the ACTUAL member variables, not copies
18 : // Use shared_ptr with no-op deleter to avoid double-free
19 7 : m_internal_state_name_registry.register_internal_state("pedestal",
20 14 : std::shared_ptr<naive_array_t>(&m_pedestal, [](auto*){}));
21 7 : m_internal_state_name_registry.register_internal_state("accum",
22 14 : std::shared_ptr<naive_array_t>(&m_accum, [](auto*){}));
23 :
24 7 : configure_internal_state_collection(config);
25 :
26 7 : m_accum_limit = config["accum_limit"];
27 7 : }
28 :
29 : NaiveFrugalPedestalSubtractProcessor::naive_array_t
30 10 : NaiveFrugalPedestalSubtractProcessor::process(const naive_array_t& signal) {
31 : // Update sample counter and write internal states to buffer for harvesting
32 10 : m_samples++;
33 10 : if (m_collect_internal_state_flag && (m_samples % m_sample_period == 0)) {
34 10 : m_internal_state_buffer_manager.write_to_active_buffer();
35 : }
36 :
37 : naive_array_t subtracted_signal;
38 170 : for (int i = 0; i < 16; i++) {
39 : // Increment if above.
40 160 : if (signal[i] > m_pedestal[i])
41 160 : m_accum[i]++;
42 :
43 : // Decrement if below.
44 160 : if (signal[i] < m_pedestal[i])
45 0 : m_accum[i]--;
46 :
47 : // Increment pedestal if we've hit the top limit.
48 160 : if (m_accum[i] > m_accum_limit) {
49 32 : m_pedestal[i]++;
50 32 : m_accum[i] = 0;
51 : }
52 :
53 : // Decrement pedestal if we've hit the low limit.
54 160 : if (m_accum[i] < -1*m_accum_limit) {
55 0 : m_pedestal[i]--;
56 0 : m_accum[i] = 0;
57 : }
58 :
59 160 : subtracted_signal[i] = signal[i] - m_pedestal[i];
60 : }
61 :
62 10 : return NaiveProcessor::process(subtracted_signal);
63 : }
64 :
65 : } // namespace tpglibs
|