nidas  v1.2-1520
VariableConverter.h
Go to the documentation of this file.
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4; -*-
2 // vim: set shiftwidth=4 softtabstop=4 expandtab:
3 /*
4  ********************************************************************
5  ** NIDAS: NCAR In-situ Data Acquistion Software
6  **
7  ** 2005, Copyright University Corporation for Atmospheric Research
8  **
9  ** This program is free software; you can redistribute it and/or modify
10  ** it under the terms of the GNU General Public License as published by
11  ** the Free Software Foundation; either version 2 of the License, or
12  ** (at your option) any later version.
13  **
14  ** This program is distributed in the hope that it will be useful,
15  ** but WITHOUT ANY WARRANTY; without even the implied warranty of
16  ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  ** GNU General Public License for more details.
18  **
19  ** The LICENSE.txt file accompanying this software contains
20  ** a copy of the GNU General Public License. If it is not found,
21  ** write to the Free Software Foundation, Inc.,
22  ** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23  **
24  ********************************************************************
25 */
26 
27 #ifndef NIDAS_CORE_VARIABLECONVERTER_H
28 #define NIDAS_CORE_VARIABLECONVERTER_H
29 
30 #include "DOMable.h"
31 #include "Sample.h"
32 #include "Parameter.h"
33 
34 #include <string>
35 #include <vector>
36 
37 namespace nidas { namespace core {
38 
39 class DSMConfig;
40 class DSMSensor;
41 class CalFile;
42 class Variable;
43 
58 {
59 public:
61  {}
62 
63  virtual bool handleCalFileRecord(nidas::core::CalFile*) = 0;
64 
65  virtual ~CalFileHandler() {}
66 };
67 
68 
70 {
71 public:
72 
74 
79 
84 
85  virtual ~VariableConverter();
86 
87  virtual VariableConverter* clone() const = 0;
88 
101  virtual void readCalFile(dsm_time_t) throw();
102 
109 
110  virtual double convert(dsm_time_t,double v) = 0;
111 
112  void setUnits(const std::string& val) { _units = val; }
113 
114  virtual const std::string& getUnits() const { return _units; }
115 
116  void setVariable(const Variable* val) { _variable = val; }
117 
118  const Variable* getVariable() const { return _variable; }
119 
124  virtual void reset() = 0;
125 
126  const DSMSensor* getDSMSensor() const;
127 
128  const DSMConfig* getDSMConfig() const;
129 
134  virtual std::string toString() const = 0;
135 
136  virtual void fromString(const std::string&)
137  throw(nidas::util::InvalidParameterException) {
139  "fromString() not supported in this VariableConverter");
140  }
141 
143  XDOMElement& child);
144 
145  static VariableConverter* createFromString(const std::string&)
146  throw(nidas::util::InvalidParameterException);
147 
154  void addParameter(Parameter* val);
155 
159  const std::list<const Parameter*>& getParameters() const
160  {
161  return _constParameters;
162  }
163 
168  const Parameter* getParameter(const std::string& name) const;
169 
170  void fromDOMElement(const xercesc::DOMElement*)
171  throw(nidas::util::InvalidParameterException);
172 
173  void setCalFile(CalFile*);
174 
175  CalFile* getCalFile()
176  {
177  return _calFile;
178  }
179 
180  const CalFile* getCalFile() const
181  {
182  return _calFile;
183  }
184 
185 private:
186 
187  std::string _units;
188 
192  std::map<std::string,Parameter*> _parameters;
193 
198  std::list<const Parameter*> _constParameters;
199 
201 
202 protected:
203 
208  virtual void parseFields(CalFile* cf) = 0;
209 
210  void abortCalFile(const std::string& what);
211 
213 
215 };
216 
221 {
222 public:
223 
224  Linear();
225 
226  Linear* clone() const;
227 
228  void setSlope(float val) { _slope = val; }
229 
230  float getSlope() const { return _slope; }
231 
232  void setIntercept(float val) { _intercept = val; }
233 
234  float getIntercept() const { return _intercept; }
235 
236  double convert(dsm_time_t t, double val);
237 
238  void reset();
239 
240  void parseFields(CalFile* cf);
241 
242  std::string toString() const;
243 
244  void fromString(const std::string&)
245  throw(nidas::util::InvalidParameterException);
246 
247  void fromDOMElement(const xercesc::DOMElement*)
248  throw(nidas::util::InvalidParameterException);
249 
250 private:
251 
252  float _slope;
253 
254  float _intercept;
255 
256 };
257 
259 {
260 public:
261 
262  Polynomial();
263 
264  Polynomial* clone() const;
265 
266  void setCoefficients(const std::vector<float>& vals);
267 
268  void setCoefficients(const float* fp, unsigned int n);
269 
270  const std::vector<float>& getCoefficients() const { return _coefs; }
271 
272  const float* getCoefficients(unsigned int & n) const
273  {
274  n = _coefs.size();
275  return &_coefs[0];
276  }
277 
278  double convert(dsm_time_t t,double val);
279 
280  void reset();
281 
282  void parseFields(CalFile* cf);
283 
284  std::string toString() const;
285 
286  void fromString(const std::string&)
287  throw(nidas::util::InvalidParameterException);
288 
289  void fromDOMElement(const xercesc::DOMElement*)
290  throw(nidas::util::InvalidParameterException);
291 
297  static double eval(double x,float *p, unsigned int np);
298 
299 private:
300 
301  std::vector<float> _coefs;
302 };
303 
304 /* static */
305 inline double Polynomial::eval(double x,float *p, unsigned int np)
306 {
307  double y = 0.0;
308  if (np == 0) return y;
309  for (unsigned int i = np - 1; i > 0; i--) {
310  y += p[i];
311  y *= x;
312  }
313  y += p[0];
314  return y;
315 }
316 
317 
322 template <class F>
324 {
325 public:
327  {}
328 
329  virtual bool
331  {
332  return _handler(cf);
333  }
334 
336 };
337 
354 template <class F>
357 {
358  return new CalFileHandlerFunction<F>(_fo);
359 }
360 
361 
362 }} // namespace nidas namespace core
363 
364 #endif
CalFile * _calFile
Definition: VariableConverter.h:212
A class for reading ASCII files containing a time series of calibration data.
Definition: CalFile.h:164
virtual ~VariableConverter()
Definition: VariableConverter.cc:80
float getIntercept() const
Definition: VariableConverter.h:234
void fromDOMElement(const xercesc::DOMElement *)
Initialize myself from a xercesc::DOMElement.
Definition: VariableConverter.cc:212
virtual void reset()=0
Reset the converter to invalid or default settings, such as after an error occurs parsing a CalFile...
Definition: VariableConverter.h:258
void setIntercept(float val)
Definition: VariableConverter.h:232
float _slope
Definition: VariableConverter.h:252
const DSMSensor * getDSMSensor() const
Definition: VariableConverter.cc:112
std::string _units
Definition: VariableConverter.h:187
void setCalFileHandler(CalFileHandler *)
Set the instance of CalFileHandler which will be called and given first option to handle new CalFile ...
Definition: VariableConverter.cc:333
Wrapper class providing convienence methods to access the string attributes of a DOMElement.
Definition: XDOM.h:45
Linear()
Definition: VariableConverter.cc:339
virtual VariableConverter * clone() const =0
virtual void fromString(const std::string &)
Definition: VariableConverter.h:136
long long dsm_time_t
Posix time in microseconds, the number of non-leap microseconds since 1970 Jan 1 00:00 UTC...
Definition: Sample.h:61
std::map< std::string, Parameter * > _parameters
Map of parameters by name.
Definition: VariableConverter.h:192
const float * getCoefficients(unsigned int &n) const
Definition: VariableConverter.h:272
Class describing a sampled variable.
Definition: Variable.h:46
Class that should include all that is configurable about a DSM.
Definition: DSMConfig.h:55
void setSlope(float val)
Definition: VariableConverter.h:228
CalFileHandler * makeCalFileHandler(F _fo)
Helper function to deduce the function object type and return a new instance of the CalFileHandlerFun...
Definition: VariableConverter.h:356
Interface of an object that can be instantiated from a DOM element, via the fromDOMElement method...
Definition: DOMable.h:51
virtual void parseFields(CalFile *cf)=0
Parse the fields in the current CalFile record for the particular settings and coefficients needed by...
CalFile * getCalFile()
Definition: VariableConverter.h:175
void setVariable(const Variable *val)
Definition: VariableConverter.h:116
float _intercept
Definition: VariableConverter.h:254
VariableConverter & operator=(const VariableConverter &x)
Assignment.
Definition: VariableConverter.cc:91
virtual std::string toString() const =0
Generate a string description of this VariableConverter.
const std::list< const Parameter * > & getParameters() const
Get list of parameters.
Definition: VariableConverter.h:159
F _handler
Definition: VariableConverter.h:335
Linear * clone() const
Definition: VariableConverter.cc:344
Why isn&#39;t this a sublcass of Polynomial which sets MAX_NUM_COEFFS to 2?
Definition: VariableConverter.h:220
CalFileHandlerFunction(F &fo)
Definition: VariableConverter.h:326
void addParameter(Parameter *val)
Add a parameter to this VariableConverter.
Definition: VariableConverter.cc:135
const Variable * _variable
Definition: VariableConverter.h:200
float getSlope() const
Definition: VariableConverter.h:230
virtual bool handleCalFileRecord(nidas::core::CalFile *)=0
This is the interface for handling CalFile records as they are read by a VariableConverter.
Definition: VariableConverter.h:57
static VariableConverter * createVariableConverter(XDOMElement &child)
Definition: VariableConverter.cc:183
virtual double convert(dsm_time_t, double v)=0
void setUnits(const std::string &val)
Definition: VariableConverter.h:112
void parseFields(CalFile *cf)
Parse the fields in the current CalFile record for the particular settings and coefficients needed by...
Definition: VariableConverter.cc:359
const Variable * getVariable() const
Definition: VariableConverter.h:118
void setCalFile(CalFile *)
Definition: VariableConverter.cc:258
static VariableConverter * createFromString(const std::string &)
Definition: VariableConverter.cc:167
void fromString(const std::string &)
Definition: VariableConverter.cc:392
A template subclass which implements the CalFileHandler interface by calling a function object...
Definition: VariableConverter.h:323
void fromDOMElement(const xercesc::DOMElement *)
Initialize myself from a xercesc::DOMElement.
Definition: VariableConverter.cc:434
DSMSensor provides the basic support for reading, processing and distributing samples from a sensor a...
Definition: DSMSensor.h:87
Definition: Parameter.h:46
virtual void readCalFile(dsm_time_t)
Before a VariableConverter can be used for a conversion, the converter&#39;s CalFile, if it exists...
Definition: VariableConverter.cc:275
const Parameter * getParameter(const std::string &name) const
Fetch a parameter by name.
Definition: VariableConverter.cc:160
std::list< const Parameter * > _constParameters
List of const pointers to Parameters for providing via getParameters().
Definition: VariableConverter.h:198
VariableConverter()
Definition: VariableConverter.cc:50
const DSMConfig * getDSMConfig() const
Definition: VariableConverter.cc:125
virtual ~CalFileHandler()
Definition: VariableConverter.h:65
CalFileHandler()
Definition: VariableConverter.h:60
CalFileHandler * _handler
Definition: VariableConverter.h:214
void abortCalFile(const std::string &what)
Definition: VariableConverter.cc:266
double convert(dsm_time_t t, double val)
Definition: VariableConverter.cc:377
virtual const std::string & getUnits() const
Definition: VariableConverter.h:114
virtual bool handleCalFileRecord(nidas::core::CalFile *cf)
Definition: VariableConverter.h:330
Definition: VariableConverter.h:69
const std::vector< float > & getCoefficients() const
Definition: VariableConverter.h:270
static int char **FILE * fp
Definition: sing.cc:928
std::string toString() const
Generate a string description of this VariableConverter.
Definition: VariableConverter.cc:383
void reset()
Reset the converter to invalid or default settings, such as after an error occurs parsing a CalFile...
Definition: VariableConverter.cc:351
const CalFile * getCalFile() const
Definition: VariableConverter.h:180
Definition: InvalidParameterException.h:35