14 #include "ioda/ObsSpace.h"
16 #include "oops/util/Logger.h"
28 parameters_(parameters)
30 oops::Log::trace() <<
"ProcessAMVQI contructor starting" << std::endl;
36 oops::Log::trace() <<
"ProcessAMVQI destructed" << std::endl;
55 oops::Log::trace() <<
"ProcessAMVQI doFilter" << std::endl;
57 const float missing = util::missingValue(
float());
58 const int int_missing = util::missingValue(
int());
63 std::vector<float> percent_confidence(
nlocs);
64 std::vector<int> wind_generating_application(
nlocs);
76 std::vector<std::string> new_variables = {
77 "QI_full_weighted_mixture",
78 "QI_weighted_mixture_exc_forecast_comparison",
79 "QI_recursive_filter_function",
81 "QI_without_forecast",
83 "QI_estimated_error" };
84 const size_t total_variables = new_variables.size();
87 std::vector<std::vector<float>> new_percent_confidence(total_variables,
91 for (
size_t iapp = 0; iapp < number_of_apps; ++iapp) {
93 std::string percent_confidence_name =
"percent_confidence_";
94 std::string wind_generating_application_name =
"wind_generating_application_";
97 percent_confidence_name.append(std::to_string(iapp + 1)),
101 wind_generating_application_name.append(std::to_string(iapp + 1)),
102 wind_generating_application);
104 for (
size_t idata = 0; idata <
nlocs; ++idata) {
105 if (wind_generating_application[idata] != int_missing) {
106 new_percent_confidence[wind_generating_application[idata] - 1][idata] =
107 percent_confidence[idata];
113 for (
size_t inum = 0; inum < total_variables; ++inum) {
114 if (std::any_of(new_percent_confidence[inum].begin(),
115 new_percent_confidence[inum].end(),
118 std::vector<float> existing_new_percent_confidence(
nlocs,
missing);
119 if (
obsdb_.has(
"MetaData",
120 new_variables[inum])) {
123 existing_new_percent_confidence);
125 oops::Log::trace() <<
"ProcessAMIQI: New variable: " << new_variables[inum] <<
126 " not present in input data" << std::endl;
132 for (
size_t idata = 0; idata <
nlocs; ++idata) {
133 if (existing_new_percent_confidence[idata] !=
missing) {
134 if (new_percent_confidence[inum][idata] ==
missing) {
135 new_percent_confidence[inum][idata] =
136 existing_new_percent_confidence[idata];
138 oops::Log::trace() <<
"[WARN] New variable (created from new BUFR data)" <<
"\n"
139 "[WARN] already has value in old BUFR format" <<
"\n"
140 "[WARN] new BUFR: " <<
141 new_percent_confidence[inum][idata] <<
"\n"
142 "[WARN] old BUFR: " <<
143 existing_new_percent_confidence[idata] <<
"\n";
150 new_percent_confidence[inum]);
158 os <<
"ProcessAMVQI filter" <<
parameters_ << std::endl;
Base class for UFO observation processors (including QC filters).
ProcessAMVQI(ioda::ObsSpace &obsdb, const Parameters_ ¶meters, std::shared_ptr< ioda::ObsDataVector< int >> flags, std::shared_ptr< ioda::ObsDataVector< float >> obserr)
void doFilter() const override
A filter to convert new BUFR formatted data into variables with names corressponding to the wind gene...
void print(std::ostream &) const override
Parameters controlling the operation of the ProcessAMVQI filter.
oops::RequiredParameter< size_t > number_of_apps
How many generating applications to search for.
integer function nlocs(this)
Return the number of observational locations in this Locations object.