FirstDiffFilter.hpp
Go to the documentation of this file.
1 //==============================================================================
2 //
3 // This file is part of GNSSTk, the ARL:UT GNSS Toolkit.
4 //
5 // The GNSSTk is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published
7 // by the Free Software Foundation; either version 3.0 of the License, or
8 // any later version.
9 //
10 // The GNSSTk is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with GNSSTk; if not, write to the Free Software Foundation,
17 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 //
19 // This software was developed by Applied Research Laboratories at the
20 // University of Texas at Austin.
21 // Copyright 2004-2022, The Board of Regents of The University of Texas System
22 //
23 //==============================================================================
24 
25 //==============================================================================
26 //
27 // This software was developed by Applied Research Laboratories at the
28 // University of Texas at Austin, under contract to an agency or agencies
29 // within the U.S. Department of Defense. The U.S. Government retains all
30 // rights to use, duplicate, distribute, disclose, or release this software.
31 //
32 // Pursuant to DoD Directive 523024
33 //
34 // DISTRIBUTION STATEMENT A: This software has been approved for public
35 // release, distribution is unlimited.
36 //
37 //==============================================================================
38 
90 #ifndef FIRST_DIFF_FILTER_INCLUDE
91 #define FIRST_DIFF_FILTER_INCLUDE
92 
93 #include "RobustStats.hpp"
94 #include "Stats.hpp"
95 #include <vector>
96 //#include "StringUtils.hpp" // TEMP
97 //#include "logstream.hpp" // TEMP
98 
99 #include "StatsFilterHit.hpp"
100 
101 namespace gnsstk
102 {
103  //---------------------------------------------------------------------------------
104  //---------------------------------------------------------------------------------
111  template <class T> class FirstDiffFilter
112  {
113  public:
115  class Analysis
116  {
117  public:
119  Analysis() {}
120  // member data
121  unsigned int
123  T diff;
124  T aveN, sigN;
125  }; // end class Analysis
127 
135  FirstDiffFilter(const std::vector<T>& x, const std::vector<T>& d,
136  const std::vector<int>& f)
137  : data(d), xdata(x), flags(f)
138  {
139  fdlimit = T(8.0);
140  noxdata = (xdata.size() == 0);
141  noflags = (flags.size() == 0);
142  dumpNA = true;
143  osw = 8;
144  osp = 3;
145  }
146 
148  inline void setLimit(T val) { fdlimit = val; }
149  inline T getLimit() { return fdlimit; }
151  inline void setw(int w) { osw = w; }
152  inline void setprecision(int p) { osp = p; }
153  inline void setDumpNoAnal(bool b) { dumpNA = b; }
154  inline bool willDumpNoAnal() { return dumpNA; }
156  std::vector<FilterHit<T>> getResults() { return results; }
157 
169  int filter(const size_t index = 0, int npts = -1);
170 
177  int analyze();
178 
187  int analyze2(double ratlim, double siglim)
188  {
189  std::string msg;
190  return analyze2(ratlim, siglim, false, msg);
191  }
192 
199  int analyze2(double ratlim, double siglim,
200  std::string& dumpmsg)
201  {
202  return analyze2(ratlim, siglim, true, dumpmsg);
203  }
204 
211  void fixUpResults();
212 
217  void dump(std::ostream& s, const std::string& tag = std::string());
218 
219  // NB there should be another routine (outside this class) to get stats on
220  // the data within a segment
226  void getStats(FilterHit<T>& fe);
227 
228  // member data
229  int osw, osp;
230  bool noxdata;
231  bool noflags;
232  bool dumpNA;
233 
235  unsigned int Npts;
236  const std::vector<T> &xdata;
237  const std::vector<T> &data;
238  const std::vector<int>
239  &flags;
240  int ilimit;
241 
247  std::vector<Analysis> analvec;
248 
250  std::vector<FilterHit<T>> results;
251 
252  private:
260  int analyze2(double ratlim, double siglim, bool dump,
261  std::string& dumpmsg);
262 
263  }; // end class FirstDiffFilter
264 
265  //---------------------------------------------------------------------------------
266  template <class T> int FirstDiffFilter<T>::filter(const size_t i0, int dsize)
267  {
268  if (dsize == -1)
269  {
270  dsize = data.size() - i0;
271  }
272 
273  // largest allowed index is ilimit-1
274  ilimit = dsize + i0;
275 
276  // is there enough data? if not return -1
277  int i(i0), n(0);
278  if (!noflags)
279  {
280  while (i < ilimit && n < 2)
281  {
282  if (flags[i] == 0)
283  {
284  n++;
285  }
286  i++;
287  }
288  if (i == ilimit)
289  {
290  return -1;
291  }
292  }
293  else if (dsize < 2)
294  {
295  return -1;
296  }
297 
298  // if xdata or flags is there, make sure its big enough
299  if (!noflags && flags.size() - i0 < dsize)
300  {
301  return -3;
302  }
303 
304  analvec.clear();
305 
306  // find the first good point, but don't necessarily increment
307  i = i0;
308  if (!noflags)
309  {
310  while (i < ilimit && flags[i])
311  i++;
312  }
313  int iprev(-1);
314  while (i < ilimit)
315  {
316  Analysis A;
317  A.index = i;
318  A.diff = (iprev == -1 ? T(0) : data[i] - data[iprev]);
319  analvec.push_back(A);
320  iprev = i;
321  i++;
322  if (!noflags)
323  {
324  while (i < ilimit && flags[i])
325  i++;
326  }
327  }
328 
329  return analvec.size();
330 
331  } // end FirstDiffFilter::filter()
332 
333  //---------------------------------------------------------------------------------
334  template <class T> int FirstDiffFilter<T>::analyze()
335  {
336  bool prevIsBad(false);
337  int i, igood(0), nbad(0);
338  T sumbad(0);
339 
340  // create first event = BOD
341  results.clear();
342  {
343  FilterHit<T> fe;
344  fe.index = analvec[0].index;
345  fe.type = FilterHit<T>::BOD;
346  fe.ngood = 0;
347  results.push_back(fe);
348  }
349  int curr(0);
350 
351  // loop over first differences
352  for (i = 0; i < analvec.size(); i++)
353  {
354  results[curr].ngood++; // count it; only good gets into analvec
355 
356  // NB analvec[0].diff == 0 always
357  if (::fabs(analvec[i].diff) > fdlimit)
358  {
359  nbad++;
360  sumbad += analvec[i].diff;
361  prevIsBad = true;
362  // LOG(INFO) << "bad index " << analvec[i].index << " nbad " <<
363  // nbad;
364  }
365  else if (!prevIsBad)
366  { // good 1st diff following good 1st diff
367  // LOG(INFO) << "good index " << analvec[i].index;
368  igood = i;
369  }
370  else
371  { // good 1st diff following bad one(s)
372  // LOG(INFO) << "good after bad index "<< analvec[i].index<< " nbad
373  // " << nbad;
374  results[curr].ngood -= nbad + 1; // finish the current segment
375 
376  if (::fabs(sumbad) > fdlimit)
377  { // its a slip
378  // LOG(INFO) << "slip " << sumbad << " > " << fdlimit;
379  // if nbad > 1, must report outlier(s) first
380  FilterHit<T> fe;
381  if (nbad > 1)
382  {
383  results[curr].npts =
384  analvec[igood + 1].index - results[curr].index;
385  fe.index = analvec[igood + 1].index;
387  fe.ngood = 0;
388  fe.npts = analvec[i].index - fe.index;
389  results.push_back(fe);
390  curr++;
391  }
392  results[curr].npts =
393  analvec[igood + nbad].index - results[curr].index;
394  // start the new segment (slip)
395  fe.index = analvec[igood + nbad].index;
397  fe.ngood = 2; // bc this is 2nd point into slip
398  fe.step = data[analvec[igood + nbad].index] -
399  data[analvec[igood].index];
400  results.push_back(fe);
401  curr++;
402  }
403  else
404  { // its just outliers(s)
405  // LOG(INFO) << "outliers " << sumbad << " <= " << fdlimit;
406  results[curr].npts =
407  analvec[igood + 1].index - results[curr].index;
408  // report the outliers
409  FilterHit<T> fe;
410  fe.index = analvec[igood + 1].index;
412  fe.ngood = 0;
413  fe.npts = analvec[igood + nbad].index - fe.index;
414  fe.step = sumbad;
415  results.push_back(fe);
416  curr++;
417  // start the new segment (BOD)
418  fe.index = analvec[igood + nbad].index;
419  fe.type = FilterHit<T>::BOD;
420  fe.ngood = 2;
421  results.push_back(fe);
422  curr++;
423  }
424 
425  // prep for next segment
426  sumbad = T(0);
427  nbad = 0;
428  igood = i;
429  prevIsBad = false;
430  }
431  } // end loop over first differences
432 
433  // finish off with outlier(s)
434  if (prevIsBad)
435  {
436  results[curr].ngood -= nbad;
437  FilterHit<T> fe;
438  fe.index = analvec[igood + 1].index;
440  fe.ngood = 0;
441  results[curr].npts = fe.index - results[curr].index;
442  fe.npts = ilimit - fe.index;
443  results.push_back(fe);
444  curr++;
445  }
446  else // define npts for the last segment
447  {
448  results[curr].npts = ilimit - results[curr].index;
449  }
450 
451  fixUpResults();
452 
453  return (results.size());
454 
455  } // end FirstDiffFilter::analyze()
456 
457  //---------------------------------------------------------------------------------
458  // fix some potential problems in the results vector, namely:
459  // if the first point(s) are outliers, analyze() makes the first FilterHit
460  // BOD with only 1 point (because the first point is good *by definition*),
461  // then either outliers or a slip; fix this by making first
462  // FilterHit outliers.
463  template <class T> void FirstDiffFilter<T>::fixUpResults()
464  {
465  if (results[0].npts > 1)
466  {
467  return;
468  }
469 
470  // change the first FilterHit to outliers
471  results[0].type = FilterHit<T>::outlier;
472 
473  while (results.size() > 1)
474  {
475  if (results[1].type == FilterHit<T>::slip)
476  {
477  results[1].type = FilterHit<T>::BOD;
478  break;
479  }
480  else if (results[1].type == FilterHit<T>::outlier)
481  {
482  results[0].npts += results[1].npts;
483  results[0].ngood = 0;
484  results.erase(results.begin() + 1);
485  }
486  else
487  {
488  break;
489  }
490  }
491  }
492 
493  //---------------------------------------------------------------------------------
494  template <class T>
495  int FirstDiffFilter<T>::analyze2(double ratlim, double siglim,
496  bool dump, std::string& dumpmsg)
497  {
498  const unsigned int N(4);
499  unsigned int i, j;
500  std::ostringstream oss;
501  gnsstk::Stats<double> pstats, fstats; // TD? TwoSampleStats
502 
503  if (dump)
504  {
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;
510  }
511 
512  // create first event = BOD
513  results.clear();
514  {
515  FilterHit<T> fe;
516  fe.index = analvec[0].index;
517  fe.type = FilterHit<T>::BOD;
518  fe.ngood = 0;
519  results.push_back(fe);
520  }
521  int curr(0), i0(1);
522  double tstep, tstepmin, tstepmax(0.0);
523  tstepmin =
524  (noxdata ? 0 : xdata[analvec[1].index] - xdata[analvec[0].index]);
525  const unsigned int size(analvec.size());
526 
528  // std::cout << "TST size is " << size << std::endl;
529  // try {
530  // for(i=i0; i<size+N-1; i++) { // i=index=1,...
531  // j=count=0,...
532  // j=i-i0+1; // NB i0 is changed when
533  // hit found if(i<size) fstats.Add(analvec[i].diff); if(j>N)
534  // fstats.Subtract(analvec[i-N].diff); if(j>N+1)
535  // pstats.Add(analvec[i-N-1].diff); if(j>2*N+1)
536  // pstats.Subtract(analvec[i-2*N-1].diff);
537 
538  // std::cout << "TST " << std::setw(4) << i << std::fixed<<
539  // std::setprecision(3); if(j>N+2) std::cout
540  // << " P " << std::setw(3) << pstats.N()
541  // << " " << std::setw(8) << pstats.Average()
542  // << " " << std::setw(8) << pstats.StdDev();
543  // else std::cout << " P NA NA NA";
544  // if(j>N) std::cout << " T " << std::setw(8) << analvec[i-N].diff;
545  // else std::cout << " T " << std::setw(8) << "NA";
546  // if(j>1 && fstats.N()>2) std::cout
547  // << " F " << std::setw(3) << fstats.N()
548  // << " " << std::setw(8) << fstats.Average()
549  // << " " << std::setw(8) << fstats.StdDev();
550  // else std::cout << " F NA NA NA";
551  // //if(i<size) std::cout << " D " << std::setw(8) << analvec[i].diff;
552  // //else std::cout << " D " << std::setw(8) << "NA";
553  // std::cout << std::endl;
554  //}
555  //} catch(gnsstk::Exception& e) { std::cout << "TST " << e.what() <<
556  //std::endl; } fstats.Reset(); pstats.Reset();
558 
559  // loop over first differences
560  // keep stats on the N points before, and N points after, the current
561  // point NB skip the first pt b/c diff==0 and it means nothing
562  for (j = 0, i = i0; i < size + N - 1; i++)
563  { // NB i0 changes when hit
564  results[curr].ngood++; // count it; only good gets into analvec
565 
566  // std::cout << "DAT " << i << std::fixed << std::setprecision(3)
567  // << " " << xdata[analvec[i].index]
568  // << " " << data[analvec[i].index]
569  // << " " << analvec[i].diff
570  // << std::endl;
571 
572  j++; // count points added
573  if (i < size)
574  {
575  fstats.Add(analvec[i].diff);
576  analvec[i].aveN = fstats.Average();
577  analvec[i].sigN = fstats.StdDev();
578  }
579  if (j > N)
580  {
581  fstats.Subtract(analvec[i - N].diff);
582  }
583  if (j > N + 1)
584  {
585  pstats.Add(analvec[i - N - 1].diff);
586  }
587  if (j > 2 * N + 1)
588  {
589  pstats.Subtract(analvec[i - 2 * N - 1].diff);
590  }
591 
592  if (j > N + 2 && pstats.N() > 2)
593  {
594  double diff(analvec[i - N].diff);
595  double pa(pstats.Average()), fa(fstats.Average());
596  double ps(pstats.StdDev()), fs(fstats.StdDev());
597  double avefd((pa + fa) / 2.0); // fdiff ave of past and future
598  double step(diff - avefd); // fd minus average fd
599  if (pstats.N() < 2)
600  {
601  pa = 0.0;
602  ps = 0.0;
603  }
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); // ratios step/sigma
607  double rat((pr + fr) / 2.0);
608  // double rat(step/sig);
609 
610  // criteria for finding a slip
611  bool hitslip(::fabs(step) > fdlimit // step is big
612  && sig < siglim // noise is not large
613  && rat > ratlim); // ratio step/sig large
614  bool hisig(sig > fdlimit); // sigma is high - bigger than steplim
615 
616  tstep = xdata[analvec[i - N - 1].index] -
617  xdata[analvec[i - N - 2].index];
618  if (tstep > tstepmax)
619  {
620  tstepmax = tstep;
621  }
622  if (tstep < tstepmin)
623  {
624  tstepmin = tstep;
625  }
626 
627  if (dump)
628  {
629  //<< "\n# index xdata data diff step5 ave sig7 rat8 pave
630  //psig prat fave fsig frat [SLIP] [gap]"
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)
640  {
641  oss << " gap(" << tstepmin << "<=" << tstep
642  << "<=" << tstepmax << ")";
643  }
644  oss << (::fabs(step) > fdlimit ? " step" : "")
645  << (sig < siglim ? " sig" : "")
646  << (rat > ratlim ? " rat" : "")
647  << (pr > ratlim ? " prat" : "")
648  << (fr > ratlim ? " frat" : "");
649  oss << std::endl;
650  }
651 
652  if (hitslip)
653  {
654  results[curr].ngood--;
655  results[curr].npts = analvec[i].index - analvec[i0].index;
656  results[curr].sigma = ps;
657  i0 = i;
658  FilterHit<T> fe;
659  fe.index = analvec[i - N - 1].index;
661  fe.ngood = 1;
662  fe.step = diff - (pa + fa) / 2.0; // ave of past and future
663  fe.sigma = fs;
664  results.push_back(fe);
665  curr++;
666  }
667  }
668  } // end loop over first differences
669 
670  results[curr].npts = analvec[size - 1].index - analvec[i0].index + 1;
671 
672  if (dump)
673  {
674  dumpmsg = oss.str();
675  }
676 
677  return int(results.size() - 1); // always first result = BOD
678  }
679 
680  //---------------------------------------------------------------------------------
681  template <class T>
682  void FirstDiffFilter<T>::dump(std::ostream& os, const std::string& tag)
683  {
684  size_t i, j, k;
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;
689 
690  const size_t N(analvec.size());
691  for (i = 0, j = 0, k = 0; i < ilimit; i++)
692  {
693  if (j >= N || i != analvec[j].index)
694  {
695  if (dumpNA)
696  {
697  os << tag << std::fixed << std::setprecision(osp) << " "
698  << std::setw(3) << i << " " << std::setw(osw)
699  << (noxdata ? T(i) : xdata[i])
700  //<< " " << std::setw(3) << (noflags ? 0 : flags[i])
701  << " " << std::setw(osw) << data[i] << " " << std::setw(osw)
702  << 0.0 << " NA" << std::endl;
703  }
704  }
705  else
706  {
707  os << tag << std::fixed << std::setprecision(osp) << " "
708  << std::setw(3) << i << " " << std::setw(osw)
709  << (noxdata ? T(i) : xdata[i])
710  //<< " " << std::setw(3) << (noflags ? 0 : flags[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)
714  {
715  os << " "
716  << (results[k].mad != T(0) ? // has getStats been called?
717  results[k].asStatsString(osp)
718  : results[k].asString());
719  k++;
720  }
721  os << std::endl;
722  j++;
723  }
724  }
725  } // end FirstDiffFilter<T>::dump()
726 
727  //---------------------------------------------------------------------------------
728  // compute stats on the segment of first differences given by the input
729  // FilterHit
730  template <class T> void FirstDiffFilter<T>::getStats(FilterHit<T>& fe)
731  {
732  int j(-1);
733  unsigned int i, k;
734  fe.min = fe.max = fe.med = fe.mad = T(0);
735  for (i = 0; i < analvec.size(); i++)
736  if (analvec[i].index == fe.index)
737  {
738  j = i;
739  break;
740  }
741  if (j == -1)
742  {
743  return;
744  }
745  k = fe.index + fe.npts; // last index in this seg is k-1
746 
747  // don't include the step in stats for a segment that starts with a slip
748  int i0(0);
749  if (fe.type == FilterHit<T>::slip)
750  {
751  i0 = 1;
752  }
753  // stats on first difference
754  bool first(true);
755  T fd;
756  std::vector<T> fdv;
757  for (i = i0; i < fe.npts; i++)
758  {
759  if ((unsigned int)(j) + i >= analvec.size() ||
760  analvec[j + i].index >= k)
761  {
762  break; // no more good data
763  }
764  fd = analvec[j + i].diff;
765  if (first)
766  {
767  fe.min = fe.max = fe.med = fd;
768  fe.mad = T(0);
769  first = false;
770  }
771  else
772  {
773  if (fd < fe.min)
774  {
775  fe.min = fd;
776  }
777  if (fd > fe.max)
778  {
779  fe.max = fd;
780  }
781  }
782  fdv.push_back(fd);
783  }
784 
785  if (fdv.size() < 2)
786  {
787  return; // else MAD throws
788  }
789 
790  fe.mad = gnsstk::Robust::MedianAbsoluteDeviation<T>(&fdv[0], fdv.size(),
791  fe.med, false);
792  fe.haveStats = true;
793  }
794 
795  // end template <class T> class FirstDiffFilter
796 
797  //---------------------------------------------------------------------------------
798 } // namespace gnsstk
799 #endif // define FIRST_DIFF_FILTER_INCLUDE
gnsstk::dump
void dump(vector< SatPass > &SatPassList, ostream &os, bool rev, bool dbug)
Definition: SatPassUtilities.cpp:59
gnsstk::FilterHit::index
unsigned int index
index in the data array(s) at which this event occurs
Definition: StatsFilterHit.hpp:91
gnsstk::FirstDiffFilter::xdata
const std::vector< T > & xdata
reference to xdata - used only in dump
Definition: FirstDiffFilter.hpp:236
gnsstk::FirstDiffFilter::FirstDiffFilter
FirstDiffFilter(const std::vector< T > &x, const std::vector< T > &d, const std::vector< int > &f)
Definition: FirstDiffFilter.hpp:135
gnsstk::FirstDiffFilter::analyze2
int analyze2(double ratlim, double siglim, std::string &dumpmsg)
Definition: FirstDiffFilter.hpp:199
gnsstk::Stats::Subtract
void Subtract(const T &x)
Definition: Stats.hpp:178
gnsstk::FirstDiffFilter::getResults
std::vector< FilterHit< T > > getResults()
return a copy of the filter hit results
Definition: FirstDiffFilter.hpp:156
gnsstk::FirstDiffFilter::dump
void dump(std::ostream &s, const std::string &tag=std::string())
Definition: FirstDiffFilter.hpp:682
gnsstk::FirstDiffFilter::Analysis::index
unsigned int index
index in original arrays to which this info applies.
Definition: FirstDiffFilter.hpp:122
gnsstk::FilterHit::med
T med
Definition: StatsFilterHit.hpp:104
gnsstk::Stats::StdDev
T StdDev(void) const
return computed standard deviation
Definition: Stats.hpp:347
gnsstk::FirstDiffFilter::noflags
bool noflags
true when flags array is not given
Definition: FirstDiffFilter.hpp:231
gnsstk::FirstDiffFilter::willDumpNoAnal
bool willDumpNoAnal()
Definition: FirstDiffFilter.hpp:154
gnsstk::FilterHit::max
T max
Definition: StatsFilterHit.hpp:104
gnsstk::FirstDiffFilter::data
const std::vector< T > & data
reference to data to be filtered
Definition: FirstDiffFilter.hpp:237
gnsstk::FirstDiffFilter::filter
int filter(const size_t index=0, int npts=-1)
Definition: FirstDiffFilter.hpp:266
gnsstk::FirstDiffFilter::Analysis::Analysis
Analysis()
constructor
Definition: FirstDiffFilter.hpp:119
gnsstk
For Sinex::InputHistory.
Definition: BasicFramework.cpp:50
gnsstk::Stats< double >
gnsstk::FirstDiffFilter::setDumpNoAnal
void setDumpNoAnal(bool b)
Definition: FirstDiffFilter.hpp:153
gnsstk::FirstDiffFilter::analyze2
int analyze2(double ratlim, double siglim)
Definition: FirstDiffFilter.hpp:187
Stats.hpp
gnsstk::FirstDiffFilter::getLimit
T getLimit()
Definition: FirstDiffFilter.hpp:149
gnsstk::FirstDiffFilter::ilimit
int ilimit
largest allowed index in data[] is ilimit-1
Definition: FirstDiffFilter.hpp:240
gnsstk::FirstDiffFilter::Analysis::diff
T diff
first difference = data[index]-data[index-1]
Definition: FirstDiffFilter.hpp:123
gnsstk::FirstDiffFilter::analvec
std::vector< Analysis > analvec
Definition: FirstDiffFilter.hpp:247
gnsstk::FirstDiffFilter
Definition: FirstDiffFilter.hpp:111
gnsstk::FirstDiffFilter::fixUpResults
void fixUpResults()
Definition: FirstDiffFilter.hpp:463
gnsstk::FirstDiffFilter::dumpNA
bool dumpNA
if false, don't dump() data with no analysis (T)
Definition: FirstDiffFilter.hpp:232
gnsstk::FirstDiffFilter::osp
int osp
width and precision for dump(), (default 8,3)
Definition: FirstDiffFilter.hpp:229
gnsstk::FirstDiffFilter::Npts
unsigned int Npts
size of sliding window
Definition: FirstDiffFilter.hpp:235
gnsstk::FilterHit::haveStats
bool haveStats
set true when getStats() is called
Definition: StatsFilterHit.hpp:102
gnsstk::FirstDiffFilter::setprecision
void setprecision(int p)
Definition: FirstDiffFilter.hpp:152
gnsstk::FirstDiffFilter::results
std::vector< FilterHit< T > > results
vector of FilterHit, generated by analyze(), also for use in dump()
Definition: FirstDiffFilter.hpp:250
gnsstk::FilterHit::npts
unsigned int npts
number data points in segment (= a delta index)
Definition: StatsFilterHit.hpp:93
gnsstk::FirstDiffFilter::fdlimit
T fdlimit
|first diff| must be > this to be an outlier
Definition: FirstDiffFilter.hpp:234
gnsstk::FirstDiffFilter::setLimit
void setLimit(T val)
get and set
Definition: FirstDiffFilter.hpp:148
RobustStats.hpp
example3.data
data
Definition: example3.py:22
StatsFilterHit.hpp
gnsstk::FirstDiffFilter::noxdata
bool noxdata
true when xdata is not given
Definition: FirstDiffFilter.hpp:230
gnsstk::FilterHit::ngood
unsigned int ngood
number of good (flag==0) points in this segment
Definition: StatsFilterHit.hpp:94
gnsstk::FirstDiffFilter::analyze
int analyze()
Definition: FirstDiffFilter.hpp:334
gnsstk::FilterHit::min
T min
Definition: StatsFilterHit.hpp:104
gnsstk::FirstDiffFilter::Analysis::aveN
T aveN
Definition: FirstDiffFilter.hpp:124
gnsstk::FilterHit::step
T step
for a slip, an estimate of the step in the data
Definition: StatsFilterHit.hpp:98
gnsstk::Stats::Average
T Average(void) const
return the average
Definition: Stats.hpp:329
gnsstk::Stats::Add
void Add(const T &x)
Definition: Stats.hpp:158
gnsstk::FirstDiffFilter::Analysis
class used to store analysis arrays filled by the first difference filter
Definition: FirstDiffFilter.hpp:115
gnsstk::FirstDiffFilter::osw
int osw
Definition: FirstDiffFilter.hpp:229
gnsstk::FilterHit::type
event type
type of event: BOD, outlier(s), slip, other
Definition: StatsFilterHit.hpp:88
gnsstk::FirstDiffFilter::Analysis::sigN
T sigN
Definition: FirstDiffFilter.hpp:124
gnsstk::FilterHit
Definition: StatsFilterHit.hpp:68
gnsstk::FilterHit::sigma
T sigma
for a slip, RSS future and past sigma on the data
Definition: StatsFilterHit.hpp:99
gnsstk::FirstDiffFilter::flags
const std::vector< int > & flags
reference to flags, parallel to data, 0 == good
Definition: FirstDiffFilter.hpp:239
gnsstk::FirstDiffFilter::setw
void setw(int w)
get and set for dump
Definition: FirstDiffFilter.hpp:151
gnsstk::FirstDiffFilter::getStats
void getStats(FilterHit< T > &fe)
Definition: FirstDiffFilter.hpp:730
gnsstk::FilterHit::mad
T mad
robust stats on the filter quantities (not data)
Definition: StatsFilterHit.hpp:104
gnsstk::Stats::N
unsigned int N(void) const
return the sample size
Definition: Stats.hpp:318


gnsstk
Author(s):
autogenerated on Wed Oct 25 2023 02:40:39