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.3" 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;
95 float min_horizontal_scale,
100 vec& prob_gross_error,
102 const ivec& obs_to_check=
ivec());
135 const ivec& obs_to_check,
136 const vec& background_values,
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,
181 const ivec& obs_to_check,
182 const vec& event_thresholds,
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,
223 const ivec& obs_to_check,
224 const vec& background_values,
225 const vec& background_uncertainties,
234 const vec& value_mina,
235 const vec& value_maxa,
236 const vec& value_minv,
237 const vec& value_maxv,
281 const ivec& obs_to_check =
ivec());
287 float event_threshold,
292 const ivec& obs_to_check =
ivec());
303 float vertical_radius=MV);
314 const vec& vertical_radius=
vec());
322 ivec
metadata_check(
const Points& points,
bool check_lat=
true,
bool check_lon=
true,
bool check_elev=
true,
bool check_laf=
true);
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);
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);
381 bool convert_coordinates(
const vec& lats,
const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords);
390 bool convert_coordinates(
float lat,
float lon,
float& x_coord,
float& y_coord,
float& z_coord);
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);
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);
399 template <
class T> T
subset(
const T& array,
const ivec& indices) {
400 if(array.size() == 0)
402 if(indices.size() == 0) {
406 T new_array(indices.size());
407 for(
int i = 0; i < indices.size(); i++) {
408 new_array[i] = array[indices[i]];
413 template <
class T>
void unsubset(
const T& array, T& orig_array,
const ivec& indices) {
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];
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);
437 bool invert_matrix (
const boost::numeric::ublas::matrix<float>& input, boost::numeric::ublas::matrix<float>& inverse);
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);
441 bool operator()(
const std::pair<T1,T2>&left,
const std::pair<T1,T2>&right) {
442 return left.first < right.first;
487 int get_nearest_neighbour(
float lat,
float lon,
bool include_match=
true)
const;
494 ivec get_neighbours(
float lat,
float lon,
float radius,
bool include_match=
true)
const;
502 ivec get_neighbours_with_distance(
float lat,
float lon,
float radius, vec& distances,
bool include_match=
true)
const;
509 int get_num_neighbours(
float lat,
float lon,
float radius,
bool include_match=
true)
const;
516 ivec get_closest_neighbours(
float lat,
float lon,
int num,
bool include_match=
true)
const;
526 bool convert_coordinates(
const vec& lats,
const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords)
const;
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);
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;
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;
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;
592 vec get_lats()
const;
593 vec get_lons()
const;
594 vec get_elevs()
const;
595 vec get_lafs()
const;
613 void range_check(
const vec& min,
const vec& max,
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));
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));
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);
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());
648 if(indices.size() == 0)
651 ivec indices0 = indices;
652 if(indices.size() == 1 && indices[0] == -1) {
655 indices0.resize(flags.size());
656 for(
int i = 0; i < flags.size(); i++)
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)
666 new_array.push_back(array[0]);
668 assert(index < array.size());
669 new_array.push_back(array[index]);
678 ivec get_unflagged_indices();
683 template <
class T> T get_unflagged(
const T& array) {
684 if(array.size() == 0)
687 if(array.size() > 1 && array.size() < flags.size()) {
688 throw std::invalid_argument(
"Array is shorter than flags");
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];
700 output[i] = array[0];
704 Points get_unflagged_points();
707 ivec subset_valid(
const ivec& indices);
714 void merge_simple(
const ivec& new_flags, ivec indices);
721 void merge(
const ivec& new_flags, ivec indices);
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 ×, 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