Citlali
Loading...
Searching...
No Matches
naive_mm.h
Go to the documentation of this file.
1#pragma once
2
3#include <thread>
4#include <mutex>
5
6#include <Eigen/Sparse>
7
9
12
14
15// selects the type of TCData
16using timestream::TCDataKind;
17
18namespace mapmaking {
19
21public:
22 // get logger
23 std::shared_ptr<spdlog::logger> logger = spdlog::get("citlali_logger");
24 std::unique_ptr<std::mutex> naive_mutex = std::make_unique<std::mutex>();
25
26 // toltec array mounting angle
27 std::map<int, double> install_ang = {
28 {-1,-1},
29 {0,pi/2},
30 {1,-pi/2},
31 {2,-pi/2},
32 };
33
34 // toltec detector orientation angles
35 std::map<int, double> fgs = {
36 {-1,-1},
37 {0,0},
38 {1,pi/4},
39 {2,pi/2},
40 {3,3*pi/4}
41 };
42
43 template <typename Derived>
44 void add_sparse_to_dense(std::vector<Eigen::Triplet<double>> &triplets, Eigen::DenseBase<Derived> &dense_matrix) {
45 Eigen::SparseMatrix<double> sparse_matrix(dense_matrix.rows(),dense_matrix.cols());
46 sparse_matrix.setFromTriplets(triplets.begin(), triplets.end());
47 dense_matrix += sparse_matrix;
48 std::vector<Eigen::Triplet<double>>().swap(triplets);
49 }
50
51 // run polarization?
53
54 // allocate pointing matrix for polarization reduction
55 template <class map_buffer_t>
56 void allocate_pointing(map_buffer_t &, double, double, double, Eigen::Index, int, int);
57
58 // populate maps with a time chunk (signal, kernel, coverage, and noise)
59 template<class map_buffer_t, typename Derived, typename apt_t>
60 void populate_maps_naive(TCData<TCDataKind::PTC, Eigen::MatrixXd> &, map_buffer_t &, map_buffer_t &,
61 Eigen::DenseBase<Derived> &, std::string &, apt_t &, double, bool, bool);
62
63 // populate maps with a time chunk (signal, kernel, coverage, and noise)
64 template<class map_buffer_t, typename Derived, typename apt_t>
66 Eigen::DenseBase<Derived> &, std::string &, apt_t &, double, bool, bool);
67};
68
69template <class map_buffer_t>
70void NaiveMapmaker::allocate_pointing(map_buffer_t &mb, double weight, double cos_2angle, double sin_2angle,
71 Eigen::Index map_index, int ir, int ic) {
72 int pix = mb.n_rows * ic + ir;
73 Eigen::MatrixXd& matrix = mb.pointing[map_index];
74
75 // calculate reused expressions
76 double weight_cos_2angle = weight * cos_2angle;
77 double weight_sin_2angle = weight * sin_2angle;
78 double weight_cos2_2angle = weight * std::pow(cos_2angle, 2);
79 double weight_sin2_2angle = weight * std::pow(sin_2angle, 2);
80 double weight_cos_sin_2angle = weight * cos_2angle * sin_2angle;
81
82 // update pointing matrix
83 matrix(pix, 0) += weight;
84 matrix(pix, 1) += weight_cos_2angle;
85 matrix(pix, 2) += weight_sin_2angle;
86 matrix(pix, 3) = matrix(pix, 1); // previously set to += weight*cos_2angle, then directly assigned here
87 matrix(pix, 4) += weight_cos2_2angle;
88 matrix(pix, 5) += weight_cos_sin_2angle;
89 matrix(pix, 6) = matrix(pix, 2); // previously set to += weight*sin_2angle, then directly assigned here
90 matrix(pix, 7) = matrix(pix, 5); // reuse the result from matrix(pix,5)
91 matrix(pix, 8) += weight_sin2_2angle;
92}
93
94template<class map_buffer_t, typename Derived, typename apt_t>
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) {
99
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;
103
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;
109
110 if (run_omb) {
111 signals.resize(omb.signal.size());
112 weights.resize(omb.signal.size());
113
114 if (run_kernel) {
115 kernels.resize(omb.signal.size());
116 }
117 if (run_coverage) {
118 coverages.resize(omb.signal.size());
119 }
120 }
121
122 if (run_polarization && !cmb.signal.empty()) {
123 cmb_signals.resize(cmb.signal.size());
124 cmb_weights.resize(cmb.signal.size());
125
126 if (run_kernel) {
127 cmb_kernels.resize(cmb.signal.size());
128 }
129 if (run_coverage) {
130 cmb_coverages.resize(cmb.signal.size());
131 }
132 }
133
134 map_buffer_t omb_copy, cmb_copy;
135 // pointer to map buffer with noise maps
136 map_buffer_t *nmb, *nmb_copy;
137
138 omb_copy.n_rows = omb.n_rows;
139 omb_copy.n_cols = omb.n_cols;
140
141 cmb_copy.n_rows = cmb.n_rows;
142 cmb_copy.n_cols = cmb.n_cols;
143
144 if (run_noise) {
145 if (use_omb) {
146 omb_copy.noise = omb.noise;
147
148 for (Eigen::Index i=0; i<omb.noise.size(); ++i) {
149 omb_copy.noise[i].setZero();
150 }
151 }
152
153 else {
154 cmb_copy.noise = cmb.noise;
155
156 for (Eigen::Index i=0; i<cmb.noise.size(); ++i) {
157 cmb_copy.noise[i].setZero();
158 }
159 }
160 nmb = use_cmb ? &cmb : (use_omb ? &omb : nullptr);
161 nmb_copy = use_cmb ? &cmb_copy : (use_omb ? &omb_copy : nullptr);
162 }
163
164 // step to skip to reach next stokes param
165 int step = omb.pointing.size();
166
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()));
170 }
171 }
172
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()));
176 }
177 }
178
179 // dimensions of data
180 Eigen::Index n_pts = in.scans.data.rows();
181 Eigen::Index n_dets = in.scans.data.cols();
182
183 // signal, kernel and noise map values
184 double signal, kernel, noise_v;
185
186 // noise map indices
187 Eigen::Index nmb_ir, nmb_ic;
188
189 // cosine and sine of angles
190 double angle, cos_2angle, sin_2angle;
191
192 // add detector to map?
193 bool run_det;
194
195 for (Eigen::Index i=0; i<n_dets; ++i) {
196 // skip fg = -1 if in polarization mode
197 if (run_polarization && apt["loc"](i)==-1) {
198 run_det = false;
199 }
200 else {
201 run_det = true;
202 }
203
204 // skip completely flagged detectors
205 if ((in.flags.data.col(i).array()==0).any() && run_det) {
206 // which map to assign detector to
207 Eigen::Index map_index = map_indices(i);
208
209 // indices for Q and U maps
210 int q_index = map_index + step;
211 int u_index = map_index + 2 * step;
212
213 // array index
214 Eigen::Index array_index = apt["array"](i);
215 // get detector pointing
216 auto [lat, lon] = engine_utils::calc_det_pointing(in.tel_data.data, apt["x_t"](i), apt["y_t"](i),
217 pixel_axes, in.pointing_offsets_arcsec.data, omb.map_grouping);
218
219 Eigen::VectorXd alt;
220
221 if (run_polarization) {
222 std::tuple<Eigen::VectorXd,Eigen::VectorXd> altaz_tuple = engine_utils::calc_det_pointing(in.tel_data.data, apt["x_t"](i),
223 apt["y_t"](i), "altaz",
224 in.pointing_offsets_arcsec.data,
225 omb.map_grouping);
226 alt = std::get<0>(altaz_tuple);
227 }
228
229 // get map buffer row and col indices for lat and lon vectors
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.;
232
233 Eigen::VectorXd cmb_irow, cmb_icol;
234 if (use_cmb || (run_polarization && !cmb.signal.empty())) {
235 // get coadded map buffer row and col indices for lat and lon vectors
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.;
238 }
239
240 // loop through the samples
241 for (Eigen::Index j=0; j<n_pts; ++j) {
242 // check if sample is flagged, ignore if so
243 if (!in.flags.data(j,i)) {
244 Eigen::Index omb_ir = omb_irow(j);
245 Eigen::Index omb_ic = omb_icol(j);
246
247 if (run_polarization) {
248 auto fg_index = apt["fg"](i);
249 if (run_hwpr) {
250 angle = 2*in.hwpr_angle.data(j) - (in.angle.data(j) + alt(j) + fgs[fg_index] + install_ang[array_index]);
251 }
252 else {
253 angle = in.angle.data(j) + alt(j) + fgs[fg_index] + install_ang[array_index];
254 }
255
256 cos_2angle = cos(2.*angle);
257 sin_2angle = sin(2.*angle);
258 }
259
260 if (run_omb) {
261 // make sure the data point is within the map
262 if ((omb_ir >= 0) && (omb_ir < omb.n_rows) && (omb_ic >= 0) && (omb_ic < omb.n_cols)) {
263 // populate signal map
264 signal = in.scans.data(j,i)*in.weights.data(i);
265 signals[map_index].push_back(T(omb_ir,omb_ic,signal));
266
267 // populate weight map
268 weights[map_index].push_back(T(omb_ir,omb_ic,in.weights.data(i)));
269
270 // populate kernel map
271 if (run_kernel) {
272 kernel = in.kernel.data(j,i)*in.weights.data(i);
273 kernels[map_index].push_back(T(omb_ir,omb_ic,kernel));
274 }
275
276 // populate coverage map
277 if (run_coverage) {
278 coverages[map_index].push_back(T(omb_ir,omb_ic,1./d_fsmp));
279 }
280
281 if (run_polarization) {
282 // calculate pointing matrix
283 allocate_pointing(omb_copy, in.weights.data(i), cos_2angle, sin_2angle, map_index, omb_ir, omb_ic);
284
285 // update signal map Q and U
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));
288
289 // update kernel map Q and U
290 if (run_kernel) {
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));
293 }
294 }
295 }
296 }
297
298 if (run_polarization && !cmb.signal.empty() && run_omb) {
299 Eigen::Index cmb_ir = cmb_irow(j);
300 Eigen::Index cmb_ic = cmb_icol(j);
301
302 // make sure the data point is within the map
303 if ((cmb_ir >= 0) && (cmb_ir < cmb.n_rows) && (cmb_ic >= 0) && (cmb_ic < cmb.n_cols)) {
304 // populate signal map
305 signal = in.scans.data(j,i)*in.weights.data(i);
306 cmb_signals[map_index].push_back(T(cmb_ir,cmb_ic,signal));
307
308 // populate weight map
309 cmb_weights[map_index].push_back(T(cmb_ir,cmb_ic,in.weights.data(i)));
310
311 // populate kernel map
312 if (run_kernel) {
313 kernel = in.kernel.data(j,i)*in.weights.data(i);
314 cmb_kernels[map_index].push_back(T(cmb_ir,cmb_ic,kernel));
315 }
316
317 // populate coverage map
318 if (run_coverage) {
319 cmb_coverages[map_index].push_back(T(cmb_ir,cmb_ic,1./d_fsmp));
320 }
321
322 // calculate pointing matrix
323 allocate_pointing(cmb_copy, in.weights.data(i), cos_2angle, sin_2angle, map_index, cmb_ir, cmb_ic);
324
325 // update signal map Q and U
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));
328
329 // update kernel map Q and U
330 if (run_kernel) {
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));
333 }
334 }
335 }
336
337 // check if noise maps requested
338 if (run_noise) {
339 // if coaddition is enabled
340 if (use_cmb) {
341 nmb_ir = cmb_irow(j);
342 nmb_ic = cmb_icol(j);
343 }
344 // else make noise maps for obs
345 else {
346 nmb_ir = omb_irow(j);
347 nmb_ic = omb_icol(j);
348 }
349
350 // coadd into current noise map
351 if ((nmb_ir >= 0) && (nmb_ir < nmb->n_rows) && (nmb_ic >= 0) && (nmb_ic < nmb->n_cols)) {
352 //if (run_polarization) {
353 //if (use_cmb) {
354 // calculate pointing matrix for cmb
355 // allocate_pointing(cmb_copy, in.weights.data(i), cos_2angle, sin_2angle, map_index, nmb_ir, nmb_ic);
356 //}
357 //}
358 // loop through noise maps
359 for (Eigen::Index nn=0; nn<nmb->n_noise; ++nn) {
360 // randomizing on dets
361 if (nmb->randomize_dets) {
362 noise_v = in.noise.data(nn,i)*in.scans.data(j,i)*in.weights.data(i);
363 }
364 else {
365 noise_v = in.noise.data(nn)*in.scans.data(j,i)*in.weights.data(i);
366 }
367 // add noise value to current noise map
368 nmb_copy->noise[map_index](nmb_ir,nmb_ic,nn) += noise_v;
369
370 if (run_polarization) {
371 // update noise map Q
372 nmb_copy->noise[q_index](nmb_ir,nmb_ic,nn) += noise_v*cos_2angle;
373 // update noise map U
374 nmb_copy->noise[u_index](nmb_ir,nmb_ic,nn) += noise_v*sin_2angle;
375 }
376 }
377 }
378 }
379 }
380 }
381 }
382 }
383
384 {
385 std::scoped_lock<std::mutex> lk(*naive_mutex);
386 if (run_omb) {
387 for (int i=0; i<omb.signal.size(); ++i) {
388 add_sparse_to_dense(signals[i],omb.signal[i]);
389 add_sparse_to_dense(weights[i],omb.weight[i]);
390
391 if (run_kernel) {
392 add_sparse_to_dense(kernels[i],omb.kernel[i]);
393 }
394
395 if (run_coverage) {
396 add_sparse_to_dense(coverages[i],omb.coverage[i]);
397 }
398 }
399 if (!omb.pointing.empty()) {
400 for (int i=0; i<omb.pointing.size(); ++i) {
401 omb.pointing[i] += omb_copy.pointing[i];
402 }
403 }
404 }
405
406 if (run_polarization && !cmb.signal.empty()) {
407 for (int i=0; i<cmb.signal.size(); ++i) {
408 add_sparse_to_dense(cmb_signals[i],cmb.signal[i]);
409 add_sparse_to_dense(cmb_weights[i],cmb.weight[i]);
410
411 if (run_kernel) {
412 add_sparse_to_dense(cmb_kernels[i],cmb.kernel[i]);
413 }
414
415 if (run_coverage) {
416 add_sparse_to_dense(cmb_coverages[i],cmb.coverage[i]);
417 }
418 }
419 }
420
421 if (run_noise) {
422 for (int i=0; i<nmb->noise.size(); ++i) {
423 nmb->noise[i] += nmb_copy->noise[i];
424 }
425 }
426
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];
430 }
431 }
432 }
433
434 nmb = nullptr;
435 nmb_copy = nullptr;
436}
437
438template<class map_buffer_t, typename Derived, typename apt_t>
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) {
443
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;
449
450 // pointer to map buffer with noise maps
451 map_buffer_t *nmb;
452
453
454 if (run_noise) {
455 nmb = use_cmb ? &cmb : (use_omb ? &omb : nullptr);
456 }
457
458 // step to skip to reach next stokes param
459 int step = omb.pointing.size();
460
461 // dimensions of data
462 Eigen::Index n_pts = in.scans.data.rows();
463 Eigen::Index n_dets = in.scans.data.cols();
464
465 // signal, kernel and noise map values
466 double signal, kernel, noise_v;
467
468 // noise map indices
469 Eigen::Index nmb_ir, nmb_ic;
470
471 // cosine and sine of angles
472 double angle, cos_2angle, sin_2angle;
473
474 // add detector to map?
475 bool run_det;
476
477 // placeholder vectors of size ndet for grppi maps
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());
482
483 // parallelize over detectors
484 //for (Eigen::Index i=0; i<n_dets; ++i) {
485 grppi::map(tula::grppi_utils::dyn_ex(omb.parallel_policy), map_in_vec, map_out_vec, [&](auto i) {
486 //for (Eigen::Index i=0; i<n_dets; ++i) {
487 // skip fg = -1 if in polarization mode
488 if (run_polarization && apt["loc"](i)==-1) {
489 run_det = false;
490 }
491 else {
492 run_det = true;
493 }
494
495 // skip completely flagged detectors
496 if ((in.flags.data.col(i).array()==0).any() && run_det) {
497 // which map to assign detector to
498 Eigen::Index map_index = map_indices(i);
499
500 // indices for Q and U maps
501 int q_index = map_index + step;
502 int u_index = map_index + 2 * step;
503
504 // array index
505 Eigen::Index array_index = apt["array"](i);
506 // get detector pointing
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);
509
510 Eigen::VectorXd alt;
511
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,
516 omb.map_grouping);
517 alt = std::get<0>(altaz_tuple);
518 }
519
520 // get map buffer row and col indices for lat and lon vectors
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.;
523
524 Eigen::VectorXd cmb_irow, cmb_icol;
525 if (use_cmb || (run_polarization && !cmb.signal.empty())) {
526 // get coadded map buffer row and col indices for lat and lon vectors
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.;
529 }
530
531 // loop through the samples
532 for (Eigen::Index j=0; j<n_pts; ++j) {
533 // check if sample is flagged, ignore if so
534 if (!in.flags.data(j,i)) {
535 Eigen::Index omb_ir = omb_irow(j);
536 Eigen::Index omb_ic = omb_icol(j);
537
538 if (run_polarization) {
539 auto fg_index = apt["fg"](i);
540 if (run_hwpr) {
541 angle = 2*in.hwpr_angle.data(j) - (in.angle.data(j) + alt(j) + fgs[fg_index] + install_ang[array_index]);
542 }
543 else {
544 angle = in.angle.data(j) + alt(j) + fgs[fg_index] + install_ang[array_index];
545 }
546
547 cos_2angle = cos(2.*angle);
548 sin_2angle = sin(2.*angle);
549 }
550
551 if (run_omb) {
552 // make sure the data point is within the map
553 if ((omb_ir >= 0) && (omb_ir < omb.n_rows) && (omb_ic >= 0) && (omb_ic < omb.n_cols)) {
554 // populate signal map
555 signal = in.scans.data(j,i)*in.weights.data(i);
556 omb.signal[map_index](omb_ir, omb_ic) += signal;
557 //signals[map_index].push_back(T(omb_ir,omb_ic,signal));
558
559 // populate weight map
560 //weights[map_index].push_back(T(omb_ir,omb_ic,in.weights.data(i)));
561 omb.weight[map_index](omb_ir, omb_ic) += in.weights.data(i);
562
563 // populate kernel map
564 if (run_kernel) {
565 kernel = in.kernel.data(j,i)*in.weights.data(i);
566 //kernels[map_index].push_back(T(omb_ir,omb_ic,kernel));
567 omb.kernel[map_index](omb_ir, omb_ic) += kernel;
568 }
569
570 // populate coverage map
571 if (run_coverage) {
572 //coverages[map_index].push_back(T(omb_ir,omb_ic,1./d_fsmp));
573 omb.coverage[map_index](omb_ir, omb_ic) += 1./d_fsmp;
574 }
575
576 if (run_polarization) {
577 // calculate pointing matrix
578 allocate_pointing(omb, in.weights.data(i), cos_2angle, sin_2angle, map_index, omb_ir, omb_ic);
579
580 // update signal map Q and U
581 //signals[q_index].push_back(T(omb_ir,omb_ic,signal*cos_2angle));
582 //signals[u_index].push_back(T(omb_ir,omb_ic,signal*sin_2angle));
583
584 omb.signal[q_index](omb_ir, omb_ic) += signal*cos_2angle;
585 omb.signal[u_index](omb_ir, omb_ic) += signal*sin_2angle;
586
587
588 // update kernel map Q and U
589 if (run_kernel) {
590 //kernels[q_index].push_back(T(omb_ir,omb_ic,kernel*cos_2angle));
591 //kernels[u_index].push_back(T(omb_ir,omb_ic,kernel*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;
594 }
595 }
596 }
597 }
598
599 if (run_polarization && !cmb.signal.empty() && run_omb) {
600 Eigen::Index cmb_ir = cmb_irow(j);
601 Eigen::Index cmb_ic = cmb_icol(j);
602
603 // make sure the data point is within the map
604 if ((cmb_ir >= 0) && (cmb_ir < cmb.n_rows) && (cmb_ic >= 0) && (cmb_ic < cmb.n_cols)) {
605 // populate signal map
606 signal = in.scans.data(j,i)*in.weights.data(i);
607 //cmb_signals[map_index].push_back(T(cmb_ir,cmb_ic,signal));
608 cmb.signal[map_index](cmb_ir, cmb_ic) += signal;
609
610 // populate weight map
611 //cmb_weights[map_index].push_back(T(cmb_ir,cmb_ic,in.weights.data(i)));
612 cmb.weight[map_index](cmb_ir, cmb_ic) += in.weights.data(i);
613
614 // populate kernel map
615 if (run_kernel) {
616 kernel = in.kernel.data(j,i)*in.weights.data(i);
617 //cmb_kernels[map_index].push_back(T(cmb_ir,cmb_ic,kernel));
618 cmb.kernel[map_index](cmb_ir, cmb_ic) += kernel;
619 }
620
621 // populate coverage map
622 if (run_coverage) {
623 //cmb_coverages[map_index].push_back(T(cmb_ir,cmb_ic,1./d_fsmp));
624 cmb.coverage[map_index](cmb_ir, cmb_ic) += 1./d_fsmp;
625 }
626
627 // calculate pointing matrix
628 allocate_pointing(cmb, in.weights.data(i), cos_2angle, sin_2angle, map_index, cmb_ir, cmb_ic);
629
630 // update signal map Q and U
631 //cmb_signals[q_index].push_back(T(cmb_ir,cmb_ic,signal*cos_2angle));
632 //cmb_signals[u_index].push_back(T(cmb_ir,cmb_ic,signal*sin_2angle));
633
634 cmb.signal[q_index](cmb_ir, cmb_ic) += signal*cos_2angle;
635 cmb.signal[u_index](cmb_ir, cmb_ic) += signal*sin_2angle;
636
637
638 // update kernel map Q and U
639 if (run_kernel) {
640 //cmb_kernels[q_index].push_back(T(cmb_ir,cmb_ic,kernel*cos_2angle));
641 //cmb_kernels[u_index].push_back(T(cmb_ir,cmb_ic,kernel*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;
644 }
645 }
646 }
647
648 // check if noise maps requested
649 if (run_noise) {
650 // if coaddition is enabled
651 if (use_cmb) {
652 nmb_ir = cmb_irow(j);
653 nmb_ic = cmb_icol(j);
654 }
655 // else make noise maps for obs
656 else {
657 nmb_ir = omb_irow(j);
658 nmb_ic = omb_icol(j);
659 }
660
661 // coadd into current noise map
662 if ((nmb_ir >= 0) && (nmb_ir < nmb->n_rows) && (nmb_ic >= 0) && (nmb_ic < nmb->n_cols)) {
663 //if (run_polarization) {
664 //if (use_cmb) {
665 // calculate pointing matrix for cmb
666 // allocate_pointing(cmb, in.weights.data(i), cos_2angle, sin_2angle, map_index, nmb_ir, nmb_ic);
667 //}
668 //}
669 // loop through noise maps
670 for (Eigen::Index nn=0; nn<nmb->n_noise; ++nn) {
671 // randomizing on dets
672 if (nmb->randomize_dets) {
673 noise_v = in.noise.data(nn,i)*in.scans.data(j,i)*in.weights.data(i);
674 }
675 else {
676 noise_v = in.noise.data(nn)*in.scans.data(j,i)*in.weights.data(i);
677 }
678 // add noise value to current noise map
679 nmb->noise[map_index](nmb_ir,nmb_ic,nn) += noise_v;
680
681 if (run_polarization) {
682 // update noise map Q
683 nmb->noise[q_index](nmb_ir,nmb_ic,nn) += noise_v*cos_2angle;
684 // update noise map U
685 nmb->noise[u_index](nmb_ir,nmb_ic,nn) += noise_v*sin_2angle;
686 }
687 }
688 }
689 }
690 }
691 }
692 }
693 return 0;
694 });
695
696 nmb = nullptr;
697}
698} // namespace mapmaking
Definition naive_mm.h:20
void add_sparse_to_dense(std::vector< Eigen::Triplet< double > > &triplets, Eigen::DenseBase< Derived > &dense_matrix)
Definition naive_mm.h:44
std::map< int, double > fgs
Definition naive_mm.h:35
std::shared_ptr< spdlog::logger > logger
Definition naive_mm.h:23
void allocate_pointing(map_buffer_t &, double, double, double, Eigen::Index, int, int)
Definition naive_mm.h:70
std::unique_ptr< std::mutex > naive_mutex
Definition naive_mm.h:24
std::map< int, double > install_ang
Definition naive_mm.h:27
void populate_maps_naive(TCData< TCDataKind::PTC, Eigen::MatrixXd > &, map_buffer_t &, map_buffer_t &, Eigen::DenseBase< Derived > &, std::string &, apt_t &, double, bool, bool)
Definition naive_mm.h:95
bool run_polarization
Definition naive_mm.h:52
void populate_maps_naive_parallel(TCData< TCDataKind::PTC, Eigen::MatrixXd > &, map_buffer_t &, map_buffer_t &, Eigen::DenseBase< Derived > &, std::string &, apt_t &, double, bool, bool)
Definition naive_mm.h:439
constexpr auto pi
Definition constants.h:6
auto calc_det_pointing(tel_data_t &tel_data, double az_off, double el_off, const std::string pixel_axes, pointing_offset_t &pointing_offsets, const std::string map_grouping)
Definition pointing.h:11
Definition jinc_mm.h:24
TC data class.
Definition timestream.h:55