Citlali
Loading...
Searching...
No Matches
rtcproc.h
Go to the documentation of this file.
1#pragma once
2
3#include <tula/algorithm/ei_stats.h>
4
6
13
14namespace timestream {
15
17
18class RTCProc: public TCProc {
19public:
20 // controls for timestream reduction
30
31 // rtc tod classes
38
39 // minimum allowed frequency distance between tones
41
42 // get config file
43 template <typename config_t>
44 void get_config(config_t &, std::vector<std::vector<std::string>> &, std::vector<std::vector<std::string>> &);
45
46 // get indices to map from detector to index in map vectors
47 template <class calib_t>
48 auto calc_map_indices(calib_t &, std::string);
49
50 // run the main processing
51 template<typename calib_t, typename telescope_t>
53 calib_t &, telescope_t &, double, std::string);
54
55 // remove nearby tones
56 template <typename calib_t>
58
59 // remove flagged detectors
60 template <typename apt_t>
62
63 // append time chunk to tod netcdf file
64 template <typename calib_t, typename pointing_offset_t>
65 void append_to_netcdf(TCData<TCDataKind::PTC, Eigen::MatrixXd> &, std::string, std::string, std::string &,
66 pointing_offset_t &, calib_t &);
67};
68
69// get config file
70template <typename config_t>
71void RTCProc::get_config(config_t &config, std::vector<std::vector<std::string>> &missing_keys,
72 std::vector<std::vector<std::string>> &invalid_keys) {
73 // lower inv var factor
74 get_config_value(config, lower_inv_var_factor, missing_keys, invalid_keys,
75 std::tuple{"timestream","raw_time_chunk","flagging","lower_tod_inv_var_factor"});
76 // upper inv var factor
77 get_config_value(config, upper_inv_var_factor, missing_keys, invalid_keys,
78 std::tuple{"timestream", "raw_time_chunk","flagging","upper_tod_inv_var_factor"});
79 // minimum allowed frequency separation between tones
80 get_config_value(config, delta_f_min_Hz, missing_keys, invalid_keys,
81 std::tuple{"timestream","raw_time_chunk","flagging","delta_f_min_Hz"});
82
83 // run polarization?
84 get_config_value(config, run_polarization, missing_keys, invalid_keys,
85 std::tuple{"timestream","polarimetry","enabled"});
86 // add stokes I, Q, and U if polarization is enabled
87 if (run_polarization) {
88 polarization.stokes_params = {{0,"I"}, {1,"Q"}, {2,"U"}};
89 // use loc or fg?
90 get_config_value(config, polarization.grouping, missing_keys, invalid_keys,
91 std::tuple{"timestream","polarimetry","grouping"});
92 }
93 // otherwise only use stokes I
94 else {
96 }
97
98 // run kernel?
99 get_config_value(config, run_kernel, missing_keys, invalid_keys,
100 std::tuple{"timestream","raw_time_chunk","kernel","enabled"});
101 if (run_kernel) {
102 // filepath to kernel
103 get_config_value(config, kernel.filepath, missing_keys, invalid_keys,
104 std::tuple{"timestream","raw_time_chunk","kernel","filepath"});
105 // type of kernel
106 get_config_value(config, kernel.type, missing_keys, invalid_keys,
107 std::tuple{"timestream","raw_time_chunk","kernel","type"});
108 // kernel fwhm in arcsec
109 get_config_value(config, kernel.fwhm_rad, missing_keys, invalid_keys,
110 std::tuple{"timestream","raw_time_chunk","kernel","fwhm_arcsec"});
111
112 // convert kernel fwhm to radians
114 // get kernel stddev
116
117 // if kernel type is FITS input
118 if (kernel.type == "fits") {
119 // get extension name vector
120 auto img_ext_name_node = config.get_node(std::tuple{"timestream","raw_time_chunk","kernel", "image_ext_names"});
121 // get images
122 for (Eigen::Index i=0; i<img_ext_name_node.size(); ++i) {
123 std::string img_ext_name = config.template get_str(std::tuple{"timestream","raw_time_chunk","kernel", "image_ext_names",
124 i, std::to_string(i)});
125 kernel.img_ext_names.push_back(img_ext_name);
126 }
127 }
128 }
129
130 // run despike?
131 get_config_value(config, run_despike, missing_keys, invalid_keys,
132 std::tuple{"timestream","raw_time_chunk","despike","enabled"});
133 if (run_despike) {
134 // minimum spike sigma
135 get_config_value(config, despiker.min_spike_sigma, missing_keys, invalid_keys,
136 std::tuple{"timestream","raw_time_chunk","despike","min_spike_sigma"});
137 // decay time constant
138 get_config_value(config, despiker.time_constant_sec, missing_keys, invalid_keys,
139 std::tuple{"timestream","raw_time_chunk","despike","time_constant_sec"});
140 // window size for spikes
141 get_config_value(config, despiker.window_size, missing_keys, invalid_keys,
142 std::tuple{"timestream","raw_time_chunk","despike","window_size"});
143
144 // how to group spike finding and replacement
145 despiker.grouping = "nw";
146 }
147
148 // run filter?
149 get_config_value(config, run_tod_filter, missing_keys, invalid_keys,
150 std::tuple{"timestream","raw_time_chunk","filter","enabled"});
151 if (run_tod_filter) {
152 // tod filter gibbs param
153 get_config_value(config, filter.a_gibbs, missing_keys, invalid_keys,
154 std::tuple{"timestream","raw_time_chunk","filter","a_gibbs"});
155 // lower frequency limit
156 get_config_value(config, filter.freq_low_Hz, missing_keys, invalid_keys,
157 std::tuple{"timestream","raw_time_chunk","filter","freq_low_Hz"});
158 // upper frequency limit
159 get_config_value(config, filter.freq_high_Hz, missing_keys, invalid_keys,
160 std::tuple{"timestream","raw_time_chunk","filter","freq_high_Hz"});
161 // filter size
162 get_config_value(config, filter.n_terms, missing_keys, invalid_keys,
163 std::tuple{"timestream","raw_time_chunk","filter","n_terms"});
164
165 // replace despiker window size
167 }
168 else {
169 // explicitly set filter size to zero for inner time chunks
170 filter.n_terms = 0;
171 }
172
173 // run downsampling?
174 get_config_value(config, run_downsample, missing_keys, invalid_keys,
175 std::tuple{"timestream","raw_time_chunk","downsample","enabled"});
176 if (run_downsample) {
177 // check if tod filtering is enabled
178 if (!run_tod_filter) {
179 logger->error("running downsampling without tod filtering will lose data!");
180 std::exit(EXIT_FAILURE);
181 }
182 // downsample factor
183 get_config_value(config, downsampler.factor, missing_keys, invalid_keys,
184 std::tuple{"timestream","raw_time_chunk","downsample","factor"},{},{0});
185 // downsample frequency
186 get_config_value(config, downsampler.downsampled_freq_Hz, missing_keys, invalid_keys,
187 std::tuple{"timestream","raw_time_chunk","downsample","downsampled_freq_Hz"});
188 }
189
190 // run flux calibration?
191 get_config_value(config, run_calibrate, missing_keys, invalid_keys,
192 std::tuple{"timestream","raw_time_chunk","flux_calibration","enabled"});
193 // run extinction correction?
194 get_config_value(config, run_extinction, missing_keys, invalid_keys,
195 std::tuple{"timestream","raw_time_chunk","extinction_correction","enabled"});
196}
197
198template <class calib_t>
199auto RTCProc::calc_map_indices(calib_t &calib, std::string map_grouping) {
200 // indices for maps
201 Eigen::VectorXI indices(calib.n_dets), map_indices(calib.n_dets);
202
203 // number of maps from grouping
204 int n_maps = 0;
205
206 // overwrite map indices for networks
207 if (map_grouping == "nw") {
208 indices = calib.apt["nw"].template cast<Eigen::Index> ();
209 n_maps = calib.n_nws;
210 }
211 // overwrite map indices for arrays
212 else if (map_grouping == "array") {
213 indices = calib.apt["array"].template cast<Eigen::Index> ();
214 n_maps = calib.n_arrays;
215 }
216 // overwrite map indices for detectors
217 else if (map_grouping == "detector") {
218 indices = Eigen::VectorXI::LinSpaced(calib.n_dets,0,calib.n_dets-1);
219 n_maps = calib.n_dets;
220 }
221 // overwrite map indices for fg
222 else if (map_grouping == "fg") {
223 indices = calib.apt["fg"].template cast<Eigen::Index> ();
224 n_maps = calib.fg.size()*calib.n_arrays;
225 }
226 // start at 0
227 if (map_grouping != "fg") {
228 Eigen::Index map_index = 0;
229 map_indices(0) = 0;
230 // loop through and populate map indices
231 for (Eigen::Index i=0; i<indices.size()-1; ++i) {
232 // if next index is larger than current index, increment map index
233 if (indices(i+1) > indices(i)) {
234 map_index++;
235 }
236 map_indices(i+1) = map_index;
237 }
238 }
239 else {
240 // convert fg to indices
241 std::map<Eigen::Index, Eigen::Index> fg_to_index, array_to_index;
242
243 // get mapping from fg to map index
244 for (Eigen::Index i=0; i<calib.fg.size(); ++i) {
245 fg_to_index[calib.fg(i)] = i;
246 }
247 // get mapping from fg to map index
248 for (Eigen::Index i=0; i<calib.arrays.size(); ++i) {
249 array_to_index[calib.arrays(i)] = i;
250 }
251 // allocate map indices from fg
252 for (Eigen::Index i=0; i<indices.size(); ++i) {
253 map_indices(i) = fg_to_index[indices(i)] + calib.fg.size()*array_to_index[calib.apt["array"](i)];
254 }
255 }
256 // return the map indices
257 return std::move(map_indices);
258}
259
260template<class calib_t, typename telescope_t>
262 calib_t &calib, telescope_t &telescope, double pixel_size_rad, std::string map_grouping) {
263
264 // number of points in scan
265 Eigen::Index n_pts = in.scans.data.rows();
266
267 // start index of inner scans
268 auto si = filter.n_terms;
269 // end index of inner scans
270 auto sl = in.scan_indices.data(1) - in.scan_indices.data(0) + 1;
271
272 // calculate the polarization angle
273 if (run_polarization) {
274 polarization.calc_angle(in, calib);
275 }
276
277 // resize fcf
278 in.fcf.data.setOnes(in.scans.data.cols());
279
280 // get indices for maps
281 logger->debug("calculating map indices");
282 auto map_indices = calc_map_indices(calib, map_grouping);
283
284 if (run_calibrate) {
285 logger->debug("calibrating timestream");
286 // calibrate tod
287 calibration.calibrate_tod(in, calib);
288
289 in.status.calibrated = true;
290 }
291
292 if (run_extinction) {
293 logger->debug("correcting extinction");
294 // calc tau at toltec frequencies
295 auto tau_freq = calibration.calc_tau(in.tel_data.data["TelElAct"], telescope.tau_225_GHz);
296 // correct for extinction
297 calibration.extinction_correction(in, calib, tau_freq);
298
299 in.status.extinction_corrected = true;
300 }
301
302 // create kernel if requested
303 if (run_kernel) {
304 logger->debug("creating kernel timestream");
305 // symmetric gaussian kernel
306 if (kernel.type == "gaussian") {
307 logger->debug("creating symmetric gaussian kernel");
308 kernel.create_symmetric_gaussian_kernel(in, telescope.pixel_axes, calib.apt);
309 }
310 // airy kernel
311 else if (kernel.type == "airy") {
312 logger->debug("creating airy kernel");
313 kernel.create_airy_kernel(in, telescope.pixel_axes, calib.apt);
314 }
315 // get kernel from fits
316 else if (kernel.type == "fits") {
317 logger->debug("getting kernel from fits");
318 kernel.create_kernel_from_fits(in, telescope.pixel_axes, calib.apt, pixel_size_rad, map_indices);
319 }
320
321 in.status.kernel_generated = true;
322 }
323
324 // run despiking
325 if (run_despike) {
326 logger->debug("despiking");
327 // despike data
328 despiker.despike(in.scans.data, in.flags.data, calib.apt);
329
330 // we want to replace spikes on a per array or network basis
331 auto grp_limits = get_grouping(despiker.grouping, calib, in.scans.data.cols());
332
333 logger->debug("replacing spikes");
334 for (auto const& [key, val] : grp_limits) {
335 // starting index
336 auto start_index = std::get<0>(val);
337 // size of block for each grouping
338 auto n_dets = std::get<1>(val) - std::get<0>(val);
339
340 // get the reference block of in scans that corresponds to the current array
341 Eigen::Ref<Eigen::MatrixXd> in_scans_ref = in.scans.data.block(0, start_index, n_pts, n_dets);
342 // eigen map to reference for input scans
343 Eigen::Map<Eigen::MatrixXd, 0, Eigen::OuterStride<>>
344 in_scans(in_scans_ref.data(), in_scans_ref.rows(), in_scans_ref.cols(),
345 Eigen::OuterStride<>(in_scans_ref.outerStride()));
346
347 // get the block of in flags that corresponds to the current array
348 Eigen::Ref<Eigen::Matrix<bool,Eigen::Dynamic,Eigen::Dynamic>> in_flags_ref =
349 in.flags.data.block(0, start_index, n_pts, n_dets);
350 // eigen map to reference for input flags
351 Eigen::Map<Eigen::Matrix<bool,Eigen::Dynamic,Eigen::Dynamic>, 0, Eigen::OuterStride<> >
352 in_flags(in_flags_ref.data(), in_flags_ref.rows(), in_flags_ref.cols(),
353 Eigen::OuterStride<>(in_flags_ref.outerStride()));
354
355 // replace spikes
356 despiker.replace_spikes(in_scans, in_flags, calib.apt, start_index);
357 }
358
359 in.status.despiked = true;
360 }
361
362 // timestream filtering
363 if (run_tod_filter) {
364 logger->debug("convolving signal with tod filter");
365 filter.convolve(in.scans.data);
366 //filter.iir(in.scans.data);
367
368 // filter kernel
369 if (run_kernel) {
370 logger->debug("convolving kernel with tod filter");
371 filter.convolve(in.kernel.data);
372 }
373
374 in.status.tod_filtered = true;
375 }
376
377 if (run_downsample) {
378 logger->debug("downsampling data");
379 // get the block of out scans that corresponds to the inner scan indices
380 Eigen::Ref<Eigen::Map<Eigen::MatrixXd>> in_scans =
381 in.scans.data.block(si, 0, sl, in.scans.data.cols());
382
383 // get the block of in flags that corresponds to the inner scan indices
384 Eigen::Ref<Eigen::Matrix<bool,Eigen::Dynamic,Eigen::Dynamic>> in_flags =
385 in.flags.data.block(si, 0, sl, in.flags.data.cols());
386
387 // downsample scans
388 downsampler.downsample(in_scans, out.scans.data);
389 // downsample flags
390 downsampler.downsample(in_flags, out.flags.data);
391
392 // loop through telescope meta data and downsample
393 logger->debug("downsampling telescope");
394 for (auto const& x: in.tel_data.data) {
395 // get the block of in tel data that corresponds to the inner scan indices
396 Eigen::Ref<Eigen::VectorXd> in_tel =
397 in.tel_data.data[x.first].segment(si,sl);
398
399 downsampler.downsample(in_tel, out.tel_data.data[x.first]);
400 }
401
402 // downsample pointing
403 for (auto const& x: in.pointing_offsets_arcsec.data) {
404 Eigen::Ref<Eigen::VectorXd> in_pointing =
405 in.pointing_offsets_arcsec.data[x.first].segment(si,sl);
406
407 downsampler.downsample(in_pointing, out.pointing_offsets_arcsec.data[x.first]);
408 }
409
410 if (run_polarization) {
411 if (calib.run_hwpr) {
412 // downsample hwpr
413 Eigen::Ref<Eigen::VectorXd> in_hwpr =
414 in.hwpr_angle.data.segment(si,sl);
415 downsampler.downsample(in_hwpr, out.hwpr_angle.data);
416 }
417 // downsample detector angle
418 Eigen::Ref<Eigen::VectorXd> in_angle =
419 in.angle.data.segment(si, sl);
420 downsampler.downsample(in_angle, out.angle.data);
421 }
422 // downsample kernel if requested
423 if (run_kernel) {
424 logger->debug("downsampling kernel");
425 // get the block of in kernel scans that corresponds to the inner scan indices
426 Eigen::Ref<Eigen::MatrixXd> in_kernel =
427 in.kernel.data.block(si, 0, sl, in.kernel.data.cols());
428
429 downsampler.downsample(in_kernel, out.kernel.data);
430 }
431
432 in.status.downsampled = true;
433 }
434
435 else {
436 // copy data
437 out.scans.data = in.scans.data.block(si, 0, sl, in.scans.data.cols());
438 // copy flags
439 out.flags.data = in.flags.data.block(si, 0, sl, in.flags.data.cols());
440 // copy kernel
441 if (run_kernel) {
442 out.kernel.data = in.kernel.data.block(si, 0, sl, in.kernel.data.cols());
443 }
444 // copy telescope data
445 for (auto const& x: in.tel_data.data) {
446 out.tel_data.data[x.first] = in.tel_data.data[x.first].segment(si,sl);
447 }
448 // copy pointing offsets
449 for (auto const& x: in.pointing_offsets_arcsec.data) {
450 out.pointing_offsets_arcsec.data[x.first] = in.pointing_offsets_arcsec.data[x.first].segment(si,sl);
451 }
452
453 if (run_polarization) {
454 // copy hwpr angle
455 if (calib.run_hwpr) {
456 out.hwpr_angle.data = in.hwpr_angle.data.segment(si,sl);
457 }
458 // copy detector angle
459 out.angle.data = in.angle.data.segment(si,sl);
460 }
461 }
462
463 // copy scan indices
464 out.scan_indices.data = in.scan_indices.data;
465 // copy scan index
466 out.index.data = in.index.data;
467 // copy fcf
468 out.fcf.data = in.fcf.data;
469 // copy chunk status
470 out.status = in.status;
471 // copy noise
472 out.noise.data = in.noise.data;
473
474 // empty rtcdata
475 in.scans.data.resize(0,0);
476 in.flags.data.resize(0,0);
477 in.kernel.data.resize(0,0);
478 in.tel_data.data.clear();
479 in.pointing_offsets_arcsec.data.clear();
480 if (run_polarization) {
481 if (calib.run_hwpr) {
482 in.hwpr_angle.data.resize(0);
483 }
484 in.angle.data.resize(0);
485 }
486
487 in.noise.data.resize(0,0);
488
489 return map_indices;
490}
491
492template <typename apt_t>
494
495 // number of detectors
496 Eigen::Index n_dets = in.scans.data.cols();
497
498 // number of detectors flagged in apt
499 Eigen::Index n_flagged = 0;
500
501 // loop through detectors and set flags to one
502 // for those flagged in apt table
503 for (Eigen::Index i=0; i<n_dets; ++i) {
504 Eigen::Index det_index = i;
505 if (apt["flag"](det_index)!=0) {
506 in.flags.data.col(i).setOnes();
507 n_flagged++;
508 }
509 }
510
511 logger->info("removed {} detectors flagged in APT table ({}%)",n_flagged,
512 (static_cast<float>(n_flagged)/static_cast<float>(n_dets))*100);
513}
514
515template <typename calib_t>
516auto RTCProc::remove_nearby_tones(TCData<TCDataKind::PTC, Eigen::MatrixXd> &in, calib_t &calib, std::string map_grouping) {
517
518 // make a copy of the calib class for flagging
519 calib_t calib_scan = calib;
520
521 // number of detectors
522 Eigen::Index n_dets = in.scans.data.cols();
523
524 int n_nearby_tones = 0;
525
526 // loop through flag columns
527 for (Eigen::Index i=0; i<n_dets; ++i) {
528 // map from data column to apt row
529 Eigen::Index det_index = i;
530 // if closer than freq separation limit and unflagged, flag it
531 if (calib.apt["duplicate_tone"](det_index) && calib_scan.apt["flag"](det_index)==0) {
532 n_nearby_tones++;
533 // increment number of nearby tones
534 if (map_grouping!="detector") {
535 in.flags.data.col(i).setOnes();
536 }
537 else {
538 calib_scan.apt["flag"](det_index) = 1;
539 }
540 }
541 }
542
543 logger->info("removed {}/{} ({}%) unflagged tones closer than {} kHz", n_nearby_tones, n_dets,
544 (static_cast<float>(n_nearby_tones)/static_cast<float>(n_dets))*100, delta_f_min_Hz/1000);
545
546 // set up scan calib
547 calib_scan.setup();
548
549 return std::move(calib_scan);
550}
551
552template <typename calib_t, typename pointing_offset_t>
553void RTCProc::append_to_netcdf(TCData<TCDataKind::PTC, Eigen::MatrixXd> &in, std::string filepath, std::string map_grouping,
554 std::string &pixel_axes, pointing_offset_t &pointing_offsets_arcsec, calib_t &calib) {
555 using netCDF::NcDim;
556 using netCDF::NcFile;
557 using netCDF::NcType;
558 using netCDF::NcVar;
559 using namespace netCDF::exceptions;
560
561 try {
562 // open netcdf file
563 NcFile fo(filepath, netCDF::NcFile::write);
564
565 // append common time chunk variables
566 append_base_to_netcdf(fo, in, map_grouping, pixel_axes, pointing_offsets_arcsec, calib);
567
568 // sync file to make sure it gets updated
569 fo.sync();
570 // close file
571 fo.close();
572
573 logger->info("tod chunk written to {}", filepath);
574
575 } catch (NcException &e) {
576 logger->error("{}", e.what());
577 }
578}
579
580} // namespace timestream
Definition calibrate.h:12
void extinction_correction(TCData< tcdata_kind, Eigen::MatrixXd > &, calib_t &, tau_t &)
Definition calibrate.h:192
auto calc_tau(Eigen::DenseBase< Derived > &, double)
Definition calibrate.h:136
void calibrate_tod(TCData< tcdata_kind, Eigen::MatrixXd > &, calib_t &)
Definition calibrate.h:176
Definition despike.h:15
void despike(Eigen::DenseBase< DerivedA > &, Eigen::DenseBase< DerivedB > &, apt_t &)
Definition despike.h:155
std::string grouping
Definition despike.h:34
void replace_spikes(Eigen::DenseBase< DerivedA > &, Eigen::DenseBase< DerivedB > &, apt_t &, Eigen::Index)
Definition despike.h:328
double time_constant_sec
Definition despike.h:21
double window_size
Definition despike.h:21
double min_spike_sigma
Definition despike.h:21
Definition downsample.h:5
void downsample(Eigen::DenseBase< DerivedA > &in, Eigen::DenseBase< DerivedB > &out)
Definition downsample.h:11
double downsampled_freq_Hz
Definition downsample.h:8
int factor
Definition downsample.h:7
Definition filter.h:14
double freq_high_Hz
Definition filter.h:16
double a_gibbs
Definition filter.h:16
double freq_low_Hz
Definition filter.h:16
void convolve(Eigen::DenseBase< Derived > &)
Definition filter.h:137
Eigen::Index n_terms
Definition filter.h:19
Definition kernel.h:13
std::string type
Definition kernel.h:15
double sigma_rad
Definition kernel.h:22
std::string filepath
Definition kernel.h:15
std::vector< std::string > img_ext_names
Definition kernel.h:16
void create_kernel_from_fits(TCData< TCDataKind::RTC, Eigen::MatrixXd > &, std::string &, apt_t &, double, Eigen::DenseBase< Derived > &)
Definition kernel.h:203
void create_symmetric_gaussian_kernel(TCData< TCDataKind::RTC, Eigen::MatrixXd > &, std::string &, apt_t &)
Definition kernel.h:65
double fwhm_rad
Definition kernel.h:22
void create_airy_kernel(TCData< TCDataKind::RTC, Eigen::MatrixXd > &, std::string &, apt_t &)
Definition kernel.h:165
Definition polarization.h:12
std::map< int, std::string > stokes_params
Definition polarization.h:15
std::string grouping
Definition polarization.h:18
void calc_angle(TCData< td_kind, Eigen::MatrixXd > &in, calib_type &calib)
Definition polarization.h:21
Definition rtcproc.h:18
void remove_flagged_dets(TCData< TCDataKind::PTC, Eigen::MatrixXd > &, apt_t &)
Definition rtcproc.h:493
bool run_polarization
Definition rtcproc.h:23
double delta_f_min_Hz
Definition rtcproc.h:40
bool run_timestream
Definition rtcproc.h:21
bool run_kernel
Definition rtcproc.h:24
auto calc_map_indices(calib_t &, std::string)
Definition rtcproc.h:199
void get_config(config_t &, std::vector< std::vector< std::string > > &, std::vector< std::vector< std::string > > &)
Definition rtcproc.h:71
bool run_calibrate
Definition rtcproc.h:28
bool run_pointing
Definition rtcproc.h:22
bool run_downsample
Definition rtcproc.h:27
timestream::Filter filter
Definition rtcproc.h:35
bool run_tod_filter
Definition rtcproc.h:26
auto remove_nearby_tones(TCData< TCDataKind::PTC, Eigen::MatrixXd > &, calib_t &, std::string)
Definition rtcproc.h:516
timestream::Downsampler downsampler
Definition rtcproc.h:36
bool run_despike
Definition rtcproc.h:25
bool run_extinction
Definition rtcproc.h:29
timestream::Calibration calibration
Definition rtcproc.h:37
void append_to_netcdf(TCData< TCDataKind::PTC, Eigen::MatrixXd > &, std::string, std::string, std::string &, pointing_offset_t &, calib_t &)
Definition rtcproc.h:553
auto run(TCData< TCDataKind::RTC, Eigen::MatrixXd > &, TCData< TCDataKind::PTC, Eigen::MatrixXd > &, calib_t &, telescope_t &, double, std::string)
Definition rtcproc.h:261
timestream::Despiker despiker
Definition rtcproc.h:34
timestream::Kernel kernel
Definition rtcproc.h:33
timestream::Polarization polarization
Definition rtcproc.h:32
Definition timestream.h:257
auto get_grouping(std::string, calib_t &, int)
Definition timestream.h:572
std::shared_ptr< spdlog::logger > logger
Definition timestream.h:260
double upper_inv_var_factor
Definition timestream.h:302
void append_base_to_netcdf(netCDF::NcFile &, TCData< tcdata_t, Eigen::MatrixXd > &, std::string, std::string &, pointing_offset_t &, calib_t &)
Definition timestream.h:968
double lower_inv_var_factor
Definition timestream.h:302
void get_config_value(config_t config, param_t &param, key_vec_t &missing_keys, key_vec_t &invalid_keys, option_t option, std::vector< param_t > allowed={}, std::vector< param_t > min_val={}, std::vector< param_t > max_val={})
Definition config.h:58
#define FWHM_TO_STD
Definition constants.h:48
#define ASEC_TO_RAD
Definition constants.h:33
Definition clean.h:10
TC data class.
Definition timestream.h:55