24 #include "cheetah/generators/RfiScenario.h" 30 namespace generators {
35 RfiScenario<0, T>::RfiScenario()
40 RfiScenario<0, T>::~RfiScenario()
45 void RfiScenario<0, T>::next(FlaggedDataType&)
50 constexpr
char RfiScenario<0,T>::description[];
54 RfiScenario<1, T>::RfiScenario()
59 RfiScenario<1, T>::~RfiScenario()
64 constexpr
char RfiScenario<1,T>::description[];
67 void RfiScenario<1, T>::next(FlaggedDataType& data)
70 std::size_t min_channel = data.number_of_channels()/factor;
71 std::size_t max_channel = (factor - 1) * min_channel;
72 std::size_t min_sample = data.number_of_spectra()/factor;
73 std::size_t max_sample = (factor - 1) * min_sample;
75 this->rfi_ramp_block(data, min_channel, max_channel, min_sample, max_sample);
83 RfiScenario<2, T>::RfiScenario()
88 RfiScenario<2, T>::~RfiScenario()
93 constexpr
char RfiScenario<2,T>::description[];
96 void RfiScenario<2, T>::next(FlaggedDataType& data)
98 std::size_t pulse_channel_centre = data.number_of_channels()/2;
99 std::size_t pulse_sample_centre = data.number_of_spectra()/2;
100 unsigned channel_range = data.number_of_channels()/4;
101 unsigned sample_range = data.number_of_spectra()/2;
102 if(channel_range>32) channel_range=32;
103 if(sample_range>64) sample_range=64;
104 std::size_t min_channel = pulse_channel_centre-channel_range;
105 std::size_t max_channel = pulse_channel_centre+channel_range;
106 std::size_t min_sample = pulse_sample_centre-sample_range;
107 std::size_t max_sample = pulse_sample_centre+sample_range;
109 this->rfi_gaussian_block(data, min_channel, max_channel, min_sample, max_sample,6.0);
114 RfiScenario<3, T>::RfiScenario()
119 RfiScenario<3, T>::~RfiScenario()
124 constexpr
char RfiScenario<3,T>::description[];
127 void RfiScenario<3, T>::next(FlaggedDataType& data)
129 unsigned channel_range = data.number_of_channels()/4;
130 unsigned sample_range = data.number_of_spectra()/2;
131 if(channel_range>32) channel_range = 32;
132 if(sample_range>64) sample_range = 64;
134 std::random_device rd;
135 std::mt19937 mt(rd());
136 std::uniform_int_distribution<int> dist(sample_range, data.number_of_spectra()-sample_range);
138 std::size_t pulse_channel_centre = data.number_of_channels()/4;
139 std::size_t min_channel = pulse_channel_centre-channel_range;
140 std::size_t max_channel = pulse_channel_centre+channel_range;
145 pulse_channel_centre = 3*data.number_of_channels()/4;
146 min_channel = pulse_channel_centre-channel_range;
147 max_channel = pulse_channel_centre+channel_range;
149 std::size_t pulse_sample_centre = dist(mt);
151 std::size_t min_sample = pulse_sample_centre-sample_range;
152 std::size_t max_sample = pulse_sample_centre+sample_range;
153 this->rfi_gaussian_block(data, min_channel, max_channel, min_sample, max_sample,6.0);
159 RfiScenario<4, T>::RfiScenario()
164 RfiScenario<4, T>::~RfiScenario()
169 constexpr
char RfiScenario<4,T>::description[];
172 void RfiScenario<4, T>::next(FlaggedDataType& data)
174 unsigned channel_range = data.number_of_channels()/4;
175 unsigned sample_range = data.number_of_spectra()/2;
176 if(channel_range>32) channel_range = 32;
177 if(sample_range>128) sample_range = 128;
179 std::random_device rd;
180 std::mt19937 mt(rd());
181 std::uniform_int_distribution<int> sample_dist(sample_range, data.number_of_spectra()-sample_range);
182 std::uniform_int_distribution<int> channel_dist(channel_range, data.number_of_channels()-channel_range);
183 std::uniform_int_distribution<int> sample_width_dist(sample_range/8, 2*sample_range);
184 std::uniform_int_distribution<int> channel_width_dist(channel_range/4, 2*channel_range);
185 unsigned number_of_pulses = 8;
186 for(
unsigned i=0;i<number_of_pulses;++i)
188 std::size_t pulse_channel_width = channel_width_dist(mt);
189 std::size_t pulse_sample_width = sample_width_dist(mt);
191 std::size_t pulse_channel_centre = channel_dist(mt);
192 std::size_t min_channel = pulse_channel_centre-pulse_channel_width/2;
193 std::size_t max_channel = pulse_channel_centre+pulse_channel_width/2;
195 std::size_t pulse_sample_centre = sample_dist(mt);
197 std::size_t min_sample = pulse_sample_centre-pulse_sample_width/2;
198 std::size_t max_sample = pulse_sample_centre+pulse_sample_width/2;
199 this->rfi_gaussian_block(data, min_channel, max_channel, min_sample, max_sample,6.0);
205 RfiScenario<5, T>::RfiScenario()
210 RfiScenario<5, T>::~RfiScenario()
215 constexpr
char RfiScenario<5,T>::description[];
218 void RfiScenario<5, T>::next(FlaggedDataType& data)
221 data::DimensionIndex<data::Frequency> channel_number(data.template dimension<data::Frequency>()/2);
223 auto channel = data.tf_data().channel(channel_number);
224 std::fill(channel.begin(), channel.end(), std::numeric_limits<T>::max());
225 auto flag_channel = data.rfi_flags().overlay(channel);
226 std::fill(flag_channel.begin(), flag_channel.end(),
true);
232 RfiScenario<6, T>::RfiScenario()
237 RfiScenario<6, T>::~RfiScenario()
242 constexpr
char RfiScenario<6,T>::description[];
245 void RfiScenario<6, T>::next(FlaggedDataType& data)
247 unsigned min_channel = data.number_of_channels()/2 - data.number_of_channels()/16;
248 unsigned max_channel = data.number_of_channels()/2 + data.number_of_channels()/16;
250 unsigned factor = 128;
251 unsigned sample_stride = data.number_of_spectra()/(4*factor);
253 std::size_t min_sample = 1*sample_stride;
254 std::size_t max_sample = 3*sample_stride;
256 for(
unsigned i=0; i<factor-1; ++i)
258 min_sample += 4*sample_stride;
259 max_sample += 4*sample_stride;
261 this->rfi_gaussian_block(data, min_channel, max_channel, min_sample, max_sample,6.0);
267 RfiScenario<7, T>::RfiScenario()
272 RfiScenario<7, T>::~RfiScenario()
277 constexpr
char RfiScenario<7,T>::description[];
280 void RfiScenario<7, T>::next(FlaggedDataType& data)
282 unsigned sample_range = data.number_of_spectra()/4;
283 if(sample_range>8) sample_range = 8;
285 std::size_t min_sample = data.number_of_spectra()/2 - sample_range;
286 std::size_t max_sample = data.number_of_spectra()/2 + sample_range;
288 this->rfi_broadband_block(data, min_sample, max_sample,6.0);
293 RfiScenario<8, T>::RfiScenario()
298 RfiScenario<8, T>::~RfiScenario()
303 constexpr
char RfiScenario<8,T>::description[];
306 void RfiScenario<8, T>::next(FlaggedDataType& data)
308 unsigned min_channel = data.number_of_channels()/2 - data.number_of_channels()/16;
309 unsigned max_channel = data.number_of_channels()/2 + data.number_of_channels()/16;
311 unsigned factor = 128;
312 unsigned sample_stride = data.number_of_spectra()/(4*factor);
314 std::size_t min_sample = 1*sample_stride;
315 std::size_t max_sample = 3*sample_stride;
317 for(
unsigned i=0; i<factor-1; ++i)
319 min_sample += 4*sample_stride;
320 max_sample += 4*sample_stride;
322 this->rfi_gaussian_block(data, min_channel, max_channel, min_sample, max_sample,4.0);
328 RfiScenario<9, T>::RfiScenario()
333 RfiScenario<9, T>::~RfiScenario()
338 constexpr
char RfiScenario<9,T>::description[];
341 void RfiScenario<9, T>::next(FlaggedDataType& data)
343 unsigned min_channel = 0;
344 unsigned max_channel = data.number_of_channels()-1;
346 unsigned sample_range = data.number_of_spectra()/4;
347 if(sample_range>8) sample_range = 8;
349 std::size_t min_sample = data.number_of_spectra()/2 - sample_range;
350 std::size_t max_sample = data.number_of_spectra()/2 + sample_range;
352 this->rfi_gaussian_block(data, min_channel, max_channel, min_sample, max_sample,4.0);
357 RfiScenario<10, T>::RfiScenario()
362 RfiScenario<10, T>::~RfiScenario()
367 constexpr
char RfiScenario<10,T>::description[];
370 void RfiScenario<10, T>::next(FlaggedDataType& data)
372 unsigned factor = 128;
373 unsigned sample_stride = data.number_of_spectra()/(4*factor);
375 std::size_t min_sample = 1*sample_stride;
376 std::size_t max_sample = 3*sample_stride;
378 for(
unsigned i=0; i<factor-1; ++i)
380 min_sample += 4*sample_stride;
381 max_sample += 4*sample_stride;
383 this->rfi_broadband_block(data, min_sample, max_sample,5.0);
Some limits and constants for FLDO.