1 #include "cheetah/rfim/policy/LastUnflagged.h" 9 template<
typename TimeFrequencyType>
10 LastUnflagged<TimeFrequencyType>::LastUnflagged()
11 : _replacement_sample(8)
12 , _sample_index(_replacement_sample.size(), 0)
13 , _read_index(_sample_index)
17 template<
typename TimeFrequencyType>
18 LastUnflagged<TimeFrequencyType>::~LastUnflagged()
22 template<
typename TimeFrequencyType>
23 typename LastUnflagged<TimeFrequencyType>::Adapter LastUnflagged<TimeFrequencyType>::adapter(TimeFrequencyType& data)
25 if(_replacement_sample[_read_index].size() != data.template dimension<data::Frequency>())
27 _replacement_sample[_read_index].resize(data.template dimension<data::Frequency>());
29 return Adapter(*
this, data);
32 template<
typename TimeFrequencyType>
33 void LastUnflagged<TimeFrequencyType>::set_good_sample(Spectrum
const& sample)
35 unsigned index = ++_sample_index;
36 std::copy(sample.begin(), sample.end(), _replacement_sample[index].begin());
37 if(_read_index < index) { _read_index = index; }
40 template<
typename TimeFrequencyType>
41 void LastUnflagged<TimeFrequencyType>::set_good_sample(NumericalRep
const& sample_start, std::size_t size)
43 unsigned index = ++_sample_index;
44 auto& replacement = _replacement_sample[index];
45 replacement.resize(size);
46 std::copy(&sample_start, &sample_start + size, replacement.begin());
47 if(_read_index < index) { _read_index = index; }
50 template<
typename TimeFrequencyType>
51 typename LastUnflagged<TimeFrequencyType>::SampleType& LastUnflagged<TimeFrequencyType>::last_good_spectrum()
53 return _replacement_sample[_read_index];
56 template<
typename TimeFrequencyType>
57 LastUnflaggedAdapter<TimeFrequencyType>::LastUnflaggedAdapter(LastUnflagged<TimeFrequencyType>& parent, TimeFrequencyType& data)
60 , _replacement_sample(parent.last_good_spectrum())
61 , _last_good_spectrum(&*(_replacement_sample.begin()))
65 template<
typename TimeFrequencyType>
66 LastUnflaggedAdapter<TimeFrequencyType>::~LastUnflaggedAdapter()
68 _parent.set_good_sample(*_last_good_spectrum, _data->template dimension<data::Frequency>());
71 template<
typename TimeFrequencyType>
72 void LastUnflaggedAdapter<TimeFrequencyType>::data()
76 template<
typename TimeFrequencyType>
77 inline void LastUnflaggedAdapter<TimeFrequencyType>::mark_bad(NumericalRep
const& data, data::DimensionIndex<data::Frequency> channel_number)
79 const_cast<NumericalRep&
>(data) = *(_last_good_spectrum + channel_number);
82 template<
typename TimeFrequencyType>
83 inline void LastUnflaggedAdapter<TimeFrequencyType>::mark_good(NumericalRep
const& data, data::DimensionIndex<data::Frequency> channel_number)
85 _replacement_sample[channel_number] = data;
88 template<
typename TimeFrequencyType>
89 template<
typename SliceT>
90 typename std::enable_if<pss::astrotypes::is_slice<SliceT>::value,
void>::type
91 LastUnflaggedAdapter<TimeFrequencyType>::mark_good(SliceT
const& slice)
93 std::copy(slice.begin(), slice.end(), _replacement_sample.begin() + slice.template span<data::Frequency>().start());
96 template<
typename TimeFrequencyType>
97 template<
typename SliceType>
98 typename std::enable_if<pss::astrotypes::is_slice<SliceType>::value && std::remove_reference<SliceType>::type::rank != 1,
void>::type
99 LastUnflaggedAdapter<TimeFrequencyType>::mark_bad(SliceType
const& slice)
101 auto& writable_slice = pss::astrotypes::multiarray::cast_to_non_const_slice(const_cast<SliceType&>(slice));
102 const NumericalRep* ptr = _last_good_spectrum +
static_cast<std::size_t
>(writable_slice.template span<data::Frequency>().start());
103 const NumericalRep* end_ptr = _last_good_spectrum +
static_cast<std::size_t
>(writable_slice.template dimension<data::Frequency>());
104 for(data::DimensionIndex<data::Time> spectrum_num(0); spectrum_num < slice.template dimension<data::Time>(); ++spectrum_num)
106 std::copy(ptr, end_ptr, &*writable_slice[spectrum_num].begin());
110 template<
typename TimeFrequencyType>
111 template<
typename SliceType>
112 typename std::enable_if<pss::astrotypes::is_slice<SliceType>::value && std::remove_reference<SliceType>::type::rank == 1,
void>::type
113 LastUnflaggedAdapter<TimeFrequencyType>::mark_bad(SliceType
const& slice)
115 auto& writable_slice = pss::astrotypes::multiarray::cast_to_non_const_slice(const_cast<SliceType&>(slice));
116 const NumericalRep* ptr = _last_good_spectrum +
static_cast<std::size_t
>(writable_slice.template span<data::Frequency>().start());
117 const NumericalRep* end_ptr = _last_good_spectrum +
static_cast<std::size_t
>(writable_slice.template dimension<data::Frequency>());
118 std::copy(ptr, end_ptr, &*writable_slice.begin());
121 template<
typename TimeFrequencyType>
122 void LastUnflaggedAdapter<TimeFrequencyType>::mark_bad(ConstChannel
const& channel)
124 this->mark_bad( pss::astrotypes::multiarray::cast_to_non_const_slice(const_cast<ConstChannel&>(channel)));
127 template<
typename TimeFrequencyType>
128 void LastUnflaggedAdapter<TimeFrequencyType>::mark_bad(Channel
const& channel)
130 Channel& writable_channel =
const_cast<Channel&
>(channel);
131 auto const& channel_value = _last_good_spectrum[channel.template span<data::Frequency>().start()];
132 std::fill(writable_channel.begin(), writable_channel.end(), channel_value);
135 template<
typename TimeFrequencyType>
138 auto const max = _data->template dimension<data::Time>();
139 for(data::DimensionIndex<data::Time> spectrum_num(0); spectrum_num < max; ++spectrum_num)
142 _data[spectrum_num] = *(_last_good_spectrum +
static_cast<std::size_t
>(channel_number));
Some limits and constants for FLDO.