OpendTect  6.3
array2dfilter.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*@+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: Bert Bril
8  Date: Nov 2006
9 ________________________________________________________________________
10 
11 
12 @$*/
13 
14 #include "arrayndimpl.h"
15 #include "statruncalc.h"
16 #include "executor.h"
17 #include "iopar.h"
18 #include "rowcol.h"
19 #include "keystrs.h"
20 #include <math.h>
21 
31 {
32 
34  RowCol rc=RowCol(1,1),
35  bool filludf=false )
36  : type_(t)
37  , stepout_(rc)
38  , filludf_(filludf)
39  , rowdist_(mUdf(float))
40  , distfac_(1) {}
41 
42  static const char* sKeyArray2DFilterPars()
43  { return "Array 2D Filter Pars"; }
44  static const char* sKeyFillUndefined() { return "Fill undefined"; }
45  static const char* sKeyRowDistance() { return "Row distance"; }
46  static const char* sKeyDistanceFactor() { return "Distance factor"; }
47 
48  bool fillPar( IOPar& par ) const
49  {
50  IOPar iop;
52  iop.set( sKey::StepOut(), stepout_ );
54  iop.set( sKeyRowDistance(), rowdist_ );
56  par.mergeComp( iop, sKeyArray2DFilterPars() );
57  return true;
58  }
59 
60  bool usePar( const IOPar& par )
61  {
63  if ( !iop ) return false;
64 
65  Stats::TypeDef().parse( *iop, sKey::Type(), type_ );
66  iop->get( sKey::StepOut(), stepout_ );
67  iop->getYN( sKeyFillUndefined(), filludf_ );
68  iop->get( sKeyRowDistance(), rowdist_ );
69  iop->get( sKeyDistanceFactor(), distfac_ );
70  return true;
71  }
72 
75  bool filludf_;
76  float rowdist_;
77  float distfac_;
78 
79 };
80 
81 
82 
89 template <class T>
90 mClass(General) Array2DFilterer : public Executor
92 public:
93 
95  inline Array2DFilterer(const Array2D<T>&,
96  Array2D<T>&, const RowCol& origin,
97  const Array2DFilterPars&);
98  inline ~Array2DFilterer();
99 
100  inline void setScope(const Interval<int>& rowrg,
101  const Interval<int>& colrg);
102 
103  inline Array2D<T>& output() { return output_; }
104  inline const Array2D<T>& output() const { return output_; }
105 
106  inline const Array2DFilterPars& pars() const { return pars_; }
107  inline const Stats::RunCalc<float>& calc() const { return *calc_; }
108 
109  inline int nextStep();
110  inline uiString message() const { return tr("Filtering data"); }
111  inline od_int64 nrDone() const { return nrrowsdone_; }
112  inline uiString nrDoneText() const { return tr("Columns handled");}
113  inline od_int64 totalNr() const {return outputrowrg_.width()+1;}
114 
115 protected:
116 
120 
123 
126 
127  const int inputrowsize_;
128  const int inputcolsize_;
129  const int nrcols_;
130  bool linefilt_;
132 
133  inline void filterRow(int);
134  inline void doPoint(int,int);
135 
136 };
137 
138 
139 template <class T> inline
141  : Executor("2D Filtering")
142  , input_( a )
143  , pars_(p)
144  , output_(a)
145  , calc_(0)
146  , inputrowsize_(a.info().getSize(0))
147  , inputcolsize_(a.info().getSize(1))
148  , nrcols_(2 * p.stepout_.col() + 1)
149  , nrrowsdone_(0)
150  , origin_( 0, 0 )
151 {
154 
156  setup.require( pars_.type_ );
157  calc_ = new Stats::RunCalc<float>( setup );
158 }
159 
160 
161 template <class T> inline
163  const RowCol& origin,
164  const Array2DFilterPars& p )
165  : Executor("2D Filtering")
166  , input_( input )
167  , pars_(p)
168  , output_(a)
169  , calc_(0)
170  , inputrowsize_(input.info().getSize(0))
171  , inputcolsize_(input.info().getSize(1))
172  , nrcols_(2 * p.stepout_.col() + 1)
173  , nrrowsdone_(0)
174  , origin_( origin )
175 {
176  outputrowrg_.start = origin.row();
177  outputrowrg_.stop = origin.row()+a.info().getSize(0)-1;
178 
179  outputcolrg_.start = origin.col();
180  outputcolrg_.stop = origin.col()+a.info().getSize(1)-1;
181 
183  setup.require( pars_.type_ );
184  calc_ = new Stats::RunCalc<float>( setup );
185 }
186 
187 
188 template <class T> inline
190 { }
191 
192 
193 template <class T>
195  const Interval<int>& colrg)
196 {
197  outputrowrg_ = rowrg;
198  outputcolrg_ = colrg;
199 }
200 
201 
202 template <class T> inline int Array2DFilterer<T>::nextStep()
203 {
204  if ( !nrrowsdone_ )
205  {
206  if ( !input_.getData() )
207  {
208  ErrMsg("Memory full");
209  return ErrorOccurred();
210  }
211 
212  if ( pars_.stepout_.col()<1 && pars_.stepout_.row()<1 )
213  {
214  ErrMsg("Invalid parameters");
215  return ErrorOccurred();
216  }
217 
218  linefilt_ = pars_.stepout_.row() == 0 || pars_.stepout_.col() == 0;
219  }
220 
221 
222  const int currow = outputrowrg_.start + nrrowsdone_;
223  if ( currow>outputrowrg_.stop )
224  return Executor::Finished();
225 
226  filterRow( currow );
227  nrrowsdone_++;
228  return Executor::MoreToDo();
229 }
230 
231 
232 template <class T> inline void Array2DFilterer<T>::filterRow( int row )
233 {
234  const T* inputptr = pars_.filludf_
235  ? 0
236  : input_.getData() + input_.info().getOffset( row, 0 );
237 
238  if ( inputptr )
239  {
240  for ( int col=outputcolrg_.start; col<=outputcolrg_.stop;
241  col++, inputptr++ )
242  {
243  if ( !mIsUdf(*inputptr) )
244  doPoint( row, col );
245  }
246 
247  return;
248  }
249 
250  for ( int col=outputcolrg_.start; col<=outputcolrg_.stop; col++ )
251  doPoint( row, col );
252 }
253 
254 
255 template <class T>
256 inline void Array2DFilterer<T>::doPoint( int row, int col )
257 {
258  calc_->clear();
259 
260  const bool isweighted = calc_->isWeighted();
261  const int startrow = row - pars_.stepout_.row();
262  int firstrow = startrow;
263  if ( firstrow < 0 ) firstrow = 0;
264  const int endrow = row + pars_.stepout_.row();
265  int lastrow = endrow;
266  if ( lastrow >= inputrowsize_ ) lastrow = inputrowsize_-1;
267 
268  const int startcol = col - pars_.stepout_.col();
269  int firstcol = startcol;
270  if ( firstcol < 0 ) firstcol = 0;
271  const int endcol = col + pars_.stepout_.col();
272  int lastcol = endcol;
273  if ( lastcol >= inputcolsize_ ) lastcol = inputcolsize_-1;
274 
275  for ( int irow=firstrow; irow<=lastrow; irow++ )
276  {
277  const bool issiderow = irow == startrow || irow == endrow;
278  const int rowdist = row-irow;
279  const int rowdist2 = rowdist*rowdist;
280  const bool iscenterrow = irow == row;
281 
282  const T* buf = input_.getData()+input_.info().getOffset(irow,firstcol);
283 
284  for ( int icol=firstcol; icol<=lastcol; icol++, buf++ )
285  {
286  const bool issidecol = icol == startcol || icol == endcol;
287  const bool iscentercol = icol == col;
288 
289  if ( !linefilt_ && ( (issidecol && !iscenterrow )
290  || (issiderow && !iscentercol) ) )
291  continue;
292 
293  if ( isweighted )
294  {
295  const int coldist = icol - col;
296  const int coldist2 = coldist*coldist;
297  float wt = pars_.rowdist_ * rowdist2 + coldist2 ;
298  wt = 1.f / (1 + pars_.distfac_ * wt);
299  calc_->addValue( *buf, wt );
300  }
301  else
302  *calc_ += *buf;
303  }
304  }
305 
306  output_.set( row-origin_.row(), col-origin_.col(),
307  (T) calc_->getValue(pars_.type_));
308 }
IdxType & row()
Definition: posidxpair.h:43
static const char * sKeyDistanceFactor()
Definition: array2dfilter.h:46
int nextStep()
Definition: array2dfilter.h:202
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
FixedString Type()
Definition: keystrs.h:135
int nrrowsdone_
Definition: array2dfilter.h:131
static const char * sKeyRowDistance()
Definition: array2dfilter.h:45
Setup for the Stats::RunCalc and Stats::ParallelCalc objects.
Definition: statruncalc.h:35
IOPar * subselect(const char *) const
returns iopar with key that start with <str>.
#define mODTextTranslationClass(clss)
Definition: uistring.h:37
static int ErrorOccurred()
Definition: task.h:164
od_int64 totalNr() const
Definition: array2dfilter.h:113
bool usePar(const IOPar &par)
Definition: array2dfilter.h:60
void clear()
Definition: statruncalc.h:289
FixedString StepOut()
Definition: keystrs.h:176
#define od_int64
Definition: plftypes.h:34
od_int64 nrDone() const
Definition: array2dfilter.h:111
const Array2D< T > & output() const
Definition: array2dfilter.h:104
Implementation of Array2D.
Definition: arrayndimpl.h:101
Stats::RunCalc< float > * calc_
Definition: array2dfilter.h:119
void filterRow(int)
Definition: array2dfilter.h:232
Definition: uistring.h:88
static int MoreToDo()
Definition: task.h:166
double getValue(Type) const
Definition: statruncalc.h:299
RunCalc< T > & addValue(T data, T weight=1)
Definition: statruncalc.h:586
bool get(const char *, int &) const
bool linefilt_
Definition: array2dfilter.h:130
Array2DFilterPars(Stats::Type t=Stats::Average, RowCol rc=RowCol(1, 1), bool filludf=false)
Definition: array2dfilter.h:33
const int inputrowsize_
Definition: array2dfilter.h:127
const Array2DFilterPars & pars() const
Definition: array2dfilter.h:106
Type
Definition: stattype.h:19
void setScope(const Interval< int > &rowrg, const Interval< int > &colrg)
Definition: array2dfilter.h:194
virtual int getSize(int dim) const =0
static int Finished()
Definition: task.h:165
void ErrMsg(const char *, bool progr=false)
Generalized set of parameters of the keyword-value type.
Definition: iopar.h:53
Array2D ( Subclass of ArrayND ) is a two dimensional array.
Definition: arraynd.h:127
void mergeComp(const IOPar &, const char *)
merge entries, where IOPar&#39;s entries get a prefix
uiString message() const
Definition: array2dfilter.h:110
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
Stats::Type type_
Definition: array2dfilter.h:73
~Array2DFilterer()
Definition: array2dfilter.h:189
RowCol origin_
Definition: array2dfilter.h:122
bool fillPar(IOPar &par) const
Definition: array2dfilter.h:48
Definition: stattype.h:22
BufferString toString(const DBKey &ky)
Definition: dbkey.h:115
void setYN(const char *, bool)
uiString nrDoneText() const
Definition: array2dfilter.h:112
Array2D< T > & output_
Definition: array2dfilter.h:117
Array2D< T > & output()
Definition: array2dfilter.h:103
Array2DFilterPars pars_
Definition: array2dfilter.h:118
Interval< int > outputcolrg_
Definition: array2dfilter.h:125
Interval< int > outputrowrg_
Definition: array2dfilter.h:124
Array2DFilterer(Array2D< T > &, const Array2DFilterPars &)
Definition: array2dfilter.h:140
const Stats::RunCalc< float > & calc() const
Definition: array2dfilter.h:107
IdxPair used for its row() and col().
Definition: rowcol.h:23
const int inputcolsize_
Definition: array2dfilter.h:128
T stop
Definition: ranges.h:91
IdxType & col()
Definition: posidxpair.h:48
void doPoint(int, int)
Definition: array2dfilter.h:256
CalcSetup & require(Type)
RowCol stepout_
In nodes. Center point not counted.
Definition: array2dfilter.h:74
Parameters for Array2DFilterer.
Definition: array2dfilter.h:30
T start
Definition: ranges.h:90
static const char * sKeyFillUndefined()
Definition: array2dfilter.h:44
float distfac_
if weigthed, distance factor
Definition: array2dfilter.h:77
#define mClass(module)
Definition: commondefs.h:161
static const char * sKeyArray2DFilterPars()
Definition: array2dfilter.h:42
virtual const Array2DInfo & info() const =0
void set(const char *ky, const char *val)
float rowdist_
non-undef = weighted filter
Definition: array2dfilter.h:76
bool isWeighted() const
Definition: statruncalc.h:105
const int nrcols_
Definition: array2dfilter.h:129
bool getYN(const char *, bool &) const
bool filludf_
Output when center point is undef?
Definition: array2dfilter.h:75
Filters an Array2D.
Definition: array2dfilter.h:90
Specification to enable chunkwise execution of a process.
Definition: executor.h:38
Definition: ptrman.h:135
Array2DImpl< T > input_
Definition: array2dfilter.h:121

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B. V. 2017