Tries to fix the situation when specified (input) TAC does not seem to contain peak or it starts too late to get reliable estimate of AUC.
271 {
272 int ri, ret, mini, maxi, n, warn=0, fixnr=0;
273 double minx, maxx, miny, maxy, dif, d, slope, ic;
274 char tmp[256];
275
276 if(verbose>0) printf("dftFixPeak(dft, %d)\n", verbose);
277
278 if(dft==NULL || dft->
frameNr<1 || dft->
voiNr<1)
return 1;
279
280
282
283
285 if(verbose>1) printf("TAC does not need to be corrected\n");
286 return 0;
287 }
288
289
290 if(dft->
x[0]<=0.001) {
291 if(verbose>1) printf("TAC already has zero sample\n");
292 return 2;
293 }
294
295
296 double zx, zy[dft->
voiNr];
298
299
300 for(ri=0; ri<dft->
voiNr; ri++) {
301 zy[ri]=0.0;
302 if(verbose>1 && dft->
voiNr>1)
303 printf(
"checking region %d: %s\n", 1+ri, dft->
voi[ri].
name);
304
305
307
308
309 ret=
dftMinMaxTAC(dft, ri, &minx, &maxx, &miny, &maxy, NULL, NULL,
310 &mini, &maxi);
311 if(ret!=0) {
312 if(verbose>0) printf("Error %d in dftMinMaxTAC()\n", ret);
313 return 1;
314 }
315
316
317
318 if(maxy<1.5*miny) {
319 if(verbose>0) printf("TAC does not have a clear peak.\n");
320 return 2;
321 }
322 if(maxy<5.0*miny) {
323 if(verbose>1) printf("TAC does not have a clear peak.\n");
324 warn++;
325 }
326
327
328
329 if(maxi==0) {
330 if(verbose>1) printf("peak at the first sample.\n");
332 dif=dft->
x1[maxi]/(dft->
x2[maxi]-dft->
x1[maxi]);
333 } else {
334 dif=dft->
x[maxi]/(dft->
x[maxi+1]-dft->
x[maxi]);
335 }
336 if(verbose>2) printf("dif := %g\n", dif);
337 if(dif>5.0) {
338 if(verbose>1)
339 printf("peak at the first sample, which is too late.\n");
340 return 2;
341 } else if(dif>1.0 && maxy<=10.*miny) {
342 if(verbose>1)
343 printf("peak at the first sample and bad peak/tail ratio.\n");
344 return 2;
345 }
346 if(verbose>1) printf("zero sample added.\n");
347
348 fixnr++; continue;
349 }
350
351
352
353 if(dft->
x[0]>0.75*maxx) {
354 if(dft->
voi[ri].
y[0]>0.50*maxy) {
355 if(verbose>1) printf("The first sample is relatively late and high.\n");
356 return 2;
357 }
358 }
359
360
361 n=maxi+1; if(n>6) n/=2; else if(n>3) n--;
363 &slope, &ic, &d, NULL);
364 if(ret!=0 || d>=maxx) {
365 if(verbose>0) printf("ascending part of TAC not available.\n");
366 if(verbose>1) printf("ret=%d\n", ret);
367 return 2;
368 }
369 if(verbose>2) {
370 printf("based on ascending part:\n");
371 printf(" slope: %g\n", slope);
372 printf(" ic: %g\n", ic);
373 printf(" new x intercept: %g\n", d);
374 }
376
377 zy[ri]=slope*zx+ic;
378 if(zy[ri]>0.5*dft->
voi[ri].
y[0]) zy[ri]=0.5*dft->
voi[ri].
y[0];
379 else if(zy[ri]<0.0) zy[ri]=0.0;
380 }
else if(dft->
voiNr>1) {
381
382 zy[ri]=slope*zx+ic;
383 if(zy[ri]>0.5*dft->
voi[ri].
y[0]) zy[ri]=0.5*dft->
voi[ri].
y[0];
384 else if(zy[ri]<0.0) zy[ri]=0.0;
385 } else {
386
387 if(d<0.0) {
388 if(ic<0.5*dft->voi[ri].y[0]) d=0.5*dft->
x[0];
else d=0.0;
389 }
390 if(d>=dft->
x[0]) d=0.5*dft->
x[0];
391 zx=d;
392 }
393 fixnr++;
394
395 }
396
397
398 if(fixnr>0) {
401 for(ri=0; ri<dft->
voiNr; ri++) {
402 dft->
voi[ri].
y[0]=zy[ri];
403 if(verbose>1) printf("zero sample added at (%g,%g).\n", zx, zy[ri]);
404 }
405 }
406
407
409 if(verbose>0) {
410 if(verbose>2) printf("dftVerifyPeak()=%d\n", ret);
411 if(verbose>1) fprintf(stderr, "Note: %s\n", tmp);
412 if(ret>1) printf("correction was not successful\n");
413 }
414 return(ret);
415}
int dftMinMaxTAC(DFT *dft, int tacindex, double *minx, double *maxx, double *miny, double *maxy, int *mini, int *maxi, int *mins, int *maxs)
int dftFillInitialGap(DFT *dft)
#define DFT_TIME_STARTEND
int highest_slope(double *x, double *y, int n, int slope_n, double *m, double *c, double *xi, double *xh)
char name[MAX_REGIONNAME_LEN+1]