OpendTect  6.3
densitycalc.h
Go to the documentation of this file.
1 #ifndef densitycalc_h
2 #define densitycalc_h
3 
4 /*+
5 ________________________________________________________________________
6 
7  CopyRight: (C) dGB Beheer B.V.
8  Author: Satyaki
9  Date: Aug 2009
10 ________________________________________________________________________
11 
12 -*/
13 
15 
16 #include "arraynd.h"
17 #include "mathexpression.h"
18 #include "polygon.h"
19 #include "rowcol.h"
20 #include "task.h"
21 #include "threadlock.h"
22 
23 #include "uidatapointset.h"
24 #include "uiworld2ui.h"
25 
26 
28 
31 public:
36  const char* header);
37 
38  od_int64 nrDone() const;
39  uiString nrDoneText() const;
40  od_int64 nrIterations() const;
41  bool doWork(od_int64 start,od_int64 stop,int);
42 
43  bool isSelectionValid(uiDataPointSet::DRowID);
44  void setNrBins(int nrbinx,int nrbiny);
45  void setWorld2Ui(const uiWorld2Ui&);
46  void setMathObj(Math::Expression*);
47  void setModifiedColIds(
49 
50  void setDPSChangeable(bool yn);
51  void setRemSelected(bool yn);
52  void setCurGroup(int curgrp);
53 
54  void setCellXSize(float sz);
55  void setCellYSize(float sz);
56  void setCellSize(float sz);
57  int indexSize() const;
58 
59  void setAreaType(int areatype);
60  int areaType() const;
61 
62  void getFreqData(Array2D<float>&) const;
63 
64  const TypeSet<RowCol>& selRCs() const;
65  const Interval<int>& usedXPixRg() const;
66 
67 
68 protected:
84  bool changedps_;
85  bool removesel_;
86  int curgrp_;
87  int indexsz_;
88  int nrdone_;
89  float cellxsize_;
90  float cellysize_;
91  int areatype_;
92 };
93 
94 
98  const ObjectSet<SelectionGrp>& grps,
99  const char* header )
100  : ParallelTask( header )
101  , uidps_( uidps )
102  , dps_( uidps.pointSet() )
103  , selgrpset_( grps )
104  , data_( data )
105  , freqdata_( 0 )
106  , x_( x )
107  , y_( y )
108  , mathobj_( 0 )
109  , xpixrg_( x_.axis_->pixRange() )
110  , ypixrg_( y_.axis_->pixRange() )
111  , usedxpixrg_( Interval<int> (0,0) )
112  , changedps_( false )
113  , removesel_( false )
114  , curgrp_( 0 )
115  , nrdone_( 0 )
116  , indexsz_( 0 )
117  , cellxsize_( 1.0 )
118  , cellysize_( 1.0 )
119  , areatype_( 0 )
120 {
121  if ( data_ )
122  {
123  const int celldatawdth = data_->info().getSize(0)%mNINT32(cellxsize_)
124  ? data_->info().getSize(0)/mNINT32(cellxsize_) + 1
126  const int celldataheight = data_->info().getSize(1)%mNINT32(cellysize_)
127  ? data_->info().getSize(1)/mNINT32(cellysize_) + 1
129  freqdata_ = new Array2DImpl<float>( celldatawdth, celldataheight );
130  freqdata_->setAll( (float)0 );
131  }
132 }
133 
135 { return nrdone_; }
136 
138 { return tr("Points done");}
139 
141 { return dps_.size(); }
142 
143 inline void DensityCalc::setWorld2Ui( const uiWorld2Ui& w2ui )
144 { w2ui_ = w2ui; }
145 
147 { mathobj_ = mobj; }
148 
151 { modcolidxs_ = ids; }
152 
153 inline void DensityCalc::setDPSChangeable( bool yn )
154 { changedps_ = yn; }
155 
156 inline void DensityCalc::setRemSelected( bool yn )
157 { removesel_ = yn; }
158 
159 inline void DensityCalc::setCurGroup( int curgrp )
160 { curgrp_ = curgrp; }
161 
162 inline void DensityCalc::setCellXSize( float sz )
163 { cellxsize_ = sz; }
164 
165 inline void DensityCalc::setCellYSize( float sz )
166 { cellysize_ = sz; }
167 
168 inline void DensityCalc::setCellSize( float sz)
169 { cellxsize_ = cellysize_ = sz; }
170 
171 inline int DensityCalc::indexSize() const
172 { return indexsz_; }
173 
175 { return selrowcols_; }
176 
178 { return usedxpixrg_; }
179 
180 inline void DensityCalc::setAreaType(int areatype)
181 { areatype_ = areatype; }
182 
183 inline int DensityCalc::areaType() const
184 { return areatype_; }
185 
187 {
188  if ( modcolidxs_.size() && mathobj_ )
189  {
190  for ( int idx=0; idx<modcolidxs_.size(); idx++ )
191  {
192  const float yval = uidps_.getValue( modcolidxs_[idx], rid, true );
193  mathobj_->setVariableValue( idx, yval );
194  }
195 
196  const float result = mCast(float,mathobj_->getValue());
197  if ( mIsZero(result,mDefEps) || mIsUdf(result) )
198  return false;
199  }
200  return true;
201 }
202 
203 
204 void DensityCalc::setNrBins( int nrbinx, int nrbiny )
205 {
206  if ( !freqdata_ )
207  freqdata_ = new Array2DImpl<float>( nrbinx, nrbiny );
208  else
209  {
211  arrimpl->setSize( nrbinx, nrbiny );
212  }
213 
214  freqdata_->setAll( (float)0 );
215 }
216 
217 
218 bool DensityCalc::doWork( od_int64 start, od_int64 stop, int )
219 {
221  for ( ; rid<=stop; rid++ )
222  {
223  nrdone_++;
224  if ( dps_.isInactive(rid) || (curgrp_>0 && dps_.group(rid)!=curgrp_) )
225  continue;
226 
227  const float xval = uidps_.getValue( x_.colid_, rid, true );
228  const float yval = uidps_.getValue( y_.colid_, rid, true );
229  if ( mIsUdf(xval) || mIsUdf(yval) ) continue;
230 
231  uiWorldPoint wpt( (double)x_.axis_->getPix(xval),
232  (double)y_.axis_->getPix(yval) );
233  uiPoint pos( x_.axis_->getPix(xval), y_.axis_->getPix(yval) );
234  uiPoint datapt = w2ui_.transform( wpt );
235 
236  if ( !xpixrg_.includes(pos.x_,true) || !ypixrg_.includes(pos.y_,true) )
237  continue;
238 
239  if ( usedxpixrg_.width() == 0 && usedxpixrg_.start == 0 )
240  usedxpixrg_ = Interval<int>( pos.x_, pos.x_ );
241  else
242  usedxpixrg_.include( pos.x_ );
243 
244  bool ptselected = false;
245  bool ptremoved = false;
246  if ( selgrpset_.size() && (changedps_ || removesel_) )
247  {
248  for ( int idx=0; idx<selgrpset_.size(); idx++ )
249  {
250  const SelectionGrp* selgrp = selgrpset_[idx];
251  for ( int selidx=0; selidx<selgrp->size(); selidx++ )
252  {
253  if ( !selgrp->isValidIdx(selidx) ) continue;
254  const SelectionArea& selarea =
255  selgrp->getSelectionArea( selidx );
256 
257  if ( selarea.isInside(pos) )
258  {
259  Threads::Locker lckr( lock_ );
260  if ( !isSelectionValid(rid) )
261  continue;
262  if ( removesel_ )
263  {
264  dps_.setInactive( rid, true );
265  ptremoved = true;
266  }
267  else
268  {
269  ptselected = true;
271  selarea.id_) );
272  RowCol rcol( uidps_.tRowID(rid),
273  uidps_.tColID(y_.colid_) );
274  selrowcols_ += rcol;
275  }
276  }
277  }
278  }
279  }
280 
281  if ( !ptselected )
282  dps_.setSelected( rid, -1 );
283  if ( !data_->info().validPos(datapt.x_,datapt.y_) )
284  continue;
285  const int freqx = mNINT32(datapt.x_/cellxsize_);
286  const int freqy = mNINT32(datapt.y_/cellysize_);
287  if ( !areatype_ )
288  freqdata_->set( freqx, freqy,
289  ptremoved ? 0 : freqdata_->get(freqx,freqy) + (float)1 );
290  else if ( areatype_==1 && ptselected )
291  freqdata_->set( freqx, freqy,
292  ptremoved ? 0 : freqdata_->get(freqx,freqy) + (float)1 );
293  else if ( areatype_==2 && !ptselected )
294  freqdata_->set( freqx, freqy,
295  ptremoved ? 0 : freqdata_->get(freqx,freqy) + (float)1 );
296 
297  if ( data_ )
298  {
299  for ( int idx=0; idx<mNINT32(cellxsize_); idx++ )
300  {
301  for ( int idy=0; idy<mNINT32(cellysize_); idy++ )
302  data_->set( freqx*mNINT32(cellxsize_)+idx,
303  freqy*mNINT32(cellysize_)+idy,
304  ptremoved ? 0 : freqdata_->get(freqx,freqy) );
305  }
306  if ( indexsz_ < mNINT32(data_->get(datapt.x_,datapt.y_)) )
307  indexsz_ = mNINT32(data_->get(datapt.x_,datapt.y_));
308  }
309  }
310 
311  return true;
312 }
313 
314 
316 {
317  mDynamicCastGet(Array2DImpl<float>*,freqdataimpl,&freqdata)
318  if ( !freqdataimpl ) return;
319  freqdataimpl->setSize( freqdata_->info().getSize(0),
320  freqdata_->info().getSize(1) );
321  for ( int idx=0; idx<freqdata_->info().getSize(0); idx++ )
322  {
323  for ( int idy=0; idy<freqdata_->info().getSize(1); idy++ )
324  freqdata.set( idx, idy, freqdata_->get(idx,idy) );
325  }
326 }
327 
328 
329 #endif
Class to provide coordinate conversion between a cartesian coordinate system (or any other transforme...
Definition: uiworld2ui.h:53
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
static uiString tr(const char *text, const char *disambiguation=0, int pluralnr=-1)
Definition: paralleltask.h:65
Locks the lock, shutting out access from other threads if needed.
Definition: threadlock.h:83
calculates densities for teh density display of a crossplot
Definition: densitycalc.h:29
A lock of a type that (hopefully) suits your needs. To use it, you need the Locker class...
Definition: threadlock.h:51
uiString nrDoneText() const
Definition: densitycalc.h:137
bool doWork(od_int64 start, od_int64 stop, int)
Definition: densitycalc.h:218
Set of data points with group selection.
Definition: datapointset.h:47
Interval< int > xpixrg_
Definition: densitycalc.h:80
Array2D< float > * freqdata_
Definition: densitycalc.h:77
virtual T get(int p0, int p1) const =0
void setMathObj(Math::Expression *)
Definition: densitycalc.h:146
uiWorld2Ui w2ui_
Definition: densitycalc.h:73
Math::Expression * mathobj_
Definition: densitycalc.h:71
#define mODTextTranslationClass(clss)
Definition: uistring.h:37
#define mIsZero(x, eps)
Definition: commondefs.h:55
Interval< int > usedxpixrg_
Definition: densitycalc.h:81
bool isSelectionValid(uiDataPointSet::DRowID)
Definition: densitycalc.h:186
#define mCast(tp, v)
Definition: commondefs.h:120
#define od_int64
Definition: plftypes.h:34
DataPointSet & dps_
Definition: densitycalc.h:70
int RowID
Definition: datapointset.h:51
bool isInactive(RowID rid) const
Definition: datapointset.h:174
DensityCalc(uiDataPointSet &, Array2D< float > *data, uiDataPointSetCrossPlotter::AxisData &x, uiDataPointSetCrossPlotter::AxisData &y, const ObjectSet< SelectionGrp > &, const char *header)
Definition: densitycalc.h:95
uiDataPointSetCrossPlotter::AxisData & y_
Definition: densitycalc.h:79
float cellysize_
Definition: densitycalc.h:90
void setInactive(RowID, bool)
Definition: uistring.h:88
const Interval< int > & usedXPixRg() const
Definition: densitycalc.h:177
virtual bool validPos(int, int) const
unsigned short group(RowID) const
void setAreaType(int areatype)
Definition: densitycalc.h:180
virtual void set(int, int, T)=0
Generalization of a task that can be run in parallel.
Definition: paralleltask.h:64
virtual double getValue() const =0
bool isValidIdx(int idx) const
size_type size() const
Definition: objectset.h:48
Array2D< float > * data_
Definition: densitycalc.h:76
virtual int getSize(int dim) const =0
uiDataPointSetCrossPlotter::AxisData & x_
Definition: densitycalc.h:78
#define mNINT32(x)
Definition: commondefs.h:48
Definition: uidatapointsetcrossplot.h:92
DataPointSet::ColID colid_
Definition: uidatapointsetcrossplot.h:104
void setDPSChangeable(bool yn)
Definition: densitycalc.h:153
void setCurGroup(int curgrp)
Definition: densitycalc.h:159
bool getSelectionArea(SelectionArea &, int id) const
uiAxisHandler * axis_
Definition: uiaxisdata.h:51
TRowID tRowID(DRowID did=-99) const
DataPointSet::RowID DRowID
Definition: uidatapointset.h:49
T width(bool allowrev=true) const
Definition: ranges.h:450
void setCellXSize(float sz)
Definition: densitycalc.h:162
Definition: uidpscrossplottools.h:64
virtual void setVariableValue(int, double)
void setWorld2Ui(const uiWorld2Ui &)
Definition: densitycalc.h:143
int getPix(float absval) const
uiWorldPoint transform(uiPoint p) const
void setModifiedColIds(const TypeSet< uiDataPointSet::DColID > &)
Definition: densitycalc.h:149
TypeSet< uiDataPointSet::DColID > modcolidxs_
Definition: densitycalc.h:75
#define mDynamicCastGet(typ, out, in)
Definition: commondefs.h:123
#define mDefEps
Definition: commondefs.h:60
virtual void setAll(T)
Definition: arraynd.h:382
void setSelected(RowID, int selgrp)
Interval< int > ypixrg_
Definition: densitycalc.h:82
float cellxsize_
Definition: densitycalc.h:89
IdxPair used for its row() and col().
Definition: rowcol.h:23
Parsed Math expression.
Definition: mathexpression.h:31
int areatype_
Definition: densitycalc.h:91
int size() const
size_type size() const
Definition: typeset.h:263
bool removesel_
Definition: densitycalc.h:85
void include(const T &, bool allowrev=true)
Definition: ranges.h:530
int areaType() const
Definition: densitycalc.h:183
uiDataPointSet & uidps_
Definition: densitycalc.h:69
int getSelectionGroupIdx(int selaareaid) const
void setRemSelected(bool yn)
Definition: densitycalc.h:156
void setCellYSize(float sz)
Definition: densitycalc.h:165
int nrdone_
Definition: densitycalc.h:88
Edit DataPointSet.
Definition: uidatapointset.h:42
Threads::Lock lock_
Definition: densitycalc.h:83
TypeSet< RowCol > selrowcols_
Definition: densitycalc.h:74
bool includes(const X &, bool allowrev) const
Definition: ranges.h:481
int indexsz_
Definition: densitycalc.h:87
bool changedps_
Definition: densitycalc.h:84
const TypeSet< RowCol > & selRCs() const
Definition: densitycalc.h:174
T start
Definition: ranges.h:90
int curgrp_
Definition: densitycalc.h:86
void getFreqData(Array2D< float > &) const
Definition: densitycalc.h:315
#define mClass(module)
Definition: commondefs.h:161
virtual const Array2DInfo & info() const =0
int indexSize() const
Definition: densitycalc.h:171
const ObjectSet< SelectionGrp > & selgrpset_
Definition: densitycalc.h:72
od_int64 nrDone() const
May be -1, i.e. class does not report nrdone.
Definition: densitycalc.h:134
int size() const
Definition: datapointset.h:159
TColID tColID(DColID did=-99) const
void setNrBins(int nrbinx, int nrbiny)
Definition: densitycalc.h:204
void setCellSize(float sz)
Definition: densitycalc.h:168
od_int64 nrIterations() const
Definition: densitycalc.h:140
float getValue(DColID did, DRowID rid, bool userunits) const
Definition: uidatapointset.h:262

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