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) {
577 Eigen::Index hwpr_ts_n_pts =
engine().calib.hwpr_recvt.size();
578 if (
engine().calib.hwpr_recvt(0) > max_t0) {
579 max_t0 =
engine().calib.hwpr_recvt(0);
583 if (
engine().calib.hwpr_recvt(hwpr_ts_n_pts - 1) < min_tn) {
584 min_tn =
engine().calib.hwpr_recvt(hwpr_ts_n_pts - 1);
589 Eigen::Index min_size = nw_ts[0].size();
592 for (Eigen::Index i=0; i<nw_ts.size(); ++i) {
596 auto s = (abs(nw_ts[i].array() - max_t0)).minCoeff(&si);
600 while (nw_ts[i][si] < max_t0) {
604 engine().start_indices.push_back(si);
607 auto e = (abs(nw_ts[i].array() - min_tn)).minCoeff(&ei);
610 while (nw_ts[i][ei] > min_tn) {
614 engine().end_indices.push_back(ei);
618 for (Eigen::Index i=0; i<nw_ts.size(); ++i) {
620 auto si =
engine().start_indices[i];
622 auto ei =
engine().end_indices[i];
625 if ((ei - si + 1) < min_size) {
626 min_size = ei - si + 1;
631 if (
engine().calib.run_hwpr) {
634 auto s = (abs(
engine().calib.hwpr_recvt.array() - max_t0)).minCoeff(&si);
638 while (
engine().calib.hwpr_recvt(si) < max_t0) {
642 engine().hwpr_start_indices = si;
645 auto e = (abs(
engine().calib.hwpr_recvt.array() - min_tn)).minCoeff(&ei);
648 while (
engine().calib.hwpr_recvt(ei) > min_tn) {
652 engine().hwpr_end_indices = ei;
655 if ((ei - si + 1) < min_size) {
656 min_size = ei - si + 1;
661 Eigen::Matrix<Eigen::Index,1,1> nd;
662 nd <<
engine().telescope.tel_data[
"TelTime"].size();
665 Eigen::VectorXd xi = nw_ts[max_t0_i].head(min_size);
668 for (
const auto &tel_it :
engine().telescope.tel_data) {
669 if (tel_it.first !=
"TelTime") {
671 Eigen::VectorXd yd =
engine().telescope.tel_data[tel_it.first];
673 Eigen::VectorXd yi(min_size);
675 mlinterp::interp(nd.data(), min_size,
676 yd.data(), yi.data(),
677 engine().telescope.tel_data[
"TelTime"].data(), xi.data());
680 engine().telescope.tel_data[tel_it.first] = std::move(yi);
685 engine().telescope.tel_data[
"TelTime"] = xi;
686 engine().telescope.tel_data[
"TelUTC"] = xi;
689 if (
engine().calib.run_hwpr) {
690 Eigen::VectorXd yd =
engine().calib.hwpr_angle;
692 Eigen::VectorXd yi(min_size);
693 mlinterp::interp(nd.data(), min_size,
694 yd.data(), yi.data(),
695 engine().calib.hwpr_recvt.data(), xi.data());
698 engine().calib.hwpr_angle = std::move(yi);
705 using namespace netCDF;
706 using namespace netCDF::exceptions;
709 engine().start_indices.clear();
710 engine().end_indices.clear();
712 std::vector<Eigen::VectorXd> nw_times(rawobs.
kidsdata().size());
724 NcFile fo(data_item.
filepath(), NcFile::read);
725 auto vars = fo.getVars();
728 vars.find(
"Header.Toltec.SampleFreq")->second.getVar(&f_smp_roach);
732 vars.find(
"Header.Toltec.RoachIndex")->second.getVar(&roach_index);
735 Eigen::Index n_pts = vars.find(
"Data.Toltec.Ts")->second.getDim(0).getSize();
736 Eigen::Index n_times = vars.find(
"Data.Toltec.Ts")->second.getDim(1).getSize();
740 Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> ts(n_pts, n_times);
741 vars.find(
"Data.Toltec.Ts")->second.getVar(ts.data());
745 vars.find(
"Header.Toltec.FpgaFreq")->second.getVar(&fpga_freq);
748 Eigen::MatrixXd ts_double = ts.cast<
double>();
750 Eigen::MatrixXi ts_t = ts.transpose();
753 int gaps = ((ts.block(1,3,n_pts,1).array() - ts.block(0,3,n_pts-1,1).array()).array() > 1).count();
757 engine().gaps[
"Toltec" + std::to_string(roach_index)] = gaps;
760 auto sec = ts_double.col(0);
761 auto nsec = ts_double.col(5);
762 auto pps = ts_double.col(1);
763 auto msec = ts_double.col(2) / fpga_freq;
765 auto pps_msec = ts_double.col(4) / fpga_freq;
768 double start_time_dbl = sec[0] + nsec[0] * 1e-9;
769 int start_time = int(start_time_dbl - 0.5);
770 start_time_dbl = start_time;
773 Eigen::VectorXd dt = msec - pps_msec;
776 dt = (dt.array() < 0).select(msec.array() - pps_msec.array() + (pow(2.0, 32) - 1) / fpga_freq, msec - pps_msec);
779 Eigen::VectorXd nw_time = start_time_dbl + pps.array() + dt.array()
780 +
engine().interface_sync_offset[
"toltec"+std::to_string(roach_index)];
783 nw_times[i] = std::move(nw_time);
788 }
catch (NcException &e) {
789 throw std::runtime_error(fmt::format(
"unable to open file : {}",
"data_item.filepath()", e.what()));
794 if (
engine().calib.run_hwpr) {
795 logger->debug(
"calculating hwpr time");
797 nw_times.push_back(
engine().calib.hwpr_recvt);
801 double max_init_time = std::numeric_limits<double>::lowest();
803 double min_final_time = std::numeric_limits<double>::max();
806 Eigen::Index max_init_idx = 0;
807 Eigen::Index min_final_idx = 0;
810 for (Eigen::Index i = 0; i < nw_times.size(); ++i) {
811 double initial_time = nw_times[i](0);
812 double final_time = nw_times[i](nw_times[i].size() - 1);
815 if (initial_time > max_init_time) {
816 max_init_time = initial_time;
820 if (final_time < min_final_time) {
821 min_final_time = final_time;
826 double dt = 1.0 / f_smp_roach;
827 Eigen::Index n_samples =
static_cast<int>((min_final_time - max_init_time) / dt) + 1;
828 Eigen::VectorXd t_common = Eigen::VectorXd::LinSpaced(n_samples, max_init_time, max_init_time + dt * (n_samples - 1));
829 double tol = dt / 2.0;
831 std::vector<Eigen::VectorXi> masks;
832 masks.reserve(nw_times.size());
834 for (
const auto &t : nw_times) {
835 Eigen::VectorXi mask = Eigen::VectorXi::Zero(n_samples);
837 for (
int i = 0; i < t.size(); ++i) {
839 int idx =
static_cast<int>(std::round((time - max_init_time) / dt));
840 if (idx >= 0 && idx < n_samples && std::abs(time - t_common(idx)) <= tol) {
845 logger->warn(
"{}/{} samples were not aligned to the common time grid", mask.size() - mask.sum(), mask.size());
847 masks.push_back(std::move(mask));
851 Eigen::Matrix<Eigen::Index,1,1> nd;
852 nd <<
engine().telescope.tel_data[
"TelTime"].size();
855 for (
const auto &tel_it :
engine().telescope.tel_data) {
857 if (tel_it.first !=
"TelTime" && tel_it.first !=
"TelUTC") {
859 Eigen::VectorXd yd =
engine().telescope.tel_data.at(tel_it.first);
861 Eigen::VectorXd yi(n_samples);
863 mlinterp::interp(nd.data(), n_samples,
864 yd.data(), yi.data(),
865 engine().telescope.tel_data.at(
"TelTime").data(), t_common.data());
868 engine().telescope.tel_data[tel_it.first] = std::move(yi);
873 engine().telescope.tel_data.at(
"TelTime") = t_common;
874 engine().telescope.tel_data.at(
"TelUTC") = t_common;
877 if (
engine().calib.run_hwpr) {
878 logger->debug(
"interpolating hwpr angle");
879 int n_times = nw_times.size();
880 nd << nw_times[n_times - 1].size();
883 Eigen::VectorXd yi(n_samples);
885 mlinterp::interp(nd.data(), n_samples,
886 engine().calib.hwpr_angle.data(), yi.data(),
887 nw_times[n_times - 1].data(), t_common.data());
889 engine().calib.hwpr_angle = std::move(yi);
892 engine().t_common = t_common;
894 engine().nw_times = nw_times;
900 Eigen::Index n_offsets =
engine().pointing_offsets_arcsec[
"az"].size();
903 std::vector<std::string> altaz_keys = {
"alt",
"az"};
905 for (
const auto &key: altaz_keys) {
908 double offset =
engine().pointing_offsets_arcsec[key](0);
909 engine().pointing_offsets_arcsec[key].resize(
engine().telescope.tel_data[
"TelTime"].size());
910 engine().pointing_offsets_arcsec[key].setConstant(offset);
912 else if (n_offsets==2) {
914 Eigen::Index ni =
engine().telescope.tel_data[
"TelTime"].size();
917 Eigen::Matrix<Eigen::Index,1,1> nd;
921 Eigen::VectorXd yi(ni);
924 Eigen::VectorXd xd(n_offsets);
926 if ((
engine().pointing_offsets_modified_julian_date<=0).any()) {
927 xd <<
engine().telescope.tel_data[
"TelTime"](0),
engine().telescope.tel_data[
"TelTime"](ni-1);
935 if (xd(0) >
engine().telescope.tel_data[
"TelTime"](0) || xd(1) <
engine().telescope.tel_data[
"TelTime"](ni-1)) {
936 logger->error(
"MJD range is invalid");
937 std::exit(EXIT_FAILURE);
942 mlinterp::interp(nd.data(), ni,
943 engine().pointing_offsets_arcsec[key].data(), yi.data(),
944 xd.data(),
engine().telescope.tel_data[
"TelTime"].data());
947 engine().pointing_offsets_arcsec[key] = yi;
950 logger->error(
"only one or two values for altaz offsets are supported");
951 std::exit(EXIT_FAILURE);
960 if (
engine().map_grouping==
"auto") {
962 if ((
engine().redu_type ==
"science") || (
engine().redu_type ==
"pointing")) {
963 engine().map_grouping =
"array";
967 else if ((
engine().redu_type ==
"beammap")) {
968 engine().map_grouping =
"detector";
973 if (
engine().map_grouping ==
"detector") {
978 else if (
engine().map_grouping ==
"nw") {
983 else if (
engine().map_grouping ==
"array") {
988 else if (
engine().map_grouping ==
"fg") {
993 if (
engine().rtcproc.run_polarization) {
1014 Eigen::VectorXI array_indices;
1017 if (
engine().map_grouping ==
"detector") {
1020 array_indices =
engine().calib.apt[
"array"].template cast<Eigen::Index> ();
1024 else if (
engine().map_grouping ==
"array") {
1026 array_indices =
engine().calib.arrays;
1030 else if (
engine().map_grouping ==
"nw") {
1034 array_indices.resize(
engine().calib.nws.size());
1037 for (Eigen::Index i=0; i<
engine().calib.nws.size(); ++i) {
1039 array_indices(i) =
engine().toltec_io.nw_to_array_map[
engine().calib.nws(i)];
1044 else if (
engine().map_grouping ==
"fg") {
1049 array_indices.resize(
engine().calib.fg.size()*
engine().calib.n_arrays);
1054 for (Eigen::Index i=0; i<
engine().calib.n_arrays; ++i) {
1056 array_indices.segment(j,
engine().calib.fg.size()).setConstant(
engine().calib.arrays(i));
1058 j = j +
engine().calib.fg.size();
1065 for (
const auto &[stokes_index,stokes_param]:
engine().rtcproc.polarization.stokes_params) {
1067 engine().maps_to_arrays.segment(j,array_indices.size()) = array_indices;
1069 engine().maps_to_stokes.segment(j,array_indices.size()).setConstant(stokes_index);
1071 j = j + array_indices.size();
1075 Eigen::Index index = 0;
1077 engine().arrays_to_maps(0) = index;
1078 for (Eigen::Index i=1; i<
engine().n_maps; ++i) {
1080 if (
engine().maps_to_arrays(i) >
engine().maps_to_arrays(i-1)) {
1084 else if (
engine().maps_to_arrays(i) <
engine().maps_to_arrays(i-1)) {
1087 engine().arrays_to_maps(i) = index;
1096 auto& omb =
engine().omb;
1099 if ((
engine().omb.wcs.naxis[0] <= 0) || (
engine().omb.wcs.naxis[1] <= 0)) {
1101 Eigen::MatrixXd det_lat_limits(
engine().calib.n_dets, 2);
1102 Eigen::MatrixXd det_lon_limits(
engine().calib.n_dets, 2);
1103 det_lat_limits.setZero();
1104 det_lon_limits.setZero();
1107 std::vector<int> det_in_vec, det_out_vec;
1110 det_in_vec.resize(
engine().calib.n_dets);
1111 std::iota(det_in_vec.begin(), det_in_vec.end(), 0);
1112 det_out_vec.resize(
engine().calib.n_dets);
1115 std::map<std::string, Eigen::VectorXd> tel_data;
1118 std::map<std::string, Eigen::VectorXd> pointing_offsets_arcsec;
1121 for (Eigen::Index i=0; i<
engine().telescope.scan_indices.cols(); ++i) {
1123 auto si =
engine().telescope.scan_indices(0,i);
1125 auto sl =
engine().telescope.scan_indices(1,i) -
engine().telescope.scan_indices(0,i) + 1;
1127 for (
auto const& x:
engine().telescope.tel_data) {
1128 tel_data[x.first] =
engine().telescope.tel_data[x.first].segment(si,sl);
1132 pointing_offsets_arcsec[
"az"] =
engine().pointing_offsets_arcsec[
"az"].segment(si,sl);
1133 pointing_offsets_arcsec[
"alt"] =
engine().pointing_offsets_arcsec[
"alt"].segment(si,sl);
1136 if (
engine().map_grouping!=
"detector") {
1138 grppi::map(tula::grppi_utils::dyn_ex(
engine().parallel_policy), det_in_vec, det_out_vec, [&](
auto j) {
1142 engine().telescope.pixel_axes, pointing_offsets_arcsec,
engine().map_grouping);
1144 if (
engine().calib.apt[
"flag"](j)==0) {
1145 if (lat.minCoeff() < det_lat_limits(j,0)) {
1146 det_lat_limits(j,0) = lat.minCoeff();
1148 if (lat.maxCoeff() > det_lat_limits(j,1)) {
1149 det_lat_limits(j,1) = lat.maxCoeff();
1151 if (lon.minCoeff() < det_lon_limits(j,0)) {
1152 det_lon_limits(j,0) = lon.minCoeff();
1154 if (lon.maxCoeff() > det_lon_limits(j,1)) {
1155 det_lon_limits(j,1) = lon.maxCoeff();
1164 pointing_offsets_arcsec,
engine().map_grouping);
1165 if (lat.minCoeff() < det_lat_limits(0,0)) {
1166 det_lat_limits.col(0).setConstant(lat.minCoeff());
1168 if (lat.maxCoeff() > det_lat_limits(0,1)) {
1169 det_lat_limits.col(1).setConstant(lat.maxCoeff());
1171 if (lon.minCoeff() < det_lon_limits(0,0)) {
1172 det_lon_limits.col(0).setConstant(lon.minCoeff());
1174 if (lon.maxCoeff() > det_lon_limits(0,1)) {
1175 det_lon_limits.col(1).setConstant(lon.maxCoeff());
1181 double min_lat = det_lat_limits.col(0).minCoeff();
1182 double max_lat = det_lat_limits.col(1).maxCoeff();
1183 double min_lon = det_lon_limits.col(0).minCoeff();
1184 double max_lon = det_lon_limits.col(1).maxCoeff();
1187 auto calc_map_dims = [&](
double min_dim,
double max_dim) {
1188 int min_pix =
static_cast<int>(ceil(abs(min_dim / omb.pixel_size_rad)));
1189 int max_pix =
static_cast<int>(ceil(abs(max_dim / omb.pixel_size_rad)));
1190 return 2 * std::max(min_pix, max_pix) + 1;
1194 omb.n_rows = calc_map_dims(min_lat, max_lat);
1195 omb.n_cols = calc_map_dims(min_lon, max_lon);
1200 omb.n_rows = (omb.wcs.naxis[1] % 2 == 0) ? omb.wcs.naxis[1] + 1 : omb.wcs.naxis[1];
1201 omb.n_cols = (omb.wcs.naxis[0] % 2 == 0) ? omb.wcs.naxis[0] + 1 : omb.wcs.naxis[0];
1204 Eigen::VectorXd rows_tan_vec = Eigen::VectorXd::LinSpaced(omb.n_rows, 0, omb.n_rows - 1).array() * omb.pixel_size_rad -
1205 (omb.n_rows / 2.0) * omb.pixel_size_rad;
1206 Eigen::VectorXd cols_tan_vec = Eigen::VectorXd::LinSpaced(omb.n_cols, 0, omb.n_cols - 1).array() * omb.pixel_size_rad -
1207 (omb.n_cols / 2.0) * omb.pixel_size_rad;
1211 map_extents.push_back({
static_cast<int>(omb.n_rows),
static_cast<int>(omb.n_cols)});
1212 map_coords.push_back({std::move(rows_tan_vec), std::move(cols_tan_vec)});
1218 auto& cmb =
engine().cmb;
1221 double min_row = std::numeric_limits<double>::max();
1222 double max_row = std::numeric_limits<double>::lowest();
1223 double min_col = min_row;
1224 double max_col = max_row;
1227 for (
const auto& coord : map_coords) {
1228 min_row = std::min(min_row, coord.front().minCoeff());
1229 max_row = std::max(max_row, coord.front().maxCoeff());
1230 min_col = std::min(min_col, coord.back().minCoeff());
1231 max_col = std::max(max_col, coord.back().maxCoeff());
1235 auto calc_map_dims = [&](
auto min_dim,
auto max_dim) {
1236 int min_pix =
static_cast<int>(ceil(abs(min_dim /
engine().cmb.pixel_size_rad)));
1237 int max_pix =
static_cast<int>(ceil(abs(max_dim /
engine().cmb.pixel_size_rad)));
1239 int n_dim = 2 * std::max(min_pix, max_pix) + 1;
1240 Eigen::VectorXd dim_vec = Eigen::VectorXd::LinSpaced(n_dim, 0, n_dim - 1)
1241 .array() *
engine().cmb.pixel_size_rad - (n_dim / 2.0) *
engine().cmb.pixel_size_rad;
1243 return std::make_tuple(n_dim, std::move(dim_vec));
1247 auto [n_rows, rows_tan_vec] = calc_map_dims(min_row, max_row);
1248 auto [n_cols, cols_tan_vec] = calc_map_dims(min_col, max_col);
1251 cmb.n_rows = n_rows;
1252 cmb.n_cols = n_cols;
1253 cmb.wcs.naxis[0] = n_cols;
1254 cmb.wcs.naxis[1] = n_rows;
1255 cmb.wcs.crpix[0] = (n_cols - 1) / 2.0;
1256 cmb.wcs.crpix[1] = (n_rows - 1) / 2.0;
1258 cmb.rows_tan_vec = std::move(rows_tan_vec);
1259 cmb.cols_tan_vec = std::move(cols_tan_vec);
1265 auto& omb =
engine().omb;
1267 std::vector<Eigen::MatrixXd>().swap(omb.signal);
1268 std::vector<Eigen::MatrixXd>().swap(omb.weight);
1269 std::vector<Eigen::MatrixXd>().swap(omb.kernel);
1270 std::vector<Eigen::MatrixXd>().swap(omb.coverage);
1271 std::vector<Eigen::MatrixXd>().swap(omb.pointing);
1274 omb.n_rows = map_extent[0];
1275 omb.n_cols = map_extent[1];
1276 omb.wcs.naxis[0] = omb.n_cols;
1277 omb.wcs.naxis[1] = omb.n_rows;
1278 omb.wcs.crpix[0] = (omb.n_cols - 1) / 2.0;
1279 omb.wcs.crpix[1] = (omb.n_rows - 1) / 2.0;
1281 omb.rows_tan_vec = map_coord[0];
1282 omb.cols_tan_vec = map_coord[1];
1284 Eigen::MatrixXd zero_matrix = Eigen::MatrixXd::Zero(omb.n_rows, omb.n_cols);
1286 for (Eigen::Index i=0; i<
engine().n_maps; ++i) {
1287 omb.signal.push_back(zero_matrix);
1288 omb.weight.push_back(zero_matrix);
1290 if (
engine().rtcproc.run_kernel) {
1291 omb.kernel.push_back(zero_matrix);
1294 if (
engine().map_grouping !=
"detector") {
1295 omb.coverage.push_back(zero_matrix);
1299 if (
engine().rtcproc.run_polarization) {
1301 for (Eigen::Index i=0; i<
engine().n_maps/
engine().rtcproc.polarization.stokes_params.size(); ++i) {
1302 omb.pointing.emplace_back(omb.n_rows*omb.n_cols, 9);
1303 engine().omb.pointing.back().setZero();
1311 auto& cmb =
engine().cmb;
1314 std::vector<Eigen::MatrixXd>().swap(cmb.signal);
1315 std::vector<Eigen::MatrixXd>().swap(cmb.weight);
1316 std::vector<Eigen::MatrixXd>().swap(cmb.kernel);
1317 std::vector<Eigen::MatrixXd>().swap(cmb.coverage);
1318 std::vector<Eigen::MatrixXd>().swap(cmb.pointing);
1320 Eigen::MatrixXd zero_matrix = Eigen::MatrixXd::Zero(cmb.n_rows, cmb.n_cols);
1323 for (Eigen::Index i=0; i<
engine().n_maps; ++i) {
1324 cmb.signal.push_back(zero_matrix);
1325 cmb.weight.push_back(zero_matrix);
1327 if (
engine().rtcproc.run_kernel) {
1329 cmb.kernel.push_back(zero_matrix);
1331 if (
engine().map_grouping!=
"detector") {
1333 cmb.coverage.push_back(zero_matrix);
1337 if (
engine().rtcproc.run_polarization) {
1339 for (Eigen::Index i=0; i<
engine().n_maps/
engine().rtcproc.polarization.stokes_params.size(); ++i) {
1340 cmb.pointing.emplace_back(cmb.n_rows*cmb.n_cols, 9);
1341 cmb.pointing.back().setZero();
1395 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>().swap(
engine().coadd_fits_io_vec);
1396 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>().swap(
engine().coadd_noise_fits_io_vec);
1397 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>().swap(
engine().filtered_coadd_fits_io_vec);
1398 std::vector<fitsIO<file_type_enum::write_fits, CCfits::ExtHDU*>>().swap(
engine().filtered_coadd_noise_fits_io_vec);
1401 for (Eigen::Index i=0; i<
engine().calib.n_arrays; ++i) {
1403 auto array =
engine().calib.arrays[i];
1405 std::string array_name =
engine().toltec_io.array_name_map[array];
1410 engine().telescope.sim_obs);
1414 engine().coadd_fits_io_vec.push_back(std::move(fits_io));
1417 if (
engine().run_noise) {
1422 engine().telescope.sim_obs);
1426 engine().coadd_noise_fits_io_vec.push_back(std::move(fits_io));
1431 if (
engine().run_map_filter) {
1433 for (Eigen::Index i=0; i<
engine().calib.n_arrays; ++i) {
1435 auto array =
engine().calib.arrays[i];
1437 std::string array_name =
engine().toltec_io.array_name_map[array];
1441 "filtered/",
"", array_name,
1442 "",
engine().telescope.sim_obs);
1446 engine().filtered_coadd_fits_io_vec.push_back(std::move(fits_io));
1449 if (
engine().run_noise) {
1453 "filtered/",
"", array_name,
1454 "",
engine().telescope.sim_obs);
1458 engine().filtered_coadd_noise_fits_io_vec.push_back(std::move(fits_io));
config::ConfigValidatorMixin< Derived, config::YamlConfig > ConfigMapper
Definition main_old.cpp:124