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;
98 parameters.link(
"width", this->conf.widthM = widthM,
"metres");
99 parameters.link(
"height", this->conf.heightD = heightD,
"deg");
101 parameters.link(
"threshold", this->conf.contributionThreshold = 0.5,
"percentage");
102 parameters.link(
"compensate", this->conf.invertPolar =
false,
"cart/polar[0|1]");
106 dataSelector.setMaxCount(1);
118 double getTypicalMin(
const PolarODIM & srcODIM)
const = 0;
121 double getTypicalMax(
const PolarODIM & srcODIM)
const = 0;
139 dst.odim.quantity = odim.quantity;
142 typeRef.link(
"type", dst.odim.type = odim.type);
143 typeRef.updateValues(targetEncoding);
144 dst.data.setType(dst.odim.type);
146 if (odim.scaling.scale != 0.0){
149 applyODIM(dst.odim, odim);
153 if (drain::Type::call<drain::typeIsSmallInt>(dst.data.getType())){
154 dst.setPhysicalRange(getTypicalMin(inputODIM), getTypicalMax(inputODIM));
156 mout.debug(
"small int: " , EncodingODIM(dst.odim) );
157 mout.debug2(
"small int: " , dst.data );
161 if (drain::Type::call<drain::typeIsInteger>(dst.data.getType()))
162 mout.warn(
"large int" );
164 dst.odim.distinguishNodata();
168 dst.odim.completeEncoding( targetEncoding);
170 dst.data.setScaling(dst.odim.scaling);
172 mout.debug(
"final dst: " , dst.data );
177void DopplerWindowOp<W>::processDataSet(
const DataSet<PolarSrc> & srcSweep, DataSet<PolarDst> & dstProduct)
const {
183 const Data<PolarSrc> & vradSrc = srcSweep.getData(dataSelector.getQuantitySelector());
185 if (vradSrc.data.isEmpty()){
186 mout.warn(
"VRAD missing" );
190 if (vradSrc.odim.getNyquist() == 0) {
191 mout.warn(
"VRAD unusable, vradSrc.odim.getNyquist() == 0" );
195 Data<PolarDst> & dstData = dstProduct.getData(odim.quantity);
197 dstData.odim.updateLenient(vradSrc.odim);
199 initDst(vradSrc.odim, dstData);
201 dstData.data.fill(dstData.odim.undetect);
203 processData(vradSrc, dstData);
244void DopplerWindowOp<W>::processData(
const Data<PolarSrc> & vradSrc, Data<PolarDst> & dstData)
const {
251 typename W::conf_t pixelConf;
252 this->conf.setPixelConf(pixelConf, vradSrc.odim);
257 mout.special(
"provided functor: " , op.conf.getFunctorName() ,
'|' , op.conf.functorParameters );
258 mout.debug(
"pixelConf.contributionThreshold " , pixelConf.contributionThreshold );
259 mout.debug(
"op.conf.contributionThreshold " , op.conf.contributionThreshold );
263 op.traverseChannel(vradSrc.data, dstData.data);
265 dstData.odim.prodpar = this->parameters.getValues();
311 parameters.link(
"relativeScale", this->conf.relativeScale =
false,
"false|true");
312 odim.quantity =
"VRAD";
318 void processData(
const Data<PolarSrc> & vradSrc, Data<PolarDst> & dstData)
const {
322 DopplerAverageWindow2::conf_t pixelConf(deviationQuality);
324 this->conf.setPixelConf(pixelConf, vradSrc.odim);
326 mout.debug(
"radarConf: " , this->conf.widthM ,
'x' , this->conf.heightD );
327 mout.debug(
"pixelConf: " , pixelConf.frame.width ,
'x' , this->conf.frame.height );
332 mout.special(
"provided functor: " , op.conf.getFunctorName() ,
'|' , op.conf.functorParameters );
339 PlainData<PolarDst> & dstQuality = dstData.getQualityData(
"QIND");
341 dstQuality.setGeometry(g.getWidth(), g.getHeight());
343 op.traverseChannel(vradSrc.data, dummy, dstData.data, dstQuality.data);
351 double getTypicalMin(
const PolarODIM & srcODIM)
const {
352 return (this->conf.relativeScale) ? -1.0 : -srcODIM.getNyquist();
356 double getTypicalMax(
const PolarODIM & srcODIM)
const {
357 return (this->conf.relativeScale) ? +1.0 : +srcODIM.getNyquist();
376 odim.quantity =
"VRAD_DEV";
377 odim.scaling.scale = 1.0/200.0;
378 odim.scaling.offset = -
odim.scaling.scale;
389 double getTypicalMin(
const PolarODIM & srcODIM)
const {
394 double getTypicalMax(
const PolarODIM & srcODIM)
const {
const std::string description
Brief, human-readable description of this bean.
Definition BeanLike.h:309
map_t parameters
Parameters (name -> linked variable), typically linked to member variables of the derived class.
Definition BeanLike.h:313
const std::string name
Name of this bean, typically also the name of the (derived) class.
Definition BeanLike.h:306
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:326
Definition ReferenceMap.h:215
virtual void clear()
Removes all the elements of the map.
Definition ReferenceMap.h:387
void getValues(std::ostream &ostr) const
Dumps the values.
Definition SmartMap.h:341
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:1293
Smoothens Doppler field, providing quality computed as eccentricity.
Definition Doppler.h:229
Simple op not producing quality field.
Definition DopplerWindowOp.h:302
DopplerAvgOp(int width=1500, double height=3.0)
Definition DopplerWindowOp.h:309
Definition DopplerWindowOp.h:364
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
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
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:210
MD odim
The default data parameters for encoding output (the product).
Definition RadarProductOp.h:101
Definition AltitudeOp.cpp:42
QuantityMap & getQuantityMap()
Definition QuantityMap.cpp:282