OpendTect  6.6
coltabmapper.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: Sep 2007
9  RCS: $Id$
10 ________________________________________________________________________
11 
12 -*/
13 
14 #include "generalmod.h"
15 #include "enums.h"
16 #include "coltab.h"
17 #include "math2.h"
18 #include "valseries.h"
19 #include "threadlock.h"
20 #include "varlenarray.h"
21 
22 #define mUndefColIdx (nrsteps_)
23 
24 class DataClipper;
25 class TaskRunner;
26 
27 namespace ColTab
28 {
29 
34 mExpClass(General) MapperSetup : public CallBacker
35 {
36 public:
38  enum Type { Fixed, Auto, HistEq };
40 
44  mDefSetupClssMemb(MapperSetup,float,symmidval)
45  mDefSetupClssMemb(MapperSetup,int,maxpts)
50 
51  bool operator==(const MapperSetup&) const;
52  bool operator!=(const MapperSetup&) const;
53  MapperSetup& operator=(const MapperSetup&);
54 
55  bool needsReClip(const MapperSetup&) const;
57 
58  void fillPar(IOPar&) const;
59  bool usePar(const IOPar&);
60  static const char* sKeyClipRate() { return "Clip Rate"; }
61  static const char* sKeyAutoSym() { return "Auto Sym"; }
62  static const char* sKeySymMidVal() { return "Sym Mid Value"; }
63  static const char* sKeyStarWidth() { return "Start_Width"; }
64  static const char* sKeyRange() { return "Range"; }
65  static const char* sKeyFlipSeq() { return "Flip seq"; }
66 
71 
72  void setAutoScale(bool);
73 };
74 
75 
83 mExpClass(General) Mapper
84 {
85 public:
86 
87  Mapper();
89 
90  float position(float val) const;
92  static int snappedPosition(const Mapper*,float val,
93  int nrsteps,int udfval);
94  const Interval<float>& range() const;
95  bool isFlipped() const { return setup_.flipseq_; }
96  const ValueSeries<float>* data() const { return vs_; }
97  od_int64 dataSize() const { return vssz_; }
98 
99  void setFlipped(bool yn) { setup_.flipseq_ = yn; }
100 
101  void setRange( const Interval<float>& rg );
103  TaskRunner* = 0);
105 
106  void update(bool full=true, TaskRunner* = 0);
109 
110 protected:
111 
113 
116 
117 };
118 
119 
124 template <class T>
125 mClass(General) MapperTask : public ParallelTask
127 public:
128  MapperTask(const ColTab::Mapper& map,
129  od_int64 sz,T nrsteps,
130  const float* unmapped,
131  T* mappedvals,int mappedvalspacing=1,
132  T* mappedundef=0,int mappedundefspacing=1);
137  MapperTask(const ColTab::Mapper& map,
138  od_int64 sz,T nrsteps,
139  const ValueSeries<float>& unmapped,
140  T* mappedvals, int mappedvalspacing=1,
141  T* mappedundef=0,int mappedundefspacing=1);
146  ~MapperTask();
147  od_int64 nrIterations() const;
148  const unsigned int* getHistogram() const { return histogram_; }
149 
150 private:
151  bool doWork(od_int64 start,od_int64 stop,int);
153  { return tr("Data values mapped"); }
154 
157  const float* unmapped_;
164  unsigned int* histogram_;
166 };
167 
168 
169 template <class T> inline
171  const float* unmapped,
172  T* mappedvals, int mappedvalsspacing,
173  T* mappedudfs, int mappedudfspacing )
174  : ParallelTask( "Color table mapping" )
175  , mapper_( map )
176  , totalsz_( sz )
177  , nrsteps_( nrsteps )
178  , unmapped_( unmapped )
179  , unmappedvs_( 0 )
180  , mappedvals_( mappedvals )
181  , mappedudfs_( mappedudfs )
182  , mappedvalsspacing_( mappedvalsspacing )
183  , mappedudfspacing_( mappedudfspacing )
184  , histogram_( new unsigned int[nrsteps+1] )
185 {
186  OD::memZero( histogram_, (mUndefColIdx+1)*sizeof(unsigned int) );
187 }
188 
189 
190 template <class T> inline
191 MapperTask<T>::MapperTask( const ColTab::Mapper& map, od_int64 sz, T nrsteps,
192  const ValueSeries<float>& unmapped,
193  T* mappedvals, int mappedvalsspacing,
194  T* mappedudfs, int mappedudfspacing )
195  : ParallelTask( "Color table mapping" )
196  , mapper_( map )
197  , totalsz_( sz )
198  , nrsteps_( nrsteps )
199  , unmapped_( unmapped.arr() )
200  , unmappedvs_( unmapped.arr() ? 0 : &unmapped )
201  , mappedvals_( mappedvals )
202  , mappedudfs_( mappedudfs )
203  , mappedvalsspacing_( mappedvalsspacing )
204  , mappedudfspacing_( mappedudfspacing )
205  , histogram_( new unsigned int[nrsteps+1] )
206 {
207  OD::memZero( histogram_, (mUndefColIdx+1)*sizeof(unsigned int) );
208 }
209 
210 
211 template <class T> inline
213 {
214  delete [] histogram_;
215 }
216 
217 
218 template <class T> inline
220 { return totalsz_; }
221 
222 
223 template <class T> inline
224 bool MapperTask<T>::doWork( od_int64 start, od_int64 stop, int )
225 {
226  mAllocVarLenArr( unsigned int, histogram, mUndefColIdx+1);
227 
228  OD::memZero( histogram, (mUndefColIdx+1)*sizeof(unsigned int) );
229 
230  T* valresult = mappedvals_+start*mappedvalsspacing_;
231  T* udfresult = mappedudfs_ ? mappedudfs_+start*mappedudfspacing_ : 0;
232  const float* inp = unmapped_+start;
233 
234  const ValueSeries<float>* unmappedvs = unmappedvs_;
235  const int mappedvalsspacing = mappedvalsspacing_;
236  const int mappedudfspacing = mappedudfspacing_;
237  const int nrsteps = nrsteps_;
238  const int udfcolidx = mUndefColIdx;
239 
240  const int nrsegs = mapper_.setup_.nrsegs_;
241  const bool flipseq = mapper_.setup_.flipseq_;
242  const float rangewidth = mapper_.setup_.range_.width( false );
243  const bool rangehaswidth = !mIsZero(rangewidth,mDefEps);
244  const float rangestart = mapper_.setup_.range_.start;
245 
246  int nrdone = 0;
247  for ( od_int64 idx=start; idx<=stop; idx++ )
248  {
249  const float input = unmappedvs ? unmappedvs->value(idx) : *inp++;
250 
251  float position = 0.0f;
252  bool isudf = true;
253 
254  if ( mFastIsFloatDefined(input) )
255  {
256  isudf = false;
257  if ( rangehaswidth )
258  {
259  position = (input-rangestart) / rangewidth;
260  if ( nrsegs > 0 )
261  position = (0.5f + ((int) (position*nrsegs))) / nrsegs;
262 
263  if ( position > 1.0f )
264  position = 1.0f;
265  else if ( position < 0.0f )
266  position = 0.0f;
267 
268  if ( flipseq )
269  position = 1.0f - position;
270 
271  position *= nrsteps;
272 
273  if ( position > nrsteps-0.9f )
274  position = nrsteps - 0.9f;
275  else if ( position < 0.0f )
276  position = 0.0f;
277  }
278  }
279 
280  const T res = (T) ( isudf ? udfcolidx : (int) position );
281 
282  *valresult = res;
283  valresult += mappedvalsspacing;
284 
285  if ( udfresult )
286  {
287  *udfresult = (T) (isudf ? 0 : udfcolidx);
288  udfresult += mappedudfspacing;
289  }
290 
291  histogram[res]++;
292 
293  if ( nrdone > 100000 )
294  {
295  addToNrDone( nrdone );
296  nrdone = 0;
297  if ( !shouldContinue() )
298  return false;
299  }
300  }
301 
302  if ( nrdone )
303  addToNrDone( nrdone );
304 
305  Threads::Locker lckr( lock_ );
306  for ( int idx=0; idx<=mUndefColIdx; idx++ )
307  histogram_[idx] += histogram[idx];
308 
309  return true;
310 }
311 
312 
313 } // namespace ColTab
314 
ValueSeries< float >
ColTab::MapperTask::unmapped_
const float * unmapped_
Definition: coltabmapper.h:157
ColTab::Mapper::vs_
const ValueSeries< float > * vs_
Definition: coltabmapper.h:114
ColTab::Mapper::setData
void setData(const ValueSeries< float > *, od_int64 sz, TaskRunner *=0)
If data changes, call update()
ColTab::MapperSetup::triggerAutoscaleChange
void triggerAutoscaleChange()
ColTab::MapperSetup::MapperSetup
MapperSetup()
ColTab::MapperSetup::rangeChange
Notifier< MapperSetup > rangeChange
Definition: coltabmapper.h:69
ColTab::MapperTask::mappedudfs_
T * mappedudfs_
Definition: coltabmapper.h:161
Threads::Locker
Locks the lock, shutting out access from other threads if needed.
Definition: threadlock.h:85
ColTab
Color Table
Definition: coltab.h:22
ColTab::MapperTask::nrIterations
od_int64 nrIterations() const
Definition: coltabmapper.h:219
ColTab::MapperSetup::sKeyAutoSym
static const char * sKeyAutoSym()
Definition: coltabmapper.h:61
ValueSeries::value
virtual T value(int64_t) const =0
ColTab::Mapper::vssz_
od_int64 vssz_
Definition: coltabmapper.h:115
valseries.h
ColTab::Mapper::setRange
void setRange(const Interval< float > &rg)
ColTab::Mapper::clipper_
DataClipper & clipper_
Definition: coltabmapper.h:112
od_int64
#define od_int64
Definition: plftypes.h:35
ColTab::Mapper::isFlipped
bool isFlipped() const
Definition: coltabmapper.h:95
ColTab::MapperSetup
Setup class for colortable Mapper.
Definition: coltabmapper.h:35
ColTab::Mapper::data
const ValueSeries< float > * data() const
Definition: coltabmapper.h:96
mExpClass
#define mExpClass(module)
Definition: commondefs.h:177
ColTab::MapperTask::nrsteps_
T nrsteps_
Definition: coltabmapper.h:163
ColTab::MapperTask::lock_
Threads::Lock lock_
Definition: coltabmapper.h:165
usePar
void usePar(const IOPar &iop, ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:187
mDefEps
#define mDefEps
Definition: commondefs.h:71
varlenarray.h
ColTab::Mapper::range
const Interval< float > & range() const
ColTab::MapperSetup::Type
Type
Definition: coltabmapper.h:38
CallBacker
Inherit from this class to be able to send and/or receive CallBacks.
Definition: callback.h:185
ColTab::MapperSetup::autoscaleChange
Notifier< MapperSetup > autoscaleChange
Definition: coltabmapper.h:70
ColTab::MapperTask::totalsz_
od_int64 totalsz_
Definition: coltabmapper.h:156
ColTab::Mapper::snappedPosition
static int snappedPosition(const Mapper *, float val, int nrsteps, int udfval)
mODTextTranslationClass
#define mODTextTranslationClass(clss)
Definition: uistring.h:40
ColTab::Mapper::Mapper
Mapper()
defaults maps from [0,1] to [0,1]
ColTab::MapperSetup::mDeclareEnumUtils
mDeclareEnumUtils(Type)
ColTab::MapperSetup::sKeyStarWidth
static const char * sKeyStarWidth()
Definition: coltabmapper.h:63
ColTab::Mapper::setFlipped
void setFlipped(bool yn)
Definition: coltabmapper.h:99
coltab.h
ColTab::MapperTask
Takes a Mapper, unmapped data and maps it.
Definition: coltabmapper.h:126
DataClipper
A DataClipper gets a bunch of data and determines at what value to clip if a certain clip percentage ...
Definition: dataclipper.h:73
ColTab::MapperTask::doWork
bool doWork(od_int64 start, od_int64 stop, int)
Definition: coltabmapper.h:224
mIsZero
#define mIsZero(x, eps)
Definition: commondefs.h:66
mClass
#define mClass(module)
Definition: commondefs.h:181
ColTab::MapperTask::mapper_
const ColTab::Mapper & mapper_
Definition: coltabmapper.h:155
ColTab::MapperSetup::setAutoScale
void setAutoScale(bool)
ColTab::Mapper
Maps data values to colortable positions: [0,1].
Definition: coltabmapper.h:84
ColTab::MapperTask::unmappedvs_
const ValueSeries< float > * unmappedvs_
Definition: coltabmapper.h:158
TaskRunner
Class that can execute a task.
Definition: task.h:170
Notifier
Class to help setup a callback handling.
Definition: notify.h:126
ColTab::Mapper::dataSize
od_int64 dataSize() const
Definition: coltabmapper.h:97
ColTab::MapperTask::histogram_
unsigned int * histogram_
Definition: coltabmapper.h:164
ColTab::MapperSetup::sKeySymMidVal
static const char * sKeySymMidVal()
Definition: coltabmapper.h:62
fillPar
void fillPar(IOPar &iop, const ODPolygon< T > &poly, const char *inpkey)
Definition: polygon.h:174
ParallelTask
Generalization of a task that can be run in parallel.
Definition: paralleltask.h:66
ColTab::MapperTask::~MapperTask
~MapperTask()
Definition: coltabmapper.h:212
ColTab::MapperSetup::triggerRangeChange
void triggerRangeChange()
ColTab::MapperSetup::mDefSetupClssMemb
mDefSetupClssMemb(MapperSetup, Type, type) mDefSetupClssMemb(MapperSetup
mUndefColIdx
#define mUndefColIdx
Definition: coltabmapper.h:22
ColTab::MapperSetup::sKeyFlipSeq
static const char * sKeyFlipSeq()
Definition: coltabmapper.h:65
uiString
String that is able to hold international (UTF-8) strings for the user interface.
Definition: uistring.h:121
ColTab::Mapper::update
void update(bool full=true, TaskRunner *=0)
If !full, will assume data is unchanged.
ColTab::MapperTask::mappedvalsspacing_
int mappedvalsspacing_
Definition: coltabmapper.h:160
ColTab::MapperSetup::sKeyRange
static const char * sKeyRange()
Definition: coltabmapper.h:64
enums.h
mAllocVarLenArr
#define mAllocVarLenArr(type, varnm, __size)
Definition: varlenarray.h:53
threadlock.h
ColTab::Mapper::position
float position(float val) const
returns position in ColorTable
ColTab::MapperTask::mappedvals_
T * mappedvals_
Definition: coltabmapper.h:159
ColTab::Mapper::setup_
MapperSetup setup_
Definition: coltabmapper.h:108
mDefSetupClssMemb
#define mDefSetupClssMemb(clss, typ, memb)
Definition: commondefs.h:150
ColTab::MapperTask::uiNrDoneText
uiString uiNrDoneText() const
will be nrDoneText() in 7.x
Definition: coltabmapper.h:152
Interval< float >
Threads::Lock
A lock of a type that (hopefully) suits your needs. To use it, you need the Locker class.
Definition: threadlock.h:53
ColTab::MapperTask::getHistogram
const unsigned int * getHistogram() const
Definition: coltabmapper.h:148
math2.h
IOPar
Generalized set of parameters of the keyword-value type.
Definition: iopar.h:55
ColTab::MapperTask::mappedudfspacing_
int mappedudfspacing_
Definition: coltabmapper.h:162
ColTab::MapperTask::MapperTask
mODTextTranslationClass(MapperTask) public MapperTask(const ColTab::Mapper &map, od_int64 sz, T nrsteps, const ValueSeries< float > &unmapped, T *mappedvals, int mappedvalspacing=1, T *mappedundef=0, int mappedundefspacing=1)
Definition: coltabmapper.h:170
ColTab::Mapper::~Mapper
~Mapper()
mFastIsFloatDefined
#define mFastIsFloatDefined(fval)
Definition: undefval.h:297

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