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

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