19 #define TYPE__DOUBLE 3
26 int go4fit_position(
int l_len,
double *pa_data,
double *pr_pos,
double *pr_sig,
double *pr_sum);
51 int lMaxIndex,lMinIndex,lIndexMax,lDirection,lIndex,lLastUp,lLastDown,ii,i,lMax,lLeft,lRight,
52 *plMinimaL,*plMeanL,*plMinimaR,*plMeanR,lPrint,*pl;
54 double dValue,dLow,dHigh,dDelta,dAver,*pdData,*pdNoise,dMax,dMin,dPos,dSig,dSum,*pd;
59 pdData = (
double *)malloc(lPoints*8);
60 pdNoise = (
double *)malloc(lPoints*8);
61 if (!pdData || !pdNoise)
64 memset(pdData,0,lPoints*8);
65 memset(pdNoise,0,lPoints*8);
69 pw = ((
short *)pfData) + lFirstChan;
70 pl = ((
int *)pfData) + lFirstChan;
71 pf = ((
float *)pfData) + lFirstChan;
72 pd = ((
double *)pfData) + lFirstChan;
73 if(lAver == 0)lAver=1;
74 lPoints=lPoints/lAver;
75 dAver = (double) lAver;
80 { *(pdData+ii) = (
double)*(pw+lAver*ii);
81 for(i=1;i<lAver;i++)*(pdData+ii) += (double)*(pw+lAver*ii+i);
82 *(pdData+ii) = *(pdData+ii)/dAver;
83 if(*(pdData+ii) > dMax) dMax=*(pdData+ii);
84 if(*(pdData+ii) < dMin) dMin=*(pdData+ii);}
break;
86 { *(pdData+ii) = (
double)*(pl+lAver*ii);
87 for(i=1;i<lAver;i++)*(pdData+ii) += (double)*(pl+lAver*ii+i);
88 *(pdData+ii) = *(pdData+ii)/dAver;
89 if(*(pdData+ii) > dMax) dMax=*(pdData+ii);
90 if(*(pdData+ii) < dMin) dMin=*(pdData+ii);}
break;
92 { *(pdData+ii) = (
double)*(pf+lAver*ii);
93 for(i=1;i<lAver;i++)*(pdData+ii) += (double)*(pf+lAver*ii+i);
94 *(pdData+ii) = *(pdData+ii)/dAver;
95 if(*(pdData+ii) > dMax) dMax=*(pdData+ii);
96 if(*(pdData+ii) < dMin) dMin=*(pdData+ii);}
break;
98 { *(pdData+ii) = (
double)*(pd+lAver*ii);
99 for(i=1;i<lAver;i++)*(pdData+ii) += (double)*(pd+lAver*ii+i);
100 *(pdData+ii) = *(pdData+ii)/dAver;
101 if(*(pdData+ii) > dMax) dMax=*(pdData+ii);
102 if(*(pdData+ii) < dMin) dMin=*(pdData+ii);}
break;
103 default: printf(
"Data type %d not supported!\n",lType);
104 printf(
"Type 0: short, 1: int, 2: float, 3: double\n");
111 for(ii=0;ii<lPoints;ii++)
113 if(*(pdData+ii) == 0.0) *(pdNoise+ii) = dDeltaFact;
114 else *(pdNoise+ii) = sqrt(*(pdData+ii)) * dDeltaFact;
115 if(dDeltaMin > *(pdNoise+ii)) *(pdNoise+ii)=dDeltaMin;
118 for(ii=0;ii<lPoints;ii++)
119 { *(pdNoise+ii) = *(dNoise+lFirstChan+lAver*ii);
120 for(i=1;i<lAver;i++)*(pdNoise+ii) += *(dNoise+lFirstChan+lAver*ii+i);
121 *(pdNoise+ii) = *(pdNoise+ii)/dAver;
127 plMinimaL = (
int *)malloc(lPeaksMax*16);
130 plMeanL = (
int *)(plMinimaL+lPeaksMax);
131 plMinimaR = (
int *)(plMinimaL+2*lPeaksMax);
132 plMeanR = (
int *)(plMinimaL+3*lPeaksMax);
133 memset(plMinimaL,0,lPeaksMax*16);
136 dHigh = *pdData + dDelta;
137 dLow = *pdData - dDelta;
138 if(pfLowNoise)*pfLowNoise=dLow;
139 if(pfHighNoise)*pfHighNoise=dHigh;
146 while ((lIndex <= lIndexMax) & (lMaxIndex < lPeaksMax-2))
148 dValue = *(pdData+lIndex);
151 if (lDirection !=
UP)
153 if(lPrint)printf(
"%5d - %5d - %5d d %8.1f\n",
158 *(plMinimaR+lMinIndex)=lIndex;
159 *(plMinimaL+lMinIndex)=lLastDown;
167 if (lDirection ==
UP)
169 if(lPrint)printf(
"%5d + %5d - %5d d %8.1f\n",
174 *(plMeanR+lMaxIndex)=lIndex;
175 *(plMeanL+lMaxIndex)=lLastUp;
182 if((dValue < dLow)|(dValue > dHigh))
184 dDelta= *(pdNoise+lIndex);
185 dHigh = dValue + dDelta;
186 dLow = dValue - dDelta;
189 if(pfLowNoise)*(pfLowNoise+lIndex)=dLow;
190 if(pfHighNoise)*(pfHighNoise+lIndex)=dHigh;
192 if(lDirection ==
DOWN)
194 *(plMinimaL+lMinIndex)=lLastDown;
195 *(plMinimaR+lMinIndex)=lIndexMax;
196 if(lPrint)printf(
"%5d - %5d - %5d\n",
203 if(lPrint)printf(
"-------------------------\n");
204 if(lPrint)printf(
"Minima %d Maxima %d \n",lMinIndex,lMaxIndex);
206 if(lMinIndex != (lMaxIndex+1))
212 if(lPrint)printf(
"Error, wrong minima\n");
217 if(lPrint)printf(
" [ Left Right ] \n");
218 *plMinima = (*plMinimaL + *plMinimaR)/2;
220 for(ii = *plMinimaL;ii <= *plMinimaR;ii++) *pdMinima += *(pdData+ii);
221 *pdMinima = *pdMinima/(double)(*plMinimaR - *plMinimaL + 1);
222 if(lPrint)printf(
"- [%6d %6d] %6d %6.1f\n",
227 for(lIndex=0;lIndex < lMaxIndex;lIndex++)
230 *(plMean+lIndex)=(*(plMeanL+lIndex)+*(plMeanR+lIndex))/2;
231 if(lPrint)printf(
"+ [%6d %6d] %6d\n",
236 *(plMinima+lIndex+1) = (*(plMinimaL+lIndex+1) + *(plMinimaR+lIndex+1))/2;
237 *(pdMinima+lIndex+1)=0.;
238 for(ii = *(plMinimaL+lIndex+1);ii <= *(plMinimaR+lIndex+1);ii++)
239 *(pdMinima+lIndex+1) += *(pdData+ii);
240 *(pdMinima+lIndex+1) = *(pdMinima+lIndex+1)/(double)(*(plMinimaR+lIndex+1) - *(plMinimaL+lIndex+1)+1);
241 if(lPrint)printf(
"- [%6d %6d] %6d %6.1f\n",
242 *(plMinimaL+lIndex+1),
243 *(plMinimaR+lIndex+1),
244 *(plMinima+lIndex+1),
245 *(pdMinima+lIndex+1));
247 ii = *(plMinimaL+lIndex+1) - *(plMinimaR+lIndex) + 1;
252 *(plMean+*plPeaks)=(
int)((dPos+(double)(*(plMinimaR+lIndex)))*dAver)+lFirstChan;
253 *(plWidth+*plPeaks) =(
int)(dSig*dAver + 0.5);
254 if(*(pdMinima+lIndex) < *(pdMinima+lIndex+1))
255 dSum=dSum-((double)ii * *(pdMinima+lIndex)+ (double)ii * (*(pdMinima+lIndex+1)-*(pdMinima+lIndex))/2.);
257 dSum=dSum-((double)ii * *(pdMinima+lIndex)- (double)ii * (*(pdMinima+lIndex)-*(pdMinima+lIndex+1))/2.);
258 *(pdIntegral+*plPeaks) = dSum*dAver;
267 if(lPrint)printf(
"Error, negative interval\n");
271 for(i=0;i<*plPeaks;i++)
275 pd=pdData+*(plMinima+i);
276 for(ii=*(plMinima+i);ii<*(plMinima+i+1);ii++){
if(dMax < *pd)dMax = *pd;
if(dMin > *pd)dMin = *pd; pd++;}
277 dMin=dMin+(dMax-dMin)/2.;
278 pd=pdData+*(plMinima+i);
279 for(lMax=*(plMinima+i);lMax<*(plMinima+i+1);lMax++){
if(dMax == *pd)
break; pd++;}
281 lRight=*(plMinima+i+1);
284 for(ii=lMax;ii<lRight;ii++){
if(dMin > *pd){lRight=ii;
break;}pd++;}
286 for(ii=lMax;ii>lLeft;ii--){
if(dMin > *pd){lLeft=ii;
break;}pd--;}
290 *(plMinima) = (
int)((double)(*(plMinima))*dAver + dAver/2.)+lFirstChan;
291 for(i=0;i<*plPeaks;i++)
294 *(plMaximum+i) = (
int)((double)(*(plMaximum+i))*dAver + dAver/2.)+lFirstChan;
295 *(plLeft+i) = (
int)((double)(*(plLeft+i))*dAver + dAver/2.)+lFirstChan;
296 *(plRight+i) = (
int)((double)(*(plRight+i))*dAver + dAver/2.)+lFirstChan;
297 *(plMinima+i+1) = (
int)((double)(*(plMinima+i+1))*dAver + dAver/2.)+lFirstChan;
299 if(lPrint)printf(
"peaks found %d\n",*plPeaks);
307 int go4fit_position(
int l_len,
double *pa_data,
double *pr_pos,
double *pr_sig,
double *pr_sum)
328 for(J = 1; J <= l_len; J++)
330 *pr_sum = *pr_sum + *pl_data;
331 d_sum_prod = d_sum_prod + J * *pl_data;
337 *pr_pos = (d_sum_prod/ *pr_sum + 0.5);
339 for(J = 1; J <= l_len; J++)
341 *pr_sig = *pr_sig + ((double)J - *pr_pos) * ((double)J - *pr_pos) * *pl_data;
344 *pr_sig = r_sig_f * sqrt(*pr_sig/ *pr_sum);
347 *pr_pos = *pr_pos -1.0;
void go4fit_find_peaks(void *pfData, int lType, int lFirstChan, int lPoints, int lAver, double dDeltaFact, double dDeltaMin, double *dNoise, int lPeaksMax, int *plPeaks, int *plMinima, double *pdMinima, int *plMean, int *plWidth, double *pdIntegral, int *plLeft, int *plMaximum, int *plRight, float *pfLowNoise, float *pfHighNoise)
int go4fit_position(int l_len, double *pa_data, double *pr_pos, double *pr_sig, double *pr_sum)