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