96 map_buffer_t &cmb, Eigen::DenseBase<Derived> &map_indices,
97 std::string &pixel_axes, apt_t &apt,
double d_fsmp,
98 bool run_omb,
bool run_noise) {
100 typedef Eigen::Triplet<double> T;
101 std::vector<std::vector<T>> signals, weights, kernels, coverages;
102 std::vector<std::vector<T>> cmb_signals, cmb_weights, cmb_kernels, cmb_coverages;
104 const bool use_cmb = !cmb.noise.empty();
105 const bool use_omb = !omb.noise.empty();
106 const bool run_kernel = !omb.kernel.empty();
107 const bool run_coverage = !omb.coverage.empty();
108 const bool run_hwpr = in.hwpr_angle.data.size()!=0;
111 signals.resize(omb.signal.size());
112 weights.resize(omb.signal.size());
115 kernels.resize(omb.signal.size());
118 coverages.resize(omb.signal.size());
123 cmb_signals.resize(cmb.signal.size());
124 cmb_weights.resize(cmb.signal.size());
127 cmb_kernels.resize(cmb.signal.size());
130 cmb_coverages.resize(cmb.signal.size());
134 map_buffer_t omb_copy, cmb_copy;
136 map_buffer_t *nmb, *nmb_copy;
138 omb_copy.n_rows = omb.n_rows;
139 omb_copy.n_cols = omb.n_cols;
141 cmb_copy.n_rows = cmb.n_rows;
142 cmb_copy.n_cols = cmb.n_cols;
146 omb_copy.noise = omb.noise;
148 for (Eigen::Index i=0; i<omb.noise.size(); ++i) {
149 omb_copy.noise[i].setZero();
154 cmb_copy.noise = cmb.noise;
156 for (Eigen::Index i=0; i<cmb.noise.size(); ++i) {
157 cmb_copy.noise[i].setZero();
160 nmb = use_cmb ? &cmb : (use_omb ? &omb :
nullptr);
161 nmb_copy = use_cmb ? &cmb_copy : (use_omb ? &omb_copy :
nullptr);
165 int step = omb.pointing.size();
167 if (!omb.pointing.empty() && run_omb) {
168 for (Eigen::Index i=0; i<omb.pointing.size(); ++i) {
169 omb_copy.pointing.emplace_back(Eigen::MatrixXd::Zero(omb.pointing[i].rows(), omb.pointing[i].cols()));
173 if (!cmb.pointing.empty() && run_omb) {
174 for (Eigen::Index i=0; i<cmb.pointing.size(); ++i) {
175 cmb_copy.pointing.emplace_back(Eigen::MatrixXd::Zero(cmb.pointing[i].rows(), cmb.pointing[i].cols()));
180 Eigen::Index n_pts = in.scans.data.rows();
181 Eigen::Index n_dets = in.scans.data.cols();
184 double signal, kernel, noise_v;
187 Eigen::Index nmb_ir, nmb_ic;
190 double angle, cos_2angle, sin_2angle;
195 for (Eigen::Index i=0; i<n_dets; ++i) {
205 if ((in.flags.data.col(i).array()==0).any() && run_det) {
207 Eigen::Index map_index = map_indices(i);
210 int q_index = map_index + step;
211 int u_index = map_index + 2 * step;
214 Eigen::Index array_index = apt[
"array"](i);
217 pixel_axes, in.pointing_offsets_arcsec.data, omb.map_grouping);
223 apt[
"y_t"](i),
"altaz",
224 in.pointing_offsets_arcsec.data,
226 alt = std::get<0>(altaz_tuple);
230 Eigen::VectorXd omb_irow = lat.array()/omb.pixel_size_rad + (omb.n_rows)/2.;
231 Eigen::VectorXd omb_icol = lon.array()/omb.pixel_size_rad + (omb.n_cols)/2.;
233 Eigen::VectorXd cmb_irow, cmb_icol;
236 cmb_irow = lat.array()/cmb.pixel_size_rad + (cmb.n_rows)/2.;
237 cmb_icol = lon.array()/cmb.pixel_size_rad + (cmb.n_cols)/2.;
241 for (Eigen::Index j=0; j<n_pts; ++j) {
243 if (!in.flags.data(j,i)) {
244 Eigen::Index omb_ir = omb_irow(j);
245 Eigen::Index omb_ic = omb_icol(j);
248 auto fg_index = apt[
"fg"](i);
250 angle = 2*in.hwpr_angle.data(j) - (in.angle.data(j) + alt(j) +
fgs[fg_index] +
install_ang[array_index]);
253 angle = in.angle.data(j) + alt(j) +
fgs[fg_index] +
install_ang[array_index];
256 cos_2angle = cos(2.*angle);
257 sin_2angle = sin(2.*angle);
262 if ((omb_ir >= 0) && (omb_ir < omb.n_rows) && (omb_ic >= 0) && (omb_ic < omb.n_cols)) {
264 signal = in.scans.data(j,i)*in.weights.data(i);
265 signals[map_index].push_back(T(omb_ir,omb_ic,signal));
268 weights[map_index].push_back(T(omb_ir,omb_ic,in.weights.data(i)));
272 kernel = in.kernel.data(j,i)*in.weights.data(i);
273 kernels[map_index].push_back(T(omb_ir,omb_ic,kernel));
278 coverages[map_index].push_back(T(omb_ir,omb_ic,1./d_fsmp));
283 allocate_pointing(omb_copy, in.weights.data(i), cos_2angle, sin_2angle, map_index, omb_ir, omb_ic);
286 signals[q_index].push_back(T(omb_ir,omb_ic,signal*cos_2angle));
287 signals[u_index].push_back(T(omb_ir,omb_ic,signal*sin_2angle));
291 kernels[q_index].push_back(T(omb_ir,omb_ic,kernel*cos_2angle));
292 kernels[u_index].push_back(T(omb_ir,omb_ic,kernel*sin_2angle));
299 Eigen::Index cmb_ir = cmb_irow(j);
300 Eigen::Index cmb_ic = cmb_icol(j);
303 if ((cmb_ir >= 0) && (cmb_ir < cmb.n_rows) && (cmb_ic >= 0) && (cmb_ic < cmb.n_cols)) {
305 signal = in.scans.data(j,i)*in.weights.data(i);
306 cmb_signals[map_index].push_back(T(cmb_ir,cmb_ic,signal));
309 cmb_weights[map_index].push_back(T(cmb_ir,cmb_ic,in.weights.data(i)));
313 kernel = in.kernel.data(j,i)*in.weights.data(i);
314 cmb_kernels[map_index].push_back(T(cmb_ir,cmb_ic,kernel));
319 cmb_coverages[map_index].push_back(T(cmb_ir,cmb_ic,1./d_fsmp));
323 allocate_pointing(cmb_copy, in.weights.data(i), cos_2angle, sin_2angle, map_index, cmb_ir, cmb_ic);
326 cmb_signals[q_index].push_back(T(cmb_ir,cmb_ic,signal*cos_2angle));
327 cmb_signals[u_index].push_back(T(cmb_ir,cmb_ic,signal*sin_2angle));
331 cmb_kernels[q_index].push_back(T(cmb_ir,cmb_ic,kernel*cos_2angle));
332 cmb_kernels[u_index].push_back(T(cmb_ir,cmb_ic,kernel*sin_2angle));
341 nmb_ir = cmb_irow(j);
342 nmb_ic = cmb_icol(j);
346 nmb_ir = omb_irow(j);
347 nmb_ic = omb_icol(j);
351 if ((nmb_ir >= 0) && (nmb_ir < nmb->n_rows) && (nmb_ic >= 0) && (nmb_ic < nmb->n_cols)) {
359 for (Eigen::Index nn=0; nn<nmb->n_noise; ++nn) {
361 if (nmb->randomize_dets) {
362 noise_v = in.noise.data(nn,i)*in.scans.data(j,i)*in.weights.data(i);
365 noise_v = in.noise.data(nn)*in.scans.data(j,i)*in.weights.data(i);
368 nmb_copy->noise[map_index](nmb_ir,nmb_ic,nn) += noise_v;
372 nmb_copy->noise[q_index](nmb_ir,nmb_ic,nn) += noise_v*cos_2angle;
374 nmb_copy->noise[u_index](nmb_ir,nmb_ic,nn) += noise_v*sin_2angle;
387 for (
int i=0; i<omb.signal.size(); ++i) {
399 if (!omb.pointing.empty()) {
400 for (
int i=0; i<omb.pointing.size(); ++i) {
401 omb.pointing[i] += omb_copy.pointing[i];
407 for (
int i=0; i<cmb.signal.size(); ++i) {
422 for (
int i=0; i<nmb->noise.size(); ++i) {
423 nmb->noise[i] += nmb_copy->noise[i];
427 if (!cmb.pointing.empty() && run_omb) {
428 for (
int i=0; i<cmb.pointing.size(); ++i) {
429 cmb.pointing[i] += cmb_copy.pointing[i];
440 map_buffer_t &cmb, Eigen::DenseBase<Derived> &map_indices,
441 std::string &pixel_axes, apt_t &apt,
double d_fsmp,
442 bool run_omb,
bool run_noise) {
444 const bool use_cmb = !cmb.noise.empty();
445 const bool use_omb = !omb.noise.empty();
446 const bool run_kernel = !omb.kernel.empty();
447 const bool run_coverage = !omb.coverage.empty();
448 const bool run_hwpr = in.hwpr_angle.data.size()!=0;
455 nmb = use_cmb ? &cmb : (use_omb ? &omb :
nullptr);
459 int step = omb.pointing.size();
462 Eigen::Index n_pts = in.scans.data.rows();
463 Eigen::Index n_dets = in.scans.data.cols();
466 double signal, kernel, noise_v;
469 Eigen::Index nmb_ir, nmb_ic;
472 double angle, cos_2angle, sin_2angle;
478 std::vector<int> map_in_vec, map_out_vec;
479 map_in_vec.resize(omb.signal.size());
480 std::iota(map_in_vec.begin(), map_in_vec.end(), 0);
481 map_out_vec.resize(map_in_vec.size());
485 grppi::map(tula::grppi_utils::dyn_ex(omb.parallel_policy), map_in_vec, map_out_vec, [&](
auto i) {
488 if (run_polarization && apt[
"loc"](i)==-1) {
496 if ((in.flags.data.col(i).array()==0).any() && run_det) {
498 Eigen::Index map_index = map_indices(i);
501 int q_index = map_index + step;
502 int u_index = map_index + 2 * step;
505 Eigen::Index array_index = apt[
"array"](i);
507 auto [lat, lon] = engine_utils::calc_det_pointing(in.tel_data.data, apt[
"x_t"](i), apt[
"y_t"](i),
508 pixel_axes, in.pointing_offsets_arcsec.data, omb.map_grouping);
512 if (run_polarization) {
513 std::tuple<Eigen::VectorXd,Eigen::VectorXd> altaz_tuple = engine_utils::calc_det_pointing(in.tel_data.data, apt[
"x_t"](i),
514 apt[
"y_t"](i),
"altaz",
515 in.pointing_offsets_arcsec.data,
517 alt = std::get<0>(altaz_tuple);
521 Eigen::VectorXd omb_irow = lat.array()/omb.pixel_size_rad + (omb.n_rows)/2.;
522 Eigen::VectorXd omb_icol = lon.array()/omb.pixel_size_rad + (omb.n_cols)/2.;
524 Eigen::VectorXd cmb_irow, cmb_icol;
527 cmb_irow = lat.array()/cmb.pixel_size_rad + (cmb.n_rows)/2.;
528 cmb_icol = lon.array()/cmb.pixel_size_rad + (cmb.n_cols)/2.;
532 for (Eigen::Index j=0; j<n_pts; ++j) {
534 if (!in.flags.data(j,i)) {
535 Eigen::Index omb_ir = omb_irow(j);
536 Eigen::Index omb_ic = omb_icol(j);
539 auto fg_index = apt[
"fg"](i);
541 angle = 2*in.hwpr_angle.data(j) - (in.angle.data(j) + alt(j) +
fgs[fg_index] +
install_ang[array_index]);
544 angle = in.angle.data(j) + alt(j) +
fgs[fg_index] +
install_ang[array_index];
547 cos_2angle = cos(2.*angle);
548 sin_2angle = sin(2.*angle);
553 if ((omb_ir >= 0) && (omb_ir < omb.n_rows) && (omb_ic >= 0) && (omb_ic < omb.n_cols)) {
555 signal = in.scans.data(j,i)*in.weights.data(i);
556 omb.signal[map_index](omb_ir, omb_ic) += signal;
561 omb.weight[map_index](omb_ir, omb_ic) += in.weights.data(i);
565 kernel = in.kernel.data(j,i)*in.weights.data(i);
567 omb.kernel[map_index](omb_ir, omb_ic) += kernel;
573 omb.coverage[map_index](omb_ir, omb_ic) += 1./d_fsmp;
578 allocate_pointing(omb, in.weights.data(i), cos_2angle, sin_2angle, map_index, omb_ir, omb_ic);
584 omb.signal[q_index](omb_ir, omb_ic) += signal*cos_2angle;
585 omb.signal[u_index](omb_ir, omb_ic) += signal*sin_2angle;
592 omb.kernel[q_index](omb_ir, omb_ic) += kernel*cos_2angle;
593 omb.kernel[u_index](omb_ir, omb_ic) += kernel*sin_2angle;
600 Eigen::Index cmb_ir = cmb_irow(j);
601 Eigen::Index cmb_ic = cmb_icol(j);
604 if ((cmb_ir >= 0) && (cmb_ir < cmb.n_rows) && (cmb_ic >= 0) && (cmb_ic < cmb.n_cols)) {
606 signal = in.scans.data(j,i)*in.weights.data(i);
608 cmb.signal[map_index](cmb_ir, cmb_ic) += signal;
612 cmb.weight[map_index](cmb_ir, cmb_ic) += in.weights.data(i);
616 kernel = in.kernel.data(j,i)*in.weights.data(i);
618 cmb.kernel[map_index](cmb_ir, cmb_ic) += kernel;
624 cmb.coverage[map_index](cmb_ir, cmb_ic) += 1./d_fsmp;
628 allocate_pointing(cmb, in.weights.data(i), cos_2angle, sin_2angle, map_index, cmb_ir, cmb_ic);
634 cmb.signal[q_index](cmb_ir, cmb_ic) += signal*cos_2angle;
635 cmb.signal[u_index](cmb_ir, cmb_ic) += signal*sin_2angle;
642 cmb.kernel[q_index](cmb_ir, cmb_ic) += kernel*cos_2angle;
643 cmb.kernel[u_index](cmb_ir, cmb_ic) += kernel*sin_2angle;
652 nmb_ir = cmb_irow(j);
653 nmb_ic = cmb_icol(j);
657 nmb_ir = omb_irow(j);
658 nmb_ic = omb_icol(j);
662 if ((nmb_ir >= 0) && (nmb_ir < nmb->n_rows) && (nmb_ic >= 0) && (nmb_ic < nmb->n_cols)) {
670 for (Eigen::Index nn=0; nn<nmb->n_noise; ++nn) {
672 if (nmb->randomize_dets) {
673 noise_v = in.noise.data(nn,i)*in.scans.data(j,i)*in.weights.data(i);
676 noise_v = in.noise.data(nn)*in.scans.data(j,i)*in.weights.data(i);
679 nmb->noise[map_index](nmb_ir,nmb_ic,nn) += noise_v;
683 nmb->noise[q_index](nmb_ir,nmb_ic,nn) += noise_v*cos_2angle;
685 nmb->noise[u_index](nmb_ir,nmb_ic,nn) += noise_v*sin_2angle;