24 free((
char*)(fit->
voi));
42 memset(fit, 0,
sizeof(
FIT));
60 int i, j, n, savedNr=0;
61 char tmp[1024], is_stdout=0;
67 if(fit==NULL || fit->
voiNr<1) {strcpy(
fiterrmsg,
"no data");
return 1;}
68 for(i=0; i<fit->
voiNr; i++)
70 if(savedNr<1) {strcpy(
fiterrmsg,
"no fitted data");
return 1;}
73 if(!strcmp(filename,
"stdout")) is_stdout=1;
75 if(is_stdout) printf(
" output is stdout()\n");
76 else printf(
" output in file\n");
83 if(is_stdout) fp=(FILE*)stdout;
85 if(
MATHFUNC_TEST>2) printf(
"opening file %s for write\n", filename);
86 if((fp = fopen(filename,
"w")) == NULL) {
87 strcpy(
fiterrmsg,
"cannot open file");
return 2;
92 n=fprintf(fp,
"%-11.11s %s\n", FIT_VER, fit->
program);
95 if(!is_stdout) fclose(fp);
100 fprintf(fp,
"Date:\t%s\n", tmp);
102 fprintf(fp,
"Data file:\t%s\n", fit->
datafile);
104 if(fit->
studynr[0]) fprintf(fp,
"Study number:\t%s\n", fit->
studynr);
106 fprintf(fp,
"Data unit:\t%s\n", fit->
unit);
114 fprintf(fp,
"Nr of VOIs:\t%d\n", savedNr);
116 fprintf(fp,
"%s %s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
117 "Region",
"Plane",
"Start",
"End",
"dataNr",
"WSS",
"parNr",
"Type",
"Parameters");
119 for(i=0; i<fit->
voiNr; i++) {
122 else strcpy(tmp,
".");
125 else strcpy(tmp,
".");
128 else strcpy(tmp,
".");
130 fprintf(fp,
"%.3f\t%.3f\t%d\t%.2E\t%d\t%04d",
133 for(j=0; j<fit->
voi[i].
parNr; j++) fprintf(fp,
"\t%.6E", fit->
voi[i].
p[j]);
140 fflush(fp); fclose(fp);
161 if(fit==NULL || voiNr<1)
return 1;
168 if(fit->
voi==NULL)
return 2;
184 if(fit==NULL) {printf(
"FIT = Null\n");
return;}
204 char *cptr, line[1024], *lptr;
205 int i, ri, n, type=0;
209 if(verbose>0) printf(
"fitRead(%s)\n", filename);
210 if(fit==NULL)
return 1;
215 FILE *fp=fopen(filename,
"r");
216 if(fp==NULL) {strcpy(
fiterrmsg,
"cannot open file");
return 1;}
221 while(fgets(line, 1024, fp)!=NULL) {
223 if(strlen(line)<4 || line[0]==
'#')
continue;
225 if(!strncmp(line, FIT_VER, strlen(FIT_VER))) type=1;
else type=0;
228 if(type!=1) {fclose(fp);
return 3;}
229 lptr=line; cptr=strtok(lptr,
" \t\n\r");
230 if(cptr!=NULL) cptr=strtok(NULL,
" \t\n\r");
231 if(cptr!=NULL && strlen(cptr)<1024) strcpy(fit->
program, cptr);
235 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
237 if(strncasecmp(line,
"Nr of VOIs:", 11)==0)
break;
239 if(strncasecmp(line,
"Date:", 5)==0) {
240 cptr=line+5;
while(*cptr && !isdigit(*cptr)) cptr++;
245 if(strncasecmp(line,
"Data file:", 10)==0) {
246 lptr=&line[10]; cptr=strtok(lptr,
" \t\n\r");
247 if(cptr!=NULL && strlen(cptr)<FILENAME_MAX) strcpy(fit->
datafile, cptr);
251 if(strncasecmp(line,
"Study number:", 13)==0) {
252 lptr=&line[13]; cptr=strtok(lptr,
" \t\n\r");
257 if(strncasecmp(line,
"Data unit:", 10)==0) {
258 lptr=&line[10]; cptr=strtok(lptr,
" \t\n\r");
259 if(cptr!=NULL && strlen(cptr)<1024) strcpy(fit->
unit, cptr);
263 if(strncasecmp(line,
"Time unit:", 10)==0) {
264 lptr=&line[10]; cptr=strtok(lptr,
" \t\n\r");
268 if(strncasecmp(line,
"Distance unit:", 14)==0) {
269 lptr=&line[14]; cptr=strtok(lptr,
" \t\n\r");
273 fclose(fp);
return 8;
276 if(strncasecmp(line,
"Nr of VOIs:", 11)) {fclose(fp);
return 8;}
277 lptr=&line[11]; cptr=strtok(lptr,
" \t\n\r");
278 n=atoi(cptr);
if(n<1 || n>32000) {fclose(fp);
return 8;}
284 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
285 if(strncasecmp(line,
"Region", 6)) {fclose(fp);
return 10;}
287 for(ri=0; ri<fit->
voiNr; ri++) {
290 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
292 int pindx=0;
char seps[8];
295 if(tn==sn || tn==sn-1 || tn==sn-2) {
296 strcpy(seps,
"\t\n\r"); n=tn;
299 int i=0, n=strlen(s);
303 cptr=s+i;
if(i<n) {cptr++; i++;}
307 cptr=s+i;
if(i<n) {cptr++; i++;}
313 strcpy(seps,
" \t\n\r"); n=sn;
331 for(i=0; i<fit->
voi[ri].
parNr; i++) {
335 if(ri==0) {fclose(fp);
fitEmpty(fit);
return(12);}
336 if(ri<fit->voiNr) fit->
voiNr=ri;
342 if(verbose>1) printf(
"done fitRead()\n");
360 case 100: strcpy(str,
"f(x)=A");
break;
361 case 101: strcpy(str,
"f(x)=A+B*x");
break;
362 case 102: strcpy(str,
"f(x)=A+B*x+C*x^2");
break;
363 case 103: strcpy(str,
"f(x)=A+B*x+C*x^2+D*x^3");
break;
364 case 104: strcpy(str,
"f(x)=A+B*x+C*x^2+D*x^3+E*x^4");
break;
365 case 105: strcpy(str,
"f(x)=A+B*x+C*x^2+D*x^3+E*x^4+F*x^5");
break;
366 case 106: strcpy(str,
"f(x)=A+B*x+C*x^2+D*x^3+E*x^4+F*x^5+G*x^6");
break;
367 case 107: strcpy(str,
"f(x)=A+B*x+C*x^2+D*x^3+E*x^4+F*x^5+G*x^6+H*x^7");
break;
368 case 108: strcpy(str,
"f(x)=A+B*x+C*x^2+D*x^3+E*x^4+F*x^5+G*x^6+H*x^7+I*x^8");
break;
369 case 109: strcpy(str,
"f(x)=A+B*x+C*x^2+D*x^3+E*x^4+F*x^5+G*x^6+H*x^7+I*x^8+J*x^9");
break;
371 case 211: strcpy(str,
"f(x)=(A+C*x)/(B+D*x)");
break;
372 case 221: strcpy(str,
"f(x)=(A+C*x+E*x^2)/(B+D*x)");
break;
373 case 222: strcpy(str,
"f(x)=(A+C*x+E*x^2)/(B+D*x+F*x^2)");
break;
374 case 232: strcpy(str,
"f(x)=(A+C*x+E*x^2+G*x^3)/(B+D*x+F*x^2)");
break;
375 case 233: strcpy(str,
"f(x)=(A+C*x+E*x^2+G*x^3)/(B+D*x+F*x^2+H*x^3)");
break;
376 case 1232: strcpy(str,
"f(x)=(A+C*(x-t)+E*(x-t)^2+G*(x-t)^3)/(B+D*(x-t)+F*(x-t)^2)");
break;
378 case 2233: strcpy(str,
"f(x)=1/(1-H*(1-r(x))), where r(x) is 3/3 order rational function for RBC-to-plasma");
break;
380 case 301: strcpy(str,
"f(x)=A*exp(B*x)");
break;
381 case 302: strcpy(str,
"f(x)=A*exp(B*x)+C*exp(D*x)");
break;
382 case 303: strcpy(str,
"f(x)=A*exp(B*x)+C*exp(D*x)+E*exp(F*x)");
break;
383 case 304: strcpy(str,
"f(x)=A*exp(B*x)+C*exp(D*x)+E*exp(F*x)+G*exp(H*x)");
break;
384 case 305: strcpy(str,
"f(x)=A*exp(B*x)+C*exp(D*x)+E*exp(F*x)+G*exp(H*x)+I*exp(J*x)");
break;
386 case 1312: strcpy(str,
"f(x)=(A*(x-t)-C)*exp(B*(x-t))+C*exp(D*(x-t))");
break;
387 case 1313: strcpy(str,
"f(x)=(A*(x-t)-C-E)*exp(B*(x-t))+C*exp(D*(x-t))+E*exp(F*(x-t))");
break;
388 case 1314: strcpy(str,
"f(x)=(A*(x-t)-C-E-G)*exp(B*(x-t))+C*exp(D*(x-t))+E*exp(F*(x-t))+G*exp(H*(x-t))");
break;
389 case 2313: strcpy(str,
"f(x)=1/(1-A*(1-((B*x-D-F)*exp(C*x)+D*exp(E*x)+F*exp(G*x))))");
break;
391 case 321: strcpy(str,
"f(x)=A*exp(B*x)*(1-exp(C*x))");
break;
392 case 322: strcpy(str,
"f(x)=A*exp(B*x)*(1-exp(C*x))+D*exp(E*x)*(1-exp(F*x))");
break;
393 case 323: strcpy(str,
"f(x)=A*exp(B*x)*(1-exp(C*x))+D*exp(E*x)*(1-exp(F*x))+G*exp(H*x)*(1-exp(I*x))");
break;
394 case 1321: strcpy(str,
"f(x)=A*exp(-B*(x-t))*(1-exp(-C*(x-t))) + D*(A/(B*(B+C)))*(C-((B+C)*exp(C*(x-t))-B)*exp(-(B+C)*(x-t))) ");
break;
396 case 331: strcpy(str,
"f(x)=(1/Ti)*Sum[i=1..n, (Ai/Li)*(exp(-Li*(x-tA-Ti)) - exp(-Li*(x-Ta)))], when x>=Ta+Ti\nf(x)=(1/Ti)*Sum[i=1..n, (Ai/Li)*(1-exp(-Li*(t-Ta)))], when x>Ta and x<Ta+Ti\nf(x)=0, when t<=Ta");
399 case 332: strcpy(str,
"f(x)=0, when x<=Ta \nf(x)=(A/L^2)*(1-exp(-L(x-Ta))), when Ta<x<=Ta+Ti \nf(x)=(A/L^2)*(exp(-L*Ti)+exp(-L(x-Ta-Ti))-2exp(-L(x-t1))), when x>Ta+Ti");
402 case 334: strcpy(str,
"f(x)=0, when x<=t1 \nf(x)=A*(1-exp(L(t1-x)))/(1-exp(L*(t1-t2))), when t1<x<=t2 \nf(x)=A*(exp(L(t2-x))-exp(L(t1-x)))/(1-exp(L*(t1-t2))), when x>t2");
405 case 351: strcpy(str,
"f(x)=1-a*(2-exp(-b*x)-exp(-c*x))");
break;
407 case 403: strcpy(str,
"f(x)=A*(1-B*gammacdf(D,C*(x-t)))");
break;
409 case 1401: strcpy(str,
"f(x)=A*((x-D)^B)*exp(-(x-D)/C) , when x>=D, else f(x)=0");
break;
411 case 1402: strcpy(str,
"f(x)=A*((x-D)^B)*exp(-(x-D)/C) + E , when x>=D, else f(x)=E");
break;
413 case 1403: strcpy(str,
"f(x)=B*((x-A)^C)*exp(-(x-A)/D) + E*(1-exp(-(x-A)/D))*exp(-(x-A)/F) , when x>A, else f(x)=0");
break;
415 case 1421: strcpy(str,
"f(x)=A*(1-exp(-((x-t)/B)^C) , when x>t, else f(x)=0");
break;
417 case 1423: strcpy(str,
"f(x)=A*[C*((x-t)/B)^(C-1)*exp(-((x-t)/B)^C))/B + k*(1-exp(-((x-t)/B)^C))] , when x>t, else f(x)=0");
break;
419 case 1430: strcpy(str,
"f(x)=A*(x-t)*exp(-B*(x-t)) + C*(x-t)*exp(-D*(x-t)) + ... , when x-t>0, else f(x)=0");
break;
421 case 1431: strcpy(str,
"f(x)=A*x*exp(-B*x)*B^2 , when x>0, else f(x)=0");
break;
423 case 1432: strcpy(str,
"f(x)=A*x*exp(-B*x) , when x>0, else f(x)=0");
break;
425 case 1433: strcpy(str,
"f(x)=A*[x*exp(-B*x) + (C/B^2)*(1-(B*x+1)*exp(-B*x))], when x>0, else f(x)=0");
break;
427 case 1434: strcpy(str,
"f(x)=1/(1-H*(1-r(x))), where r(x) is function for RBC-to-plasma");
break;
429 case 1435: strcpy(str,
"f(x)=b*(m*(x-t)*exp(-n*a*(x-t)) + exp(-a*(-t)x)) , when x>t, else f(x)=0");
break;
431 case 1441: strcpy(str,
"f(x)=A*(k^n)*(x^(n-1))*exp(-k*x)/(n-1)! , when x>0, else f(x)=0");
break;
433 case 1801: strcpy(str,
"f(x)=[A*(x-t)^B]/[(x-t)^B+C^B]");
break;
434 case 1811: strcpy(str,
"f(x)=A*{[B*(x-t)^(B-1)]/[C^B+(x-t)^B] - [B*(x-t)^(2*B-1)]/[C^B+(x-t)^B]^2}");
break;
435 case 1821: strcpy(str,
"f(x)=A*{[B*(x-t)^(B-1)]/[C^B+(x-t)^B] - [B*(x-t)^(2*B-1)]/[C^B+(x-t)^B]^2 + K*(x-t)^B]/[(x-t)^B+C^B}");
break;
437 case 1833: strcpy(str,
"f(x)=A*[(x-D)*exp(-B*(x-D)) + (A*C/B^2)*(1-(B*(x-D)+1)*exp(-B*(x-D)))], when x>D, else f(x)=0");
break;
439 case 2801: strcpy(str,
"f(x)=B+[A-B]/[1+(C/x)^D]");
break;
440 case 2802: strcpy(str,
"f(x)=B+[A-B]/[1+10^{(C-x)*D}]");
break;
442 case 831: strcpy(str,
"f(x)=B*(C*exp(-D*(x-A)^3/((x-A)^2+E))+(1-C)*exp(-F*(x-A))), when x>A, else f(x)=B");
break;
444 case 841: strcpy(str,
"f(x)=(A*x^B)/(x^B+C)");
break;
445 case 842: strcpy(str,
"f(x)=1-((A*x^B)/(x^B+C))");
break;
446 case 843: strcpy(str,
"f(x)=1-((A*(1+D*x)*x^B)/(x^B+C))");
break;
447 case 844: strcpy(str,
"f(x)=(A*(x-t)^B)/((x-t)^B+C)+D, when x>t, else f(x)=D");
break;
448 case 845: strcpy(str,
"f(x)=A-(A*x^B)/(x^B+C))");
break;
449 case 846: strcpy(str,
"f(x)=D+((A-D)*(x-t)^B)/((x-t)^B+C), when x>t, else f(x)=D");
break;
450 case 847: strcpy(str,
"f(x)=1-D-((A-D)*(x-t)^B)/((x-t)^B+C), when x>t, else f(x)=1-A");
break;
451 case 848: strcpy(str,
"f(x)=D*((1-A)*(x-t)^B)/((x-t)^B+C), when x>t, else f(x)=D");
break;
452 case 849: strcpy(str,
"f(x)=1-D*((1-A)*(x-t)^B)/((x-t)^B+C), when x>t, else f(x)=1-A");
break;
454 case 2841: strcpy(str,
"f(x)=1/(1-H*(1-r(x))), where r(x) is Hill function for RBC-to-plasma");
break;
456 case 851: strcpy(str,
"f(x)=1/(1+(A*x)^2)^B");
break;
457 case 852: strcpy(str,
"f(x)=1-1/(1+(A*x)^2)^B");
break;
459 case 861: strcpy(str,
"f(x)=(1+(A*(x-t))^B)^(-C), when x>t, else f(x)=1");
break;
460 case 862: strcpy(str,
"f(x)=1-(1+(A*(x-t))^B)^(-C), when x>t, else f(x)=0");
break;
462 case 863: strcpy(str,
"f(x)=(D^(-1/C)+(A*(x-t))^B)^(-C), when x>t, else f(x)=D");
break;
463 case 864: strcpy(str,
"f(x)=1-(D^(-1/C)+(A*(x-t))^B)^(-C), when x>t, else f(x)=1-D");
break;
467 strcpy(str,
"f(x)=1-f1(x)-f2(x)-f3(x)");
break;
470 strcpy(str,
"f1(x)=a(x)(1-b(x)-c(x)+b(x)c(x))/(1-a(x)b(x)-a(x)c(x)-b(x)c(x)+2a(x)b(x)c(x))");
break;
473 strcpy(str,
"f2(x)=b(x)(1-a(x)-c(x)+a(x)c(x))/(1-a(x)b(x)-a(x)c(x)-b(x)c(x)+2a(x)b(x)c(x))");
break;
476 strcpy(str,
"f3(x)=c(x)(1-a(x)-b(x)+a(x)b(x))/(1-a(x)b(x)-a(x)c(x)-b(x)c(x)+2a(x)b(x)c(x))");
break;
478 strcpy(str,
"f(x)=p2 when x>=p1, f(x)=p4 when x>=p2, ...");
break;
481 case 2111: strcpy(str,
"P(x)=(C/2)*(erf((x-d+R)/(sqrt(2)*FWHM/2355))-erf((x-d-R)/(sqrt(2)*FWHM/2355)))+bkg");
484 case 3331: strcpy(str,
"f(x)=(1/Ti)*Sum[i=1..n, (Ai/Li)*(exp(-Li*(x-tA-Ti)) - exp(-Li*(x-Ta)))], when x>=Ta+Ti\nf(x)=(1/Ti)*Sum[i=1..n, (Ai/Li)*(1-exp(-Li*(t-Ta)))], when x>Ta and x<Ta+Ti\nf(x)=0, when t<=Ta, with additional delay and dispersion");
488 case 9501: strcpy(str,
"Cp(t)<=>Ci(t)<=>Ct(t)");
break;
490 case 9502: strcpy(str,
"Ce(t)<=>Cp(t)<=>Ci(t)<=>Ct(t)");
break;
492 case 9503: strcpy(str,
"Cpa(t)<=>Cia(t)<=>Cta(t)->Ctm(t)<=>Cim(t)<=>Cpm(t)");
break;
494 case 9601: strcpy(str,
"C4(t)<=>C3(t)<-C0(t)->C1(t)<=>C2(t)");
break;
496 case 9602: strcpy(str,
"Cpa(t)<=>Cta(t)->Ctm(t)<=>Cpm(t)");
break;
498 case 9603: strcpy(str,
"Cpa(t)->Ct1(t)<=>Cpm(t)<=>Ct2(t)");
break;
500 case 9701: strcpy(str,
"Ideal bolus -> n compartments");
break;
519 case 100: strcpy(str,
"f(x)=A");
break;
520 case 101: strcpy(str,
"line");
break;
521 case 102: strcpy(str,
"2nd order polynomial");
break;
522 case 103: strcpy(str,
"3rd order polynomial");
break;
523 case 104: strcpy(str,
"4th order polynomial");
break;
524 case 105: strcpy(str,
"5th order polynomial");
break;
525 case 106: strcpy(str,
"6th order polynomial");
break;
526 case 107: strcpy(str,
"7th order polynomial");
break;
527 case 108: strcpy(str,
"8th order polynomial");
break;
528 case 109: strcpy(str,
"9th order polynomial");
break;
529 case 211: strcpy(str,
"1/1 order rational function");
break;
530 case 221: strcpy(str,
"2/1 order rational function");
break;
531 case 222: strcpy(str,
"2/2 order rational function");
break;
532 case 232: strcpy(str,
"3/2 order rational function");
break;
533 case 233: strcpy(str,
"3/3 order rational function");
break;
534 case 1232: strcpy(str,
"3/2 order rational function with delay");
break;
535 case 2233: strcpy(str,
"3/3 order rational function for plasma-to-blood ratio");
break;
536 case 301: strcpy(str,
"exponential function");
break;
537 case 302: strcpy(str,
"sum of 2 exponential functions");
break;
538 case 303: strcpy(str,
"sum of 3 exponential functions");
break;
539 case 304: strcpy(str,
"sum of 4 exponential functions");
break;
540 case 305: strcpy(str,
"sum of 5 exponential functions");
break;
541 case 1312: strcpy(str,
"Feng model 2 function with 2 exponentials");
break;
542 case 1313: strcpy(str,
"Feng model 2 function");
break;
543 case 1314: strcpy(str,
"Feng model 2 function with 4 exponentials");
break;
544 case 2313: strcpy(str,
"Feng M2 function for plasma-to-blood ratio");
break;
545 case 321: strcpy(str,
"Lundqvist function");
break;
546 case 322: strcpy(str,
"sum of 2 Lundqvist functions");
break;
547 case 323: strcpy(str,
"sum of 3 Lundqvist functions");
break;
548 case 1321: strcpy(str,
"Lundqvist function with integral and delay");
break;
549 case 331: strcpy(str,
"Exponential bolus infusion function");
break;
550 case 332: strcpy(str,
"Kudomi's exponential bolus infusion function for radiowater");
break;
551 case 334: strcpy(str,
"Exponential bolus function approaching zero");
break;
552 case 351: strcpy(str,
"Exponential function for [C-11]PK11195 plasma fractions");
break;
553 case 403: strcpy(str,
"Inverted gamma cdf for plasma parent fraction");
break;
554 case 1401: strcpy(str,
"Gamma variate function");
break;
555 case 1402: strcpy(str,
"Gamma variate with background");
break;
556 case 1403: strcpy(str,
"Gamma variate bolus plus recirculation");
break;
557 case 1421: strcpy(str,
"Weibull cdf with delay");
break;
558 case 1423: strcpy(str,
"Weibull cdf and derivative with delay");
break;
559 case 1430: strcpy(str,
"Sum of surge functions with delay");
break;
560 case 1431: strcpy(str,
"Surge function");
break;
561 case 1432: strcpy(str,
"Surge function (trad)");
break;
562 case 1433: strcpy(str,
"Surge function with recirculation");
break;
563 case 1434: strcpy(str,
"Surge function with recirculation for plasma-to-blood ratio");
break;
564 case 1435: strcpy(str,
"Surge function for late FDG AIF");
break;
565 case 1441: strcpy(str,
"Probability density function of Erlang distribution");
break;
566 case 1801: strcpy(str,
"Hill function with delay");
break;
567 case 1811: strcpy(str,
"Derivative of Hill function with delay");
break;
568 case 1821: strcpy(str,
"Sum of Hill function and derivative with delay");
break;
569 case 1833: strcpy(str,
"Surge function with recirculation and delay");
break;
570 case 2801: strcpy(str,
"Hill function for dose-response curve on linear scale");
break;
571 case 2802: strcpy(str,
"Hill function for dose-response curve on log scale");
break;
572 case 831: strcpy(str,
"Exponential/Power function for parent fractions");
break;
573 case 841: strcpy(str,
"Hill function");
break;
574 case 842: strcpy(str,
"Hill function (1-f(x))");
break;
575 case 843: strcpy(str,
"Hill function (1-f(x)) with ascending or descending end");
break;
576 case 844: strcpy(str,
"Hill function with background");
break;
577 case 845: strcpy(str,
"Hill function (A-f(x))");
break;
578 case 846: strcpy(str,
"Extended Hill function for plasma parent fraction");
break;
579 case 847: strcpy(str,
"Extended Hill function for plasma metabolite fraction");
break;
580 case 848: strcpy(str,
"Extended Hill function #2 for plasma parent fraction");
break;
581 case 849: strcpy(str,
"Extended Hill function #2 for plasma metabolite fraction");
break;
582 case 851: strcpy(str,
"Mamede function");
break;
583 case 852: strcpy(str,
"Mamede function (1-f(x)");
break;
584 case 861: strcpy(str,
"Meyer parent fraction function");
break;
585 case 862: strcpy(str,
"Meyer metabolite fraction function");
break;
586 case 863: strcpy(str,
"Extended Meyer parent fraction function");
break;
587 case 864: strcpy(str,
"Extended Meyer metabolite fraction function");
break;
588 case 871: strcpy(str,
"1-3 metabolite Hill function for parent");
break;
589 case 872: strcpy(str,
"1-3 metabolite Hill function for metab1");
break;
590 case 873: strcpy(str,
"1-3 metabolite Hill function for metab2");
break;
591 case 874: strcpy(str,
"1-3 metabolite Hill function for metab3");
break;
592 case 881: strcpy(str,
"1-3 metabolite power function for parent");
break;
593 case 882: strcpy(str,
"1-3 metabolite power function for metab1");
break;
594 case 883: strcpy(str,
"1-3 metabolite power function for metab2");
break;
595 case 884: strcpy(str,
"1-3 metabolite power function for metab3");
break;
596 case 1010: strcpy(str,
"Step function");
break;
597 case 2111: strcpy(str,
"Image profile function");
break;
598 case 2841: strcpy(str,
"Hill function for plasma-to-blood ratio");
break;
599 case 3331: strcpy(str,
"Exponential bolus infusion function with delay and dispersion");
break;
600 case 9501: strcpy(str,
"Graham's input function");
break;
601 case 9502: strcpy(str,
"Extended Graham's input function");
break;
602 case 9503: strcpy(str,
"Graham's input function with metabolite");
break;
603 case 9601: strcpy(str,
"Huang's plasma metabolite model");
break;
604 case 9602: strcpy(str,
"Extended Carson's plasma metabolite model");
break;
605 case 9603: strcpy(str,
"New plasma metabolite model");
break;
606 case 9701: strcpy(str,
"Multilinear multicompartmental TAC fitting model");
break;
626 double a, b, f, sqrx, cubx, xt;
629 double mf[]={0.0,0.0,0.0};
631 if(r==NULL)
return(1);
633 printf(
"fitEval(r, %g, %g): type=%d ;", x, *y, r->
type);
634 for(i=0; i<r->
parNr; i++) printf(
" %g", r->
p[i]);
637 if(y==NULL)
return(1);
650 n=r->
type-99; f=0.0;
for(i=n-1; i>0; i--) {f+=r->
p[i]; f*=x;} f+=r->
p[0];
654 a=r->
p[0]+r->
p[2]*x; b=r->
p[1]+r->
p[3]*x;
if(b==0.0)
break;
659 a=r->
p[0]+r->
p[2]*x+r->
p[4]*sqrx; b=r->
p[1]+r->
p[3]*x;
if(b==0.0)
break;
664 a=r->
p[0]+r->
p[2]*x+r->
p[4]*sqrx;
665 b=r->
p[1]+r->
p[3]*x+r->
p[5]*sqrx;
if(b==0.0)
break;
669 sqrx=x*x; cubx=sqrx*x;
670 a=r->
p[0]+r->
p[2]*x+r->
p[4]*sqrx+r->
p[6]*cubx;
671 b=r->
p[1]+r->
p[3]*x+r->
p[5]*sqrx;
if(b==0.0)
break;
675 sqrx=x*x; cubx=sqrx*x;
676 a=r->
p[0]+r->
p[2]*x+r->
p[4]*sqrx+r->
p[6]*cubx;
677 b=r->
p[1]+r->
p[3]*x+r->
p[5]*sqrx+r->
p[7]*cubx;
if(b==0.0)
break;
681 f=r->
p[0]*exp(r->
p[1]*x); *y=f;
685 a=r->
p[0]*exp(r->
p[1]*x); f+=a;
686 a=r->
p[2]*exp(r->
p[3]*x); f+=a;
691 a=r->
p[0]*exp(r->
p[1]*x); f+=a;
692 a=r->
p[2]*exp(r->
p[3]*x); f+=a;
693 a=r->
p[4]*exp(r->
p[5]*x); f+=a;
698 a=r->
p[0]*exp(r->
p[1]*x); f+=a;
699 a=r->
p[2]*exp(r->
p[3]*x); f+=a;
700 a=r->
p[4]*exp(r->
p[5]*x); f+=a;
701 a=r->
p[6]*exp(r->
p[7]*x); f+=a;
706 a=r->
p[0]*exp(r->
p[1]*x); f+=a;
707 a=r->
p[2]*exp(r->
p[3]*x); f+=a;
708 a=r->
p[4]*exp(r->
p[5]*x); f+=a;
709 a=r->
p[6]*exp(r->
p[7]*x); f+=a;
710 a=r->
p[8]*exp(r->
p[9]*x); f+=a;
714 f=r->
p[0]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x));
719 a=r->
p[0]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)); f+=a;
720 a=r->
p[3]*exp(r->
p[4]*x)*(1.0-exp(r->
p[5]*x)); f+=a;
725 a=r->
p[0]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)); f+=a;
726 a=r->
p[3]*exp(r->
p[4]*x)*(1.0-exp(r->
p[5]*x)); f+=a;
727 a=r->
p[6]*exp(r->
p[7]*x)*(1.0-exp(r->
p[8]*x)); f+=a;
732 xt=x-r->
p[4];
if(xt<=0.0) {
735 a=exp(-r->
p[2]*xt); f=r->
p[0]*exp(-r->
p[1]*xt)*(1.0-a);
737 f+=r->
p[3]*(r->
p[0]/(r->
p[1]*(r->
p[1]+r->
p[2])))
738 *(r->
p[2]-((r->
p[1]+r->
p[2])/a-r->
p[1])*exp(-(r->
p[1]+r->
p[2])*xt));
746 else if(x<r->p[0]+r->
p[1]) {
747 for(i=0, f=0.0; i<n; i++) {
748 if(r->
p[2*i+3]>1.0E-12) b=r->
p[2*i+2]/r->
p[2*i+3];
else b=r->
p[2*i+2];
749 f+=b*(1.0-exp(-r->
p[2*i+3]*(x-r->
p[0])));
751 if(r->
p[1]>0.0) f*=(1.0/r->
p[1]);
754 for(i=0, f=0.0; i<n; i++) {
755 if(r->
p[2*i+3]>1.0E-12) b=r->
p[2*i+2]/r->
p[2*i+3];
else b=r->
p[2*i+2];
756 f+=b*(exp(-r->
p[2*i+3]*(x-r->
p[0]-r->
p[1])) - exp(-r->
p[2*i+3]*(x-r->
p[0])));
758 if(r->
p[1]>0.0) f*=(1.0/r->
p[1]);
765 else if(x<=r->p[0]+r->
p[1]) {
766 f=exp(-r->
p[3]*(x-r->
p[0]));
767 *y=(r->
p[2]/(r->
p[3]*r->
p[3]))*(1.0-f);
769 f=exp(-r->
p[3]*r->
p[1]);
770 f+=exp(-r->
p[3]*(x-r->
p[0]-r->
p[1]));
771 f-=2.0*exp(-r->
p[3]*(x-r->
p[0]));
772 *y=(r->
p[2]/(r->
p[3]*r->
p[3]))*f;
778 else if(x>r->
p[0] && x<=r->p[1]) {
779 *y=r->
p[2]*(1.0-exp(r->
p[3]*(r->
p[0]-x)))/(1.0-exp(r->
p[3]*(r->
p[0]-r->
p[1])));
781 *y=r->
p[2]*(exp(r->
p[3]*(r->
p[1]-x))-exp(r->
p[3]*(r->
p[0]-x)))/(1.0-exp(r->
p[3]*(r->
p[0]-r->
p[1])));
785 f=1.0-r->
p[0]*(2.0-exp(-r->
p[1]*x)-exp(-r->
p[2]*x)); *y=f;
788 xt=x-r->
p[4];
if(xt<0.0) xt=0.0;
789 f=r->
p[0]*(1.0 - r->
p[1]*
igam(r->
p[3], r->
p[2]*xt));
793 xt=x-r->
p[0];
if(xt<=0.0) {
796 f=r->
p[2]*exp(-r->
p[3]*xt*xt*xt/(xt*xt+r->
p[4])) + (1.0-r->
p[2])*exp(-r->
p[5]*xt);
802 f=r->
p[0]*pow(x, r->
p[1]) / (pow(x, r->
p[1]) + r->
p[2]);
806 f=1.0-r->
p[0]*pow(x, r->
p[1]) / (pow(x, r->
p[1]) + r->
p[2]);
810 f=1.0 - r->
p[0]*(1.0+r->
p[3]*x)*pow(x, r->
p[1]) / (pow(x, r->
p[1]) + r->
p[2]);
814 if(r->
parNr>4) xt=x-r->
p[4];
else xt=x;
815 if(xt<=0.0) f=r->
p[3];
816 else {a=pow(xt, r->
p[1]); f=r->
p[0]*a/(a + r->
p[2]) + r->
p[3];}
820 f=r->
p[0] - r->
p[0]*pow(x, r->
p[1]) / (pow(x, r->
p[1]) + r->
p[2]);
824 xt=x-r->
p[4];
if(xt<=0.0) {
828 f=r->
p[3]+(r->
p[0]-r->
p[3])*a/(a+r->
p[2]);
833 xt=x-r->
p[4];
if(xt<=0.0) {
837 f=1.0-r->
p[3]-(r->
p[0]-r->
p[3])*a/(a+r->
p[2]);
842 xt=x-r->
p[4];
if(xt<=0.0) {
846 f=r->
p[3] * (1.0 - (1.0-r->
p[0])*a/(r->
p[2]+a));
851 xt=x-r->
p[4];
if(xt<=0.0) {
855 f=1.0 - r->
p[3] * (1.0 - (1.0-r->
p[0])*a/(r->
p[2]+a));
860 a=r->
p[0]*x; a*=a; f=1.0/pow(1.0+a, r->
p[1]);
864 a=r->
p[0]*x; a*=a; f=1.0 - 1.0/pow(1.0+a, r->
p[1]);
868 xt=x-r->
p[3];
if(xt<=0.0) {
871 f=pow(1.0+pow(r->
p[0]*xt, r->
p[1]), -r->
p[2]);
876 xt=x-r->
p[3];
if(xt<=0.0) {
879 f=pow(1.0+pow(r->
p[0]*xt, r->
p[1]), -r->
p[2]);
884 xt=x-r->
p[4];
if(xt<=0.0) {
887 f=pow(pow(r->
p[3],-1.0/r->
p[2])+pow(r->
p[0]*xt, r->
p[1]), -r->
p[2]);
892 xt=x-r->
p[4];
if(xt<=0.0) {
895 f=1.0-pow(pow(r->
p[3],-1.0/r->
p[2])+pow(r->
p[0]*xt, r->
p[1]), -r->
p[2]);
903 for(m=0; m<3; m++)
for(j=0; j<5; j++) mp[m][j]=0.0;
904 for(i=m=j=0; i<r->
parNr; i++) {mp[m][j]=r->
p[i]; j++;
if(j>4) {j=0; m++;}}
908 if(xt<=0.0) mf[m]=1.0-mp[m][3];
911 mf[m]=1.0-(mp[m][3]+(mp[m][0]-mp[m][3])*f/(mp[m][2]+f));
914 a=1.0-mf[0]*mf[1]-mf[0]*mf[2]-mf[1]*mf[2]+2.0*mf[0]*mf[1]*mf[2];
917 f-=mf[0]*(1.0-mf[1]-mf[2]+mf[1]*mf[2])/a;
918 f-=mf[1]*(1.0-mf[0]-mf[2]+mf[0]*mf[2])/a;
919 f-=mf[2]*(1.0-mf[0]-mf[1]+mf[0]*mf[1])/a;
921 }
else if(r->
type==872) {
922 *y=mf[0]*(1.0-mf[1]-mf[2]+mf[1]*mf[2])/a;
923 }
else if(r->
type==873) {
924 *y=mf[1]*(1.0-mf[0]-mf[2]+mf[0]*mf[2])/a;
925 }
else if(r->
type==874) {
926 *y=mf[2]*(1.0-mf[0]-mf[1]+mf[0]*mf[1])/a;
933 for(m=0; m<3; m++)
for(j=0; j<5; j++) mp[m][j]=0.0;
934 for(i=m=j=0; i<r->
parNr; i++) {mp[m][j]=r->
p[i]; j++;
if(j>4) {j=0; m++;}}
938 if(xt<=0.0) mf[m]=1.0-mp[m][3];
940 mf[m]=1.0 - pow(pow(mp[m][3], -1.0/mp[m][2]) + pow(mp[m][0]*(xt), mp[m][1]), -mp[m][2]);
943 a=1.0-mf[0]*mf[1]-mf[0]*mf[2]-mf[1]*mf[2]+2.0*mf[0]*mf[1]*mf[2];
946 f-=mf[0]*(1.0-mf[1]-mf[2]+mf[1]*mf[2])/a;
947 f-=mf[1]*(1.0-mf[0]-mf[2]+mf[0]*mf[2])/a;
948 f-=mf[2]*(1.0-mf[0]-mf[1]+mf[0]*mf[1])/a;
950 }
else if(r->
type==882) {
951 *y=mf[0]*(1.0-mf[1]-mf[2]+mf[1]*mf[2])/a;
952 }
else if(r->
type==883) {
953 *y=mf[1]*(1.0-mf[0]-mf[2]+mf[0]*mf[2])/a;
954 }
else if(r->
type==884) {
955 *y=mf[2]*(1.0-mf[0]-mf[1]+mf[0]*mf[1])/a;
962 for(
int i=0; i<r->
parNr; i+=2)
if(x>=r->
p[i]) *y=r->
p[i+1];
965 xt=x-r->
p[3]; a=sqrt(2.0)*(r->
p[2]/2.355);
966 f=r->
p[4]+(r->
p[0]/2.0)*(erf((xt+r->
p[1])/a)-erf((xt-r->
p[1])/a));
970 xt=x;
if(r->
parNr>7) xt-=r->
p[7];
974 sqrx=xt*xt; cubx=sqrx*xt;
975 a=r->
p[0]+r->
p[2]*xt+r->
p[4]*sqrx+r->
p[6]*cubx;
976 b=r->
p[1]+r->
p[3]*xt+r->
p[5]*sqrx;
if(b==0.0)
break;
982 xt=x;
if(r->
parNr>4) xt-=r->
p[4];
987 a=(r->
p[0]*(xt)-r->
p[2])*exp(r->
p[1]*(xt)); f+=a;
988 a=r->
p[2]*exp(r->
p[3]*(xt)); f+=a;
993 xt=x;
if(r->
parNr>6) xt-=r->
p[6];
998 a=(r->
p[0]*(xt)-r->
p[2]-r->
p[4])*exp(r->
p[1]*(xt)); f+=a;
999 a=r->
p[2]*exp(r->
p[3]*(xt)); f+=a;
1000 a=r->
p[4]*exp(r->
p[5]*(xt)); f+=a;
1005 xt=x;
if(r->
parNr>8) xt-=r->
p[8];
1010 a=(r->
p[0]*(xt)-r->
p[2]-r->
p[4]-r->
p[6])*exp(r->
p[1]*(xt)); f+=a;
1011 a=r->
p[2]*exp(r->
p[3]*(xt)); f+=a;
1012 a=r->
p[4]*exp(r->
p[5]*(xt)); f+=a;
1013 a=r->
p[6]*exp(r->
p[7]*(xt)); f+=a;
1018 xt=x-r->
p[3];
if(xt<=0.0 || r->p[2]==0.0) {
1021 f=r->
p[0]*pow(xt, r->
p[1])*exp(-xt/r->
p[2]);
1026 xt=x-r->
p[3];
if(xt<=0.0 || r->p[2]==0.0) {
1029 f=r->
p[0]*pow(xt, r->
p[1])*exp(-xt/r->
p[2]) + r->
p[4];
1038 if(r->
p[1]>0.0) f += r->
p[1]*pow(xt, r->
p[2])*a;
1039 if(r->
parNr==6 && r->
p[4]>0.0) f += r->
p[4]*(1.0-a)*exp(-xt/r->
p[5]);
1044 xt=x-r->
p[0];
if(xt<=0.0) {
1047 f=r->
p[1]*(1.0-exp(-pow(xt/r->
p[2], r->
p[3])));
1052 xt=x-r->
p[0];
if(xt<=0.0) {
1055 a=xt/r->
p[2]; b=pow(a, r->
p[3]-1.0); f=exp(-b*a);
1056 a=r->
p[3]*b*f/r->
p[2]; b=1.0-f;
1057 f=r->
p[1]*(a+r->
p[4]*b);
1062 if(r->
parNr<3) {*y=nan(
"");
break;}
1066 for(i=2; i<r->
parNr; i+=2)
1067 f+=r->
p[i-1]*xt*exp(-r->
p[i]*xt);
1074 f=r->
p[0]*x*exp(-r->
p[1]*x)*r->
p[1]*r->
p[1];
1082 f=r->
p[0]*x*exp(-r->
p[1]*x);
1090 double e=exp(-r->
p[1]*x);
1091 f=x*e + (r->
p[2]/(r->
p[1]*r->
p[1]))*(1.0-(r->
p[1]*x+1.0)*e);
1098 f=1.0/(1.0-r->
p[0]);
1100 double e=exp(-r->
p[2]*x);
1101 double rcp=x*e + (r->
p[3]/(r->
p[2]*r->
p[2]))*(1.0-(r->
p[2]*x+1.0)*e);
1103 f=1.0/(1.0-r->
p[0]*(1.0-rcp));
1108 xt=x-r->
p[0];
if(xt<=0.0) {
1111 f=r->
p[2]*(r->
p[3]*xt*exp(-r->
p[4]*r->
p[1]*xt) + exp(-r->
p[1]*xt) );
1118 double A=r->
p[0], k=r->
p[1];
if(!(k>=0.0))
return(2);
1119 int N=(int)round(r->
p[2]);
if(!(N>0))
return(2);
1121 f = A*pow(k, N)*pow(x, N-1)*exp(-k*x)/f;
1126 xt=x-r->
p[0];
if(xt<=0.0) {
1129 f=r->
p[1]*pow(xt, r->
p[3])/(pow(r->
p[2], r->
p[3])+pow(xt, r->
p[3]));
1134 xt=x-r->
p[0];
if(xt<=0.0) {
1137 a=pow(r->
p[2], r->
p[3])+pow(xt, r->
p[3]);
1139 (pow(xt, r->
p[3]-1.0)/a - pow(xt, 2.0*r->
p[3]-1.0)/(a*a));
1144 xt=x-r->
p[0];
if(xt<=0.0) {
1147 double a, c, b, k, xb, cb, cbxb, hill, hilld;
1148 a=r->
p[1]; c=r->
p[2]; b=r->
p[3]; k=r->
p[4];
1149 cb=pow(c, b); xb=pow(xt, b); cbxb=cb+xb;
1150 hilld= b*pow(xt, b-1.0)/cbxb - b*pow(xt, 2.0*b-1.0)/(cbxb*cbxb);
1157 xt=x;
if(r->
parNr>3) xt-=r->
p[3];
1161 double c=0.0;
if(r->
parNr>2) c=r->
p[2];
1162 double e=exp(-r->
p[1]*xt);
1163 f=xt*e + (c/(r->
p[1]*r->
p[1]))*(1.0-(r->
p[1]*xt+1.0)*e);
1170 f=1.0/(1.0-r->
p[0]);
1172 sqrx=x*x; cubx=sqrx*x;
1173 a=0.0+r->
p[1]*x+r->
p[3]*sqrx+r->
p[5]*cubx;
1174 b=1.0+r->
p[2]*x+r->
p[4]*sqrx+r->
p[6]*cubx;
1175 f=1.0/(1.0-r->
p[0]*(1.0-(a/b)));
1180 if(r->
parNr<3)
return(2);
1186 double A2=0.0;
if(r->
parNr>3) A2=r->
p[3];
1187 double L2=0.0;
if(r->
parNr>4) L2=r->
p[4];
1188 double A3=0.0;
if(r->
parNr>5) A3=r->
p[5];
1189 double L3=0.0;
if(r->
parNr>6) L3=r->
p[6];
1190 f=(A1*x - A2 - A3)*exp(-L1*x) + A2*exp(-L2*x) + A3*exp(-L3*x);
1192 *y=1.0/(1.0-r->
p[0]*(1.0-f));
1196 double top, bottom, ec50, hillslope;
1197 top=r->
p[0]; bottom=r->
p[1]; ec50=r->
p[2]; hillslope=r->
p[3];
1198 if(x<=0.0) f=bottom;
1199 else f=bottom+(top-bottom)/(1.0+pow(ec50/x,hillslope));
1205 double top, bottom, logec50, hillslope;
1206 top=r->
p[0]; bottom=r->
p[1]; logec50=r->
p[2]; hillslope=r->
p[3];
1207 f=bottom+(top-bottom)/(1.0+pow(10.0, (logec50-x)*hillslope));
1212 a=r->
p[1]*pow(x, r->
p[2]) / (pow(x, r->
p[2]) + r->
p[3]);
1213 f=1.0/(1.0-r->
p[0]*(1.0-a));
1216 case 3331: *y=nan(
"");
break;
1217 case 9501: *y=nan(
"");
break;
1218 case 9502: *y=nan(
"");
break;
1219 case 9503: *y=nan(
"");
break;
1220 case 9701: *y=nan(
"");
break;
1224 if(isnan(*y))
return 1;
1244 if(r==NULL || x==NULL || y==NULL || dataNr<1)
return(1);
1250 double dT=r->
p[r->
parNr-2]; Ta+=dT;
1251 double tau=r->
p[r->
parNr-1];
1252 int n=(r->
parNr-4)/2;
if(n<1)
return(2);
1253 for(
int i=0; i<dataNr; i++) {
1254 if(x[i]<=Ta) y[i]=0.0;
1255 else if(x[i]<Ta+Ti) {
1257 for(
int j=0; j<n; j++) {
1259 if(r->
p[2*j+3]>1.0E-12) b=r->
p[2*j+2]/r->
p[2*j+3];
else b=r->
p[2*j+2];
1260 f+=b*(1.0-exp(-r->
p[2*j+3]*(x[i]-Ta)));
1262 if(Ti>0.0) f*=(1.0/Ti);
1266 for(
int j=0; j<n; j++) {
1268 if(r->
p[2*j+3]>1.0E-12) b=r->
p[2*j+2]/r->
p[2*j+3];
else b=r->
p[2*j+2];
1269 f+=b*(exp(-r->
p[2*j+3]*(x[i]-Ta-Ti)) - exp(-r->
p[2*j+3]*(x[i]-Ta)));
1271 if(Ti>0.0) f*=(1.0/Ti);
1280 for(
int i=0; i<dataNr; i++)
if(
fitEval(r, x[i], y+i))
return(2);
1300 if(r==NULL || yi==NULL)
return 1;
1304 if(fabs(r->
p[1])>1.0e-12) f=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1310 if(fabs(r->
p[1])>1.0e-12) a=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1313 if(fabs(r->
p[3])>1.0e-12) a=(r->
p[2]/r->
p[3])*(exp(r->
p[3]*x)-1.0);
1320 if(fabs(r->
p[1])>1.0e-12) a=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1323 if(fabs(r->
p[3])>1.0e-12) a=(r->
p[2]/r->
p[3])*(exp(r->
p[3]*x)-1.0);
1326 if(fabs(r->
p[5])>1.0e-12) a=(r->
p[4]/r->
p[5])*(exp(r->
p[5]*x)-1.0);
1333 if(fabs(r->
p[1])>1.0e-12) a=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1336 if(fabs(r->
p[3])>1.0e-12) a=(r->
p[2]/r->
p[3])*(exp(r->
p[3]*x)-1.0);
1339 if(fabs(r->
p[5])>1.0e-12) a=(r->
p[4]/r->
p[5])*(exp(r->
p[5]*x)-1.0);
1342 if(fabs(r->
p[7])>1.0e-12) a=(r->
p[6]/r->
p[7])*(exp(r->
p[7]*x)-1.0);
1349 if(fabs(r->
p[1])>1.0e-12) a=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1352 if(fabs(r->
p[3])>1.0e-12) a=(r->
p[2]/r->
p[3])*(exp(r->
p[3]*x)-1.0);
1355 if(fabs(r->
p[5])>1.0e-12) a=(r->
p[4]/r->
p[5])*(exp(r->
p[5]*x)-1.0);
1358 if(fabs(r->
p[7])>1.0e-12) a=(r->
p[6]/r->
p[7])*(exp(r->
p[7]*x)-1.0);
1361 if(fabs(r->
p[9])>1.0e-12) a=(r->
p[8]/r->
p[9])*(exp(r->
p[8]*x)-1.0);
1367 f=(r->
p[0]/r->
p[1])*exp(r->
p[1]*x)
1368 - r->
p[0]*exp((r->
p[1]+r->
p[2])*x)/(r->
p[1]+r->
p[2]);
1373 a=(r->
p[0]/r->
p[1])*exp(r->
p[1]*x)
1374 - r->
p[0]*exp((r->
p[1]+r->
p[2])*x)/(r->
p[1]+r->
p[2]); f+=a;
1375 a=(r->
p[3]/r->
p[4])*exp(r->
p[4]*x)
1376 - r->
p[3]*exp((r->
p[4]+r->
p[5])*x)/(r->
p[4]+r->
p[5]); f+=a;
1381 a=(r->
p[0]/r->
p[1])*exp(r->
p[1]*x)
1382 - r->
p[0]*exp((r->
p[1]+r->
p[2])*x)/(r->
p[1]+r->
p[2]); f+=a;
1383 a=(r->
p[3]/r->
p[4])*exp(r->
p[4]*x)
1384 - r->
p[3]*exp((r->
p[4]+r->
p[5])*x)/(r->
p[4]+r->
p[5]); f+=a;
1385 a=(r->
p[6]/r->
p[7])*exp(r->
p[7]*x)
1386 - r->
p[6]*exp((r->
p[7]+r->
p[8])*x)/(r->
p[7]+r->
p[8]); f+=a;
1392 t=r->
p[4]; xt=x-t; f=0.0;
1394 double A1, A2, L1, L2;
1395 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3];
1398 f+=(A2/L1)*(1.0 - a);
1399 f+=(A1/(L1*L1))*(1.0 + a*(L1*xt - 1.0));
1401 if(L2!=0.0) f+=(A2/L2)*(exp(L2*xt) - 1.0);
else f+=A2*xt;
1406 t=r->
p[6]; xt=x-t; f=0.0;
1408 double A1, A2, A3, L1, L2, L3;
1409 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3]; A3=r->
p[4]; L3=r->
p[5];
1412 f+=(A2/L1)*(1.0 - a);
1413 f+=(A3/L1)*(1.0 - a);
1414 f+=(A1/(L1*L1))*(1.0 + a*(L1*xt - 1.0));
1416 if(L2!=0.0) f+=(A2/L2)*(exp(L2*xt) - 1.0);
else f+=A2*xt;
1417 if(L3!=0.0) f+=(A3/L3)*(exp(L3*xt) - 1.0);
else f+=A3*xt;
1422 t=r->
p[8]; xt=x-t; f=0.0;
1424 double A1, A2, A3, A4, L1, L2, L3, L4;
1425 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3]; A3=r->
p[4]; L3=r->
p[5];
1426 A4=r->
p[6]; L4=r->
p[7];
1429 f+=(A2/L1)*(1.0 - a);
1430 f+=(A3/L1)*(1.0 - a);
1431 f+=(A4/L1)*(1.0 - a);
1432 f+=(A1/(L1*L1))*(1.0 + a*(L1*xt - 1.0));
1434 if(L2!=0.0) f+=(A2/L2)*(exp(L2*xt) - 1.0);
else f+=A2*xt;
1435 if(L3!=0.0) f+=(A3/L3)*(exp(L3*xt) - 1.0);
else f+=A3*xt;
1436 if(L4!=0.0) f+=(A4/L4)*(exp(L4*xt) - 1.0);
else f+=A4*xt;
1443 if(r->
parNr<3)
break;
1447 for(
int pi=2; pi<r->
parNr; pi+=2) {
1449 a=r->
p[pi-1]; b=r->
p[pi];
1450 f += a*(1.0-(b*xt+1.0)*exp(-b*xt))/(b*b);
1457 if(x>0.0) f=r->
p[0]*(1.0 - (r->
p[1]*x + 1.0)*exp(-r->
p[1]*x));
1463 a=r->
p[0]/(r->
p[1]*r->
p[1]);
1464 f=a*(1.0 - (r->
p[1]*x + 1.0)*exp(-r->
p[1]*x));
1469 xt=x-r->
p[0]; f=0.0;
1471 double a, b, m, n; a=r->
p[1]; b=r->
p[2]; m=r->
p[3]; n=r->
p[4];
1472 f+=m*((1.0-(n*a*xt+1.0)*exp(-n*a*xt)))/(n*n*a*a) + (1.0-exp(-a*xt))/a;
1481 double A, k; A=r->
p[0]; k=r->
p[1];
if(!(k>=0.0))
return(2);
1482 int N=(int)round(r->
p[2]);
if(!(N>=0) || N>20)
return(2);
1484 else if(N==1) f=A*(1.0-exp(-k*x));
1485 else if(N==2) f=A*(1.0 - exp(-k*x) - k*x*exp(-k*x));
1488 for(
int j=2; j<N; j++) s+=pow(k*x, j)/
lfactorial(j);
1489 f=A*(1.0-s*exp(-k*x));
1494 case 2111: *yi=nan(
"");
break;
1495 case 9501: *yi=nan(
"");
break;
1496 case 9502: *yi=nan(
"");
break;
1497 case 9503: *yi=nan(
"");
break;
1498 case 9701: *yi=nan(
"");
break;
1502 if(isnan(*yi))
return(3);
1524 if(r==NULL || x==NULL || yi==NULL || dataNr<1)
return(1);
1548 if(r==NULL || x1==NULL || x2==NULL || y==NULL || dataNr<1)
return(1);
1549 for(
int i=0; i<dataNr; i++) {
1550 double fd=x2[i]-x1[i];
1551 if(!(fd>=0.0))
return(1);
1553 if(
fitEval(r, x2[i], y+i))
return(2);
1579 if(r==NULL || yd==NULL)
return 1;
1593 f=r->
p[0]*r->
p[1]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)) - r->
p[0]*r->
p[2]*exp((r->
p[1]+r->
p[2])*x);
1598 a=r->
p[0]*r->
p[1]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)) - r->
p[0]*r->
p[2]*exp((r->
p[1]+r->
p[2])*x); f+=a;
1599 a=r->
p[3]*r->
p[4]*exp(r->
p[4]*x)*(1.0-exp(r->
p[5]*x)) - r->
p[3]*r->
p[5]*exp((r->
p[4]+r->
p[5])*x); f+=a;
1604 a=r->
p[0]*r->
p[1]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)) - r->
p[0]*r->
p[2]*exp((r->
p[1]+r->
p[2])*x); f+=a;
1605 a=r->
p[3]*r->
p[4]*exp(r->
p[4]*x)*(1.0-exp(r->
p[5]*x)) - r->
p[3]*r->
p[5]*exp((r->
p[4]+r->
p[5])*x); f+=a;
1606 a=r->
p[6]*r->
p[7]*exp(r->
p[7]*x)*(1.0-exp(r->
p[8]*x)) - r->
p[6]*r->
p[8]*exp((r->
p[7]+r->
p[8])*x); f+=a;
1612 t=r->
p[4]; xt=x-t; f=0.0;
1614 double A1, A2, L1, L2;
1615 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3];
1616 f= A1*exp(L1*xt) + A2*L2*exp(L2*xt) + (A1*xt -A2)*L1*exp(L1*xt);
1621 t=r->
p[6]; xt=x-t; f=0.0;
1623 double A1, A2, A3, L1, L2, L3;
1624 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3]; A3=r->
p[4]; L3=r->
p[5];
1625 f= A1*exp(L1*xt) + A2*L2*exp(L2*xt) + A3*L3*exp(L3*xt) +
1626 (A1*xt -A2 -A3)*L1*exp(L1*xt);
1631 t=r->
p[8]; xt=x-t; f=0.0;
1633 double A1, A2, A3, A4, L1, L2, L3, L4;
1634 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3]; A3=r->
p[4]; L3=r->
p[5];
1635 A4=r->
p[6]; L4=r->
p[7];
1636 f= A1*exp(L1*xt) + A2*L2*exp(L2*xt) + A3*L3*exp(L3*xt) +
1637 A4*L4*exp(L4*xt) + (A1*xt -A2 -A3 -A4)*L1*exp(L1*xt);
1643 xt=x-r->
p[3];
if(xt<=0.0 || r->p[2]==0.0) {
1646 f=r->
p[0]*pow(xt, r->
p[1]-1.0)*exp(-xt/r->
p[2])*(r->
p[1]-(xt/r->
p[2]));
1651 xt=x-r->
p[0];
if(xt<=0.0) {
1654 a=pow(xt/r->
p[2], r->
p[3]-1.0);
1655 *yd=r->
p[1]*r->
p[3]*a*exp(-a*xt/r->
p[2])/r->
p[2];
1659 xt=x-r->
p[0];
if(xt<=0.0) {
1662 a=pow(r->
p[2], r->
p[3])+pow(xt, r->
p[3]);
1663 *yd=r->
p[1]*r->
p[3]*(pow(xt, r->
p[3]-1.0)/a - pow(xt, 2.0*r->
p[3]-1.0)/(a*a));
1666 case 2111: *yd=nan(
"");
break;
1667 case 9501: *yd=nan(
"");
break;
1668 case 9502: *yd=nan(
"");
break;
1669 case 9503: *yd=nan(
"");
break;
1670 case 9701: *yd=nan(
"");
break;
1674 if(isnan(*yd))
return(3);
1696 if(r==NULL || x==NULL || yd==NULL || dataNr<1)
return(1);
1697 for(i=0; i<dataNr; i++)
if(
fitDerivEval(r, x[i], yd+i))
return(2);
1728 unsigned long long int n
1751 if(x==0.0)
return(0.0);
1752 if((x<0.0) || (a<=0.0))
return(nan(
""));
1754 if((x>1.0) && (x>a))
return(1.0 -
igamc(a, x));
1758 double ans, ax, c, r;
1761 ax=a*log(x) - x - lgamma(a);
1762 if(ax<-DBL_MAX_10_EXP)
return(0.0);
1766 r=a; c=1.0; ans=1.0;
1771 }
while(c/ans > DBL_EPSILON);
1791 if((x<0.0) || (a<=0.0))
return(nan(
""));
1793 if((x<1.0) || (x<a))
return(1.0-
igam(a, x));
1795 double ans, ax, c, yc, r, t, y, z;
1796 double pk, pkm1, pkm2, qk, qkm1, qkm2;
1797 double big=4.503599627370496E+015;
1798 double biginv=2.22044604925031308085E-016;
1800 ax = a*log(x) - x - lgamma(a);
1801 if(ax < -DBL_MAX_10_EXP)
return(0.0);
1805 y=1.0-a; z=x+y+1.0; c=0.0;
1806 pkm2=1.0; qkm2=x; pkm1=x+1.0; qkm1=z*x;
1809 c+=1.0; y+=1.0; z+=2.0;
1810 yc=y*c; pk=pkm1*z - pkm2*yc; qk=qkm1*z - qkm2*yc;
1811 if(qk!=0.0) {r=pk/qk; t=fabs((ans-r)/r); ans=r;}
1813 pkm2=pkm1; pkm1=pk; qkm2=qkm1; qkm1=qk;
1814 if(fabs(pk)>big) {pkm2*=biginv; pkm1*=biginv; qkm2*=biginv; qkm1*=biginv;}
1815 }
while(t>DBL_EPSILON);
int backupExistingFile(char *filename, char *backup_ext, char *status)
int get_datetime(char *str, struct tm *date, int verbose)
char * ctime_r_int(const time_t *t, char *buf)
Convert calendard time t into a null-terminated string of the form YYYY-MM-DD hh:mm:ss,...
time_t timegm(struct tm *tm)
Inverse of gmtime, converting struct tm to time_t.
double atof_dpi(char *str)
Header file for libtpccurveio.
int rnameCatenate(char *rname, int max_rname_len, char *name1, char *name2, char *name3, char space)
#define MAX_REGIONNAME_LEN
void strReplaceChar(char *str, char c1, char c2)
int strTokenNCpy(const char *str1, const char *str2, int i, char *str3, int count)
int strTokenNr(const char *str1, const char *str2)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
char * strTokenDup(const char *s1, const char *s2, int *next)
char * petTunit(int tunit)
int petTunitId(const char *timeunit)
#define MAX_REGIONSUBNAME_LEN
Header file for libtpcmodel.
int simDispersion(double *x, double *y, int n, double tau1, double tau2, double *tmp)
double igam(double a, double x)
unsigned long long int lfactorial(unsigned long long int n)
int fitDerivEval(FitVOI *r, double x, double *yd)
int fitSetmem(FIT *fit, int voiNr)
int fitEvaltac(FitVOI *r, double *x, double *y, int dataNr)
int fitEval(FitVOI *r, double x, double *y)
double igamc(double a, double x)
int fitRead(char *filename, FIT *fit, int verbose)
int fitWrite(FIT *fit, char *filename)
int fitIntegralEvaltac(FitVOI *r, double *x, double *yi, int dataNr)
int fitIntegralEval(FitVOI *r, double x, double *yi)
int fitFunctionformat(int type, char *str)
int fitDerivEvaltac(FitVOI *r, double *x, double *yd, int dataNr)
unsigned int factorial(unsigned int n)
int fitEvaltacframes(FitVOI *r, double *x1, double *x2, double *y, int dataNr)
int fitFunctionname(int type, char *str)
char datafile[FILENAME_MAX]
char unit[MAX_UNITS_LEN+1]
char studynr[MAX_STUDYNR_LEN+1]
char place[MAX_REGIONSUBNAME_LEN+1]
char hemisphere[MAX_REGIONSUBNAME_LEN+1]
char voiname[MAX_REGIONSUBNAME_LEN+1]
char name[MAX_REGIONNAME_LEN+1]