OpendTect  6.3
datadistributiontools.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
8  Date: January 2017
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "datadistribution.h"
14 #include "monitoriter.h"
15 #include "iopar.h"
16 #include "keystrs.h"
17 
18 
19 template <class VT>
21  : public MonitorableIter4Read< typename DataDistribution<VT>::IdxType >
22 {
23 public:
24 
28  typedef typename DistribType::PosType PosType;
29  typedef typename DistribType::IdxType IdxType;
30 
31  inline DataDistributionIter( const DistribType& d )
32  : MonitorableIter4Read<IdxType>(d,0,d.size()-1) {}
34  : MonitorableIter4Read<IdxType>(oth) {}
35  inline const DistribType& distrib() const
36  { return static_cast<const DistribType&>(
38 
39  inline bool isValid() const { return base_type::isValid(); }
40  inline VT value() const
41  { return isValid() ? distrib().data_[base_type::curidx_]
42  : mUdf(VT); }
43  inline VT cumValue() const
45  : mUdf(VT); }
46  inline PosType position() const
47  { return isValid()
48  ? distrib().sampling().atIndex(base_type::curidx_)
49  : mUdf(PosType); }
50 
52 
53 };
54 
55 
56 template <class VT>
58 {
59 public:
60 
62  typedef typename DistribType::IdxType IdxType;
63  typedef typename DistribType::PosType PosType;
65  typedef typename DistribType::SetType SetType;
66 
67  inline DataDistributionInfoExtracter( const DistribType& d )
68  : distrib_(d) {}
69 
70  inline bool isRoughlySymmetrical(bool mustbearound0=false) const;
72 
73  inline void getCurve(SetType& xvals,SetType& yvals,
74  bool limitspikes=false) const;
75  inline void getRanges(Interval<PosType>& xrg,
76  Interval<PosType>& yrg) const;
77  inline void getAvgStdRMS(PosType&,PosType&,PosType&) const;
78 
79  void fillPar(IOPar&) const;
80 
81 protected:
82 
83  const DistribType& distrib_;
84 
85 };
86 
87 
88 template <class VT>
90 {
91 public:
92 
94  typedef typename DistribType::IdxType IdxType;
95  typedef typename DistribType::PosType PosType;
97  typedef typename DistribType::SetType SetType;
98 
99  inline DataDistributionChanger( DistribType& d )
100  : distrib_(d) {}
101 
102  inline void normalise(bool in_the_math_sense=true);
104  inline bool deSpike(VT ratioaboverg=VT(0.4));
108 
109  void usePar(const IOPar&);
110 
111 protected:
112 
113  DistribType& distrib_;
114 
115 };
116 
117 
118 
119 template <class VT> inline
120 void DataDistributionChanger<VT>::normalise( bool in_the_math_sense )
121 {
122  mLockMonitorable4Write( distrib_ );
123  const IdxType sz = distrib_.data_.size();
124  if ( sz < 1 )
125  return;
126 
127  const VT divby = in_the_math_sense ? distrib_.cumdata_[sz-1]
128  : distrib_.gtMax();
129  if ( divby == VT(0) || divby == VT(1) )
130  return;
131 
132  for ( IdxType idx=0; idx<sz; idx++ )
133  {
134  distrib_.data_[idx] /= divby;
135  distrib_.setCumData( idx );
136  }
137 
138  if ( in_the_math_sense )
139  distrib_.cumdata_[sz-1] = VT(1); // just to avoid ugly roundoffs
140 
143 }
144 
145 
146 template <class VT> inline
148 {
149  mLockMonitorable4Write( distrib_ );
150  const int sz = distrib_.data_.size();
151  if ( sz < 6 )
152  return false;
153 
154  VT maxval = distrib_.data_[0];
155  VT runnerupval = maxval;
156  VT minval = maxval;
157  IdxType idxatmax = 0;
158 
159  for ( int idx=1; idx<sz; idx++ )
160  {
161  const VT val = distrib_.data_[idx];
162  if ( val < minval )
163  minval = val;
164  else if ( val > maxval )
165  {
166  runnerupval = maxval;
167  maxval = val;
168  idxatmax = idx;
169  }
170  }
171 
172  const VT unspikedvalrg = runnerupval - minval;
173  const VT spikelimit = minval + VT(1+cutoff) * unspikedvalrg;
174  if ( maxval > spikelimit )
175  {
176  distrib_.data_[idxatmax] = spikelimit;
179  return true;
180  }
181  return false;
182 }
183 
184 
185 template <class VT> inline
187  bool onlyaround0 ) const
188 {
189  mLockMonitorable4Read( distrib_ );
190  IdxType maxidx; distrib_.gtMax( &maxidx );
191  PosType medpos = distrib_.medianPosition();
192  PosType diff = medpos - distrib_.sampling_.atIndex( maxidx );
193  if ( diff < PosType(0) )
194  diff = -diff;
195  if ( diff < distrib_.sampling_.step )
196  {
197  if ( !onlyaround0 )
198  return true;
199  if ( medpos > -distrib_.sampling_.step
200  && medpos < distrib_.sampling_.step )
201  return true;
202  }
203 
204  return false;
205 }
206 
207 
208 template <class VT> inline
210  bool limitspikes ) const
211 {
212  xvals.setEmpty(); yvals.setEmpty();
213 
214  if ( limitspikes )
215  {
216  RefMan< DataDistribution<VT> > despiked = distrib_.clone();
217  DataDistributionChanger<VT>( *despiked ).deSpike();
219  xvals, yvals, false );
220  }
221  else
222  {
223  DataDistributionIter<VT> iter( distrib_ );
224  while ( iter.next() )
225  {
226  xvals += iter.position();
227  yvals += iter.value();
228  }
229  }
230 }
231 
232 
233 template <class VT> inline
235  Interval<PosType>& yrg ) const
236 {
237  mLockMonitorable4Read( distrib_ );
238  xrg.start = distrib_.sampling_.start;
239  const IdxType sz = distrib_.data_.size();
240  if ( sz < 1 )
241  {
242  xrg.stop = xrg.start;
243  yrg.start = yrg.stop = 0;
244  }
245  else
246  {
247  xrg.stop = distrib_.sampling_.atIndex( sz-1 );
248  yrg.start = yrg.stop = distrib_.data_[0];
249  for ( IdxType idx=1; idx<sz; idx++ )
250  {
251  const VT val = distrib_.data_[idx];
252  if ( val > yrg.stop )
253  yrg.stop = val;
254  else if ( val < yrg.start )
255  yrg.start = val;
256  }
257  }
258 }
259 
260 
261 template <class VT> inline
263  PosType& stdev, PosType& rms ) const
264 {
265  mLockMonitorable4Read( distrib_ );
266  const int sz = distrib_.data_.size();
267  if ( sz < 1 )
268  { avg = rms = stdev = PosType(0); return; }
269  avg = rms = distrib_.data_[0]; stdev = PosType(0);
270  if ( sz == 1 )
271  return;
272 
273  // TODO: not entirely correct but no disaster
274  // The problem is a.o. that within a bin the distrib is not uniform.
275  // "Sheppard's correction".
276 
277  VT sum_x, sum_xx, sum_w, sum_wx, sum_wxx;
278  sum_x = sum_xx = sum_w = sum_wx = sum_wxx = VT(0);
279 
280  for ( IdxType idx=0; idx<sz; idx++ )
281  {
282  const VT x = distrib_.sampling_.atIndex( idx );
283  const VT wt = distrib_.data_[idx];
284  sum_x += x; sum_xx += x * x;
285  sum_w += wt; sum_wx += wt * x; sum_wxx += wt * x * x;
286  }
287 
288  if ( sum_w == 0 )
289  return;
290 
291  avg = sum_wx / sum_w;
292  rms = Math::Sqrt( sum_wxx / sum_w );
293  const VT var = (sum_wxx - (sum_wx * sum_wx / sum_w))
294  / ( ((sz-1) * sum_w) / sz );
295  stdev = var > VT(0) ? Math::Sqrt( var ) : VT(0);
296 }
297 
298 
299 template <class VT> inline
301 {
302  mLockMonitorable4Read( distrib_ );
303  iop.set( sKey::Sampling(), distrib_.sampling_ );
304  iop.set( sKey::Data(), distrib_.data_ );
305 }
306 
307 
308 template <class VT> inline
310 {
311  mLockMonitorable4Write( distrib_ );
312  iop.get( sKey::Sampling(), distrib_.sampling_ );
313  iop.get( sKey::Data(), distrib_.data_ );
314  distrib_.cumdata_.setSize( distrib_.data_.size() );
315  for ( int idx=0; idx<distrib_.cumdata_.size(); idx++ )
316  distrib_.setCumData( idx );
318 }
void normalise(bool in_the_math_sense=true)
if !math, sets max to 1
Definition: datadistributiontools.h:120
short IdxType
Definition: seisblocksdata.h:39
DistribType::SetType SetType
Definition: datadistributiontools.h:65
#define mLockMonitorable4Write(obj)
Definition: monitor.h:47
size_type IdxType
Definition: datadistribution.h:51
DistribType::PosType PosType
Definition: datadistributiontools.h:63
#define mSendMonitorableEntireObjChgNotif(obj)
Definition: monitor.h:55
void usePar(const IOPar &iop, ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:200
void getCurve(SetType &xvals, SetType &yvals, bool limitspikes=false) const
Definition: datadistributiontools.h:209
#define mLockMonitorable4Read(obj)
Definition: monitor.h:45
Definition: datadistribution.h:20
void fillPar(IOPar &) const
Definition: datadistributiontools.h:300
SetType data_
Definition: datadistribution.h:104
base class for const Monitorable iterator.
Definition: monitoriter.h:83
bool get(const char *, int &) const
DistribType::PosType PosType
Definition: datadistributiontools.h:95
DataDistributionIter(const DataDistributionIter &oth)
Definition: datadistributiontools.h:33
PosType position() const
Definition: datadistributiontools.h:46
static ChangeType cDataChange()
Definition: datadistribution.h:93
Interval of values.
Definition: commontypes.h:27
VT cumValue() const
Definition: datadistributiontools.h:43
static IDType cUnspecChgID()
Definition: monitorable.h:108
DataDistributionChanger(DistribType &d)
Definition: datadistributiontools.h:99
DataDistributionIter(const DistribType &d)
Definition: datadistributiontools.h:31
void getRanges(Interval< PosType > &xrg, Interval< PosType > &yrg) const
Definition: datadistributiontools.h:234
bool isRoughlySymmetrical(bool mustbearound0=false) const
criterion: median value is near modus
Definition: datadistributiontools.h:186
Generalized set of parameters of the keyword-value type.
Definition: iopar.h:53
SetType cumdata_
Definition: datadistribution.h:105
DistribType::PosType PosType
Definition: datadistributiontools.h:28
const DistribType & distrib_
Definition: datadistributiontools.h:83
bool isValid() const
Definition: monitoriter.h:51
Definition: datadistribution.h:19
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
void setEmpty()
Definition: odset.h:44
FixedString Sampling()
Definition: keystrs.h:108
DataDistribution< VT > DistribType
Definition: datadistributiontools.h:27
DataDistributionInfoExtracter(const DistribType &d)
Definition: datadistributiontools.h:67
Definition: datadistribution.h:18
#define mDefNoAssignmentOper(clss)
Definition: commondefs.h:131
DataDistribution< VT > DistribType
Definition: datadistributiontools.h:61
bool isValid() const
Definition: datadistributiontools.h:39
DistribType::ValueType ValueType
Definition: datadistributiontools.h:96
void getAvgStdRMS(PosType &, PosType &, PosType &) const
Definition: datadistributiontools.h:262
void fillPar(IOPar &iop, const ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:187
DistribType::ValueType ValueType
Definition: datadistributiontools.h:64
DistribType & distrib_
Definition: datadistributiontools.h:113
DistribType::IdxType IdxType
Definition: datadistributiontools.h:94
T stop
Definition: ranges.h:91
const Monitorable & monitored() const
Definition: monitoriter.h:43
FixedString Data()
Definition: keystrs.h:50
#define mSendMonitorableChgNotif(obj, typ, id)
Definition: monitor.h:53
DistribType::IdxType IdxType
Definition: datadistributiontools.h:29
T start
Definition: ranges.h:90
DistribType::SetType SetType
Definition: datadistributiontools.h:97
Sharable data distribution. Sampling defaults to 0 step 1.
Definition: datadistribution.h:42
base class for Monitorable iterators. Inherit from one of its subclasses.
Definition: monitoriter.h:31
float PosType
Definition: coltab.h:24
DistribType::IdxType IdxType
Definition: datadistributiontools.h:62
DataDistribution< VT > DistribType
Definition: datadistributiontools.h:93
#define mClass(module)
Definition: commondefs.h:161
void set(const char *ky, const char *val)
const DistribType & distrib() const
Definition: datadistributiontools.h:35
VT value() const
Definition: datadistributiontools.h:40
DataValueType PosType
Definition: datadistribution.h:47
VT ValueType
Definition: datadistribution.h:48
float Sqrt(float)
IdxType curidx_
Definition: monitoriter.h:67
void usePar(const IOPar &)
Definition: datadistributiontools.h:309
bool deSpike(VT ratioaboverg=VT(0.4))
Definition: datadistributiontools.h:147
Definition: ptrman.h:200
MonitorableIterBase< typename DataDistribution< VT >::IdxType > base_type
Definition: datadistributiontools.h:26

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