38 Eigen::DenseBase<Derived> &map_indices, std::string &pixel_axes, calib_t &calib,
double d_fsmp,
39 bool run_omb,
bool run_noise) {
41 const bool use_cmb = !cmb.noise.empty();
42 const bool use_omb = !omb.noise.empty();
43 const bool run_kernel = !omb.kernel.empty();
44 const bool run_coverage = !omb.coverage.empty();
46 Eigen::Index n_pixels = omb.n_rows * omb.n_cols;
48 for (Eigen::Index arr=0; arr<calib.n_arrays; ++arr) {
49 logger->info(
"making map for array {}/{}",arr + 1,calib.n_arrays);
50 auto array = calib.arrays[arr];
51 Eigen::Index map_index = arr;
54 Eigen::Index start = std::get<0>(calib.array_limits[array]);
56 Eigen::Index end = std::get<1>(calib.array_limits[array]);
59 Eigen::Index n_good_det = (calib.apt[
"flag"](Eigen::seq(std::get<0>(calib.array_limits[array]),
60 std::get<1>(calib.array_limits[array])-1)).array()==0).count();
69 Eigen::Index n_pts = n_good_det*in.scans.data.rows();
71 logger->info(
"start {} end {} n_pts {} n_pixels {} n_good_det {} n_rows {}", start, end, n_pts, n_pixels, n_good_det, in.scans.data.rows());
74 Eigen::VectorXd b(n_pts), b2(n_pts);
76 Eigen::SparseMatrix<double> A(n_pts,n_pixels);
79 std::vector<Eigen::Triplet<double>> triplet_list;
80 triplet_list.reserve(n_pts);
85 for (Eigen::Index i=start; i<end; ++i) {
87 if (calib.apt[
"flag"](det_index)==0) {
90 pixel_axes, in.pointing_offsets_arcsec.data, omb.map_grouping);
93 Eigen::VectorXd omb_irow = lat.array()/omb.pixel_size_rad + (omb.n_rows)/2.;
94 Eigen::VectorXd omb_icol = lon.array()/omb.pixel_size_rad + (omb.n_cols)/2.;
97 for (Eigen::Index j=0; j<in.scans.data.rows(); ++j) {
98 Eigen::Index omb_ir = omb_irow(j);
99 Eigen::Index omb_ic = omb_icol(j);
100 Eigen::Index index = omb.n_rows * omb_ic + omb_ir;
102 triplet_list.push_back(Eigen::Triplet<double>(j + k,index,in.weights.data(i)));
105 b.segment(k,in.scans.data.rows()) = in.scans.data.col(i)*in.weights.data(i);
109 b2.segment(k,in.scans.data.rows()) = in.kernel.data.col(i)*in.weights.data(i);
112 k += in.scans.data.rows();
117 A.setFromTriplets(triplet_list.begin(), triplet_list.end());
119 logger->info(
"running conjugate gradient for array {}/{}", arr + 1, calib.n_arrays);
122 Eigen::LeastSquaresConjugateGradient<Eigen::SparseMatrix<double> > cg;
130 auto x = cg.solve(b).eval();
132 omb.signal[map_index] += Eigen::Map<Eigen::MatrixXd>(x.data(),omb.n_rows, omb.n_cols);
133 logger->info(
"signal iterations {}",cg.iterations());
134 logger->info(
"signal error {}",cg.error());
135 logger->info(
"signal[{}] {}",map_index,omb.signal[map_index]);
139 x = cg.solve(b2).eval();
141 omb.kernel[map_index] += Eigen::Map<Eigen::MatrixXd>(x.data(),omb.n_rows, omb.n_cols);
142 logger->info(
"kernel iterations {}",cg.iterations());
143 logger->info(
"kernel error {}",cg.error());
144 logger->info(
"kernel[{}] {}",map_index,omb.signal[map_index]);
149 x = cg.solve(b2).eval();
151 omb.weight[map_index] += Eigen::Map<Eigen::MatrixXd>(x.data(),omb.n_rows, omb.n_cols);
152 logger->info(
"weight iterations {}",cg.iterations());
153 logger->info(
"weight error {}",cg.error());
154 logger->info(
"weight[{}] {}",map_index,omb.signal[map_index]);