Titanlib
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 #ifdef _OPENMP
11  #include <omp.h>
12 #endif
13 
14 #define TITANLIB_VERSION "0.2.0b1"
15 #define __version__ TITANLIB_VERSION
16 
17 typedef std::vector<int> ivec;
18 typedef std::vector<float> vec;
19 typedef std::vector<double> dvec;
20 typedef std::vector<vec> vec2;
21 
24 namespace titanlib {
28  std::string version();
29 
44  ivec sct(const vec& lats,
45  const vec& lons,
46  const vec& elevs,
47  const vec& values,
48  int num_min,
49  int num_max,
50  float inner_radius,
51  float outer_radius,
52  int num_iterations,
53  int num_min_prof,
54  float min_elev_diff,
55  float min_horizontal_scale,
56  float vertical_scale,
57  const vec& pos,
58  const vec& neg,
59  const vec& eps2,
60  vec& prob_gross_error,
61  vec& rep);
62 
69  ivec range_check(const vec& values,
70  const vec& min,
71  const vec& max);
72 
73  ivec range_check_climatology(const vec& lats,
74  const vec& lons,
75  const vec& elevs,
76  const vec& values,
77  int unixtime,
78  const vec& pos,
79  const vec& neg);
80 
96  ivec buddy_check(const vec& lats,
97  const vec& lons,
98  const vec& elevs,
99  const vec& values,
100  const vec& radius,
101  const ivec& num_min,
102  float threshold,
103  float max_elev_diff,
104  float elev_gradient,
105  float min_std,
106  int num_iterations,
107  const ivec& obs_to_check = ivec());
108 
109  ivec buddy_event_check(const vec& lats,
110  const vec& lons,
111  const vec& elevs,
112  const vec& values,
113  const vec& radius,
114  const ivec& num_min,
115  float event_threshold,
116  float threshold,
117  float max_elev_diff,
118  float elev_gradient,
119  int num_iterations,
120  const ivec& obs_to_check = ivec());
121 
129  ivec isolation_check(const vec& lats,
130  const vec& lons,
131  int num_min,
132  float radius);
133 
143  ivec isolation_check(const vec& lats,
144  const vec& lons,
145  const vec& elevs,
146  int num_min,
147  float radius,
148  float vertical_radius);
149 
151  void set_omp_threads(int num);
152 
154  void initialize_omp();
155 
156  namespace util {
160  double clock();
161 
169  bool convert_coordinates(const vec& lats, const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords);
170 
178  bool convert_coordinates(float lat, float lon, float& x_coord, float& y_coord, float& z_coord);
179 
180  void convert_to_proj(const vec& lats, const vec& lons, std::string proj4, vec& x_coords, vec& y_coords);
181  vec interpolate_to_points(const vec2& input_lats, const vec2& input_lons, const vec2& input_values, const vec& output_lats, const vec& output_lons);
182  float deg2rad(float deg);
183  float calc_distance(float lat1, float lon1, float lat2, float lon2);
184  float calc_distance(float x0, float y0, float z0, float x1, float y1, float z1);
185 
186  float compute_quantile(double quantile, const vec& array);
187  vec subset(const vec& input, const ivec& indices);
188 
190  float* test_array(float* v, int n);
191  }
192 
193  // ivec nearest_neighbours(const vec& lats, const vec& lons, float radius, float lat, float lon);
194 
195  // bool prioritize(const vec& values, const ivec& priority, float distance, ivec& flags);
196 
198  class Dataset {
199  public:
200  Dataset(vec ilats, vec ilons, vec ielevs, vec ivalues);
204  void range_check(const vec& min, const vec& max, const ivec& indices=ivec());
205  void range_check_climatology(int unixtime, const vec& pos, const vec& neg, const ivec& indices=ivec());
206  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& sct, vec& rep, const ivec& indices=ivec());
207  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());
208  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());
209  void isolation_check(int num_min, float radius, float vertical_radius);
210 
216  private:
217  template <class T> T subset(const T& array, const ivec& indices) {
218  if(array.size() == 1) {
219  T new_array = array;
220  return new_array;
221  }
222  else {
223  T new_array(indices.size());
224  for(int i = 0; i < indices.size(); i++) {
225  new_array[i] = array[indices[i]];
226  }
227  return new_array;
228  }
229  }
230  template <class T> void unsubset(const T& array, T& orig_array, const ivec& indices) {
231  assert(array.size() == indices.size());
232  for(int i = 0; i < indices.size(); i++) {
233  orig_array[indices[i]] = array[i];
234  }
235  }
236  };
237 
238  class KDTree {
239  public:
240  KDTree(const vec& lats, const vec& lons);
241 
246  int get_nearest_neighbour(float lat, float lon, bool include_match);
247  ivec get_nearest_neighbour(const vec& lats, const vec& lons, bool include_match);
248 
256  ivec get_neighbours(float lat, float lon, float radius, int num_max, bool include_match);
257 
264  ivec get_neighbours_with_distance(float lat, float lon, float radius, int num_max, bool include_match, vec& distances);
265 
271  int get_num_neighbours(float lat, float lon, float radius, int num_max, bool include_match);
272  private:
273  typedef boost::geometry::model::point<float, 3, boost::geometry::cs::cartesian> point;
274  typedef std::pair<point, unsigned> value;
275  typedef boost::geometry::model::box<point> box;
276  vec mLats;
277  vec mLons;
278  boost::geometry::index::rtree< value, boost::geometry::index::quadratic<16> > mTree;
279 
280  };
281 
283  ivec sct_old(const vec& lats,
284  const vec& lons,
285  const vec& elevs,
286  const vec& values,
287  int nmin,
288  int nmax,
289  int num_min_prof,
290  float min_elev_diff,
291  float min_horizontal_scale,
292  float dz,
293  const vec& pos,
294  const vec& neg,
295  const vec& eps2,
296  vec& prob_gross_error,
297  vec& rep,
298  ivec& boxids);
299 }
300 #endif
float * test_array(float *v, int n)
Required for SWIG only.
Definition: util.cpp:144
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:6
vec lons
Definition: titanlib.h:212
float compute_quantile(double quantile, const vec &array)
Definition: util.cpp:100
ivec range_check(const vec &values, const vec &min, const vec &max)
Range check.
Definition: range_check.cpp:14
vec subset(const vec &input, const ivec &indices)
Definition: util.cpp:133
ivec sct(const vec &lats, const vec &lons, const vec &elevs, 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
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:73
std::vector< double > dvec
Definition: titanlib.h:19
std::vector< vec > vec2
Definition: titanlib.h:20
double max(const double *array, int sizeArray)
Definition: sct_smart_boxes.c:1006
void set_omp_threads(int num)
Set the number of OpenMP threads to use.
Definition: titanlib.cpp:20
vec values
Definition: titanlib.h:214
ivec isolation_check(const vec &lats, const vec &lons, int num_min, float radius)
Isolation check.
Definition: isolation_check.cpp:7
Titanlib.
Definition: titanlib.h:24
Definition: titanlib.h:238
vec lats
Definition: titanlib.h:211
void initialize_omp()
Sets the number of OpenMP threads to 1 if OMP_NUM_THREADS undefined.
Definition: titanlib.cpp:8
ivec sct_old(const vec &lats, const vec &lons, const vec &elevs, const vec &values, int nmin, int nmax, int num_min_prof, float min_elev_diff, float min_horizontal_scale, float dz, const vec &pos, const vec &neg, const vec &eps2, vec &prob_gross_error, vec &rep, ivec &boxids)
Old version of the spatial consistency test (for testing purposes only)
Definition: sct_old.cpp:11
double min(const double *array, int sizeArray)
Definition: sct_smart_boxes.c:1017
std::vector< float > vec
Definition: titanlib.h:18
Represents point and their observed values.
Definition: titanlib.h:198
ivec buddy_event_check(const vec &lats, const vec &lons, const vec &elevs, 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:11
vec elevs
Definition: titanlib.h:213
std::string version()
Definition: titanlib.cpp:4
float deg2rad(float deg)
Definition: util.cpp:70
ivec flags
Definition: titanlib.h:215
void convert_to_proj(const vec &lats, const vec &lons, std::string proj4, vec &x_coords, vec &y_coords)
Definition: util.cpp:29
double clock()
Definition: titanlib.cpp:26
ivec range_check_climatology(const vec &lats, const vec &lons, const vec &elevs, const vec &values, int unixtime, const vec &pos, const vec &neg)
Definition: range_check.cpp:44
float calc_distance(float lat1, float lon1, float lat2, float lon2)
Definition: util.cpp:47
ivec buddy_check(const vec &lats, const vec &lons, const vec &elevs, 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:11
std::vector< int > ivec
Definition: titanlib.h:17