7 #ifndef OOPS_BASE_OBSERVER_H_
8 #define OOPS_BASE_OBSERVER_H_
15 #include "eckit/config/LocalConfiguration.h"
30 #include "oops/util/Logger.h"
31 #include "oops/util/parameters/Parameter.h"
32 #include "oops/util/parameters/Parameters.h"
33 #include "oops/util/parameters/RequiredParameter.h"
37 template <
typename OBS>
42 oops::RequiredParameter<eckit::LocalConfiguration>
obsOperator{
"obs operator",
this};
43 oops::Parameter<std::vector<ObsFilterParametersWrapper<OBS>>>
obsFilters{
"obs filters", {},
this};
44 oops::Parameter<eckit::LocalConfiguration>
getValues{
45 "get values", eckit::LocalConfiguration(),
this};
47 "linear get values", eckit::LocalConfiguration(),
this};
53 template <
typename MODEL,
typename OBS>
76 ObsError_ &,
const eckit::Configuration &);
84 std::unique_ptr<ObsOperator_>
obsop_;
93 std::unique_ptr<eckit::LocalConfiguration>
iterconf_;
98 template <
typename MODEL,
typename OBS>
100 : parameters_(
params), obspace_(obspace), obsop_(), locations_(),
101 ybias_(nullptr), filters_(), qcflags_(), initialized_(false)
103 Log::trace() <<
"Observer::Observer start" << std::endl;
108 Log::trace() <<
"Observer::Observer done" << std::endl;
113 template <
typename MODEL,
typename OBS>
114 std::shared_ptr<GetValuePost<MODEL, OBS>>
116 ObsError_ & R,
const eckit::Configuration & conf) {
117 Log::trace() <<
"Observer<MODEL, OBS>::initialize start" << std::endl;
119 iterconf_.reset(
new eckit::LocalConfiguration(conf));
122 obserr_.reset(
new ObsVector_(Rmat_->obserrors()));
125 const int iterfilt = iterconf_->getInt(
"iteration", 0);
126 filters_.reset(
new ObsFilters_(obspace_, parameters_.obsFilters,
127 qcflags_, *obserr_, iterfilt));
128 filters_->preProcess();
130 locations_.reset(
new Locations_(obsop_->locations()));
134 geovars += obsop_->requiredVars();
135 geovars += ybias_->requiredVars();
136 geovars += filters_->requiredVars();
139 getvals_.reset(
new GetValPost_(parameters_.getValues, geom, obspace_.windowStart(),
140 obspace_.windowEnd(), *locations_, geovars));
143 Log::trace() <<
"Observer<MODEL, OBS>::initialize done" << std::endl;
149 template <
typename MODEL,
typename OBS>
151 oops::Log::trace() <<
"Observer<MODEL, OBS>::finalize start" << std::endl;
152 ASSERT(initialized_);
155 std::unique_ptr<GeoVaLs_> geovals = getvals_->releaseGeoVaLs();
158 filters_->priorFilter(*geovals);
162 vars += filters_->requiredHdiagnostics();
163 vars += ybias_->requiredHdiagnostics();
164 ObsDiags_ ydiags(obspace_, *locations_, vars);
167 obsop_->simulateObs(*geovals, yobsim, *ybias_, ydiags);
170 filters_->postFilter(yobsim, ydiags);
173 Rmat_->update(*obserr_);
176 std::string siter =
"";
177 if (iterconf_->has(
"iteration")) siter = iterconf_->getString(
"iteration");
179 if (iterconf_->getBool(
"save qc",
true)) {
180 const std::string qcname =
"EffectiveQC" + siter;
181 qcflags_->save(qcname);
183 if (iterconf_->getBool(
"save hofx",
true)) {
184 const std::string obsname =
"hofx" + siter;
185 yobsim.
save(obsname);
187 if (iterconf_->getBool(
"save obs errors",
true)) {
188 const std::string errname =
"EffectiveError" + siter;
189 Rmat_->save(errname);
192 Log::info() <<
"Observer::finalize QC = " << *qcflags_ << std::endl;
194 initialized_ =
false;
195 Log::trace() <<
"Observer<MODEL, OBS>::finalize done" << std::endl;
Geometry class used in oops; subclass of interface class interface::Geometry.
Fills GeoVaLs with requested variables at requested locations during model run.
Locations of observations for observation operator.
Observation error covariance matrix of observations from a single ObsSpace.
Holds observation filters (usually QC) for one observation type.
const Variables & obsvariables() const
void save(const std::string &) const
Computes observation operator, applying bias correction and QC filters.
Geometry< MODEL > Geometry_
ObsVector< OBS > ObsVector_
ObsDiagnostics< OBS > ObsDiags_
std::unique_ptr< eckit::LocalConfiguration > iterconf_
std::unique_ptr< ObsFilters_ > filters_
ObsDataVector< OBS, int > ObsDataInt_
std::shared_ptr< GetValPost_ > getvals_
std::shared_ptr< ObsDataInt_ > qcflags_
ObsError< OBS > ObsError_
std::unique_ptr< ObsOperator_ > obsop_
const ObsSpace_ & obspace_
ObserverParameters< OBS > Parameters_
ObsAuxControl< OBS > ObsAuxCtrl_
const ObsAuxCtrl_ * ybias_
ObsFilters< OBS > ObsFilters_
Locations< OBS > Locations_
std::unique_ptr< ObsVector_ > obserr_
Observer(const ObsSpace_ &, const Parameters_ &)
Initializes ObsOperators, Locations, and QC data.
std::shared_ptr< GetValPost_ > initialize(const Geometry_ &, const ObsAuxCtrl_ &, ObsError_ &, const eckit::Configuration &)
Initializes variables, obs bias, obs filters (could be different for different iterations.
ObsSpace< OBS > ObsSpace_
GetValuePost< MODEL, OBS > GetValPost_
std::unique_ptr< Locations_ > locations_
void finalize(ObsVector_ &)
Computes H(x) from the filled in GeoVaLs.
ObsOperator< OBS > ObsOperator_
oops::Parameter< std::vector< ObsFilterParametersWrapper< OBS > > > obsFilters
oops::Parameter< eckit::LocalConfiguration > linearGetValues
oops::RequiredParameter< eckit::LocalConfiguration > obsOperator
oops::Parameter< eckit::LocalConfiguration > getValues
The namespace for the main oops code.