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> 15 #define TITANLIB_VERSION "0.3.1" 16 #define __version__ TITANLIB_VERSION 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;
38 static const float pi = 3.14159265;
86 float min_horizontal_scale,
91 vec& prob_gross_error,
124 const ivec& obs_to_check,
125 const vec& background_values,
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,
174 const ivec& obs_to_check,
175 const vec& background_values,
176 const vec& background_uncertainties,
185 const vec& value_mina,
186 const vec& value_maxa,
187 const vec& value_minv,
188 const vec& value_maxv,
231 const ivec& obs_to_check =
ivec());
237 float event_threshold,
242 const ivec& obs_to_check =
ivec());
253 float vertical_radius=MV);
261 ivec
metadata_check(
const Points& points,
bool check_lat=
true,
bool check_lon=
true,
bool check_elev=
true,
bool check_laf=
true);
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);
305 bool convert_coordinates(
const vec& lats,
const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords);
314 bool convert_coordinates(
float lat,
float lon,
float& x_coord,
float& y_coord,
float& z_coord);
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);
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);
323 vec
subset(
const vec& array,
const ivec& indices);
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);
341 bool invert_matrix (
const boost::numeric::ublas::matrix<float>& input, boost::numeric::ublas::matrix<float>& inverse);
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);
345 bool operator()(
const std::pair<T1,T2>&left,
const std::pair<T1,T2>&right) {
346 return left.first < right.first;
391 int get_nearest_neighbour(
float lat,
float lon,
bool include_match=
true)
const;
398 ivec get_neighbours(
float lat,
float lon,
float radius,
bool include_match=
true)
const;
406 ivec get_neighbours_with_distance(
float lat,
float lon,
float radius, vec& distances,
bool include_match=
true)
const;
413 int get_num_neighbours(
float lat,
float lon,
float radius,
bool include_match=
true)
const;
420 ivec get_closest_neighbours(
float lat,
float lon,
int num,
bool include_match=
true)
const;
430 bool convert_coordinates(
const vec& lats,
const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords)
const;
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);
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;
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;
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;
496 vec get_lats()
const;
497 vec get_lons()
const;
498 vec get_elevs()
const;
499 vec get_lafs()
const;
517 void range_check(
const vec& min,
const vec& max,
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());
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());
535 template <
class T> T
subset(
const T& array,
const ivec& indices) {
536 T indices0 = indices;
537 if(indices0.size() == 0) {
538 indices0.resize(array.size());
539 for(
int i = 0; i < array.size(); i++)
542 if(array.size() == 1) {
547 T new_array(indices0.size());
548 for(
int i = 0; i < indices0.size(); i++) {
549 new_array[i] = array[indices0[i]];
554 template <
class T>
void unsubset(
const T& array, T& orig_array,
const ivec& indices) {
556 orig_array.resize(indices.size());
557 assert(array.size() == indices.size());
558 for(
int i = 0; i < indices.size(); i++) {
559 orig_array[indices[i]] = array[i];
562 void merge(
const ivec& new_flags,
const ivec& indices);
563 vec
subset(
const vec& array,
const ivec& indices, ivec& new_indices);
564 vec
subset(
const vec& array,
const ivec& indices);
565 ivec
subset(
const ivec& indices);
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 ×, 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:571
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:568
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