4#include "sys/sysinfo.h"
15#include <citlali_config/config.h>
16#include <citlali_config/gitversion.h>
17#include <citlali_config/default_config.h>
18#include <kids/core/kidsdata.h>
19#include <kids/sweep/fitter.h>
20#include <kids/timestream/solver.h>
21#include <kids/toltec/toltec.h>
22#include <kidscpp_config/gitversion.h>
23#include <tula_config/gitversion.h>
25#include <tula/config/core.h>
26#include <tula/config/flatconfig.h>
27#include <tula/config/yamlconfig.h>
29#include <tula/filesystem.h>
30#include <tula/formatter/container.h>
31#include <tula/formatter/enum.h>
32#include <tula/grppi.h>
33#include <tula/logging.h>
34#include <tula/switch_invoke.h>
158 using key_vec_t = std::vector<std::vector<std::string>>;
161 std::shared_ptr<spdlog::logger>
logger = spdlog::get(
"citlali_logger");
175 std::map<std::string,int>
gaps;
257 template<
typename CT>
261 template<
typename CT>
265 template<
typename CT>
269 template<
typename CT>
273 template<
typename CT>
277 template<
typename CT>
281 template<
typename CT>
285 template<
typename CT>
289 template<
typename CT>
299 template <engine_utils::toltecIO::ProdType prod_t>
306 template <TCDataKind tc_t>
310 template <
typename map_buffer_t>
322 template <
typename fits_io_type,
class map_buffer_t>
323 void add_phdu(fits_io_type &, map_buffer_t &, Eigen::Index);
326 template <
typename fits_io_type,
class map_buffer_t>
327 void write_maps(fits_io_type &, fits_io_type &, map_buffer_t &, Eigen::Index);
330 template <mapmaking::MapType map_t,
class map_buffer_t>
331 void write_psd(map_buffer_t &, std::string);
334 template <mapmaking::MapType map_t,
class map_buffer_t>
341 template <mapmaking::MapType map_t,
class map_buffer_t>
345 template <mapmaking::MapType map_t,
class map_buffer_t>
349 template <mapmaking::MapType map_t,
class map_buffer_t>
362 Eigen::VectorXd tau_el(1);
368 for (
auto const& [key, val] : tau_freq) {
371 std::exit(EXIT_FAILURE);
382 if ((
calib.
apt[
"fg"].array()==-1).all()) {
383 logger->error(
"no matched freq groups. cannot run in polarized mode");
384 std::exit(EXIT_FAILURE);
431 create_tod_files<engine_utils::toltecIO::rtc_timestream>();
435 create_tod_files<engine_utils::toltecIO::ptc_timestream>();
445 logger->warn(
"tod output mode require sequential policy. "
446 "parallelization will be disabled for some stages.");
462 std::map<Eigen::Index, std::vector<std::vector<Eigen::VectorXd>>>().swap(
diagnostics.
evals);
467 logger->info(
"getting rtc config options");
482 std::tuple{
"timestream",
"polarimetry",
"ignore_hwpr"});
487 logger->info(
"getting ptc config options");
498 logger->info(
"getting timestream config options");
501 std::tuple{
"timestream",
"enabled"});
504 std::tuple{
"timestream",
"type"});
507 bool run_tod_output_rtc, run_tod_output_ptc;
510 std::tuple{
"timestream",
"raw_time_chunk",
"output",
"enabled"});
513 std::tuple{
"timestream",
"processed_time_chunk",
"output",
"enabled"});
518 if (run_tod_output_rtc) {
523 if (run_tod_output_ptc) {
537 std::tuple{
"timestream",
"output",
"subdir_name"});
540 std::tuple{
"timestream",
"output",
"stats",
"eigenvalues"});
543 std::tuple{
"timestream",
"chunking",
"chunk_mode"});
546 std::tuple{
"timestream",
"chunking",
"value"});
549 std::tuple{
"timestream",
"chunking",
"force_chunking"});
560 logger->info(
"getting mapmaking config options");
563 std::tuple{
"mapmaking",
"enabled"});
566 std::tuple{
"mapmaking",
"grouping"},{
"auto",
"array",
"nw",
"detector",
"fg"});
570 logger->error(
"Detector grouping reductions do not currently support polarimetry mode");
571 std::exit(EXIT_FAILURE);
579 std::tuple{
"mapmaking",
"method"},{
"naive",
"jinc",
"maximum_likelihood"});
583 std::tuple{
"mapmaking",
"pixel_axes"},{
"radec",
"altaz",
"galactic"});
586 logger->info(
"getting omb config options");
591 std::tuple{
"coadd",
"enabled"});
595 logger->info(
"getting cmb config options");
613 std::tuple{
"mapmaking",
"jinc_filter",
"r_max"});
616 auto jinc_shape_vec = config.template get_typed<std::vector<double>>(std::tuple{
"mapmaking",
"jinc_filter",
"shape_params",arr_name});
617 jinc_mm.
shape_params[arr_index] = Eigen::Map<Eigen::VectorXd>(jinc_shape_vec.data(),jinc_shape_vec.size());
632 std::tuple{
"mapmaking",
"maximum_likelihood",
"tolerance"});
634 std::tuple{
"mapmaking",
"maximum_likelihood",
"max_iterations"});
639 std::tuple{
"noise_maps",
"enabled"});
643 std::tuple{
"noise_maps",
"n_noise_maps"},{},{0},{});
646 std::tuple{
"noise_maps",
"randomize_dets"});
668 logger->info(
"getting beammap config options");
671 std::tuple{
"beammap",
"iter_max"});
674 std::tuple{
"beammap",
"iter_tolerance"});
677 std::tuple{
"beammap",
"reference_det"});
680 std::tuple{
"beammap",
"subtract_reference_det"});
683 std::tuple{
"beammap",
"derotate"});
686 auto lower_fwhm_arcsec_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_lower_fwhm_arcsec"});
688 auto upper_fwhm_arcsec_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_upper_fwhm_arcsec"});
690 auto lower_sig2noise_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_lower_sig2noise"});
692 auto upper_sig2noise_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_upper_sig2noise"});
694 auto max_dist_arcsec_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_max_dist_arcsec"});
713 auto sens_factors_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"sens_factors"});
720 auto sens_psd_limits_Hz_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"sens_psd_limits_Hz"});
722 sens_psd_limits_Hz = (Eigen::Map<Eigen::VectorXd>(sens_psd_limits_Hz_vec.data(), sens_psd_limits_Hz_vec.size()));
738 logger->info(
"getting map filtering config options");
753 logger->error(
"wiener filter kernel template requires kernel");
754 std::exit(EXIT_FAILURE);
763 logger->error(
"wiener filter requires noise maps");
764 std::exit(EXIT_FAILURE);
774 if (config.has(std::tuple{
"interface_sync_offset"})) {
775 auto interface_node = config.get_node(std::tuple{
"interface_sync_offset"});
777 std::vector<std::string> interface_keys = {
794 for (Eigen::Index i=0; i<interface_node.size(); ++i) {
795 auto offset = config.template get_typed<double>(std::tuple{
"interface_sync_offset",i, interface_keys[i]});
802 std::tuple{
"runtime",
"verbose"});
805 std::tuple{
"runtime",
"output_dir"});
808 std::tuple{
"runtime",
"n_threads"});
811 std::tuple{
"runtime",
"parallel_policy"},{
"seq",
"omp"});
814 std::tuple{
"runtime",
"reduction_type"},{
"science",
"pointing",
"beammap"});
817 std::tuple{
"runtime",
"use_subdir"});
820 std::tuple{
"runtime",
"interp_over_gaps"});
830 std::tuple{
"post_processing",
"map_filtering",
"enabled"});
834 std::tuple{
"post_processing",
"source_finding",
"enabled"});
840 std::tuple{
"post_processing",
"source_fitting",
"bounding_box_arcsec"},{},{0});
843 std::tuple{
"post_processing",
"source_fitting",
"fitting_radius_arcsec"});
846 std::tuple{
"post_processing",
"source_fitting",
"gauss_model",
"fit_rotation_angle"});
857 map_fitter.
flux_limits(i) = config.template get_typed<double>(std::tuple{
"post_processing",
"source_fitting",
858 "gauss_model",
"amp_limit_factors",i});
860 map_fitter.
fwhm_limits(i) = config.template get_typed<double>(std::tuple{
"post_processing",
"source_fitting",
861 "gauss_model",
"fwhm_limit_factors",i});
892 std::tuple{
"post_processing",
"source_finding",
"source_sigma"});
895 std::tuple{
"post_processing",
"source_finding",
"source_window_arcsec"});
898 std::tuple{
"post_processing",
"source_finding",
"mode"});
934 std::tuple{
"beammap_source",
"name"});
937 std::tuple{
"beammap_source",
"ra_deg"});
943 std::tuple{
"beammap_source",
"dec_deg"});
948 Eigen::Index n_fluxes = config.get_node(std::tuple{
"beammap_source",
"fluxes"}).size();
951 for (Eigen::Index i=0; i<n_fluxes; ++i) {
952 auto array = config.get_str(std::tuple{
"beammap_source",
"fluxes",i,
"array_name"});
954 auto flux = config.template get_typed<double>(std::tuple{
"beammap_source",
"fluxes",i,
"value_mJy"});
956 auto uncertainty_mJy = config.template get_typed<double>(std::tuple{
"beammap_source",
"fluxes",i,
"uncertainty_mJy"});
967 if (config.has(
"pointing_offsets")) {
968 std::vector<double> offset;
970 offset = config.template get_typed<std::vector<double>>(std::tuple{
"pointing_offsets",0,
"value_arcsec"});
973 offset = config.template get_typed<std::vector<double>>(std::tuple{
"pointing_offsets",1,
"value_arcsec"});
978 offset = config.template get_typed<std::vector<double>>(std::tuple{
"pointing_offsets",2,
"modified_julian_date"});
986 logger->error(
"pointing_offsets not found in config");
987 std::exit(EXIT_FAILURE);
1057 netCDF::NcFile fo(fval, netCDF::NcFile::write);
1100 add_netcdf_var(fo,
"to_Jy_pixel_"+name, (1/mJy_beam_to_uK)*mJy_beam_to_Jy_px);
1108 add_netcdf_var(fo,
"to_uK_"+name, mJy_beam_to_uK/mJy_beam_to_Jy_px);
1116 add_netcdf_var<std::string>(fo,
"DATEOBS0",
date_obs.back());
1145 add_netcdf_var<std::string>(fo,
"INSTRUME",
"TolTEC");
1147 add_netcdf_var<std::string>(fo,
"TELESCOP",
"LMT");
1148 add_netcdf_var<std::string>(fo,
"PIPELINE",
"CITLALI");
1149 add_netcdf_var<std::string>(fo,
"VERSION", CITLALI_GIT_VERSION);
1150 add_netcdf_var<std::string>(fo,
"KIDS", KIDSCPP_GIT_VERSION);
1151 add_netcdf_var<std::string>(fo,
"TULA", TULA_GIT_VERSION);
1153 add_netcdf_var<std::string>(fo,
"GOAL",
redu_type);
1155 add_netcdf_var<std::string>(fo,
"TYPE",
tod_type);
1156 add_netcdf_var<std::string>(fo,
"GROUPING",
map_grouping);
1157 add_netcdf_var<std::string>(fo,
"METHOD",
map_method);
1194 Eigen::VectorXd tau_el(1);
1199 for (
auto const& [key, val] : tau_freq) {
1205 for (Eigen::Index i=0; i<
calib.
arrays.size(); ++i) {
1214 std::vector<string> apt_filename;
1219 while (getline (ss, item, delim)) {
1220 apt_filename.push_back(item);
1222 add_netcdf_var<std::string>(fo,
"APT", apt_filename.back());
1246 for (Eigen::Index i=0; i<
calib.
arrays.size(); ++i) {
1260 for (Eigen::Index i=0; i<
calib.
arrays.size(); ++i) {
1275template <engine_utils::toltecIO::ProdType prod_t>
1310 netCDF::NcFile fo(
tod_filename[name], netCDF::NcFile::replace);
1313 netCDF::NcDim n_tod_output_type_dim = fo.addDim(
"n_tod_output_type",1);
1314 netCDF::NcVar tod_output_type_var = fo.addVar(
"tod_output_type",netCDF::ncString, n_tod_output_type_dim);
1315 const std::vector<size_t> tod_output_type_index = {0};
1318 std::string tod_output_type_name =
"rtc";
1319 tod_output_type_var.putVar(tod_output_type_index,tod_output_type_name);
1322 std::string tod_output_type_name =
"ptc";
1323 tod_output_type_var.putVar(tod_output_type_index,tod_output_type_name);
1330 netCDF::NcVar obsnum_v = fo.addVar(
"obsnum",netCDF::ncInt);
1331 obsnum_v.putAtt(
"units",
"N/A");
1332 int obsnum_int = std::stoi(
obsnum);
1333 obsnum_v.putVar(&obsnum_int);
1336 netCDF::NcVar source_ra_v = fo.addVar(
"SourceRa",netCDF::ncDouble);
1337 source_ra_v.putAtt(
"units",
"rad");
1341 netCDF::NcVar source_dec_v = fo.addVar(
"SourceDec",netCDF::ncDouble);
1342 source_dec_v.putAtt(
"units",
"rad");
1345 netCDF::NcDim n_pts_dim = fo.addDim(
"n_pts");
1346 netCDF::NcDim n_raw_scan_indices_dim = fo.addDim(
"n_raw_scan_indices",
telescope.
scan_indices.rows());
1347 netCDF::NcDim n_scan_indices_dim = fo.addDim(
"n_scan_indices", 2);
1350 netCDF::NcDim n_dets_dim = fo.addDim(
"n_dets",
calib.
n_dets);
1352 std::vector<netCDF::NcDim> dims = {n_pts_dim, n_dets_dim};
1353 std::vector<netCDF::NcDim> raw_scans_dims = {n_scans_dim, n_raw_scan_indices_dim};
1354 std::vector<netCDF::NcDim> scans_dims = {n_scans_dim, n_scan_indices_dim};
1357 netCDF::NcVar raw_scan_indices_v = fo.addVar(
"raw_scan_indices",netCDF::ncInt, raw_scans_dims);
1358 raw_scan_indices_v.putAtt(
"units",
"N/A");
1362 netCDF::NcVar scan_indices_v = fo.addVar(
"scan_indices",netCDF::ncInt, scans_dims);
1363 scan_indices_v.putAtt(
"units",
"N/A");
1366 netCDF::NcVar signal_v = fo.addVar(
"signal",netCDF::ncDouble, dims);
1370 std::vector<std::size_t> chunkSizes;
1372 netCDF::NcVar::ChunkMode chunkMode = netCDF::NcVar::nc_CHUNKED;
1379 signal_v.setChunking(chunkMode, chunkSizes);
1382 netCDF::NcVar flags_v = fo.addVar(
"flags",netCDF::ncDouble, dims);
1383 flags_v.putAtt(
"units",
"N/A");
1384 flags_v.setChunking(chunkMode, chunkSizes);
1388 netCDF::NcVar kernel_v = fo.addVar(
"kernel",netCDF::ncDouble, dims);
1389 kernel_v.putAtt(
"units",
"N/A");
1390 kernel_v.setChunking(chunkMode, chunkSizes);
1394 netCDF::NcVar det_lat_v = fo.addVar(
"det_lat",netCDF::ncDouble, dims);
1395 det_lat_v.putAtt(
"units",
"rad");
1396 det_lat_v.setChunking(chunkMode, chunkSizes);
1399 netCDF::NcVar det_lon_v = fo.addVar(
"det_lon",netCDF::ncDouble, dims);
1400 det_lon_v.putAtt(
"units",
"rad");
1401 det_lon_v.setChunking(chunkMode, chunkSizes);
1406 netCDF::NcVar det_ra_v = fo.addVar(
"det_ra",netCDF::ncDouble, dims);
1407 det_ra_v.putAtt(
"units",
"rad");
1408 det_ra_v.setChunking(chunkMode, chunkSizes);
1411 netCDF::NcVar det_dec_v = fo.addVar(
"det_dec",netCDF::ncDouble, dims);
1412 det_dec_v.putAtt(
"units",
"rad");
1413 det_dec_v.setChunking(chunkMode, chunkSizes);
1418 netCDF::NcVar apt_v = fo.addVar(
"apt_" + x.first,netCDF::ncDouble, n_dets_dim);
1424 netCDF::NcVar tel_data_v = fo.addVar(x.first,netCDF::ncDouble, n_pts_dim);
1425 tel_data_v.putAtt(
"units",
"rad");
1426 tel_data_v.setChunking(chunkMode, chunkSizes);
1431 logger->info(
"pointing_offsets_arcsec.second {} {}",x.first, x.second);
1432 netCDF::NcVar offsets_v = fo.addVar(
"pointing_offset_"+x.first,netCDF::ncDouble, n_pts_dim);
1433 offsets_v.putAtt(
"units",
"arcsec");
1434 offsets_v.setChunking(chunkMode, chunkSizes);
1439 std::vector<netCDF::NcDim> weight_dims = {n_scans_dim, n_dets_dim};
1440 netCDF::NcVar weights_v = fo.addVar(
"weights",netCDF::ncDouble, weight_dims);
1441 weights_v.putAtt(
"units",
"("+
omb.
sig_unit+
")^-2");
1447 netCDF::NcVar hwpr_v = fo.addVar(
"hwpr",netCDF::ncDouble, n_pts_dim);
1448 hwpr_v.putAtt(
"units",
"rad");
1453 netCDF::NcDim tel_header_dim = fo.addDim(
"tel_header_n_pts", 1);
1455 netCDF::NcVar tel_header_v = fo.addVar(key,netCDF::ncDouble, tel_header_dim);
1456 tel_header_v.putVar(&val(0));
1464 logger->info(
"reduction info");
1473 double mb_size_total = 0;
1479 logger->info(
"estimated size of map buffer {} GB", omb_size);
1481 mb_size_total = mb_size_total + omb_size;
1492 logger->info(
"estimated size of coadd buffer {} GB", cmb_size);
1494 mb_size_total = mb_size_total + cmb_size;
1501 logger->info(
"estimated size of noise buffer {} GB", nmb_size);
1502 mb_size_total = mb_size_total + nmb_size;
1511 logger->info(
"estimated size of noise buffer {} GB", nmb_size);
1512 mb_size_total = mb_size_total + nmb_size;
1516 logger->info(
"estimated size of all maps {} GB", mb_size_total);
1528template <TCDataKind tc_t>
1531 logger->debug(
"writing summary files for chunk {}",in.index.data);
1533 std::string filename =
"chunk_summary_" + std::to_string(in.index.data);
1539 f <<
"Summary file for scan " << in.index.data <<
"\n";
1540 f <<
"-Citlali version: " << CITLALI_GIT_VERSION <<
"\n";
1541 f <<
"-Kidscpp version: " << KIDSCPP_GIT_VERSION <<
"\n";
1542 f <<
"-Time of time chunk creation: " + in.creation_time +
"\n";
1545 f <<
"-Reduction type: " <<
redu_type <<
"\n";
1546 f <<
"-TOD type: " <<
tod_type <<
"\n";
1548 f <<
"-TOD chunk type: " << in.name <<
"\n";
1550 f <<
"-Calibrated: " << in.status.calibrated <<
"\n";
1551 f <<
"-Extinction Corrected: " << in.status.extinction_corrected <<
"\n";
1552 f <<
"-Demodulated: " << in.status.demodulated <<
"\n";
1553 f <<
"-Kernel Generated: " << in.status.kernel_generated <<
"\n";
1554 f <<
"-Despiked: " << in.status.despiked <<
"\n";
1555 f <<
"-TOD filtered: " << in.status.tod_filtered <<
"\n";
1556 f <<
"-Downsampled: " << in.status.downsampled <<
"\n";
1557 f <<
"-Cleaned: " << in.status.cleaned <<
"\n";
1559 f <<
"-Scan length: " << in.scans.data.rows() <<
"\n";
1561 f <<
"-Number of detectors: " << in.scans.data.cols() <<
"\n";
1562 f <<
"-Number of detectors flagged in APT table: " << (
calib.
apt[
"flag"].array()!=0).count() <<
"\n";
1563 f <<
"-Number of detectors flagged below weight limit: " << in.n_dets_low <<
"\n";
1564 f <<
"-Number of detectors flagged above weight limit: " << in.n_dets_high <<
"\n";
1565 Eigen::Index n_flagged = in.n_dets_low + in.n_dets_high + (
calib.
apt[
"flag"].array()!=0).count();
1566 f <<
"-Number of detectors flagged: " << n_flagged <<
" (" << 100*float(n_flagged)/float(in.scans.data.cols()) <<
"%)\n";
1568 f <<
"-NaNs found: " << in.scans.data.array().isNaN().count() <<
"\n";
1569 f <<
"-Infs found: " << in.scans.data.array().isInf().count() <<
"\n";
1570 f <<
"-Data min: " << in.scans.data.minCoeff() <<
" " <<
omb.
sig_unit <<
"\n";
1571 f <<
"-Data max: " << in.scans.data.maxCoeff() <<
" " <<
omb.
sig_unit <<
"\n";
1572 f <<
"-Data mean: " << in.scans.data.mean() <<
" " <<
omb.
sig_unit <<
"\n";
1573 f <<
"-Data median: " << tula::alg::median(in.scans.data) <<
" " <<
omb.
sig_unit <<
"\n";
1576 if (in.status.kernel_generated) {
1577 f <<
"-Kernel max: " << in.kernel.data.maxCoeff() <<
" " <<
omb.
sig_unit <<
"\n";
1583template <
typename map_buffer_t>
1586 logger->debug(
"writing map summary files");
1588 std::string filename =
"map_summary";
1592 f <<
"Summary file for maps\n";
1593 f <<
"-Citlali version: " << CITLALI_GIT_VERSION <<
"\n";
1594 f <<
"-Kidscpp version: " << KIDSCPP_GIT_VERSION <<
"\n";
1597 f <<
"-Reduction type: " <<
redu_type <<
"\n";
1598 f <<
"-Map type: " <<
tod_type <<
"\n";
1600 f <<
"-Rows: " << mb.n_rows <<
"\n";
1601 f <<
"-Cols: " << mb.n_cols <<
"\n";
1602 f <<
"-Number of maps: " <<
n_maps <<
"\n";
1603 f <<
"-Signal map unit: " << mb.sig_unit <<
"\n";
1604 f <<
"-Weight map unit: " <<
"1/(" + mb.sig_unit +
")^2" <<
"\n";
1605 f <<
"-Kernel maps generated: " << !mb.kernel.empty() <<
"\n";
1606 f <<
"-Coverage maps generated: " << !mb.coverage.empty() <<
"\n";
1607 f <<
"-Noise maps generated: " << !mb.noise.empty() <<
"\n";
1608 f <<
"-Number of noise maps: " << mb.noise.size() <<
"\n";
1611 std::map<std::string,int> n_nans;
1612 n_nans[
"signal"] = 0;
1613 n_nans[
"weight"] = 0;
1614 n_nans[
"kernel"] = 0;
1615 n_nans[
"coverage"] = 0;
1616 n_nans[
"noise"] = 0;
1619 std::map<std::string,int> n_infs;
1620 n_infs[
"signal"] = 0;
1621 n_infs[
"weight"] = 0;
1622 n_nans[
"kernel"] = 0;
1623 n_infs[
"coverage"] = 0;
1624 n_infs[
"noise"] = 0;
1627 for (Eigen::Index i=0; i<mb.signal.size(); ++i) {
1628 n_nans[
"signal"] = n_nans[
"signal"] + mb.signal[i].array().isNaN().count();
1629 n_nans[
"weight"] = n_nans[
"weight"] + mb.weight[i].array().isNaN().count();
1632 if (!mb.kernel.empty()) {
1633 n_nans[
"kernel"] = n_nans[
"kernel"] + mb.kernel[i].array().isNaN().count();
1636 if (!mb.coverage.empty()) {
1637 n_nans[
"coverage"] = n_nans[
"coverage"] + mb.coverage[i].array().isNaN().count();
1640 n_infs[
"signal"] = n_infs[
"signal"] + mb.signal[i].array().isInf().count();
1641 n_infs[
"weight"] = n_infs[
"weight"] + mb.weight[i].array().isInf().count();
1644 if (!mb.kernel.empty()) {
1645 n_infs[
"kernel"] = n_infs[
"kernel"] + mb.kernel[i].array().isInf().count();
1648 if (!mb.coverage.empty()) {
1649 n_infs[
"coverage"] = n_infs[
"coverage"] + mb.coverage[i].array().isInf().count();
1653 if (!mb.noise.empty()) {
1654 for (Eigen::Index j=0; j<mb.noise.size(); ++j) {
1655 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>> noise_matrix(mb.noise[i].data() + j * mb.n_rows * mb.n_cols,
1656 mb.n_rows, mb.n_cols);
1658 n_nans[
"noise"] = n_nans[
"noise"] + noise_matrix.array().isNaN().count();
1659 n_infs[
"noise"] = n_infs[
"noise"] + noise_matrix.array().isInf().count();
1664 for (
auto const& [key, val] : n_nans) {
1665 f <<
"-Number of "+ key +
" NaNs: " << val <<
"\n";
1668 for (
auto const& [key, val] : n_infs) {
1669 f <<
"-Number of "+ key +
" Infs: " << val <<
"\n";
1673template <mapmaking::MapType map_t, engine_utils::toltecIO::DataType data_t, engine_utils::toltecIO::ProdType prod_t>
1676 std::string filename;
1704 std::string map_name =
"";
1710 map_name = map_name +
"nw_" + std::to_string(
calib.
nws(i)) +
"_";
1718 for (Eigen::Index m=0; m<
calib.
fg.size(); ++m) {
1719 array_indices(k) =
calib.
fg(m);
1725 map_name = map_name +
"fg_" + std::to_string(array_indices(i)) +
"_";
1729 map_name = map_name +
"det_" + std::to_string(i) +
"_";
1736template <
typename fits_io_type,
class map_buffer_t>
1741 logger->debug(
"adding unit conversions");
1750 auto mJy_beam_to_Jy_px = 1e-3/beam_area_rad*pow(mb->pixel_size_rad,2);
1754 if (mb->sig_unit ==
"mJy/beam") {
1756 fits_io->at(i).pfits->pHDU().addKey(
"to_mJy/beam", 1,
"Conversion to mJy/beam");
1759 "Conversion to MJy/sr");
1761 fits_io->at(i).pfits->pHDU().addKey(
"to_uK", mJy_beam_to_uK,
"Conversion to uK");
1763 fits_io->at(i).pfits->pHDU().addKey(
"to_Jy/pixel", mJy_beam_to_Jy_px,
"Conversion to Jy/pixel");
1765 else if (mb->sig_unit ==
"MJy/sr") {
1768 "Conversion to mJy/beam");
1770 fits_io->at(i).pfits->pHDU().addKey(
"to_MJy/sr", 1,
"Conversion to MJy/sr");
1773 "Conversion to uK");
1776 "Conversion to Jy/pixel");
1778 else if (mb->sig_unit ==
"uK") {
1780 fits_io->at(i).pfits->pHDU().addKey(
"to_mJy/beam", 1/mJy_beam_to_uK,
"Conversion to mJy/beam");
1783 "Conversion to MJy/sr");
1785 fits_io->at(i).pfits->pHDU().addKey(
"to_uK", 1,
"Conversion to uK");
1787 fits_io->at(i).pfits->pHDU().addKey(
"to_Jy/pixel", (1/mJy_beam_to_uK)*mJy_beam_to_Jy_px,
"Conversion to Jy/pixel");
1789 else if (mb->sig_unit ==
"Jy/pixel") {
1791 fits_io->at(i).pfits->pHDU().addKey(
"to_mJy/beam", 1/mJy_beam_to_Jy_px,
"Conversion to mJy/beam");
1794 "Conversion to MJy/sr");
1796 fits_io->at(i).pfits->pHDU().addKey(
"to_uK", mJy_beam_to_uK/mJy_beam_to_Jy_px,
"Conversion to uK");
1798 fits_io->at(i).pfits->pHDU().addKey(
"to_Jy/pixel", 1,
"Conversion to Jy/pixel");
1803 fits_io->at(i).pfits->pHDU().addKey(
"to_mJy/beam",
"N/A",
"Conversion to mJy/beam");
1804 fits_io->at(i).pfits->pHDU().addKey(
"to_MJy/sr",
"N/A",
"Conversion to MJy/sr");
1805 fits_io->at(i).pfits->pHDU().addKey(
"to_uK",
"N/A",
"Conversion to uK");
1806 fits_io->at(i).pfits->pHDU().addKey(
"to_Jy/pixel",
"N/A",
"Conversion to Jy/pixel");
1811 fits_io->at(i).pfits->pHDU().addKey(
"HEADER.SOURCE.FLUX_MJYPERBEAM",
beammap_fluxes_mJy_beam[name],
"Source flux (mJy/beam)");
1812 fits_io->at(i).pfits->pHDU().addKey(
"HEADER.SOURCE.FLUX_MJYPERSR",
beammap_fluxes_MJy_Sr[name],
"Source flux (MJy/sr)");
1814 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.ITER_TOLERANCE",
beammap_iter_tolerance,
"Beammap iteration tolerance");
1815 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.ITER_MAX",
beammap_iter_max,
"Beammap max iterations");
1816 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.IS_DEROTATED",
beammap_derotate,
"Beammap derotated");
1819 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.REF_DET_INDEX",
beammap_reference_det,
"Beammap Reference det (rotation center)");
1824 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.REF_DET_INDEX", -99,
"Beammap Reference det (rotation center)");
1825 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.REF_X_T",
"N/A",
"Az rotation center (arcsec)");
1826 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.REF_Y_T",
"N/A",
"Alt rotation center (arcsec)");
1830 logger->debug(
"adding obsnums");
1833 for (Eigen::Index j=0; j<mb->obsnums.size(); ++j) {
1834 fits_io->at(i).pfits->pHDU().addKey(
"OBSNUM"+std::to_string(j), mb->obsnums.at(j),
"Observation Number " + std::to_string(j));
1838 if (mb->obsnums.size()==1) {
1839 fits_io->at(i).pfits->pHDU().addKey(
"DATEOBS0",
date_obs.back(),
"Date and time of observation 0");
1842 for (Eigen::Index j=0; j<mb->obsnums.size(); ++j) {
1843 fits_io->at(i).pfits->pHDU().addKey(
"DATEOBS"+std::to_string(j),
date_obs[j],
"Date and time of observation "+std::to_string(j));
1847 logger->debug(
"adding obs info");
1852 fits_io->at(i).pfits->pHDU().addKey(
"INSTRUME",
"TolTEC",
"Instrument");
1854 fits_io->at(i).pfits->pHDU().addKey(
"HWPR",
calib.
run_hwpr,
"HWPR installed");
1856 fits_io->at(i).pfits->pHDU().addKey(
"TELESCOP",
"LMT",
"Telescope");
1858 fits_io->at(i).pfits->pHDU().addKey(
"WAV", name,
"Wavelength");
1860 fits_io->at(i).pfits->pHDU().addKey(
"PIPELINE",
"CITLALI",
"Redu pipeline");
1862 fits_io->at(i).pfits->pHDU().addKey(
"VERSION", CITLALI_GIT_VERSION,
"CITLALI_GIT_VERSION");
1864 fits_io->at(i).pfits->pHDU().addKey(
"KIDS", KIDSCPP_GIT_VERSION,
"KIDSCPP_GIT_VERSION");
1866 fits_io->at(i).pfits->pHDU().addKey(
"TULA", TULA_GIT_VERSION,
"TULA_GIT_VERSION");
1870 fits_io->at(i).pfits->pHDU().addKey(
"GOAL",
redu_type,
"Reduction type");
1874 fits_io->at(i).pfits->pHDU().addKey(
"TYPE",
tod_type,
"TOD Type");
1876 fits_io->at(i).pfits->pHDU().addKey(
"GROUPING",
map_grouping,
"Map grouping");
1878 fits_io->at(i).pfits->pHDU().addKey(
"METHOD",
map_method,
"Map method");
1880 fits_io->at(i).pfits->pHDU().addKey(
"EXPTIME", mb->exposure_time,
"Exposure time (sec)");
1882 fits_io->at(i).pfits->pHDU().addKey(
"RADESYS",
telescope.
pixel_axes,
"Coord Reference Frame");
1884 fits_io->at(i).pfits->pHDU().addKey(
"SRC_RA",
telescope.
tel_header[
"Header.Source.Ra"][0],
"Source RA (radians)");
1886 fits_io->at(i).pfits->pHDU().addKey(
"SRC_DEC",
telescope.
tel_header[
"Header.Source.Dec"][0],
"Source Dec (radians)");
1888 fits_io->at(i).pfits->pHDU().addKey(
"TAN_RA",
telescope.
tel_header[
"Header.Source.Ra"][0],
"Map Tangent Point RA (radians)");
1890 fits_io->at(i).pfits->pHDU().addKey(
"TAN_DEC",
telescope.
tel_header[
"Header.Source.Dec"][0],
"Map Tangent Point Dec (radians)");
1896 fits_io->at(i).pfits->pHDU().addKey(
"MEAN_PA",
RAD_TO_DEG*
telescope.
tel_data[
"ActParAng"].mean(),
"Mean Parallactic angle (deg)");
1898 logger->debug(
"adding beamsizes");
1912 fits_io->at(i).pfits->pHDU().addKey(
"BUNIT", mb->sig_unit,
"bunit");
1916 logger->debug(
"adding jinc params");
1918 fits_io->at(i).pfits->pHDU().addKey(
"JINC_R",
jinc_mm.
r_max,
"Jinc filter R_max");
1925 logger->debug(
"adding extinction");
1927 Eigen::VectorXd tau_el(1);
1931 fits_io->at(i).pfits->pHDU().addKey(
"MEAN_TAU", tau_freq[i](0),
"mean tau (" + name +
")");
1934 fits_io->at(i).pfits->pHDU().addKey(
"MEAN_TAU", 0.,
"mean tau (" + name +
")");
1938 fits_io->at(i).pfits->pHDU().addKey(
"SAMPRATE",
telescope.
fsmp,
"sample rate (Hz)");
1941 if (mb->obsnums.size()==1) {
1942 std::vector<string> apt_filename;
1947 while (getline (ss, item, delim)) {
1948 apt_filename.push_back(item);
1950 fits_io->at(i).pfits->pHDU().addKey(
"APT", apt_filename.back(),
"APT table used");
1957 rms = pow(mb->median_err(i),0.5);
1965 logger->debug(
"adding oof params");
1966 fits_io->at(i).pfits->pHDU().addKey(
"OOF_RMS", rms,
"rms of map background (" + mb->sig_unit +
")");
1969 fits_io->at(i).pfits->pHDU().addKey(
"OOF_T", 3.0,
"taper (dB)");
1970 fits_io->at(i).pfits->pHDU().addKey(
"OOF_M2X",
telescope.
tel_header[
"Header.M2.XReq"](0)/1000.*1e6,
"oof m2x (microns)");
1971 fits_io->at(i).pfits->pHDU().addKey(
"OOF_M2Y",
telescope.
tel_header[
"Header.M2.YReq"](0)/1000.*1e6,
"oof m2y (microns)");
1972 fits_io->at(i).pfits->pHDU().addKey(
"OOF_M2Z",
telescope.
tel_header[
"Header.M2.ZReq"](0)/1000.*1e6,
"oof m2z (microns)");
1974 fits_io->at(i).pfits->pHDU().addKey(
"OOF_RO", 25.,
"outer diameter of the antenna (m)");
1975 fits_io->at(i).pfits->pHDU().addKey(
"OOF_RI", 1.65,
"inner diameter of the antenna (m)");
1978 fits_io->at(i).pfits->pHDU().addKey(
"FRUITLOOPS_ITER",
fruit_iter,
"Current fruit loops iteration");
1981 logger->debug(
"adding config params");
1982 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.VERBOSE",
verbose_mode,
"Reduced in verbose mode");
1984 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.DESPIKED",
rtcproc.
run_despike,
"Despiked");
1988 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.EXTINCTION",
rtcproc.
run_extinction,
"Extinction corrected");
1990 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.WEIGHT.TYPE",
ptcproc.
weighting_type,
"Weighting scheme");
1997 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.WEIGHT.MEDWTFACTOR",
ptcproc.
med_weight_factor,
"Median weight factor");
1998 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.CLEANED",
ptcproc.
run_clean,
"Cleaned");
2001 "Number of eigenvalues removed");
2004 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.CLEANED.NEIG", 0,
"Number of eigenvalues removed");
2015 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.FRUITLOOPS.FLUX", 0,
"Fruit loops flux (" + mb->sig_unit +
")");
2017 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.FRUITLOOPS.MAXITER",
ptcproc.
fruit_loops_iters,
"Fruit loops iterations");
2020 if (mb->obsnums.size()==1) {
2021 logger->debug(
"adding tel params");
2023 logger->debug(
"adding {}: {}", key, val);
2024 fits_io->at(i).pfits->pHDU().addKey(key, val(0), key);
2029template <
typename fits_io_type,
class map_buffer_t>
2030void Engine::write_maps(fits_io_type &fits_io, fits_io_type &noise_fits_io, map_buffer_t &mb, Eigen::Index i) {
2041 mb->wcs.crval[3] = stokes_index;
2045 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2046 fits_io->at(map_index).hdus.back()->addKey(
"UNIT", mb->sig_unit,
"Unit of map");
2050 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2051 fits_io->at(map_index).hdus.back()->addKey(
"UNIT",
"1/("+mb->sig_unit+
")^2",
"Unit of map");
2052 if (
redu_type !=
"beammap" && std::fabs(mb->median_err(i)) > std::numeric_limits<double>::epsilon()) {
2053 fits_io->at(map_index).hdus.back()->addKey(
"MEDERR", pow(mb->median_err(i),0.5),
"Median Error ("+mb->sig_unit+
")");
2056 fits_io->at(map_index).hdus.back()->addKey(
"MEDERR", 0.0,
"Median Error ("+mb->sig_unit+
")");
2062 fits_io->at(map_index).hdus.back()->addKey(
"TYPE",
rtcproc.
kernel.
type,
"Kernel type");
2074 fits_io->at(map_index).hdus.back()->addKey(
"FWHM",fwhm,
"Kernel fwhm (arcsec)");
2075 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2076 fits_io->at(map_index).hdus.back()->addKey(
"UNIT", mb->sig_unit,
"Unit of map");
2080 if (!mb->coverage.empty()) {
2082 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2083 fits_io->at(map_index).hdus.back()->addKey(
"UNIT",
"sec",
"Unit of map");
2087 if (!mb->coverage.empty()) {
2089 Eigen::MatrixXd ones, zeros;
2090 ones.setOnes(mb->weight[i].rows(), mb->weight[i].cols());
2091 zeros.setZero(mb->weight[i].rows(), mb->weight[i].cols());
2094 auto [weight_threshold, cov_ranges, cov_n_rows, cov_n_cols] = mb->calc_cov_region(i);
2096 Eigen::MatrixXd coverage_bool = (mb->weight[i].array() < weight_threshold).select(zeros,ones);
2100 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2101 fits_io->at(map_index).hdus.back()->addKey(
"UNIT",
"N/A",
"Unit of map");
2102 fits_io->at(map_index).hdus.back()->addKey(
"WTTHRESH", weight_threshold,
"Weight threshold");
2105 Eigen::MatrixXd sig2noise = mb->signal[i].array()*sqrt(mb->weight[i].array());
2107 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2108 fits_io->at(map_index).hdus.back()->addKey(
"UNIT",
"N/A",
"Unit of map");
2112 if (!mb->noise.empty()) {
2113 for (Eigen::Index n=0; n<mb->n_noise; ++n) {
2114 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>> noise_matrix(mb->noise[i].data() + n * mb->n_rows * mb->n_cols,
2115 mb->n_rows, mb->n_cols);
2119 noise_fits_io->at(map_index).add_wcs(noise_fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2120 noise_fits_io->at(map_index).hdus.back()->addKey(
"UNIT", mb->sig_unit,
"Unit of map");
2121 noise_fits_io->at(map_index).hdus.back()->addKey(
"MEDRMS", mb->median_rms[i],
"Median RMS of noise maps");
2126template <mapmaking::MapType map_t,
class map_buffer_t>
2129 std::string filename = setup_filenames<map_t,engine_utils::toltecIO::toltec,engine_utils::toltecIO::psd>(dir_name);
2132 netCDF::NcFile fo(filename +
".nc", netCDF::NcFile::replace);
2135 for (Eigen::Index i=0; i<mb->psds.size(); ++i) {
2148 netCDF::NcDim psd_dim = fo.addDim(name +
"_nfreq",mb->psds[i].size());
2149 netCDF::NcDim pds_2d_row_dim = fo.addDim(name +
"_rows",mb->psd_2ds[i].rows());
2150 netCDF::NcDim pds_2d_col_dim = fo.addDim(name +
"_cols",mb->psd_2ds[i].cols());
2152 std::vector<netCDF::NcDim> dims;
2153 dims.push_back(pds_2d_row_dim);
2154 dims.push_back(pds_2d_col_dim);
2157 netCDF::NcVar psd_v = fo.addVar(name +
"_psd",netCDF::ncDouble, psd_dim);
2158 psd_v.putVar(mb->psds[i].data());
2161 netCDF::NcVar psd_freq_v = fo.addVar(name +
"_psd_freq",netCDF::ncDouble, psd_dim);
2162 psd_freq_v.putVar(mb->psd_freqs[i].data());
2165 Eigen::MatrixXd psd_2d_transposed = mb->psd_2ds[i].transpose();
2166 Eigen::MatrixXd psd_2d_freq_transposed = mb->psd_2d_freqs[i].transpose();
2169 netCDF::NcVar psd_2d_v = fo.addVar(name +
"_psd_2d",netCDF::ncDouble, dims);
2170 psd_2d_v.putVar(psd_2d_transposed.data());
2173 netCDF::NcVar psd_2d_freq_v = fo.addVar(name +
"_psd_2d_freq",netCDF::ncDouble, dims);
2174 psd_2d_freq_v.putVar(psd_2d_freq_transposed.data());
2176 if (!mb->noise.empty()) {
2178 netCDF::NcDim noise_psd_dim = fo.addDim(name +
"_noise_nfreq",mb->noise_psds[i].size());
2179 netCDF::NcDim noise_pds_2d_row_dim = fo.addDim(name +
"_noise_rows",mb->noise_psd_2ds[i].rows());
2180 netCDF::NcDim noise_pds_2d_col_dim = fo.addDim(name +
"_noise_cols",mb->noise_psd_2ds[i].cols());
2182 std::vector<netCDF::NcDim> noise_dims;
2183 noise_dims.push_back(noise_pds_2d_row_dim);
2184 noise_dims.push_back(noise_pds_2d_col_dim);
2187 netCDF::NcVar noise_psd_v = fo.addVar(name +
"_noise_psd",netCDF::ncDouble, noise_psd_dim);
2188 noise_psd_v.putVar(mb->noise_psds[i].data());
2191 netCDF::NcVar noise_psd_freq_v = fo.addVar(name +
"_noise_psd_freq",netCDF::ncDouble, noise_psd_dim);
2192 noise_psd_freq_v.putVar(mb->noise_psd_freqs[i].data());
2195 Eigen::MatrixXd noise_psd_2d_transposed = mb->noise_psd_2ds[i].transpose();
2196 Eigen::MatrixXd noise_psd_2d_freq_transposed = mb->noise_psd_2d_freqs[i].transpose();
2199 netCDF::NcVar noise_psd_2d_v = fo.addVar(name +
"_noise_psd_2d",netCDF::ncDouble, noise_dims);
2200 noise_psd_2d_v.putVar(noise_psd_2d_transposed.data());
2203 netCDF::NcVar noise_psd_2d_freq_v = fo.addVar(name +
"_noise_psd_2d_freq",netCDF::ncDouble, noise_dims);
2204 noise_psd_2d_freq_v.putVar(noise_psd_2d_freq_transposed.data());
2211template <mapmaking::MapType map_t,
class map_buffer_t>
2213 std::string filename = setup_filenames<map_t,engine_utils::toltecIO::toltec,engine_utils::toltecIO::hist>(dir_name);
2215 netCDF::NcFile fo(filename +
".nc", netCDF::NcFile::replace);
2216 netCDF::NcDim hist_bins_dim = fo.addDim(
"n_bins", mb->hist_n_bins);
2219 for (Eigen::Index i=0; i<mb->hists.size(); ++i) {
2234 netCDF::NcVar hist_bins_v = fo.addVar(name +
"_bins",netCDF::ncDouble, hist_bins_dim);
2235 hist_bins_v.putVar(mb->hist_bins[i].data());
2238 netCDF::NcVar hist_v = fo.addVar(name +
"_hist",netCDF::ncDouble, hist_bins_dim);
2239 hist_v.putVar(mb->hists[i].data());
2241 if (!mb->noise.empty()) {
2243 netCDF::NcVar hist_v = fo.addVar(name +
"_noise_hist",netCDF::ncDouble, hist_bins_dim);
2244 hist_v.putVar(mb->noise_hists[i].data());
2266 std::map<std::string, std::string> det_stats_header_units {
2270 {
"flagged_frac",
"N/A"},
2274 std::map<std::string, std::string> grp_stats_header_units {
2278 netCDF::NcFile fo(stats_filename +
".nc", netCDF::NcFile::replace);
2281 netCDF::NcVar obsnum_v = fo.addVar(
"obsnum",netCDF::ncInt);
2282 obsnum_v.putAtt(
"units",
"N/A");
2283 int obsnum_int = std::stoi(
obsnum);
2284 obsnum_v.putVar(&obsnum_int);
2287 netCDF::NcDim n_dets_dim = fo.addDim(
"n_dets",
calib.
n_dets);
2288 netCDF::NcDim n_arrays_dim = fo.addDim(
"n_arrays",
calib.
n_arrays);
2291 std::vector<netCDF::NcDim> dims = {n_chunks_dim, n_dets_dim};
2292 std::vector<netCDF::NcDim> grp_dims = {n_chunks_dim, n_arrays_dim};
2296 netCDF::NcVar stat_v = fo.addVar(stat,netCDF::ncDouble, dims);
2298 stat_v.putAtt(
"units",det_stats_header_units[stat]);
2302 netCDF::NcVar stat_v = fo.addVar(stat,netCDF::ncDouble, grp_dims);
2304 stat_v.putAtt(
"units",grp_stats_header_units[stat]);
2309 netCDF::NcVar apt_v = fo.addVar(
"apt_" + x.first,netCDF::ncDouble, n_dets_dim);
2310 apt_v.putVar(x.second.data());
2318 std::vector<netCDF::NcDim> dims = {adc_snap_dim, adc_snap_data_dim};
2321 netCDF::NcVar adc_snap_v = fo.addVar(
"toltec" + std::to_string(
calib.
nws(i)) +
"_adc_snap_data",netCDF::ncDouble, dims);
2322 adc_snap_v.putVar(x.data());
2330 netCDF::NcDim n_eig_grp_dim = fo.addDim(
"n_eig_grp",
diagnostics.
evals[0][0].size());
2332 std::vector<netCDF::NcDim> eval_dims = {n_eig_grp_dim, n_eigs_dim};
2337 for (Eigen::Index i=0; i<val.size(); ++i) {
2340 "_chunk_" + std::to_string(key), netCDF::ncDouble,eval_dims);
2341 std::vector<std::size_t> start_eig_index = {0, 0};
2345 for (
const auto &evals: val[i]) {
2346 eval_v.putVar(start_eig_index,size,evals.data());
2347 start_eig_index[0] += 1;
2355template <mapmaking::MapType map_t,
class map_buffer_t>
2360 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>* f_io =
nullptr;
2362 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>* n_io =
nullptr;
2364 std::string dir_name;
2380 for (Eigen::Index i=0; i<f_io->size(); ++i) {
2386 if (!pmb->
noise.empty()) {
2392 for (Eigen::Index i=0; i<
n_maps; ++i) {
2406 tula::logging::progressbar pb(
2407 [&](
const auto &msg) {
logger->info(
"{}", msg); }, 100,
2410 for (Eigen::Index j=0; j<mb.n_noise; ++j) {
2412 pb.count(mb.n_noise, mb.n_noise / 100);
2416 logger->info(
"renormalizing errors");
2418 mb.calc_median_err();
2420 mb.calc_median_rms();
2423 auto noise_factor = (1./pow(mb.median_rms.array(),2.))*mb.median_err.array();
2425 mb.weight[i].noalias() = mb.weight[i]*noise_factor(i);
2427 logger->info(
"median rms {} ({})",
static_cast<float>(mb.median_rms(i)), mb.sig_unit);
2436 logger->info(
"file has been written to:");
2437 logger->info(
"{}.fits",f_io->at(map_index).filepath);
2440 bool close_file =
true;
2449 f_io->at(map_index).pfits->destroy();
2462template <mapmaking::MapType map_t,
class map_buffer_t>
2465 mb.n_sources.clear();
2466 mb.row_source_locs.clear();
2467 mb.col_source_locs.clear();
2469 for (Eigen::Index i=0; i<
n_maps; ++i) {
2471 mb.n_sources.push_back(0);
2472 mb.row_source_locs.push_back(Eigen::VectorXi::Ones(1));
2473 mb.col_source_locs.push_back(Eigen::VectorXi::Ones(1));
2476 mb.row_source_locs.back()*=-99;
2477 mb.col_source_locs.back()*=-99;
2480 auto sources_found = mb.find_sources(i);
2483 if (sources_found) {
2484 logger->info(
"{} source(s) found", mb.n_sources.back());
2487 logger->info(
"no sources found");
2492 Eigen::Index n_sources = 0;
2493 for (
const auto &sources: mb.n_sources) {
2494 n_sources += sources;
2505 for (Eigen::Index i=0; i<
n_maps; ++i) {
2507 if (mb.n_sources[i] > 0) {
2514 std::vector<int> source_in_vec, source_out_vec;
2516 source_in_vec.resize(mb.n_sources[i]);
2517 std::iota(source_in_vec.begin(), source_in_vec.end(), 0);
2518 source_out_vec.resize(mb.n_sources[i]);
2521 grppi::map(tula::grppi_utils::dyn_ex(
parallel_policy), source_in_vec, source_out_vec, [&](
auto j) {
2523 double init_row = mb.row_source_locs[i](j);
2524 double init_col = mb.col_source_locs[i](j);
2527 auto [params, perrors, good_fit] =
2529 init_fwhm, init_row, init_col);
2532 params(1) =
RAD_TO_ASEC*mb.pixel_size_rad*(params(1) - (mb.n_cols)/2);
2533 params(2) =
RAD_TO_ASEC*mb.pixel_size_rad*(params(2) - (mb.n_rows)/2);
2538 perrors(1) =
RAD_TO_ASEC*mb.pixel_size_rad*(perrors(1));
2539 perrors(2) =
RAD_TO_ASEC*mb.pixel_size_rad*(perrors(2));
2545 Eigen::VectorXd lat(1), lon(1);
2559 mb.source_params.row(k+j) = params;
2560 mb.source_perror.row(k+j) = perrors;
2566 k += mb.n_sources[i];
2571template <mapmaking::MapType map_t,
class map_buffer_t>
2578 std::vector<std::string> source_header = {
2599 std::map<std::string,std::string> source_header_units = {
2601 {
"amp", mb->sig_unit},
2602 {
"amp_err", mb->sig_unit},
2604 {
"x_t_err", pos_units},
2606 {
"y_t_err", pos_units},
2607 {
"a_fwhm",
"arcsec"},
2608 {
"a_fwhm_err",
"arcsec"},
2609 {
"b_fwhm",
"arcsec"},
2610 {
"b_fwhm_err",
"arcsec"},
2612 {
"angle_err",
"rad"},
2613 {
"sig2noise",
"N/A"}
2617 YAML::Node source_meta;
2620 for (Eigen::Index i=0; i<mb->obsnums.size(); ++i) {
2622 source_meta[
"obsnum" + std::to_string(i)] = mb->obsnums[i];
2632 source_meta[
"date"] =
date_obs.back();
2636 for (
const auto &[key,val]: source_header_units) {
2637 source_meta[key].push_back(
"units: " + val);
2640 source_meta[key].push_back(description);
2644 Eigen::Index n_sources = 0;
2645 for (
const auto &sources: mb->n_sources) {
2646 n_sources += sources;
2654 for (Eigen::Index i=0; i<mb->n_sources.size(); ++i) {
2655 if (mb->n_sources[i]!=0) {
2659 for (Eigen::Index j=0; j<mb->n_sources[i]; ++j) {
2672 source_table.col(i) = mb->source_params.col(j).template cast <float> ();
2673 source_table.col(i+1) = mb->source_perror.col(j).template cast <float> ();
Eigen::Index hwpr_start_indices
Definition engine.h:208
void obsnum_setup()
Definition engine.h:353
std::string obsnum_dir_name
Definition engine.h:184
void write_stats()
Definition engine.h:2251
std::string parallel_policy
Definition engine.h:196
void write_map_summary(map_buffer_t &)
Definition engine.h:1584
std::string redu_dir_name
Definition engine.h:178
std::map< std::string, Eigen::VectorXd > pointing_offsets_arcsec
Definition engine.h:241
std::vector< fitsIO< file_type_enum::write_fits, CCfits::ExtHDU * > > filtered_coadd_fits_io_vec
Definition engine.h:251
std::vector< Eigen::Index > start_indices
Definition engine.h:205
void create_tod_files()
Definition engine.h:1276
std::vector< Eigen::VectorXd > nw_times
Definition engine.h:166
void write_psd(map_buffer_t &, std::string)
Definition engine.h:2127
int redu_dir_num
Definition engine.h:181
auto get_map_name(int)
Definition engine.h:1702
std::vector< fitsIO< file_type_enum::write_fits, CCfits::ExtHDU * > > noise_fits_io_vec
Definition engine.h:246
std::vector< fitsIO< file_type_enum::write_fits, CCfits::ExtHDU * > > coadd_noise_fits_io_vec
Definition engine.h:250
void get_beammap_config(CT &)
Definition engine.h:667
key_vec_t invalid_keys
Definition engine.h:190
std::string tod_output_type
Definition engine.h:223
auto setup_filenames(std::string dir_name)
Definition engine.h:1674
std::string tod_output_subdir_name
Definition engine.h:223
void create_obs_map_files()
Definition engine.h:991
key_vec_t missing_keys
Definition engine.h:190
std::string coadd_dir_name
Definition engine.h:184
std::vector< fitsIO< file_type_enum::write_fits, CCfits::ExtHDU * > > filtered_noise_fits_io_vec
Definition engine.h:247
void get_mapmaking_config(CT &)
Definition engine.h:559
Eigen::VectorXI maps_to_arrays
Definition engine.h:232
int fruit_iter
Definition engine.h:238
bool verbose_mode
Definition engine.h:172
int n_maps
Definition engine.h:229
Eigen::VectorXI arrays_to_maps
Definition engine.h:232
std::vector< fitsIO< file_type_enum::write_fits, CCfits::ExtHDU * > > filtered_fits_io_vec
Definition engine.h:247
void run_wiener_filter(map_buffer_t &)
Definition engine.h:2356
std::string output_dir
Definition engine.h:178
int n_scans_done
Definition engine.h:199
void add_tod_header()
Definition engine.h:1054
bool write_filtered_maps_partial
Definition engine.h:220
Eigen::Index hwpr_end_indices
Definition engine.h:208
std::vector< Eigen::Index > end_indices
Definition engine.h:205
Eigen::VectorXd t_common
Definition engine.h:164
void write_hist(map_buffer_t &, std::string)
Definition engine.h:2212
std::vector< fitsIO< file_type_enum::write_fits, CCfits::ExtHDU * > > filtered_coadd_noise_fits_io_vec
Definition engine.h:251
void add_phdu(fits_io_type &, map_buffer_t &, Eigen::Index)
Definition engine.h:1737
std::string redu_type
Definition engine.h:214
std::map< std::string, int > gaps
Definition engine.h:175
std::vector< Eigen::VectorXi > masks
Definition engine.h:165
std::string map_grouping
Definition engine.h:226
std::shared_ptr< spdlog::logger > logger
Definition engine.h:161
void get_citlali_config(CT &)
Definition engine.h:772
std::map< std::string, std::string > tod_filename
Definition engine.h:187
void write_sources(map_buffer_t &, std::string)
Definition engine.h:2572
void get_timestream_config(CT &)
Definition engine.h:497
std::string tod_type
Definition engine.h:211
void cli_summary()
Definition engine.h:1463
Eigen::VectorXI maps_to_stokes
Definition engine.h:235
void get_astrometry_config(CT &)
Definition engine.h:965
void get_photometry_config(CT &)
Definition engine.h:931
void get_rtc_config(CT &)
Definition engine.h:466
std::string obsnum
Definition engine.h:217
std::vector< fitsIO< file_type_enum::write_fits, CCfits::ExtHDU * > > coadd_fits_io_vec
Definition engine.h:250
void find_sources(map_buffer_t &)
Definition engine.h:2463
std::map< std::string, double > interface_sync_offset
Definition engine.h:202
std::vector< std::string > date_obs
Definition engine.h:169
void write_chunk_summary(TCData< tc_t, Eigen::MatrixXd > &)
Definition engine.h:1529
Eigen::ArrayXd pointing_offsets_modified_julian_date
Definition engine.h:243
void get_ptc_config(CT &)
Definition engine.h:486
std::vector< fitsIO< file_type_enum::write_fits, CCfits::ExtHDU * > > fits_io_vec
Definition engine.h:246
int n_threads
Definition engine.h:193
std::string map_method
Definition engine.h:226
std::vector< std::vector< std::string > > key_vec_t
Definition engine.h:158
void get_map_filter_config(CT &)
Definition engine.h:737
void write_maps(fits_io_type &, fits_io_type &, map_buffer_t &, Eigen::Index)
Definition engine.h:2030
Eigen::VectorXI fg
Definition calib.h:29
bool run_hwpr
Definition calib.h:41
std::string ignore_hwpr
Definition calib.h:32
Eigen::Index n_arrays
Definition calib.h:53
std::map< Eigen::Index, double > array_pas
Definition calib.h:62
std::map< Eigen::Index, double > array_beam_areas
Definition calib.h:65
Eigen::VectorXI nws
Definition calib.h:44
Eigen::VectorXI arrays
Definition calib.h:44
std::map< std::string, std::string > apt_header_units
Definition calib.h:116
std::string apt_filepath
Definition calib.h:20
std::map< std::string, Eigen::VectorXd > apt
Definition calib.h:22
std::map< std::string, std::string > apt_header_description
Definition calib.h:151
std::map< Eigen::Index, std::tuple< double, double > > array_fwhms
Definition calib.h:59
Eigen::Index n_dets
Definition calib.h:47
Definition diagnostics.h:14
std::map< Eigen::Index, std::vector< std::vector< Eigen::VectorXd > > > evals
Definition diagnostics.h:45
bool write_evals
Definition diagnostics.h:25
std::vector< std::string > grp_stats_header
Definition diagnostics.h:40
std::map< std::string, Eigen::MatrixXd > stats
Definition diagnostics.h:16
std::vector< std::string > det_stats_header
Definition diagnostics.h:31
std::vector< Eigen::Matrix< short, Eigen::Dynamic, Eigen::Dynamic > > adc_snap_data
Definition diagnostics.h:19
Definition telescope.h:12
bool sim_obs
Definition telescope.h:20
std::map< std::string, Eigen::VectorXd > tel_data
Definition telescope.h:54
double fsmp
Definition telescope.h:42
std::string chunk_mode
Definition telescope.h:30
std::string obs_goal
Definition telescope.h:23
std::string source_name
Definition telescope.h:23
double tau_225_GHz
Definition telescope.h:45
Eigen::MatrixXI scan_indices
Definition telescope.h:51
std::string project_id
Definition telescope.h:23
bool force_chunk
Definition telescope.h:36
std::string pixel_axes
Definition telescope.h:59
std::map< std::string, Eigen::VectorXd > tel_header
Definition telescope.h:56
double chunking_value
Definition telescope.h:33
Eigen::Index inner_scans_chunk
Definition telescope.h:48
double bounding_box_pix
Definition fitting.h:26
auto fit_to_gaussian(Eigen::DenseBase< Derived > &, Eigen::DenseBase< Derived > &, double, double, double)
Definition fitting.h:172
int n_params
Definition fitting.h:23
double fwhm_low
Definition fitting.h:38
double flux_low
Definition fitting.h:33
double fitting_region_pix
Definition fitting.h:27
bool fit_angle
Definition fitting.h:43
@ pointing
Definition fitting.h:18
double fwhm_high
Definition fitting.h:40
double flux_high
Definition fitting.h:35
Eigen::VectorXd fwhm_limits
Definition fitting.h:30
Eigen::VectorXd flux_limits
Definition fitting.h:30
Definition toltec_io.h:10
ProdType
Definition toltec_io.h:21
@ map
Definition toltec_io.h:22
@ stats
Definition toltec_io.h:28
@ ptc_timestream
Definition toltec_io.h:27
@ rtc_timestream
Definition toltec_io.h:26
@ noise
Definition toltec_io.h:23
std::map< Eigen::Index, std::string > array_name_map
Definition toltec_io.h:54
std::map< Eigen::Index, double > array_freq_map
Definition toltec_io.h:68
std::map< Eigen::Index, double > array_wavelength_map
Definition toltec_io.h:61
DataType
Definition toltec_io.h:13
@ source
Definition toltec_io.h:17
@ toltec
Definition toltec_io.h:14
@ filtered
Definition toltec_io.h:34
@ raw
Definition toltec_io.h:33
std::string create_filename(const std::string, const std::string, std::string, std::string, const bool)
Definition toltec_io.h:86
std::map< Eigen::Index, double > array_fwhm_arcsec
Definition toltec_io.h:75
void calculate_jinc_splines()
Definition jinc_mm.h:152
std::string mode
Definition jinc_mm.h:56
std::map< Eigen::Index, Eigen::VectorXd > shape_params
Definition jinc_mm.h:68
double r_max
Definition jinc_mm.h:62
void allocate_jinc_matrix(double)
Definition jinc_mm.h:118
std::string parallel_policy
Definition jinc_mm.h:53
bool run_polarization
Definition jinc_mm.h:50
double tolerance
Definition ml_mm.h:27
int max_iterations
Definition ml_mm.h:28
WCS wcs
Definition map.h:48
double exposure_time
Definition map.h:75
std::string sig_unit
Definition map.h:73
double source_window_rad
Definition map.h:128
Eigen::Index n_rows
Definition map.h:65
std::string parallel_policy
Definition map.h:59
Eigen::Index n_cols
Definition map.h:65
std::vector< Eigen::MatrixXd > coverage
Definition map.h:78
std::vector< Eigen::MatrixXd > signal
Definition map.h:78
std::string source_finder_mode
Definition map.h:123
std::vector< Eigen::MatrixXd > weight
Definition map.h:78
bool randomize_dets
Definition map.h:87
std::vector< Eigen::MatrixXd > kernel
Definition map.h:78
Eigen::Index n_noise
Definition map.h:67
void get_config(tula::config::YamlConfig &, std::vector< std::vector< std::string > > &, std::vector< std::vector< std::string > > &, std::string, std::string)
Definition map.cpp:15
double source_sigma
Definition map.h:126
std::vector< Eigen::Tensor< double, 3 > > noise
Definition map.h:81
double pixel_size_rad
Definition map.h:69
bool run_polarization
Definition naive_mm.h:52
Definition wiener_filter.h:23
void filter_noise(MB &mb, const int, const int)
Definition wiener_filter.h:939
std::string template_type
Definition wiener_filter.h:29
std::string parallel_policy
Definition wiener_filter.h:59
std::map< std::string, double > template_fwhm_rad
Definition wiener_filter.h:50
std::string filter_type
Definition wiener_filter.h:29
bool normalize_error
Definition wiener_filter.h:31
void filter_maps(MB &, const int)
Definition wiener_filter.h:870
double init_fwhm
Definition wiener_filter.h:47
engine_utils::mapFitter map_fitter
Definition wiener_filter.h:69
void get_config(config_t &, std::vector< std::vector< std::string > > &, std::vector< std::vector< std::string > > &)
Definition wiener_filter.h:126
void make_template(MB &, CD &c, const double, const int)
Definition wiener_filter.h:694
bool run_lowpass
Definition wiener_filter.h:35
auto calc_tau(Eigen::DenseBase< Derived > &, double)
Definition calibrate.h:136
void setup(double tau_225_zenith)
Definition calibrate.h:31
std::string extinction_model
Definition calibrate.h:18
std::map< Eigen::Index, Eigen::VectorXI > n_eig_to_cut
Definition clean.h:27
int n_calc
Definition clean.h:30
std::vector< std::string > grouping
Definition clean.h:36
double fsmp
Definition despike.h:22
void make_filter(double)
Definition filter.h:34
Eigen::Index n_terms
Definition filter.h:19
std::string type
Definition kernel.h:15
std::string map_grouping
Definition kernel.h:28
double fwhm_rad
Definition kernel.h:22
void setup(Eigen::Index)
Definition kernel.h:50
void get_config(config_t &, std::vector< std::vector< std::string > > &, std::vector< std::vector< std::string > > &)
Definition ptcproc.h:62
bool run_clean
Definition ptcproc.h:22
timestream::Cleaner cleaner
Definition ptcproc.h:31
double upper_weight_factor
Definition ptcproc.h:26
double lower_weight_factor
Definition ptcproc.h:26
std::string weighting_type
Definition ptcproc.h:28
double med_weight_factor
Definition ptcproc.h:24
std::map< int, std::string > stokes_params
Definition polarization.h:15
bool run_polarization
Definition rtcproc.h:23
bool run_kernel
Definition rtcproc.h:24
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_downsample
Definition rtcproc.h:27
timestream::Filter filter
Definition rtcproc.h:35
bool run_tod_filter
Definition rtcproc.h:26
bool run_despike
Definition rtcproc.h:25
bool run_extinction
Definition rtcproc.h:29
timestream::Calibration calibration
Definition rtcproc.h:37
timestream::Despiker despiker
Definition rtcproc.h:34
timestream::Kernel kernel
Definition rtcproc.h:33
timestream::Polarization polarization
Definition rtcproc.h:32
std::string fruit_loops_path
Definition timestream.h:281
double upper_inv_var_factor
Definition timestream.h:302
double fruit_loops_sig2noise
Definition timestream.h:289
bool run_tod_output
Definition timestream.h:276
bool write_evals
Definition timestream.h:276
int fruit_loops_iters
Definition timestream.h:287
bool run_fruit_loops
Definition timestream.h:279
Eigen::VectorXd fruit_loops_flux
Definition timestream.h:291
double lower_inv_var_factor
Definition timestream.h:302
std::string fruit_loops_type
Definition timestream.h:285
void get_config_value(config_t config, param_t ¶m, 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 DEG_TO_RAD
Definition constants.h:27
#define MJY_SR_TO_mJY_ASEC
Definition constants.h:51
#define STD_TO_FWHM
Definition constants.h:45
#define FWHM_TO_STD
Definition constants.h:48
#define RAD_TO_ASEC
Definition constants.h:36
#define ASEC_TO_RAD
Definition constants.h:33
#define RAD_TO_DEG
Definition constants.h:30
#define ASEC_TO_DEG
Definition constants.h:24
constexpr auto pi
Definition constants.h:6
void to_ecsv_from_matrix(std::string filepath, Eigen::DenseBase< Derived > &table, std::vector< std::string > header, YAML::Node meta)
Definition ecsv_io.h:50
static const double mJy_beam_to_uK(const double flux_mjy_beam, const double freq_Hz, const double fwhm)
Definition utils.h:77
auto tangent_to_abs(Eigen::DenseBase< Derived > &lat, Eigen::DenseBase< Derived > &lon, const double cra, const double cdec)
Definition pointing.h:88
static const int get_phys_memory()
Definition utils.h:56
static const std::string current_date_time()
Definition utils.h:91
auto calc_std_dev(Eigen::DenseBase< DerivedA > &data)
Definition utils.h:336
MapType
Definition map.h:17
@ FilteredObs
Definition map.h:19
@ FilteredCoadd
Definition map.h:21
@ RawObs
Definition map.h:18
@ RawCoadd
Definition map.h:20
void add_netcdf_var(netCDF::NcFile &fo, std::string name, T data)
Definition netcdf_io.h:11
bool beammap_subtract_reference
Definition engine.h:133
std::map< std::string, double > lower_sig2noise
Definition engine.h:148
std::map< std::string, double > beammap_fluxes_mJy_beam
Definition engine.h:123
Eigen::Index beammap_reference_det
Definition engine.h:136
std::map< std::string, double > upper_fwhm_arcsec
Definition engine.h:148
std::map< std::string, double > max_dist_arcsec
Definition engine.h:149
double lower_sens_factor
Definition engine.h:152
std::map< std::string, double > lower_fwhm_arcsec
Definition engine.h:148
double beammap_dec_rad
Definition engine.h:120
Eigen::VectorXd sens_psd_limits_Hz
Definition engine.h:145
int beammap_tod_output_iter
Definition engine.h:142
std::string beammap_source_name
Definition engine.h:117
std::map< std::string, double > beammap_err_MJy_Sr
Definition engine.h:124
double beammap_ra_rad
Definition engine.h:120
std::map< std::string, double > beammap_fluxes_MJy_Sr
Definition engine.h:124
int beammap_iter_max
Definition engine.h:127
bool beammap_derotate
Definition engine.h:139
std::map< std::string, double > upper_sig2noise
Definition engine.h:149
double beammap_iter_tolerance
Definition engine.h:130
std::map< std::string, double > beammap_err_mJy_beam
Definition engine.h:123
double upper_sens_factor
Definition engine.h:152
std::vector< float > crval
Definition map.h:36
mapmaking::NaiveMapmaker naive_mm
Definition engine.h:109
engine::Telescope telescope
Definition engine.h:96
engine_utils::mapFitter map_fitter
Definition engine.h:99
mapmaking::MLMapmaker ml_mm
Definition engine.h:111
mapmaking::WienerFilter wiener_filter
Definition engine.h:112
engine::Diagnostics diagnostics
Definition engine.h:98
engine_utils::toltecIO toltec_io
Definition engine.h:97
timestream::PTCProc ptcproc
Definition engine.h:105
mapmaking::JincMapmaker jinc_mm
Definition engine.h:110
mapmaking::MapBuffer omb
Definition engine.h:108
mapmaking::MapBuffer cmb
Definition engine.h:108
timestream::RTCProc rtcproc
Definition engine.h:102
engine::Calib calib
Definition engine.h:95
bool run_noise
Definition engine.h:86
bool use_subdir
Definition engine.h:75
bool run_coadd
Definition engine.h:85
bool run_map_filter
Definition engine.h:87
bool interp_over_gaps
Definition engine.h:73
bool run_source_finder
Definition engine.h:90
bool run_tod_output
Definition engine.h:81
bool run_mapmaking
Definition engine.h:84
bool run_tod
Definition engine.h:78
TC data class.
Definition timestream.h:55