96 #ifndef FDIFF_FILTER_INCLUDE
97 #define FDIFF_FILTER_INCLUDE
178 const std::vector<int>
189 std::vector<unsigned int>
206 const std::vector<int>& f)
289 int filter(
const size_t index = 0,
int npts = -1);
312 void dump(std::ostream& s, std::string tag = std::string());
321 dsize =
data.size() - i0;
331 while (i < ilimit && n < 2)
350 if (!noflags && flags.size() - i0 < dsize)
361 std::vector<T> slopes;
366 int iprev(-1), j, islope(0);
372 while (i < ilimit && flags[i])
396 (
data[i] -
data[iprev]) / (xdata[i] - xdata[iprev]);
402 Avec[islope].sloN * (xdata[i] - xdata[iprev]);
408 j = Avec.size() - Nwind;
409 if (fstats.
N() > Nwind)
411 fstats.
Subtract(xdata[Avec[j].index], Avec[j].diff);
413 if (dstats.
N() > Nwind)
415 dstats.
Subtract(xdata[Avec[j].index],
data[Avec[j].index]);
427 sigIndexes.push_back(i);
432 islope = Avec.size();
434 slopes.push_back(A.
sloN);
442 while (i < ilimit && flags[i])
449 &slopes[0], slopes.size(), medSlope,
false);
470 for (i = 0; i < Avec.size(); i++)
471 sd.push_back(Avec[i].sigN);
478 new_siglim = 2.5 * Q3 - 1.5 * Q1;
479 if (new_siglim <= siglim)
486 for (N = 0, i = 0; i < Avec.size(); i++)
487 if (Avec[i].sigN > new_siglim)
505 int nbad(0), nout, n1st, Nw(Nwind), k;
506 unsigned int i, j, bad0;
507 for (i = 0; i < Avec.size(); i++)
513 if (Avec[i].sigN > siglim)
525 nout = int(bad0) + nbad - Nw;
533 if (nout > 0 && nbad > Nw)
541 fdfr.
index = Avec[j].index;
542 fdfr.
npts = nbad - Nw;
544 xdata[Avec[int(j) + nbad - Nw].index] - xdata[Avec[j].index];
545 results.push_back(fdfr);
557 fdfr.
index = Avec[j].index;
558 fdfr.
sigma = Avec[j].sigN;
561 k = Avec[j].index - 1;
562 if (noflags && k > 0)
568 while (k > 0 && flags[k] != 0)
571 fdfr.
dx = xdata[Avec[j].index] - xdata[k];
572 fdfr.
npts = Avec[j].index - k;
575 fdfr.
step = Avec[j].diff;
578 (
unsigned int)(0.5 + 100. * ::fabs(fdfr.
step) / fdlim);
579 if (fdfr.
score > 100)
586 if (fdfr.
score == 100 &&
587 ::fabs(fdfr.
step) < 3 * madSlope * fdfr.
dx)
600 if (doSmall || fdfr.
score == 100)
602 results.push_back(fdfr);
606 else if (
int(i) <= 2 * Nw - 2 && n1st >= 0)
615 fdfr.
index = Avec[0].index;
617 fdfr.
dx = xdata[Avec[n1st].index] - xdata[Avec[0].index];
618 results.push_back(fdfr);
635 fdfr.
index = Avec[j].index;
636 fdfr.
npts = Avec.size() - j;
637 fdfr.
dx = xdata[Avec[Avec.size() - 1].index] - xdata[Avec[j].index];
638 results.push_back(fdfr);
641 return results.size();
649 size_t i, j, k, iprev;
650 int w(osw > 5 ? osw + 1 : 5);
651 os <<
"#" << tag <<
" FDiffFilter::dump() with limit " << std::fixed
652 << std::setprecision(osp) << fdlim <<
" sigma limit " << siglim
653 << std::setprecision(osp + 2) <<
" med,mad slope " << medSlope <<
" "
654 << madSlope << std::setprecision(osp)
655 << (noxdata ?
" (xdata is index)" :
"") <<
"\n#" << tag <<
" "
656 << std::setw(2) <<
"i"
657 <<
" " << std::setw(w) <<
"xd"
658 <<
" " << std::setw(3) <<
"flg"
659 <<
" " << std::setw(w) <<
"data"
660 <<
" " << std::setw(w) <<
"fdif"
661 <<
" " << std::setw(w) <<
"sig"
662 <<
" " << std::setw(w) <<
"slope"
663 <<
" " << std::setw(w) <<
"slp_u"
664 <<
" " << std::setw(w) <<
"sl*dx"
665 <<
" " << std::setw(w) <<
"slu*dx"
666 <<
" " << std::setw(5)
672 std::string sdif, ssig, sldx, slop, slou, sludx;
673 const size_t N(Avec.size());
674 for (i = 0, j = 0, k = 0, iprev = -1; i < ilimit; i++)
677 while (j < N && Avec[j].index < i)
679 bool haveAvec(Avec[j].index == i);
686 dt = (noxdata ? T(i - iprev) : xdata[i] - xdata[iprev]);
697 sdif = ssig = sldx = sludx = slou =
"?";
699 os << tag << std::fixed << std::setprecision(osp) <<
" "
700 << std::setw(3) << i <<
" " << std::setw(w)
701 << (noxdata ? T(i) : xdata[i]) <<
" " << std::setw(3)
702 << (noflags ? 0 : flags[i]) <<
" " << std::setw(w) <<
data[i] <<
" "
703 << std::setw(w) << sdif <<
" " << std::setw(w) << ssig <<
" "
704 << std::setw(w) << slop <<
" " << std::setw(w) << slou <<
" "
705 << std::setw(w) << sldx <<
" " << std::setw(w) << sludx <<
" "
706 << std::setprecision(2) << std::setw(5)
709 << (haveAvec && Avec[j].sigN > siglim ?
" SIG" :
"")
710 << (haveAvec ?
"" :
" NA");
711 if (k < results.size() && haveAvec && i == results[k].index)
713 os <<
" " << results[k].asString()
715 results[k].
score < 100
723 iprev = Avec[j].index;
748 const std::vector<int>
764 std::vector<unsigned int>
782 const std::vector<int>& f,
783 std::ostream& os = std::cout)
789 label = std::string();
904 bool doInt =
true,
const int badFlag = 1);
916 const unsigned int size(xdata.size() <
data.size() ? xdata.size()
924 std::vector<std::vector<FilterHit<T>>> Results;
928 std::vector<T> Tdata(
data);
930 std::vector<int> Tflags;
931 if (flags.size() < size)
933 Tflags = std::vector<int>(size, 0);
937 Tflags = std::vector<int>(flags);
941 unsigned int iter, i, j, k, nr(0);
946 while (iter <= itermax)
964 logstrm <<
"Not enough data, abort.\n";
968 if (iter == itermax && keepSigIndex)
978 logstrm <<
"# " << label <<
" Estimated sigma limit " << std::fixed
979 << std::setprecision(osp) << Esiglim
980 <<
" and used sigma limit " << siguse <<
" (input was "
981 << siglim <<
") with " << N <<
" hi-sigma points "
990 if (Esiglim > siglim)
992 if (Esiglim / siglim < 3.0)
1001 else if (Esiglim < siglim)
1003 if (Esiglim / siglim > 0.1)
1009 siguse = 0.1 * siglim;
1020 std::vector<unsigned int>
1025 for (i = 0; i < results.size(); i++)
1029 logstrm <<
"# " << label <<
" Result " << ++nr << std::fixed
1030 << std::setprecision(osp) <<
" "
1031 << xdata[results[i].index] <<
" "
1032 << results[i].asString(osp) << std::endl;
1038 k = results[i].index;
1039 for (j = 0; j < results[i].npts; j++)
1049 for (k = 0; k < Results.size(); k++)
1052 for (j = 0; j < Results[k].size(); j++)
1060 if (results[i].index != oldres.
index)
1067 if (results[i].score == 100 && oldres.
score == 100)
1072 T step = oldres.
step + results[i].step;
1075 oldres.
sigma = results[i].sigma;
1077 (
unsigned int)(0.5 + 100. * ::fabs(step) / fdlim);
1078 if (oldres.
score > 100)
1089 else if (results[i].score == 100 || oldres.
score == 100)
1103 eraseIndex.push_back(i);
1108 if (::fabs(results[i].step) < fdlim)
1117 int islip(results[i].step +
1118 (results[i].step >= 0.0 ? 0.5 : -0.5));
1123 logstrm <<
"# " << label <<
" Fix slip " << islip <<
" "
1124 << results[i].asString(osp) << std::endl;
1129 for (j = results[i].index; j < Tdata.size(); j++)
1137 if (eraseIndex.size() > 0)
1140 for (i = eraseIndex.size() - 1; i >= 0; i--)
1144 results.erase(results.begin() + eraseIndex[i]);
1154 Results.push_back(results);
1170 for (k = 0; k < Results.size(); k++)
1171 for (j = 0; j < Results[k].size(); j++)
1172 results.push_back(Results[k][j]);
1177 std::vector<unsigned int>
1179 for (i = 0; i < results.size(); i++)
1187 if (results[i].score == 100)
1191 eraseIndex.push_back(i);
1193 if (eraseIndex.size() > 0)
1195 for (i = eraseIndex.size() - 1; i >= 0; i--)
1200 results.erase(results.begin() + eraseIndex[i]);
1210 return results.size();
1216 std::vector<int>& flags,
1217 bool doInt,
const int badFlag)
1220 unsigned int i, j, n;
1222 for (i = 0; i < results.size(); i++)
1232 j = results[i].index;
1234 for (n = 0; n < results[i].npts; nedit++, n++, j++)
1240 double slip(results[i].step);
1243 int islip(slip + (slip >= 0.0 ? 0.5 : -0.5));
1248 slip = double(islip);
1250 for (j = results[i].index; j <
data.size(); j++)
1262 #endif // #define FDIFF_FILTER_INCLUDE