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 // set up flags
325 in.flags.data.resize(n_pts, in.scans.data.cols());
326 in.flags.data.setConstant(false);
327
328 // run despiking
329 if (run_despike) {
330 logger->debug("despiking");
331 // despike data
332 despiker.despike(in.scans.data, in.flags.data, calib.apt);
333
334 // we want to replace spikes on a per array or network basis
335 auto grp_limits = get_grouping(despiker.grouping, calib, in.scans.data.cols());
336
337 logger->debug("replacing spikes");
338 for (auto const& [key, val] : grp_limits) {
339 // starting index
340 auto start_index = std::get<0>(val);
341 // size of block for each grouping
342 auto n_dets = std::get<1>(val) - std::get<0>(val);
343
344 // get the reference block of in scans that corresponds to the current array
345 Eigen::Ref<Eigen::MatrixXd> in_scans_ref = in.scans.data.block(0, start_index, n_pts, n_dets);
346 // eigen map to reference for input scans
347 Eigen::Map<Eigen::MatrixXd, 0, Eigen::OuterStride<>>
348 in_scans(in_scans_ref.data(), in_scans_ref.rows(), in_scans_ref.cols(),
349 Eigen::OuterStride<>(in_scans_ref.outerStride()));
350
351 // get the block of in flags that corresponds to the current array
352 Eigen::Ref<Eigen::Matrix<bool,Eigen::Dynamic,Eigen::Dynamic>> in_flags_ref =
353 in.flags.data.block(0, start_index, n_pts, n_dets);
354 // eigen map to reference for input flags
355 Eigen::Map<Eigen::Matrix<bool,Eigen::Dynamic,Eigen::Dynamic>, 0, Eigen::OuterStride<> >
356 in_flags(in_flags_ref.data(), in_flags_ref.rows(), in_flags_ref.cols(),
357 Eigen::OuterStride<>(in_flags_ref.outerStride()));
358
359 // replace spikes
360 despiker.replace_spikes(in_scans, in_flags, calib.apt, start_index);
361 }
362
363 in.status.despiked = true;
364 }
365
366 // timestream filtering
367 if (run_tod_filter) {
368 logger->debug("convolving signal with tod filter");
369 filter.convolve(in.scans.data);
370 //filter.iir(in.scans.data);
371
372 // filter kernel
373 if (run_kernel) {
374 logger->debug("convolving kernel with tod filter");
375 filter.convolve(in.kernel.data);
376 }
377
378 in.status.tod_filtered = true;
379 }
380
381 if (run_downsample) {
382 logger->debug("downsampling data");
383 // get the block of out scans that corresponds to the inner scan indices
384 Eigen::Ref<Eigen::Map<Eigen::MatrixXd>> in_scans =
385 in.scans.data.block(si, 0, sl, in.scans.data.cols());
386
387 // get the block of in flags that corresponds to the inner scan indices
388 Eigen::Ref<Eigen::Matrix<bool,Eigen::Dynamic,Eigen::Dynamic>> in_flags =
389 in.flags.data.block(si, 0, sl, in.flags.data.cols());
390
391 // downsample scans
392 downsampler.downsample(in_scans, out.scans.data);
393 // downsample flags
394 downsampler.downsample(in_flags, out.flags.data);
395
396 // loop through telescope meta data and downsample
397 logger->debug("downsampling telescope");
398 for (auto const& x: in.tel_data.data) {
399 // get the block of in tel data that corresponds to the inner scan indices
400 Eigen::Ref<Eigen::VectorXd> in_tel =
401 in.tel_data.data[x.first].segment(si,sl);
402
403 downsampler.downsample(in_tel, out.tel_data.data[x.first]);
404 }
405
406 // downsample pointing
407 for (auto const& x: in.pointing_offsets_arcsec.data) {
408 Eigen::Ref<Eigen::VectorXd> in_pointing =
409 in.pointing_offsets_arcsec.data[x.first].segment(si,sl);
410
411 downsampler.downsample(in_pointing, out.pointing_offsets_arcsec.data[x.first]);
412 }
413
414 if (run_polarization) {
415 if (calib.run_hwpr) {
416 // downsample hwpr
417 Eigen::Ref<Eigen::VectorXd> in_hwpr =
418 in.hwpr_angle.data.segment(si,sl);
419 downsampler.downsample(in_hwpr, out.hwpr_angle.data);
420 }
421 // downsample detector angle
422 Eigen::Ref<Eigen::VectorXd> in_angle =
423 in.angle.data.segment(si, sl);
424 downsampler.downsample(in_angle, out.angle.data);
425 }
426 // downsample kernel if requested
427 if (run_kernel) {
428 logger->debug("downsampling kernel");
429 // get the block of in kernel scans that corresponds to the inner scan indices
430 Eigen::Ref<Eigen::MatrixXd> in_kernel =
431 in.kernel.data.block(si, 0, sl, in.kernel.data.cols());
432
433 downsampler.downsample(in_kernel, out.kernel.data);
434 }
435
436 in.status.downsampled = true;
437 }
438
439 else {
440 // copy data
441 out.scans.data = in.scans.data.block(si, 0, sl, in.scans.data.cols());
442 // copy flags
443 out.flags.data = in.flags.data.block(si, 0, sl, in.flags.data.cols());
444 // copy kernel
445 if (run_kernel) {
446 out.kernel.data = in.kernel.data.block(si, 0, sl, in.kernel.data.cols());
447 }
448 // copy telescope data
449 for (auto const& x: in.tel_data.data) {
450 out.tel_data.data[x.first] = in.tel_data.data[x.first].segment(si,sl);
451 }
452 // copy pointing offsets
453 for (auto const& x: in.pointing_offsets_arcsec.data) {
454 out.pointing_offsets_arcsec.data[x.first] = in.pointing_offsets_arcsec.data[x.first].segment(si,sl);
455 }
456
457 if (run_polarization) {
458 // copy hwpr angle
459 if (calib.run_hwpr) {
460 out.hwpr_angle.data = in.hwpr_angle.data.segment(si,sl);
461 }
462 // copy detector angle
463 out.angle.data = in.angle.data.segment(si,sl);
464 }
465 }
466
467 // copy scan indices
468 out.scan_indices.data = in.scan_indices.data;
469 // copy scan index
470 out.index.data = in.index.data;
471 // copy fcf
472 out.fcf.data = in.fcf.data;
473 // copy chunk status
474 out.status = in.status;
475 // copy noise
476 out.noise.data = in.noise.data;
477
478 // empty rtcdata
479 in.scans.data.resize(0,0);
480 in.flags.data.resize(0,0);
481 in.kernel.data.resize(0,0);
482 in.tel_data.data.clear();
483 in.pointing_offsets_arcsec.data.clear();
484 if (run_polarization) {
485 if (calib.run_hwpr) {
486 in.hwpr_angle.data.resize(0);
487 }
488 in.angle.data.resize(0);
489 }
490
491 in.noise.data.resize(0,0);
492
493 return map_indices;
494}
495
496template <typename apt_t>
498
499 // number of detectors
500 Eigen::Index n_dets = in.scans.data.cols();
501
502 // number of detectors flagged in apt
503 Eigen::Index n_flagged = 0;
504
505 // loop through detectors and set flags to one
506 // for those flagged in apt table
507 for (Eigen::Index i=0; i<n_dets; ++i) {
508 Eigen::Index det_index = i;
509 if (apt["flag"](det_index)!=0) {
510 in.flags.data.col(i).setOnes();
511 n_flagged++;
512 }
513 }
514
515 logger->info("removed {} detectors flagged in APT table ({}%)",n_flagged,
516 (static_cast<float>(n_flagged)/static_cast<float>(n_dets))*100);
517}
518
519template <typename calib_t>
520auto RTCProc::remove_nearby_tones(TCData<TCDataKind::PTC, Eigen::MatrixXd> &in, calib_t &calib, std::string map_grouping) {
521
522 // make a copy of the calib class for flagging
523 calib_t calib_scan = calib;
524
525 // number of detectors
526 Eigen::Index n_dets = in.scans.data.cols();
527
528 int n_nearby_tones = 0;
529
530 // loop through flag columns
531 for (Eigen::Index i=0; i<n_dets; ++i) {
532 // map from data column to apt row
533 Eigen::Index det_index = i;
534 // if closer than freq separation limit and unflagged, flag it
535 if (calib.apt["duplicate_tone"](det_index) && calib_scan.apt["flag"](det_index)==0) {
536 n_nearby_tones++;
537 // increment number of nearby tones
538 if (map_grouping!="detector") {
539 in.flags.data.col(i).setOnes();
540 }
541 else {
542 calib_scan.apt["flag"](det_index) = 1;
543 }
544 }
545 }
546
547 logger->info("removed {}/{} ({}%) unflagged tones closer than {} kHz", n_nearby_tones, n_dets,
548 (static_cast<float>(n_nearby_tones)/static_cast<float>(n_dets))*100, delta_f_min_Hz/1000);
549
550 // set up scan calib
551 calib_scan.setup();
552
553 return std::move(calib_scan);
554}
555
556template <typename calib_t, typename pointing_offset_t>
557void RTCProc::append_to_netcdf(TCData<TCDataKind::PTC, Eigen::MatrixXd> &in, std::string filepath, std::string map_grouping,
558 std::string &pixel_axes, pointing_offset_t &pointing_offsets_arcsec, calib_t &calib) {
559 using netCDF::NcDim;
560 using netCDF::NcFile;
561 using netCDF::NcType;
562 using netCDF::NcVar;
563 using namespace netCDF::exceptions;
564
565 try {
566 // open netcdf file
567 NcFile fo(filepath, netCDF::NcFile::write);
568
569 // append common time chunk variables
570 append_base_to_netcdf(fo, in, map_grouping, pixel_axes, pointing_offsets_arcsec, calib);
571
572 // sync file to make sure it gets updated
573 fo.sync();
574 // close file
575 fo.close();
576
577 logger->info("tod chunk written to {}", filepath);
578
579 } catch (NcException &e) {
580 logger->error("{}", e.what());
581 }
582}
583
584} // namespace timestream
Definition calibrate.h:12
void extinction_correction(TCData< tcdata_kind, Eigen::MatrixXd > &, calib_t &, tau_t &)
Definition calibrate.h:176
auto calc_tau(Eigen::DenseBase< Derived > &, double)
Definition calibrate.h:128
void calibrate_tod(TCData< tcdata_kind, Eigen::MatrixXd > &, calib_t &)
Definition calibrate.h:160
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:497
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:520
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:557
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