Titanlib 0.3.3
Library for quality control algorithms
titanlib.h
Go to the documentation of this file.
1 #ifndef TITANLIB_H
2 #define TITANLIB_H
3 #include <iostream>
4 #include <vector>
5 #include <assert.h>
6 #include <boost/geometry.hpp>
7 #include <boost/geometry/geometries/point.hpp>
8 #include <boost/geometry/geometries/box.hpp>
9 #include <boost/geometry/index/rtree.hpp>
10 #include <boost/numeric/ublas/matrix.hpp>
11 #ifdef _OPENMP
12  #include <omp.h>
13 #endif
14 
15 #define TITANLIB_VERSION "0.3.3"
16 #define __version__ TITANLIB_VERSION
17 
18 namespace titanlib {
22  // Preferred vector types
23  typedef std::vector<int> ivec;
24  typedef std::vector<float> vec;
25  typedef std::vector<double> dvec;
26  typedef std::vector<vec> vec2;
34  static const float MV = NAN;
36  static const float MV_CML = -999;
38  static const float pi = 3.14159265;
40  static const double radius_earth = 6.378137e6;
45  Geodetic = 0,
46  Cartesian = 1,
47  };
48 
54  External = 4,
55  };
56 
58  Eq = 0,
59  Gt = 1,
60  Geq = 2,
61  Lt = 3,
62  Leq = 4,
63  };
64 
65  class Points;
66 
86  ivec sct(const Points& points,
87  const vec& values,
88  int num_min,
89  int num_max,
90  float inner_radius,
91  float outer_radius,
92  int num_iterations,
93  int num_min_prof,
94  float min_elev_diff,
95  float min_horizontal_scale,
96  float vertical_scale,
97  const vec& pos,
98  const vec& neg,
99  const vec& eps2,
100  vec& prob_gross_error,
101  vec& rep,
102  const ivec& obs_to_check=ivec());
103 
133  ivec sct_resistant( const Points& points,
134  const vec& values,
135  const ivec& obs_to_check,
136  const vec& background_values,
137  BackgroundType background_elab_type,
138  int num_min_outer,
139  int num_max_outer,
140  float inner_radius,
141  float outer_radius,
142  int num_iterations,
143  int num_min_prof,
144  float min_elev_diff,
145  float min_horizontal_scale,
146  float max_horizontal_scale,
147  int kth_closest_obs_horizontal_scale,
148  float vertical_scale,
149  const vec& value_mina,
150  const vec& value_maxa,
151  const vec& value_minv,
152  const vec& value_maxv,
153  const vec& eps2,
154  const vec& tpos,
155  const vec& tneg,
156  bool debug,
157  bool basic,
158  vec& scores);
159 
179  ivec sct_dual( const Points& points,
180  const vec& values,
181  const ivec& obs_to_check,
182  const vec& event_thresholds,
183  ConditionType condition,
184  int num_min_outer,
185  int num_max_outer,
186  float inner_radius,
187  float outer_radius,
188  int num_iterations,
189  float min_horizontal_scale,
190  float max_horizontal_scale,
191  int kth_closest_obs_horizontal_scale,
192  float vertical_scale,
193  const vec& test_thresholds,
194  bool debug);
195 
221  ivec fgt( const Points& points,
222  const vec& values,
223  const ivec& obs_to_check,
224  const vec& background_values,
225  const vec& background_uncertainties,
226  BackgroundType background_elab_type,
227  int num_min_outer,
228  int num_max_outer,
229  float inner_radius,
230  float outer_radius,
231  int num_iterations,
232  int num_min_prof,
233  float min_elev_diff,
234  const vec& value_mina,
235  const vec& value_maxa,
236  const vec& value_minv,
237  const vec& value_maxv,
238  const vec& tpos,
239  const vec& tneg,
240  bool debug,
241  bool basic,
242  vec& scores);
243 
250  ivec range_check(const vec& values,
251  const vec& min,
252  const vec& max);
253 
254  ivec range_check_climatology(const Points& points,
255  const vec& values,
256  int unixtime,
257  const vec& pos,
258  const vec& neg);
259 
272  ivec buddy_check(const Points& points,
273  const vec& values,
274  const vec& radius,
275  const ivec& num_min,
276  float threshold,
277  float max_elev_diff,
278  float elev_gradient,
279  float min_std,
280  int num_iterations,
281  const ivec& obs_to_check = ivec());
282 
283  ivec buddy_event_check(const Points& points,
284  const vec& values,
285  const vec& radius,
286  const ivec& num_min,
287  float event_threshold,
288  float threshold,
289  float max_elev_diff,
290  float elev_gradient,
291  int num_iterations,
292  const ivec& obs_to_check = ivec());
293 
300  ivec isolation_check(const Points& points,
301  int num_min,
302  float radius,
303  float vertical_radius=MV);
304 
311  ivec isolation_check(const Points& points,
312  const ivec& num_min,
313  const vec& radius,
314  const vec& vertical_radius=vec());
315 
320  ivec duplicate_check(const Points& points, float radius, float vertical_range=titanlib::MV);
321 
322  ivec metadata_check(const Points& points, bool check_lat=true, bool check_lon=true, bool check_elev=true, bool check_laf=true);
323 
331  vec lag_reduction_filter(const vec& times, const vec& values, float a=0.5, float b=0.5, float k1=0.25, float k2=0.25, int n=10);
332 
338  void set_omp_threads(int num);
339 
341  int get_omp_threads();
342 
344  void initialize_omp();
345 
354  std::string version();
355 
359  double clock();
360  bool is_valid(float value);
361 
370  vec compute_vertical_profile(const vec& elevs, const vec& oelevs, const vec& values, int num_min_prof, double min_elev_diff, bool debug=false);
371 
372  vec compute_vertical_profile_Theil_Sen(const vec& elevs, const vec& oelevs, const vec& values, int num_min_prof, double min_elev_diff, bool debug);
373 
381  bool convert_coordinates(const vec& lats, const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords);
382 
390  bool convert_coordinates(float lat, float lon, float& x_coord, float& y_coord, float& z_coord);
391 
392  vec interpolate_to_points(const vec2& input_lats, const vec2& input_lons, const vec2& input_values, const vec& output_lats, const vec& output_lons);
393  float deg2rad(float deg);
394  float calc_distance(float lat1, float lon1, float lat2, float lon2);
395  float calc_distance(float x0, float y0, float z0, float x1, float y1, float z1);
396 
397  float compute_quantile(double quantile, const vec& array);
398  float find_k_closest(const vec& array, int k);
399  template <class T> T subset(const T& array, const ivec& indices) {
400  if(array.size() == 0)
401  return array;
402  if(indices.size() == 0) {
403  return array;
404  }
405 
406  T new_array(indices.size());
407  for(int i = 0; i < indices.size(); i++) {
408  new_array[i] = array[indices[i]];
409  }
410  return new_array;
411  }
412  Points subset(const Points& input, const ivec& indices);
413  template <class T> void unsubset(const T& array, T& orig_array, const ivec& indices) {
414  orig_array.clear();
415  orig_array.resize(indices.size());
416  assert(array.size() == indices.size());
417  for(int i = 0; i < indices.size(); i++) {
418  orig_array[indices[i]] = array[i];
419  }
420  }
421 
422 
435  vec background(const vec& elevs, const vec& values, int num_min_prof, float min_elev_diff, float value_minp, float value_maxp, BackgroundType background_type, const vec& external_background_values, const ivec& indices_global_outer, bool debug);
436 
437  bool invert_matrix (const boost::numeric::ublas::matrix<float>& input, boost::numeric::ublas::matrix<float>& inverse);
438 
439  bool set_indices( const ivec& indices_global_outer_guess, const ivec& obs_test, const ivec& dqcflags, const vec& dist_outer_guess, float inner_radius, int test_just_this, ivec& indices_global_outer, ivec& indices_global_test, ivec& indices_outer_inner, ivec& indices_outer_test, ivec& indices_inner_test);
440  template<class T1, class T2> struct sort_pair_first {
441  bool operator()(const std::pair<T1,T2>&left, const std::pair<T1,T2>&right) {
442  return left.first < right.first;
443  };
444  };
452  float* test_array(float* v, int n);
453 
456  // ivec nearest_neighbours(const vec& lats, const vec& lons, float radius, float lat, float lon);
457 
458  // bool prioritize(const vec& values, const ivec& priority, float distance, ivec& flags);
459 
460  class Point {
461  public:
469  Point(float lat, float lon, float elev=MV, float laf=MV, CoordinateType type=Geodetic);
470  float lat;
471  float lon;
472  float elev;
473  float laf;
475  };
476  class KDTree {
477  public:
478  KDTree(vec lats, vec lons, CoordinateType type=Geodetic);
479  KDTree& operator=(KDTree other);
480  KDTree(const KDTree& other);
481  KDTree(CoordinateType type=Geodetic) {mType=type;};
482 
487  int get_nearest_neighbour(float lat, float lon, bool include_match=true) const;
488 
494  ivec get_neighbours(float lat, float lon, float radius, bool include_match=true) const;
495 
502  ivec get_neighbours_with_distance(float lat, float lon, float radius, vec& distances, bool include_match=true) const;
503 
509  int get_num_neighbours(float lat, float lon, float radius, bool include_match=true) const;
510 
516  ivec get_closest_neighbours(float lat, float lon, int num, bool include_match=true) const;
517 
518 
526  bool convert_coordinates(const vec& lats, const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords) const;
527 
535  bool convert_coordinates(float lat, float lon, float& x_coord, float& y_coord, float& z_coord) const;
536  static float deg2rad(float deg);
537  static float rad2deg(float deg);
538  static float calc_distance(float lat1, float lon1, float lat2, float lon2, CoordinateType type=Geodetic);
539  static float calc_distance(float x0, float y0, float z0, float x1, float y1, float z1);
540  static float calc_distance_fast(float lat1, float lon1, float lat2, float lon2, CoordinateType type=Geodetic);
541  static float calc_distance_fast(const Point& p1, const Point& p2);
542  vec get_lats() const;
543  vec get_lons() const;
544  int size() const;
545  CoordinateType get_coordinate_type() const;
546  protected:
547  typedef boost::geometry::model::point<float, 3, boost::geometry::cs::cartesian> point;
548  typedef std::pair<point, unsigned> value;
549  typedef boost::geometry::model::box<point> box;
550  boost::geometry::index::rtree< value, boost::geometry::index::quadratic<16> > mTree;
551  vec mLats;
552  vec mLons;
554 
555  struct within_radius {
556  public:
557  within_radius(point p, float radius);
558  bool operator()(value const& v) const;
559  private:
560  float radius;
561  point p;
562  };
563  struct is_not_equal {
564  public:
565  is_not_equal(point p);
566  bool operator()(value const& v) const;
567  private:
568  point p;
569  };
570  };
571  class Points {
572  public:
573  Points();
581  Points(vec lats, vec lons, vec elevs=vec(), vec lafs=vec(), CoordinateType type=Geodetic);
582  Points(KDTree tree, vec elevs=vec(), vec lafs=vec());
583  Points& operator=(Points other);
584  Points(const Points& other);
585  // Returns -1 if there are no neighbours
586  int get_nearest_neighbour(float lat, float lon, bool include_match=true) const;
587  ivec get_neighbours(float lat, float lon, float radius, bool include_match=true) const;
588  ivec get_neighbours_with_distance(float lat, float lon, float radius, vec& distances, bool include_match=true) const;
589  int get_num_neighbours(float lat, float lon, float radius, bool include_match=true) const;
590  ivec get_closest_neighbours(float lat, float lon, int num, bool include_match=true) const;
591 
592  vec get_lats() const;
593  vec get_lons() const;
594  vec get_elevs() const;
595  vec get_lafs() const;
596  int size() const;
597  CoordinateType get_coordinate_type() const;
598  private:
599  KDTree mTree;
600  vec mLats;
601  vec mLons;
602  vec mElevs;
603  vec mLafs;
604  };
605 
607  class Dataset {
608  public:
609  Dataset(Points points, vec ivalues);
613  void range_check(const vec& min, const vec& max, const ivec& indices=ivec(1, -1));
614  void range_check_climatology(int unixtime, const vec& pos, const vec& neg, const ivec& indices=ivec(1, -1));
615  void sct(int num_min, int num_max, float inner_radius, float outer_radius, int num_iterations, int num_min_prof, float min_elev_diff, float min_horizontal_scale, float vertical_scale, const vec& t2pos, const vec& t2neg, const vec& eps2, vec& prob_gross_error, vec& rep, const ivec& indices=ivec(1, -1));
616  void buddy_check(const vec& radius, const ivec& num_min, float threshold, float max_elev_diff, float elev_gradient, float min_std, int num_iterations, const ivec& obs_to_check=ivec(), const ivec& indices=ivec(1, -1));
617  void buddy_event_check(const vec& radius, const ivec& num_min, float event_threshold, float threshold, float max_elev_diff, float elev_gradient, int num_iterations, const ivec& obs_to_check=ivec(), const ivec& indices=ivec(1, -1));
618  void isolation_check(int num_min, float radius, float vertical_radius=MV, const ivec& indices=ivec(1, -1));
619  void isolation_check(const ivec& num_min, const vec& radius, const vec& vertical_radius=vec(), const ivec& indices=ivec(1, -1));
620  void duplicate_check(float radius, float vertical_range=titanlib::MV, const ivec& indices=ivec(1, -1));
621  void dem_check(const vec& dem, float max_elev_diff);
622  void external_check(const ivec& flags);
623  void metadata_check(bool check_lat=true, bool check_lon=true, bool check_elev=true, bool check_laf=true, const ivec& indices=ivec(1, -1));
624 
625  Points get_points() const;
626  vec get_values() const;
627  ivec get_flags() const;
628  void set_values(vec ivalues);
629  void set_flags(ivec ivalues);
630  void set_points(Points ipoints);
631 
633  vec values;
634  ivec flags;
635  private:
636  /* Get a subset of array where flags=0 and for indices. This function is different than
637  * titanlib::subset in that it takes into account flags.
638  * @param array Vector of values
639  * @param indices Vector of indices
640  * @return Vector of values
641  */
642  template <class T> T subset_valid(const T& array, const ivec& indices=ivec(1, -1)) {
643  if(array.size() != 1 && array.size() != flags.size()) {
644  std::stringstream ss;
645  ss << "Array (" << array.size() << ") must be either size 1 or the same as dataset size (" << flags.size() << ")";
646  throw std::invalid_argument(ss.str());
647  }
648  if(indices.size() == 0)
649  return T();
650 
651  ivec indices0 = indices;
652  if(indices.size() == 1 && indices[0] == -1) {
653  // Use all indices
654  indices0.clear();
655  indices0.resize(flags.size());
656  for(int i = 0; i < flags.size(); i++)
657  indices0[i] = i;
658  }
659  T new_array;
660  new_array.reserve(indices0.size());
661  for(int i = 0; i < indices0.size(); i++) {
662  int index = indices0[i];
663  if(flags[index] == 0) {
664  if(array.size() == 1)
665  // Array is broadcast
666  new_array.push_back(array[0]);
667  else {
668  assert(index < array.size());
669  new_array.push_back(array[index]);
670  }
671  }
672  }
673  return new_array;
674  }
675  /* Same as T subset_valid, except for Points */
676  Points subset_valid(const Points& input, const ivec& indices=ivec(1, -1));
677 
678  ivec get_unflagged_indices();
679 
680  // Create a vector with results, but only for locations that have not been flagged
681  // To broadcase the values to point, use a singleton array
682  // An empty array will return an empty array
683  template <class T> T get_unflagged(const T& array) {
684  if(array.size() == 0)
685  return array;
686 
687  if(array.size() > 1 && array.size() < flags.size()) {
688  throw std::invalid_argument("Array is shorter than flags");
689  }
690 
691  ivec indices = get_unflagged_indices();
692  T output(indices.size());
693  for(int i = 0; i < indices.size(); i++) {
694  if(array.size() > 1) {
695  int index = indices[i];
696  assert(index < array.size());
697  output[i] = array[index];
698  }
699  else
700  output[i] = array[0];
701  }
702  return output;
703  }
704  Points get_unflagged_points();
705 
706  /* Same as T subset_valid, except the subsetted indices are returned */
707  ivec subset_valid(const ivec& indices);
708 
709  /* Merge the flags into the objects flags. If existing flags are 1 but new_flags are
710  * 0, the existing flags are not updated.
711  * @param new_flags Vector of new flags
712  * @param indices The location indices that flags are valid for
713  */
714  void merge_simple(const ivec& new_flags, ivec indices);
715 
716  /* Merge new flags into the object's flags. If existing flags are 1 but new_flags are
717  * 0, the existing flags are not updated.
718  * @param new_flags Vector of new flags
719  * @param indices The location indices that flags are valid for
720  */
721  void merge(const ivec& new_flags, ivec indices);
722  };
723  class not_implemented_exception: public std::logic_error
724  {
725  public:
726  not_implemented_exception() : std::logic_error("Function not yet implemented") { };
727  };
728 
729 }
730 #endif
CoordinateType type
Definition: titanlib.h:474
Latitude and longitude.
Definition: titanlib.h:45
Definition: titanlib.h:59
KDTree(CoordinateType type=Geodetic)
Definition: titanlib.h:481
std::vector< vec > vec2
Definition: titanlib.h:26
Definition: titanlib.h:61
BackgroundType
Definition: titanlib.h:49
bool set_indices(const ivec &indices_global_outer_guess, const ivec &obs_test, const ivec &dqcflags, const vec &dist_outer_guess, float inner_radius, int test_just_this, ivec &indices_global_outer, ivec &indices_global_test, ivec &indices_outer_inner, ivec &indices_outer_test, ivec &indices_inner_test)
Definition: util.cpp:232
ivec fgt(const Points &points, const vec &values, const ivec &obs_to_check, const vec &background_values, const vec &background_uncertainties, BackgroundType background_elab_type, int num_min_outer, int num_max_outer, float inner_radius, float outer_radius, int num_iterations, int num_min_prof, float min_elev_diff, const vec &value_mina, const vec &value_maxa, const vec &value_minv, const vec &value_maxv, const vec &tpos, const vec &tneg, bool debug, bool basic, vec &scores)
First Guess Test (FGT) - simplified (without OI) SCT.
Definition: fgt.cpp:29
ivec range_check(const vec &values, const vec &min, const vec &max)
Range check.
Definition: range_check.cpp:16
float lon
Definition: titanlib.h:471
void test_not_implemented_exception()
Definition: swig.cpp:12
vec background(const vec &elevs, const vec &values, int num_min_prof, float min_elev_diff, float value_minp, float value_maxp, BackgroundType background_type, const vec &external_background_values, const ivec &indices_global_outer, bool debug)
Background (first guess) calculations at observation locations.
Definition: background.cpp:28
ivec sct_resistant(const Points &points, const vec &values, const ivec &obs_to_check, const vec &background_values, BackgroundType background_elab_type, int num_min_outer, int num_max_outer, float inner_radius, float outer_radius, int num_iterations, int num_min_prof, float min_elev_diff, float min_horizontal_scale, float max_horizontal_scale, int kth_closest_obs_horizontal_scale, float vertical_scale, const vec &value_mina, const vec &value_maxa, const vec &value_minv, const vec &value_maxv, const vec &eps2, const vec &tpos, const vec &tneg, bool debug, bool basic, vec &scores)
Spatial Consistency Test (SCT) - resistant to outliers.
Definition: sct_resistant.cpp:26
Points points
Definition: titanlib.h:632
Definition: titanlib.h:460
vec compute_vertical_profile(const vec &elevs, const vec &oelevs, const vec &values, int num_min_prof, double min_elev_diff, bool debug=false)
Compute a vertical profile based on input data.
Definition: background.cpp:59
float * test_array(float *v, int n)
Required for SWIG only.
Definition: swig.cpp:6
bool convert_coordinates(const vec &lats, const vec &lons, vec &x_coords, vec &y_coords, vec &z_coords)
Convert lat/lons to 3D cartesian coordinates with the centre of the earth as the origin.
Definition: util.cpp:65
vec compute_vertical_profile_Theil_Sen(const vec &elevs, const vec &oelevs, const vec &values, int num_min_prof, double min_elev_diff, bool debug)
Definition: background.cpp:175
ivec metadata_check(const Points &points, bool check_lat=true, bool check_lon=true, bool check_elev=true, bool check_laf=true)
Definition: metadata_check.cpp:5
bool invert_matrix(const boost::numeric::ublas::matrix< float > &input, boost::numeric::ublas::matrix< float > &inverse)
Definition: util.cpp:213
Definition: titanlib.h:53
vec mLons
Definition: titanlib.h:552
void set_omp_threads(int num)
Set the number of OpenMP threads to use.
Definition: util.cpp:44
double clock()
Definition: util.cpp:57
vec values
Definition: titanlib.h:633
ivec duplicate_check(const Points &points, float radius, float vertical_range=titanlib::MV)
Duplicate check.
Definition: duplicate_check.cpp:7
std::vector< double > dvec
Definition: titanlib.h:25
Definition: titanlib.h:54
vec lag_reduction_filter(const vec &times, const vec &values, float a=0.5, float b=0.5, float k1=0.25, float k2=0.25, int n=10)
Method by McCarthy 1973 https://doi.org/10.1175/1520-0450(1973)012%3C0211:AMFCAT%3E2.0.CO;2.
Definition: lag_reduction_filter.cpp:5
vec mLats
Definition: titanlib.h:551
static const double radius_earth
Radius of the earth [m].
Definition: titanlib.h:40
bool is_valid(float value)
Definition: util.cpp:24
ivec sct_dual(const Points &points, const vec &values, const ivec &obs_to_check, const vec &event_thresholds, ConditionType condition, int num_min_outer, int num_max_outer, float inner_radius, float outer_radius, int num_iterations, float min_horizontal_scale, float max_horizontal_scale, int kth_closest_obs_horizontal_scale, float vertical_scale, const vec &test_thresholds, bool debug)
Spatial Consistency Test for dichotomous (yes/no) variables.
Definition: sct_dual.cpp:25
Definition: titanlib.h:52
boost::geometry::model::point< float, 3, boost::geometry::cs::cartesian > point
Definition: titanlib.h:547
Definition: titanlib.h:18
vec interpolate_to_points(const vec2 &input_lats, const vec2 &input_lons, const vec2 &input_values, const vec &output_lats, const vec &output_lons)
Definition: util.cpp:118
Definition: titanlib.h:51
Definition: titanlib.h:476
std::vector< int > ivec
Definition: titanlib.h:23
void initialize_omp()
Sets the number of OpenMP threads to 1 if OMP_NUM_THREADS undefined.
Definition: util.cpp:31
Definition: titanlib.h:555
ConditionType
Definition: titanlib.h:57
float find_k_closest(const vec &array, int k)
Definition: util.cpp:297
int get_omp_threads()
Get the number of OpenMP threads currently set.
Definition: util.cpp:51
X and Y.
Definition: titanlib.h:46
Definition: titanlib.h:60
ivec sct(const Points &points, const vec &values, int num_min, int num_max, float inner_radius, float outer_radius, int num_iterations, int num_min_prof, float min_elev_diff, float min_horizontal_scale, float vertical_scale, const vec &pos, const vec &neg, const vec &eps2, vec &prob_gross_error, vec &rep, const ivec &obs_to_check=ivec())
Spatial Consistency Test.
Definition: sct.cpp:23
boost::geometry::index::rtree< value, boost::geometry::index::quadratic< 16 > > mTree
Definition: titanlib.h:550
Represents point and their observed values.
Definition: titanlib.h:607
ivec isolation_check(const Points &points, int num_min, float radius, float vertical_radius=MV)
Isolation check.
Definition: isolation_check.cpp:9
ivec range_check_climatology(const Points &points, const vec &values, int unixtime, const vec &pos, const vec &neg)
Definition: range_check.cpp:48
std::string version()
Definition: util.cpp:27
static const float pi
Mathematical constant pi.
Definition: titanlib.h:38
ivec buddy_event_check(const Points &points, const vec &values, const vec &radius, const ivec &num_min, float event_threshold, float threshold, float max_elev_diff, float elev_gradient, int num_iterations, const ivec &obs_to_check=ivec())
Definition: buddy_event_check.cpp:13
Definition: titanlib.h:50
T subset(const T &array, const ivec &indices)
Definition: titanlib.h:399
not_implemented_exception()
Definition: titanlib.h:726
CoordinateType
Types of coordinates for position of points.
Definition: titanlib.h:44
static const float MV
Missing value indicator.
Definition: titanlib.h:34
std::vector< float > vec
Definition: titanlib.h:24
bool operator()(const std::pair< T1, T2 > &left, const std::pair< T1, T2 > &right)
Definition: titanlib.h:441
ivec flags
Definition: titanlib.h:634
Definition: titanlib.h:571
Definition: titanlib.h:58
Definition: titanlib.h:62
std::pair< point, unsigned > value
Definition: titanlib.h:548
Definition: titanlib.h:563
float deg2rad(float deg)
Definition: util.cpp:114
ivec buddy_check(const Points &points, const vec &values, const vec &radius, const ivec &num_min, float threshold, float max_elev_diff, float elev_gradient, float min_std, int num_iterations, const ivec &obs_to_check=ivec())
Buddy check.
Definition: buddy_check.cpp:13
float elev
Definition: titanlib.h:472
static const float MV_CML
Missing value indicator in gridpp command-line tool.
Definition: titanlib.h:36
float lat
Definition: titanlib.h:470
Definition: titanlib.h:723
boost::geometry::model::box< point > box
Definition: titanlib.h:549
float compute_quantile(double quantile, const vec &array)
Definition: util.cpp:145
CoordinateType mType
Definition: titanlib.h:553
void unsubset(const T &array, T &orig_array, const ivec &indices)
Definition: titanlib.h:413
float calc_distance(float lat1, float lon1, float lat2, float lon2)
Definition: util.cpp:89
float laf
Definition: titanlib.h:473
Definition: titanlib.h:440