UFO
Variable.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 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 
8 #include "ufo/filters/Variable.h"
9 
10 #include <algorithm>
11 #include <iostream>
12 #include <set>
13 #include <string>
14 #include <vector>
15 
16 #include "eckit/config/Configuration.h"
17 #include "eckit/exception/Exceptions.h"
18 
19 #include "oops/util/abor1_cpp.h"
20 #include "oops/util/IntSetParser.h"
21 #include "oops/util/Logger.h"
22 
23 #include "ufo/utils/StringUtils.h"
24 
25 
26 // -----------------------------------------------------------------------------
27 namespace ufo {
28 
29 // -----------------------------------------------------------------------------
30 
31 Variable::Variable(const eckit::Configuration & conf)
32  : varname_(), grpname_(), channels_(),
33  options_(conf.getSubConfiguration("options")) {
34  oops::Log::trace() << "ufo::Variable(config) start " << conf << std::endl;
35  std::string fullname;
36  conf.get("name", fullname);
37  splitVarGroup(fullname, varname_, grpname_);
38  // read channels if available
39  if (conf.has("channels")) {
40  std::string chlist = conf.getString("channels");
41  std::set<int> channelset = oops::parseIntSet(chlist);
42  std::copy(channelset.begin(), channelset.end(), std::back_inserter(channels_));
43  }
44  oops::Log::trace() << "ufo::Variable(conf) done" << std::endl;
45 }
46 
47 // -----------------------------------------------------------------------------
48 
49 Variable::Variable(const std::string & fullname, const eckit::LocalConfiguration options)
50  : varname_(), grpname_(), channels_(), options_(options) {
51  oops::Log::trace() << "ufo::Variable(name) start" << std::endl;
52  splitVarGroup(fullname, varname_, grpname_);
53  oops::Log::trace() << "ufo::Variable(name) done" << std::endl;
54 }
55 
56 // -----------------------------------------------------------------------------
57 
58 Variable::Variable(const std::string & fullname, const std::vector<int> & channels)
59  : varname_(), grpname_(), channels_(channels), options_() {
60  oops::Log::trace() << "ufo::Variable(name, channels) start " << std::endl;
61  splitVarGroup(fullname, varname_, grpname_);
62  oops::Log::trace() << "ufo::Variable(name, channels) done" << std::endl;
63 }
64 
65 // -----------------------------------------------------------------------------
66 
67 Variable::Variable(const Variable & var, const std::string & group)
68  : varname_(var.varname_), grpname_(group), channels_(var.channels_),
69  options_(var.options_) {
70 }
71 
72 // -----------------------------------------------------------------------------
73 
75 }
76 
77 // -----------------------------------------------------------------------------
78 
79 size_t Variable::size() const {
80  if (channels_.size() == 0) {
81  return 1;
82  } else {
83  return channels_.size();
84  }
85 }
86 
87 // -----------------------------------------------------------------------------
88 
89 Variable Variable::operator[](const size_t jch) const {
90  ASSERT(jch < this->size());
91  std::string var = varname_;
92  if (channels_.size() > 0) var += "_" + std::to_string(channels_[jch]);
93  if (grpname_ != "") var += "@" + grpname_;
94  return Variable(var, options_);
95 }
96 
97 
98 // -----------------------------------------------------------------------------
99 
100 const std::string & Variable::variable() const {
101  return varname_;
102 }
103 
104 // -----------------------------------------------------------------------------
105 
106 std::string Variable::variable(const size_t jch) const {
107  ASSERT(jch < this->size());
108  if (jch == 0 && channels_.size() == 0) {
109  return varname_;
110  } else {
111  return varname_ + "_" + std::to_string(channels_[jch]);
112  }
113 }
114 
115 // -----------------------------------------------------------------------------
116 
117 const std::string & Variable::group() const {
118  return grpname_;
119 }
120 
121 // -----------------------------------------------------------------------------
122 
123 const std::vector<int> & Variable::channels() const {
124  return channels_;
125 }
126 
127 // -----------------------------------------------------------------------------
128 
129 oops::Variables Variable::toOopsVariables() const {
130  oops::Variables vars;
131  for (size_t jj = 0; jj < this->size(); ++jj) {
132  vars.push_back(this->variable(jj));
133  }
134  return vars;
135 }
136 
137 
138 // -----------------------------------------------------------------------------
139 
140 void Variable::print(std::ostream & os) const {
141  if (channels_.size() == 0) {
142  os << varname_ + "@" + grpname_;
143  } else {
144  for (size_t jj = 0; jj < channels_.size(); ++jj) {
145  if (jj > 0) os << ", ";
146  os << varname_ + "_" + std::to_string(channels_[jj]) + "@" + grpname_;
147  }
148  }
149 }
150 
151 // -----------------------------------------------------------------------------
152 
153 } // namespace ufo
ufo::Variable::channels
const std::vector< int > & channels() const
Definition: Variable.cc:123
ufo::Variable::print
void print(std::ostream &) const
Definition: Variable.cc:140
ufo::Variable::channels_
std::vector< int > channels_
Definition: Variable.h:49
ufo::splitVarGroup
void splitVarGroup(const std::string &vargrp, std::string &var, std::string &grp)
Definition: StringUtils.cc:19
ufo::Variable::size
size_t size() const
Definition: Variable.cc:79
ufo::Variable::toOopsVariables
oops::Variables toOopsVariables() const
Definition: Variable.cc:129
ufo::Variable::options_
eckit::LocalConfiguration options_
Definition: Variable.h:50
ufo
Definition: RunCRTM.h:27
ufo::Variable::grpname_
std::string grpname_
Definition: Variable.h:48
ufo::Variable::~Variable
~Variable()
Definition: Variable.cc:74
ufo::Variable::varname_
std::string varname_
Definition: Variable.h:47
ufo::Variable::group
const std::string & group() const
Definition: Variable.cc:117
ufo::Variable::variable
const std::string & variable() const
Definition: Variable.cc:100
StringUtils.h
ufo::Variable::operator[]
Variable operator[](const size_t) const
Definition: Variable.cc:89
ufo::Variable
Definition: Variable.h:23
conf
Definition: conf.py:1
Variable.h
ufo::Variable::Variable
Variable(const eckit::Configuration &)
Definition: Variable.cc:31