Titanlib 0.3.0-dev3
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.0-dev3"
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 
57  class Points;
58 
77  ivec sct(const Points& points,
78  const vec& values,
79  int num_min,
80  int num_max,
81  float inner_radius,
82  float outer_radius,
83  int num_iterations,
84  int num_min_prof,
85  float min_elev_diff,
86  float min_horizontal_scale,
87  float vertical_scale,
88  const vec& pos,
89  const vec& neg,
90  const vec& eps2,
91  vec& prob_gross_error,
92  vec& rep);
93 
122  ivec sct_resistant( const Points& points,
123  const vec& values,
124  const ivec& obs_to_check,
125  const vec& background_values,
126  BackgroundType background_elab_type,
127  int num_min_outer,
128  int num_max_outer,
129  float inner_radius,
130  float outer_radius,
131  int num_iterations,
132  int num_min_prof,
133  float min_elev_diff,
134  float min_horizontal_scale,
135  float max_horizontal_scale,
136  int kth_closest_obs_horizontal_scale,
137  float vertical_scale,
138  const vec& value_mina,
139  const vec& value_maxa,
140  const vec& value_minv,
141  const vec& value_maxv,
142  const vec& eps2,
143  const vec& tpos,
144  const vec& tneg,
145  bool debug,
146  vec& scores);
147 
172  ivec fgt( const Points& points,
173  const vec& values,
174  const ivec& obs_to_check,
175  const vec& background_values,
176  const vec& background_uncertainties,
177  BackgroundType background_elab_type,
178  int num_min_outer,
179  int num_max_outer,
180  float inner_radius,
181  float outer_radius,
182  int num_iterations,
183  int num_min_prof,
184  float min_elev_diff,
185  const vec& value_mina,
186  const vec& value_maxa,
187  const vec& value_minv,
188  const vec& value_maxv,
189  const vec& tpos,
190  const vec& tneg,
191  bool debug,
192  vec& scores);
193 
200  ivec range_check(const vec& values,
201  const vec& min,
202  const vec& max);
203 
204  ivec range_check_climatology(const Points& points,
205  const vec& values,
206  int unixtime,
207  const vec& pos,
208  const vec& neg);
209 
222  ivec buddy_check(const Points& points,
223  const vec& values,
224  const vec& radius,
225  const ivec& num_min,
226  float threshold,
227  float max_elev_diff,
228  float elev_gradient,
229  float min_std,
230  int num_iterations,
231  const ivec& obs_to_check = ivec());
232 
233  ivec buddy_event_check(const Points& points,
234  const vec& values,
235  const vec& radius,
236  const ivec& num_min,
237  float event_threshold,
238  float threshold,
239  float max_elev_diff,
240  float elev_gradient,
241  int num_iterations,
242  const ivec& obs_to_check = ivec());
243 
250  ivec isolation_check(const Points& points,
251  int num_min,
252  float radius,
253  float vertical_radius=MV);
254 
259  ivec duplicate_check(const Points& points, float radius, float vertical_range=titanlib::MV);
260 
261  ivec metadata_check(const Points& points, bool check_lat=true, bool check_lon=true, bool check_elev=true, bool check_laf=true);
262 
270  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);
271 
277  void set_omp_threads(int num);
278 
280  void initialize_omp();
281 
290  std::string version();
291 
295  double clock();
296  bool is_valid(float value);
297 
305  bool convert_coordinates(const vec& lats, const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords);
306 
314  bool convert_coordinates(float lat, float lon, float& x_coord, float& y_coord, float& z_coord);
315 
316  vec interpolate_to_points(const vec2& input_lats, const vec2& input_lons, const vec2& input_values, const vec& output_lats, const vec& output_lons);
317  float deg2rad(float deg);
318  float calc_distance(float lat1, float lon1, float lat2, float lon2);
319  float calc_distance(float x0, float y0, float z0, float x1, float y1, float z1);
320 
321  float compute_quantile(double quantile, const vec& array);
322  float find_k_closest(const vec& array, int k);
323  vec subset(const vec& array, const ivec& indices);
324  Points subset(const Points& input, const ivec& indices);
325 
326 
339  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);
340 
341  bool invert_matrix (const boost::numeric::ublas::matrix<float>& input, boost::numeric::ublas::matrix<float>& inverse);
342 
343  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);
344  template<class T1, class T2> struct sort_pair_first {
345  bool operator()(const std::pair<T1,T2>&left, const std::pair<T1,T2>&right) {
346  return left.first < right.first;
347  };
348  };
356  float* test_array(float* v, int n);
357 
360  // ivec nearest_neighbours(const vec& lats, const vec& lons, float radius, float lat, float lon);
361 
362  // bool prioritize(const vec& values, const ivec& priority, float distance, ivec& flags);
363 
364  class Point {
365  public:
373  Point(float lat, float lon, float elev=MV, float laf=MV, CoordinateType type=Geodetic);
374  float lat;
375  float lon;
376  float elev;
377  float laf;
379  };
380  class KDTree {
381  public:
382  KDTree(vec lats, vec lons, CoordinateType type=Geodetic);
383  KDTree& operator=(KDTree other);
384  KDTree(const KDTree& other);
385  KDTree() {};
386 
391  int get_nearest_neighbour(float lat, float lon, bool include_match=true) const;
392 
398  ivec get_neighbours(float lat, float lon, float radius, bool include_match=true) const;
399 
406  ivec get_neighbours_with_distance(float lat, float lon, float radius, vec& distances, bool include_match=true) const;
407 
413  int get_num_neighbours(float lat, float lon, float radius, bool include_match=true) const;
414 
420  ivec get_closest_neighbours(float lat, float lon, int num, bool include_match=true) const;
421 
422 
430  bool convert_coordinates(const vec& lats, const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords) const;
431 
439  bool convert_coordinates(float lat, float lon, float& x_coord, float& y_coord, float& z_coord) const;
440  static float deg2rad(float deg);
441  static float rad2deg(float deg);
442  static float calc_distance(float lat1, float lon1, float lat2, float lon2, CoordinateType type=Geodetic);
443  static float calc_distance(float x0, float y0, float z0, float x1, float y1, float z1);
444  static float calc_distance_fast(float lat1, float lon1, float lat2, float lon2, CoordinateType type=Geodetic);
445  static float calc_distance_fast(const Point& p1, const Point& p2);
446  vec get_lats() const;
447  vec get_lons() const;
448  int size() const;
449  CoordinateType get_coordinate_type() const;
450  protected:
451  typedef boost::geometry::model::point<float, 3, boost::geometry::cs::cartesian> point;
452  typedef std::pair<point, unsigned> value;
453  typedef boost::geometry::model::box<point> box;
454  boost::geometry::index::rtree< value, boost::geometry::index::quadratic<16> > mTree;
455  vec mLats;
456  vec mLons;
458 
459  struct within_radius {
460  public:
461  within_radius(point p, float radius);
462  bool operator()(value const& v) const;
463  private:
464  float radius;
465  point p;
466  };
467  struct is_not_equal {
468  public:
469  is_not_equal(point p);
470  bool operator()(value const& v) const;
471  private:
472  point p;
473  };
474  };
475  class Points {
476  public:
477  Points();
485  Points(vec lats, vec lons, vec elevs=vec(), vec lafs=vec(), CoordinateType type=Geodetic);
486  Points(KDTree tree, vec elevs=vec(), vec lafs=vec());
487  Points& operator=(Points other);
488  Points(const Points& other);
489  // Returns -1 if there are no neighbours
490  int get_nearest_neighbour(float lat, float lon, bool include_match=true) const;
491  ivec get_neighbours(float lat, float lon, float radius, bool include_match=true) const;
492  ivec get_neighbours_with_distance(float lat, float lon, float radius, vec& distances, bool include_match=true) const;
493  int get_num_neighbours(float lat, float lon, float radius, bool include_match=true) const;
494  ivec get_closest_neighbours(float lat, float lon, int num, bool include_match=true) const;
495 
496  vec get_lats() const;
497  vec get_lons() const;
498  vec get_elevs() const;
499  vec get_lafs() const;
500  int size() const;
501  CoordinateType get_coordinate_type() const;
502  private:
503  KDTree mTree;
504  vec mLats;
505  vec mLons;
506  vec mElevs;
507  vec mLafs;
508  };
509 
511  class Dataset {
512  public:
513  Dataset(Points points, vec ivalues);
517  void range_check(const vec& min, const vec& max, const ivec& indices=ivec());
518  void range_check_climatology(int unixtime, const vec& pos, const vec& neg, const ivec& indices=ivec());
519  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());
520  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, const ivec& indices=ivec());
521  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());
522  void isolation_check(int num_min, float radius, float vertical_radius, const ivec& indices=ivec());
523  void duplicate_check(float radius, float vertical_range=titanlib::MV, const ivec& indices=ivec());
524  void dem_check(const vec& dem, float max_elev_diff);
525  void external_check(const ivec& flags);
526  void metadata_check(bool check_lat=true, bool check_lon=true, bool check_elev=true, bool check_laf=true, const ivec& indices=ivec());
527 
528  vec lats;
529  vec lons;
530  vec elevs;
532  vec values;
533  ivec flags;
534  private:
535  template <class T> T subset(const T& array, const ivec& indices) {
536  if(array.size() == 1) {
537  T new_array = array;
538  return new_array;
539  }
540  else {
541  T new_array(indices.size());
542  for(int i = 0; i < indices.size(); i++) {
543  new_array[i] = array[indices[i]];
544  }
545  return new_array;
546  }
547  }
548  template <class T> void unsubset(const T& array, T& orig_array, const ivec& indices) {
549  orig_array.clear();
550  orig_array.resize(indices.size());
551  assert(array.size() == indices.size());
552  for(int i = 0; i < indices.size(); i++) {
553  orig_array[indices[i]] = array[i];
554  }
555  }
556  void merge(const ivec& new_flags, const ivec& indices);
557  vec subset(const vec& array, const ivec& indices, ivec& new_indices);
558  vec subset(const vec& array, const ivec& indices);
559  ivec subset(const ivec& indices);
560  Points subset(const Points& input, const ivec& indices);
561  };
562  class not_implemented_exception: public std::logic_error
563  {
564  public:
565  not_implemented_exception() : std::logic_error("Function not yet implemented") { };
566  };
567 
568 }
569 #endif
CoordinateType type
Definition: titanlib.h:378
vec subset(const vec &array, const ivec &indices)
Definition: util.cpp:172
KDTree()
Definition: titanlib.h:385
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, vec &scores)
First Guess Test (FGT) - simplified (without OI) SCT.
Definition: fgt.cpp:29
vec lons
Definition: titanlib.h:529
Latitude and longitude.
Definition: titanlib.h:45
std::vector< vec > vec2
Definition: titanlib.h:26
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:223
ivec range_check(const vec &values, const vec &min, const vec &max)
Range check.
Definition: range_check.cpp:16
float lon
Definition: titanlib.h:375
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:35
Points points
Definition: titanlib.h:531
Definition: titanlib.h:364
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:59
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
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)
Spatial Consistency Test.
Definition: sct.cpp:28
bool invert_matrix(const boost::numeric::ublas::matrix< float > &input, boost::numeric::ublas::matrix< float > &inverse)
Definition: util.cpp:204
Definition: titanlib.h:53
vec mLons
Definition: titanlib.h:456
void set_omp_threads(int num)
Set the number of OpenMP threads to use.
Definition: util.cpp:44
double clock()
Definition: util.cpp:51
vec values
Definition: titanlib.h:532
ivec duplicate_check(const Points &points, float radius, float vertical_range=titanlib::MV)
Duplicate check.
Definition: duplicate_check.cpp:7
void debug(std::string string)
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:455
static const double radius_earth
Radius of the earth [m].
Definition: titanlib.h:40
bool is_valid(float value)
Definition: util.cpp:24
Definition: titanlib.h:52
boost::geometry::model::point< float, 3, boost::geometry::cs::cartesian > point
Definition: titanlib.h:451
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:112
Definition: titanlib.h:51
Definition: titanlib.h:380
std::vector< int > ivec
Definition: titanlib.h:23
vec lats
Definition: titanlib.h:528
void initialize_omp()
Sets the number of OpenMP threads to 1 if OMP_NUM_THREADS undefined.
Definition: util.cpp:31
Definition: titanlib.h:459
float find_k_closest(const vec &array, int k)
Definition: util.cpp:288
X and Y.
Definition: titanlib.h:46
boost::geometry::index::rtree< value, boost::geometry::index::quadratic< 16 > > mTree
Definition: titanlib.h:454
Represents point and their observed values.
Definition: titanlib.h:511
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:46
vec elevs
Definition: titanlib.h:530
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
not_implemented_exception()
Definition: titanlib.h:565
CoordinateType
Types of coordinates for position of points.
Definition: titanlib.h:44
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, vec &scores)
Spatial Consistency Test (SCT) - resistant to outliers.
Definition: sct_resistant.cpp:26
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:345
ivec flags
Definition: titanlib.h:533
Definition: titanlib.h:475
std::pair< point, unsigned > value
Definition: titanlib.h:452
Definition: titanlib.h:467
float deg2rad(float deg)
Definition: util.cpp:108
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:376
static const float MV_CML
Missing value indicator in gridpp command-line tool.
Definition: titanlib.h:36
float lat
Definition: titanlib.h:374
Definition: titanlib.h:562
boost::geometry::model::box< point > box
Definition: titanlib.h:453
float compute_quantile(double quantile, const vec &array)
Definition: util.cpp:139
CoordinateType mType
Definition: titanlib.h:457
float calc_distance(float lat1, float lon1, float lat2, float lon2)
Definition: util.cpp:83
float laf
Definition: titanlib.h:377
Definition: titanlib.h:344