17 static TransformMaker<Cal_ProfileHorizontalDrift>
29 oops::Log::trace() <<
" --> Compute horizontal drift lat/lon/time" << std::endl;
30 oops::Log::trace() <<
" --> method: " <<
method() << std::endl;
33 if (
obsdb_.obs_group_vars().empty())
34 throw eckit::UserError(
"Group variables configuration is empty", Here());
37 if (
obsdb_.obs_sort_var() !=
"air_pressure")
38 throw eckit::UserError(
"Sort variable must be air_pressure", Here());
39 if (
obsdb_.obs_sort_order() !=
"descending")
40 throw eckit::UserError(
"Profiles must be sorted in descending order", Here());
43 std::vector<float> latitude_in, longitude_in, wind_speed, wind_from_direction, height;
44 std::vector<util::DateTime> datetime_in;
50 getObservation(
"ObsValue",
"wind_from_direction", wind_from_direction,
true);
52 if (!oops::allVectorsSameNonZeroSize(latitude_in, longitude_in, datetime_in,
53 height, wind_speed, wind_from_direction)) {
54 oops::Log::warning() <<
"Vector sizes: "
55 << oops::listOfVectorSizes(latitude_in, longitude_in, datetime_in,
56 height, wind_speed, wind_from_direction)
58 throw eckit::BadValue(
"At least one vector is the wrong size", Here());
65 std::vector<float> latitude_out = latitude_in;
66 std::vector<float> longitude_out = longitude_in;
67 std::vector<util::DateTime> datetime_out = datetime_in;
70 const std::vector<size_t> &recnums =
obsdb_.recidx_all_recnums();
73 const size_t nprofs = recnums.size();
76 for (
size_t jprof = 0; jprof < nprofs; ++jprof) {
77 const std::vector<size_t> &locs =
obsdb_.recidx_vector(recnums[jprof]);
79 latitude_in, longitude_in, datetime_in,
80 height, wind_speed, wind_from_direction,
81 latitude_out, longitude_out, datetime_out);
85 obsdb_.put_db(
"DerivedMetaData",
"latitude", latitude_out);
86 obsdb_.put_db(
"DerivedMetaData",
"longitude", longitude_out);
87 obsdb_.put_db(
"DerivedMetaData",
"datetime", datetime_out);
void runTransform(const std::vector< bool > &apply) override
Run variable conversion.
Cal_ProfileHorizontalDrift(const VariableTransformsParameters &options, const ObsFilterData &data, const std::shared_ptr< ioda::ObsDataVector< int >> &flags)
ObsFilterData provides access to all data related to an ObsFilter.
integer function nlocs(this)
Return the number of observational locations in this Locations object.
static TransformMaker< Cal_ProfileHorizontalDrift > makerCal_ProfileHorizontalDrift_("ProfileHorizontalDrift")