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>
296 template <
class map_buffer_t>
300 template <engine_utils::toltecIO::ProdType prod_t>
307 template <TCDataKind tc_t>
311 template <
typename map_buffer_t>
323 template <
typename fits_io_type,
class map_buffer_t>
324 void add_phdu(fits_io_type &, map_buffer_t &, Eigen::Index);
327 template <
typename fits_io_type,
class map_buffer_t>
328 void write_maps(fits_io_type &, fits_io_type &, map_buffer_t &, Eigen::Index);
331 template <mapmaking::MapType map_t,
class map_buffer_t>
332 void write_psd(map_buffer_t &, std::string);
335 template <mapmaking::MapType map_t,
class map_buffer_t>
342 template <mapmaking::MapType map_t,
class map_buffer_t>
346 template <mapmaking::MapType map_t,
class map_buffer_t>
350 template <mapmaking::MapType map_t,
class map_buffer_t>
363 Eigen::VectorXd tau_el(1);
369 for (
auto const& [key, val] : tau_freq) {
372 std::exit(EXIT_FAILURE);
383 if ((
calib.
apt[
"fg"].array()==-1).all()) {
384 logger->error(
"no matched freq groups. cannot run in polarized mode");
385 std::exit(EXIT_FAILURE);
432 create_tod_files<engine_utils::toltecIO::rtc_timestream>();
436 create_tod_files<engine_utils::toltecIO::ptc_timestream>();
446 logger->warn(
"tod output mode require sequential policy. "
447 "parallelization will be disabled for some stages.");
463 std::map<Eigen::Index, std::vector<std::vector<Eigen::VectorXd>>>().swap(
diagnostics.
evals);
468 logger->info(
"getting rtc config options");
483 std::tuple{
"timestream",
"polarimetry",
"ignore_hwpr"});
488 logger->info(
"getting ptc config options");
499 logger->info(
"getting timestream config options");
502 std::tuple{
"timestream",
"enabled"});
505 std::tuple{
"timestream",
"type"});
508 bool run_tod_output_rtc, run_tod_output_ptc;
511 std::tuple{
"timestream",
"raw_time_chunk",
"output",
"enabled"});
514 std::tuple{
"timestream",
"processed_time_chunk",
"output",
"enabled"});
519 if (run_tod_output_rtc) {
524 if (run_tod_output_ptc) {
538 std::tuple{
"timestream",
"output",
"subdir_name"});
541 std::tuple{
"timestream",
"output",
"stats",
"eigenvalues"});
544 std::tuple{
"timestream",
"chunking",
"chunk_mode"});
547 std::tuple{
"timestream",
"chunking",
"value"});
550 std::tuple{
"timestream",
"chunking",
"force_chunking"});
561 logger->info(
"getting mapmaking config options");
564 std::tuple{
"mapmaking",
"enabled"});
567 std::tuple{
"mapmaking",
"grouping"},{
"auto",
"array",
"nw",
"detector",
"fg"});
571 logger->error(
"Detector grouping reductions do not currently support polarimetry mode");
572 std::exit(EXIT_FAILURE);
580 std::tuple{
"mapmaking",
"method"},{
"naive",
"jinc",
"maximum_likelihood"});
584 std::tuple{
"mapmaking",
"pixel_axes"},{
"radec",
"altaz",
"galactic"});
587 logger->info(
"getting omb config options");
592 std::tuple{
"coadd",
"enabled"});
596 logger->info(
"getting cmb config options");
614 std::tuple{
"mapmaking",
"jinc_filter",
"r_max"});
617 auto jinc_shape_vec = config.template get_typed<std::vector<double>>(std::tuple{
"mapmaking",
"jinc_filter",
"shape_params",arr_name});
618 jinc_mm.
shape_params[arr_index] = Eigen::Map<Eigen::VectorXd>(jinc_shape_vec.data(),jinc_shape_vec.size());
633 std::tuple{
"mapmaking",
"maximum_likelihood",
"tolerance"});
635 std::tuple{
"mapmaking",
"maximum_likelihood",
"max_iterations"});
640 std::tuple{
"noise_maps",
"enabled"});
644 std::tuple{
"noise_maps",
"n_noise_maps"},{},{0},{});
647 std::tuple{
"noise_maps",
"randomize_dets"});
669 logger->info(
"getting beammap config options");
672 std::tuple{
"beammap",
"iter_max"});
675 std::tuple{
"beammap",
"iter_tolerance"});
678 std::tuple{
"beammap",
"reference_det"});
681 std::tuple{
"beammap",
"subtract_reference_det"});
684 std::tuple{
"beammap",
"derotate"});
687 auto lower_fwhm_arcsec_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_lower_fwhm_arcsec"});
689 auto upper_fwhm_arcsec_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_upper_fwhm_arcsec"});
691 auto lower_sig2noise_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_lower_sig2noise"});
693 auto upper_sig2noise_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_upper_sig2noise"});
695 auto max_dist_arcsec_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"array_max_dist_arcsec"});
714 auto sens_factors_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"flagging",
"sens_factors"});
721 auto sens_psd_limits_Hz_vec = config.template get_typed<std::vector<double>>(std::tuple{
"beammap",
"sens_psd_limits_Hz"});
723 sens_psd_limits_Hz = (Eigen::Map<Eigen::VectorXd>(sens_psd_limits_Hz_vec.data(), sens_psd_limits_Hz_vec.size()));
739 logger->info(
"getting map filtering config options");
754 logger->error(
"wiener filter kernel template requires kernel");
755 std::exit(EXIT_FAILURE);
764 logger->error(
"wiener filter requires noise maps");
765 std::exit(EXIT_FAILURE);
775 if (config.has(std::tuple{
"interface_sync_offset"})) {
776 auto interface_node = config.get_node(std::tuple{
"interface_sync_offset"});
778 std::vector<std::string> interface_keys = {
795 for (Eigen::Index i=0; i<interface_node.size(); ++i) {
796 auto offset = config.template get_typed<double>(std::tuple{
"interface_sync_offset",i, interface_keys[i]});
803 std::tuple{
"runtime",
"verbose"});
806 std::tuple{
"runtime",
"output_dir"});
809 std::tuple{
"runtime",
"n_threads"});
812 std::tuple{
"runtime",
"parallel_policy"},{
"seq",
"omp"});
815 std::tuple{
"runtime",
"reduction_type"},{
"science",
"pointing",
"beammap"});
818 std::tuple{
"runtime",
"use_subdir"});
821 std::tuple{
"runtime",
"interp_over_gaps"});
831 std::tuple{
"post_processing",
"map_filtering",
"enabled"});
835 std::tuple{
"post_processing",
"source_finding",
"enabled"});
841 std::tuple{
"post_processing",
"source_fitting",
"bounding_box_arcsec"},{},{0});
844 std::tuple{
"post_processing",
"source_fitting",
"fitting_radius_arcsec"});
847 std::tuple{
"post_processing",
"source_fitting",
"gauss_model",
"fit_rotation_angle"});
858 map_fitter.
flux_limits(i) = config.template get_typed<double>(std::tuple{
"post_processing",
"source_fitting",
859 "gauss_model",
"amp_limit_factors",i});
861 map_fitter.
fwhm_limits(i) = config.template get_typed<double>(std::tuple{
"post_processing",
"source_fitting",
862 "gauss_model",
"fwhm_limit_factors",i});
893 std::tuple{
"post_processing",
"source_finding",
"source_sigma"});
896 std::tuple{
"post_processing",
"source_finding",
"source_window_arcsec"});
899 std::tuple{
"post_processing",
"source_finding",
"mode"});
935 std::tuple{
"beammap_source",
"name"});
938 std::tuple{
"beammap_source",
"ra_deg"});
944 std::tuple{
"beammap_source",
"dec_deg"});
949 Eigen::Index n_fluxes = config.get_node(std::tuple{
"beammap_source",
"fluxes"}).size();
952 for (Eigen::Index i=0; i<n_fluxes; ++i) {
953 auto array = config.get_str(std::tuple{
"beammap_source",
"fluxes",i,
"array_name"});
955 auto flux = config.template get_typed<double>(std::tuple{
"beammap_source",
"fluxes",i,
"value_mJy"});
957 auto uncertainty_mJy = config.template get_typed<double>(std::tuple{
"beammap_source",
"fluxes",i,
"uncertainty_mJy"});
968 if (config.has(
"pointing_offsets")) {
969 std::vector<double> offset;
971 offset = config.template get_typed<std::vector<double>>(std::tuple{
"pointing_offsets",0,
"value_arcsec"});
974 offset = config.template get_typed<std::vector<double>>(std::tuple{
"pointing_offsets",1,
"value_arcsec"});
979 offset = config.template get_typed<std::vector<double>>(std::tuple{
"pointing_offsets",2,
"modified_julian_date"});
987 logger->error(
"pointing_offsets not found in config");
988 std::exit(EXIT_FAILURE);
1055template <
class map_buffer_t>
1059 netCDF::NcFile fo(fval, netCDF::NcFile::write);
1102 add_netcdf_var(fo,
"to_Jy_pixel_"+name, (1/mJy_beam_to_uK)*mJy_beam_to_Jy_px);
1110 add_netcdf_var(fo,
"to_uK_"+name, mJy_beam_to_uK/mJy_beam_to_Jy_px);
1118 add_netcdf_var<std::string>(fo,
"DATEOBS0",
date_obs.back());
1147 add_netcdf_var<std::string>(fo,
"INSTRUME",
"TolTEC");
1149 add_netcdf_var<std::string>(fo,
"TELESCOP",
"LMT");
1150 add_netcdf_var<std::string>(fo,
"PIPELINE",
"CITLALI");
1151 add_netcdf_var<std::string>(fo,
"VERSION", CITLALI_GIT_VERSION);
1152 add_netcdf_var<std::string>(fo,
"KIDS", KIDSCPP_GIT_VERSION);
1153 add_netcdf_var<std::string>(fo,
"TULA", TULA_GIT_VERSION);
1155 add_netcdf_var<std::string>(fo,
"GOAL",
redu_type);
1157 add_netcdf_var<std::string>(fo,
"TYPE",
tod_type);
1158 add_netcdf_var<std::string>(fo,
"GROUPING",
map_grouping);
1159 add_netcdf_var<std::string>(fo,
"METHOD",
map_method);
1196 Eigen::VectorXd tau_el(1);
1201 for (
auto const& [key, val] : tau_freq) {
1207 for (Eigen::Index i=0; i<
calib.
arrays.size(); ++i) {
1216 std::vector<string> apt_filename;
1221 while (getline (ss, item, delim)) {
1222 apt_filename.push_back(item);
1224 add_netcdf_var<std::string>(fo,
"APT", apt_filename.back());
1248 for (Eigen::Index i=0; i<
calib.
arrays.size(); ++i) {
1271 rms = pow(mb->median_err(i), 0.5);
1287 for (Eigen::Index i=0; i<
calib.
arrays.size(); ++i) {
1302template <engine_utils::toltecIO::ProdType prod_t>
1337 netCDF::NcFile fo(
tod_filename[name], netCDF::NcFile::replace);
1340 netCDF::NcDim n_tod_output_type_dim = fo.addDim(
"n_tod_output_type",1);
1341 netCDF::NcVar tod_output_type_var = fo.addVar(
"tod_output_type",netCDF::ncString, n_tod_output_type_dim);
1342 const std::vector<size_t> tod_output_type_index = {0};
1345 std::string tod_output_type_name =
"rtc";
1346 tod_output_type_var.putVar(tod_output_type_index,tod_output_type_name);
1349 std::string tod_output_type_name =
"ptc";
1350 tod_output_type_var.putVar(tod_output_type_index,tod_output_type_name);
1357 netCDF::NcVar obsnum_v = fo.addVar(
"obsnum",netCDF::ncInt);
1358 obsnum_v.putAtt(
"units",
"N/A");
1359 int obsnum_int = std::stoi(
obsnum);
1360 obsnum_v.putVar(&obsnum_int);
1363 netCDF::NcVar source_ra_v = fo.addVar(
"SourceRa",netCDF::ncDouble);
1364 source_ra_v.putAtt(
"units",
"rad");
1368 netCDF::NcVar source_dec_v = fo.addVar(
"SourceDec",netCDF::ncDouble);
1369 source_dec_v.putAtt(
"units",
"rad");
1372 netCDF::NcDim n_pts_dim = fo.addDim(
"n_pts");
1373 netCDF::NcDim n_raw_scan_indices_dim = fo.addDim(
"n_raw_scan_indices",
telescope.
scan_indices.rows());
1374 netCDF::NcDim n_scan_indices_dim = fo.addDim(
"n_scan_indices", 2);
1377 netCDF::NcDim n_dets_dim = fo.addDim(
"n_dets",
calib.
n_dets);
1379 std::vector<netCDF::NcDim> dims = {n_pts_dim, n_dets_dim};
1380 std::vector<netCDF::NcDim> raw_scans_dims = {n_scans_dim, n_raw_scan_indices_dim};
1381 std::vector<netCDF::NcDim> scans_dims = {n_scans_dim, n_scan_indices_dim};
1384 netCDF::NcVar raw_scan_indices_v = fo.addVar(
"raw_scan_indices",netCDF::ncInt, raw_scans_dims);
1385 raw_scan_indices_v.putAtt(
"units",
"N/A");
1389 netCDF::NcVar scan_indices_v = fo.addVar(
"scan_indices",netCDF::ncInt, scans_dims);
1390 scan_indices_v.putAtt(
"units",
"N/A");
1393 netCDF::NcVar signal_v = fo.addVar(
"signal",netCDF::ncDouble, dims);
1397 std::vector<std::size_t> chunkSizes;
1399 netCDF::NcVar::ChunkMode chunkMode = netCDF::NcVar::nc_CHUNKED;
1406 signal_v.setChunking(chunkMode, chunkSizes);
1409 netCDF::NcVar flags_v = fo.addVar(
"flags",netCDF::ncDouble, dims);
1410 flags_v.putAtt(
"units",
"N/A");
1411 flags_v.setChunking(chunkMode, chunkSizes);
1415 netCDF::NcVar kernel_v = fo.addVar(
"kernel",netCDF::ncDouble, dims);
1416 kernel_v.putAtt(
"units",
"N/A");
1417 kernel_v.setChunking(chunkMode, chunkSizes);
1421 netCDF::NcVar det_lat_v = fo.addVar(
"det_lat",netCDF::ncDouble, dims);
1422 det_lat_v.putAtt(
"units",
"rad");
1423 det_lat_v.setChunking(chunkMode, chunkSizes);
1426 netCDF::NcVar det_lon_v = fo.addVar(
"det_lon",netCDF::ncDouble, dims);
1427 det_lon_v.putAtt(
"units",
"rad");
1428 det_lon_v.setChunking(chunkMode, chunkSizes);
1433 netCDF::NcVar det_ra_v = fo.addVar(
"det_ra",netCDF::ncDouble, dims);
1434 det_ra_v.putAtt(
"units",
"rad");
1435 det_ra_v.setChunking(chunkMode, chunkSizes);
1438 netCDF::NcVar det_dec_v = fo.addVar(
"det_dec",netCDF::ncDouble, dims);
1439 det_dec_v.putAtt(
"units",
"rad");
1440 det_dec_v.setChunking(chunkMode, chunkSizes);
1445 netCDF::NcVar apt_v = fo.addVar(
"apt_" + x.first,netCDF::ncDouble, n_dets_dim);
1451 netCDF::NcVar tel_data_v = fo.addVar(x.first,netCDF::ncDouble, n_pts_dim);
1452 tel_data_v.putAtt(
"units",
"rad");
1453 tel_data_v.setChunking(chunkMode, chunkSizes);
1458 logger->info(
"pointing_offsets_arcsec.second {} {}",x.first, x.second);
1459 netCDF::NcVar offsets_v = fo.addVar(
"pointing_offset_"+x.first,netCDF::ncDouble, n_pts_dim);
1460 offsets_v.putAtt(
"units",
"arcsec");
1461 offsets_v.setChunking(chunkMode, chunkSizes);
1466 std::vector<netCDF::NcDim> weight_dims = {n_scans_dim, n_dets_dim};
1467 netCDF::NcVar weights_v = fo.addVar(
"weights",netCDF::ncDouble, weight_dims);
1468 weights_v.putAtt(
"units",
"("+
omb.
sig_unit+
")^-2");
1474 netCDF::NcVar hwpr_v = fo.addVar(
"hwpr",netCDF::ncDouble, n_pts_dim);
1475 hwpr_v.putAtt(
"units",
"rad");
1480 netCDF::NcDim tel_header_dim = fo.addDim(
"tel_header_n_pts", 1);
1482 netCDF::NcVar tel_header_v = fo.addVar(key,netCDF::ncDouble, tel_header_dim);
1483 tel_header_v.putVar(&val(0));
1491 logger->info(
"reduction info");
1500 double mb_size_total = 0;
1506 logger->info(
"estimated size of map buffer {} GB", omb_size);
1508 mb_size_total = mb_size_total + omb_size;
1519 logger->info(
"estimated size of coadd buffer {} GB", cmb_size);
1521 mb_size_total = mb_size_total + cmb_size;
1528 logger->info(
"estimated size of noise buffer {} GB", nmb_size);
1529 mb_size_total = mb_size_total + nmb_size;
1538 logger->info(
"estimated size of noise buffer {} GB", nmb_size);
1539 mb_size_total = mb_size_total + nmb_size;
1543 logger->info(
"estimated size of all maps {} GB", mb_size_total);
1555template <TCDataKind tc_t>
1558 logger->debug(
"writing summary files for chunk {}",in.index.data);
1560 std::string filename =
"chunk_summary_" + std::to_string(in.index.data);
1566 f <<
"Summary file for scan " << in.index.data <<
"\n";
1567 f <<
"-Citlali version: " << CITLALI_GIT_VERSION <<
"\n";
1568 f <<
"-Kidscpp version: " << KIDSCPP_GIT_VERSION <<
"\n";
1569 f <<
"-Time of time chunk creation: " + in.creation_time +
"\n";
1572 f <<
"-Reduction type: " <<
redu_type <<
"\n";
1573 f <<
"-TOD type: " <<
tod_type <<
"\n";
1575 f <<
"-TOD chunk type: " << in.name <<
"\n";
1577 f <<
"-Calibrated: " << in.status.calibrated <<
"\n";
1578 f <<
"-Extinction Corrected: " << in.status.extinction_corrected <<
"\n";
1579 f <<
"-Demodulated: " << in.status.demodulated <<
"\n";
1580 f <<
"-Kernel Generated: " << in.status.kernel_generated <<
"\n";
1581 f <<
"-Despiked: " << in.status.despiked <<
"\n";
1582 f <<
"-TOD filtered: " << in.status.tod_filtered <<
"\n";
1583 f <<
"-Downsampled: " << in.status.downsampled <<
"\n";
1584 f <<
"-Cleaned: " << in.status.cleaned <<
"\n";
1586 f <<
"-Scan length: " << in.scans.data.rows() <<
"\n";
1588 f <<
"-Number of detectors: " << in.scans.data.cols() <<
"\n";
1589 f <<
"-Number of detectors flagged in APT table: " << (
calib.
apt[
"flag"].array()!=0).count() <<
"\n";
1590 f <<
"-Number of detectors flagged below weight limit: " << in.n_dets_low <<
"\n";
1591 f <<
"-Number of detectors flagged above weight limit: " << in.n_dets_high <<
"\n";
1592 Eigen::Index n_flagged = in.n_dets_low + in.n_dets_high + (
calib.
apt[
"flag"].array()!=0).count();
1593 f <<
"-Number of detectors flagged: " << n_flagged <<
" (" << 100*float(n_flagged)/float(in.scans.data.cols()) <<
"%)\n";
1595 f <<
"-NaNs found: " << in.scans.data.array().isNaN().count() <<
"\n";
1596 f <<
"-Infs found: " << in.scans.data.array().isInf().count() <<
"\n";
1597 f <<
"-Data min: " << in.scans.data.minCoeff() <<
" " <<
omb.
sig_unit <<
"\n";
1598 f <<
"-Data max: " << in.scans.data.maxCoeff() <<
" " <<
omb.
sig_unit <<
"\n";
1599 f <<
"-Data mean: " << in.scans.data.mean() <<
" " <<
omb.
sig_unit <<
"\n";
1600 f <<
"-Data median: " << tula::alg::median(in.scans.data) <<
" " <<
omb.
sig_unit <<
"\n";
1603 if (in.status.kernel_generated) {
1604 f <<
"-Kernel max: " << in.kernel.data.maxCoeff() <<
" " <<
omb.
sig_unit <<
"\n";
1610template <
typename map_buffer_t>
1613 logger->debug(
"writing map summary files");
1615 std::string filename =
"map_summary";
1619 f <<
"Summary file for maps\n";
1620 f <<
"-Citlali version: " << CITLALI_GIT_VERSION <<
"\n";
1621 f <<
"-Kidscpp version: " << KIDSCPP_GIT_VERSION <<
"\n";
1624 f <<
"-Reduction type: " <<
redu_type <<
"\n";
1625 f <<
"-Map type: " <<
tod_type <<
"\n";
1627 f <<
"-Rows: " << mb.n_rows <<
"\n";
1628 f <<
"-Cols: " << mb.n_cols <<
"\n";
1629 f <<
"-Number of maps: " <<
n_maps <<
"\n";
1630 f <<
"-Signal map unit: " << mb.sig_unit <<
"\n";
1631 f <<
"-Weight map unit: " <<
"1/(" + mb.sig_unit +
")^2" <<
"\n";
1632 f <<
"-Kernel maps generated: " << !mb.kernel.empty() <<
"\n";
1633 f <<
"-Coverage maps generated: " << !mb.coverage.empty() <<
"\n";
1634 f <<
"-Noise maps generated: " << !mb.noise.empty() <<
"\n";
1635 f <<
"-Number of noise maps: " << mb.noise.size() <<
"\n";
1638 std::map<std::string,int> n_nans;
1639 n_nans[
"signal"] = 0;
1640 n_nans[
"weight"] = 0;
1641 n_nans[
"kernel"] = 0;
1642 n_nans[
"coverage"] = 0;
1643 n_nans[
"noise"] = 0;
1646 std::map<std::string,int> n_infs;
1647 n_infs[
"signal"] = 0;
1648 n_infs[
"weight"] = 0;
1649 n_nans[
"kernel"] = 0;
1650 n_infs[
"coverage"] = 0;
1651 n_infs[
"noise"] = 0;
1654 for (Eigen::Index i=0; i<mb.signal.size(); ++i) {
1655 n_nans[
"signal"] = n_nans[
"signal"] + mb.signal[i].array().isNaN().count();
1656 n_nans[
"weight"] = n_nans[
"weight"] + mb.weight[i].array().isNaN().count();
1659 if (!mb.kernel.empty()) {
1660 n_nans[
"kernel"] = n_nans[
"kernel"] + mb.kernel[i].array().isNaN().count();
1663 if (!mb.coverage.empty()) {
1664 n_nans[
"coverage"] = n_nans[
"coverage"] + mb.coverage[i].array().isNaN().count();
1667 n_infs[
"signal"] = n_infs[
"signal"] + mb.signal[i].array().isInf().count();
1668 n_infs[
"weight"] = n_infs[
"weight"] + mb.weight[i].array().isInf().count();
1671 if (!mb.kernel.empty()) {
1672 n_infs[
"kernel"] = n_infs[
"kernel"] + mb.kernel[i].array().isInf().count();
1675 if (!mb.coverage.empty()) {
1676 n_infs[
"coverage"] = n_infs[
"coverage"] + mb.coverage[i].array().isInf().count();
1680 if (!mb.noise.empty()) {
1681 for (Eigen::Index j=0; j<mb.noise.size(); ++j) {
1682 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>> noise_matrix(mb.noise[i].data() + j * mb.n_rows * mb.n_cols,
1683 mb.n_rows, mb.n_cols);
1685 n_nans[
"noise"] = n_nans[
"noise"] + noise_matrix.array().isNaN().count();
1686 n_infs[
"noise"] = n_infs[
"noise"] + noise_matrix.array().isInf().count();
1691 for (
auto const& [key, val] : n_nans) {
1692 f <<
"-Number of "+ key +
" NaNs: " << val <<
"\n";
1695 for (
auto const& [key, val] : n_infs) {
1696 f <<
"-Number of "+ key +
" Infs: " << val <<
"\n";
1700template <mapmaking::MapType map_t, engine_utils::toltecIO::DataType data_t, engine_utils::toltecIO::ProdType prod_t>
1703 std::string filename;
1731 std::string map_name =
"";
1737 map_name = map_name +
"nw_" + std::to_string(
calib.
nws(i)) +
"_";
1745 for (Eigen::Index m=0; m<
calib.
fg.size(); ++m) {
1746 array_indices(k) =
calib.
fg(m);
1752 map_name = map_name +
"fg_" + std::to_string(array_indices(i)) +
"_";
1756 map_name = map_name +
"det_" + std::to_string(i) +
"_";
1763template <
typename fits_io_type,
class map_buffer_t>
1768 logger->debug(
"adding unit conversions");
1777 auto mJy_beam_to_Jy_px = 1e-3/beam_area_rad*pow(mb->pixel_size_rad,2);
1781 if (mb->sig_unit ==
"mJy/beam") {
1783 fits_io->at(i).pfits->pHDU().addKey(
"to_mJy/beam", 1,
"Conversion to mJy/beam");
1786 "Conversion to MJy/sr");
1788 fits_io->at(i).pfits->pHDU().addKey(
"to_uK", mJy_beam_to_uK,
"Conversion to uK");
1790 fits_io->at(i).pfits->pHDU().addKey(
"to_Jy/pixel", mJy_beam_to_Jy_px,
"Conversion to Jy/pixel");
1792 else if (mb->sig_unit ==
"MJy/sr") {
1795 "Conversion to mJy/beam");
1797 fits_io->at(i).pfits->pHDU().addKey(
"to_MJy/sr", 1,
"Conversion to MJy/sr");
1800 "Conversion to uK");
1803 "Conversion to Jy/pixel");
1805 else if (mb->sig_unit ==
"uK") {
1807 fits_io->at(i).pfits->pHDU().addKey(
"to_mJy/beam", 1/mJy_beam_to_uK,
"Conversion to mJy/beam");
1810 "Conversion to MJy/sr");
1812 fits_io->at(i).pfits->pHDU().addKey(
"to_uK", 1,
"Conversion to uK");
1814 fits_io->at(i).pfits->pHDU().addKey(
"to_Jy/pixel", (1/mJy_beam_to_uK)*mJy_beam_to_Jy_px,
"Conversion to Jy/pixel");
1816 else if (mb->sig_unit ==
"Jy/pixel") {
1818 fits_io->at(i).pfits->pHDU().addKey(
"to_mJy/beam", 1/mJy_beam_to_Jy_px,
"Conversion to mJy/beam");
1821 "Conversion to MJy/sr");
1823 fits_io->at(i).pfits->pHDU().addKey(
"to_uK", mJy_beam_to_uK/mJy_beam_to_Jy_px,
"Conversion to uK");
1825 fits_io->at(i).pfits->pHDU().addKey(
"to_Jy/pixel", 1,
"Conversion to Jy/pixel");
1830 fits_io->at(i).pfits->pHDU().addKey(
"to_mJy/beam",
"N/A",
"Conversion to mJy/beam");
1831 fits_io->at(i).pfits->pHDU().addKey(
"to_MJy/sr",
"N/A",
"Conversion to MJy/sr");
1832 fits_io->at(i).pfits->pHDU().addKey(
"to_uK",
"N/A",
"Conversion to uK");
1833 fits_io->at(i).pfits->pHDU().addKey(
"to_Jy/pixel",
"N/A",
"Conversion to Jy/pixel");
1838 fits_io->at(i).pfits->pHDU().addKey(
"HEADER.SOURCE.FLUX_MJYPERBEAM",
beammap_fluxes_mJy_beam[name],
"Source flux (mJy/beam)");
1839 fits_io->at(i).pfits->pHDU().addKey(
"HEADER.SOURCE.FLUX_MJYPERSR",
beammap_fluxes_MJy_Sr[name],
"Source flux (MJy/sr)");
1841 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.ITER_TOLERANCE",
beammap_iter_tolerance,
"Beammap iteration tolerance");
1842 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.ITER_MAX",
beammap_iter_max,
"Beammap max iterations");
1843 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.IS_DEROTATED",
beammap_derotate,
"Beammap derotated");
1846 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.REF_DET_INDEX",
beammap_reference_det,
"Beammap Reference det (rotation center)");
1851 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.REF_DET_INDEX", -99,
"Beammap Reference det (rotation center)");
1852 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.REF_X_T",
"N/A",
"Az rotation center (arcsec)");
1853 fits_io->at(i).pfits->pHDU().addKey(
"BEAMMAP.REF_Y_T",
"N/A",
"Alt rotation center (arcsec)");
1857 logger->debug(
"adding obsnums");
1860 for (Eigen::Index j=0; j<mb->obsnums.size(); ++j) {
1861 fits_io->at(i).pfits->pHDU().addKey(
"OBSNUM"+std::to_string(j), mb->obsnums.at(j),
"Observation Number " + std::to_string(j));
1865 if (mb->obsnums.size()==1) {
1866 fits_io->at(i).pfits->pHDU().addKey(
"DATEOBS0",
date_obs.back(),
"Date and time of observation 0");
1869 for (Eigen::Index j=0; j<mb->obsnums.size(); ++j) {
1870 fits_io->at(i).pfits->pHDU().addKey(
"DATEOBS"+std::to_string(j),
date_obs[j],
"Date and time of observation "+std::to_string(j));
1874 logger->debug(
"adding obs info");
1879 fits_io->at(i).pfits->pHDU().addKey(
"INSTRUME",
"TolTEC",
"Instrument");
1881 fits_io->at(i).pfits->pHDU().addKey(
"HWPR",
calib.
run_hwpr,
"HWPR installed");
1883 fits_io->at(i).pfits->pHDU().addKey(
"TELESCOP",
"LMT",
"Telescope");
1885 fits_io->at(i).pfits->pHDU().addKey(
"WAV", name,
"Wavelength");
1887 fits_io->at(i).pfits->pHDU().addKey(
"PIPELINE",
"CITLALI",
"Redu pipeline");
1889 fits_io->at(i).pfits->pHDU().addKey(
"VERSION", CITLALI_GIT_VERSION,
"CITLALI_GIT_VERSION");
1891 fits_io->at(i).pfits->pHDU().addKey(
"KIDS", KIDSCPP_GIT_VERSION,
"KIDSCPP_GIT_VERSION");
1893 fits_io->at(i).pfits->pHDU().addKey(
"TULA", TULA_GIT_VERSION,
"TULA_GIT_VERSION");
1897 fits_io->at(i).pfits->pHDU().addKey(
"GOAL",
redu_type,
"Reduction type");
1901 fits_io->at(i).pfits->pHDU().addKey(
"TYPE",
tod_type,
"TOD Type");
1903 fits_io->at(i).pfits->pHDU().addKey(
"GROUPING",
map_grouping,
"Map grouping");
1905 fits_io->at(i).pfits->pHDU().addKey(
"METHOD",
map_method,
"Map method");
1907 fits_io->at(i).pfits->pHDU().addKey(
"EXPTIME", mb->exposure_time,
"Exposure time (sec)");
1909 fits_io->at(i).pfits->pHDU().addKey(
"RADESYS",
telescope.
pixel_axes,
"Coord Reference Frame");
1911 fits_io->at(i).pfits->pHDU().addKey(
"SRC_RA",
telescope.
tel_header[
"Header.Source.Ra"][0],
"Source RA (radians)");
1913 fits_io->at(i).pfits->pHDU().addKey(
"SRC_DEC",
telescope.
tel_header[
"Header.Source.Dec"][0],
"Source Dec (radians)");
1915 fits_io->at(i).pfits->pHDU().addKey(
"TAN_RA",
telescope.
tel_header[
"Header.Source.Ra"][0],
"Map Tangent Point RA (radians)");
1917 fits_io->at(i).pfits->pHDU().addKey(
"TAN_DEC",
telescope.
tel_header[
"Header.Source.Dec"][0],
"Map Tangent Point Dec (radians)");
1923 fits_io->at(i).pfits->pHDU().addKey(
"MEAN_PA",
RAD_TO_DEG*
telescope.
tel_data[
"ActParAng"].mean(),
"Mean Parallactic angle (deg)");
1925 logger->debug(
"adding beamsizes");
1939 fits_io->at(i).pfits->pHDU().addKey(
"BUNIT", mb->sig_unit,
"bunit");
1943 logger->debug(
"adding jinc params");
1945 fits_io->at(i).pfits->pHDU().addKey(
"JINC_R",
jinc_mm.
r_max,
"Jinc filter R_max");
1952 logger->debug(
"adding extinction");
1954 Eigen::VectorXd tau_el(1);
1958 fits_io->at(i).pfits->pHDU().addKey(
"MEAN_TAU", tau_freq[i](0),
"mean tau (" + name +
")");
1961 fits_io->at(i).pfits->pHDU().addKey(
"MEAN_TAU", 0.,
"mean tau (" + name +
")");
1965 fits_io->at(i).pfits->pHDU().addKey(
"SAMPRATE",
telescope.
fsmp,
"sample rate (Hz)");
1968 if (mb->obsnums.size()==1) {
1969 std::vector<string> apt_filename;
1974 while (getline (ss, item, delim)) {
1975 apt_filename.push_back(item);
1977 fits_io->at(i).pfits->pHDU().addKey(
"APT", apt_filename.back(),
"APT table used");
1984 rms = pow(mb->median_err(i),0.5);
1992 logger->debug(
"adding oof params");
1993 fits_io->at(i).pfits->pHDU().addKey(
"OOF_RMS", rms,
"rms of map background (" + mb->sig_unit +
")");
1996 fits_io->at(i).pfits->pHDU().addKey(
"OOF_T", 3.0,
"taper (dB)");
1997 fits_io->at(i).pfits->pHDU().addKey(
"OOF_M2X",
telescope.
tel_header[
"Header.M2.XReq"](0)/1000.*1e6,
"oof m2x (microns)");
1998 fits_io->at(i).pfits->pHDU().addKey(
"OOF_M2Y",
telescope.
tel_header[
"Header.M2.YReq"](0)/1000.*1e6,
"oof m2y (microns)");
1999 fits_io->at(i).pfits->pHDU().addKey(
"OOF_M2Z",
telescope.
tel_header[
"Header.M2.ZReq"](0)/1000.*1e6,
"oof m2z (microns)");
2001 fits_io->at(i).pfits->pHDU().addKey(
"OOF_RO", 25.,
"outer diameter of the antenna (m)");
2002 fits_io->at(i).pfits->pHDU().addKey(
"OOF_RI", 1.65,
"inner diameter of the antenna (m)");
2005 fits_io->at(i).pfits->pHDU().addKey(
"FRUITLOOPS_ITER",
fruit_iter,
"Current fruit loops iteration");
2008 logger->debug(
"adding config params");
2009 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.VERBOSE",
verbose_mode,
"Reduced in verbose mode");
2011 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.DESPIKED",
rtcproc.
run_despike,
"Despiked");
2015 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.EXTINCTION",
rtcproc.
run_extinction,
"Extinction corrected");
2017 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.WEIGHT.TYPE",
ptcproc.
weighting_type,
"Weighting scheme");
2024 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.WEIGHT.MEDWTFACTOR",
ptcproc.
med_weight_factor,
"Median weight factor");
2025 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.CLEANED",
ptcproc.
run_clean,
"Cleaned");
2028 "Number of eigenvalues removed");
2031 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.CLEANED.NEIG", 0,
"Number of eigenvalues removed");
2042 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.FRUITLOOPS.FLUX", 0,
"Fruit loops flux (" + mb->sig_unit +
")");
2044 fits_io->at(i).pfits->pHDU().addKey(
"CONFIG.FRUITLOOPS.MAXITER",
ptcproc.
fruit_loops_iters,
"Fruit loops iterations");
2047 if (mb->obsnums.size()==1) {
2048 logger->debug(
"adding tel params");
2050 logger->debug(
"adding {}: {}", key, val);
2051 fits_io->at(i).pfits->pHDU().addKey(key, val(0), key);
2056template <
typename fits_io_type,
class map_buffer_t>
2057void Engine::write_maps(fits_io_type &fits_io, fits_io_type &noise_fits_io, map_buffer_t &mb, Eigen::Index i) {
2068 mb->wcs.crval[3] = stokes_index;
2072 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2073 fits_io->at(map_index).hdus.back()->addKey(
"UNIT", mb->sig_unit,
"Unit of map");
2077 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2078 fits_io->at(map_index).hdus.back()->addKey(
"UNIT",
"1/("+mb->sig_unit+
")^2",
"Unit of map");
2079 if (
redu_type !=
"beammap" && std::fabs(mb->median_err(i)) > std::numeric_limits<double>::epsilon()) {
2080 fits_io->at(map_index).hdus.back()->addKey(
"MEDERR", pow(mb->median_err(i),0.5),
"Median Error ("+mb->sig_unit+
")");
2083 fits_io->at(map_index).hdus.back()->addKey(
"MEDERR", 0.0,
"Median Error ("+mb->sig_unit+
")");
2089 fits_io->at(map_index).hdus.back()->addKey(
"TYPE",
rtcproc.
kernel.
type,
"Kernel type");
2101 fits_io->at(map_index).hdus.back()->addKey(
"FWHM",fwhm,
"Kernel fwhm (arcsec)");
2102 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2103 fits_io->at(map_index).hdus.back()->addKey(
"UNIT", mb->sig_unit,
"Unit of map");
2107 if (!mb->coverage.empty()) {
2109 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2110 fits_io->at(map_index).hdus.back()->addKey(
"UNIT",
"sec",
"Unit of map");
2114 if (!mb->coverage.empty()) {
2116 Eigen::MatrixXd ones, zeros;
2117 ones.setOnes(mb->weight[i].rows(), mb->weight[i].cols());
2118 zeros.setZero(mb->weight[i].rows(), mb->weight[i].cols());
2121 auto [weight_threshold, cov_ranges, cov_n_rows, cov_n_cols] = mb->calc_cov_region(i);
2123 Eigen::MatrixXd coverage_bool = (mb->weight[i].array() < weight_threshold).select(zeros,ones);
2127 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2128 fits_io->at(map_index).hdus.back()->addKey(
"UNIT",
"N/A",
"Unit of map");
2129 fits_io->at(map_index).hdus.back()->addKey(
"WTTHRESH", weight_threshold,
"Weight threshold");
2132 Eigen::MatrixXd sig2noise = mb->signal[i].array()*sqrt(mb->weight[i].array());
2134 fits_io->at(map_index).add_wcs(fits_io->at(map_index).hdus.back(), mb->wcs,
telescope.
tel_header[
"Header.Source.Epoch"](0));
2135 fits_io->at(map_index).hdus.back()->addKey(
"UNIT",
"N/A",
"Unit of map");
2139 if (!mb->noise.empty()) {
2140 for (Eigen::Index n=0; n<mb->n_noise; ++n) {
2141 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>> noise_matrix(mb->noise[i].data() + n * mb->n_rows * mb->n_cols,
2142 mb->n_rows, mb->n_cols);
2146 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));
2147 noise_fits_io->at(map_index).hdus.back()->addKey(
"UNIT", mb->sig_unit,
"Unit of map");
2148 noise_fits_io->at(map_index).hdus.back()->addKey(
"MEDRMS", mb->median_rms[i],
"Median RMS of noise maps");
2153template <mapmaking::MapType map_t,
class map_buffer_t>
2156 std::string filename = setup_filenames<map_t,engine_utils::toltecIO::toltec,engine_utils::toltecIO::psd>(dir_name);
2159 netCDF::NcFile fo(filename +
".nc", netCDF::NcFile::replace);
2162 for (Eigen::Index i=0; i<mb->psds.size(); ++i) {
2175 netCDF::NcDim psd_dim = fo.addDim(name +
"_nfreq",mb->psds[i].size());
2176 netCDF::NcDim pds_2d_row_dim = fo.addDim(name +
"_rows",mb->psd_2ds[i].rows());
2177 netCDF::NcDim pds_2d_col_dim = fo.addDim(name +
"_cols",mb->psd_2ds[i].cols());
2179 std::vector<netCDF::NcDim> dims;
2180 dims.push_back(pds_2d_row_dim);
2181 dims.push_back(pds_2d_col_dim);
2184 netCDF::NcVar psd_v = fo.addVar(name +
"_psd",netCDF::ncDouble, psd_dim);
2185 psd_v.putVar(mb->psds[i].data());
2188 netCDF::NcVar psd_freq_v = fo.addVar(name +
"_psd_freq",netCDF::ncDouble, psd_dim);
2189 psd_freq_v.putVar(mb->psd_freqs[i].data());
2192 Eigen::MatrixXd psd_2d_transposed = mb->psd_2ds[i].transpose();
2193 Eigen::MatrixXd psd_2d_freq_transposed = mb->psd_2d_freqs[i].transpose();
2196 netCDF::NcVar psd_2d_v = fo.addVar(name +
"_psd_2d",netCDF::ncDouble, dims);
2197 psd_2d_v.putVar(psd_2d_transposed.data());
2200 netCDF::NcVar psd_2d_freq_v = fo.addVar(name +
"_psd_2d_freq",netCDF::ncDouble, dims);
2201 psd_2d_freq_v.putVar(psd_2d_freq_transposed.data());
2203 if (!mb->noise.empty()) {
2205 netCDF::NcDim noise_psd_dim = fo.addDim(name +
"_noise_nfreq",mb->noise_psds[i].size());
2206 netCDF::NcDim noise_pds_2d_row_dim = fo.addDim(name +
"_noise_rows",mb->noise_psd_2ds[i].rows());
2207 netCDF::NcDim noise_pds_2d_col_dim = fo.addDim(name +
"_noise_cols",mb->noise_psd_2ds[i].cols());
2209 std::vector<netCDF::NcDim> noise_dims;
2210 noise_dims.push_back(noise_pds_2d_row_dim);
2211 noise_dims.push_back(noise_pds_2d_col_dim);
2214 netCDF::NcVar noise_psd_v = fo.addVar(name +
"_noise_psd",netCDF::ncDouble, noise_psd_dim);
2215 noise_psd_v.putVar(mb->noise_psds[i].data());
2218 netCDF::NcVar noise_psd_freq_v = fo.addVar(name +
"_noise_psd_freq",netCDF::ncDouble, noise_psd_dim);
2219 noise_psd_freq_v.putVar(mb->noise_psd_freqs[i].data());
2222 Eigen::MatrixXd noise_psd_2d_transposed = mb->noise_psd_2ds[i].transpose();
2223 Eigen::MatrixXd noise_psd_2d_freq_transposed = mb->noise_psd_2d_freqs[i].transpose();
2226 netCDF::NcVar noise_psd_2d_v = fo.addVar(name +
"_noise_psd_2d",netCDF::ncDouble, noise_dims);
2227 noise_psd_2d_v.putVar(noise_psd_2d_transposed.data());
2230 netCDF::NcVar noise_psd_2d_freq_v = fo.addVar(name +
"_noise_psd_2d_freq",netCDF::ncDouble, noise_dims);
2231 noise_psd_2d_freq_v.putVar(noise_psd_2d_freq_transposed.data());
2238template <mapmaking::MapType map_t,
class map_buffer_t>
2240 std::string filename = setup_filenames<map_t,engine_utils::toltecIO::toltec,engine_utils::toltecIO::hist>(dir_name);
2242 netCDF::NcFile fo(filename +
".nc", netCDF::NcFile::replace);
2243 netCDF::NcDim hist_bins_dim = fo.addDim(
"n_bins", mb->hist_n_bins);
2246 for (Eigen::Index i=0; i<mb->hists.size(); ++i) {
2261 netCDF::NcVar hist_bins_v = fo.addVar(name +
"_bins",netCDF::ncDouble, hist_bins_dim);
2262 hist_bins_v.putVar(mb->hist_bins[i].data());
2265 netCDF::NcVar hist_v = fo.addVar(name +
"_hist",netCDF::ncDouble, hist_bins_dim);
2266 hist_v.putVar(mb->hists[i].data());
2268 if (!mb->noise.empty()) {
2270 netCDF::NcVar hist_v = fo.addVar(name +
"_noise_hist",netCDF::ncDouble, hist_bins_dim);
2271 hist_v.putVar(mb->noise_hists[i].data());
2293 std::map<std::string, std::string> det_stats_header_units {
2297 {
"flagged_frac",
"N/A"},
2301 std::map<std::string, std::string> grp_stats_header_units {
2305 netCDF::NcFile fo(stats_filename +
".nc", netCDF::NcFile::replace);
2308 netCDF::NcVar obsnum_v = fo.addVar(
"obsnum",netCDF::ncInt);
2309 obsnum_v.putAtt(
"units",
"N/A");
2310 int obsnum_int = std::stoi(
obsnum);
2311 obsnum_v.putVar(&obsnum_int);
2314 netCDF::NcDim n_dets_dim = fo.addDim(
"n_dets",
calib.
n_dets);
2315 netCDF::NcDim n_arrays_dim = fo.addDim(
"n_arrays",
calib.
n_arrays);
2318 std::vector<netCDF::NcDim> dims = {n_chunks_dim, n_dets_dim};
2319 std::vector<netCDF::NcDim> grp_dims = {n_chunks_dim, n_arrays_dim};
2323 netCDF::NcVar stat_v = fo.addVar(stat,netCDF::ncDouble, dims);
2325 stat_v.putAtt(
"units",det_stats_header_units[stat]);
2329 netCDF::NcVar stat_v = fo.addVar(stat,netCDF::ncDouble, grp_dims);
2331 stat_v.putAtt(
"units",grp_stats_header_units[stat]);
2336 netCDF::NcVar apt_v = fo.addVar(
"apt_" + x.first,netCDF::ncDouble, n_dets_dim);
2337 apt_v.putVar(x.second.data());
2345 std::vector<netCDF::NcDim> dims = {adc_snap_dim, adc_snap_data_dim};
2348 netCDF::NcVar adc_snap_v = fo.addVar(
"toltec" + std::to_string(
calib.
nws(i)) +
"_adc_snap_data",netCDF::ncDouble, dims);
2349 adc_snap_v.putVar(x.data());
2357 netCDF::NcDim n_eig_grp_dim = fo.addDim(
"n_eig_grp",
diagnostics.
evals[0][0].size());
2359 std::vector<netCDF::NcDim> eval_dims = {n_eig_grp_dim, n_eigs_dim};
2364 for (Eigen::Index i=0; i<val.size(); ++i) {
2367 "_chunk_" + std::to_string(key), netCDF::ncDouble,eval_dims);
2368 std::vector<std::size_t> start_eig_index = {0, 0};
2372 for (
const auto &evals: val[i]) {
2373 eval_v.putVar(start_eig_index,size,evals.data());
2374 start_eig_index[0] += 1;
2382template <mapmaking::MapType map_t,
class map_buffer_t>
2387 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>* f_io =
nullptr;
2389 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>* n_io =
nullptr;
2391 std::string dir_name;
2407 for (Eigen::Index i=0; i<f_io->size(); ++i) {
2413 if (!pmb->
noise.empty()) {
2419 for (Eigen::Index i=0; i<
n_maps; ++i) {
2433 tula::logging::progressbar pb(
2434 [&](
const auto &msg) {
logger->info(
"{}", msg); }, 100,
2437 for (Eigen::Index j=0; j<mb.n_noise; ++j) {
2439 pb.count(mb.n_noise, mb.n_noise / 100);
2443 logger->info(
"renormalizing errors");
2445 mb.calc_median_err();
2447 mb.calc_median_rms();
2450 auto noise_factor = (1./pow(mb.median_rms.array(),2.))*mb.median_err.array();
2452 mb.weight[i].noalias() = mb.weight[i]*noise_factor(i);
2454 logger->info(
"median rms {} ({})",
static_cast<float>(mb.median_rms(i)), mb.sig_unit);
2463 logger->info(
"file has been written to:");
2464 logger->info(
"{}.fits",f_io->at(map_index).filepath);
2467 bool close_file =
true;
2476 f_io->at(map_index).pfits->destroy();
2489template <mapmaking::MapType map_t,
class map_buffer_t>
2492 mb.n_sources.clear();
2493 mb.row_source_locs.clear();
2494 mb.col_source_locs.clear();
2496 for (Eigen::Index i=0; i<
n_maps; ++i) {
2498 mb.n_sources.push_back(0);
2499 mb.row_source_locs.push_back(Eigen::VectorXi::Ones(1));
2500 mb.col_source_locs.push_back(Eigen::VectorXi::Ones(1));
2503 mb.row_source_locs.back()*=-99;
2504 mb.col_source_locs.back()*=-99;
2507 auto sources_found = mb.find_sources(i);
2510 if (sources_found) {
2511 logger->info(
"{} source(s) found", mb.n_sources.back());
2514 logger->info(
"no sources found");
2519 Eigen::Index n_sources = 0;
2520 for (
const auto &sources: mb.n_sources) {
2521 n_sources += sources;
2532 for (Eigen::Index i=0; i<
n_maps; ++i) {
2534 if (mb.n_sources[i] > 0) {
2541 std::vector<int> source_in_vec, source_out_vec;
2543 source_in_vec.resize(mb.n_sources[i]);
2544 std::iota(source_in_vec.begin(), source_in_vec.end(), 0);
2545 source_out_vec.resize(mb.n_sources[i]);
2548 grppi::map(tula::grppi_utils::dyn_ex(
parallel_policy), source_in_vec, source_out_vec, [&](
auto j) {
2550 double init_row = mb.row_source_locs[i](j);
2551 double init_col = mb.col_source_locs[i](j);
2554 auto [params, perrors, good_fit] =
2556 init_fwhm, init_row, init_col);
2559 params(1) =
RAD_TO_ASEC*mb.pixel_size_rad*(params(1) - (mb.n_cols)/2);
2560 params(2) =
RAD_TO_ASEC*mb.pixel_size_rad*(params(2) - (mb.n_rows)/2);
2565 perrors(1) =
RAD_TO_ASEC*mb.pixel_size_rad*(perrors(1));
2566 perrors(2) =
RAD_TO_ASEC*mb.pixel_size_rad*(perrors(2));
2572 Eigen::VectorXd lat(1), lon(1);
2586 mb.source_params.row(k+j) = params;
2587 mb.source_perror.row(k+j) = perrors;
2593 k += mb.n_sources[i];
2598template <mapmaking::MapType map_t,
class map_buffer_t>
2605 std::vector<std::string> source_header = {
2626 std::map<std::string,std::string> source_header_units = {
2628 {
"amp", mb->sig_unit},
2629 {
"amp_err", mb->sig_unit},
2631 {
"x_t_err", pos_units},
2633 {
"y_t_err", pos_units},
2634 {
"a_fwhm",
"arcsec"},
2635 {
"a_fwhm_err",
"arcsec"},
2636 {
"b_fwhm",
"arcsec"},
2637 {
"b_fwhm_err",
"arcsec"},
2639 {
"angle_err",
"rad"},
2640 {
"sig2noise",
"N/A"}
2644 YAML::Node source_meta;
2647 for (Eigen::Index i=0; i<mb->obsnums.size(); ++i) {
2649 source_meta[
"obsnum" + std::to_string(i)] = mb->obsnums[i];
2659 source_meta[
"date"] =
date_obs.back();
2663 for (
const auto &[key,val]: source_header_units) {
2664 source_meta[key].push_back(
"units: " + val);
2667 source_meta[key].push_back(description);
2671 Eigen::Index n_sources = 0;
2672 for (
const auto &sources: mb->n_sources) {
2673 n_sources += sources;
2681 for (Eigen::Index i=0; i<mb->n_sources.size(); ++i) {
2682 if (mb->n_sources[i]!=0) {
2686 for (Eigen::Index j=0; j<mb->n_sources[i]; ++j) {
2699 source_table.col(i) = mb->source_params.col(j).template cast <float> ();
2700 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:354
std::string obsnum_dir_name
Definition engine.h:184
void write_stats()
Definition engine.h:2278
std::string parallel_policy
Definition engine.h:196
void write_map_summary(map_buffer_t &)
Definition engine.h:1611
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:1303
std::vector< Eigen::VectorXd > nw_times
Definition engine.h:166
void write_psd(map_buffer_t &, std::string)
Definition engine.h:2154
int redu_dir_num
Definition engine.h:181
auto get_map_name(int)
Definition engine.h:1729
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:668
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:1701
std::string tod_output_subdir_name
Definition engine.h:223
void create_obs_map_files()
Definition engine.h:992
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:560
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:2383
std::string output_dir
Definition engine.h:178
int n_scans_done
Definition engine.h:199
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:2239
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:1764
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:773
void add_tod_header(map_buffer_t &)
Definition engine.h:1056
std::map< std::string, std::string > tod_filename
Definition engine.h:187
void write_sources(map_buffer_t &, std::string)
Definition engine.h:2599
void get_timestream_config(CT &)
Definition engine.h:498
std::string tod_type
Definition engine.h:211
void cli_summary()
Definition engine.h:1490
Eigen::VectorXI maps_to_stokes
Definition engine.h:235
void get_astrometry_config(CT &)
Definition engine.h:966
void get_photometry_config(CT &)
Definition engine.h:932
void get_rtc_config(CT &)
Definition engine.h:467
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:2490
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:1556
Eigen::ArrayXd pointing_offsets_modified_julian_date
Definition engine.h:243
void get_ptc_config(CT &)
Definition engine.h:487
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:738
void write_maps(fits_io_type &, fits_io_type &, map_buffer_t &, Eigen::Index)
Definition engine.h:2057
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