156 Eigen::DenseBase<DerivedB> &flags,
158 Eigen::Index n_pts = scans.rows();
159 Eigen::Index n_dets = scans.cols();
162 for (Eigen::Index det=0; det<n_dets; det++) {
164 if (apt[
"flag"](det)==0) {
166 Eigen::Matrix<bool, Eigen::Dynamic, 1> det_flags = flags.col(det);
172 Eigen::VectorXd delta = scans.col(det).tail(n_pts - 1) - scans.col(det).head(n_pts - 1);
178 Eigen::VectorXd diff = abs(delta.array() - delta.mean());
184 bool new_spikes_found = ((diff.segment(1,n_pts - 2).array() > cutoff).count() > 0) ? 1 : 0;
187 while (new_spikes_found) {
189 new_spikes_found = ((diff.segment(1,n_pts - 2).array() > cutoff).count() > 0) ? 1 : 0;
192 if (new_spikes_found) {
198 n_spikes = (det_flags.head(n_pts - 1).array() == 1).count();
202 for (Eigen::Index i = 0; i < n_pts; ++i) {
203 if (det_flags(i) == 1) {
204 int size_loop =
size;
206 if ((n_pts - i - 1) < size_loop) {
207 logger->info(
"rng {} {} {}", (n_pts - i - 1),
size,i );
208 size_loop = n_pts - i - 1;
212 int c = (det_flags.segment(i + 1, size_loop).array() == 1).count();
219 det_flags.segment(i + 1, size_loop).setZero();
225 if ((i + size_loop/2) < n_pts) {
226 det_flags(i + size_loop/2) = 1;
231 i = i + size_loop - 1;
238 n_spikes = (det_flags.head(n_pts - 1).array() == 1).count();
240 logger->info(
"n_spikes 3 {} {}", n_spikes, det);
243 Eigen::Matrix<int, Eigen::Dynamic, 1> spike_loc(n_spikes);
245 Eigen::VectorXd spike_vals(n_spikes);
249 for (Eigen::Index i = 0; i < n_pts - 1; ++i) {
250 if (det_flags(i) == 1) {
251 spike_loc(count) = i + 1;
252 spike_vals(count) = scans(det,i+1) - scans(det,i);
258 auto [win_index_0, win_index_1, win_size] =
262 Eigen::VectorXd sub_vals =
263 scans.col(det).segment(win_index_0, win_size);
266 Eigen::VectorXd smoothed_sub_vals = Eigen::VectorXd::Zero(win_size);
269 engine_utils::smooth<engine_utils::SmoothType::boxcar>(sub_vals, smoothed_sub_vals,
size);
272 sub_vals -= smoothed_sub_vals;
280 ((sigest / spike_vals.array()).abs()).log();
283 decay_length = (decay_length.array() < 6.).select(6., decay_length);
287 if ((decay_length.array() >
size *
fsmp).any()) {
288 logger->error(
"decay length is longer than {} * fsmp. mission "
289 "failed, we'll get em next time.",
size);
290 std::exit(EXIT_FAILURE);
299 for (Eigen::Index i=0; i<n_spikes; ++i) {
300 if (spike_loc(i) - decay_window >= 0 &&
301 spike_loc(i) + decay_window + 1 < n_pts) {
303 .segment(spike_loc(i) - decay_window, 2*
window_size + 1)
311 for (Eigen::Index i=0; i<n_spikes; ++i) {
312 if (spike_loc(i) - decay_length(i) >= 0 &&
313 spike_loc(i) + decay_length(i) + 1 < n_pts) {
315 .segment(spike_loc(i) - decay_length(i), 2*decay_length(i) + 1)
322 flags.col(det) = det_flags;
329 apt_t &apt, Eigen::Index start_det) {
332 thread_local boost::random::mt19937 eng;
334 Eigen::Index n_dets = flags.cols();
335 Eigen::Index n_pts = flags.rows();
338 Eigen::Index n_flagged = 0;
342 auto spike_free = flags.colwise().maxCoeff();
343 n_flagged = n_dets - spike_free.template cast<int>().sum();
345 logger->info(
"has spikes {}", spike_free);
346 logger->info(
"n_flagged {}", n_flagged);
348 for (Eigen::Index det = 0; det < n_dets; det++) {
349 if (apt[
"flag"](det + start_det)==0) {
350 if (spike_free(det)) {
354 for (Eigen::Index j = 1; j < n_pts - 1; ++j) {
355 if (flags(j, det) == 0 && flags(j - 1, det) == 1 && flags(j + 1, det) == 1) {
360 for (Eigen::Index j = 1; j < n_pts - 1; ++j) {
361 if (flags(j, det) == 1 && flags(j - 1, det) == 0 && flags(j + 1, det) == 0) {
366 flags(0, det) = flags(1, det);
367 flags(n_pts - 1, det) = flags(n_pts - 2, det);
370 Eigen::Index n_flagged_regions = 0;
372 if (flags(n_pts - 1, det) == 1) {
377 += ((flags.col(det).tail(n_pts - 1) - flags.col(det).head(n_pts - 1)).array() < 0)
379 if (n_flagged_regions == 0) {
383 logger->info(
"n_flagged_regions {}",n_flagged_regions);
386 Eigen::Matrix<int, Eigen::Dynamic, 1> si_flags(n_flagged_regions);
387 Eigen::Matrix<int, Eigen::Dynamic, 1> ei_flags(n_flagged_regions);
389 si_flags.setConstant(-1);
390 ei_flags.setConstant(-1);
396 if (flags(j, det) == 1) {
400 while (flags(j, det) == 1 && j <= n_pts - 1) {
404 if (samp_count > 1) {
405 si_flags(count) = jstart;
406 ei_flags(count) = j - 1;
416 logger->info(
"count {}", count);
419 Eigen::VectorXd xx(2);
420 Eigen::VectorXd yy(2);
421 Eigen::Matrix<Eigen::Index, 1, 1> tn_pts;
424 for (Eigen::Index j = 0; j < n_flagged_regions; ++j) {
427 Eigen::Index n_flags = ei_flags(j) - si_flags(j);
428 Eigen::VectorXd lin_offset(n_flags);
430 if (si_flags(j) == 0) {
431 lin_offset.setConstant(scans(ei_flags(j) + 1, det));
434 else if (ei_flags(j) == n_pts - 1) {
435 lin_offset.setConstant(scans(si_flags(j) - 1, det));
440 xx(0) = si_flags(j) - 1;
441 xx(1) = ei_flags(j) + 1;
442 yy(0) = scans(si_flags(j) - 1, det);
443 yy(1) = scans(ei_flags(j) + 1, det);
445 Eigen::VectorXd xlin_offset =
446 Eigen::VectorXd::LinSpaced(n_flags, si_flags(j), si_flags(j) + n_flags - 1);
448 mlinterp::interp(tn_pts.data(), n_flags, yy.data(), lin_offset.data(), xx.data(),
450 logger->info(
"xlin_offset {}", xlin_offset);
453 logger->info(
"xx {}", xx);
454 logger->info(
"yy {}", yy);
455 logger->info(
"lin_offset {}", lin_offset);
461 det_count = (apt[
"flag"].segment(start_det,n_dets).array()==0).count();
464 for (Eigen::Index ii=0;ii<n_dets;ii++) {
465 if (!spike_free(ii) && apt[
"flag"](ii + start_det)==0) {
472 logger->info(
"det_count {}", det_count);
474 Eigen::MatrixXd detm(n_flags, det_count);
475 detm.setConstant(-99);
476 Eigen::VectorXd res(det_count);
478 logger->info(
"si {}", si_flags);
480 for (Eigen::Index ii = 0; ii < n_dets; ii++) {
481 if ((spike_free(ii) ||
use_all_det) && apt[
"flag"](ii + start_det)==0) {
483 scans.block(si_flags(j), ii, n_flags, 1);
484 res(c) = apt[
"responsivity"](c + start_det);
489 detm.transposeInPlace();
491 logger->info(
"detm {}", detm);
494 Eigen::MatrixXd lin_offset_others(det_count, n_flags);
498 if (si_flags(j) == 0) {
499 lin_offset_others = detm.col(0).replicate(1, n_flags);
504 else if (ei_flags(j) == n_pts - 1) {
505 lin_offset_others = detm.col(n_flags - 1).replicate(1, n_flags);
509 Eigen::VectorXd tmp_vec(n_flags);
510 Eigen::VectorXd xlin_offset =
511 Eigen::VectorXd::LinSpaced(n_flags, si_flags(j), si_flags(j) + n_flags - 1);
513 xx(0) = si_flags(j) - 1;
514 xx(1) = ei_flags(j) + 1;
516 for (Eigen::Index ii = 0; ii < det_count; ii++) {
518 yy(1) = detm(ii, n_flags - 1);
520 mlinterp::interp(tn_pts.data(), n_flags, yy.data(), tmp_vec.data(), xx.data(),
522 lin_offset_others.row(ii) = tmp_vec;
525 logger->info(
"xlin_offset {}", xlin_offset);
528 logger->info(
"xx {}", xx);
529 logger->info(
"yy {}", yy);
530 logger->info(
"lin_offset_others {}", lin_offset_others);
532 detm.noalias() = detm - lin_offset_others;
534 logger->info(
"detm {}", detm);
537 Eigen::VectorXd sky_model = Eigen::VectorXd::Zero(n_flags);
542 for (Eigen::Index ii=0; ii<det_count; ii++) {
543 for (Eigen::Index l=0; l<n_flags; l++) {
544 sky_model(l) += detm(ii,l)/res(ii);
548 sky_model = sky_model/det_count;
550 logger->info(
"sky_model {}",sky_model);
552 Eigen::VectorXd std_dev_ff = Eigen::VectorXd::Zero(det_count);
554 for (Eigen::Index ii = 0; ii < det_count; ii++) {
555 Eigen::VectorXd tmp_vec = detm.row(ii).array() / res.array() - sky_model.transpose().array();
557 double tmp_mean = tmp_vec.mean();
559 std_dev_ff(ii) = (tmp_vec.array() - tmp_mean).pow(2).sum();
560 std_dev_ff(ii) = (n_flags == 1.) ? std_dev_ff(ii) / n_flags
561 : std_dev_ff(ii) / (n_flags - 1.);
565 logger->info(
"std_dev_ff {}",std_dev_ff);
567 double mean_std_dev = (std_dev_ff.array().sqrt()).sum() / det_count;
573 boost::random::normal_distribution<> rands{0, mean_std_dev};
575 Eigen::VectorXd error =
576 Eigen::VectorXd::Zero(n_flags).unaryExpr([&](
double dummy){
return rands(eng);});
578 logger->info(
"error {}", error);
583 Eigen::VectorXd fake = sky_model.array() + lin_offset.array() + error.array();
585 logger->info(
"fake {}", fake);
587 logger->info(
"mean std dev {}", mean_std_dev);
589 scans.col(det).segment(si_flags(j), n_flags) = fake;