Search a DmTimeSlice for significant periodic signals at a range of accelerations.
25 PUSH_NVTX_RANGE(
"tdas_cuda_Tdas_process",0);
26 PANDA_LOG <<
"cuda::Tdas::process() invoked (on device "<< device.device_id() <<
")";
27 typedef data::FrequencySeries<cheetah::Cuda,thrust::complex<T>> FourierSeriesType;
28 typedef data::TimeSeries<cheetah::Cuda,T> TimeSeriesType;
29 typedef data::PowerSeries<cheetah::Cuda,T> PowerSeriesType;
35 PUSH_NVTX_RANGE(
"tdas_cuda_Tdas_submodule_creation",0);
36 dred::Dred<T> dred(_impl_config.dred_config());
37 brdz::Brdz brdz(_impl_config.brdz_config());
38 tdrt::Tdrt tdrt(_impl_config.tdrt_config());
39 tdao::Tdao tdao(_impl_config.tdao_config());
40 pwft::Pwft pwft(_impl_config.pwft_config());
41 hrms::Hrms hrms(_impl_config.hrms_config());
42 fft::Fft fft_c2r(_impl_config.fft_config());
43 fft::Fft fft_r2c(_impl_config.fft_config());
46 auto candidate_list_ptr = std::make_shared<data::Ccl>();
48 data::TimeSeries<cheetah::Cuda,float> copy_buffer;
49 TimeSeriesType tdrt_input;
50 TimeSeriesType tdrt_output;
51 FourierSeriesType r2cfft_output;
52 FourierSeriesType dred_output;
53 PowerSeriesType pwft_output;
54 std::vector<PowerSeriesType> hrms_output(nharmonics);
57 PUSH_NVTX_RANGE(
"tdas_cuda_Tdas_process_dm_trial",3);
58 for(
auto dm_trial_iterator = data.cbegin();
59 dm_trial_iterator!=data.cend();
62 auto const& dm_trial = *dm_trial_iterator;
64 if (dm_trial.number_of_samples() < _algo_config.
minimum_size())
66 PANDA_LOG_WARN <<
"Number of samples in DM trial is lower than configured minimum size" 67 <<
"("<<dm_trial.number_of_samples()<<
" < "<<_algo_config.
minimum_size()<<
")";
69 return candidate_list_ptr;
73 data::DedispersionMeasureType<float>
const dm = dm_trial.dm();
74 PANDA_LOG_DEBUG <<
"Processing dispersion measure: " << dm;
77 copy_buffer.resize(_algo_config.
size());
80 PUSH_NVTX_RANGE(
"tdas_cuda_Tdas_copy_trial_to_device",1);
81 auto it = dm_trial.copy_to(copy_buffer);
85 std::size_t ncopied = std::distance(copy_buffer.begin(),it);
88 PUSH_NVTX_RANGE(
"tdas_cuda_Tdas_prepare_and_deredden",2);
90 tdrt_input.resize(ncopied);
93 tdrt_input.sampling_interval(dm_trial.sampling_interval());
96 thrust::copy(copy_buffer.begin(),copy_buffer.begin()+ncopied,tdrt_input.begin());
100 if (ncopied!=_algo_config.
size())
103 T padding_value = thrust::reduce(thrust::cuda::par,tdrt_input.begin(),tdrt_input.end())/ncopied;
105 tdrt_input.resize(_algo_config.
size(),padding_value);
109 fft_r2c.process(device,tdrt_input,r2cfft_output);
115 brdz.process<cheetah::Cuda, T,
typename FourierSeriesType::AllocatorType>(device,dred_output);
118 fft_c2r.process(device, dred_output, tdrt_input);
124 tdrt_input.size(),tdrt_input.sampling_interval().value());
125 for (
auto accel: acc_list)
127 PANDA_LOG_DEBUG <<
"Processing acceleration: " << accel;
128 PUSH_NVTX_RANGE(
"tdas_cuda_Tdas_process_acceleration_trial",4);
130 tdrt.process(device,tdrt_input,tdrt_output,accel);
133 fft_r2c.process(device,tdrt_output,r2cfft_output);
136 pwft.process_nn(device,r2cfft_output,pwft_output);
139 hrms.process(device,pwft_output,hrms_output);
142 std::size_t harmonic = 1;
143 tdao.process<cheetah::Cuda,T,
typename data::PowerSeries<cheetah::Cuda,T>::AllocatorType>
144 (device,pwft_output,*candidate_list_ptr,dm,accel,harmonic);
148 for (
auto const& series: hrms_output)
150 tdao.process<cheetah::Cuda,T,
typename data::PowerSeries<cheetah::Cuda,T>::AllocatorType>
151 (device,series,*candidate_list_ptr,dm,accel,harmonic);
158 PANDA_LOG <<
"cuda::Tdas::process() complete (on device "<< device.device_id() <<
")";
160 return candidate_list_ptr;
AccListGenConfig const & acceleration_list_generator() const
Return acceleration list generator configuration.
std::size_t size() const
The size for transform to use for the search.
std::vector< data::AccelerationType > acceleration_list(data::DedispersionMeasureType< float > dm, std::size_t number_of_samples, double sampling_interval) const
Generate a list of accelerations.
std::size_t minimum_size() const
The minimum timeseries length that will be searched.
void number_of_harmonic_sums(std::size_t nharmonics)
Number of harmonic sums to perform in the search.
data::AccelerationType magnitude() const
return the maximum absolute acceleration magnitude