6#include <unsupported/Eigen/CXX11/Tensor>
8#include <CCfits/CCfits>
11#include <tula/nddata/labelmapper.h>
12#include <tula/formatter/enum.h>
13#include <tula/formatter/matrix.h>
14#include <tula/formatter/utils.h>
15#include <tula/logging.h>
16#include <kids/core/wcs.h>
43namespace wcs = kids::wcs;
54template <TCDataKind kind_ = TCDataKind::Any,
typename =
void>
63template <timestream::TCDataKind kind>
65 : variant_size<typename timestream::TCData<kind>::variant_t> {};
67template <
size_t _Np, auto kind>
69 : variant_alternative<_Np, typename timestream::TCData<kind>::variant_t> {};
71#if defined(__GNUC__) && !defined(__clang__)
72#if (__GNUC__ >= 9 && __GNUC__ < 13)
77template <
typename _Ret,
typename _Visitor, auto kind,
size_t __first>
81 static constexpr int __do_cookie = 0;
83template <
typename _Maybe_variant_cookie, auto kind>
84struct _Extra_visit_slot_needed<_Maybe_variant_cookie,
timestream::TCData<kind>>
85 : _Extra_visit_slot_needed<_Maybe_variant_cookie,
86 typename timestream::TCData<kind>::variant_t> {};
88template <
typename _Maybe_variant_cookie, auto kind>
89struct _Extra_visit_slot_needed<_Maybe_variant_cookie,
timestream::TCData<kind> &>
90 : _Extra_visit_slot_needed<_Maybe_variant_cookie,
91 typename timestream::TCData<kind>::variant_t &> {};
104template <
typename Derived>
107template <TCDataKind kind_>
109 static constexpr auto kind() {
return kind_; }
130 wcs::LabeledData<DetectorAxis> {
132 DetectorAxis(Eigen::MatrixXd data_, tula::nddata::LabelMapper<DetectorAxis> row_labels_)
134 std::string_view
name{
"detector"};
139struct TimeAxis : wcs::Axis<TimeAxis, wcs::CoordsKind::Row>,
140 wcs::LabeledData<TimeAxis> {
142 TimeAxis(Eigen::MatrixXd data_, tula::nddata::LabelMapper<TimeAxis> col_labels_)
161template <
typename Derived>
163 tula::nddata::NDData<TimeStream<Derived>> {
166 template <
typename PlainObject>
167 struct dataref_t : tula::nddata::NDData<dataref_t<PlainObject>> {
168 PlainObject
data{
nullptr, 0, 0};
171 template <
typename PlainObject>
172 struct data_t : tula::nddata::NDData<data_t<PlainObject>> {
213template <
typename RefType>
217 using data_t = std::conditional_t<tula::eigen_utils::is_plain_v<RefType>,Base::data_t<RefType>,
218 Base::dataref_t<RefType>>;
220 std::string_view name{
"RTC"};
225template <
typename RefType>
229 using data_t = std::conditional_t<tula::eigen_utils::is_plain_v<RefType>,Base::data_t<RefType>,
230 Base::dataref_t<RefType>>;
232 std::string_view name{
"PTC"};
238 Base::data_t<std::vector<std::vector<Eigen::VectorXd>>>
evals;
240 Base::data_t<std::vector<std::vector<Eigen::MatrixXd>>>
evecs;
246template <TCDataKind kind_>
247struct TCData<kind_,
std::enable_if_t<tula::enum_utils::is_compound_v<kind_>>>
248 : tula::enum_utils::enum_to_variant_t<kind_, TCData> {
249 using Base = tula::enum_utils::enum_to_variant_t<kind_, TCData>;
250 using variant_t = tula::enum_utils::enum_to_variant_t<kind_, TCData>;
253 static constexpr auto kind() {
return kind_; }
260 std::shared_ptr<spdlog::logger>
logger = spdlog::get(
"citlali_logger");
308 template <
class calib_t>
309 void load_mb(std::string, std::string, calib_t &);
312 template <
class calib_t>
316 template <TCDataKind tcdata_t,
class calib_t>
320 template <TCProc::SourceType source_type,
class mb_t, TCDataKind tcdata_t,
class calib_t,
typename Derived>
324 template <TCDataKind tcdata_t,
class calib_t>
328 template <TCDataKind tcdata_t,
class calib_t,
typename Derived>
332 template <SourceType source_type, TCDataKind tcdata_t,
typename Derived,
typename apt_t>
334 std::string &, apt_t &,
double, Eigen::Index, Eigen::Index);
337 template <TCDataKind tcdata_t,
class calib_t>
341 template <TCDataKind tcdata_t,
class calib_t,
typename po
inting_offset_t>
343 std::string &, pointing_offset_t &, calib_t &);
346template <
class calib_t>
347void TCProc::load_mb(std::string filepath, std::string noise_filepath, calib_t &calib) {
349 namespace fs = std::filesystem;
355 std::vector<Eigen::Tensor<double,3>>().swap(
tod_mb.
noise);
369 std::vector<double> median_rms_vec;
372 for (
const auto &arr: calib.arrays) {
375 for (
const auto& entry : fs::directory_iterator(filepath)) {
377 bool fits_file = entry.path().string().find(
".fits") != std::string::npos;
382 std::string filename;
383 size_t last_slash_pos = entry.path().string().find_last_of(
"/");
384 if (last_slash_pos != std::string::npos) {
385 filename = entry.path().string().substr(last_slash_pos + 1);
389 if (filename.find(
"noise") == std::string::npos) {
394 int num_extensions = 0;
395 bool keep_going =
true;
399 CCfits::ExtHDU& ext = fits_io.
pfits->extension(num_extensions + 1);
401 }
catch (CCfits::FITS::NoSuchHDU) {
407 if (num_extensions == 0) {
408 logger->error(
"{} is empty",filename);
409 std::exit(EXIT_FAILURE);
413 CCfits::ExtHDU& extension = fits_io.
pfits->extension(1);
432 for (
int i=0; i<num_extensions; ++i) {
433 CCfits::ExtHDU& ext = fits_io.
pfits->extension(i+1);
435 ext.readKey(
"EXTNAME", extName);
437 if (extName.find(
"signal") != std::string::npos) {
439 logger->info(
"found {} [{}]", filename, extName);
442 else if (extName.find(
"weight") != std::string::npos) {
444 logger->info(
"found {} [{}]", filename, extName);
447 else if (extName.find(
"kernel") != std::string::npos) {
449 logger->info(
"found {} [{}]", filename, extName);
458 for (
const auto& entry : fs::directory_iterator(noise_filepath)) {
460 bool fits_file = entry.path().string().find(
".fits") != std::string::npos;
465 std::string filename;
466 size_t lastSlashPos = entry.path().string().find_last_of(
"/");
467 if (lastSlashPos != std::string::npos) {
468 filename = entry.path().string().substr(lastSlashPos + 1);
472 if (filename.find(
"_noise_citlali.fits") != std::string::npos) {
477 int num_extensions = 0;
478 bool keep_going =
true;
482 CCfits::ExtHDU& ext = fits_io.
pfits->extension(num_extensions + 1);
484 ext.readKey(
"EXTNAME", extName);
487 if (extName.find(
"_I") != std::string::npos) {
492 }
catch (CCfits::FITS::NoSuchHDU) {
498 if (num_extensions == 0) {
499 logger->error(
"{} is empty",filename);
500 std::exit(EXIT_FAILURE);
504 for (
int i=0; i<num_extensions; ++i) {
506 CCfits::ExtHDU& ext = fits_io.
pfits->extension(i+1);
509 ext.readKey(
"EXTNAME", extName);
511 if (extName.find(
"signal") != std::string::npos && extName.find(
"_0_I") != std::string::npos) {
514 ext.readKey(
"MEDRMS", median_rms);
515 median_rms_vec.push_back(median_rms);
516 logger->info(
"found {} [{}]", filename, extName);
523 }
catch (
const fs::filesystem_error& err) {
524 logger->error(
"{}", err.what());
525 std::exit(EXIT_FAILURE);
531 logger->error(
"no signal maps found in {}", filepath);
532 std::exit(EXIT_FAILURE);
535 if (!median_rms_vec.empty()) {
537 tod_mb.
median_rms = Eigen::Map<Eigen::VectorXd>(median_rms_vec.data(),median_rms_vec.size());
552 Eigen::MatrixXd ones, zeros;
561 auto cov_bool = (
tod_mb.
weight[i].array() < weight_threshold).select(zeros,ones);
571template <
class calib_t>
573 std::map<Eigen::Index, std::tuple<Eigen::Index, Eigen::Index>> grp_limits;
576 Eigen::Index grp_i = calib.apt[grp](0);
578 grp_limits[grp_i] = std::tuple<Eigen::Index, Eigen::Index>{0, 0};
581 for (Eigen::Index i=0; i<n_dets; ++i) {
584 if (calib.apt[grp](det_index) == grp_i) {
585 std::get<1>(grp_limits[grp_i]) = i + 1;
589 grp_i = calib.apt[grp](det_index);
591 grp_limits[grp_i] = std::tuple<Eigen::Index, Eigen::Index>{i,0};
598template <TCDataKind tcdata_t,
class calib_t>
602 Eigen::Index n_dets = in.scans.data.cols();
603 Eigen::Index n_pts = in.scans.data.rows();
605 in.pointing.data[
"lat"].resize(n_pts,n_dets);
606 in.pointing.data[
"lon"].resize(n_pts,n_dets);
608 for (Eigen::Index i=0; i<n_dets; ++i) {
611 double az_off = calib.apt[
"x_t"](det_index);
612 double el_off = calib.apt[
"y_t"](det_index);
616 in.pointing_offsets_arcsec.data, map_grouping);
618 in.pointing.data[
"lat"].col(i) = std::move(lat);
619 in.pointing.data[
"lon"].col(i) = std::move(lon);
623template <TCProc::SourceType source_type,
class mb_t, TCDataKind tcdata_t,
class calib_t,
typename Derived>
625 Eigen::DenseBase<Derived> &map_indices, std::string pixel_axes,
626 std::string map_grouping) {
629 Eigen::Index n_dets = in.scans.data.cols();
630 Eigen::Index n_pts = in.scans.data.rows();
639 bool run_kernel = in.kernel.data.size() !=0;
641 bool run_noise = mb.median_rms.size() != 0;
644 for (Eigen::Index i=0; i<n_dets; ++i) {
646 auto map_index = map_indices(i);
647 int array_index = calib.apt[
"array"](i);
650 if (calib.apt[
"flag"](i) == 0 && (in.flags.data.col(i).array() == 0).any()) {
651 double az_off = calib.apt[
"x_t"](i);
652 double el_off = calib.apt[
"y_t"](i);
656 in.pointing_offsets_arcsec.data, map_grouping);
659 Eigen::VectorXd irows = lat.array()/mb.pixel_size_rad + (mb.n_rows)/2.;
660 Eigen::VectorXd icols = lon.array()/mb.pixel_size_rad + (mb.n_cols)/2.;
663 for (Eigen::Index j=0; j<n_pts; ++j) {
665 Eigen::Index ir = irows(j);
666 Eigen::Index ic = icols(j);
669 if ((ir >= 0) && (ir < mb.n_rows) && (ic >= 0) && (ic < mb.n_cols)) {
670 double signal = mb.signal[map_index](ir,ic);
672 bool run_pix_s2n =
false;
673 bool run_pix_flux =
false;
688 if (run_pix_s2n || run_pix_flux) {
690 in.scans.data(j,i) += factor * signal;
693 in.kernel.data(j,i) += factor * mb.kernel[map_index](ir,ic);
702template <TCDataKind tcdata_t,
class calib_t>
706 calib_t calib_scan = calib;
710 logger->info(
"removing outlier dets");
712 Eigen::Index n_dets = in.scans.data.cols();
721 for (
auto const& [key, val] : grp_limits) {
723 bool keep_going =
true;
724 Eigen::Index n_iter = 0;
728 Eigen::Index n_good_dets = 0;
731 for (Eigen::Index j=std::get<0>(grp_limits[key]); j<std::get<1>(grp_limits[key]); ++j) {
732 if (calib.apt[
"flag"](j)==0 && (in.flags.data.col(j).array()==0).any()) {
737 Eigen::VectorXd det_std_dev(n_good_dets);
738 Eigen::VectorXI dets(n_good_dets);
742 for (Eigen::Index j=std::get<0>(grp_limits[key]); j<std::get<1>(grp_limits[key]); ++j) {
743 Eigen::Index det_index = j;
744 if (calib.apt[
"flag"](det_index)==0 && (in.flags.data.col(j).array()==0).any()) {
746 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, 1>> scans(
747 in.scans.data.col(j).data(), in.scans.data.rows());
748 Eigen::Map<Eigen::Matrix<bool, Eigen::Dynamic, 1>> flags(
749 in.flags.data.col(j).data(), in.flags.data.rows());
755 if (det_std_dev(k) !=0) {
756 det_std_dev(k) = std::pow(det_std_dev(k),-2);
768 double median_std_dev = tula::alg::median(det_std_dev);
774 for (Eigen::Index j=0; j<n_good_dets; ++j) {
775 Eigen::Index det_index = dets(j);
777 if (calib.apt[
"flag"](det_index)==0) {
780 if (map_grouping!=
"detector") {
781 in.flags.data.col(dets(j)).setOnes();
784 calib_scan.apt[
"flag"](det_index) = 1;
792 if (map_grouping!=
"detector") {
793 in.flags.data.col(dets(j)).setOnes();
796 calib_scan.apt[
"flag"](det_index) = 1;
804 logger->info(
"array {} iter {}: {}/{} dets below inv var limit. {}/{} dets above inv var limit.", key, n_iter,
805 n_dets_low, n_good_dets, n_dets_high, n_good_dets);
810 if ((n_dets_low==0 && n_dets_high==0) || n_iter >
iter_lim) {
819 return std::move(calib_scan);
822template <TCDataKind tcdata_t,
class calib_t,
typename Derived>
837template <TCProc::SourceType source_type, TCDataKind tcdata_t,
typename Derived,
typename apt_t>
839 std::string &map_grouping, apt_t &apt,
double pixel_size_rad, Eigen::Index n_rows, Eigen::Index n_cols) {
841 Eigen::Index n_dets = in.scans.data.cols();
842 Eigen::Index n_pts = in.scans.data.rows();
845 for (Eigen::Index i=0; i<n_dets; ++i) {
849 auto map_index = in.map_indices.data(i);
851 double az_off = apt[
"x_t"](det_index);
852 double el_off = apt[
"y_t"](det_index);
856 in.pointing_offsets_arcsec.data, map_grouping);
859 double amp = params(map_index,0);
861 double off_lat = params(map_index,2);
863 double off_lon = params(map_index,1);
865 double sigma_lat = params(map_index,4);
867 double sigma_lon = params(map_index,3);
869 double rot_ang = params(map_index,5);
872 double sigma = std::max(sigma_lat, sigma_lon);
880 off_lat = pixel_size_rad*(off_lat - (n_rows)/2);
881 off_lon = pixel_size_rad*(off_lon - (n_cols)/2);
884 sigma_lon = pixel_size_rad*sigma;
885 sigma_lat = pixel_size_rad*sigma;
886 sigma = pixel_size_rad*sigma;
889 auto cost2 = cos(rot_ang) * cos(rot_ang);
890 auto sint2 = sin(rot_ang) * sin(rot_ang);
891 auto sin2t = sin(2. * rot_ang);
892 auto xstd2 = sigma * sigma;
893 auto ystd2 = sigma * sigma;
894 auto a = - 0.5 * ((cost2 / xstd2) + (sint2 / ystd2));
895 auto b = - 0.5 * ((sin2t / xstd2) - (sin2t / ystd2));
896 auto c = - 0.5 * ((sint2 / xstd2) + (cost2 / ystd2));
901 Eigen::VectorXd gauss(n_pts);
903 for (Eigen::Index j=0; j<n_pts; ++j) {
904 gauss(j) = amp*exp(pow(lon(j) - off_lon, 2) * a +
905 (lon(j) - off_lon) * (lat(j) - off_lat) * b +
906 pow(lat(j) - off_lat, 2) * c);
910 if (!gauss.array().isNaN().any()) {
912 in.scans.data.col(i) = in.scans.data.col(i).array() + gauss.array();
917template <TCDataKind tcdata_t,
class calib_t>
919 int n_pts,
int n_dets,
int start_index) {
922 std::map<std::string, Eigen::VectorXd> tel_data_copy;
925 for (
const auto &[key,val]: in.tel_data.data) {
926 tel_data_copy[key] = in.tel_data.data[key].segment(0,n_pts);
930 std::map<std::string, Eigen::VectorXd> pointing_offset_copy;
933 for (
const auto &[key,val]: in.pointing_offsets_arcsec.data) {
934 pointing_offset_copy[key] = in.pointing_offsets_arcsec.data[key].segment(0,n_pts);
938 Eigen::Matrix<bool, Eigen::Dynamic, Eigen::Dynamic> masked_flags = in.flags.data.block(0, start_index, n_pts, n_dets);
941 for (Eigen::Index i=0; i<n_dets; ++i) {
943 auto det_index = i + start_index;
945 double az_off = calib.apt[
"x_t"](det_index);
946 double el_off = calib.apt[
"y_t"](det_index);
950 pointing_offset_copy, map_grouping);
953 auto dist = (lat.array().pow(2) + lon.array().pow(2)).sqrt();
956 for (Eigen::Index j=0; j<n_pts; ++j) {
959 masked_flags(j,i) = 1;
964 return std::move(masked_flags);
967template <TCDataKind tcdata_t,
class calib_t,
typename po
inting_offset_t>
969 std::string &pixel_axes, pointing_offset_t &pointing_offsets_arcsec, calib_t &calib) {
971 using netCDF::NcFile;
972 using netCDF::NcType;
974 using namespace netCDF::exceptions;
976 Eigen::Index n_pts = in.scans.data.rows();
977 Eigen::Index n_dets = in.scans.data.cols();
980 Eigen::MatrixXd lat(n_pts,n_dets), lon(n_pts,n_dets);
983 for (Eigen::Index i=0; i<n_dets; ++i) {
986 double az_off = calib.apt[
"x_t"](det_index);
987 double el_off = calib.apt[
"y_t"](det_index);
991 pointing_offsets_arcsec, map_grouping);
992 lat.col(i) = std::move(det_lat);
993 lon.col(i) = std::move(det_lon);
997 auto vars = fo.getVars();
1001 vars.find(
"SourceRa")->second.getVar(&cra);
1002 vars.find(
"SourceDec")->second.getVar(&cdec);
1005 NcDim n_pts_dim = fo.getDim(
"n_pts");
1006 NcDim n_dets_dim = fo.getDim(
"n_dets");
1009 unsigned long n_pts_exists = n_pts_dim.getSize();
1011 unsigned long n_dets_exists = n_dets_dim.getSize();
1014 std::vector<std::size_t> start_index = {n_pts_exists, 0};
1016 std::vector<std::size_t> size = {1, TULA_SIZET(n_dets)};
1019 std::vector<std::size_t> start_index_tel = {n_pts_exists};
1021 std::vector<std::size_t> size_tel = {TULA_SIZET(n_pts)};
1024 std::vector<std::size_t> start_index_apt = {0};
1026 std::vector<std::size_t> size_apt = {1};
1029 NcVar signal_v = fo.getVar(
"signal");
1030 NcVar flags_v = fo.getVar(
"flags");
1031 NcVar kernel_v = fo.getVar(
"kernel");
1034 NcVar det_lat_v = fo.getVar(
"det_lat");
1035 NcVar det_lon_v = fo.getVar(
"det_lon");
1038 NcVar det_ra_v = fo.getVar(
"det_ra");
1039 NcVar det_dec_v = fo.getVar(
"det_dec");
1043 for (std::size_t i=0; i<TULA_SIZET(n_pts); ++i) {
1044 start_index[0] = n_pts_exists + i;
1046 Eigen::VectorXd scans = in.scans.data.row(i);
1047 signal_v.putVar(start_index, size, scans.data());
1050 Eigen::VectorXi flags_int = in.flags.data.row(i).template cast<int> ();
1051 flags_v.putVar(start_index, size, flags_int.data());
1054 if (!kernel_v.isNull()) {
1055 Eigen::VectorXd kernel = in.kernel.data.row(i);
1056 kernel_v.putVar(start_index, size, kernel.data());
1060 Eigen::VectorXd lat_row = lat.row(i);
1061 det_lat_v.putVar(start_index, size, lat_row.data());
1064 Eigen::VectorXd lon_row = lon.row(i);
1065 det_lon_v.putVar(start_index, size, lon_row.data());
1067 if (pixel_axes ==
"radec") {
1072 det_ra_v.putVar(start_index, size, ra.data());
1075 det_dec_v.putVar(start_index, size, dec.data());
1080 for (
auto const& x: in.tel_data.data) {
1081 NcVar tel_data_v = fo.getVar(x.first);
1082 tel_data_v.putVar(start_index_tel, size_tel, x.second.data());
1086 for (
auto const& x: in.pointing_offsets_arcsec.data) {
1087 NcVar offset_v = fo.getVar(
"pointing_offset_"+x.first);
1088 offset_v.putVar(start_index_tel, size_tel, x.second.data());
1092 if (calib.run_hwpr) {
1093 NcVar hwpr_v = fo.getVar(
"hwpr");
1094 hwpr_v.putVar(start_index_tel, size_tel, in.hwpr_angle.data.data());
1099 for (
auto const& x: calib.apt) {
1100 netCDF::NcVar apt_v = fo.getVar(
"apt_" + x.first);
1101 if (!apt_v.isNull()) {
1102 for (std::size_t i=0; i<TULA_SIZET(n_dets_exists); ++i) {
1103 start_index_apt[0] = i;
1104 apt_v.putVar(start_index_apt, size_apt, &calib.apt[x.first](i));
1110 Eigen::VectorXd scan_indices(2);
1113 if (in.index.data > 0) {
1115 std::vector<std::size_t> scan_indices_start_index = {TULA_SIZET(in.index.data-1), 0};
1117 std::vector<std::size_t> scan_indices_size = {1, 2};
1118 vars.find(
"scan_indices")->second.getVar(scan_indices_start_index,scan_indices_size,scan_indices.data());
1120 scan_indices = scan_indices.array() + in.scans.data.rows();
1125 scan_indices(0) = 0;
1126 scan_indices(1) = in.scans.data.rows() - 1;
1130 std::vector<std::size_t> scan_indices_start_index = {TULA_SIZET(in.index.data), 0};
1131 std::vector<std::size_t> scan_indices_size = {1, 2};
1132 NcVar scan_indices_v = fo.getVar(
"scan_indices");
1133 scan_indices_v.putVar(scan_indices_start_index, scan_indices_size,scan_indices.data());
Definition toltec_io.h:10
std::map< Eigen::Index, std::string > array_name_map
Definition toltec_io.h:54
auto get_hdu(std::string hdu_name)
Definition fits_io.h:82
std::unique_ptr< CCfits::FITS > pfits
Definition fits_io.h:19
WCS wcs
Definition map.h:48
std::tuple< double, Eigen::MatrixXd, Eigen::Index, Eigen::Index > calc_cov_region(Eigen::Index)
Definition map.cpp:253
Eigen::Index n_rows
Definition map.h:65
Eigen::Index n_cols
Definition map.h:65
std::vector< Eigen::MatrixXd > signal
Definition map.h:78
std::vector< Eigen::MatrixXd > weight
Definition map.h:78
std::vector< Eigen::MatrixXd > kernel
Definition map.h:78
Eigen::Index n_noise
Definition map.h:67
Eigen::VectorXd median_rms
Definition map.h:117
std::vector< Eigen::Tensor< double, 3 > > noise
Definition map.h:81
double pixel_size_rad
Definition map.h:69
Definition timestream.h:257
auto mask_region(TCData< tcdata_t, Eigen::MatrixXd > &, calib_t &, std::string, std::string, int, int, int)
Definition timestream.h:918
auto get_grouping(std::string, calib_t &, int)
Definition timestream.h:572
std::string fruit_loops_path
Definition timestream.h:281
std::shared_ptr< spdlog::logger > logger
Definition timestream.h:260
double upper_inv_var_factor
Definition timestream.h:302
double fruit_loops_sig2noise
Definition timestream.h:289
bool save_all_iters
Definition timestream.h:293
double mask_radius_arcsec
Definition timestream.h:305
bool run_tod_output
Definition timestream.h:276
void append_base_to_netcdf(netCDF::NcFile &, TCData< tcdata_t, Eigen::MatrixXd > &, std::string, std::string &, pointing_offset_t &, calib_t &)
Definition timestream.h:968
std::vector< std::string > init_fruit_loops_path
Definition timestream.h:283
void map_to_tod(mb_t &, TCData< tcdata_t, Eigen::MatrixXd > &, calib_t &, Eigen::DenseBase< Derived > &, std::string, std::string)
Definition timestream.h:624
bool write_evals
Definition timestream.h:276
int iter_lim
Definition timestream.h:299
auto remove_uncorrelated(TCData< tcdata_t, Eigen::MatrixXd > &, calib_t &, std::string)
Definition timestream.h:823
engine_utils::toltecIO toltec_io
Definition timestream.h:263
void precompute_pointing(TCData< tcdata_t, Eigen::MatrixXd > &, calib_t &, std::string, std::string)
Definition timestream.h:599
auto remove_bad_dets(TCData< tcdata_t, Eigen::MatrixXd > &, calib_t &, std::string)
Definition timestream.h:703
int fruit_loops_iters
Definition timestream.h:287
SourceType
Definition timestream.h:266
@ NegativeGaussian
Definition timestream.h:268
@ NegativeMap
Definition timestream.h:272
@ Map
Definition timestream.h:271
@ NegativeAiry
Definition timestream.h:270
@ Airy
Definition timestream.h:269
@ Gaussian
Definition timestream.h:267
void load_mb(std::string, std::string, calib_t &)
Definition timestream.h:347
bool run_fruit_loops
Definition timestream.h:279
std::string fruit_mode
Definition timestream.h:285
mapmaking::MapBuffer tod_mb
Definition timestream.h:296
Eigen::VectorXd fruit_loops_flux
Definition timestream.h:291
double lower_inv_var_factor
Definition timestream.h:302
void add_gaussian(TCData< tcdata_t, Eigen::MatrixXd > &, Eigen::DenseBase< Derived > &, std::string &, std::string &, apt_t &, double, Eigen::Index, Eigen::Index)
Definition timestream.h:838
std::string fruit_loops_type
Definition timestream.h:285
#define DEG_TO_RAD
Definition constants.h:27
#define ASEC_TO_RAD
Definition constants.h:33
auto calc_det_pointing(tel_data_t &tel_data, double az_off, double el_off, const std::string pixel_axes, pointing_offset_t &pointing_offsets, const std::string map_grouping)
Definition pointing.h:11
auto tangent_to_abs(Eigen::DenseBase< Derived > &lat, Eigen::DenseBase< Derived > &lon, const double cra, const double cdec)
Definition pointing.h:88
static const std::string current_date_time()
Definition utils.h:91
auto calc_std_dev(Eigen::DenseBase< DerivedA > &data)
Definition utils.h:336
Definition sensitivity.h:13
Definition timestream.h:59
TimestreamFlags
Definition timestream.h:26
@ D21LargeOffset
Definition timestream.h:29
@ D21NotConverged
Definition timestream.h:30
@ D21QrOutOfRange
Definition timestream.h:32
@ QrOutOfRange
Definition timestream.h:36
@ Good
Definition timestream.h:27
@ D21FitsBetter
Definition timestream.h:28
@ NotConverged
Definition timestream.h:34
@ APT
Definition timestream.h:38
@ D21OutOfRange
Definition timestream.h:31
@ Freq
Definition timestream.h:40
@ Spike
Definition timestream.h:39
@ LargeOffset
Definition timestream.h:33
@ LowGain
Definition timestream.h:37
@ OutOfRange
Definition timestream.h:35
TULA_BITFLAG(TCDataKind, int, 0xFFFF, RTC=1<< 0, PTC=1<< 1, Any=RTC|PTC)
std::vector< float > cdelt
Definition map.h:27
std::vector< std::string > cunit
Definition map.h:39
std::vector< float > crpix
Definition map.h:33
std::vector< int > naxis
Definition map.h:30
std::vector< float > crval
Definition map.h:36
Definition timestream.h:130
DetectorAxis(Eigen::MatrixXd data_, tula::nddata::LabelMapper< DetectorAxis > row_labels_)
Definition timestream.h:132
tula::nddata::LabelMapper< DetectorAxis > row_labels
Definition timestream.h:136
Eigen::MatrixXd data
Definition timestream.h:135
std::string_view name
Definition timestream.h:134
Definition timestream.h:117
bool kernel_generated
Definition timestream.h:119
bool downsampled
Definition timestream.h:122
bool tod_filtered
Definition timestream.h:121
bool cleaned
Definition timestream.h:125
bool calibrated
Definition timestream.h:123
bool demodulated
Definition timestream.h:118
bool extinction_corrected
Definition timestream.h:124
bool despiked
Definition timestream.h:120
std::conditional_t< tula::eigen_utils::is_plain_v< RefType >, Base::data_t< RefType >, Base::dataref_t< RefType > > data_t
Definition timestream.h:230
Base::data_t< std::vector< double > > median_weights
Definition timestream.h:242
data_t scans
Definition timestream.h:234
Base::data_t< Eigen::VectorXd > weights
Definition timestream.h:236
Base::data_t< std::vector< std::vector< Eigen::MatrixXd > > > evecs
Definition timestream.h:240
Base::data_t< std::vector< std::vector< Eigen::VectorXd > > > evals
Definition timestream.h:238
data_t scans
Definition timestream.h:222
std::conditional_t< tula::eigen_utils::is_plain_v< RefType >, Base::data_t< RefType >, Base::dataref_t< RefType > > data_t
Definition timestream.h:218
tula::enum_utils::enum_to_variant_t< kind_, TCData > variant_t
Definition timestream.h:250
tula::enum_utils::enum_to_variant_t< kind_, TCData > Base
Definition timestream.h:249
static constexpr auto kind()
Definition timestream.h:253
const variant_t & variant() const
Definition timestream.h:252
TC data class.
Definition timestream.h:55
Definition timestream.h:140
std::string_view name
Definition timestream.h:144
Eigen::MatrixXd data
Definition timestream.h:145
tula::nddata::LabelMapper< TimeAxis > col_labels
Definition timestream.h:146
TimeAxis(Eigen::MatrixXd data_, tula::nddata::LabelMapper< TimeAxis > col_labels_)
Definition timestream.h:142
Definition timestream.h:149
TimeAxis time_axis
Definition timestream.h:150
const TimeAxis & row_axis() const
Definition timestream.h:154
DetectorAxis detector_axis
Definition timestream.h:151
const DetectorAxis & col_axis() const
Definition timestream.h:155
Definition timestream.h:172
PlainObject data
Definition timestream.h:173
Definition timestream.h:167
PlainObject data
Definition timestream.h:168
base class for time stream data
Definition timestream.h:163
Status status
Definition timestream.h:183
data_t< std::map< std::string, Eigen::VectorXd > > tel_data
Definition timestream.h:198
TimeStreamFrame wcs
Definition timestream.h:164
data_t< Eigen::VectorXd > angle
Definition timestream.h:204
data_t< std::map< std::string, Eigen::MatrixXd > > pointing
Definition timestream.h:210
int n_dets_high
Definition timestream.h:180
data_t< std::map< std::string, Eigen::VectorXd > > pointing_offsets_arcsec
Definition timestream.h:200
data_t< Eigen::VectorXI > map_indices
Definition timestream.h:208
data_t< Eigen::MatrixXi > noise
Definition timestream.h:190
data_t< Eigen::Matrix< TimestreamFlags, Eigen::Dynamic, Eigen::Dynamic > > flags2
Definition timestream.h:192
data_t< Eigen::Index > index
Definition timestream.h:196
std::string creation_time
Definition timestream.h:177
data_t< Eigen::MatrixXd > kernel
Definition timestream.h:186
data_t< Eigen::VectorXd > hwpr_angle
Definition timestream.h:202
int n_dets_low
Definition timestream.h:180
data_t< Eigen::Matrix< Eigen::Index, Eigen::Dynamic, 1 > > scan_indices
Definition timestream.h:194
data_t< Eigen::VectorXd > fcf
Definition timestream.h:206
data_t< Eigen::Matrix< bool, Eigen::Dynamic, Eigen::Dynamic > > flags
Definition timestream.h:188
static constexpr auto kind()
Definition timestream.h:109
Definition timestream.h:105