7 #ifndef Tomato_OXSTARTPOINTCALCULATORShmolli_H 8 #define Tomato_OXSTARTPOINTCALCULATORShmolli_H 20 template<
typename MeasureType >
30 return calculateStartPointSKP(
35 this->_CalculatedStartPoint);
38 int setStartPointToDefault(){
39 this->_CalculatedStartPoint[0] = this->_DefaultStartPoint[0];
40 this->_CalculatedStartPoint[1] = this->_DefaultStartPoint[1];
41 this->_CalculatedStartPoint[2] = this->_DefaultStartPoint[2];
46 int calculateStartPointSKP(
int nSamples,
const MeasureType *invTimes,
const MeasureType *ysignalInput,
const double *signs, MeasureType *initPoint){
48 const int MAX_MOLLI_TI_SAMPLES = 128;
50 int lSigns[MAX_MOLLI_TI_SAMPLES] ;
51 MeasureType lSignal[MAX_MOLLI_TI_SAMPLES] ;
54 MeasureType lSignalAbs[MAX_MOLLI_TI_SAMPLES];
55 for ( i = 0; i < nSamples; i++) lSignalAbs[i] = fabs(ysignalInput[i]);
59 initPoint[0] = 1.+ KWUtil::max(lSignalAbs[0],lSignalAbs[nSamples-1]);
60 initPoint[1] = 1+initPoint[0]+lSignalAbs[0];
63 MeasureType signalMin = lSignalAbs[0], singalMax = lSignalAbs[0];
64 KWUtil::MOLLI_min(lSignalAbs, nSamples, &indmin);
65 initPoint[2]=invTimes[indmin];
67 for ( i = 0; i < nSamples; i++) {
68 lSigns[i]=(int)signs[i];
69 if(lSigns[i] == 0) lSigns[i] = ( i <= indmin ) ? (-1) : (1);
70 lSignal[i] = lSignalAbs[i] * lSigns[i];
71 if(lSignal[i] < signalMin) signalMin = lSignal[i];
72 if(lSignal[i] > singalMax) singalMax = lSignal[i];
75 MeasureType zereproxrange=0.1;
76 MeasureType y4log[MAX_MOLLI_TI_SAMPLES] ;
77 MeasureType x4log[MAX_MOLLI_TI_SAMPLES] ;
80 for (i=0;i<nSamples;i++)
82 y4log[n4log]=initPoint[0]-lSignal[i];
83 if((y4log[n4log]) > ((singalMax-signalMin)*zereproxrange) )
85 y4log[n4log]=log(y4log[n4log]);
86 x4log[n4log]=invTimes[i];
91 MeasureType rslope, roffset;
92 MeasureType r = KWUtil::SKPLinReg(x4log,y4log, n4log, rslope, roffset);
93 if( ( r < 0 ) && ( rslope < 0 ))
95 initPoint[2]=-1./rslope;
96 if ((initPoint[2] < (invTimes[0]/3.)) || (initPoint[2]) > (2*invTimes[nSamples-1]))
return (1) ;
97 initPoint[2] = KWUtil::min(initPoint[2], invTimes[nSamples-1]);
99 initPoint[0] = KWUtil::min(2*initPoint[0],roffset/2);
100 initPoint[1] = KWUtil::min(2*initPoint[1],roffset);
112 _DefaultStartPoint[0] = 100;
113 _DefaultStartPoint[1] = 200;
114 _DefaultStartPoint[2] = 1000;
123 _DefaultStartPoint[0] = old._DefaultStartPoint[0];
124 _DefaultStartPoint[1] = old._DefaultStartPoint[1];
125 _DefaultStartPoint[2] = old._DefaultStartPoint[2];
126 this->_nSamples = old._nSamples;
127 this->setNDims(old._nDims);
143 MeasureType _DefaultStartPoint[3];
148 #endif //Tomato_OXStartPointCalculatorShmolli_H StartPointCalculatorShmolli()
constructor
Definition: OxStartPointCalculatorShmolli.h:110
virtual StartPointCalculator< MeasureType > * newByCloning()
Definition: OxStartPointCalculatorShmolli.h:134
void setAllPointersToNull()
set all the pointers to zero
Definition: OxStartPointCalculator.h:91
Definition: OxStartPointCalculatorShmolli.h:21
virtual int calculateStartPoint()
Definition: OxStartPointCalculatorShmolli.h:29
Definition: OxStartPointCalculator.h:21
Definition: OxCalculator.h:19
virtual ~StartPointCalculatorShmolli()
do not forget about the virtual destructor, see https://stackoverflow.com/questions/461203/when-to-us...
Definition: OxStartPointCalculatorShmolli.h:140
StartPointCalculatorShmolli(const StartPointCalculatorShmolli &old)
copy constructor
Definition: OxStartPointCalculatorShmolli.h:120