212 map_buffer_t &omb, map_buffer_t &cmb, Eigen::DenseBase<Derived> &map_indices,
213 std::string &pixel_axes, apt_t &apt,
double d_fsmp,
bool run_omb,
bool run_noise) {
215 const bool use_cmb = !cmb.noise.empty();
216 const bool use_omb = !omb.noise.empty();
217 const bool run_kernel = !omb.kernel.empty();
218 const bool run_coverage = !omb.coverage.empty();
219 const bool run_hwpr = in.hwpr_angle.data.size()!=0;
222 Eigen::Index n_dets = in.scans.data.cols();
223 Eigen::Index n_pts = in.scans.data.rows();
226 int step = omb.pointing.size();
228 map_buffer_t omb_copy;
229 omb_copy.n_rows = omb.n_rows;
230 omb_copy.n_cols = omb.n_cols;
232 for (Eigen::Index i=0; i<omb.signal.size(); ++i) {
234 omb_copy.signal.emplace_back(Eigen::MatrixXd::Zero(omb.n_rows, omb.n_cols));
235 omb_copy.weight.emplace_back(Eigen::MatrixXd::Zero(omb.n_rows, omb.n_cols));
239 omb_copy.coverage.emplace_back(Eigen::MatrixXd::Zero(omb.n_rows, omb.n_cols));
243 omb_copy.kernel.emplace_back(Eigen::MatrixXd::Zero(omb.n_rows, omb.n_cols));
249 omb_copy.noise = omb.noise;
250 for (Eigen::Index i=0; i<omb.signal.size(); ++i) {
251 omb_copy.noise[i].setZero();
255 map_buffer_t cmb_copy;
258 cmb_copy.n_rows = cmb.n_rows;
259 cmb_copy.n_cols = cmb.n_cols;
261 cmb_copy.noise = cmb.noise;
263 for (Eigen::Index i=0; i<cmb.noise.size(); ++i) {
264 cmb_copy.noise[i].setZero();
269 map_buffer_t *nmb, *nmb_copy;
272 nmb = use_cmb ? &cmb : (use_omb ? &omb :
nullptr);
273 nmb_copy = use_cmb ? &cmb_copy : (use_omb ? &omb_copy :
nullptr);
280 for (Eigen::Index i=0; i<n_dets; ++i) {
290 if ((in.flags.data.col(i).array()==
false).any()) {
295 Eigen::Index map_index = map_indices(i);
297 int q_index = map_index + step;
298 int u_index = map_index + 2 * step;
299 Eigen::Index array_index = apt[
"array"](det_index);
302 Eigen::Index mat_rows_center = (mat_rows - 1.)/2.;
303 Eigen::Index mat_cols_center = (mat_cols - 1.)/2.;
307 pixel_axes, in.pointing_offsets_arcsec.data, omb.map_grouping);
310 Eigen::VectorXd omb_irow = lat.array()/omb.pixel_size_rad + (omb.n_rows)/2.;
311 Eigen::VectorXd omb_icol = lon.array()/omb.pixel_size_rad + (omb.n_cols)/2.;
313 Eigen::VectorXd cmb_irow, cmb_icol;
316 cmb_irow = lat.array()/cmb.pixel_size_rad + (cmb.n_rows)/2.;
317 cmb_icol = lon.array()/cmb.pixel_size_rad + (cmb.n_cols)/2.;
327 Eigen::Index nmb_ir, nmb_ic;
330 double angle, cos_2angle, sin_2angle;
333 for (Eigen::Index j=0; j<n_pts; ++j) {
335 if (!in.flags.data(j,i)) {
336 Eigen::Index omb_ir = omb_irow(j);
337 Eigen::Index omb_ic = omb_icol(j);
340 auto fg_index = apt[
"fg"](det_index);
342 angle = 2*in.hwpr_angle.data(j) - (in.angle.data(j) +
fgs[fg_index] +
install_ang[array_index]);
345 angle = in.angle.data(j) +
fgs[fg_index] +
install_ang[array_index];
348 cos_2angle = cos(2.*angle);
349 sin_2angle = sin(2.*angle);
354 if ((omb_ir >= 0) && (omb_ir < omb.n_rows) && (omb_ic >= 0) && (omb_ic < omb.n_cols)) {
356 int lower_row = omb_ir - mat_rows_center;
357 int upper_row = omb_ir + mat_rows - 1 - mat_rows_center;
358 int lower_col = omb_ic - mat_cols_center;
359 int upper_col = omb_ic + mat_cols - 1 - mat_cols_center;
361 int jinc_lower_row = abs(std::min(0, lower_row));
362 int jinc_lower_col = abs(std::min(0, lower_col));
364 lower_row = std::max(0,lower_row);
365 upper_row = std::min(
static_cast<int>(omb.n_rows - 1),upper_row);
366 lower_col = std::max(0,lower_col);
367 upper_col = std::min(
static_cast<int>(omb.n_cols - 1),upper_col);
369 int size_rows = upper_row - lower_row + 1;
370 int size_cols = upper_col - lower_col + 1;
372 const auto mat_block =
jinc_weights_mat[array_index].block(jinc_lower_row,jinc_lower_col,size_rows,size_cols);
374 auto sig_block = omb_copy.signal[map_index].block(lower_row,lower_col,size_rows,size_cols);
375 auto wt_block = omb_copy.weight[map_index].block(lower_row,lower_col,size_rows,size_cols);
378 sig_block += (mat_block * in.weights.data(i) * in.scans.data(j,i)).eval();
381 wt_block += (mat_block * in.weights.data(i)).eval();
385 auto cov_block = omb_copy.coverage[map_index].block(lower_row,lower_col,size_rows,size_cols);
386 cov_block += mat_block/d_fsmp;
391 auto ker_block = omb_copy.kernel[map_index].block(lower_row,lower_col,size_rows,size_cols);
392 ker_block += mat_block*in.weights.data(i)*in.kernel.data(j,i);
401 nmb_ir = cmb_irow(j);
402 nmb_ic = cmb_icol(j);
407 nmb_ir = omb_irow(j);
408 nmb_ic = omb_icol(j);
412 if ((nmb_ir >= 0) && (nmb_ir < nmb->n_rows) && (nmb_ic >= 0) && (nmb_ic < nmb->n_cols)) {
414 int lower_row = nmb_ir - mat_rows_center;
415 int upper_row = nmb_ir + mat_rows - 1 - mat_rows_center;
416 int lower_col = nmb_ic - mat_cols_center;
417 int upper_col = nmb_ic + mat_cols - 1 - mat_cols_center;
419 int jinc_lower_row = abs(std::min(0, lower_row));
420 int jinc_lower_col = abs(std::min(0, lower_col));
422 lower_row = std::max(0,lower_row);
423 upper_row = std::min(
static_cast<int>(nmb->n_rows - 1),upper_row);
424 lower_col = std::max(0,lower_col);
425 upper_col = std::min(
static_cast<int>(nmb->n_cols - 1),upper_col);
427 int size_rows = upper_row - lower_row + 1;
428 int size_cols = upper_col - lower_col + 1;
430 const auto mat_block =
jinc_weights_mat[array_index].block(jinc_lower_row,jinc_lower_col,size_rows,size_cols);
431 signal = in.scans.data(j,i)*in.weights.data(i);
433 for (Eigen::Index nn=0; nn<nmb->n_noise; ++nn) {
435 if (nmb->randomize_dets) {
436 noise_v = in.noise.data(nn,i)*signal;
439 noise_v = in.noise.data(nn)*signal;
441 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>> noise_matrix(nmb_copy->noise[map_index].data() + nn * nmb->n_rows * nmb->n_cols,
442 nmb->n_rows, nmb->n_cols);
443 auto noise_block = noise_matrix.block(lower_row,lower_col,size_rows,size_cols);
444 noise_block += mat_block*noise_v;
456 for (
int i=0; i<omb.signal.size(); ++i) {
457 omb.signal[i] += omb_copy.signal[i];
458 omb.weight[i] += omb_copy.weight[i];
461 omb.coverage[i] += omb_copy.coverage[i];
465 omb.kernel[i] += omb_copy.kernel[i];
471 for (
int i=0; i<nmb->noise.size(); ++i) {
472 nmb->noise[i] += nmb_copy->noise[i];
486 map_buffer_t &omb, map_buffer_t &cmb, Eigen::DenseBase<Derived> &map_indices,
487 std::string &pixel_axes, apt_t &apt,
double d_fsmp,
bool run_omb,
bool run_noise) {
489 const bool use_cmb = !cmb.noise.empty();
490 const bool use_omb = !omb.noise.empty();
491 const bool run_kernel = !omb.kernel.empty();
492 const bool run_coverage = !omb.coverage.empty();
493 const bool run_hwpr = in.hwpr_angle.data.size()!=0;
496 Eigen::Index n_dets = in.scans.data.cols();
497 Eigen::Index n_pts = in.scans.data.rows();
500 int step = omb.pointing.size();
506 nmb = use_cmb ? &cmb : (use_omb ? &omb :
nullptr);
513 std::vector<int> map_in_vec, map_out_vec;
514 map_in_vec.resize(omb.signal.size());
515 std::iota(map_in_vec.begin(), map_in_vec.end(), 0);
516 map_out_vec.resize(map_in_vec.size());
520 grppi::map(tula::grppi_utils::dyn_ex(omb.parallel_policy), map_in_vec, map_out_vec, [&](
auto i) {
522 if (run_polarization && apt[
"fg"](i)==-1) {
530 if ((in.flags.data.col(i).array()==
false).any()) {
535 Eigen::Index map_index = map_indices(i);
537 int q_index = map_index + step;
538 int u_index = map_index + 2 * step;
539 Eigen::Index array_index = apt[
"array"](det_index);
540 Eigen::Index mat_rows = jinc_weights_mat[array_index].rows();
541 Eigen::Index mat_cols = jinc_weights_mat[array_index].cols();
542 Eigen::Index mat_rows_center = (mat_rows - 1.)/2.;
543 Eigen::Index mat_cols_center = (mat_cols - 1.)/2.;
546 auto [lat, lon] = engine_utils::calc_det_pointing(in.tel_data.data, apt[
"x_t"](det_index), apt[
"y_t"](det_index),
547 pixel_axes, in.pointing_offsets_arcsec.data, omb.map_grouping);
550 Eigen::VectorXd omb_irow = lat.array()/omb.pixel_size_rad + (omb.n_rows)/2.;
551 Eigen::VectorXd omb_icol = lon.array()/omb.pixel_size_rad + (omb.n_cols)/2.;
553 Eigen::VectorXd cmb_irow, cmb_icol;
556 cmb_irow = lat.array()/cmb.pixel_size_rad + (cmb.n_rows)/2.;
557 cmb_icol = lon.array()/cmb.pixel_size_rad + (cmb.n_cols)/2.;
567 Eigen::Index nmb_ir, nmb_ic;
570 double angle, cos_2angle, sin_2angle;
573 for (Eigen::Index j=0; j<n_pts; ++j) {
575 if (!in.flags.data(j,i)) {
576 Eigen::Index omb_ir = omb_irow(j);
577 Eigen::Index omb_ic = omb_icol(j);
580 auto fg_index = apt[
"fg"](det_index);
582 angle = 2*in.hwpr_angle.data(j) - (in.angle.data(j) +
fgs[fg_index] +
install_ang[array_index]);
585 angle = in.angle.data(j) +
fgs[fg_index] +
install_ang[array_index];
588 cos_2angle = cos(2.*angle);
589 sin_2angle = sin(2.*angle);
594 if ((omb_ir >= 0) && (omb_ir < omb.n_rows) && (omb_ic >= 0) && (omb_ic < omb.n_cols)) {
596 int lower_row = omb_ir - mat_rows_center;
597 int upper_row = omb_ir + mat_rows - 1 - mat_rows_center;
598 int lower_col = omb_ic - mat_cols_center;
599 int upper_col = omb_ic + mat_cols - 1 - mat_cols_center;
601 int jinc_lower_row = abs(std::min(0, lower_row));
602 int jinc_lower_col = abs(std::min(0, lower_col));
604 lower_row = std::max(0,lower_row);
605 upper_row = std::min(
static_cast<int>(omb.n_rows - 1),upper_row);
606 lower_col = std::max(0,lower_col);
607 upper_col = std::min(
static_cast<int>(omb.n_cols - 1),upper_col);
609 int size_rows = upper_row - lower_row + 1;
610 int size_cols = upper_col - lower_col + 1;
612 const auto mat_block =
jinc_weights_mat[array_index].block(jinc_lower_row,jinc_lower_col,size_rows,size_cols);
614 auto sig_block = omb.signal[map_index].block(lower_row,lower_col,size_rows,size_cols);
615 auto wt_block = omb.weight[map_index].block(lower_row,lower_col,size_rows,size_cols);
618 sig_block += (mat_block * in.weights.data(i) * in.scans.data(j,i)).eval();
621 wt_block += (mat_block * in.weights.data(i)).eval();
625 auto cov_block = omb.coverage[map_index].block(lower_row,lower_col,size_rows,size_cols);
626 cov_block += mat_block/d_fsmp;
631 auto ker_block = omb.kernel[map_index].block(lower_row,lower_col,size_rows,size_cols);
632 ker_block += mat_block*in.weights.data(i)*in.kernel.data(j,i);
641 nmb_ir = cmb_irow(j);
642 nmb_ic = cmb_icol(j);
647 nmb_ir = omb_irow(j);
648 nmb_ic = omb_icol(j);
652 if ((nmb_ir >= 0) && (nmb_ir < nmb->n_rows) && (nmb_ic >= 0) && (nmb_ic < nmb->n_cols)) {
654 int lower_row = nmb_ir - mat_rows_center;
655 int upper_row = nmb_ir + mat_rows - 1 - mat_rows_center;
656 int lower_col = nmb_ic - mat_cols_center;
657 int upper_col = nmb_ic + mat_cols - 1 - mat_cols_center;
659 int jinc_lower_row = abs(std::min(0, lower_row));
660 int jinc_lower_col = abs(std::min(0, lower_col));
662 lower_row = std::max(0,lower_row);
663 upper_row = std::min(
static_cast<int>(nmb->n_rows - 1),upper_row);
664 lower_col = std::max(0,lower_col);
665 upper_col = std::min(
static_cast<int>(nmb->n_cols - 1),upper_col);
667 int size_rows = upper_row - lower_row + 1;
668 int size_cols = upper_col - lower_col + 1;
670 const auto mat_block =
jinc_weights_mat[array_index].block(jinc_lower_row,jinc_lower_col,size_rows,size_cols);
671 signal = in.scans.data(j,i)*in.weights.data(i);
673 for (Eigen::Index nn=0; nn<nmb->n_noise; ++nn) {
675 if (nmb->randomize_dets) {
676 noise_v = in.noise.data(nn,i)*signal;
679 noise_v = in.noise.data(nn)*signal;
681 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>> noise_matrix(nmb->noise[map_index].data() + nn * nmb->n_rows * nmb->n_cols,
682 nmb->n_rows, nmb->n_cols);
683 auto noise_block = noise_matrix.block(lower_row,lower_col,size_rows,size_cols);
684 noise_block += mat_block*noise_v;