12#include <unsupported/Eigen/FFT>
13#include <unsupported/Eigen/Splines>
15#include <tula/grppi.h>
16#include <tula/algorithm/ei_stats.h>
48 while (*p <
'0' || *p >
'9') {
57 FILE* file = fopen(
"/proc/self/status",
"r");
61 while (fgets(line, 128, file) != NULL){
62 if (strncmp(line,
"VmRSS:", 6) == 0){
72static const double planck_nu(
const double freq_Hz,
const double T_K) {
77static const double mJy_beam_to_uK(
const double flux_mjy_beam,
const double freq_Hz,
const double fwhm) {
85 auto K_to_mJy_beam = planck*exp(h_nu_k_T)/(exp(h_nu_k_T)-1)*h_nu_k_T/pow(
T_cmb_K,2)*1e26*1e3;
87 return 1e6*flux_mjy_beam/K_to_mJy_beam;
95 tstruct = *localtime(&
now);
96 strftime(buf,
sizeof(buf),
"%Y-%m-%d.%X", &tstruct);
106 tstruct = *localtime(&
now);
107 strftime(buf,
sizeof(buf),
"%Y-%m-%d.%X", &tstruct);
112template <
typename DerivedA,
typename DerivedB>
113void utc_to_unix(Eigen::DenseBase<DerivedA> &tel_utc, Eigen::DenseBase<DerivedB> &ut_date) {
115 Eigen::Index n_pts = tel_utc.size();
120 auto days_in_year = 365.0;
122 int year = std::floor(ut_date(0));
123 int days = int(((ut_date(0)-year)*days_in_year)+1);
125 auto ut_time = 180/15/
pi * tel_utc.derived().array();
127 Eigen::VectorXd tel_unix(n_pts);
130 for (Eigen::Index i=0; i<n_pts; ++i) {
131 auto h =(int)ut_time(i);
132 auto m = (int)((ut_time(i) - h)*60);
133 auto s = (((ut_time(i) - h)*60 - m)*60);
136 tm_time.tm_isdst = -1;
138 tm_time.tm_mday = days;
139 tm_time.tm_year = year - 1900;
146 utc_time = timegm(&tm_time);
149 time_t unix_time = (time_t) utc_time;
151 tel_unix(i) = unix_time;
159 const double UNIX_EPOCH_JD = 2440587.5;
162 double diff = jd - UNIX_EPOCH_JD + 2400000.5;
165 long long unix_time =
static_cast<long long>(diff * 86400.0);
171 const double seconds_per_day = 86400.0;
172 const double mjd_offset = 40587.0;
173 return unix_time / seconds_per_day + mjd_offset;
176template <
typename Derived>
177auto make_meshgrid(
const Eigen::DenseBase<Derived> &x,
const Eigen::DenseBase<Derived> &y) {
180 const long nx = x.size(), ny = y.size();
181 Derived xy(nx * ny, 2);
183 Eigen::Map<Eigen::MatrixXd> xx(xy.data(), ny, nx);
185 Eigen::Map<Eigen::MatrixXd> yy(xy.data() + xy.rows(), ny, nx);
187 for (Eigen::Index i=0; i<ny; ++i) {
188 xx.row(i) = x.transpose();
191 for (Eigen::Index j=0; j<nx; ++j) {
204template <FFTDirection direction,
typename Derived>
205auto fft(Eigen::DenseBase<Derived> &in, std::string parallel_policy) {
207 Eigen::Index n_rows = in.rows();
208 Eigen::Index n_cols = in.cols();
211 Eigen::MatrixXcd out(n_rows, n_cols);
214 std::vector<Eigen::Index> row_vec_in(n_rows);
215 std::iota(row_vec_in.begin(), row_vec_in.end(),0);
216 std::vector<Eigen::Index> row_vec_out(n_rows);
218 std::vector<Eigen::Index> col_vec_in(n_cols);
219 std::iota(col_vec_in.begin(), col_vec_in.end(),0);
220 std::vector<Eigen::Index> col_vec_out(n_cols);
223 grppi::map(tula::grppi_utils::dyn_ex(parallel_policy),col_vec_in,col_vec_out,[&](
auto i) {
224 Eigen::FFT<double>
fft;
225 fft.SetFlag(Eigen::FFT<double>::HalfSpectrum);
226 fft.SetFlag(Eigen::FFT<double>::Unscaled);
228 Eigen::VectorXcd temp_col(n_rows);
230 if constexpr(direction ==
forward) {
231 fft.fwd(temp_col, in.col(i));
234 else if constexpr(direction ==
inverse){
235 fft.inv(temp_col, in.col(i));
237 out.col(i) = temp_col;
242 grppi::map(tula::grppi_utils::dyn_ex(parallel_policy),row_vec_in,row_vec_out,[&](
auto i) {
243 Eigen::FFT<double>
fft;
244 fft.SetFlag(Eigen::FFT<double>::HalfSpectrum);
245 fft.SetFlag(Eigen::FFT<double>::Unscaled);
247 Eigen::VectorXcd temp_row(n_cols);
249 if constexpr(direction ==
forward) {
250 fft.fwd(temp_row, out.row(i));
253 else if constexpr(direction ==
inverse){
254 fft.inv(temp_row, out.row(i));
256 out.row(i) = temp_row;
260 if constexpr(direction ==
forward) {
262 out = out/n_rows/n_cols;
269template <FFTDirection direction,
typename Derived,
typename fftw_plan_t>
270auto fft2(Eigen::DenseBase<Derived> &in, fftw_plan_t &plan, fftw_complex* a, fftw_complex*b){
272 Eigen::Index n_rows = in.rows();
273 Eigen::Index n_cols = in.cols();
276 for (Eigen::Index i=0; i< n_rows; ++i) {
277 for (Eigen::Index j=0; j<n_cols; ++j) {
278 int ii = n_cols*i + j;
279 a[ii][0] = in(i,j).real();
280 a[ii][1] = in(i,j).imag();
287 Eigen::MatrixXcd out(n_rows, n_cols);
290 for (Eigen::Index i=0; i<n_rows; ++i) {
291 for (Eigen::Index j=0; j<n_cols; ++j) {
292 int ii = n_cols*i + j;
293 out.real()(i,j) = b[ii][0];
294 out.imag()(i,j) = b[ii][1];
298 if constexpr(direction ==
forward) {
300 out = out/n_rows/n_cols;
306template<
class F,
class...Ts, std::size_t...Is>
308 using expander =
int[];
309 (void)expander { 0, ((void)func(std::get<Is>(tuple)), 0)... };
312template<
class F,
class...Ts>
317template<
typename Derived>
318std::vector<std::tuple<double, int>>
sorter(Eigen::DenseBase<Derived> &vec) {
319 std::vector<std::tuple<double, int>> vis;
320 Eigen::VectorXi indices = Eigen::VectorXi::LinSpaced(vec.size(),0,vec.size()-1);
322 for(Eigen::Index i=0; i<vec.size(); ++i) {
323 std::tuple<double, double> vec_and_val(vec(i), indices(i));
324 vis.push_back(vec_and_val);
327 std::sort(vis.begin(), vis.end(),
328 [&](
const std::tuple<double, int> &a,
const std::tuple<double, int> &b) ->
bool {
329 return std::get<0>(a) < std::get<0>(b);
335template <
typename DerivedA>
338 auto n_good = data.derived().size();
346 n_samples = n_good - 1;
350 double std_dev = std::sqrt((((data.derived().array()) -
351 (data.derived().array().mean())).square().sum()) / n_samples);
356template <
typename DerivedA,
typename DerivedB>
357auto calc_std_dev(Eigen::DenseBase<DerivedA> &data, Eigen::DenseBase<DerivedB> &flag) {
359 auto f = (1 - flag.derived().template cast<double>().array());
362 auto n_good = (f.array() == 1).count();
372 else if (n_good == 1) {
377 n_samples = n_good - 1;
380 auto mean = (data.derived().array()*f.array()).mean();
383 double std_dev = std::sqrt((((data.derived().array()*f.array()) - mean).square().sum()) / n_samples);
388template <
typename DerivedA>
392 auto n_good = data.size();
406 return std::sqrt(data.derived().array().square().mean());
409template <
typename DerivedA,
typename DerivedB>
410auto calc_rms(Eigen::DenseBase<DerivedA> &data, Eigen::DenseBase<DerivedB> &flag) {
413 auto f = (flag.derived().template cast<double>().array() - 1).abs();
416 auto n_good = (f.array() == 1).count();
430 return std::sqrt((((data.derived().array()*f.array())).square().sum()) / n_samples);
433template <
typename Derived>
435 Eigen::Index n_pts = data.size();
436 double med = tula::alg::median(data);
438 Derived abs_delt = abs(data.derived().array() - med);
439 return tula::alg::median(abs_delt);
443 double a = 2.*
pi/n_rows;
444 double b = 2.*
pi/n_cols;
446 Eigen::ArrayXd index = Eigen::ArrayXd::LinSpaced(n_rows,0,n_rows-1);
447 Eigen::RowVectorXd row = -0.5 * cos(index*a) + 0.5;
449 index = Eigen::ArrayXd::LinSpaced(n_cols,0,n_cols-1);
450 Eigen::VectorXd col = -0.5 * cos(index*b) + 0.5;
452 Eigen::MatrixXd window(n_rows, n_cols);
454 for (Eigen::Index i=0; i<n_cols; ++i) {
455 for (Eigen::Index j=0; j<n_rows; ++j) {
456 window(j,i) = row(j)*col(i);
464 unsigned int pivot_index = rand() % input.size();
465 double pivot_value = input[pivot_index];
466 std::vector<double> left;
467 std::vector<double> right;
468 for (
unsigned int i = 0; i < input.size(); ++i) {
469 if (i != pivot_index) {
470 if (input[i] > pivot_value) {
471 right.push_back(input[i]);
474 left.push_back(input[i]);
478 if ((
int)left.size() == index) {
481 else if ((
int)left.size() < index) {
489template <
typename Derived>
493 Eigen::Index n_non_zero = (weight.derived().array() > 0).count();
504 std::vector<double> non_zero_weights_vec;
508 bool constant =
false;
512 for (Eigen::Index i=0; i<weight.rows(); ++i) {
513 for (Eigen::Index j=0; j<weight.cols(); ++j) {
514 if (weight(i,j) > 0) {
516 non_zero_weights_vec.push_back(weight(i,j));
520 else if (weight(i,j)!=diff) {
533 Eigen::VectorXd non_zero_weights = Eigen::Map<Eigen::VectorXd>(non_zero_weights_vec.data(),
534 non_zero_weights_vec.size());
536 std::sort(non_zero_weights.data(), non_zero_weights.data() + non_zero_weights.size(),
537 [](
double lhs,
double rhs){return rhs > lhs;});
540 Eigen::Index cov_limit_index = 0.75*non_zero_weights.size();
543 Eigen::Index weight_index = std::floor((cov_limit_index + non_zero_weights.size())/2.);
544 weight_val = non_zero_weights(weight_index);
550 Eigen::Index cov_limit_index = 0.75*non_zero_weights_vec.size();
554 Eigen::Index weight_index = floor((cov_limit_index + non_zero_weights_vec.size())/2.);
555 weight_val =
pivot_select(non_zero_weights_vec, weight_index);
559 return weight_val*cov;
562template <
typename Derived>
565 Eigen::MatrixXd cov_ranges(2,2);
567 cov_ranges.row(0).setZero();
568 cov_ranges(1,0) = weight.rows() - 1;
569 cov_ranges(1,1) = weight.cols() - 1;
573 for (Eigen::Index i=0; i<weight.rows(); ++i) {
574 for (Eigen::Index j=0; j<weight.cols(); ++j) {
575 if (weight(i,j) >= weight_threshold) {
588 for (Eigen::Index i=weight.rows()-1; i>-1; i--) {
589 for (Eigen::Index j = 0; j < weight.cols(); ++j) {
590 if (weight(i,j) >= weight_threshold) {
603 for (Eigen::Index i=0; i<weight.cols(); ++i) {
604 for (Eigen::Index j = cov_ranges(0,0); j < cov_ranges(1,0) + 1; ++j) {
605 if (weight(j,i) >= weight_threshold) {
618 for (Eigen::Index i=weight.cols()-1; i>-1; i--) {
619 for (Eigen::Index j = cov_ranges(0,0); j < cov_ranges(1,0) + 1; ++j) {
620 if (weight(j,i) >= weight_threshold) {
640template<SmoothType smooth_type,
typename DerivedA,
typename DerivedB>
641void smooth(Eigen::DenseBase<DerivedA> &in, Eigen::DenseBase<DerivedB> &out,
int w) {
647 Eigen::Index n_pts = in.size();
648 if constexpr (smooth_type==
boxcar) {
649 out.head((w - 1) / 2) = in.head((w - 1) / 2);
650 out.tail(n_pts - (w + 1) / 2. + 1) = in.tail(n_pts - (w + 1) / 2. + 1);
652 double winv = 1. / w;
653 int wm1d2 = (w - 1) / 2.;
654 int wp1d2 = (w + 1) / 2.;
656 for (
int i = wm1d2; i <= n_pts - wp1d2; ++i) {
657 out(i) = winv * in.segment(i - wm1d2, w).sum();
663 int w_mid = (w - 1)/2;
666 for (Eigen::Index i=0; i<n_pts; ++i) {
668 for (
int j=0; j<w; ++j) {
669 int add_index = i + j - w_mid;
674 else if (add_index > n_pts-1) {
675 add_index = n_pts - 1;
677 sum += in(add_index);
684template <
typename DerivedA,
typename DerivedB>
685auto calc_2D_psd(Eigen::DenseBase<DerivedA> &data, Eigen::DenseBase<DerivedB> &y, Eigen::DenseBase<DerivedB> &x,
686 int smooth_window, std::string parallel_policy) {
688 Eigen::Index n_rows = data.rows();
689 Eigen::Index n_cols = data.cols();
691 Eigen::VectorXd psd, psd_freq;
693 double diff_rows = y(1) - y(0);
694 double diff_cols = x(1) - x(0);
695 double rsize = diff_rows * n_rows;
696 double csize = diff_cols * n_cols;
697 double diffq_rows = 1. / rsize;
698 double diffq_cols = 1. / csize;
701 Eigen::MatrixXcd in(n_rows, n_cols);
713 a = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex)*n_rows*n_cols);
714 b = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex)*n_rows*n_cols);
716 pf = fftw_plan_dft_2d(n_rows, n_cols, a, b, FFTW_FORWARD, FFTW_ESTIMATE);
720 in = engine_utils::fft2<engine_utils::forward>(in, pf, a, b);
727 fftw_destroy_plan(pf);
730 Eigen::MatrixXd out = diffq_rows*diffq_cols*(in.real().array().pow(2) + in.imag().array().pow(2));
733 Eigen::VectorXd q_rows(n_rows), q_cols(n_cols);
737 Eigen::Index shift = n_rows/2 - 1;
738 for (Eigen::Index i=0; i<n_rows; ++i) {
743 q_rows(index) = diffq_rows*(i-(n_rows/2-1));
747 shift = n_cols/2 - 1;
748 for (Eigen::Index i=0; i<n_cols; ++i) {
753 q_cols(index) = diffq_cols*(i-(n_cols/2-1));
757 Eigen::MatrixXd pmfq = out.block(1,1,n_rows-1,n_cols-1);
760 for (Eigen::Index i=0; i<n_rows-1; ++i) {
761 q_rows(i) = q_rows(i+1);
765 for (Eigen::Index j=0; j<n_cols-1; ++j) {
766 q_cols(j) = q_cols(j+1);
770 Eigen::MatrixXd qmap(n_rows-1,n_cols-1);
771 Eigen::MatrixXd qsymm(n_rows-1,n_cols-1);
773 for (Eigen::Index i=1; i<n_cols; ++i) {
774 for(Eigen::Index j=1; j<n_rows; ++j) {
775 qmap(j-1,i-1) = sqrt(pow(q_rows(j),2) + pow(q_cols(i),2));
776 qsymm(j-1,i-1) = q_rows(j)*q_cols(i);
783 if (n_rows > n_cols) {
793 psd_freq = Eigen::VectorXd::LinSpaced(nn,diff_q*0.5,diff_q*(nn-1 + 0.5));
798 std::vector<Eigen::Index> psd_vec_in(nn);
799 std::iota(psd_vec_in.begin(), psd_vec_in.end(),0);
800 std::vector<Eigen::Index> psd_vec_out(nn);
803 grppi::map(tula::grppi_utils::dyn_ex(parallel_policy),psd_vec_in,psd_vec_out,[&](
auto i) {
807 double psdarr_s = 0.;
808 double psdarr_a = 0.;
809 for (
int j=0; j<n_cols-1; ++j) {
810 for (
int k=0; k<n_rows-1; ++k) {
811 if ((
int) (qmap(k,j) / diff_q) == i) {
812 if (qsymm(k,j) >= 0.){
814 psdarr_s += pmfq(k,j);
818 psdarr_a += pmfq(k,j);
829 psd(i) = std::min(psdarr_s,psdarr_a);
834 Eigen::VectorXd smoothed_psd(nn);
835 engine_utils::smooth<edge_truncate>(psd, smoothed_psd, smooth_window);
836 psd = std::move(smoothed_psd);
838 return std::tuple<Eigen::VectorXd, Eigen::VectorXd, Eigen::MatrixXd, Eigen::MatrixXd>(psd, psd_freq, pmfq, qmap);
841template <
typename Derived>
842auto calc_hist(Eigen::DenseBase<Derived> &data,
int n_bins) {
843 double min_data = data.minCoeff();
844 double max_data = data.maxCoeff();
847 double rg = (abs(min_data) > abs(max_data)) ? abs(min_data) : abs(max_data);
850 Eigen::VectorXd hist_bins = Eigen::VectorXd::LinSpaced(n_bins,-rg,rg);
852 Eigen::VectorXd hist;
853 hist.setZero(n_bins);
856 for (Eigen::Index j=0; j<n_bins-1; ++j) {
857 hist(j) = ((data.derived().array() >= hist_bins(j)) && (data.derived().array() < hist_bins(j+1))).count();
860 return std::tuple<Eigen::VectorXd, Eigen::VectorXd>(hist, hist_bins);
864template <
typename Derived>
865auto shift_1D(Eigen::DenseBase<Derived> &in, std::vector<Eigen::Index> shift_indices) {
867 Eigen::Index n_pts = in.size();
871 for (Eigen::Index i=0; i<n_pts; ++i) {
872 Eigen::Index ti = (i+shift_indices[0])%n_pts;
873 Eigen::Index shift_index = (ti < 0) ? n_pts+ti : ti;
874 out(shift_index) = in(i);
881template <
typename Derived>
882auto shift_2D(Eigen::DenseBase<Derived> &in, std::vector<Eigen::Index> shift_indices) {
883 Eigen::Index n_rows = in.rows();
884 Eigen::Index n_cols = in.cols();
886 Derived out(n_rows,n_cols);
888 for (Eigen::Index i=0; i<n_cols; ++i) {
889 Eigen::Index ti = (i+shift_indices[1]) % n_cols;
890 Eigen::Index shift_col = (ti < 0) ? n_cols+ti : ti;
891 for (Eigen::Index j=0; j<n_rows; ++j) {
892 Eigen::Index tj = (j+shift_indices[0]) % n_rows;
893 Eigen::Index shift_row = (tj < 0) ? n_rows+tj : tj;
894 out(shift_row,shift_col) = in(j,i);
978 Eigen::VectorXd
const &y_vec)
979 :
x_min(x_vec.minCoeff()),
980 x_max(x_vec.maxCoeff()),
982 spline_(Eigen::SplineFitting<Eigen::Spline<double, 1>>::Interpolate(
985 std::min<int>(x_vec.rows() - 1, 3),
991 Eigen::VectorXd
const &y_vec) {
992 x_min = x_vec.minCoeff();
993 x_max = x_vec.maxCoeff();
995 spline_ = Eigen::SplineFitting<Eigen::Spline<double, 1>>::Interpolate(
998 std::min<int>(x_vec.rows() - 1, 3),
1014 return x_vec.unaryExpr([
this](
double x) {
return scaled_value(x); }).transpose();
1021template <
typename Derived>
1023 double high,
double upper_limit) {
1025 Eigen::Index n_pts = data.size();
1026 double max = data.maxCoeff();
1027 double min = data.minCoeff();
1028 if (max > high && min < low) {
1029 for (Eigen::Index i=0; i<n_pts; ++i) {
1030 if (data(i) < low) {
1031 data(i) += upper_limit;
1138inline auto now() {
return std::chrono::high_resolution_clock::now(); }
1142 const std::chrono::time_point<std::chrono::high_resolution_clock> &t0) {
1154 constexpr auto s_to_ms = 1e3;
1157 std::chrono::duration_cast<std::chrono::duration<double>>(t)
1161 logger->info(
"**timeit** {} finished in {}",
msg, t);
1168 std::chrono::time_point<std::chrono::high_resolution_clock>
t0{
now()};
1171 std::shared_ptr<spdlog::logger>
logger = spdlog::get(
"citlali_logger");
1176template <
typename Derived>
1178 if (times.size() != values.size()) {
1179 throw std::invalid_argument(
"Time vector and value vector must have the same number of elements.");
1182 Eigen::VectorXd derivatives(values.size());
1186 for (
int i = 0; i < values.size(); ++i) {
1188 dt = times(i + 1) - times(i);
1189 derivatives(i) = (values(i + 1) - values(i)) / dt;
1190 }
else if (i == values.size() - 1) {
1191 dt = times(i) - times(i - 1);
1192 derivatives(i) = (values(i) - values(i - 1)) / dt;
1194 dt = times(i + 1) - times(i - 1);
1195 derivatives(i) = (values(i + 1) - values(i - 1)) / (2 * dt);
1205 double xp = a * std::cos(theta) + b * std::sin(theta);
1206 double yp = -a * std::sin(theta) + b * std::cos(theta);
1209 if (-x / 2 <= xp && xp <= x / 2) {
1211 if (-y / 2 <= yp && yp <= y / 2) {
double x_min
Definition utils.h:974
double x_max
Definition utils.h:975
Eigen::RowVectorXd scaled_values(Eigen::VectorXd const &x_vec) const
Definition utils.h:1013
double operator()(double x) const
Definition utils.h:1002
double scaled_value(double x) const
Definition utils.h:1009
Eigen::Spline< double, 1 > spline_
Definition utils.h:1018
void interpolate(Eigen::VectorXd const &x_vec, Eigen::VectorXd const &y_vec)
Definition utils.h:990
SplineFunction(Eigen::VectorXd const &x_vec, Eigen::VectorXd const &y_vec)
Definition utils.h:977
#define c_m_s
Definition constants.h:12
#define kB_J_K
Definition constants.h:15
constexpr auto pi
Definition constants.h:6
#define T_cmb_K
Definition constants.h:18
#define h_J_s
Definition constants.h:9
std::vector< std::tuple< double, int > > sorter(Eigen::DenseBase< Derived > &vec)
Definition utils.h:318
auto shift_2D(Eigen::DenseBase< Derived > &in, std::vector< Eigen::Index > shift_indices)
Definition utils.h:882
static double unix_to_modified_julian_date(double unix_time)
Definition utils.h:170
void fix_periodic_boundary(Eigen::DenseBase< Derived > &data, double low, double high, double upper_limit)
Definition utils.h:1022
static const double mJy_beam_to_uK(const double flux_mjy_beam, const double freq_Hz, const double fwhm)
Definition utils.h:77
static const bool is_point_in_box(double a, double b, double x, double y, double theta)
Definition utils.h:1202
auto now()
Return the current time.
Definition utils.h:1138
auto calc_rms(Eigen::DenseBase< DerivedA > &data)
Definition utils.h:389
double calc_mad(Eigen::DenseBase< Derived > &data)
Definition utils.h:434
auto calc_hist(Eigen::DenseBase< Derived > &data, int n_bins)
Definition utils.h:842
void utc_to_unix(Eigen::DenseBase< DerivedA > &tel_utc, Eigen::DenseBase< DerivedB > &ut_date)
Definition utils.h:113
double find_weight_threshold(Eigen::DenseBase< Derived > &weight, double cov)
Definition utils.h:490
auto shift_1D(Eigen::DenseBase< Derived > &in, std::vector< Eigen::Index > shift_indices)
Definition utils.h:865
static const int get_phys_memory()
Definition utils.h:56
auto elapsed_since(const std::chrono::time_point< std::chrono::high_resolution_clock > &t0)
Return the time elapsed since given time.
Definition utils.h:1141
SmoothType
Definition utils.h:635
@ edge_truncate
Definition utils.h:637
@ boxcar
Definition utils.h:636
auto set_cov_cov_ranges(const Eigen::DenseBase< Derived > &weight, const double weight_threshold)
Definition utils.h:563
void for_each_in_tuple(const std::tuple< Ts... > &tuple, F func, std::index_sequence< Is... >)
Definition utils.h:307
static long long modified_julian_date_to_unix(double jd)
Definition utils.h:157
Eigen::VectorXd compute_numerical_derivative(const Eigen::DenseBase< Derived > ×, const Eigen::DenseBase< Derived > &values)
Definition utils.h:1177
auto fft2(Eigen::DenseBase< Derived > &in, fftw_plan_t &plan, fftw_complex *a, fftw_complex *b)
Definition utils.h:270
static const std::string current_date_time()
Definition utils.h:91
static double pivot_select(std::vector< double > input, int index)
Definition utils.h:463
auto fft(Eigen::DenseBase< Derived > &in, std::string parallel_policy)
Definition utils.h:205
static auto hanning_window(Eigen::Index n_rows, Eigen::Index n_cols)
Definition utils.h:442
static const int parseLine(char *line)
Definition utils.h:44
static const std::string unix_to_utc(double &t)
Definition utils.h:102
auto calc_2D_psd(Eigen::DenseBase< DerivedA > &data, Eigen::DenseBase< DerivedB > &y, Eigen::DenseBase< DerivedB > &x, int smooth_window, std::string parallel_policy)
Definition utils.h:685
auto make_meshgrid(const Eigen::DenseBase< Derived > &x, const Eigen::DenseBase< Derived > &y)
Definition utils.h:177
FFTDirection
Definition utils.h:198
@ forward
Definition utils.h:199
@ inverse
Definition utils.h:200
static const double planck_nu(const double freq_Hz, const double T_K)
Definition utils.h:72
void smooth(Eigen::DenseBase< DerivedA > &in, Eigen::DenseBase< DerivedB > &out, int w)
Definition utils.h:641
auto calc_std_dev(Eigen::DenseBase< DerivedA > &data)
Definition utils.h:336
Definition timestream.h:59
An RAII class to report the lifetime of itself.
Definition utils.h:1147
double * elapsed_msec
Definition utils.h:1170
std::chrono::time_point< std::chrono::high_resolution_clock > t0
Definition utils.h:1168
~scoped_timeit()
Definition utils.h:1152
auto operator=(scoped_timeit &&) -> scoped_timeit &=delete
scoped_timeit(const scoped_timeit &)=delete
scoped_timeit(scoped_timeit &&)=delete
std::shared_ptr< spdlog::logger > logger
Definition utils.h:1171
std::string_view msg
Definition utils.h:1169
auto operator=(const scoped_timeit &) -> scoped_timeit &=delete
scoped_timeit(std::string_view msg_, double *elapsed_msec_=nullptr)
Definition utils.h:1148