7 #ifndef OOPS_ASSIMILATION_CALCHOFX_H_
8 #define OOPS_ASSIMILATION_CALCHOFX_H_
14 #include "eckit/config/LocalConfiguration.h"
27 #include "oops/util/Logger.h"
28 #include "oops/util/parameters/Parameter.h"
29 #include "oops/util/parameters/Parameters.h"
30 #include "oops/util/parameters/RequiredParameter.h"
34 template <
typename OBS>
39 oops::RequiredParameter<eckit::LocalConfiguration>
obsOperator{
"obs operator",
this};
40 oops::Parameter<std::vector<ObsFilterParametersWrapper<OBS>>>
obsFilters{
"obs filters", {},
this};
47 template <
typename OBS>
59 template <
typename DATA>
using ObsDataVec_ = std::vector<std::shared_ptr<ObsData_<DATA>>>;
111 template <
typename OBS>
113 const eckit::Configuration & config) :
114 obsconfig_(config), obspaces_(obspaces), obsops_(), locations_(),
115 ybias_(nullptr), qcflags_(), obserrs_(), filters_(),
116 geovars_(obspaces_.size())
118 std::vector<eckit::LocalConfiguration> obsconfs = config.getSubConfigurations();
128 observerParams.deserialize(obsconfs[jj]);
135 obspaces[jj].obsvariables()));
137 obserrs_.emplace_back(std::make_shared<ObsVector_>(obspaces[jj],
"ObsError"));
139 Log::trace() <<
"CalcHofX<OBS> constructed" << std::endl;
144 template <
typename OBS>
146 std::vector<eckit::LocalConfiguration> obsconfs = obsconfig_.getSubConfigurations();
149 for (
size_t jj = 0; jj < obspaces_.size(); ++jj) {
151 observerParams.deserialize(obsconfs[jj]);
154 qcflags_[jj], *obserrs_[jj], iteration));
155 filters_[jj]->preProcess();
158 geovars_[jj] += obsops_[jj]->requiredVars();
159 geovars_[jj] += (*ybias_)[jj].requiredVars();
160 geovars_[jj] += filters_[jj]->requiredVars();
162 Log::trace() <<
"CalcHofX<OBS>::initialize done" << std::endl;
167 template <
typename OBS>
169 oops::Log::trace() <<
"CalcHofX<OBS>::compute start" << std::endl;
172 for (
size_t jj = 0; jj < obspaces_.size(); ++jj) {
174 filters_[jj]->priorFilter(*geovals[jj]);
177 vars += filters_[jj]->requiredHdiagnostics();
178 vars += (*ybias_)[jj].requiredHdiagnostics();
179 ObsDiags_ ydiags(obspaces_[jj], *locations_[jj], vars);
180 obsops_[jj]->simulateObs(*geovals[jj], yobs[jj], (*ybias_)[jj], ydiags);
182 filters_[jj]->postFilter(yobs[jj], ydiags);
184 oops::Log::trace() <<
"CalcHofX<OBS>::compute done" << std::endl;
190 template <
typename OBS>
192 for (
const auto & qcflag : qcflags_) {
193 qcflag->read(qcname);
199 template <
typename OBS>
201 for (
const auto & qcflag : qcflags_) {
204 for (
const auto & obserr : obserrs_) {
205 obserr->read(
"ObsError");
211 template <
typename OBS>
213 for (
const auto & qcflag : qcflags_) {
220 template <
typename OBS>
222 for (
const auto & obserr : obserrs_) {
229 template <
typename OBS>
231 for (
size_t jj = 0; jj < obserrs_.size(); ++jj) {
232 obserrs_[jj]->mask(*qcflags_[jj]);
Computes observation operator (from GeoVaLs), applies bias correction and runs QC filters.
ObsDataVec_< int > qcflags_
Observations< OBS > Observations_
void saveObsErrors(const std::string &) const
save obs error variances (modified in QC) to ObsSpaces
void initialize(const ObsAuxCtrls_ &, const int iteration=0)
Initializes variables, obs bias, obs filters (could be different for different iterations.
ObsSpaces< OBS > ObsSpaces_
std::vector< std::unique_ptr< ObsOperator_ > > ObsOperatorVec_
std::vector< std::shared_ptr< ObsVector_ > > ObsVectorVec_
const ObsDataVec_< int > & qcflags() const
accessor to QC flags
ObsFilters< OBS > ObsFilters_
std::vector< std::unique_ptr< ObsFilters_ > > ObsFiltersVec_
std::vector< std::unique_ptr< GeoVaLs_ > > GeoVaLsVec_
ObsVector< OBS > ObsVector_
const ObsAuxCtrls_ * ybias_
const LocationsVec_ & locations() const
accessor to the locations
eckit::LocalConfiguration obsconfig_
Observations_ compute(const GeoVaLsVec_ &)
Computes H(x) from the filled in GeoVaLs.
void resetQc()
reset QC flags and ObsErrors
void saveQcFlags(const std::string &) const
save QC flags to ObsSpaces
const ObsSpaces_ & obspaces_
Locations< OBS > Locations_
const VariablesVec_ & requiredVars() const
accessor to variables required from the model
CalcHofX(const ObsSpaces_ &, const eckit::Configuration &)
Initializes ObsOperators, Locations, and QC data.
void maskObsErrors()
mask obs errors with QC flags
ObsAuxControls< OBS > ObsAuxCtrls_
std::vector< Variables > VariablesVec_
ObsDiagnostics< OBS > ObsDiags_
std::vector< std::unique_ptr< Locations_ > > LocationsVec_
void readQcFlags(const std::string &qcname)
read QC flags from qcname variable from file
std::vector< std::shared_ptr< ObsData_< DATA > >> ObsDataVec_
ObsOperator< OBS > ObsOperator_
oops::RequiredParameter< eckit::LocalConfiguration > obsOperator
oops::Parameter< std::vector< ObsFilterParametersWrapper< OBS > > > obsFilters
Locations of observations for observation operator.
Holds observation filters (usually QC) for one observation type.
std::size_t size() const
Access.
The namespace for the main oops code.