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 = conf.getString("name");
36  splitVarGroup(fullname, varname_, grpname_);
37  // read channels if available
38  if (conf.has("channels")) {
39  std::string chlist = conf.getString("channels");
40  std::set<int> channelset = oops::parseIntSet(chlist);
41  std::copy(channelset.begin(), channelset.end(), std::back_inserter(channels_));
42  }
43  oops::Log::trace() << "ufo::Variable(conf) done" << std::endl;
44 }
45 
46 // -----------------------------------------------------------------------------
47 
48 Variable::Variable(const std::string & fullname, const eckit::LocalConfiguration options)
49  : varname_(), grpname_(), channels_(), options_(options) {
50  oops::Log::trace() << "ufo::Variable(name) start" << std::endl;
51  splitVarGroup(fullname, varname_, grpname_);
52  oops::Log::trace() << "ufo::Variable(name) done" << std::endl;
53 }
54 
55 // -----------------------------------------------------------------------------
56 
57 Variable::Variable(const std::string & fullname, const std::vector<int> & channels)
58  : varname_(), grpname_(), channels_(channels), options_() {
59  oops::Log::trace() << "ufo::Variable(name, channels) start " << std::endl;
60  splitVarGroup(fullname, varname_, grpname_);
61  oops::Log::trace() << "ufo::Variable(name, channels) done" << std::endl;
62 }
63 
64 // -----------------------------------------------------------------------------
65 
66 Variable::Variable(const Variable & var, const std::string & group)
67  : varname_(var.varname_), grpname_(group), channels_(var.channels_),
68  options_(var.options_) {
69 }
70 
71 // -----------------------------------------------------------------------------
72 
74 }
75 
76 // -----------------------------------------------------------------------------
77 
78 size_t Variable::size() const {
79  if (channels_.size() == 0) {
80  return 1;
81  } else {
82  return channels_.size();
83  }
84 }
85 
86 // -----------------------------------------------------------------------------
87 
88 Variable Variable::operator[](const size_t jch) const {
89  ASSERT(jch < this->size());
90  std::string var = varname_;
91  if (channels_.size() > 0) var += "_" + std::to_string(channels_[jch]);
92  if (grpname_ != "") var += "@" + grpname_;
93  return Variable(var, options_);
94 }
95 
96 
97 // -----------------------------------------------------------------------------
98 
99 const std::string & Variable::variable() const {
100  return varname_;
101 }
102 
103 // -----------------------------------------------------------------------------
104 
105 std::string Variable::variable(const size_t jch) const {
106  ASSERT(jch < this->size());
107  if (jch == 0 && channels_.size() == 0) {
108  return varname_;
109  } else {
110  return varname_ + "_" + std::to_string(channels_[jch]);
111  }
112 }
113 
114 // -----------------------------------------------------------------------------
115 
116 const std::string & Variable::group() const {
117  return grpname_;
118 }
119 
120 // -----------------------------------------------------------------------------
121 
122 const std::vector<int> & Variable::channels() const {
123  return channels_;
124 }
125 
126 // -----------------------------------------------------------------------------
127 
128 std::string Variable::fullName() const {
129  std::string result;
130  result.reserve(varname_.size() + 1 + grpname_.size());
131  result = varname_;
132  result += '@';
133  result += grpname_;
134  return result;
135 }
136 
137 // -----------------------------------------------------------------------------
138 
139 oops::Variables Variable::toOopsVariables() const {
140  oops::Variables vars;
141  for (size_t jj = 0; jj < this->size(); ++jj) {
142  vars.push_back(this->variable(jj));
143  }
144  return vars;
145 }
146 
147 
148 // -----------------------------------------------------------------------------
149 
150 void Variable::print(std::ostream & os) const {
151  if (channels_.size() == 0) {
152  os << varname_ + "@" + grpname_;
153  } else {
154  for (size_t jj = 0; jj < channels_.size(); ++jj) {
155  if (jj > 0) os << ", ";
156  os << varname_ + "_" + std::to_string(channels_[jj]) + "@" + grpname_;
157  }
158  }
159 }
160 
161 // -----------------------------------------------------------------------------
162 
163 } // namespace ufo
Variable(const eckit::Configuration &)
Definition: Variable.cc:31
const std::string & variable() const
Definition: Variable.cc:99
eckit::LocalConfiguration options_
Definition: Variable.h:54
std::string fullName() const
Definition: Variable.cc:128
const std::string & group() const
Definition: Variable.cc:116
void print(std::ostream &) const
Definition: Variable.cc:150
oops::Variables toOopsVariables() const
Definition: Variable.cc:139
const std::vector< int > & channels() const
Definition: Variable.cc:122
size_t size() const
Definition: Variable.cc:78
std::string grpname_
Definition: Variable.h:52
std::vector< int > channels_
Definition: Variable.h:53
std::string varname_
Definition: Variable.h:51
Variable operator[](const size_t) const
Definition: Variable.cc:88
Definition: RunCRTM.h:27
void splitVarGroup(const std::string &vargrp, std::string &var, std::string &grp)
Definition: StringUtils.cc:27