IODA
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) {
94  int number_of_levels = numberOfLevels(varno_rawbt_amsu);
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  } else if (obsgroup_ == obsgroup_geocloud) {
114  int number_of_levels = numberOfLevels(varno_cloud_fraction_covered);
115  vertcos.push_back(NewDimensionScale<int>("nchans", number_of_levels,
116  number_of_levels, number_of_levels));
117  } else if (obsgroup_ == obsgroup_surfacecloud) {
118  int number_of_levels = numberOfLevels(varno_cloud_fraction_covered);
119  vertcos.push_back(NewDimensionScale<int>("nchans", number_of_levels,
120  number_of_levels, number_of_levels));
121  }
122  return vertcos;
123 }
124 
125 double DataFromSQL::getData(const size_t row, const size_t column) const {
126  return data_.at(row * columns_.size() + column);
127 }
128 
129 double DataFromSQL::getData(const size_t row, const std::string& column) const {
130  return getData(row, getColumnIndex(column));
131 }
132 
133 Eigen::ArrayXf DataFromSQL::getMetadataColumn(std::string const& col) const {
134  int column_index = getColumnIndex(col);
135  int seqno_index = getColumnIndex("seqno");
136  int varno_index = getColumnIndex("varno");
137  Eigen::ArrayXf arr(number_of_metadata_rows_);
138  if (column_index != -1) {
139  size_t seqno = -1;
140  size_t j = 0;
141  for (size_t i = 0; i < number_of_rows_; i++) {
142  size_t seqno_new = getData(i, seqno_index);
143  int varno = getData(i, varno_index);
144  if ((seqno != seqno_new && obsgroup_ != obsgroup_sonde)
145  || (varnos_[0] == varno && obsgroup_ == obsgroup_sonde)
146  || (seqno != seqno_new && obsgroup_ != obsgroup_scatwind)
147  || (varnos_[0] == varno && obsgroup_ == obsgroup_scatwind)
148  || (seqno != seqno_new && obsgroup_ != obsgroup_geocloud)
149  || (varnos_[0] == varno && obsgroup_ == obsgroup_geocloud)
150  || (seqno != seqno_new && obsgroup_ != obsgroup_gpsro)
151  || (varnos_[0] == varno && obsgroup_ == obsgroup_gpsro)) {
152  arr[j] = getData(i, column_index);
153  j++;
154  seqno = seqno_new;
155  }
156  }
157  }
158  return arr;
159 }
160 
161 Eigen::ArrayXi DataFromSQL::getMetadataColumnInt(std::string const& col) const {
162  int column_index = getColumnIndex(col);
163  int seqno_index = getColumnIndex("seqno");
164  int varno_index = getColumnIndex("varno");
165  Eigen::ArrayXi arr(number_of_metadata_rows_);
166  if (column_index != -1) {
167  size_t seqno = -1;
168  size_t j = 0;
169  for (size_t i = 0; i < number_of_rows_; i++) {
170  size_t seqno_new = getData(i, seqno_index);
171  int varno = getData(i, varno_index);
172  if ((seqno != seqno_new && obsgroup_ != obsgroup_sonde)
173  || (varnos_[0] == varno && obsgroup_ == obsgroup_sonde)
174  || (seqno != seqno_new && obsgroup_ != obsgroup_scatwind)
175  || (varnos_[0] == varno && obsgroup_ == obsgroup_scatwind)
176  || (seqno != seqno_new && obsgroup_ != obsgroup_geocloud)
177  || (varnos_[0] == varno && obsgroup_ == obsgroup_geocloud)
178  || (seqno != seqno_new && obsgroup_ != obsgroup_gpsro)
179  || (varnos_[0] == varno && obsgroup_ == obsgroup_gpsro)) {
180  arr[j] = getData(i, column_index);
181  j++;
182  seqno = seqno_new;
183  }
184  }
185  }
186  return arr;
187 }
188 
189 std::vector<std::string> DataFromSQL::getMetadataStringColumn(std::string const& col) const {
190  int column_index = getColumnIndex(col);
191  int seqno_index = getColumnIndex("seqno");
192  int varno_index = getColumnIndex("varno");
193  std::vector<std::string> arr;
194  if (column_index != -1) {
195  size_t seqno = -1;
196  for (size_t i = 0; i < number_of_rows_; i++) {
197  size_t seqno_new = getData(i, seqno_index);
198  int varno = getData(i, varno_index);
199  if ((seqno != seqno_new && obsgroup_ != obsgroup_sonde)
200  || (varnos_[0] == varno && obsgroup_ == obsgroup_sonde)
201  || (seqno != seqno_new && obsgroup_ != obsgroup_scatwind)
202  || (varnos_[0] == varno && obsgroup_ == obsgroup_scatwind)
203  || (seqno != seqno_new && obsgroup_ != obsgroup_geocloud)
204  || (varnos_[0] == varno && obsgroup_ == obsgroup_geocloud)
205  || (seqno != seqno_new && obsgroup_ != obsgroup_gpsro)
206  || (varnos_[0] == varno && obsgroup_ == obsgroup_gpsro)) {
207  // In ODB data is retrieved as doubles but character data is stored as ASCII bits.
208  // A reinterpret_cast is used here to re-interpret the retrieved doubles as 8 character chunks.
209  char uc[9];
210  double ud = getData(i, column_index);
211  strncpy(uc, reinterpret_cast<char*>(&ud), 8);
212  uc[8] = '\0';
213 
214  // This attempts to trim the string.
215  std::string s = std::string(uc);
216  size_t endpos = s.find_last_not_of(" ");
217  size_t startpos = s.find_first_not_of(" ");
218  if (std::string::npos != endpos) {
219  s = s.substr(0, endpos + 1);
220  s = s.substr(startpos);
221  } else {
222  s.erase(std::remove(std::begin(s), std::end(s), ' '), std::end(s));
223  }
224 
225  arr.push_back(s);
226  seqno = seqno_new;
227  }
228  }
229  }
230  return arr;
231 }
232 
233 const std::vector<std::string>& DataFromSQL::getColumns() const { return columns_; }
234 
235 Eigen::ArrayXf DataFromSQL::getVarnoColumn(const std::vector<int>& varnos,
236  std::string const& col,
237  const int nchans = 1,
238  const int nchans_actual = 1) const {
239  int column_index = getColumnIndex(col);
240  int varno_index = getColumnIndex("varno");
241  size_t num_rows = 0;
242  if (nchans > 1) {
243  num_rows = nchans * number_of_metadata_rows_;
244  } else {
245  for (auto& it : varnos) {
246  num_rows = num_rows + numberOfRowsForVarno(it);
247  }
248  }
249  Eigen::ArrayXf arr = Eigen::ArrayXf::Constant(num_rows, odb_missing_float);
250  if (nchans == 1) {
251  if (column_index != -1 && varno_index != -1) {
252  size_t j = 0;
253  for (size_t i = 0; i < number_of_rows_; i++) {
254  if (std::find(varnos.begin(), varnos.end(), getData(i, varno_index)) != varnos.end()) {
255  arr[j] = getData(i, column_index);
256  j++;
257  }
258  }
259  }
260  return arr;
261  } else {
262  if (column_index != -1 && varno_index != -1) {
263  size_t j = 0;
264  size_t k_chan = 1;
265  for (size_t i = 0; i < number_of_rows_; i++) {
266  if (std::find(varnos.begin(), varnos.end(), getData(i, varno_index)) != varnos.end()) {
267  k_chan++;
268  arr[j] = getData(i, column_index);
269  j++;
270  if (k_chan > nchans_actual) {
271  j += (nchans - nchans_actual); // skip unused channels
272  k_chan = 1;
273  }
274  }
275  }
276  }
277  return arr;
278  }
279 }
280 
281 void DataFromSQL::select(const std::vector<std::string>& columns, const std::string& filename,
282  const std::vector<int>& varnos, const std::string& query) {
283  columns_ = columns;
284  std::string sql = "select ";
285  for (int i = 0; i < columns_.size(); i++) {
286  if (i == 0) {
287  sql = sql + columns_.at(i);
288  } else {
289  sql = sql + "," + columns_.at(i);
290  }
291  }
292  sql = sql + " from \"" + filename + "\" where (";
293  for (int i = 0; i < varnos.size(); i++) {
294  if (i == 0) {
295  sql = sql + "varno = " + std::to_string(varnos.at(i));
296  } else {
297  sql = sql + " or varno = " + std::to_string(varnos.at(i));
298  }
299  }
300  sql = sql + ")";
301  if (!query.empty()) {
302  sql = sql + " and (" + query + ");";
303  } else {
304  sql = sql + ";";
305  }
306  size_t totalRows = countRows(sql);
307  data_.resize(totalRows * columns_.size());
308  setData(sql);
309  obsgroup_ = getData(0, getColumnIndex("ops_obsgroup"));
310  number_of_rows_ = data_.size() / columns_.size();
311  int varno_column = getColumnIndex("varno");
312  for (size_t i = 0; i < number_of_rows_; i++) {
313  int varno = getData(i, varno_column);
314  if (std::find(varnos_.begin(), varnos_.end(), varno) == varnos_.end()) {
315  varnos_.push_back(varno);
316  }
317  }
318  number_of_varnos_ = varnos_.size();
320 
322  || obsgroup_ == obsgroup_gpsro) {
324  } else {
325  int seqno_index = getColumnIndex("seqno");
326  size_t seqno = -1;
327  for (size_t i = 0; i < number_of_rows_; i++) {
328  size_t seqno_new = getData(i, seqno_index);
329  if (seqno != seqno_new) {
331  seqno = seqno_new;
332  }
333  }
334  }
335 
336  for (size_t i = 0; i < number_of_varnos_; i++) {
337  if (hasVarno(varnos_[i]) && number_of_metadata_rows_ > 0) {
339  }
340  }
341 }
342 
343 int DataFromSQL::getObsgroup() const { return obsgroup_; }
344 
345 std::vector<std::string> DataFromSQL::getDates(std::string const& date_col,
346  std::string const& time_col) const {
347  Eigen::ArrayXi var_date = getMetadataColumnInt(date_col);
348  Eigen::ArrayXi var_time = getMetadataColumnInt(time_col);
349  std::vector<std::string> date_strings;
350  date_strings.reserve(var_date.size());
351 
352  const std::string missingDateTime = "9996-02-29T23:58:57Z"; // same as oops
353  for (int i = 0; i < var_date.size(); i++) {
354  std::string datetimestring;
355  if (var_date[i] != odb_missing_int && var_time[i] != odb_missing_int) {
356  int year = var_date[i] / 10000;
357  int month = var_date[i] / 100 - year * 100;
358  int day = var_date[i] - 10000 * year - 100 * month;
359  int hour = var_time[i] / 10000;
360  int minute = var_time[i] / 100 - hour * 100;
361  int second = var_time[i] - 10000 * hour - 100 * minute;
362  std::ostringstream stream;
363  stream << year << "-" << std::setfill('0') << std::setw(2) << month << "-" << std::setfill('0')
364  << std::setw(2) << day << "T" << std::setfill('0') << std::setw(2) << hour << ":"
365  << std::setfill('0') << std::setw(2) << minute << ":" << std::setfill('0')
366  << std::setw(2) << second << "Z";
367  datetimestring = stream.str();
368  } else {
369  datetimestring = missingDateTime;
370  }
371  date_strings.push_back(std::move(datetimestring));
372  }
373  return date_strings;
374 }
375 
378  ioda::Variable v;
379  int col_type = getColumnTypeByName(column);
380  Eigen::ArrayXf var;
381  Eigen::ArrayXi vari;
382  std::vector<std::string> vard;
383  if (col_type == odb_type_int || col_type == odb_type_bitfield) {
384  vari = getMetadataColumnInt(column);
385  } else if (col_type == odb_type_real) {
386  var = getMetadataColumn(column);
387  } else {
388  vard = getMetadataStringColumn(column);
389  }
390  if (col_type == odb_type_int || col_type == odb_type_bitfield) {
391  VariableCreationParameters params_copy = params;
392  params_copy.setFillValue<int>(odb_missing_int);
393  v = og.vars.createWithScales<int>(column, {og.vars["nlocs"]}, params_copy);
394  v.writeWithEigenRegular(vari);
395  } else if (col_type == odb_type_real) {
396  VariableCreationParameters params_copy = params;
397  params_copy.setFillValue<float>(odb_missing_float);
398  v = og.vars.createWithScales<float>(column, {og.vars["nlocs"]}, params_copy);
399  v.writeWithEigenRegular(var);
400  } else {
401  v = og.vars.createWithScales<std::string>(column, {og.vars["nlocs"]}, params);
402  v.write(vard);
403  }
404  return v;
405 }
406 
409  ioda::Variable v;
410  Eigen::ArrayXf var;
411  if (obsgroup_ == obsgroup_atovs && varno == varno_rawbt_amsu) {
412  const std::vector<int> varnos{varno_rawbt_amsu};
413  var = getVarnoColumn(varnos, "initial_obsvalue");
414  } else if (obsgroup_ == obsgroup_amsr && varno == varno_rawbt) {
415  const std::vector<int> varnos{varno_rawbt, varno_rawbt_amsr_89ghz};
416  var = getVarnoColumn(varnos, "initial_obsvalue");
417  } else if (obsgroup_ == obsgroup_amsr && varno != varno_rawbt) {
418  const std::vector<int> varnos{varno_rawbt, varno_rawbt_amsr_89ghz};
419  var = getVarnoColumn(varnos, "initial_obsvalue");
420  } else if (obsgroup_ == obsgroup_mwsfy3 && varno == varno_rawbt_mwts) {
421  const std::vector<int> varnos{varno_rawbt_mwts, varno_rawbt_mwhs};
422  var = getVarnoColumn(varnos, "initial_obsvalue");
423  } else if (obsgroup_ == obsgroup_mwsfy3 && varno != varno_rawbt_mwts) {
424  const std::vector<int> varnos{varno_rawbt_mwts, varno_rawbt_mwhs};
425  var = getVarnoColumn(varnos, "initial_obsvalue");
426  } else if (obsgroup_ == obsgroup_cris) {
427  const std::vector<int> varnos{varno};
428  var = getVarnoColumn(varnos, "initial_obsvalue", std::max(numberOfLevels(varno_rawbt), numberOfLevels(varno_rawsca)), numberOfLevels(varno));
429  } else if (obsgroup_ == obsgroup_hiras) {
430  const std::vector<int> varnos{varno};
431  var = getVarnoColumn(varnos, "initial_obsvalue", std::max(numberOfLevels(varno_rawbt), numberOfLevels(varno_rawsca)), numberOfLevels(varno));
432  } else if (obsgroup_ == obsgroup_iasi && varno == varno_rawbt_amsu) {
433  const std::vector<int> varnos{varno_rawbt_amsu};
434  var = getVarnoColumn(varnos, "initial_obsvalue", numberOfLevels(varno_rawbt), numberOfLevels(varno_rawbt_amsu));
435  } else if (obsgroup_ == obsgroup_iasi && varno == varno_rawsca) {
436  const std::vector<int> varnos{varno_rawsca};
437  var = getVarnoColumn(varnos, "initial_obsvalue", numberOfLevels(varno_rawbt), numberOfLevels(varno_rawsca));
438  } else if (obsgroup_ == obsgroup_geocloud) {
439  const std::vector<int> varnos{varno};
440  var = getVarnoColumn(varnos, "initial_obsvalue", numberOfLevels(varno_cloud_fraction_covered), numberOfLevels(varno));
441  } else if (obsgroup_ == obsgroup_surfacecloud) {
442  const std::vector<int> varnos{varno};
443  var = getVarnoColumn(varnos, "initial_obsvalue", numberOfLevels(varno_cloud_fraction_covered), numberOfLevels(varno));
444  } else {
445  const std::vector<int> varnos{varno};
446  var = getVarnoColumn(varnos, "initial_obsvalue");
447  }
448 
449  VariableCreationParameters params_copy = params;
450  params_copy.setFillValue<float>(odb_missing_float);
451 
452  int number_of_levels;
454  number_of_levels = numberOfLevels(varno_cloud_fraction_covered);
455  } else {
456  number_of_levels = numberOfLevels(varno);
457  }
458  if (number_of_levels <= 0) return v;
459  if (number_of_levels == 1 && obsgroup_ != obsgroup_geocloud && obsgroup_ != obsgroup_surfacecloud) {
460  v = og.vars.createWithScales<float>(std::to_string(varno), {og.vars["nlocs"]}, params_copy);
461  } else {
462  v = og.vars.createWithScales<float>(std::to_string(varno),
463  {og.vars["nlocs"], og.vars["nchans"]}, params_copy);
464  }
465  v.writeWithEigenRegular(var);
466  return v;
467 }
468 
469 size_t DataFromSQL::countRows(const std::string& sql) {
470  odc::Select sodb(sql);
471  odc::Select::iterator it = sodb.begin();
472  odc::Select::iterator end = sodb.end();
473  size_t totalRows = 0;
474  for (; it != end; ++it) {
475  totalRows++;
476  }
477  return totalRows;
478 }
479 
480 } // namespace ODC
481 } // namespace Engines
482 } // namespace ioda
implements ODC bindings
std::map< int, size_t > varnos_and_levels_
Definition: DataFromSQL.h:81
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:76
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
std::vector< int > varnos_
Definition: DataFromSQL.h:75
std::vector< int > column_types_
Definition: DataFromSQL.h:74
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:73
int getColumnTypeByName(std::string const &column) const
Returns the type of a specified column.
Definition: DataFromSQL.cpp:80
void select(const std::vector< std::string > &columns, const std::string &filename, const std::vector< int > &varnos, const std::string &query)
Populate structure with data from specified columns, file and varnos.
An ObsGroup is a specialization of a ioda::Group. It provides convenience functions and guarantees th...
Definition: ObsGroup.h:32
Variables store data!
Definition: Variable.h:680
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).
Definition: Variable.h:361
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
static constexpr int obsgroup_ssmis
Definition: DataFromSQL.h:35
static constexpr int obsgroup_gmilow
Definition: DataFromSQL.h:47
static constexpr int varno_rawsca
Definition: DataFromSQL.h:54
static constexpr int obsgroup_surfacecloud
Definition: DataFromSQL.h:43
static constexpr int obsgroup_abiclr
Definition: DataFromSQL.h:40
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 varno_cloud_fraction_covered
Definition: DataFromSQL.h:58
static constexpr int odb_type_real
Definition: DataFromSQL.h:64
static constexpr int varno_rawbt_amsu
Definition: DataFromSQL.h:57
static constexpr int obsgroup_atms
Definition: DataFromSQL.h:41
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:60
static constexpr int obsgroup_ahiclr
Definition: DataFromSQL.h:45
static constexpr int obsgroup_cris
Definition: DataFromSQL.h:42
static constexpr int odb_missing_int
Definition: DataFromSQL.h:69
static constexpr int obsgroup_seviriclr
Definition: DataFromSQL.h:37
static constexpr int obsgroup_mwsfy3
Definition: DataFromSQL.h:44
static constexpr float odb_missing_float
Definition: DataFromSQL.h:68
static constexpr int odb_type_int
Definition: DataFromSQL.h:63
static constexpr int obsgroup_amsr
Definition: DataFromSQL.h:39
static constexpr int varno_rawbt_mwhs
Definition: DataFromSQL.h:61
static constexpr int obsgroup_mwri
Definition: DataFromSQL.h:46
static constexpr int obsgroup_gmihigh
Definition: DataFromSQL.h:48
static constexpr int obsgroup_hiras
Definition: DataFromSQL.h:49
static constexpr int varno_rawbt_amsr_89ghz
Definition: DataFromSQL.h:59
static constexpr int obsgroup_geocloud
Definition: DataFromSQL.h:38
static constexpr int odb_type_bitfield
Definition: DataFromSQL.h:66
static constexpr int varno_rawbt
Definition: DataFromSQL.h:52
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