17 #include "ioda/distribution/Accumulator.h"
18 #include "ioda/ObsDataVector.h"
19 #include "ioda/ObsSpace.h"
20 #include "oops/util/Logger.h"
27 template <
typename Type > std::string
to_str(
const Type &
t)
29 std::ostringstream os;
35 const std::vector<SatIDRangeParameters> &SatIDRanges) {
37 if (SatIDRange.minSatID <= SatID && SatID <= SatIDRange.maxSatID) {
39 if (frequencyBand.minFrequency <= centralFrequency &&
40 centralFrequency <= frequencyBand.maxFrequency &&
41 (frequencyBand.satobchannel.value() == boost::none ||
42 satobchannel == *frequencyBand.satobchannel.value())) {
43 return frequencyBand.windChannel;
50 std::string
get_sat_name(
int SatID,
const std::vector<SatIDRangeParameters> &SatIDRanges) {
53 if (SatID == SatNames.Satnumber.value()) {
54 return SatNames.Satname;
65 :
FilterBase(obsdb, parameters, flags, obserr), parameters_(parameters)
149 std::vector<std::vector<bool>> & flagged)
const {
150 std::vector<float> cfreq(
obsdb_.nlocs());
151 std::vector<int> satid(
obsdb_.nlocs());
152 std::vector<int> compm(
obsdb_.nlocs());
157 obsdb_.get_db(
"MetaData",
"sensor_central_frequency", cfreq);
158 obsdb_.get_db(
"MetaData",
"satellite_identifier", satid);
159 obsdb_.get_db(
"MetaData",
"wind_computation_method", compm);
161 std::unique_ptr<ioda::Accumulator<size_t>> countSatAccumulator =
162 obsdb_.distribution()->createAccumulator<
size_t>();
163 std::unique_ptr<ioda::Accumulator<size_t>> countChanAccumulator =
164 obsdb_.distribution()->createAccumulator<
size_t>();
166 for (
size_t jobs = 0; jobs <
obsdb_.nlocs(); ++jobs) {
167 std::string satellite_name;
168 std::string channel_name;
175 wind_id[jobs] = satellite_name + channel_name;
179 std::string satellite_diag;
181 satellite_diag =
"id" +
to_str(satid[jobs]);
182 countSatAccumulator->addTerm(jobs, 1);
184 satellite_diag = satellite_name;
188 std::string channel_diag;
190 channel_diag =
"_comp" +
to_str(compm[jobs]) +
191 "_freq" +
to_str(cfreq[jobs]/1.0e14) +
"e14";
192 countChanAccumulator->addTerm(jobs, 1);
194 channel_diag = channel_name;
197 diag_id[jobs] = satellite_diag + channel_diag;
199 obsdb_.put_db(
"MetaData",
"satwind_id", wind_id);
200 obsdb_.put_db(
"Diag",
"satwind_id", diag_id);
202 const std::size_t count_missing_sat = countSatAccumulator->computeResult();
203 const std::size_t count_missing_chan = countChanAccumulator->computeResult();
204 oops::Log::info() <<
"SatName: " << count_missing_sat
205 <<
" observations with unidentified satellite id" << std::endl;
206 oops::Log::info() <<
"SatName: " << count_missing_chan
207 <<
" observations with unidentified channel" << std::endl;
211 os <<
"SatName: config = " <<
parameters_ << std::endl;
Base class for UFO QC filters.
void applyFilter(const std::vector< bool > &, const Variables &, std::vector< std::vector< bool >> &) const override
A filter that creates a string variable that makes it simpler to identify Atmospheric Motion Vector (...
SatName(ioda::ObsSpace &, const Parameters_ &, std::shared_ptr< ioda::ObsDataVector< int > >, std::shared_ptr< ioda::ObsDataVector< float > >)
void print(std::ostream &) const override
oops::Parameter< std::vector< SatIDRangeParameters > > SatNameAssignments
std::string get_sat_name(int SatID, const std::vector< SatIDRangeParameters > &SatIDRanges)
static const std::string missing_value_string
std::string to_str(const Type &t)
std::string get_channel_name(int SatID, float centralFrequency, int satobchannel, const std::vector< SatIDRangeParameters > &SatIDRanges)