4#include <tula/config/core.h>
5#include <tula/config/flatconfig.h>
6#include <tula/config/yamlconfig.h>
8#include <tula/filesystem.h>
9#include <tula/formatter/container.h>
10#include <tula/formatter/enum.h>
11#include <tula/grppi.h>
12#include <tula/logging.h>
13#include <tula/switch_invoke.h>
24static_assert(std::is_same_v<std::ptrdiff_t, Eigen::Index>,
25 "UNEXPECTED EIGEN INDEX TYPE");
27using shape_t = Eigen::Matrix<index_t, 2, 1>;
31namespace kidsdata = kids::toltec;
37using timestream::TCDataKind;
41template <
typename Derived>
43 tula::config::ConfigValidatorMixin<Derived, tula::config::YamlConfig>;
62 std::tuple{
"meta",
"interface"})),
63 m_filepath(this->config().get_filepath(
"filepath")) {}
66 -> std::optional<std::string> {
67 std::vector<std::string> missing_keys;
68 SPDLOG_INFO(
"check data item config\n{}", config);
69 if (!config.has(std::tuple{
"meta",
"interface"})) {
70 missing_keys.push_back(
"meta.interface");
72 if (!config.has(
"filepath")) {
73 missing_keys.push_back(
"filepath");
75 if (missing_keys.empty()) {
78 return fmt::format(
"invalid or missing keys={}", missing_keys);
96 using CalItemTypes = tula::meta::cases<CalItemType::array_prop_table,
97 CalItemType::photometry,
98 CalItemType::astrometry,
99 CalItemType::unresolved>;
108 tula::meta::case_t<CalItemType::array_prop_table, ArrayPropTable>,
109 tula::meta::case_t<CalItemType::photometry, PhotometryCalibInfo>,
110 tula::meta::case_t<CalItemType::astrometry, AstrometryCalibInfo>,
111 tula::meta::case_t<CalItemType::unresolved, CalItem>>;
124 m_filepath(this->config().get_str(
"filepath")) {}
127 -> std::optional<std::string> {
128 std::vector<std::string> missing_keys;
129 SPDLOG_INFO(
"check array prop table config\n{}", config);
130 if (!config.has(
"filepath")) {
131 missing_keys.push_back(
"filepath");
133 if (missing_keys.empty()) {
136 return fmt::format(
"invalid or missing keys={}", missing_keys);
149 -> std::optional<std::string> {
150 std::vector<std::string> missing_keys;
151 SPDLOG_INFO(
"check photometry calib info\n{}", config);
153 if (missing_keys.empty()) {
156 return fmt::format(
"invalid or missing keys={}", missing_keys);
158 template <
typename OStream>
161 return os << fmt::format(
"PhotometryCalibInfo()");
170 -> std::optional<std::string> {
171 std::vector<std::string> missing_keys;
172 SPDLOG_INFO(
"check astrometry calib info\n{}", config);
174 if (missing_keys.empty()) {
177 return fmt::format(
"invalid or missing keys={}", missing_keys);
179 template <
typename OStream>
182 return os << fmt::format(
"AstrometryCalibInfo()");
196 -> std::optional<std::string> {
197 std::vector<std::string> missing_keys;
199 if (!config.has(
"type")) {
200 missing_keys.push_back(
"type");
202 if (missing_keys.empty()) {
205 return fmt::format(
"invalid or missing keys={}", missing_keys);
214 return CalItemType::unresolved;
217 template <auto type_>
222 template <auto type_>
224 return std::get<cal_item_t<type_>>(
m_cal_item);
231 tula::meta::switch_invoke<CalItemTypes>(
233 constexpr auto type_ = std::decay_t<
decltype(
_)>::value;
234 if constexpr (
type_ == CalItemType::unresolved) {
246 std::tuple{
"meta",
"name"})} {
252 -> std::optional<std::string> {
253 std::vector<std::string> missing_keys;
254 SPDLOG_INFO(
"check raw obs config\n{}", config);
255 if (!config.has(std::tuple{
"meta",
"name"})) {
256 missing_keys.push_back(
"meta.name");
258 if (!config.has_list(
"data_items")) {
259 missing_keys.push_back(
"data_items");
261 if (!config.has_list(
"cal_items")) {
262 missing_keys.push_back(
"cal_items");
264 if (missing_keys.empty()) {
267 return fmt::format(
"invalid or missing keys={}", missing_keys);
277 return std::optional{
284 std::vector<std::reference_wrapper<const DataItem>> result{};
295 .get<CalItemType::array_prop_table>();
299 .get<CalItemType::photometry>();
303 .get<CalItemType::astrometry>();
331struct formatter<
std::reference_wrapper<T>>
332 : tula::fmt_utils::nullspec_formatter_base {
333 template <
typename FormatContext>
334 auto format(
const std::reference_wrapper<T> &ref,
335 FormatContext &ctx)
const noexcept ->
decltype(ctx.out()) {
336 return format_to(ctx.out(),
"{}", ref.get());
342 : tula::fmt_utils::nullspec_formatter_base {
343 template <
typename FormatContext>
345 ->
decltype(ctx.out()) {
346 return format_to(ctx.out(),
"RawObs(name={}, n_data_items={})",
347 obs.name(), obs.n_data_items());
353 : tula::fmt_utils::nullspec_formatter_base {
354 template <
typename FormatContext>
356 ->
decltype(ctx.out()) {
357 return format_to(ctx.out(),
"DataItem(interface={}, filepath={})",
358 item.interface(), item.filepath());
364 : tula::fmt_utils::nullspec_formatter_base {
365 template <
typename FormatContext>
367 ->
decltype(ctx.out()) {
368 return format_to(ctx.out(),
"CalItem(typestr={})",
375 : tula::fmt_utils::nullspec_formatter_base {
376 template <
typename FormatContext>
378 ->
decltype(ctx.out()) {
379 return format_to(ctx.out(),
"ArrayPropTable(filepath={})",
390 auto node_data_items = this->config().get_node(
"data_items");
395 config_t{node_data_items[i], this->config().filepath()});
401 if ((a.interface().find(
"toltec"))!=std::string::npos && (b.interface().find(
"toltec"))!=std::string::npos) {
402 std::string cmp_a { a.interface().begin() + 6, a.interface().end() };
403 std::string cmp_b { b.interface().begin() + 6, b.interface().end() };
404 return std::stoi(cmp_a) < std::stoi(cmp_b);
411 SPDLOG_DEBUG(
"collected n_data_items={}\n{}", this->n_data_items(),
414 m_kidsdata_indices.clear();
415 m_teldata_index.reset();
416 m_hwpdata_index.reset();
418 for (std::size_t i = 0; i < m_data_items.size(); ++i) {
419 if (std::regex_match(m_data_items[i].interface(), m,
420 re_interface_kidsdata)) {
421 m_kidsdata_indices.push_back(i);
423 if (std::regex_match(m_data_items[i].interface(), m,
424 re_interface_teldata)) {
425 if (m_teldata_index.has_value()) {
426 throw std::runtime_error(
"found too many telescope data items");
430 if (std::regex_match(m_data_items[i].interface(), m,
431 re_interface_hwpdata)) {
432 if (m_hwpdata_index.has_value()) {
433 throw std::runtime_error(
434 "found too many halfwave plate data items");
439 if (!m_teldata_index) {
440 throw std::runtime_error(
"no telescope data item found");
443 if (!m_hwpdata_index) {
444 SPDLOG_INFO(
"no hwp data item found");
446 SPDLOG_INFO(
"kidsdata_indices={} teldata_index={} hwpdata_index={}",
447 m_kidsdata_indices, m_teldata_index, m_hwpdata_index);
448 SPDLOG_INFO(
"kidsdata={} teldata={} hwpdata={}", kidsdata(), teldata(),
457 auto node_cal_items = this->config().get_node(
"cal_items");
461 config_t{node_cal_items[i], this->config().filepath()});
464 SPDLOG_DEBUG(
"collected n_cal_items={}\n{}", this->
n_cal_items(),
470 for (std::size_t i = 0; i <
m_cal_items.size(); ++i) {
471 if (
m_cal_items[i].is_type<CalItemType::array_prop_table>()) {
473 throw std::runtime_error(
"found too many array prop tables");
477 if (
m_cal_items[i].is_type<CalItemType::photometry>()) {
479 throw std::runtime_error(
"found too many photometry calib info.");
483 if (
m_cal_items[i].is_type<CalItemType::astrometry>()) {
485 throw std::runtime_error(
"found too many astrometry calib info.");
491 throw std::runtime_error(
"no array prop table found");
521 -> std::optional<std::string> {
522 if (config.has_list(
"inputs")) {
525 return fmt::format(
"invalid or missing key \"inputs\"");
529 return os << fmt::format(
"SeqIOCoordinator(n_inputs={})",
539 std::vector<input_t>
inputs;
540 auto node_inputs = this->config().get_node(
"inputs");
542 for (std::size_t i = 0; i <
n_inputs; ++i) {
543 SPDLOG_INFO(
"add input {} of {}", i,
n_inputs);
545 config_t{node_inputs[i], this->config().filepath()});
549 SPDLOG_DEBUG(
"collected n_inputs={}\n{}", this->
n_inputs(),
tula::config::ConfigValidatorMixin< Derived, tula::config::YamlConfig > ConfigMapper
Definition io.h:43
TULA_ENUM_REGISTER(RawObs::CalItemType)
config::ConfigValidatorMixin< Derived, config::YamlConfig > ConfigMapper
Definition main_old.cpp:124
std::ptrdiff_t index_t
This namespace contains global settings for common types and constants.
Definition io.h:26
double data_t
Definition io.h:28
Eigen::Matrix< index_t, 2, 1 > shape_t
Definition io.h:27
Definition timestream.h:59
ArrayPropTable(config_t config)
Definition io.h:122
std::string m_filepath
Definition io.h:141
const std::string & filepath() const
Definition io.h:138
static auto check_config(config_t &config) -> std::optional< std::string >
Definition io.h:126
ConfigMapper< ArrayPropTable > Base
Definition io.h:121
static auto check_config(config_t &config) -> std::optional< std::string >
Definition io.h:169
ConfigMapper< AstrometryCalibInfo > Base
Definition io.h:166
friend auto operator<<(OStream &os, const AstrometryCalibInfo &d) -> decltype(auto)
Definition io.h:180
AstrometryCalibInfo(config_t config)
Definition io.h:167
@breif a generic cal item holder
Definition io.h:187
void resolve()
Definition io.h:230
auto type() const
Definition io.h:209
auto is_type() -> bool
Definition io.h:218
ConfigMapper< CalItem > Base
Definition io.h:188
CalItem(config_t config)
Definition io.h:189
cal_item_var_t m_cal_item
Definition io.h:229
std::string m_typestr
Definition io.h:228
static auto check_config(config_t &config) -> std::optional< std::string >
Definition io.h:195
auto get() const -> const auto &
Definition io.h:223
const std::string & typestr() const
Definition io.h:207
The DataItem struct This represent a single data item that belongs to a particular observation.
Definition io.h:58
ConfigMapper< DataItem > Base
Definition io.h:59
std::string m_filepath
Definition io.h:85
const std::string & interface() const
Definition io.h:80
const std::string & filepath() const
Definition io.h:81
static auto check_config(config_t &config) -> std::optional< std::string >
Definition io.h:65
std::string m_interface
Definition io.h:84
DataItem(config_t config)
Definition io.h:60
friend auto operator<<(OStream &os, const PhotometryCalibInfo &d) -> decltype(auto)
Definition io.h:159
ConfigMapper< PhotometryCalibInfo > Base
Definition io.h:145
static auto check_config(config_t &config) -> std::optional< std::string >
Definition io.h:148
PhotometryCalibInfo(config_t config)
Definition io.h:146
The raw obs struct This represents a single observation that contains a set of data items and calibra...
Definition io.h:50
ConfigMapper< RawObs > Base
Definition io.h:51
std::variant< std::monostate, cal_item_t< CalItemType::array_prop_table >, cal_item_t< CalItemType::photometry >, cal_item_t< CalItemType::astrometry > > cal_item_var_t
Definition io.h:118
std::optional< DataItem > hwpdata() const
Definition io.h:275
const AstrometryCalibInfo & astrometry_calib_info() const
Definition io.h:301
RawObs(config_t config)
Definition io.h:244
static const std::regex re_interface_kidsdata
Definition io.h:307
auto n_data_items() const
Definition io.h:270
const std::string & name() const
Definition io.h:269
void collect_data_items()
Definition io.h:387
const std::vector< CalItem > & cal_items() const
Definition io.h:292
const ArrayPropTable & array_prop_table() const
Definition io.h:293
tula::meta::switch_t< type, tula::meta::case_t< CalItemType::array_prop_table, ArrayPropTable >, tula::meta::case_t< CalItemType::photometry, PhotometryCalibInfo >, tula::meta::case_t< CalItemType::astrometry, AstrometryCalibInfo >, tula::meta::case_t< CalItemType::unresolved, CalItem > > cal_item_t
Definition io.h:111
std::vector< std::size_t > m_kidsdata_indices
Definition io.h:313
auto kidsdata() const -> decltype(auto)
Definition io.h:283
void collect_cal_items()
Definition io.h:454
std::optional< std::size_t > m_astro_cal_index
Definition io.h:321
const DataItem & teldata() const
Definition io.h:272
std::string m_name
Definition io.h:311
static auto check_config(const config_t &config) -> std::optional< std::string >
Definition io.h:251
TULA_ENUM_DECL(CalItemType, int, array_prop_table, photometry, astrometry, unresolved)
static const std::regex re_interface_teldata
Definition io.h:308
tula::meta::cases< CalItemType::array_prop_table, CalItemType::photometry, CalItemType::astrometry, CalItemType::unresolved > CalItemTypes
Definition io.h:99
std::vector< DataItem > m_data_items
Definition io.h:312
std::optional< std::size_t > m_apt_index
Definition io.h:319
auto n_cal_items() const
Definition io.h:291
std::optional< std::size_t > m_hwpdata_index
Definition io.h:315
const PhotometryCalibInfo & photometry_calib_info() const
Definition io.h:297
std::optional< std::size_t > m_phot_cal_index
Definition io.h:320
static const std::regex re_interface_hwpdata
Definition io.h:309
std::optional< std::size_t > m_teldata_index
Definition io.h:314
const std::vector< DataItem > & data_items() const
Definition io.h:271
std::vector< CalItem > m_cal_items
Definition io.h:318
The Coordinator struct This wraps around the config object and provides high level methods in various...
Definition io.h:502
auto n_inputs() const
Definition io.h:516
std::vector< input_t > m_inputs
Definition io.h:534
predefs::data_t payloads_buffer_data_t
Definition io.h:514
static auto check_config(const config_t &config) -> std::optional< std::string >
Definition io.h:520
const std::vector< input_t > & inputs() const
Definition io.h:518
ConfigMapper< SeqIOCoordinator > Base
Definition io.h:503
predefs::shape_t shape_t
Definition io.h:505
predefs::index_t index_t
Definition io.h:504
void collect_inputs()
Definition io.h:537
friend std::ostream & operator<<(std::ostream &os, const SeqIOCoordinator &co)
Definition io.h:527
SeqIOCoordinator(config_t config)
Definition io.h:509
TC data class.
Definition timestream.h:55