IODA Bundle
DataFromSQL.cpp
Go to the documentation of this file.
1 /*
2  * (C) Copyright 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 /** @file DataFromSQL.cpp
8  * @brief implements ODC bindings
9 **/
10 
11 #include <algorithm>
12 
13 #include "./DataFromSQL.h"
14 
15 #include "odc/Select.h"
16 #include "odc/api/odc.h"
17 
18 namespace ioda {
19 namespace Engines {
20 namespace ODC {
21 
23 
25 
26 int DataFromSQL::getColumnIndex(const std::string& col) const {
27  for (int i = 0; i < columns_.size(); i++) {
28  if (columns_.at(i) == col) {
29  return i;
30  }
31  }
32  return -1;
33 }
34 
35 size_t DataFromSQL::numberOfRowsForVarno(const int varno) const {
36  int varno_index = getColumnIndex("varno");
37  size_t tot = 0;
38  for (int i = 0; i < number_of_rows_; i++) {
39  size_t val = getData(i, varno_index);
40  if (val == varno) {
41  tot++;
42  }
43  }
44  return tot;
45 }
46 
47 bool DataFromSQL::hasVarno(const int varno) const {
48  for (int i = 0; i < number_of_varnos_; i++) {
49  if (varno == varnos_.at(i)) return true;
50  }
51  return false;
52 }
53 
54 size_t DataFromSQL::numberOfLevels(const int varno) const {
55  if (hasVarno(varno) && number_of_metadata_rows_ > 0) {
56  return varnos_and_levels_.at(varno);
57  }
58  return 0;
59 }
60 
61 void DataFromSQL::setData(const size_t row, const size_t column, const double val) {
62  data_.at(row * columns_.size() + column) = val;
63 }
64 
65 void DataFromSQL::setData(const std::string& sql) {
66  odc::Select sodb(sql);
67  odc::Select::iterator begin = sodb.begin();
68  size_t rowNumber = 0;
69  for (size_t i = 0; i < begin->columns().size(); i++) {
70  column_types_.push_back(begin->columns().at(i)->type());
71  }
72  for (auto &row : sodb) {
73  for (size_t i = 0; i < begin->columns().size(); i++) {
74  setData(rowNumber, i, (row)[i]);
75  }
76  rowNumber++;
77  }
78 }
79 
80 int DataFromSQL::getColumnTypeByName(std::string const& column) const {
81  return column_types_.at(getColumnIndex(column));
82 }
83 
85  NewDimensionScales_t vertcos;
86  const int num_rows = number_of_metadata_rows_;
87  vertcos.push_back(
88  NewDimensionScale<int>("nlocs", num_rows, num_rows, num_rows));
90  int number_of_levels = std::max(numberOfLevels(varno_rawbt), numberOfLevels(varno_rawsca));
91  vertcos.push_back(NewDimensionScale<int>("nchans", number_of_levels,
92  number_of_levels, number_of_levels));
93  } else if (obsgroup_ == obsgroup_atovs) {
95  vertcos.push_back(NewDimensionScale<int>("nchans", number_of_levels,
96  number_of_levels, number_of_levels));
97  } else if (obsgroup_ == obsgroup_amsr) {
99  vertcos.push_back(NewDimensionScale<int>("nchans", number_of_levels,
100  number_of_levels, number_of_levels));
105  || obsgroup_ == obsgroup_ssmis) {
106  int number_of_levels = numberOfLevels(varno_rawbt);
107  vertcos.push_back(NewDimensionScale<int>("nchans", number_of_levels,
108  number_of_levels, number_of_levels));
109  } else if (obsgroup_ == obsgroup_mwsfy3) {
111  vertcos.push_back(NewDimensionScale<int>("nchans", number_of_levels,
112  number_of_levels, number_of_levels));
113  }
114  return vertcos;
115 }
116 
117 double DataFromSQL::getData(const size_t row, const size_t column) const {
118  return data_.at(row * columns_.size() + column);
119 }
120 
121 double DataFromSQL::getData(const size_t row, const std::string& column) const {
122  return getData(row, getColumnIndex(column));
123 }
124 
125 Eigen::ArrayXf DataFromSQL::getMetadataColumn(std::string const& col) const {
126  int column_index = getColumnIndex(col);
127  int seqno_index = getColumnIndex("seqno");
128  int varno_index = getColumnIndex("varno");
129  Eigen::ArrayXf arr(number_of_metadata_rows_);
130  if (column_index != -1) {
131  size_t seqno = -1;
132  size_t j = 0;
133  for (size_t i = 0; i < number_of_rows_; i++) {
134  size_t seqno_new = getData(i, seqno_index);
135  int varno = getData(i, varno_index);
136  if ((seqno != seqno_new && obsgroup_ != obsgroup_sonde)
137  || (varnos_[0] == varno && obsgroup_ == obsgroup_sonde)
138  || (seqno != seqno_new && obsgroup_ != obsgroup_scatwind)
139  || (varnos_[0] == varno && obsgroup_ == obsgroup_scatwind)
140  || (seqno != seqno_new && obsgroup_ != obsgroup_gpsro)
141  || (varnos_[0] == varno && obsgroup_ == obsgroup_gpsro)) {
142  arr[j] = getData(i, column_index);
143  j++;
144  seqno = seqno_new;
145  }
146  }
147  }
148  return arr;
149 }
150 
151 Eigen::ArrayXi DataFromSQL::getMetadataColumnInt(std::string const& col) const {
152  int column_index = getColumnIndex(col);
153  int seqno_index = getColumnIndex("seqno");
154  int varno_index = getColumnIndex("varno");
155  Eigen::ArrayXi arr(number_of_metadata_rows_);
156  if (column_index != -1) {
157  size_t seqno = -1;
158  size_t j = 0;
159  for (size_t i = 0; i < number_of_rows_; i++) {
160  size_t seqno_new = getData(i, seqno_index);
161  int varno = getData(i, varno_index);
162  if ((seqno != seqno_new && obsgroup_ != obsgroup_sonde)
163  || (varnos_[0] == varno && obsgroup_ == obsgroup_sonde)
164  || (seqno != seqno_new && obsgroup_ != obsgroup_scatwind)
165  || (varnos_[0] == varno && obsgroup_ == obsgroup_scatwind)
166  || (seqno != seqno_new && obsgroup_ != obsgroup_gpsro)
167  || (varnos_[0] == varno && obsgroup_ == obsgroup_gpsro)) {
168  arr[j] = getData(i, column_index);
169  j++;
170  seqno = seqno_new;
171  }
172  }
173  }
174  return arr;
175 }
176 
177 std::vector<std::string> DataFromSQL::getMetadataStringColumn(std::string const& col) const {
178  int column_index = getColumnIndex(col);
179  int seqno_index = getColumnIndex("seqno");
180  int varno_index = getColumnIndex("varno");
181  std::vector<std::string> arr;
182  if (column_index != -1) {
183  size_t seqno = -1;
184  for (size_t i = 0; i < number_of_rows_; i++) {
185  size_t seqno_new = getData(i, seqno_index);
186  int varno = getData(i, varno_index);
187  if ((seqno != seqno_new && obsgroup_ != obsgroup_sonde)
188  || (varnos_[0] == varno && obsgroup_ == obsgroup_sonde)
189  || (seqno != seqno_new && obsgroup_ != obsgroup_scatwind)
190  || (varnos_[0] == varno && obsgroup_ == obsgroup_scatwind)
191  || (seqno != seqno_new && obsgroup_ != obsgroup_gpsro)
192  || (varnos_[0] == varno && obsgroup_ == obsgroup_gpsro)) {
193  // In ODB data is retrieved as doubles but character data is stored as ASCII bits.
194  // A reinterpret_cast is used here to re-interpret the retrieved doubles as 8 character chunks.
195  char uc[9];
196  double ud = getData(i, column_index);
197  strncpy(uc, reinterpret_cast<char*>(&ud), 8);
198  uc[8] = '\0';
199 
200  // This attempts to trim the string.
201  std::string s = std::string(uc);
202  size_t endpos = s.find_last_not_of(" ");
203  size_t startpos = s.find_first_not_of(" ");
204  if (std::string::npos != endpos) {
205  s = s.substr(0, endpos + 1);
206  s = s.substr(startpos);
207  } else {
208  s.erase(std::remove(std::begin(s), std::end(s), ' '), std::end(s));
209  }
210 
211  arr.push_back(s);
212  seqno = seqno_new;
213  }
214  }
215  }
216  return arr;
217 }
218 
219 const std::vector<std::string>& DataFromSQL::getColumns() const { return columns_; }
220 
221 Eigen::ArrayXf DataFromSQL::getVarnoColumn(const std::vector<int>& varnos,
222  std::string const& col,
223  const int nchans = 1,
224  const int nchans_actual = 1) const {
225  int column_index = getColumnIndex(col);
226  int varno_index = getColumnIndex("varno");
227  size_t num_rows = 0;
228  if (nchans > 1) {
229  num_rows = nchans * number_of_metadata_rows_;
230  } else {
231  for (auto& it : varnos) {
232  num_rows = num_rows + numberOfRowsForVarno(it);
233  }
234  }
235  Eigen::ArrayXf arr = Eigen::ArrayXf::Constant(num_rows, odb_missing_float);
236  if (nchans == 1) {
237  if (column_index != -1 && varno_index != -1) {
238  size_t j = 0;
239  for (size_t i = 0; i < number_of_rows_; i++) {
240  if (std::find(varnos.begin(), varnos.end(), getData(i, varno_index)) != varnos.end()) {
241  arr[j] = getData(i, column_index);
242  j++;
243  }
244  }
245  }
246  return arr;
247  } else {
248  if (column_index != -1 && varno_index != -1) {
249  size_t j = 0;
250  size_t k_chan = 1;
251  for (size_t i = 0; i < number_of_rows_; i++) {
252  if (std::find(varnos.begin(), varnos.end(), getData(i, varno_index)) != varnos.end()) {
253  k_chan++;
254  arr[j] = getData(i, column_index);
255  j++;
256  if (k_chan > nchans_actual) {
257  j += (nchans - nchans_actual); // skip unused channels
258  k_chan = 1;
259  }
260  }
261  }
262  }
263  return arr;
264  }
265 }
266 
267 void DataFromSQL::select(const std::vector<std::string>& columns, const std::string& filename,
268  const std::vector<int>& varnos) {
269  columns_ = columns;
270  std::string sql = "select ";
271  for (int i = 0; i < columns_.size(); i++) {
272  if (i == 0) {
273  sql = sql + columns_.at(i);
274  } else {
275  sql = sql + "," + columns_.at(i);
276  }
277  }
278  sql = sql + " from \"" + filename + "\" where (";
279  for (int i = 0; i < varnos.size(); i++) {
280  if (i == 0) {
281  sql = sql + "varno = " + std::to_string(varnos.at(i));
282  } else {
283  sql = sql + " or varno = " + std::to_string(varnos.at(i));
284  }
285  }
286  sql = sql + ");";
287  size_t totalRows = countRows(sql);
288  data_.resize(totalRows * columns_.size());
289  setData(sql);
290  obsgroup_ = getData(0, getColumnIndex("ops_obsgroup"));
291  number_of_rows_ = data_.size() / columns_.size();
292  int varno_column = getColumnIndex("varno");
293  for (size_t i = 0; i < number_of_rows_; i++) {
294  int varno = getData(i, varno_column);
295  if (std::find(varnos_.begin(), varnos_.end(), varno) == varnos_.end()) {
296  varnos_.push_back(varno);
297  }
298  }
299  number_of_varnos_ = varnos_.size();
301 
303  || obsgroup_ == obsgroup_gpsro) {
305  } else {
306  int seqno_index = getColumnIndex("seqno");
307  size_t seqno = -1;
308  for (size_t i = 0; i < number_of_rows_; i++) {
309  size_t seqno_new = getData(i, seqno_index);
310  if (seqno != seqno_new) {
312  seqno = seqno_new;
313  }
314  }
315  }
316 
317  for (size_t i = 0; i < number_of_varnos_; i++) {
320  }
321  }
322 }
323 
324 int DataFromSQL::getObsgroup() const { return obsgroup_; }
325 
326 std::vector<std::string> DataFromSQL::getDates(std::string const& date_col,
327  std::string const& time_col) const {
328  Eigen::ArrayXi var_date = getMetadataColumnInt(date_col);
329  Eigen::ArrayXi var_time = getMetadataColumnInt(time_col);
330  std::vector<std::string> date_strings;
331  date_strings.reserve(var_date.size());
332 
333  const std::string missingDateTime = "9996-02-29T23:58:57Z"; // same as oops
334  for (int i = 0; i < var_date.size(); i++) {
335  std::string datetimestring;
336  if (var_date[i] != odb_missing_int && var_time[i] != odb_missing_int) {
337  int year = var_date[i] / 10000;
338  int month = var_date[i] / 100 - year * 100;
339  int day = var_date[i] - 10000 * year - 100 * month;
340  int hour = var_time[i] / 10000;
341  int minute = var_time[i] / 100 - hour * 100;
342  int second = var_time[i] - 10000 * hour - 100 * minute;
343  std::ostringstream stream;
344  stream << year << "-" << std::setfill('0') << std::setw(2) << month << "-" << std::setfill('0')
345  << std::setw(2) << day << "T" << std::setfill('0') << std::setw(2) << hour << ":"
346  << std::setfill('0') << std::setw(2) << minute << ":" << std::setfill('0')
347  << std::setw(2) << second << "Z";
348  datetimestring = stream.str();
349  } else {
350  datetimestring = missingDateTime;
351  }
352  date_strings.push_back(std::move(datetimestring));
353  }
354  return date_strings;
355 }
356 
359  ioda::Variable v;
360  int col_type = getColumnTypeByName(column);
361  Eigen::ArrayXf var;
362  Eigen::ArrayXi vari;
363  std::vector<std::string> vard;
364  if (col_type == odb_type_int || col_type == odb_type_bitfield) {
365  vari = getMetadataColumnInt(column);
366  } else if (col_type == odb_type_real) {
367  var = getMetadataColumn(column);
368  } else {
369  vard = getMetadataStringColumn(column);
370  }
371  if (col_type == odb_type_int || col_type == odb_type_bitfield) {
372  VariableCreationParameters params_copy = params;
373  params_copy.setFillValue<int>(odb_missing_int);
374  v = og.vars.createWithScales<int>(column, {og.vars["nlocs"]}, params_copy);
375  v.writeWithEigenRegular(vari);
376  } else if (col_type == odb_type_real) {
377  VariableCreationParameters params_copy = params;
378  params_copy.setFillValue<float>(odb_missing_float);
379  v = og.vars.createWithScales<float>(column, {og.vars["nlocs"]}, params_copy);
380  v.writeWithEigenRegular(var);
381  } else {
382  v = og.vars.createWithScales<std::string>(column, {og.vars["nlocs"]}, params);
383  v.write(vard);
384  }
385  return v;
386 }
387 
390  ioda::Variable v;
391  Eigen::ArrayXf var;
392  if (obsgroup_ == obsgroup_atovs && varno == varno_rawbt_hirs) {
393  const std::vector<int> varnos{varno_rawbt_hirs, varno_rawbt_amsu};
394  var = getVarnoColumn(varnos, "initial_obsvalue");
395  } else if (obsgroup_ == obsgroup_atovs && varno == varno_rawbt_amsu) {
396  const std::vector<int> varnos{varno_rawbt_hirs, varno_rawbt_amsu};
397  var = getVarnoColumn(varnos, "initial_obsvalue");
398  } else if (obsgroup_ == obsgroup_amsr && varno == varno_rawbt) {
399  const std::vector<int> varnos{varno_rawbt, varno_rawbt_amsr_89ghz};
400  var = getVarnoColumn(varnos, "initial_obsvalue");
401  } else if (obsgroup_ == obsgroup_amsr && varno != varno_rawbt) {
402  const std::vector<int> varnos{varno_rawbt, varno_rawbt_amsr_89ghz};
403  var = getVarnoColumn(varnos, "initial_obsvalue");
404  } else if (obsgroup_ == obsgroup_mwsfy3 && varno == varno_rawbt_mwts) {
405  const std::vector<int> varnos{varno_rawbt_mwts, varno_rawbt_mwhs};
406  var = getVarnoColumn(varnos, "initial_obsvalue");
407  } else if (obsgroup_ == obsgroup_mwsfy3 && varno != varno_rawbt_mwts) {
408  const std::vector<int> varnos{varno_rawbt_mwts, varno_rawbt_mwhs};
409  var = getVarnoColumn(varnos, "initial_obsvalue");
410  } else if (obsgroup_ == obsgroup_cris && varno == varno_rawbt) {
411  const std::vector<int> varnos{varno_rawbt};
412  var = getVarnoColumn(varnos, "initial_obsvalue");
413  } else if (obsgroup_ == obsgroup_cris && varno == varno_rawsca) {
414  const std::vector<int> varnos{varno_rawsca};
415  var = getVarnoColumn(varnos, "initial_obsvalue", numberOfLevels(varno_rawbt), numberOfLevels(varno_rawsca));
416  } else if (obsgroup_ == obsgroup_iasi && varno == varno_rawbt_amsu) {
417  const std::vector<int> varnos{varno_rawbt_amsu};
418  var = getVarnoColumn(varnos, "initial_obsvalue", numberOfLevels(varno_rawbt), numberOfLevels(varno_rawbt_amsu));
419  } else if (obsgroup_ == obsgroup_iasi && varno == varno_rawsca) {
420  const std::vector<int> varnos{varno_rawsca};
421  var = getVarnoColumn(varnos, "initial_obsvalue", numberOfLevels(varno_rawbt), numberOfLevels(varno_rawsca));
422  } else {
423  const std::vector<int> varnos{varno};
424  var = getVarnoColumn(varnos, "initial_obsvalue");
425  }
426 
427  VariableCreationParameters params_copy = params;
428  params_copy.setFillValue<float>(odb_missing_float);
429 
430  int number_of_levels;
431  if (obsgroup_ == obsgroup_atovs && varno == varno_rawbt_hirs) {
433  } else {
434  number_of_levels = numberOfLevels(varno);
435  }
436  if (number_of_levels <= 0) return v;
437  if (number_of_levels == 1) {
438  v = og.vars.createWithScales<float>(std::to_string(varno), {og.vars["nlocs"]}, params_copy);
439  } else {
440  std::string vertco_type;
442  if (varno == varno_rawbt || varno == varno_rawsca || varno == varno_rawbt_amsu) {
443  vertco_type = "nchans";
444  }
445  } else if (obsgroup_ == obsgroup_atovs) {
446  if (varno == varno_rawbt_hirs) {
447  vertco_type = "nchans";
448  }
449  } else if (obsgroup_ == obsgroup_amsr) {
450  if (varno == varno_rawbt) {
451  vertco_type = "nchans";
452  }
453  } else if (obsgroup_ == obsgroup_mwsfy3) {
454  if (varno == varno_rawbt_mwts) {
455  vertco_type = "nchans";
456  }
461  || obsgroup_ == obsgroup_ssmis) {
462  if (varno == varno_rawbt) {
463  vertco_type = "nchans";
464  }
465  }
466  if (vertco_type == "") {
467  v = og.vars.createWithScales<float>(std::to_string(varno), {og.vars["nlocs"]},
468  params_copy);
474  v = og.vars.createWithScales<float>(std::to_string(varno),
475  {og.vars["nlocs"], og.vars["nchans"]}, params_copy);
476  } else {
477  v = og.vars.createWithScales<float>(
478  std::to_string(varno), {og.vars["nlocs"], og.vars[vertco_type]}, params_copy);
479  }
480  }
481  v.writeWithEigenRegular(var);
482  return v;
483 }
484 
485 size_t DataFromSQL::countRows(const std::string& sql) {
486  odc::Select sodb(sql);
487  odc::Select::iterator it = sodb.begin();
488  odc::Select::iterator end = sodb.end();
489  size_t totalRows = 0;
490  for (; it != end; ++it) {
491  totalRows++;
492  }
493  return totalRows;
494 }
495 
496 } // namespace ODC
497 } // namespace Engines
498 } // namespace ioda
implements ODC bindings
std::map< int, size_t > varnos_and_levels_
Definition: DataFromSQL.h:78
std::vector< std::string > getDates(std::string const &date_col, std::string const &time_col) const
Returns a vector of date strings.
NewDimensionScales_t getVertcos() const
Returns the dimensions for the ODB.
Definition: DataFromSQL.cpp:84
size_t numberOfRowsForVarno(int varno) const
Returns the number of rows for a particular varno.
Definition: DataFromSQL.cpp:35
int getObsgroup() const
Returns the obsgroup number.
Eigen::ArrayXf getMetadataColumn(std::string const &column) const
Returns data for a (metadata) column.
Eigen::ArrayXf getVarnoColumn(const std::vector< int > &varnos, std::string const &column, const int nchans, const int nchans_actual) const
Returns data for a varno for a varno column.
Eigen::ArrayXi getMetadataColumnInt(std::string const &column) const
Returns data for a (metadata) column.
bool hasVarno(int varno) const
Returns true if a particular varno is present.
Definition: DataFromSQL.cpp:47
size_t numberOfMetadataRows() const
Returns the number of "metadata" rows, i.e. hdr-type rows.
Definition: DataFromSQL.cpp:24
ioda::Variable getIodaObsvalue(int varno, ioda::ObsGroup og, ioda::VariableCreationParameters params) const
Returns an ioda variable for a specified column.
std::vector< double > data_
Definition: DataFromSQL.h:73
DataFromSQL()
Simple constructor.
Definition: DataFromSQL.cpp:22
void setData(size_t row, size_t column, double val)
Set a value for a row,column element.
Definition: DataFromSQL.cpp:61
void select(const std::vector< std::string > &columns, const std::string &filename, const std::vector< int > &varnos)
Populate structure with data from specified columns, file and varnos.
std::vector< int > varnos_
Definition: DataFromSQL.h:72
std::vector< int > column_types_
Definition: DataFromSQL.h:71
ioda::Variable getIodaVariable(std::string const &column, ioda::ObsGroup og, ioda::VariableCreationParameters params) const
Returns an ioda variable for a specified column.
std::vector< std::string > getMetadataStringColumn(std::string const &column) const
Returns data for a (metadata) column.
int getColumnIndex(const std::string &column) const
Returns the index of a specified column.
Definition: DataFromSQL.cpp:26
size_t numberOfLevels(int varno) const
Returns the number of levels for each varno.
Definition: DataFromSQL.cpp:54
static size_t countRows(const std::string &sql)
Returns a count of the rows extracted by an sql.
double getData(size_t row, size_t column) const
Returns the value for a particular row/column.
const std::vector< std::string > & getColumns() const
Returns a vector of columns.
std::vector< std::string > columns_
Definition: DataFromSQL.h:70
int getColumnTypeByName(std::string const &column) const
Returns the type of a specified column.
Definition: DataFromSQL.cpp:80
An ObsGroup is a specialization of a ioda::Group. It provides convenience functions and guarantees th...
Definition: ObsGroup.h:32
Variable_Implementation writeWithEigenRegular(const EigenClass &d, const Selection &mem_selection=Selection::all, const Selection &file_selection=Selection::all)
Write an Eigen object (a Matrix, an Array, a Block, a Map).
virtual Variable write(gsl::span< char > data, const Type &in_memory_dataType, const Selection &mem_selection=Selection::all, const Selection &file_selection=Selection::all)
The fundamental write function. Backends overload this function to implement all write operations.
Definition: Variable.cpp:317
const core::MetaData & columns() const
Definition: IteratorProxy.h:94
const iterator end()
Definition: Select.cc:77
iterator begin()
Definition: Select.cc:81
static constexpr int obsgroup_ssmis
Definition: DataFromSQL.h:35
static constexpr int obsgroup_gmilow
Definition: DataFromSQL.h:45
static constexpr int varno_rawsca
Definition: DataFromSQL.h:52
static constexpr int obsgroup_abiclr
Definition: DataFromSQL.h:39
static constexpr int varno_rawbt_hirs
Definition: DataFromSQL.h:54
static constexpr int obsgroup_sonde
Definition: DataFromSQL.h:31
static constexpr int obsgroup_gpsro
Definition: DataFromSQL.h:34
static constexpr int obsgroup_iasi
Definition: DataFromSQL.h:36
static constexpr int odb_type_real
Definition: DataFromSQL.h:61
static constexpr int varno_rawbt_amsu
Definition: DataFromSQL.h:55
static constexpr int obsgroup_atms
Definition: DataFromSQL.h:40
static constexpr int obsgroup_atovs
Definition: DataFromSQL.h:32
static constexpr int obsgroup_airs
Definition: DataFromSQL.h:33
static constexpr int varno_rawbt_mwts
Definition: DataFromSQL.h:57
static constexpr int obsgroup_ahiclr
Definition: DataFromSQL.h:43
static constexpr int obsgroup_cris
Definition: DataFromSQL.h:41
static constexpr int odb_missing_int
Definition: DataFromSQL.h:66
static constexpr int obsgroup_seviriclr
Definition: DataFromSQL.h:37
static constexpr int obsgroup_mwsfy3
Definition: DataFromSQL.h:42
static constexpr float odb_missing_float
Definition: DataFromSQL.h:65
static constexpr int odb_type_int
Definition: DataFromSQL.h:60
static constexpr int obsgroup_amsr
Definition: DataFromSQL.h:38
static constexpr int varno_rawbt_mwhs
Definition: DataFromSQL.h:58
static constexpr int obsgroup_mwri
Definition: DataFromSQL.h:44
static constexpr int obsgroup_gmihigh
Definition: DataFromSQL.h:46
static constexpr int obsgroup_hiras
Definition: DataFromSQL.h:47
static constexpr int varno_rawbt_amsr_89ghz
Definition: DataFromSQL.h:56
static constexpr int odb_type_bitfield
Definition: DataFromSQL.h:63
static constexpr int varno_rawbt
Definition: DataFromSQL.h:50
static constexpr int obsgroup_scatwind
Definition: DataFromSQL.h:29
std::vector< std::shared_ptr< NewDimensionScale_Base > > NewDimensionScales_t
Used to specify Variable creation-time properties.
Definition: Has_Variables.h:57
VariableCreationParameters & setFillValue(DataType fill)
Definition: Has_Variables.h:69