nidas v1.2.3
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
37namespace nidas { namespace core {
38
39class DSMConfig;
40class DSMSensor;
41class CalFile;
42class Variable;
43
58{
59public:
62
64
65 virtual ~CalFileHandler() {}
66};
67
68
70{
71public:
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
139 virtual void fromString(const std::string&)
140 {
142 "fromString() not supported in this VariableConverter");
143 }
144
146
150 static VariableConverter* createFromString(const std::string&);
151
158 void addParameter(Parameter* val);
159
163 const std::list<const Parameter*>& getParameters() const
164 {
165 return _constParameters;
166 }
167
172 const Parameter* getParameter(const std::string& name) const;
173
177 void fromDOMElement(const xercesc::DOMElement*);
178
179 void setCalFile(CalFile*);
180
182 {
183 return _calFile;
184 }
185
186 const CalFile* getCalFile() const
187 {
188 return _calFile;
189 }
190
191private:
192
193 std::string _units;
194
198 std::map<std::string,Parameter*> _parameters;
199
204 std::list<const Parameter*> _constParameters;
205
207
208protected:
209
214 virtual void parseFields(CalFile* cf) = 0;
215
216 void abortCalFile(const std::string& what);
217
219
221};
222
227{
228public:
229
230 Linear();
231
232 Linear* clone() const;
233
234 void setSlope(float val) { _slope = val; }
235
236 float getSlope() const { return _slope; }
237
238 void setIntercept(float val) { _intercept = val; }
239
240 float getIntercept() const { return _intercept; }
241
242 double convert(dsm_time_t t, double val);
243
244 void reset();
245
246 void parseFields(CalFile* cf);
247
248 virtual std::string toString() const override;
249
253 void fromString(const std::string&);
254
258 void fromDOMElement(const xercesc::DOMElement*);
259
260private:
261
262 float _slope;
263
265
266};
267
269{
270public:
271
272 Polynomial();
273
274 Polynomial* clone() const;
275
276 void setCoefficients(const std::vector<float>& vals);
277
278 void setCoefficients(const float* fp, unsigned int n);
279
280 const std::vector<float>& getCoefficients() const { return _coefs; }
281
282 const float* getCoefficients(unsigned int & n) const
283 {
284 n = _coefs.size();
285 return &_coefs[0];
286 }
287
288 double convert(dsm_time_t t,double val);
289
290 void reset();
291
292 void parseFields(CalFile* cf);
293
294 virtual std::string toString() const override;
295
299 void fromString(const std::string&);
300
304 void fromDOMElement(const xercesc::DOMElement*);
305
311 static double eval(double x,float *p, unsigned int np);
312
313private:
314
315 std::vector<float> _coefs;
316};
317
318/* static */
319inline double Polynomial::eval(double x,float *p, unsigned int np)
320{
321 double y = 0.0;
322 if (np == 0) return y;
323 for (unsigned int i = np - 1; i > 0; i--) {
324 y += p[i];
325 y *= x;
326 }
327 y += p[0];
328 return y;
329}
330
331
336template <class F>
338{
339public:
341 {}
342
343 virtual bool
345 {
346 return _handler(cf);
347 }
348
350};
351
368template <class F>
371{
372 return new CalFileHandlerFunction<F>(_fo);
373}
374
375
376}} // namespace nidas namespace core
377
378#endif
A template subclass which implements the CalFileHandler interface by calling a function object.
Definition VariableConverter.h:338
F _handler
Definition VariableConverter.h:349
virtual bool handleCalFileRecord(nidas::core::CalFile *cf)
Definition VariableConverter.h:344
CalFileHandlerFunction(F &fo)
Definition VariableConverter.h:340
This is the interface for handling CalFile records as they are read by a VariableConverter.
Definition VariableConverter.h:58
CalFileHandler()
Definition VariableConverter.h:60
virtual ~CalFileHandler()
Definition VariableConverter.h:65
virtual bool handleCalFileRecord(nidas::core::CalFile *)=0
A class for reading ASCII files containing a time series of calibration data.
Definition CalFile.h:166
Interface of an object that can be instantiated from a DOM element, via the fromDOMElement method,...
Definition DOMable.h:51
Class that should include all that is configurable about a DSM.
Definition DSMConfig.h:55
DSMSensor provides the basic support for reading, processing and distributing samples from a sensor a...
Definition DSMSensor.h:88
Why isn't this a sublcass of Polynomial which sets MAX_NUM_COEFFS to 2?
Definition VariableConverter.h:227
void fromDOMElement(const xercesc::DOMElement *)
Definition VariableConverter.cc:431
float _slope
Definition VariableConverter.h:262
float getSlope() const
Definition VariableConverter.h:236
void setSlope(float val)
Definition VariableConverter.h:234
Linear * clone() const
Definition VariableConverter.cc:342
void setIntercept(float val)
Definition VariableConverter.h:238
void reset()
Reset the converter to invalid or default settings, such as after an error occurs parsing a CalFile.
Definition VariableConverter.cc:349
virtual std::string toString() const override
Generate a string description of this VariableConverter.
Definition VariableConverter.cc:381
float _intercept
Definition VariableConverter.h:264
float getIntercept() const
Definition VariableConverter.h:240
double convert(dsm_time_t t, double val)
Definition VariableConverter.cc:375
void parseFields(CalFile *cf)
Parse the fields in the current CalFile record for the particular settings and coefficients needed by...
Definition VariableConverter.cc:357
void fromString(const std::string &)
Definition VariableConverter.cc:390
Linear()
Definition VariableConverter.cc:337
Definition Parameter.h:47
Definition VariableConverter.h:269
Polynomial * clone() const
Definition VariableConverter.cc:469
const float * getCoefficients(unsigned int &n) const
Definition VariableConverter.h:282
std::vector< float > _coefs
Definition VariableConverter.h:315
void reset()
Reset the converter to invalid or default settings, such as after an error occurs parsing a CalFile.
Definition VariableConverter.cc:489
void fromDOMElement(const xercesc::DOMElement *)
Definition VariableConverter.cc:589
const std::vector< float > & getCoefficients() const
Definition VariableConverter.h:280
void fromString(const std::string &)
Definition VariableConverter.cc:552
Polynomial()
Definition VariableConverter.cc:462
static double eval(double x, float *p, unsigned int np)
This is static and defined inline below so the implementation can be shared with at least the one cla...
Definition VariableConverter.h:319
double convert(dsm_time_t t, double val)
Definition VariableConverter.cc:534
virtual std::string toString() const override
Generate a string description of this VariableConverter.
Definition VariableConverter.cc:541
void parseFields(CalFile *cf)
Parse the fields in the current CalFile record for the particular settings and coefficients needed by...
Definition VariableConverter.cc:500
void setCoefficients(const std::vector< float > &vals)
Definition VariableConverter.cc:474
Definition VariableConverter.h:70
void setCalFileHandler(CalFileHandler *)
Set the instance of CalFileHandler which will be called and given first option to handle new CalFile ...
Definition VariableConverter.cc:331
VariableConverter & operator=(const VariableConverter &x)
Assignment.
Definition VariableConverter.cc:91
const Parameter * getParameter(const std::string &name) const
Fetch a parameter by name.
Definition VariableConverter.cc:160
virtual ~VariableConverter()
Definition VariableConverter.cc:80
virtual void reset()=0
Reset the converter to invalid or default settings, such as after an error occurs parsing a CalFile.
virtual std::string toString() const =0
Generate a string description of this VariableConverter.
std::map< std::string, Parameter * > _parameters
Map of parameters by name.
Definition VariableConverter.h:198
virtual VariableConverter * clone() const =0
VariableConverter()
Definition VariableConverter.cc:50
void addParameter(Parameter *val)
Add a parameter to this VariableConverter.
Definition VariableConverter.cc:135
const DSMConfig * getDSMConfig() const
Definition VariableConverter.cc:125
CalFileHandler * _handler
Definition VariableConverter.h:220
virtual const std::string & getUnits() const
Definition VariableConverter.h:114
virtual double convert(dsm_time_t, double v)=0
static VariableConverter * createVariableConverter(XDOMElement &child)
Definition VariableConverter.cc:182
void setVariable(const Variable *val)
Definition VariableConverter.h:116
const CalFile * getCalFile() const
Definition VariableConverter.h:186
void setUnits(const std::string &val)
Definition VariableConverter.h:112
const std::list< const Parameter * > & getParameters() const
Get list of parameters.
Definition VariableConverter.h:163
std::list< const Parameter * > _constParameters
List of const pointers to Parameters for providing via getParameters().
Definition VariableConverter.h:204
virtual void readCalFile(dsm_time_t)
Before a VariableConverter can be used for a conversion, the converter's CalFile, if it exists,...
Definition VariableConverter.cc:273
static VariableConverter * createFromString(const std::string &)
Definition VariableConverter.cc:167
const DSMSensor * getDSMSensor() const
Definition VariableConverter.cc:112
void setCalFile(CalFile *)
Definition VariableConverter.cc:256
const Variable * getVariable() const
Definition VariableConverter.h:118
virtual void parseFields(CalFile *cf)=0
Parse the fields in the current CalFile record for the particular settings and coefficients needed by...
void abortCalFile(const std::string &what)
Definition VariableConverter.cc:264
std::string _units
Definition VariableConverter.h:193
const Variable * _variable
Definition VariableConverter.h:206
void fromDOMElement(const xercesc::DOMElement *)
Definition VariableConverter.cc:211
CalFile * getCalFile()
Definition VariableConverter.h:181
virtual void fromString(const std::string &)
Definition VariableConverter.h:139
CalFile * _calFile
Definition VariableConverter.h:218
Class describing a sampled variable.
Definition Variable.h:47
Wrapper class providing convienence methods to access the string attributes of a DOMElement.
Definition XDOM.h:45
Definition InvalidParameterException.h:35
CalFileHandler * makeCalFileHandler(F _fo)
Helper function to deduce the function object type and return a new instance of the CalFileHandlerFun...
Definition VariableConverter.h:370
Sample * getSample(sampleType type, unsigned int len)
A convienence method for getting a sample of an enumerated type from a pool.
Definition Sample.cc:70
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:62
Root namespace for the NCAR In-Situ Data Acquisition Software.
Definition A2DConverter.h:31
static int char **FILE * fp
Definition sing.cc:942