UFO
ObsProcessorBase.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2017-2021 UCAR
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
9 
10 #include <utility>
11 #include <vector>
12 
13 #include "eckit/config/Configuration.h"
14 
15 #include "ioda/ObsDataVector.h"
16 #include "ioda/ObsSpace.h"
17 #include "ioda/ObsVector.h"
18 
19 #include "oops/util/Logger.h"
20 
23 #include "ufo/GeoVaLs.h"
24 #include "ufo/ObsDiagnostics.h"
25 
26 namespace ufo {
27 
28 // -----------------------------------------------------------------------------
29 
30 ObsProcessorBase::ObsProcessorBase(ioda::ObsSpace & os, bool deferToPost,
31  std::shared_ptr<ioda::ObsDataVector<int> > flags,
32  std::shared_ptr<ioda::ObsDataVector<float> > obserr)
33  : obsdb_(os),
34  flags_(flags), obserr_(obserr),
35  data_(obsdb_), prior_(false), post_(false),
36  deferToPost_(deferToPost)
37 {
38  oops::Log::trace() << "ObsProcessorBase constructor" << std::endl;
39  ASSERT(flags);
40  ASSERT(obserr);
41  data_.associate(*flags_, "QCflagsData");
42  data_.associate(*obserr_, "ObsErrorData");
43 }
44 
45 // -----------------------------------------------------------------------------
46 
48  oops::Log::trace() << "ObsProcessorBase destructed" << std::endl;
49 }
50 
51 // -----------------------------------------------------------------------------
52 
54  oops::Log::trace() << "ObsProcessorBase preProcess begin" << std::endl;
55 // Cannot determine earlier when to apply filter because subclass
56 // constructors add to allvars
57  if (allvars_.hasGroup("HofX") || allvars_.hasGroup("ObsDiag") ||
58  allvars_.hasGroup("ObsBiasData") || deferToPost_) {
59  post_ = true;
60  } else {
61  if (allvars_.hasGroup("GeoVaLs")) {
62  prior_ = true;
63  } else {
64  this->doFilter();
65  }
66  }
67  oops::Log::trace() << "ObsProcessorBase preProcess end" << std::endl;
68 }
69 
70 // -----------------------------------------------------------------------------
71 
73  oops::Log::trace() << "ObsProcessorBase priorFilter begin" << std::endl;
74  if (prior_ || post_) data_.associate(gv);
75  if (prior_) this->doFilter();
76  oops::Log::trace() << "ObsProcessorBase priorFilter end" << std::endl;
77 }
78 
79 // -----------------------------------------------------------------------------
80 
81 void ObsProcessorBase::postFilter(const ioda::ObsVector & hofx,
82  const ioda::ObsVector & bias,
83  const ObsDiagnostics & diags) {
84  oops::Log::trace() << "ObsProcessorBase postFilter begin" << std::endl;
85  if (post_) {
86  data_.associate(hofx, "HofX");
87  data_.associate(bias, "ObsBiasData");
88  data_.associate(diags);
89  this->doFilter();
90  }
91  oops::Log::trace() << "ObsProcessorBase postFilter end" << std::endl;
92 }
93 
94 // -----------------------------------------------------------------------------
95 
96 } // namespace ufo
GeoVaLs: geophysical values at locations.
void associate(const GeoVaLs &)
Associates GeoVaLs with this ObsFilterData.
void priorFilter(const GeoVaLs &) override
virtual void doFilter() const =0
void postFilter(const ioda::ObsVector &, const ioda::ObsVector &, const ObsDiagnostics &) override
ufo::Variables allvars_
void preProcess() override
ObsProcessorBase(ioda::ObsSpace &, bool deferToPost, std::shared_ptr< ioda::ObsDataVector< int > >, std::shared_ptr< ioda::ObsDataVector< float > >)
std::shared_ptr< ioda::ObsDataVector< float > > obserr_
std::shared_ptr< ioda::ObsDataVector< int > > flags_
bool hasGroup(const std::string &) const
Definition: Variables.cc:168
Definition: RunCRTM.h:27