 |
OpendTect
6.6
|
Go to the documentation of this file.
38 template <
class VT,
class PT>
63 template <
class VT,
class PT>
84 int idxminus1,
int idx0,
int idx1,
85 VT vminus1,VT v0,VT v1,
110 #define mIncSampIdx(idx) { \
112 if ( idx == sg.stop+inc ) \
113 return ValueSeriesEvent<VT,PT>( 0, mUdf(PT) ); }
114 #undef mDecrOccAtZero
115 #define mDecrOccAtZero(idx) { \
118 return ValueSeriesEvent<VT,PT>( 0, sd_.atIndex(idx) ); }
121 template <
class VT,
class PT>
125 const int inc = sg.start < sg.stop ? 1 : -1;
128 VT v0 = vs_.value( idx );
133 v0 = vs_.value( idx );
136 int frompositive = v0 > 0;
139 for ( ; idx!=sg.stop+inc; idx+=inc )
141 VT v1 = vs_.value( idx );
146 v1 = vs_.value( idx );
149 if ( ( (v1<0) != frompositive && needtoneg )
150 || ( (v1>0) != frompositive && needtopos ) )
154 v0 = v1; frompositive = v0 > 0;
155 v1 = vs_.value( idx );
160 const bool istopos = v0 < 0 && v1 > 0;
161 const bool istoneg = v0 > 0 && v1 < 0;
162 if ( ( istopos && needtopos ) || ( istoneg && needtoneg ) )
169 PT pos = idx - inc * (v1 / ( v1 - v0 ));
180 template <
class VT,
class PT>
183 VT vm1, VT v0, VT v1,
187 {
Swap( idxm1, idx1 );
Swap( vm1, v1 ); }
190 idxm1 -= idx0; idx1 -= idx0;
192 vm1 /= idxm1; v1 /= idx1;
194 VT a = (vm1 - v1) / (idxm1 - idx1);
204 ret.
val = (VT)(v0 + a * relpos * relpos + b * relpos);
210 template <
class VT,
class PT>
219 int extridx = sg.start; VT extrval = vs_.value( extridx );
220 for ( curidx=sg.start+1;
mIsUdf(extrval) && curidx<=sg.stop; curidx++ )
221 { extridx = curidx; extrval = vs_.value( curidx ); }
226 for ( ; curidx<=sg.stop; curidx++ )
228 const VT val = vs_.value( curidx );
229 if (
mIsUdf(val) )
continue;
231 if ( (needmax && val > extrval) || (!needmax && val < extrval) )
232 { extridx = curidx; extrval = val; }
237 VT vm1 = extridx > sg.start ? vs_.value(extridx-1) : v0;
238 if (
mIsUdf(vm1) ) vm1 = v0;
239 VT v1 = extridx < sg.stop-1 ? vs_.value(extridx+1) : v0;
240 if (
mIsUdf(v1) ) v1 = v0;
243 extridx-1, extridx, extridx+1, vm1, v0, v1, sd_ );
247 template <
class VT,
class PT>
251 const int inc = sg.start < sg.stop ? 1 : -1;
253 VT v0 = vs_.value( idx0 );
254 bool havevm1 = (inc > 0 && sg.start > 0) || (inc < 0 && sg.start < maxidx_);
255 VT vm1 = havevm1 ? vs_.value( sg.start - inc ) : v0;
256 if (
mIsUdf(vm1) ) vm1 = v0;
257 bool upw0 = v0 > vm1;
264 VT v1 = vs_.value( idx1 );
265 if (
mIsUdf(v1) || v1 == v0 )
268 const bool upw1 = v1 > v0;
269 bool ishit = havevm1 && !
mIsUdf(v0) && upw0 != upw1;
272 const bool atmax = upw0 && !upw1;
283 return exactExtreme( evtype, idx0-inc, idx0, idx1,
286 upw0 = upw1; idx0 = idx1; vm1 = v0; v0 = v1;
294 template <
class VT,
class PT>
304 pErrMsg(
"Weird request: less than first occ of event.");
311 const int inc = pg.start < pg.stop ? 1 : -1;
312 if ( pg.start < sd_.start )
313 {
if ( inc < 0 )
return ev; pg.start = sd_.start; }
314 if ( pg.stop < sd_.start )
315 {
if ( inc > 0 )
return ev; pg.stop = sd_.start; }
317 const PT endpos = sd_.atIndex( maxidx_ );
318 if ( pg.start > endpos )
319 {
if ( inc > 0 )
return ev; pg.start = endpos; }
320 if ( pg.stop > endpos )
321 {
if ( inc < 0 )
return ev; pg.stop = endpos; }
326 sg.start = (int)
Math::Floor((pg.start-sd_.start)/sd_.step);
327 sg.stop = (int)
Math::Ceil((pg.stop-sd_.start)/sd_.step);
331 sg.start = (int)
Math::Ceil((pg.start-sd_.start)/sd_.step);
332 sg.stop = (int)
Math::Floor((pg.stop-sd_.start)/sd_.step);
342 else if ( sg.start == sg.stop )
350 ev = getExtreme( sg, occ, evtype );
353 ev = getZC( sg, occ, evtype );
361 if ( ( inc > 0 && ev.
pos < pg.start ) ||
362 ( inc < 0 && ev.pos > pg.start ) )
374 template <
class VT,
class PT>
389 const bool isascending = pg.stop > pg.start;
391 while ( isascending == (curg.stop>curg.start) )
397 curg.start = reqev.
pos +
mCast(PT,1e-5);
401 curg.start = revev.
pos +
mCast(PT,1e-5);
404 if ( !posset.size() )
return false;
411 #undef mDecrOccAtZero
void Swap(T &a, T &b)
Definition: commondefs.h:46
@ GateMin
Definition: valseriesevent.h:26
PT pos
Definition: valseriesevent.h:48
Event finder in gate.
Definition: valseriesevent.h:65
const SamplingData< PT > sd_
Definition: valseriesevent.h:96
const ValueSeries< VT > & vs_
Definition: valseriesevent.h:95
#define mDecrOccAtZero(idx)
Definition: valseriesevent.h:115
ValueSeriesEvFinder(const ValueSeries< VT > &v, int maxidx, const SamplingData< PT > &s)
Definition: valseriesevent.h:67
ValueSeriesEvent< VT, PT > find(VSEvent::Type, const Interval< PT > &, int occ=1) const
Definition: valseriesevent.h:295
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:289
#define mExpClass(module)
Definition: commondefs.h:177
virtual void sort(bool asc=true)
Definition: ranges.h:593
@ GateMax
Definition: valseriesevent.h:26
Event in value series.
Definition: valseriesevent.h:40
@ Max
Definition: valseriesevent.h:25
const BufferString * find(const BufferStringSet &, const char *)
#define mClass(module)
Definition: commondefs.h:181
ValueSeriesEvent(VT v=mUdf(VT), PT p=mUdf(PT))
Definition: valseriesevent.h:44
@ ZC
Definition: valseriesevent.h:25
int maxidx_
Definition: valseriesevent.h:97
ValueSeriesEvent< VT, PT > getExtreme(const Interval< int > &, int, VSEvent::Type) const
Definition: valseriesevent.h:248
T start
Definition: samplingdata.h:49
VSEvent::Type lastfound_
Definition: valseriesevent.h:98
Type
Definition: valseriesevent.h:25
@ Min
Definition: valseriesevent.h:25
#define pErrMsg(msg)
Usual access point for programmer error messages.
Definition: errmsg.h:37
#define mCast(tp, v)
Definition: commondefs.h:137
ValueSeriesEvent< VT, PT > getZC(const Interval< int > &, int, VSEvent::Type) const
Definition: valseriesevent.h:122
@ None
Definition: networkcommon.h:33
VT val
Definition: valseriesevent.h:47
@ Min
Definition: stattype.h:25
@ None
Definition: valseriesevent.h:25
const ValueSeries< VT > & valueSeries() const
Definition: valseriesevent.h:75
@ ZCNegPos
Definition: valseriesevent.h:25
@ ZCPosNeg
Definition: valseriesevent.h:25
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:274
@ Max
Definition: stattype.h:25
bool findEvents(TypeSet< PT > &, Interval< PT >, VSEvent::Type)
Definition: valseriesevent.h:375
#define mIncSampIdx(idx)
Definition: valseriesevent.h:110
Interval of values.
Definition: commontypes.h:30
ValueSeriesEvent< VT, PT > getGateExtr(const Interval< int > &, bool) const
Definition: valseriesevent.h:211
T step
Definition: samplingdata.h:50
const SamplingData< PT > & samplingData() const
Definition: valseriesevent.h:76
Definition: valseriesevent.h:23
static ValueSeriesEvent< VT, PT > exactExtreme(VSEvent::Type, int idxminus1, int idx0, int idx1, VT vminus1, VT v0, VT v1, const SamplingData< PT > &)
Definition: valseriesevent.h:181
VSEvent::Type lastFound() const
Useful when finding Extr or ZC.
Definition: valseriesevent.h:90
Sets of (small) copyable elements.
Definition: commontypes.h:29
Generated at
for the OpendTect
seismic interpretation project.
Copyright (C): dGB Beheer B.V. 1995-2021