142 using namespace netCDF;
143 using namespace netCDF::exceptions;
146 std::vector<Eigen::Index> interfaces;
149 Eigen::Index n_dets = 0;
151 std::vector<Eigen::Index> dets, nws, arrays;
156 NcFile fo(data_item.filepath(), NcFile::read);
157 auto vars = fo.getVars();
160 interfaces.push_back(std::stoi(data_item.interface().substr(6)));
163 n_dets += vars.find(
"Data.Toltec.Is")->second.getDim(1).getSize();
166 dets.push_back(vars.find(
"Data.Toltec.Is")->second.getDim(1).getSize());
168 nws.push_back(interfaces.back());
170 arrays.push_back(
engine().toltec_io.nw_to_array_map[interfaces.back()]);
174 }
catch (NcException &e) {
175 logger->error(
"{}", e.what());
177 "failed to load data from netCDF file {}", data_item.filepath())};
182 engine().calib.apt.clear();
185 for (
auto const& key :
engine().calib.apt_header_keys) {
186 if (key==
"x_t" || key==
"y_t") {
187 engine().calib.apt[key].setZero(n_dets);
190 engine().calib.apt[key].setOnes(n_dets);
195 engine().calib.apt[
"flag"].setZero(n_dets);
199 for (Eigen::Index i=0; i<nws.size(); ++i) {
200 engine().calib.apt[
"nw"].segment(j,dets[i]).setConstant(nws[i]);
201 engine().calib.apt[
"array"].segment(j,dets[i]).setConstant(arrays[i]);
207 engine().calib.apt[
"uid"] = Eigen::VectorXd::LinSpaced(n_dets,0,n_dets-1);
213 engine().calib.apt_filepath =
"internally generated for beammap";
218 using namespace netCDF;
219 using namespace netCDF::exceptions;
222 std::map<Eigen::Index,Eigen::MatrixXd> tone_freqs;
225 std::vector<Eigen::Index> interfaces;
228 Eigen::Index n_dets = 0;
230 std::vector<Eigen::Index> dets, nws, arrays;
235 NcFile fo(data_item.filepath(), NcFile::read);
236 auto vars = fo.getVars();
239 interfaces.push_back(std::stoi(data_item.interface().substr(6)));
242 n_dets += vars.find(
"Data.Toltec.Is")->second.getDim(1).getSize();
245 Eigen::Index n_sweeps = vars.find(
"Header.Toltec.ToneFreq")->second.getDim(0).getSize();
249 vars.find(
"Header.Toltec.LoCenterFreq")->second.getVar(&lo_freq);
252 tone_freqs[interfaces.back()].resize(vars.find(
"Header.Toltec.ToneFreq")->second.getDim(1).getSize(),n_sweeps);
253 vars.find(
"Header.Toltec.ToneFreq")->second.getVar(tone_freqs[interfaces.back()].data());
256 tone_freqs[interfaces.back()] = tone_freqs[interfaces.back()].array() + lo_freq;
260 }
catch (NcException &e) {
261 logger->error(
"{}", e.what());
263 "failed to load data from netCDF file {}", data_item.filepath())};
267 engine().calib.apt[
"tone_freq"].resize(
engine().calib.n_dets);
271 for (Eigen::Index i=0; i<
engine().calib.nws.size(); ++i) {
272 engine().calib.apt[
"tone_freq"].segment(j,tone_freqs[interfaces[i]].size()) = tone_freqs[interfaces[i]];
274 j = j + tone_freqs[interfaces[i]].size();
277 if (!
engine().telescope.sim_obs) {
281 Eigen::VectorXd dfreq(
engine().calib.n_dets);
282 dfreq(0) =
engine().calib.apt[
"tone_freq"](1) -
engine().calib.apt[
"tone_freq"](0);
285 for (Eigen::Index i=1; i<
engine().calib.apt[
"tone_freq"].size()-1; ++i) {
286 dfreq(i) = std::min(abs(
engine().calib.apt[
"tone_freq"](i) -
engine().calib.apt[
"tone_freq"](i-1)),
287 abs(
engine().calib.apt[
"tone_freq"](i+1) -
engine().calib.apt[
"tone_freq"](i)));
290 dfreq(dfreq.size()-1) = abs(
engine().calib.apt[
"tone_freq"](dfreq.size()-1)-
engine().calib.apt[
"tone_freq"](dfreq.size()-2));
293 int n_nearby_tones = 0;
296 engine().calib.apt[
"duplicate_tone"].setZero(
engine().calib.n_dets);
299 for (Eigen::Index i=0; i<
engine().calib.n_dets; ++i) {
301 if (dfreq(i) <
engine().rtcproc.delta_f_min_Hz) {
302 engine().calib.apt[
"duplicate_tone"](i) = 1;
306 logger->info(
"{} nearby tones found. these will be flagged.",n_nearby_tones);
440 using namespace netCDF;
441 using namespace netCDF::exceptions;
444 engine().start_indices.clear();
445 engine().end_indices.clear();
451 std::vector<Eigen::VectorXd> nw_ts;
453 std::vector<double> nw_t0, nw_tn;
459 double min_tn = std::numeric_limits<double>::max();
461 Eigen::Index max_t0_i, min_tn_i;
472 NcFile fo(data_item.filepath(), NcFile::read);
473 auto vars = fo.getVars();
477 vars.find(
"Header.Toltec.RoachIndex")->second.getVar(&roach_index);
481 vars.find(
"Header.Toltec.SampleFreq")->second.getVar(&fsmp_roach);
484 if (fsmp!=-1 && fsmp_roach!=fsmp) {
485 logger->error(
"mismatched sample rate in toltec{}",roach_index);
486 std::exit(EXIT_FAILURE);
493 Eigen::Index n_pts = vars.find(
"Data.Toltec.Ts")->second.getDim(0).getSize();
494 Eigen::Index n_time = vars.find(
"Data.Toltec.Ts")->second.getDim(1).getSize();
497 Eigen::MatrixXi ts(n_time,n_pts);
498 vars.find(
"Data.Toltec.Ts")->second.getVar(ts.data());
501 ts.transposeInPlace();
504 int gaps = ((ts.block(1,3,n_pts,1).array() - ts.block(0,3,n_pts-1,1).array()).array() > 1).count();
508 engine().gaps[
"Toltec" + std::to_string(roach_index)] = gaps;
513 vars.find(
"Header.Toltec.FpgaFreq")->second.getVar(&fpga_freq);
516 auto sec0 = ts.cast <
double> ().col(0);
518 auto nsec0 = ts.cast <
double> ().col(5);
520 auto pps = ts.cast <
double> ().col(1);
522 auto msec = ts.cast <
double> ().col(2)/fpga_freq;
524 auto count = ts.cast <
double> ().col(3);
526 auto pps_msec = ts.cast <
double> ().col(4)/fpga_freq;
528 auto t0 = sec0 + nsec0*1e-9;
531 int start_t = int(t0[0] - 0.5);
535 double start_t_dbl = start_t;
537 Eigen::VectorXd dt = msec - pps_msec;
539 dt = (dt.array() < 0).select(msec.array() - pps_msec.array() + (pow(2.0,32)-1)/fpga_freq,msec - pps_msec);
541 nw_ts.push_back(start_t_dbl + pps.array() + dt.array() +
542 engine().interface_sync_offset[
"toltec"+std::to_string(roach_index)]);
545 nw_t0.push_back(nw_ts.back()[0]);
548 nw_tn.push_back(nw_ts.back()[n_pts - 1]);
551 if (nw_t0.back() > max_t0) {
552 max_t0 = nw_t0.back();
557 if (nw_tn.back() < min_tn) {
558 min_tn = nw_tn.back();
567 }
catch (NcException &e) {
568 logger->error(
"{}", e.what());
570 "failed to load data from netCDF file {}", data_item.filepath())};
575 if (
engine().calib.run_hwpr) {
607 Eigen::Index hwpr_ts_n_pts =
engine().calib.hwpr_recvt.size();
608 if (
engine().calib.hwpr_recvt(0) > max_t0) {
609 max_t0 =
engine().calib.hwpr_recvt(0);
613 if (
engine().calib.hwpr_recvt(hwpr_ts_n_pts - 1) < min_tn) {
614 min_tn =
engine().calib.hwpr_recvt(hwpr_ts_n_pts - 1);
619 Eigen::Index min_size = nw_ts[0].size();
622 for (Eigen::Index i=0; i<nw_ts.size(); ++i) {
626 auto s = (abs(nw_ts[i].array() - max_t0)).minCoeff(&si);
630 while (nw_ts[i][si] < max_t0) {
634 engine().start_indices.push_back(si);
637 auto e = (abs(nw_ts[i].array() - min_tn)).minCoeff(&ei);
640 while (nw_ts[i][ei] > min_tn) {
644 engine().end_indices.push_back(ei);
648 for (Eigen::Index i=0; i<nw_ts.size(); ++i) {
650 auto si =
engine().start_indices[i];
652 auto ei =
engine().end_indices[i];
655 if ((ei - si + 1) < min_size) {
656 min_size = ei - si + 1;
661 if (
engine().calib.run_hwpr) {
664 auto s = (abs(
engine().calib.hwpr_recvt.array() - max_t0)).minCoeff(&si);
668 while (
engine().calib.hwpr_recvt(si) < max_t0) {
672 engine().hwpr_start_indices = si;
675 auto e = (abs(
engine().calib.hwpr_recvt.array() - min_tn)).minCoeff(&ei);
678 while (
engine().calib.hwpr_recvt(ei) > min_tn) {
682 engine().hwpr_end_indices = ei;
685 if ((ei - si + 1) < min_size) {
686 min_size = ei - si + 1;
691 Eigen::Matrix<Eigen::Index,1,1> nd;
692 nd <<
engine().telescope.tel_data[
"TelTime"].size();
695 Eigen::VectorXd xi = nw_ts[max_t0_i].head(min_size);
698 for (
const auto &tel_it :
engine().telescope.tel_data) {
699 if (tel_it.first !=
"TelTime") {
701 Eigen::VectorXd yd =
engine().telescope.tel_data[tel_it.first];
703 Eigen::VectorXd yi(min_size);
705 mlinterp::interp(nd.data(), min_size,
706 yd.data(), yi.data(),
707 engine().telescope.tel_data[
"TelTime"].data(), xi.data());
710 engine().telescope.tel_data[tel_it.first] = std::move(yi);
715 engine().telescope.tel_data[
"TelTime"] = xi;
716 engine().telescope.tel_data[
"TelUTC"] = xi;
719 if (
engine().calib.run_hwpr) {
720 Eigen::VectorXd yd =
engine().calib.hwpr_angle;
722 Eigen::VectorXd yi(min_size);
723 mlinterp::interp(nd.data(), min_size,
724 yd.data(), yi.data(),
725 engine().calib.hwpr_recvt.data(), xi.data());
728 engine().calib.hwpr_angle = std::move(yi);
739 Eigen::Index n_offsets =
engine().pointing_offsets_arcsec[
"az"].size();
742 std::vector<std::string> altaz_keys = {
"alt",
"az"};
744 for (
const auto &key: altaz_keys) {
747 double offset =
engine().pointing_offsets_arcsec[key](0);
748 engine().pointing_offsets_arcsec[key].resize(
engine().telescope.tel_data[
"TelTime"].size());
749 engine().pointing_offsets_arcsec[key].setConstant(offset);
751 else if (n_offsets==2) {
753 Eigen::Index ni =
engine().telescope.tel_data[
"TelTime"].size();
756 Eigen::Matrix<Eigen::Index,1,1> nd;
760 Eigen::VectorXd yi(ni);
763 Eigen::VectorXd xd(n_offsets);
765 if ((
engine().pointing_offsets_modified_julian_date<=0).any()) {
766 xd <<
engine().telescope.tel_data[
"TelTime"](0),
engine().telescope.tel_data[
"TelTime"](ni-1);
774 if (xd(0) >
engine().telescope.tel_data[
"TelTime"](0) || xd(1) <
engine().telescope.tel_data[
"TelTime"](ni-1)) {
775 logger->error(
"MJD range is invalid");
776 std::exit(EXIT_FAILURE);
781 mlinterp::interp(nd.data(), ni,
782 engine().pointing_offsets_arcsec[key].data(), yi.data(),
783 xd.data(),
engine().telescope.tel_data[
"TelTime"].data());
786 engine().pointing_offsets_arcsec[key] = yi;
789 logger->error(
"only one or two values for altaz offsets are supported");
790 std::exit(EXIT_FAILURE);
799 if (
engine().map_grouping==
"auto") {
801 if ((
engine().redu_type ==
"science") || (
engine().redu_type ==
"pointing")) {
802 engine().map_grouping =
"array";
806 else if ((
engine().redu_type ==
"beammap")) {
807 engine().map_grouping =
"detector";
812 if (
engine().map_grouping ==
"detector") {
817 else if (
engine().map_grouping ==
"nw") {
822 else if (
engine().map_grouping ==
"array") {
827 else if (
engine().map_grouping ==
"fg") {
832 if (
engine().rtcproc.run_polarization) {
853 Eigen::VectorXI array_indices;
856 if (
engine().map_grouping ==
"detector") {
859 array_indices =
engine().calib.apt[
"array"].template cast<Eigen::Index> ();
863 else if (
engine().map_grouping ==
"array") {
865 array_indices =
engine().calib.arrays;
869 else if (
engine().map_grouping ==
"nw") {
873 array_indices.resize(
engine().calib.nws.size());
876 for (Eigen::Index i=0; i<
engine().calib.nws.size(); ++i) {
878 array_indices(i) =
engine().toltec_io.nw_to_array_map[
engine().calib.nws(i)];
883 else if (
engine().map_grouping ==
"fg") {
888 array_indices.resize(
engine().calib.fg.size()*
engine().calib.n_arrays);
893 for (Eigen::Index i=0; i<
engine().calib.n_arrays; ++i) {
895 array_indices.segment(j,
engine().calib.fg.size()).setConstant(
engine().calib.arrays(i));
897 j = j +
engine().calib.fg.size();
904 for (
const auto &[stokes_index,stokes_param]:
engine().rtcproc.polarization.stokes_params) {
906 engine().maps_to_arrays.segment(j,array_indices.size()) = array_indices;
908 engine().maps_to_stokes.segment(j,array_indices.size()).setConstant(stokes_index);
910 j = j + array_indices.size();
914 Eigen::Index index = 0;
916 engine().arrays_to_maps(0) = index;
917 for (Eigen::Index i=1; i<
engine().n_maps; ++i) {
919 if (
engine().maps_to_arrays(i) >
engine().maps_to_arrays(i-1)) {
923 else if (
engine().maps_to_arrays(i) <
engine().maps_to_arrays(i-1)) {
926 engine().arrays_to_maps(i) = index;
938 if ((
engine().omb.wcs.naxis[0] <= 0) || (
engine().omb.wcs.naxis[1] <= 0)) {
940 Eigen::MatrixXd det_lat_limits(
engine().calib.n_dets, 2);
941 Eigen::MatrixXd det_lon_limits(
engine().calib.n_dets, 2);
942 det_lat_limits.setZero();
943 det_lon_limits.setZero();
946 std::vector<int> det_in_vec, det_out_vec;
949 det_in_vec.resize(
engine().calib.n_dets);
950 std::iota(det_in_vec.begin(), det_in_vec.end(), 0);
951 det_out_vec.resize(
engine().calib.n_dets);
954 std::map<std::string, Eigen::VectorXd> tel_data;
957 std::map<std::string, Eigen::VectorXd> pointing_offsets_arcsec;
960 for (Eigen::Index i=0; i<
engine().telescope.scan_indices.cols(); ++i) {
962 auto si =
engine().telescope.scan_indices(0,i);
964 auto sl =
engine().telescope.scan_indices(1,i) -
engine().telescope.scan_indices(0,i) + 1;
966 for (
auto const& x:
engine().telescope.tel_data) {
967 tel_data[x.first] =
engine().telescope.tel_data[x.first].segment(si,sl);
971 pointing_offsets_arcsec[
"az"] =
engine().pointing_offsets_arcsec[
"az"].segment(si,sl);
972 pointing_offsets_arcsec[
"alt"] =
engine().pointing_offsets_arcsec[
"alt"].segment(si,sl);
975 if (
engine().map_grouping!=
"detector") {
977 grppi::map(tula::grppi_utils::dyn_ex(
engine().parallel_policy), det_in_vec, det_out_vec, [&](
auto j) {
981 engine().telescope.pixel_axes, pointing_offsets_arcsec,
engine().map_grouping);
983 if (
engine().calib.apt[
"flag"](j)==0) {
984 if (lat.minCoeff() < det_lat_limits(j,0)) {
985 det_lat_limits(j,0) = lat.minCoeff();
987 if (lat.maxCoeff() > det_lat_limits(j,1)) {
988 det_lat_limits(j,1) = lat.maxCoeff();
990 if (lon.minCoeff() < det_lon_limits(j,0)) {
991 det_lon_limits(j,0) = lon.minCoeff();
993 if (lon.maxCoeff() > det_lon_limits(j,1)) {
994 det_lon_limits(j,1) = lon.maxCoeff();
1003 pointing_offsets_arcsec,
engine().map_grouping);
1004 if (lat.minCoeff() < det_lat_limits(0,0)) {
1005 det_lat_limits.col(0).setConstant(lat.minCoeff());
1007 if (lat.maxCoeff() > det_lat_limits(0,1)) {
1008 det_lat_limits.col(1).setConstant(lat.maxCoeff());
1010 if (lon.minCoeff() < det_lon_limits(0,0)) {
1011 det_lon_limits.col(0).setConstant(lon.minCoeff());
1013 if (lon.maxCoeff() > det_lon_limits(0,1)) {
1014 det_lon_limits.col(1).setConstant(lon.maxCoeff());
1020 double min_lat = det_lat_limits.col(0).minCoeff();
1021 double max_lat = det_lat_limits.col(1).maxCoeff();
1022 double min_lon = det_lon_limits.col(0).minCoeff();
1023 double max_lon = det_lon_limits.col(1).maxCoeff();
1026 auto calc_map_dims = [&](
double min_dim,
double max_dim) {
1027 int min_pix =
static_cast<int>(ceil(abs(min_dim / omb.pixel_size_rad)));
1028 int max_pix =
static_cast<int>(ceil(abs(max_dim / omb.pixel_size_rad)));
1029 return 2 * std::max(min_pix, max_pix) + 1;
1033 omb.n_rows = calc_map_dims(min_lat, max_lat);
1034 omb.n_cols = calc_map_dims(min_lon, max_lon);
1039 omb.n_rows = (omb.wcs.naxis[1] % 2 == 0) ? omb.wcs.naxis[1] + 1 : omb.wcs.naxis[1];
1040 omb.n_cols = (omb.wcs.naxis[0] % 2 == 0) ? omb.wcs.naxis[0] + 1 : omb.wcs.naxis[0];
1043 Eigen::VectorXd rows_tan_vec = Eigen::VectorXd::LinSpaced(omb.n_rows, 0, omb.n_rows - 1).array() * omb.pixel_size_rad -
1044 (omb.n_rows / 2.0) * omb.pixel_size_rad;
1045 Eigen::VectorXd cols_tan_vec = Eigen::VectorXd::LinSpaced(omb.n_cols, 0, omb.n_cols - 1).array() * omb.pixel_size_rad -
1046 (omb.n_cols / 2.0) * omb.pixel_size_rad;
1050 map_extents.push_back({
static_cast<int>(omb.n_rows),
static_cast<int>(omb.n_cols)});
1051 map_coords.push_back({std::move(rows_tan_vec), std::move(cols_tan_vec)});
1057 auto& cmb =
engine().cmb;
1060 double min_row = std::numeric_limits<double>::max();
1061 double max_row = std::numeric_limits<double>::lowest();
1062 double min_col = min_row;
1063 double max_col = max_row;
1066 for (
const auto& coord : map_coords) {
1067 min_row = std::min(min_row, coord.front().minCoeff());
1068 max_row = std::max(max_row, coord.front().maxCoeff());
1069 min_col = std::min(min_col, coord.back().minCoeff());
1070 max_col = std::max(max_col, coord.back().maxCoeff());
1074 auto calc_map_dims = [&](
auto min_dim,
auto max_dim) {
1075 int min_pix =
static_cast<int>(ceil(abs(min_dim /
engine().cmb.pixel_size_rad)));
1076 int max_pix =
static_cast<int>(ceil(abs(max_dim /
engine().cmb.pixel_size_rad)));
1078 int n_dim = 2 * std::max(min_pix, max_pix) + 1;
1079 Eigen::VectorXd dim_vec = Eigen::VectorXd::LinSpaced(n_dim, 0, n_dim - 1)
1080 .array() *
engine().cmb.pixel_size_rad - (n_dim / 2.0) *
engine().cmb.pixel_size_rad;
1082 return std::make_tuple(n_dim, std::move(dim_vec));
1086 auto [n_rows, rows_tan_vec] = calc_map_dims(min_row, max_row);
1087 auto [n_cols, cols_tan_vec] = calc_map_dims(min_col, max_col);
1090 cmb.n_rows = n_rows;
1091 cmb.n_cols = n_cols;
1092 cmb.wcs.naxis[0] = n_cols;
1093 cmb.wcs.naxis[1] = n_rows;
1094 cmb.wcs.crpix[0] = (n_cols - 1) / 2.0;
1095 cmb.wcs.crpix[1] = (n_rows - 1) / 2.0;
1097 cmb.rows_tan_vec = std::move(rows_tan_vec);
1098 cmb.cols_tan_vec = std::move(cols_tan_vec);
1104 auto& omb =
engine().omb;
1106 std::vector<Eigen::MatrixXd>().swap(omb.signal);
1107 std::vector<Eigen::MatrixXd>().swap(omb.weight);
1108 std::vector<Eigen::MatrixXd>().swap(omb.kernel);
1109 std::vector<Eigen::MatrixXd>().swap(omb.coverage);
1110 std::vector<Eigen::MatrixXd>().swap(omb.pointing);
1113 omb.n_rows = map_extent[0];
1114 omb.n_cols = map_extent[1];
1115 omb.wcs.naxis[0] = omb.n_cols;
1116 omb.wcs.naxis[1] = omb.n_rows;
1117 omb.wcs.crpix[0] = (omb.n_cols - 1) / 2.0;
1118 omb.wcs.crpix[1] = (omb.n_rows - 1) / 2.0;
1120 omb.rows_tan_vec = map_coord[0];
1121 omb.cols_tan_vec = map_coord[1];
1123 Eigen::MatrixXd zero_matrix = Eigen::MatrixXd::Zero(omb.n_rows, omb.n_cols);
1125 for (Eigen::Index i=0; i<
engine().n_maps; ++i) {
1126 omb.signal.push_back(zero_matrix);
1127 omb.weight.push_back(zero_matrix);
1129 if (
engine().rtcproc.run_kernel) {
1130 omb.kernel.push_back(zero_matrix);
1133 if (
engine().map_grouping !=
"detector") {
1134 omb.coverage.push_back(zero_matrix);
1138 if (
engine().rtcproc.run_polarization) {
1140 for (Eigen::Index i=0; i<
engine().n_maps/
engine().rtcproc.polarization.stokes_params.size(); ++i) {
1141 omb.pointing.emplace_back(omb.n_rows*omb.n_cols, 9);
1142 engine().omb.pointing.back().setZero();
1150 auto& cmb =
engine().cmb;
1153 std::vector<Eigen::MatrixXd>().swap(cmb.signal);
1154 std::vector<Eigen::MatrixXd>().swap(cmb.weight);
1155 std::vector<Eigen::MatrixXd>().swap(cmb.kernel);
1156 std::vector<Eigen::MatrixXd>().swap(cmb.coverage);
1157 std::vector<Eigen::MatrixXd>().swap(cmb.pointing);
1159 Eigen::MatrixXd zero_matrix = Eigen::MatrixXd::Zero(cmb.n_rows, cmb.n_cols);
1162 for (Eigen::Index i=0; i<
engine().n_maps; ++i) {
1163 cmb.signal.push_back(zero_matrix);
1164 cmb.weight.push_back(zero_matrix);
1166 if (
engine().rtcproc.run_kernel) {
1168 cmb.kernel.push_back(zero_matrix);
1170 if (
engine().map_grouping!=
"detector") {
1172 cmb.coverage.push_back(zero_matrix);
1176 if (
engine().rtcproc.run_polarization) {
1178 for (Eigen::Index i=0; i<
engine().n_maps/
engine().rtcproc.polarization.stokes_params.size(); ++i) {
1179 cmb.pointing.emplace_back(cmb.n_rows*cmb.n_cols, 9);
1180 cmb.pointing.back().setZero();
1202 int delta_row = 0.5*(
engine().cmb.n_rows -
engine().omb.n_rows);
1203 int delta_col= 0.5*(
engine().cmb.n_cols -
engine().omb.n_cols);
1206 for (Eigen::Index i=0; i<
engine().n_maps; ++i) {
1208 auto cmb_weight_block =
engine().cmb.weight.at(i).block(delta_row, delta_col,
engine().omb.n_rows,
engine().omb.n_cols);
1209 auto cmb_signal_block =
engine().cmb.signal.at(i).block(delta_row, delta_col,
engine().omb.n_rows,
engine().omb.n_cols);
1212 cmb_weight_block +=
engine().omb.weight.at(i);
1215 cmb_signal_block += (
engine().omb.signal.at(i).array() *
engine().omb.weight.at(i).array()).matrix();
1218 if (
engine().rtcproc.run_kernel) {
1219 auto cmb_kernel_block =
engine().cmb.kernel.at(i).block(delta_row, delta_col,
engine().omb.n_rows,
engine().omb.n_cols);
1220 cmb_kernel_block += (
engine().omb.kernel.at(i).array() *
engine().omb.weight.at(i).array()).matrix();
1224 if (!
engine().cmb.coverage.empty()) {
1225 auto cmb_coverage_block =
engine().cmb.coverage.at(i).block(delta_row, delta_col,
engine().omb.n_rows,
engine().omb.n_cols);
1226 cmb_coverage_block +=
engine().omb.coverage.at(i);
1234 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>().swap(
engine().coadd_fits_io_vec);
1235 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>().swap(
engine().coadd_noise_fits_io_vec);
1236 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>().swap(
engine().filtered_coadd_fits_io_vec);
1237 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>().swap(
engine().filtered_coadd_noise_fits_io_vec);
1240 for (Eigen::Index i=0; i<
engine().calib.n_arrays; ++i) {
1242 auto array =
engine().calib.arrays[i];
1244 std::string array_name =
engine().toltec_io.array_name_map[array];
1249 engine().telescope.sim_obs);
1253 engine().coadd_fits_io_vec.push_back(std::move(fits_io));
1256 if (
engine().run_noise) {
1261 engine().telescope.sim_obs);
1265 engine().coadd_noise_fits_io_vec.push_back(std::move(fits_io));
1270 if (
engine().run_map_filter) {
1272 for (Eigen::Index i=0; i<
engine().calib.n_arrays; ++i) {
1274 auto array =
engine().calib.arrays[i];
1276 std::string array_name =
engine().toltec_io.array_name_map[array];
1280 "filtered/",
"", array_name,
1281 "",
engine().telescope.sim_obs);
1285 engine().filtered_coadd_fits_io_vec.push_back(std::move(fits_io));
1288 if (
engine().run_noise) {
1292 "filtered/",
"", array_name,
1293 "",
engine().telescope.sim_obs);
1297 engine().filtered_coadd_noise_fits_io_vec.push_back(std::move(fits_io));
1306 std::set<fs::path> sorted_by_name;
1307 for (
auto &entry : fs::directory_iterator(filepath))
1308 sorted_by_name.insert(entry);
1313 node[
"description"].push_back(
"citlali data products");
1317 node[
"citlali_version"].push_back(CITLALI_GIT_VERSION);
1319 node[
"kids_version"].push_back(KIDSCPP_GIT_VERSION);
1321 node[
"tula_version"].push_back(TULA_GIT_VERSION);
1324 for (
const auto & entry : sorted_by_name) {
1325 std::string path_string{entry.generic_string()};
1326 if (fs::is_directory(entry)) {
1327 make_index_file(path_string);
1329 node[
"files/dirs"].push_back(path_string.substr(path_string.find_last_of(
"/") + 1));
1332 std::ofstream fout(filepath +
"/index.yaml");
config::ConfigValidatorMixin< Derived, config::YamlConfig > ConfigMapper
Definition main_old.cpp:124