Citlali
Loading...
Searching...
No Matches
gaussian_filter.h
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4
5#include <boost/math/special_functions/bessel.hpp>
6
7#include <Eigen/Core>
8#include <unsupported/Eigen/CXX11/Tensor>
9#include <unsupported/Eigen/Splines>
10
11#include <tula/algorithm/mlinterp/mlinterp.hpp>
12#include <tula/logging.h>
13
16
20
22 // get logger
23 std::shared_ptr<spdlog::logger> logger = spdlog::get("citlali_logger");
24
25 // fwhms for gaussian template
26 std::map<std::string, double> template_fwhm_rad;
27
28 // size of maps
30
31 // filter template
32 Eigen::MatrixXd filter_template;
33
34 // get config file
35 template <typename config_t>
36 void get_config(config_t &, std::vector<std::vector<std::string>> &, std::vector<std::vector<std::string>> &);
37
38 // make a symmetric Gaussian to use as a template
39 template<class MB>
40 void make_gaussian_template(MB &mb, const double);
41
42 template<class MB>
43 void filter(MB &, const int);
44};
45
46// get config file
47template <typename config_t>
48void GaussianFilter::get_config(config_t &config, std::vector<std::vector<std::string>> &missing_keys,
49 std::vector<std::vector<std::string>> &invalid_keys) {
50
51 // for array names
52 engine_utils::toltecIO toltec_io;
53
54 // loop through array names and get fwhms
55 for (auto const& [arr_index, arr_name] : toltec_io.array_name_map) {
56 get_config_value(config, template_fwhm_rad[arr_name], missing_keys, invalid_keys,
57 std::tuple{"wiener_filter","template_fwhm_arcsec",arr_name});
58 }
59 // convert to radians
60 for (auto const& pair : template_fwhm_rad) {
61 template_fwhm_rad[pair.first] = template_fwhm_rad[pair.first]*ASEC_TO_RAD;
62 }
63}
64
65template<class MB>
66void GaussianFilter::make_gaussian_template(MB &mb, const double template_fwhm_rad) {
67 // distance from tangent point
68 Eigen::MatrixXd dist(n_rows,n_cols);
69
70 // calculate distance
71 for (Eigen::Index i=0; i<n_rows; ++i) {
72 for (Eigen::Index j=0; j<n_cols; ++j) {
73 dist(i,j) = sqrt(pow(mb.rows_tan_vec(i)+0.5*mb.pixel_size_rad,2) + pow(mb.cols_tan_vec(j)+0.5*mb.pixel_size_rad,2));
74 }
75 }
76
77 // to hold minimum distance
78 Eigen::Index row_index, col_index;
79
80 // minimum distance
81 double min_dist = dist.minCoeff(&row_index,&col_index);
82 // standard deviation
83 double sigma = template_fwhm_rad*FWHM_TO_STD;
84
85 // shift indices
86 std::vector<Eigen::Index> shift_indices = {-row_index, -col_index};
87
88 // calculate template
89 filter_template = exp(-0.5 * pow(dist.array() / sigma, 2.));
90 // shift template
92}
93
94template<class MB>
95void WienerFilter::run_gaussian_filter(MB &mb, const int map_index) {
96 // set up fftw
97 fftw_complex *a;
98 fftw_complex *b;
99 fftw_plan pf, pr;
100
101 // allocate space for 2d ffts
102 a = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*n_rows*n_cols);
103 b = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*n_rows*n_cols);
104
105 // fftw plans
106 pf = fftw_plan_dft_2d(n_rows, n_cols, a, b, FFTW_FORWARD, FFTW_ESTIMATE);
107 pr = fftw_plan_dft_2d(n_rows, n_cols, a, b, FFTW_BACKWARD, FFTW_ESTIMATE);
108
109 // inputs and outputs to ffts
110 Eigen::MatrixXcd in(n_rows,n_cols), out(n_rows,n_cols);
111
112 in.real() = filter_template;
113 in.imag().setZero();
114
115 // fft(f(x))
116 out = engine_utils::fft2<engine_utils::forward>(in, pf, a, b);
117
118 Eigen::MatrixXcd fft_filter = out;
119
120 in.real() = filtered_map;
121 in.imag().setZero();
122
123 out = engine_utils::fft2<engine_utils::forward>(in, pf, a, b);
124
125 // fft(f(x)) x fft(Q) (convolution)
126 in.real() = out.real().array() * fft_filter.real().array() + out.imag().array() * fft_filter.imag().array();
127 in.imag() = -out.imag().array() * fft_filter.real().array() + out.real().array() * fft_filter.imag().array();
128
129 out = engine_utils::fft2<engine_utils::inverse>(in, pr, a, b);
130
131 nume = out.real();
132
133 // free fftw vectors
134 fftw_free(a);
135 fftw_free(b);
136
137 // destroy fftw plans
138 fftw_destroy_plan(pf);
139 fftw_destroy_plan(pr);
140}
Definition gaussian_filter.h:21
void get_config(config_t &, std::vector< std::vector< std::string > > &, std::vector< std::vector< std::string > > &)
Definition gaussian_filter.h:48
Eigen::MatrixXd filter_template
Definition gaussian_filter.h:32
void filter(MB &, const int)
int n_rows
Definition gaussian_filter.h:29
std::shared_ptr< spdlog::logger > logger
Definition gaussian_filter.h:23
void make_gaussian_template(MB &mb, const double)
Definition gaussian_filter.h:66
int n_cols
Definition gaussian_filter.h:29
std::map< std::string, double > template_fwhm_rad
Definition gaussian_filter.h:26
Definition toltec_io.h:10
std::map< Eigen::Index, std::string > array_name_map
Definition toltec_io.h:54
void get_config_value(config_t config, param_t &param, key_vec_t &missing_keys, key_vec_t &invalid_keys, option_t option, std::vector< param_t > allowed={}, std::vector< param_t > min_val={}, std::vector< param_t > max_val={})
Definition config.h:58
#define FWHM_TO_STD
Definition constants.h:48
#define ASEC_TO_RAD
Definition constants.h:33
auto shift_2D(Eigen::DenseBase< Derived > &in, std::vector< Eigen::Index > shift_indices)
Definition utils.h:882