Loading...
Searching...
No Matches
DataCoder.h
1/*
2
3MIT License
4
5Copyright (c) 2017 FMI Open Development / Markus Peura, first.last@fmi.fi
6
7Permission is hereby granted, free of charge, to any person obtaining a copy
8of this software and associated documentation files (the "Software"), to deal
9in the Software without restriction, including without limitation the rights
10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11copies of the Software, and to permit persons to whom the Software is
12furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in all
15copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23SOFTWARE.
24
25*/
26/*
27Part of Rack development has been done in the BALTRAD projects part-financed
28by the European Union (European Regional Development Fund and European
29Neighbourhood Partnership Instrument, Baltic Sea Region Programme 2007-2013)
30*/
31#ifndef RACK_DataCoder
32#define RACK_DataCoder
33
34
35//
36//#include <drain/util/Rectangle.h>
37#include <drain/image/AccumulationConverter.h>
38#include "hi5/Hi5.h"
39#include "data/ODIM.h"
40#include "QuantityMap.h"
41//#include "Coordinates.h"
42
43
44namespace rack {
45
46using namespace drain::image;
47
48
49
50
52
59
60public:
61
62 DataCoder() : BeanLike(__FUNCTION__), defaultQuality(0.5),
63 dataODIM(defaultDataODIM), qualityODIM(defaultQualityODIM) {
64 init();
65 };
66
68 DataCoder(const ODIM & dataODIM) : BeanLike(__FUNCTION__), defaultQuality(0.5),
69 dataODIM(dataODIM), qualityODIM(defaultQualityODIM) {
70 init();
71 const QuantityMap & qm = getQuantityMap();
72 qm.setQuantityDefaults(defaultQualityODIM, "QIND", "C");
73 };
74
75 DataCoder(const ODIM & dataODIM, const ODIM & qualityODIM) : BeanLike(__FUNCTION__), defaultQuality(0.5),
76 dataODIM(dataODIM), qualityODIM(qualityODIM) {
77 init();
78 };
79
80 DataCoder(const DataCoder & converter) : BeanLike(__FUNCTION__), defaultQuality(converter.defaultQuality),
81 dataODIM(defaultDataODIM), qualityODIM(defaultQualityODIM) {
82 defaultDataODIM = converter.dataODIM;
83 defaultQualityODIM = converter.qualityODIM;
84 init();
85 };
86
87 virtual
88 ~DataCoder(){};
89
90
91 virtual
92 bool isDataEncodingSet() const override {
93 return dataODIM.isSet();
94 }
95
96 virtual
97 bool isQualityEncodingSet() const override {
98 return qualityODIM.isSet();
99 }
100
101
102 virtual
103 double getNoReadingMarker() const override {
104 return dataODIM.undetect;
105 }
106
108 virtual inline
109 double getNoDataMarker() const override {
110 return dataODIM.nodata;
111 }
112
114 virtual inline
115 double getWeightNoDataMarker() const override {
116 return qualityODIM.nodata;
117 }
118
119
120 virtual
121 bool decode(double & value) const override;
122
124 virtual
125 bool decode(double & value, double & weight) const override;
126
128
131 virtual
132 void encode(double & value, double & weight) const override;
133
134 virtual
135 void encodeWeight(double & weight) const override;
136
137 virtual
138 void encodeDiff(double & diff) const override;
139 /*
140 virtual inline
141 void encodeDiff(double & diff) const {
142 diff = qualityODIM.scaleInverse(diff);
143 };
144 */
145
147
153 void init();
154
155 /*
156 inline
157 double setLimits(){
158 dataODIM
159 }
160 double minValue;
161 double maxValue;
162 */
163
166
168
174
175 bool SKIP_UNDETECT;
176
178 static double undetectQualityCoeff;
179
180 const ODIM & dataODIM;
181 const ODIM & qualityODIM;
182
183 ODIM defaultDataODIM;
184 ODIM defaultQualityODIM;
185
186 /*
187 virtual inline
188 void toOStream(std::ostream & ostr) const {
189 ostr << getName() << ':' << parameters.toStr() << '\n';
190 //ostr << "DataConverter defaultQuality=" << defaultQuality << ", minDetectableValue=" << undetectValue << ", undetectQualityCoeff=" << undetectQualityCoeff << ", \n";
191 ostr << "\t data: " << EncodingODIM(dataODIM) << '\n';
192 ostr << "\t q: " << EncodingODIM(qualityODIM) << '\n';
193 //return ostr;
194 }
195 */
196
197
198protected:
199
202
203
205
209
210};
211
212
213inline
214std::ostream & operator<<(std::ostream & ostr, const DataCoder & coder) {
215 ostr << coder.getName() << ':' << coder.getParameters() << '\n';
216 //ostr << "DataConverter defaultQuality=" << defaultQuality << ", minDetectableValue=" << undetectValue << ", undetectQualityCoeff=" << undetectQualityCoeff << ", \n";
217 ostr << "\t data: " << EncodingODIM(coder.dataODIM) << '\n';
218 ostr << "\t q: " << EncodingODIM(coder.qualityODIM) << '\n';
219 return ostr;
220}
221
222
223} // rack::
224
225#endif
226
227// Rack
Something which has a name, a description and possibly some parameters of varying type.
Definition BeanLike.h:58
virtual const std::string & getName() const
Return the name of an instance.
Definition BeanLike.h:80
Converts ODIM encoded data (with markers) to natural values and backwards.
Definition DataCoder.h:58
void init()
Creates a naive quality field: data=1.0, undetect/nodata=0.0.
Definition DataCoder.cpp:48
static double undetectQualityCoeff
Quality, relative to data quality, applied in locations marked with undetect .
Definition DataCoder.h:178
DataCoder(const ODIM &dataODIM)
Without quality (with impicit quality)
Definition DataCoder.h:68
virtual bool decode(double &value) const override
Converts storage data containing marker codes etc to natural scale.
Definition DataCoder.cpp:93
virtual void encode(double &value, double &weight) const override
Converts natural-scale data to storage data containing marker codes etc.
Definition DataCoder.cpp:134
double undetectValue
Physical value applied in locations marked with undetect . This should be compatible with the quantit...
Definition DataCoder.h:173
virtual double getNoDataMarker() const override
NEW, untested...
Definition DataCoder.h:109
virtual void encodeWeight(double &weight) const override
Converts natural-scale data to storage data, applying marker codes if needed.
Definition DataCoder.cpp:151
double minCodeValue
In extraction (encoding), values lower than this value will be marked undetect .
Definition DataCoder.h:201
virtual void encodeDiff(double &diff) const override
When using unsigned types, encoding typically requires adding a positive bias and scaling the data.
Definition DataCoder.cpp:156
double detectionThreshold
A physical value greater than undetectValue. In \i encoding, lower values will be marked undetect ....
Definition DataCoder.h:208
virtual double getWeightNoDataMarker() const override
NEW, untested...
Definition DataCoder.h:115
virtual double getNoReadingMarker() const override
Returns a marker value which indicates that although data has been measured, it is not within require...
Definition DataCoder.h:103
double defaultQuality
If source data has no quality field, this value is applied for (detected) data.
Definition DataCoder.h:165
Structure for data storage type, scaling and marker codes. Does not contain quantity.
Definition EncodingODIM.h:70
ODIM metadata (quantity, gain, offset, undetect, nodata, date, time)
Definition ODIM.h:79
Registry for regular quantities appearing in weather radar.
Definition QuantityMap.h:67
bool setQuantityDefaults(EncodingODIM &dst, const std::string &quantity, const std::string &values="") const
Sets default values of given quantity without assigning the quantity. Optionally overrides with user ...
Definition QuantityMap.cpp:207
Namespace for images and image processing tools.
Definition AccumulationArray.cpp:45
Definition DataSelector.cpp:44
QuantityMap & getQuantityMap()
Definition QuantityMap.cpp:279
Converts raw data to values appropriate for accumulation.
Definition AccumulationConverter.h:50