90 #ifndef FIRST_DIFF_FILTER_INCLUDE
91 #define FIRST_DIFF_FILTER_INCLUDE
136 const std::vector<int>& f)
169 int filter(
const size_t index = 0,
int npts = -1);
190 return analyze2(ratlim, siglim,
false, msg);
200 std::string& dumpmsg)
202 return analyze2(ratlim, siglim,
true, dumpmsg);
217 void dump(std::ostream& s,
const std::string& tag = std::string());
238 const std::vector<int>
261 std::string& dumpmsg);
270 dsize =
data.size() - i0;
280 while (i < ilimit && n < 2)
299 if (!noflags && flags.size() - i0 < dsize)
310 while (i < ilimit && flags[i])
319 analvec.push_back(A);
324 while (i < ilimit && flags[i])
329 return analvec.size();
336 bool prevIsBad(
false);
337 int i, igood(0), nbad(0);
344 fe.
index = analvec[0].index;
347 results.push_back(fe);
352 for (i = 0; i < analvec.size(); i++)
354 results[curr].ngood++;
357 if (::fabs(analvec[i].diff) > fdlimit)
360 sumbad += analvec[i].diff;
374 results[curr].ngood -= nbad + 1;
376 if (::fabs(sumbad) > fdlimit)
384 analvec[igood + 1].index - results[curr].index;
385 fe.
index = analvec[igood + 1].index;
389 results.push_back(fe);
393 analvec[igood + nbad].index - results[curr].index;
395 fe.
index = analvec[igood + nbad].index;
398 fe.
step =
data[analvec[igood + nbad].index] -
399 data[analvec[igood].index];
400 results.push_back(fe);
407 analvec[igood + 1].index - results[curr].index;
410 fe.
index = analvec[igood + 1].index;
413 fe.
npts = analvec[igood + nbad].index - fe.
index;
415 results.push_back(fe);
418 fe.
index = analvec[igood + nbad].index;
421 results.push_back(fe);
436 results[curr].ngood -= nbad;
438 fe.
index = analvec[igood + 1].index;
441 results[curr].npts = fe.
index - results[curr].index;
443 results.push_back(fe);
448 results[curr].npts = ilimit - results[curr].index;
453 return (results.size());
465 if (results[0].npts > 1)
473 while (results.size() > 1)
482 results[0].
npts += results[1].npts;
483 results[0].ngood = 0;
484 results.erase(results.begin() + 1);
496 bool dump, std::string& dumpmsg)
498 const unsigned int N(4);
500 std::ostringstream oss;
505 oss <<
"FirstDiff analyze2" << std::fixed << std::setprecision(3)
506 <<
" fdlimit=" << fdlimit <<
" siglim=" << siglim
507 <<
" ratlim=" << ratlim
508 <<
"\n# index xdata data diff step5 ave sig7 rat8 "
509 <<
"pave psig prat fave fsig frat [SLIP] [gap]" << std::endl;
516 fe.
index = analvec[0].index;
519 results.push_back(fe);
522 double tstep, tstepmin, tstepmax(0.0);
524 (noxdata ? 0 : xdata[analvec[1].index] - xdata[analvec[0].index]);
525 const unsigned int size(analvec.size());
562 for (j = 0, i = i0; i < size + N - 1; i++)
564 results[curr].ngood++;
575 fstats.
Add(analvec[i].diff);
576 analvec[i].aveN = fstats.
Average();
577 analvec[i].sigN = fstats.
StdDev();
581 fstats.
Subtract(analvec[i - N].diff);
585 pstats.
Add(analvec[i - N - 1].diff);
589 pstats.
Subtract(analvec[i - 2 * N - 1].diff);
592 if (j > N + 2 && pstats.
N() > 2)
594 double diff(analvec[i - N].diff);
597 double avefd((pa + fa) / 2.0);
598 double step(diff - avefd);
604 double sig(::sqrt(pstats.
N() * ps * ps + fstats.
N() * fs * fs));
605 double pr(::fabs(diff - pa) / ps),
606 fr(::fabs(diff - fa) / fs);
607 double rat((pr + fr) / 2.0);
611 bool hitslip(::fabs(step) > fdlimit
614 bool hisig(sig > fdlimit);
616 tstep = xdata[analvec[i - N - 1].index] -
617 xdata[analvec[i - N - 2].index];
618 if (tstep > tstepmax)
622 if (tstep < tstepmin)
631 oss << i << std::fixed << std::setprecision(3) <<
" "
632 << (noxdata ? T(analvec[i - N - 1].index)
633 : xdata[analvec[i - N - 1].index])
634 <<
" " <<
data[analvec[i - N - 1].index] <<
" " << diff
635 <<
" " << step <<
" " << avefd <<
" " << sig <<
" " << rat
636 <<
" " << pa <<
" " << ps <<
" " << pr <<
" " << fa <<
" "
637 << fs <<
" " << fr << (hitslip ?
" SLIP" :
"")
638 << (hisig ?
" SIG" :
"");
639 if (!noxdata && tstep / tstepmin - 1 > 5)
641 oss <<
" gap(" << tstepmin <<
"<=" << tstep
642 <<
"<=" << tstepmax <<
")";
644 oss << (::fabs(step) > fdlimit ?
" step" :
"")
645 << (sig < siglim ?
" sig" :
"")
646 << (rat > ratlim ?
" rat" :
"")
647 << (pr > ratlim ?
" prat" :
"")
648 << (fr > ratlim ?
" frat" :
"");
654 results[curr].ngood--;
655 results[curr].npts = analvec[i].index - analvec[i0].index;
656 results[curr].sigma = ps;
659 fe.
index = analvec[i - N - 1].index;
662 fe.
step = diff - (pa + fa) / 2.0;
664 results.push_back(fe);
670 results[curr].npts = analvec[size - 1].index - analvec[i0].index + 1;
677 return int(results.size() - 1);
685 os <<
"#" << tag <<
" FirstDiffFilter::dump() with limit " << std::fixed
686 << std::setprecision(osp) << fdlimit
687 << (noxdata ?
" (xdata is index)" :
"") <<
"\n#" << tag
688 <<
" i xdata data 1stdiff" << std::endl;
690 const size_t N(analvec.size());
691 for (i = 0, j = 0, k = 0; i < ilimit; i++)
693 if (j >= N || i != analvec[j].index)
697 os << tag << std::fixed << std::setprecision(osp) <<
" "
698 << std::setw(3) << i <<
" " << std::setw(osw)
699 << (noxdata ? T(i) : xdata[i])
701 <<
" " << std::setw(osw) <<
data[i] <<
" " << std::setw(osw)
702 << 0.0 <<
" NA" << std::endl;
707 os << tag << std::fixed << std::setprecision(osp) <<
" "
708 << std::setw(3) << i <<
" " << std::setw(osw)
709 << (noxdata ? T(i) : xdata[i])
711 <<
" " << std::setw(osw) <<
data[i] <<
" " << std::setw(osw)
712 << (j >= N ? 0.0 : analvec[j].diff);
713 if (k < results.size() && i == results[k].index)
716 << (results[k].mad != T(0) ?
717 results[k].asStatsString(osp)
718 : results[k].asString());
735 for (i = 0; i < analvec.size(); i++)
736 if (analvec[i].index == fe.
index)
757 for (i = i0; i < fe.
npts; i++)
759 if ((
unsigned int)(j) + i >= analvec.size() ||
760 analvec[j + i].index >= k)
764 fd = analvec[j + i].diff;
790 fe.
mad = gnsstk::Robust::MedianAbsoluteDeviation<T>(&fdv[0], fdv.size(),
799 #endif // define FIRST_DIFF_FILTER_INCLUDE