Citlali
Loading...
Searching...
No Matches
diagnostics.h
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <map>
5
6#include <Eigen/Core>
7
9
11
12namespace engine {
13
15public:
16 std::map<std::string, Eigen::MatrixXd> stats;
17
18 // adc snap data
19 std::vector<Eigen::Matrix<short, Eigen::Dynamic, Eigen::Dynamic>> adc_snap_data;
20
21 // sample rate
22 double fsmp;
23
24 // write evals?
26
27 // number of histogram bins
28 int n_hist_bins = 50;
29
30 // header for det stats data
31 std::vector<std::string> det_stats_header = {
32 "rms",
33 "stddev",
34 "median",
35 "flagged_frac",
36 "weights",
37 };
38
39 // header for group stats data
40 std::vector<std::string> grp_stats_header = {
41 "median_weights"
42 };
43
44 // store eigenvalues
45 std::map<Eigen::Index, std::vector<std::vector<Eigen::VectorXd>>> evals;
46
47 // calc basic stats
48 template <timestream::TCDataKind tcdata_kind>
50
51 // calc detector histograms
52 template <timestream::TCDataKind tcdata_kind>
54
55 // calc detector psds
56 template <timestream::TCDataKind tcdata_kind>
58};
59
60template <timestream::TCDataKind tcdata_kind>
62 Eigen::Index n_pts = in.scans.data.rows();
63 Eigen::Index n_dets = in.scans.data.cols();
64
65 for (Eigen::Index i=0; i<n_dets; ++i) {
66 // make Eigen::Maps for each detector's scan
67 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, 1>> scans(
68 in.scans.data.col(i).data(), in.scans.data.rows());
69 Eigen::Map<Eigen::Matrix<bool, Eigen::Dynamic, 1>> flags(
70 in.flags.data.col(i).data(), in.flags.data.rows());
71 // calc rms
72 stats["rms"](i,in.index.data) = engine_utils::calc_rms(scans);
73 // calc stddev
74 stats["stddev"](i,in.index.data) = engine_utils::calc_std_dev(scans);
75 // calc median
76 stats["median"](i,in.index.data) = tula::alg::median(scans);
77 // fraction of detectors that were flagged
78 stats["flagged_frac"](i,in.index.data) = flags.cast<double>().sum()/static_cast<double>(n_pts);
79 }
80
81 if (in.weights.data.size()!=0) {
82 // add weights
83 stats["weights"].col(in.index.data) = in.weights.data;
84 //stats["median_weights"].col(in.index.data) = Eigen::Map<Eigen::VectorXd>(in.median_weights.data(),in.median_weights.size());
85 }
86
87 // add eigenvalues
88 if (write_evals) {
89 evals[in.index.data] = in.evals.data;
90 }
91}
92
93template <timestream::TCDataKind tcdata_kind>
95 for (Eigen::Index i=0; i<in.scans.data.cols(); ++i) {
96 // get data for detector
97 Eigen::VectorXd scan = in.scans.data.col(i);
98 // calculate histogram
99 auto [h, h_bins] = engine_utils::calc_hist(scan, n_hist_bins);
100 }
101}
102
103template <timestream::TCDataKind tcdata_kind>
105 /*
106 // number of samples
107 unsigned long n_pts = in.scans.data.rows();
108
109 // make sure its even
110 if (n_pts % 2 == 1) {
111 n_pts--;
112 }
113
114 // containers for frequency domain
115 Eigen::Index n_freqs = n_pts / 2 + 1; // number of one sided freq bins
116 double d_freq = telescope.d_fsmp / n_pts;
117
118 Eigen::VectorXd psd_freq = d_freq * Eigen::VectorXd::LinSpaced(n_freqs, 0, n_pts / 2);
119
120 // hanning window
121 Eigen::VectorXd hanning = (0.5 - 0.5 * Eigen::ArrayXd::LinSpaced(n_pts, 0, 2.0 * pi / n_pts * (n_pts - 1)).cos());
122
123 // loop through detectors
124 for (Eigen::Index i=0; i<in.scans.data.cols(); ++i) {
125
126 // get data for detector
127 Eigen::VectorXd scan = in.scans.data.col(i).array()*hanning.array();
128
129 //scan.noalias() = (scan.array()*hanning.array()).matrix();
130
131 // setup fft
132 // set up fftw
133 fftw_complex *a;
134 fftw_complex *b;
135 fftw_plan pf, pr;
136
137 // allocate space for 2d ffts
138 a = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*n_rows*n_cols);
139 b = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*n_rows*n_cols);
140
141 // fftw plans
142 pf = fftw_plan_dft_2d(n_rows, n_cols, a, b, FFTW_FORWARD, FFTW_ESTIMATE);
143 pr = fftw_plan_dft_2d(n_rows, n_cols, a, b, FFTW_BACKWARD, FFTW_ESTIMATE);
144
145 // vector to hold fft data
146 Eigen::VectorXcd freqdata;
147
148 // do fft
149 fft.fwd(freqdata, scan.head(n_pts));
150 // calc psd
151 Eigen::VectorXd psd = freqdata.cwiseAbs2() / d_freq / n_pts / telescope.d_fsmp;
152 // account for negative freqs
153 psd.segment(1, n_freqs - 2) *= 2.;
154
155 Eigen::VectorXd smoothed_psd(psd.size());
156 engine_utils::smooth<engine_utils::SmoothType::edge_truncate>(psd, smoothed_psd, omb.smooth_window);
157 psd = std::move(smoothed_psd);
158
159 }*/
160}
161} // namespace engine
Definition diagnostics.h:14
std::map< Eigen::Index, std::vector< std::vector< Eigen::VectorXd > > > evals
Definition diagnostics.h:45
int n_hist_bins
Definition diagnostics.h:28
bool write_evals
Definition diagnostics.h:25
void calc_tod_hist(timestream::TCData< tcdata_kind, Eigen::MatrixXd > &)
Definition diagnostics.h:94
std::vector< std::string > grp_stats_header
Definition diagnostics.h:40
void calc_stats(timestream::TCData< tcdata_kind, Eigen::MatrixXd > &)
Definition diagnostics.h:61
double fsmp
Definition diagnostics.h:22
std::map< std::string, Eigen::MatrixXd > stats
Definition diagnostics.h:16
void calc_tod_psd(timestream::TCData< tcdata_kind, Eigen::MatrixXd > &)
Definition diagnostics.h:104
std::vector< std::string > det_stats_header
Definition diagnostics.h:31
std::vector< Eigen::Matrix< short, Eigen::Dynamic, Eigen::Dynamic > > adc_snap_data
Definition diagnostics.h:19
auto calc_rms(Eigen::DenseBase< DerivedA > &data)
Definition utils.h:389
auto calc_hist(Eigen::DenseBase< Derived > &data, int n_bins)
Definition utils.h:842
auto calc_std_dev(Eigen::DenseBase< DerivedA > &data)
Definition utils.h:336
Definition calib.h:12
TC data class.
Definition timestream.h:55