31#ifndef RADAR_ACCUMULATOR_H
32#define RADAR_ACCUMULATOR_H
38#include <drain/image/Sampler.h>
40#include <drain/image/AccumulatorGeo.h>
41#include <product/RadarProductOp.h>
43#include "data/ODIMPath.h"
45#include "data/DataSelector.h"
46#include "data/DataCoder.h"
47#include "data/QuantityMap.h"
60template <
class AC,
class OD>
126 targetEncoding = encoding;
127 if (
odim.quantity.empty()){
130 m.link(
"what:quantity",
odim.quantity);
138 void consumeTargetEncoding(std::string & encoding){
139 if (!encoding.empty()){
140 targetEncoding = encoding;
141 if (
odim.quantity.empty()){
144 m.link(
"what:quantity",
odim.quantity);
154 const std::string & getTargetEncoding(){
155 return targetEncoding;
159 std::ostream & toStream(std::ostream & ostr)
const {
162 this->AC::toStream(ostr);
176 std::string targetEncoding;
181template <
class AC,
class OD>
188 if (!srcQuality.data.isEmpty()){
189 mout.info(
"Quality data available with input; using quality as weights in compositing.");
190 DataCoder converter(srcData.odim, srcQuality.odim);
192 AC::addData(srcData.data, srcQuality.data, converter, weight, i0, j0);
195 mout.info(
"No quality data available with input, ok.");
199 DataCoder converter(srcData.odim, qualityOdim);
201 AC::addData(srcData.data, converter, weight, i0, j0);
205 odim.updateLenient(srcData.odim);
208 counter += std::max(1L, srcData.odim.ACCnum);
216template <
class AC,
class OD>
221 DataCoder converter(srcData.odim, srcQuality.odim);
222 AC::addData(srcData.data, srcQuality.data, srcCount.data, converter);
224 odim.updateLenient(srcData.odim);
225 counter = std::max(1L, srcData.odim.ACCnum);
230template <
class AC,
class OD>
241 const double p = wavgParams.
get(
"p", 1.0);
242 const double p2 = p/2.0;
243 mout.info(rule ,
", min=", dataODIM.
getMin() );
245 if ((p2 - floor(p2)) == 0.0){
246 mout.info(
"WAVG with p=" , p ,
" = 2N, positive pow() results" );
249 const double bias = wavgParams.
get(
"bias", 0.0);
251 mout.
warn(
"WAVG with p=" , p ,
" = 2N, undetectValue=" , q.
undetectValue ,
" < bias=", bias );
267template <
class AC,
class OD>
276 typedef enum {DATA,QUALITY} datatype;
280 odimData.scaling.scale = 0.0;
289 bool DATA_SPECIFIC_QUALITY =
false;
292 for (
size_t i = 0; i < fields.length(); ++i) {
299 datatype type = DATA;
300 char field = fields.at(i);
303 DATA_SPECIFIC_QUALITY =
true;
309 mout.
warn() <<
"non-standard layer code; use 'd' for 'data' instead" << mout.endl;
338 mout.
warn(
"experimental: quality [QIND] type copied from data [" , odimOut.quantity ,
']' );
349 odimQuality = odimOut;
353 mout.
accept<LOG_NOTICE>(
"found quantyConf[", odimQuality.
quantity,
"], type=", odimQuality.
type);
356 mout.
special(
"Quality: ", odimQuality);
359 odimQuality.scaling.
scale *= 20.0;
361 odimQuality.scaling.
offset = round(drain::Type::call<drain::typeMin, double>(t) + drain::Type::call<drain::typeMax, double>(t))/2.0;
363 mout.
warn(
"quantyConf[" , odimQuality.
quantity ,
"] not found, using somewhat arbitary scaling:" );
368 mout.
error(
"Unsupported field code: '", field,
"'");
372 mout.
debug(
"extracting field ", field);
375 mout.experimental(
"Applying cropping: bbox=", crop,
" [pix]");
381 else if (type == QUALITY){
385 if (odimData.quantity.empty()){
386 odimData.quantity =
"UNKNOWN";
387 mout.
note(
"quantity=", odimData.quantity);
391 mout.
debug(
"searching dstData... DATA=", (type == DATA));
398 DataCoder dataCoder(odimData, odimQuality);
399 mout.
debug(
"dataCoder: ", dataCoder);
400 mout.
debug2(
"dataCoder: data: ", dataCoder.dataODIM);
401 mout.
debug2(
"dataCoder: qind: ", dataCoder.qualityODIM);
404 mout.
unimplemented(
"crop ", crop,
", dstData.data resize + Accumulator::extractField ");
408 mout.
debug(
"DATA/" , field,
" [", odimData.quantity,
']');
410 pdata_dst_t & dstData = dstProduct.getData(odimData.quantity);
411 dstData.odim.importMap(odimData);
412 dstData.data.setType(odimData.type);
413 mout.debug3(
"dstData: " , dstData );
418 mout.
debug(
"QUALITY/" , field ,
" [", odimQuality.
quantity,
']');
421 q_data_t & qualityOwner = (DATA_SPECIFIC_QUALITY) ? (q_data_t &) dstProduct.getData(odimData.quantity) : (q_data_t &) dstProduct;
423 dstData.odim.updateFromMap(odimQuality);
424 mout.debug3(
"dstData: " , dstData );
virtual const std::string & getName() const
Return the name of an instance.
Definition BeanLike.h:82
LogSourc e is the means for a function or any program segment to "connect" to a Log.
Definition Log.h:312
Logger & warn(const TT &... args)
Possible error, but execution can continue.
Definition Log.h:430
Logger & debug(const TT &... args)
Debug information.
Definition Log.h:666
Logger & note(const TT &... args)
For top-level information.
Definition Log.h:489
Logger & special(const TT &... args)
Other useful information.
Definition Log.h:531
Logger & error(const TT &... args)
Echoes.
Definition Log.h:416
Logger & accept(const TT &... args)
Some input has been accepted, for example by a syntax.
Definition Log.h:582
Logger & unimplemented(const TT &... args)
Feature to be done. Special type of Logger::note().
Definition Log.h:511
Logger & debug2(const TT &... args)
Debug information.
Definition Log.h:676
Definition ReferenceMap.h:207
void updateValues(const std::string &entries, char assignmentSymbol='=', char separatorSymbol=0)
Sets applicable values ie. modifies existing entries only. In ordered maps, skips extra entries silen...
Definition SmartMap.h:326
std::string get(const std::string &key, const std::string &defaultValue) const
Retrieves a value, or default value if value is unset.
Definition SmartMap.h:127
static const std::type_info & getTypeInfo(char t)
Returns the base type associated with a character key.
Definition Type.h:134
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
Function for accumulating data: maximum, average, weighted average etc.
Definition AccumulationMethods.h:65
void extractField(char field, const AccumulationConverter &converter, Image &dst, const drain::Rectangle< int > &crop) const
Extracts the accumulated quantity or secondary quantities like weight and standard deviation.
Definition Accumulator.cpp:209
Converts ODIM encoded data (with markers) to natural values and backwards.
Definition DataCoder.h:61
Tool for selecting datasets based on paths, quantities and min/max elevations.
Definition DataSelector.h:112
A map of radar data, indexed by quantity code (DBZH, VRAD, etc).
Definition Data.h:1215
Structure for data storage type, scaling and marker codes. Does not contain quantity.
Definition EncodingODIM.h:75
void addShortKeys()
Creates a short alias (attrib) for each (group):(attrib). Example: "gain" => "what:gain".
Definition EncodingODIM.h:290
std::string type
This is non-standard (not in ODIM), but a practical means of handling storage type of datasets.
Definition EncodingODIM.h:152
double getMin() const
Returns the minimum physical value that can be returned using current storage type,...
Definition EncodingODIM.cpp:394
ODIM metadata (quantity, gain, offset, undetect, nodata, date, time)
Definition ODIM.h:79
std::string quantity
dataX/what (obligatory)
Definition ODIM.h:181
Essential class for storing radar data.
Definition Data.h:300
Base class providing quality support for Dataand DataSet
Definition Data.h:1034
Definition QuantityMap.h:50
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
bool hasQuantity(const std::string &key) const
Checks if an exact match or a variant, is found.
Definition QuantityMap.h:102
Structure for defining quantity.
Definition Quantity.h:55
double undetectValue
A physical value corresponding a very small (unmeasurable) value has been defined.
Definition Quantity.h:84
bool hasUndetectValue() const
True, if a value corresponding a very small (unmeasurable) value has been defined.
Definition Quantity.h:174
Data array for creating composites and accumulated polar products (Surface rain fall or cluttermaps)
Definition RadarAccumulator.h:61
OD odim
For storing the scaling and encoding of (1st) input or user-defined values. Also for bookkeeping of d...
Definition RadarAccumulator.h:111
void addData(const pdata_src_t &srcData, const pdata_src_t &srcQuality, double weight, int i0, int j0)
Adds data that is in the same coordinate system as the accumulator. Weighted with quality.
Definition RadarAccumulator.h:182
size_t counter
Book-keeping for new data. Finally, in extraction phase, added to odim.ACCnum .
Definition RadarAccumulator.h:120
DataSelector dataSelector
Input data selector.
Definition RadarAccumulator.h:102
void extractOLD(const OD &odimOut, DataSet< DstType< OD > > &dstProduct, const std::string &fields, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const
Definition RadarAccumulator.h:268
RadarAccumulator()
Default constructor.
Definition RadarAccumulator.h:70
void addData(const pdata_src_t &srcData, const pdata_src_t &srcQuality, const pdata_src_t &srcCount)
Adds data that is in the same coordinate system as the accumulator.
Definition RadarAccumulator.h:217
PlainData< SrcType< OD const > > pdata_src_t
Input data type.
Definition RadarAccumulator.h:66
bool checkCompositingMethod(const ODIM &srcODIM) const
Warns if data scaling involves risks in using WAVG (weighted averaging)
Definition RadarAccumulator.h:231
void setTargetEncoding(const std::string &encoding)
Not critical. If set, needed to warn if input data does not match the expected / potential targetEnco...
Definition RadarAccumulator.h:125
double defaultQuality
If source data has no quality field, this value is applied for (detected) data.
Definition RadarAccumulator.h:114
Definition DataSelector.cpp:44
QuantityMap & getQuantityMap()
Definition QuantityMap.cpp:279
Rectange defined through lower left and upper right coordinates.
Definition Rectangle.h:65
bool empty() const
Return true if the area is zero.
Definition Rectangle.h:111
Writable data type.
Definition Data.h:120