31#ifndef RADAR_ACCUMULATOR_H
32#define RADAR_ACCUMULATOR_H
38#include <drain/image/Accumulator.h>
39#include <drain/image/AccumulatorGeo.h>
42#include "data/ODIMPath.h"
44#include "data/DataSelector.h"
45#include "data/DataCoder.h"
46#include "data/QuantityMap.h"
84 typedef std::map<int,std::string> legend_t;
98 const std::string & getTargetEncoding(){
99 return targetEncoding;
108 std::string targetEncoding;
120template <
class AC,
class OD>
168 drain::image::Accumulator::FieldList fields;
169 drain::image::Accumulator::getFields(fieldStr, fields);
170 extract(dstProduct, fields, encoding, cropArea);
173 void extract(DataSet<DstType<OD> > & dstProduct,
const drain::image::Accumulator::FieldList & fields,
const std::string & encoding=
"C",
const drain::Rectangle<int> & cropArea={0,0});
193 void consumeTargetEncoding(std::string & encoding){
201 std::ostream & toStream(std::ostream & ostr)
const {
204 this->AC::toStream(ostr);
216 return RadarAccumulatorBase::checkCompositingMethod(this->getMethod(), dataODIM);
224template <
class AC,
class OD>
229 targetEncoding = encoding;
231 if (encoding.empty()){
248 odim.updateValues(encoding);
253 mout.warn(
"Quantity changed from [",
quantityPrev,
"] to [", odim.quantity,
"]");
256 mout.info(
"Confirming quantity [", odim.quantity,
"] explicitly");
261 mout.attention<
LOG_DEBUG>(
"Target encoding: [", encoding,
"] odim: ", odim);
266template <
class AC,
class OD>
274 mout.info(
"Quality data available with input; using quality as weights in compositing.");
280 mout.info(
"No quality data available with input, ok.");
290 odim.updateLenient(
srcData.odim);
293 counter += std::max(1L,
srcData.odim.ACCnum);
301template <
class AC,
class OD>
309 odim.updateLenient(
srcData.odim);
310 counter = std::max(1L,
srcData.odim.ACCnum);
351template <
class AC,
class OD>
360 if (ODIM::versionFlagger.isSet(ODIM::RACK_EXTENSIONS) && !legend.empty()){
361 mout.experimental(
"Copying (moving) legend for ",
field);
362 dstData.getWhat()[
"legend"] = drain::sprinter(legend,
"|",
",",
":").str();
371template <
class AC,
class OD>
386 mout.note(
"Cropping ",
cropArea.getWidth(),
"x",
cropArea.getHeight(),
" from original composite ", this->accArray.getGeometry());
387 mout.info(
"Cropping window: (",
cropArea.lowerLeft,
") (",
cropArea.upperRight,
") from original composite ",
this->accArray.getGeometry());
412 mout.debug(
"extracting field '",
field,
"' (",
static_cast<int>(
field),
")");
429 if (
field == field_t::DATA){
441 if (!encoding.empty()){
442 mout.accept(
"User-defined encoding for data [",
odimData.quantity,
"]: ", encoding);
444 odimData.completeEncoding(encoding);
446 else if (!getTargetEncoding().empty()){
447 mout.ok<
LOG_NOTICE>(
"Using initial/default encoding for data [",
odimData.quantity,
"]: ", getTargetEncoding());
449 odimData.completeEncoding(getTargetEncoding());
453 mout.error(
"unspecified quantity");
481 case field_t::WEIGHT_GLOBAL:
482 case field_t::WEIGHT:
485 case field_t::COUNT_GLOBAL:
489 case field_t::DEVIATION:
490 odimQuality.quantity = this->odim.quantity +
"DEV";
508 else if (!encoding.empty()){
525 mout.warn(
"quantyConf[" ,
odimQuality.quantity ,
"] not found, using float" );
575template <
class AC,
class OD>
584 typedef enum {DATA,QUALITY}
datatype;
600 for (
size_t i = 0; i <
fields.length(); ++i) {
617 mout.warn() <<
"non-standard layer code; use 'd' for 'data' instead" <<
mout.endl;
646 mout.warn(
"experimental: quality [QIND] type copied from data [" , odimOut.quantity ,
']' );
669 odimQuality.scaling.offset =
round(drain::Type::call<drain::typeMin, double>(t) + drain::Type::call<drain::typeMax, double>(t))/2.0;
671 mout.warn(
"quantyConf[" ,
odimQuality.quantity ,
"] not found, using somewhat arbitary scaling:" );
676 mout.error(
"Unsupported field code: '",
field,
"'");
683 mout.experimental(
"Applying cropping: bbox=", crop,
" [pix]");
689 else if (type == QUALITY){
699 mout.debug(
"searching dstData... DATA=", (type == DATA));
712 mout.unimplemented(
"crop ", crop,
", dstData.data resize + Accumulator::extractField ");
LogSourc e is the means for a function or any program segment to "connect" to a Log.
Definition Log.h:326
static const std::type_info & getTypeInfo(char t)
Returns the base type associated with a character key.
Definition Type.h:131
Function for accumulating data: maximum, average, weighted average etc.
Definition AccumulationMethods.h:66
Definition Accumulator.h:76
static bool isSpecific(FieldType field)
Future option to mark scaled/normalized etc.
Definition Accumulator.h:120
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.h:247
FieldType
Definition Accumulator.h:84
Class for multi-channel digital images. Supports dynamic typing with base types (char,...
Definition Image.h:183
Converts ODIM encoded data (with markers) to natural values and backwards.
Definition DataCoder.h:58
Tool for selecting datasets based on paths, quantities and min/max elevations.
Definition DataSelector.h:106
A map of radar data, indexed by quantity code (DBZH, VRAD, etc).
Definition Data.h:1293
Structure for data storage type, scaling and marker codes. Does not contain quantity.
Definition EncodingODIM.h:70
static const group_t QUALITY
Special group on first or second level, /quality + digit , used for storing quality data.
Definition ODIMPath.h:115
static const group_t DATA
Second level group, /data + digit .
Definition ODIMPath.h:109
ODIM metadata (quantity, gain, offset, undetect, nodata, date, time)
Definition ODIM.h:79
Essential class for storing radar data.
Definition Data.h:311
const plaindata_t & getQualityData(const std::string &quantity="QIND") const
Finds associated quality data - maybe empty and unscaled.
Definition Data.h:1137
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:210
Todo: consider non-template class:
Definition RadarAccumulator.h:63
size_t counter
Book-keeping for new data. Finally, in extraction phase, added to odim.ACCnum .
Definition RadarAccumulator.h:95
DataSelector dataSelector
Input data selector.
Definition RadarAccumulator.h:80
double defaultQuality
If source data has no quality field, this value is applied for (detected) data.
Definition RadarAccumulator.h:89
Data array for creating composites and accumulated polar products (Surface rain fall or cluttermaps)
Definition RadarAccumulator.h:122
OD odim
For storing the scaling and encoding of (1st) input or user-defined values. Also for bookkeeping of d...
Definition RadarAccumulator.h:185
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:267
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:576
RadarAccumulator()
Default constructor.
Definition RadarAccumulator.h:133
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:302
bool checkCompositingMethod(const ODIM &dataODIM)
Warns if data scaling involves risks in using WAVG (weighted averaging)
Definition RadarAccumulator.h:215
PlainData< SrcType< OD const > > pdata_src_t
Input data type.
Definition RadarAccumulator.h:127
pdata_dst_t & extract(DataSet< DstType< OD > > &dstProduct, field_t field=field_t::DATA, const std::string &encoding="C", const drain::Rectangle< int > &cropArea={0, 0})
Definition RadarAccumulator.h:372
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:225
Definition AltitudeOp.cpp:42
QuantityMap & getQuantityMap()
Definition QuantityMap.cpp:282
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