33#ifndef DOPPLER_WIN_OP_H_
34#define DOPPLER_WIN_OP_H_
39#include <drain/Type.h>
40#include <drain/TypeUtils.h>
42#include "data/DataSelector.h"
43#include "data/PolarODIM.h"
44#include "data/QuantityMap.h"
49#include <drain/image/Geometry.h>
50#include <drain/image/Image.h>
51#include <drain/image/Window.h>
52#include <drain/imageops/SlidingWindowOp.h>
53#include "radar/Doppler.h"
54#include <drain/util/Fuzzy.h>
74 typename W::conf_t conf;
96 DopplerWindowOp(
const std::string & name,
const std::string & description,
int widthM,
double heightD) :
99 parameters.link(
"width", this->conf.widthM = widthM,
"metres");
100 parameters.link(
"height", this->conf.heightD = heightD,
"deg");
102 parameters.link(
"threshold", this->conf.contributionThreshold = 0.5,
"percentage");
103 parameters.link(
"compensate", this->conf.invertPolar =
false,
"cart/polar[0|1]");
107 dataSelector.setMaxCount(1);
119 double getTypicalMin(
const PolarODIM & srcODIM)
const = 0;
122 double getTypicalMax(
const PolarODIM & srcODIM)
const = 0;
136void DopplerWindowOp<W>::setEncoding(
const ODIM & inputODIM, PlainData<PolarDst> & dst)
const {
140 dst.odim.quantity = odim.quantity;
143 typeRef.link(
"type", dst.odim.type = odim.type);
145 dst.data.setType(dst.odim.type);
147 if (odim.scaling.scale != 0.0){
148 mout.warn(
"Init with ODIM: " , EncodingODIM(odim) );
150 applyODIM(dst.odim, odim);
154 if (drain::Type::call<drain::typeIsSmallInt>(dst.data.getType())){
155 dst.setPhysicalRange(getTypicalMin(inputODIM), getTypicalMax(inputODIM));
157 mout.debug(
"small int: " , EncodingODIM(dst.odim) );
158 mout.debug2(
"small int: " , dst.data );
162 if (drain::Type::call<drain::typeIsInteger>(dst.data.getType()))
163 mout.warn(
"large int" );
165 dst.odim.distinguishNodata();
169 dst.odim.completeEncoding( targetEncoding);
171 dst.data.setScaling(dst.odim.scaling);
173 mout.debug(
"final dst: " , dst.data );
178void DopplerWindowOp<W>::processDataSet(
const DataSet<PolarSrc> & srcSweep, DataSet<PolarDst> & dstProduct)
const {
184 const Data<PolarSrc> & vradSrc = srcSweep.getData(dataSelector.getQuantitySelector());
186 if (vradSrc.data.isEmpty()){
187 mout.warn(
"VRAD missing" );
191 if (vradSrc.odim.getNyquist() == 0) {
192 mout.warn(
"VRAD unusable, vradSrc.odim.getNyquist() == 0" );
196 Data<PolarDst> & dstData = dstProduct.getData(odim.quantity);
198 dstData.odim.updateLenient(vradSrc.odim);
200 initDst(vradSrc.odim, dstData);
202 dstData.data.fill(dstData.odim.undetect);
204 processData(vradSrc, dstData);
245void DopplerWindowOp<W>::processData(
const Data<PolarSrc> & vradSrc, Data<PolarDst> & dstData)
const {
252 typename W::conf_t pixelConf;
253 this->conf.setPixelConf(pixelConf, vradSrc.odim);
258 mout.special(
"provided functor: " , op.conf.getFunctorName() ,
'|' , op.conf.functorParameters );
259 mout.debug(
"pixelConf.contributionThreshold " , pixelConf.contributionThreshold );
260 mout.debug(
"op.conf.contributionThreshold " , op.conf.contributionThreshold );
264 op.traverseChannel(vradSrc.data, dstData.data);
266 dstData.odim.prodpar = this->parameters.getValues();
312 parameters.link(
"relativeScale", this->conf.relativeScale =
false,
"false|true");
313 odim.quantity =
"VRAD";
319 void processData(
const Data<PolarSrc> & vradSrc, Data<PolarDst> & dstData)
const {
323 DopplerAverageWindow2::conf_t pixelConf(deviationQuality);
325 this->conf.setPixelConf(pixelConf, vradSrc.odim);
327 mout.debug(
"radarConf: " , this->conf.widthM ,
'x' , this->conf.heightD );
328 mout.debug(
"pixelConf: " , pixelConf.frame.width ,
'x' , this->conf.frame.height );
333 mout.special(
"provided functor: " , op.conf.getFunctorName() ,
'|' , op.conf.functorParameters );
340 PlainData<PolarDst> & dstQuality = dstData.getQualityData(
"QIND");
342 dstQuality.setGeometry(g.getWidth(), g.getHeight());
344 op.traverseChannel(vradSrc.data, dummy, dstData.data, dstQuality.data);
346 dstData.odim.prodpar = this->parameters.
getValues();
352 double getTypicalMin(
const PolarODIM & srcODIM)
const {
353 return (this->conf.relativeScale) ? -1.0 : -srcODIM.getNyquist();
357 double getTypicalMax(
const PolarODIM & srcODIM)
const {
358 return (this->conf.relativeScale) ? +1.0 : +srcODIM.getNyquist();
378 odim.quantity =
"VRAD_DEV";
379 odim.scaling.scale = 1.0/200.0;
380 odim.scaling.offset = -
odim.scaling.scale;
391 double getTypicalMin(
const PolarODIM & srcODIM)
const {
396 double getTypicalMax(
const PolarODIM & srcODIM)
const {
A smooth symmetric peak function that resembles the Gaussian bell curve. Diminishes quicker than Fuzz...
Definition Fuzzy.h:495
LogSourc e is the means for a function or any program segment to "connect" to a Log.
Definition Log.h:313
Definition ReferenceMap.h:215
virtual void clear()
Removes all the elements of the map.
Definition ReferenceMap.h:390
void getValues(std::ostream &ostr) const
Dumps the values.
Definition SmartMap.h:341
void updateValues(const std::string &entries, char assignmentChar='=', char separatorChar=0)
Sets applicable values ie. modifies existing entries only. In ordered maps, skips extra entries silen...
Definition SmartMap.h:314
Definition Geometry.h:143
Class for multi-channel digital images. Supports dynamic typing with base types (char,...
Definition Image.h:183
Template for operators applying pipeline-like sliding window.
Definition SlidingWindowOp.h:57
A map of radar data, indexed by quantity code (DBZH, VRAD, etc).
Definition Data.h:1275
Data structure consisting of plain data and an optional quality data.
Definition Data.h:1206
Smoothens Doppler field, providing quality computed as eccentricity.
Definition Doppler.h:229
Simple op not producing quality field.
Definition DopplerWindowOp.h:303
DopplerAvgOp(int width=1500, double height=3.0)
Definition DopplerWindowOp.h:310
Definition DopplerWindowOp.h:365
DopplerEccentricityOp(int widthM=1500, double heightD=3.0)
Definition DopplerWindowOp.h:372
Computes eccentrity of Doppler speeds mapped on a Nyquist-normalized unit window.
Definition Doppler.h:314
Base class for computing products using Doppler speed [VRAD] data.
Definition DopplerOp.h:49
Base class for Doppler average and variance.
Definition DopplerWindowOp.h:69
DopplerWindowOp(const std::string &name, const std::string &description, int widthM, double heightD)
Definition DopplerWindowOp.h:96
ODIM metadata (quantity, gain, offset, undetect, nodata, date, time)
Definition ODIM.h:79
Essential class for storing radar data.
Definition Data.h:311
Metadata structure for single-radar data (polar scans, volumes and products).
Definition PolarODIM.h:45
drain::ReferenceMap allowedEncoding
Defines which encoding parameters can be changed by the user from command line.
Definition ProductBase.h:206
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
MD odim
The default data parameters for encoding output (the product).
Definition RadarProductOp.h:101
Definition DataSelector.cpp:44
QuantityMap & getQuantityMap()
Definition QuantityMap.cpp:279