31#ifndef ENC_ODIM_STRUCT
32#define ENC_ODIM_STRUCT
40#include <drain/util/ReferenceMap.h>
41#include <drain/util/Rectangle.h>
42#include <drain/util/Time.h>
43#include <drain/util/ValueScaling.h>
87 typedef enum {NONE=0, SCALING=1, RANGE=2} ExplicitSetting;
95 int explicitSettings = NONE;
116 EncodingODIM(
char type,
const drain::Range<double> & range,
double scale=0.0,
double offset=NAN,
double nodata = NAN,
double undetect = NAN);
120 EncodingODIM(
const drain::image::Image & image) : scaling(ownScaling), scalingConst(image.getScaling()), explicitSettings(NONE) {
121 initFromImage(image);
126 initFromImage(image);
130 void copyEncoding(
const EncodingODIM & odim){
133 scaling.set(odim.scaling);
134 nodata = odim.nodata;
135 undetect = odim.undetect;
136 explicitSettings = odim.explicitSettings;
167 EncodingODIM & setScaling(
double gain,
double offset = NAN);
169 EncodingODIM & setScaling(
double gain,
double offset,
double undetect,
double nodata);
173 return ((scaling.
scale != 0.0) && (!
type.empty()) && (
type.at(0) !=
'*'));
181 return (odim1.
type == odim2.
type) &&
182 (odim1.scaling.
scale == odim2.scaling.
scale) &&
184 (odim1.undetect == odim2.undetect) &&
185 (odim1.nodata == odim2.nodata)
189 void setRange(
double min,
double max);
195 this->type = drain::Type::getTypeChar(
type);
196 scaling.set(1.0, 0.0);
197 undetect = drain::Type::call<drain::typeMin, double>(
type);
198 nodata = drain::Type::call<drain::typeMax, double>(
type);
209 const char typechar = drain::Type::getTypeChar(t);
210 if (this->type.empty())
211 this->type = typechar;
213 if (this->type.at(0) != typechar)
214 mout.
warn(
"different types: " , this->type ,
'/' , typechar );
217 scaling.set(1.0, 0.0);
220 if (typechar !=
'*'){
221 undetect = drain::Type::call<drain::typeMin, double>(t);
222 nodata = drain::Type::call<drain::typeMax, double>(t);
225 undetect = drain::Type::call<drain::typeMin, double>(this->type);
226 nodata = drain::Type::call<drain::typeMax, double>(this->type);
234 void setTypeDefaults(){
235 setTypeDefaults(this->type);
241 return (x != undetect) && (x != nodata);
355 const ODIMPathElemSeq & getAttributeGroups();
LogSourc e is the means for a function or any program segment to "connect" to a Log.
Definition Log.h:313
Logger & warn(const TT &... args)
Possible error, but execution can continue.
Definition Log.h:431
Definition ReferenceMap.h:207
void setValues(const std::string &entries, char assignmentSymbol='=', char separatorSymbol=0)
Sets values. If strictness==STRICTLY_CLOSED, throws exception if tries to assign a non-existing entry...
Definition SmartMap.h:311
Utilities related to std::type_info.
Definition Type.h:50
Linear scaling and physical range for image intensities.
Definition ValueScaling.h:64
double & scale
Multiplicative coefficient \i a in: y = ax + b.
Definition ValueScaling.h:68
double & offset
Additive coefficient \i b in: y = ax + b.
Definition ValueScaling.h:71
Class for multi-channel digital images. Supports dynamic typing with base types (char,...
Definition Image.h:193
Structure for data storage type, scaling and marker codes. Does not contain quantity.
Definition EncodingODIM.h:75
double operator()(double y) const
Functor (why inverse?)
Definition EncodingODIM.h:264
EncodingODIM(group_t initialize=ODIMPathElem::ALL_LEVELS)
Default constructor.
Definition EncodingODIM.h:99
static bool haveSimilarEncoding(const EncodingODIM &odim1, const EncodingODIM &odim2)
Checks if data encoding is similar (storage type, gain, offset, undetect and nodata are the same).
Definition EncodingODIM.h:180
double scaleInverse(double y) const
Converts a quantity to storage scale: x = (y-offset)/gain .
Definition EncodingODIM.h:252
void addShortKeys()
Creates a short alias (attrib) for each (group):(attrib). Example: "gain" => "what:gain".
Definition EncodingODIM.h:307
void setType(const std::type_info &type)
Complete with setTypeDefaults()
Definition EncodingODIM.h:194
static const ODIMPathElemSeq & attributeGroups
Copies contents of this to a h5 group.
Definition EncodingODIM.h:342
std::string type
This is non-standard (not in ODIM), but a practical means of handling storage type of datasets.
Definition EncodingODIM.h:162
double scaleForward(double x) const
Converts a quantity from storage scale: y = offset + gain*y .
Definition EncodingODIM.h:246
static void checkType(Hi5Tree &dst)
Traverses recursively subtrees and checks the types of PolarODIM variables.
Definition EncodingODIM.h:323
virtual void updateLenient(const EncodingODIM &odim)
Todo: keep the function, but move implementation to (future single-exec) register ?
Definition EncodingODIM.cpp:229
double getMin() const
Returns the minimum physical value that can be returned using current storage type,...
Definition EncodingODIM.cpp:394
void copyFrom(const drain::image::Image &data)
Copies image attributes and type . Experimental.
Definition EncodingODIM.cpp:269
bool isValue(double x) const
Returns true for a valid measurement value, false for undetect and nodata marker values.
Definition EncodingODIM.h:240
void clear()
Resets the values.
Definition EncodingODIM.cpp:183
void setTypeDefaults(const T &type, const std::string &values="")
Sets gain=1, offset=0, undetect=type_min, nodata=type_max. Note: sets type only if unset.
Definition EncodingODIM.h:204
double getMax() const
Returns the minimum physical value that can be returned using current storage type,...
Definition EncodingODIM.cpp:422
void grantShortKeys(drain::ReferenceMap &ref)
Creates a short alias (attrib) for each (group):(attrib). Example: "gain" => "what:gain".
Definition EncodingODIM.cpp:252
static const group_t ALL_LEVELS
Abbreviation for linking (referencing) attributes at different levels (tree depths).
Definition ODIMPath.h:121
unsigned int group_t
In H5, "groups" correspond to directories or folders in file system.
Definition ODIMPath.h:92
Definition DataSelector.cpp:44