24 #include "cheetah/generators/DispersedPulse.h" 31 namespace generators {
34 template<
typename NumericalRep>
35 DispersedPulse<NumericalRep>::DispersedPulse()
37 , _dm_constant(4.1493775933609e3)
38 , _dm_measure(500.0 *
pss::astrotypes::units::parsecs_per_cube_cm)
39 , _pulse_width(3.0 *
boost::units::si::milli *
boost::units::si::seconds)
44 template<
typename NumericalRep>
45 DispersedPulse<NumericalRep>::DispersedPulse(DispersedPulseConfig
const& config)
47 , _dm_constant(4.1493775933609e3)
48 , _dm_measure(config.dispersion_measure())
49 , _pulse_width(config.pulse_width())
50 , _delta(
std::max(config.delta(), (double)
std::numeric_limits<NumericalRep>::max()))
54 template<
typename NumericalRep>
55 DispersedPulse<NumericalRep>::~DispersedPulse()
59 template<
typename NumericalRep>
60 void DispersedPulse<NumericalRep>::next(DataType& data)
62 std::size_t bin_width = _pulse_width/data.sample_interval();
63 std::vector<data::FrequencyType>
const& channel_freqs = data.channel_frequencies();
64 typename data::FrequencyType freq_top = *std::max_element(channel_freqs.begin(), channel_freqs.end());
65 std::vector<float> delays;
66 for (
auto const& freq: channel_freqs)
68 delays.push_back(_dm_constant * _dm_measure.value()
69 * (1.0/(freq.value()*freq.value()) - 1.0/(freq_top.value()*freq_top.value())) / data.sample_interval().value());
72 std::size_t
const number_of_channels = data.template dimension<data::Frequency>();
73 for(std::size_t ii=0; ii < number_of_channels; ++ii)
75 typename DataType::Channel ts = data.channel(ii);
76 std::size_t delay = std::size_t(std::round(delays[ii]));
79 for(std::size_t offset=0; offset < bin_width; ++offset) {
81 pss::astrotypes::DimensionIndex<pss::astrotypes::units::Time>
const index(delay + offset);
82 if( index >= ts.template size<data::Time>() )
continue;
84 if(std::numeric_limits<NumericalRep>::max() - ts[index] <= _delta)
86 ts[index] = std::numeric_limits<NumericalRep>::max();
Some limits and constants for FLDO.