24 #include "panda/Log.h" 33 template<
typename DdtrTraits>
34 Worker<DdtrTraits>::Worker()
38 template<
typename DdtrTraits>
39 std::shared_ptr<typename Worker<DdtrTraits>::DmTrialsType> Worker<DdtrTraits>::operator()(BufferType
const& data, std::shared_ptr<DedispersionPlan<DdtrTraits>> plan)
41 auto const& tf_obj = *(data.composition().front());
42 std::size_t nchans = tf_obj.number_of_channels();
43 data::DimensionSize<data::Time> nsamples(data.data_size() / nchans);
45 if (data.data_size() % nchans != 0)
47 throw panda::Error(
"AggregationBuffer does not contain a whole number of channels");
49 auto dm_trial_metadata = plan->dm_trials_metadata(tf_obj.metadata(), nsamples);
51 data::DimensionIndex<data::Time> offset_samples(data.offset_first_block()/(nchans *
sizeof(
typename DdtrTraits::value_type)));
52 auto const& start_time = tf_obj.start_time(offset_samples);
53 std::shared_ptr<DmTrialsType> dmtrials_ptr = DmTrialsType::make_shared(dm_trial_metadata, start_time);
54 if (data.data_size() < plan->buffer_overlap() * nchans)
56 PANDA_LOG_WARN <<
"AggregationBuffer is too small to be processed (" 57 << data.data_size() <<
" < " << plan->buffer_overlap()*nchans <<
")\n"<<
"Skipping Current Buffer";
61 DmTrialsType& dmtrials = *(dmtrials_ptr);
62 NumericalT
const* tf_data =
static_cast<NumericalT const*
>(data.data());
64 auto const& plan_dm_trials = plan->dm_trials();
65 auto const& plan_dm_factors = plan->dm_factors();
66 for (std::size_t dm_idx = 0; dm_idx < plan->dm_trials().size(); ++dm_idx)
68 auto& current_trial = dmtrials[dm_idx];
69 auto const& plan_dm_trial = plan_dm_trials[dm_idx].value();
70 for (std::size_t samp_idx=0; samp_idx < current_trial.size(); ++samp_idx)
73 for (std::size_t chan_idx=0; chan_idx < nchans; ++chan_idx)
75 std::size_t delay =
static_cast<std::size_t
>(plan_dm_factors[chan_idx] * plan_dm_trial);
76 std::size_t input_idx = (samp_idx + delay) * nchans + chan_idx;
77 if (input_idx >= data.data_size())
79 PANDA_LOG_ERROR <<
"Input index beyond end of buffer (" << input_idx <<
" >= " << data.data_size() <<
")";
81 sum += (float) tf_data[input_idx];
83 current_trial[samp_idx] = sum;
Some limits and constants for FLDO.