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 for (ii = 0; ii < lPoints; ii++) {
81 *(pdData + ii) = (
double)*(pw + lAver * ii);
82 for (i = 1; i < lAver; i++)
83 *(pdData + ii) += (double)*(pw + lAver * ii + i);
84 *(pdData + ii) = *(pdData + ii) / dAver;
85 if (*(pdData + ii) > dMax)
86 dMax = *(pdData + ii);
87 if (*(pdData + ii) < dMin)
88 dMin = *(pdData + ii);
92 for (ii = 0; ii < lPoints; ii++) {
93 *(pdData + ii) = (
double)*(pl + lAver * ii);
94 for (i = 1; i < lAver; i++)
95 *(pdData + ii) += (double)*(pl + lAver * ii + i);
96 *(pdData + ii) = *(pdData + ii) / dAver;
97 if (*(pdData + ii) > dMax)
98 dMax = *(pdData + ii);
99 if (*(pdData + ii) < dMin)
100 dMin = *(pdData + ii);
104 for (ii = 0; ii < lPoints; ii++) {
105 *(pdData + ii) = (
double)*(pf + lAver * ii);
106 for (i = 1; i < lAver; i++)
107 *(pdData + ii) += (double)*(pf + lAver * ii + i);
108 *(pdData + ii) = *(pdData + ii) / dAver;
109 if (*(pdData + ii) > dMax)
110 dMax = *(pdData + ii);
111 if (*(pdData + ii) < dMin)
112 dMin = *(pdData + ii);
116 for (ii = 0; ii < lPoints; ii++) {
117 *(pdData + ii) = (
double)*(pd + lAver * ii);
118 for (i = 1; i < lAver; i++)
119 *(pdData + ii) += (double)*(pd + lAver * ii + i);
120 *(pdData + ii) = *(pdData + ii) / dAver;
121 if (*(pdData + ii) > dMax)
122 dMax = *(pdData + ii);
123 if (*(pdData + ii) < dMin)
124 dMin = *(pdData + ii);
128 printf(
"Data type %d not supported!\n", lType);
129 printf(
"Type 0: short, 1: int, 2: float, 3: double\n");
134 if (dNoise == NULL) {
135 for (ii = 0; ii < lPoints; ii++) {
136 if (*(pdData + ii) == 0.0)
137 *(pdNoise + ii) = dDeltaFact;
139 *(pdNoise + ii) = sqrt(*(pdData + ii)) * dDeltaFact;
140 if (dDeltaMin > *(pdNoise + ii))
141 *(pdNoise + ii) = dDeltaMin;
144 for (ii = 0; ii < lPoints; ii++) {
145 *(pdNoise + ii) = *(dNoise + lFirstChan + lAver * ii);
146 for (i = 1; i < lAver; i++)
147 *(pdNoise + ii) += *(dNoise + lFirstChan + lAver * ii + i);
148 *(pdNoise + ii) = *(pdNoise + ii) / dAver;
153 lIndexMax = lPoints - 1;
154 plMinimaL = (
int *)malloc(lPeaksMax*16);
157 plMeanL = (
int *)(plMinimaL+lPeaksMax);
158 plMinimaR = (
int *)(plMinimaL+2*lPeaksMax);
159 plMeanR = (
int *)(plMinimaL+3*lPeaksMax);
160 memset(plMinimaL,0,lPeaksMax*16);
163 dHigh = *pdData + dDelta;
164 dLow = *pdData - dDelta;
165 if(pfLowNoise)*pfLowNoise=dLow;
166 if(pfHighNoise)*pfHighNoise=dHigh;
173 while ((lIndex <= lIndexMax) & (lMaxIndex < lPeaksMax - 2)) {
174 dValue = *(pdData + lIndex);
175 if (dValue > dHigh) {
176 if (lDirection !=
UP) {
178 printf(
"%5d - %5d - %5d d %8.1f\n", lMinIndex, lLastDown, lIndex, dDelta);
179 *(plMinimaR + lMinIndex) = lIndex;
180 *(plMinimaL + lMinIndex) = lLastDown;
187 if (lDirection ==
UP) {
189 printf(
"%5d + %5d - %5d d %8.1f\n", lMaxIndex, lLastUp, lIndex, dDelta);
190 *(plMeanR + lMaxIndex) = lIndex;
191 *(plMeanL + lMaxIndex) = lLastUp;
198 if ((dValue < dLow) | (dValue > dHigh)) {
199 dDelta = *(pdNoise + lIndex);
200 dHigh = dValue + dDelta;
201 dLow = dValue - dDelta;
205 *(pfLowNoise + lIndex) = dLow;
207 *(pfHighNoise + lIndex) = dHigh;
209 if(lDirection ==
DOWN)
211 *(plMinimaL+lMinIndex)=lLastDown;
212 *(plMinimaR+lMinIndex)=lIndexMax;
213 if(lPrint)printf(
"%5d - %5d - %5d\n",
220 if(lPrint)printf(
"-------------------------\n");
221 if(lPrint)printf(
"Minima %d Maxima %d \n",lMinIndex,lMaxIndex);
223 if(lMinIndex != (lMaxIndex+1))
229 if(lPrint)printf(
"Error, wrong minima\n");
234 if(lPrint)printf(
" [ Left Right ] \n");
235 *plMinima = (*plMinimaL + *plMinimaR)/2;
237 for(ii = *plMinimaL;ii <= *plMinimaR;ii++) *pdMinima += *(pdData+ii);
238 *pdMinima = *pdMinima/(double)(*plMinimaR - *plMinimaL + 1);
239 if(lPrint)printf(
"- [%6d %6d] %6d %6.1f\n",
244 for (lIndex = 0; lIndex < lMaxIndex; lIndex++) {
246 *(plMean + lIndex) = (*(plMeanL + lIndex) + *(plMeanR + lIndex)) / 2;
248 printf(
"+ [%6d %6d] %6d\n", *(plMeanL + lIndex), *(plMeanR + lIndex), *(plMean + lIndex));
250 *(plMinima + lIndex + 1) = (*(plMinimaL + lIndex + 1) + *(plMinimaR + lIndex + 1)) / 2;
251 *(pdMinima + lIndex + 1) = 0.;
252 for (ii = *(plMinimaL + lIndex + 1); ii <= *(plMinimaR + lIndex + 1); ii++)
253 *(pdMinima + lIndex + 1) += *(pdData + ii);
254 *(pdMinima + lIndex + 1) =
255 *(pdMinima + lIndex + 1) / (double)(*(plMinimaR + lIndex + 1) - *(plMinimaL + lIndex + 1) + 1);
257 printf(
"- [%6d %6d] %6d %6.1f\n", *(plMinimaL + lIndex + 1), *(plMinimaR + lIndex + 1),
258 *(plMinima + lIndex + 1), *(pdMinima + lIndex + 1));
260 ii = *(plMinimaL + lIndex + 1) - *(plMinimaR + lIndex) + 1;
262 go4fit_position(ii, pdData + *(plMinimaR + lIndex), &dPos, &dSig, &dSum);
264 *(plMean + *plPeaks) = (
int)((dPos + (double)(*(plMinimaR + lIndex))) * dAver) + lFirstChan;
265 *(plWidth + *plPeaks) = (
int)(dSig * dAver + 0.5);
266 if (*(pdMinima + lIndex) < *(pdMinima + lIndex + 1))
267 dSum = dSum - ((double)ii * *(pdMinima + lIndex) +
268 (double)ii * (*(pdMinima + lIndex + 1) - *(pdMinima + lIndex)) / 2.);
270 dSum = dSum - ((double)ii * *(pdMinima + lIndex) -
271 (double)ii * (*(pdMinima + lIndex) - *(pdMinima + lIndex + 1)) / 2.);
272 *(pdIntegral + *plPeaks) = dSum * dAver;
280 printf(
"Error, negative interval\n");
284 for (i = 0; i < *plPeaks; i++) {
287 pd = pdData + *(plMinima + i);
288 for (ii = *(plMinima + i); ii < *(plMinima + i + 1); ii++) {
295 dMin = dMin + (dMax - dMin) / 2.;
296 pd = pdData + *(plMinima + i);
297 for (lMax = *(plMinima + i); lMax < *(plMinima + i + 1); lMax++) {
302 lLeft = *(plMinima + i);
303 lRight = *(plMinima + i + 1);
304 *(plMaximum + i) = lMax;
306 for (ii = lMax; ii < lRight; ii++) {
314 for (ii = lMax; ii > lLeft; ii--) {
321 *(plLeft + i) = lLeft;
322 *(plRight + i) = lRight;
324 *(plMinima) = (
int)((double)(*(plMinima))*dAver + dAver/2.)+lFirstChan;
325 for (i = 0; i < *plPeaks; i++) {
327 *(plMaximum + i) = (
int)((double)(*(plMaximum + i)) * dAver + dAver / 2.) + lFirstChan;
328 *(plLeft + i) = (
int)((double)(*(plLeft + i)) * dAver + dAver / 2.) + lFirstChan;
329 *(plRight + i) = (
int)((double)(*(plRight + i)) * dAver + dAver / 2.) + lFirstChan;
330 *(plMinima + i + 1) = (
int)((double)(*(plMinima + i + 1)) * dAver + dAver / 2.) + lFirstChan;
333 printf(
"peaks found %d\n", *plPeaks);