diff --git a/v1/cmfits/fit_h2o.c b/v1/cmfits/fit_h2o.c index 51b02ba97d74dc827d8346938a3f55de05d19522..4aad3c287512ac2ec5864e969c829b283a481e99 100644 --- a/v1/cmfits/fit_h2o.c +++ b/v1/cmfits/fit_h2o.c @@ -98,6 +98,8 @@ static char *info[] = { " Weighted residual curves are written in DFT format.", " -svg=<Filename>", " Fitted and measured TACs are plotted in specified SVG file.", + " -k2", + " Save k2 in result file.", " -stdoptions", // List standard options like --help, -v, etc " ", "Example:", @@ -135,6 +137,7 @@ int main(int argc, char **argv) int doBootstrap=0, doSD=0, doCL=0; // 0=no, 1=yes int per_dl=1; // 0 or 1 int flow_per_tissue=0; // 0: f=(1-Va)K1 ; 1: f=K1 + int save_k2=0; double fitdur=-1.0; int fittedparNr=0; @@ -202,6 +205,8 @@ int main(int argc, char **argv) per_dl=0; continue; } else if(strcasecmp(cptr, "FPT")==0) { flow_per_tissue=1; continue; + } else if(strcasecmp(cptr, "K2")==0) { + save_k2=1; continue; } if(strncasecmp(cptr, "INPUT=", 6)==0) { strlcpy(inputfile, cptr+6, FILENAME_MAX); if(strlen(inputfile)>0) continue; @@ -242,22 +247,15 @@ int main(int argc, char **argv) if(version) {tpcPrintBuild(argv[0], stdout); return(0);} /* Process other arguments, starting from the first non-option */ - for(; ai<argc; ai++) { - if(!btacfile[0]) { - strlcpy(btacfile, argv[ai], FILENAME_MAX); continue; - } else if(!ttacfile[0]) { - strlcpy(ttacfile, argv[ai], FILENAME_MAX); continue; - } else if(fitdur<0) { - if(!atof_with_check(argv[ai], &fitdur) && fitdur>=0.0) continue; - fprintf(stderr, "Error: invalid fit time '%s'.\n", argv[ai]); - return(1); - } else if(!resfile[0]) { - strlcpy(resfile, argv[ai], FILENAME_MAX); continue; - } - /* we should never get this far */ - fprintf(stderr, "Error: too many arguments: '%s'.\n", argv[ai]); - return(1); + if(ai<argc) {strlcpy(btacfile, argv[ai++], FILENAME_MAX);} + if(ai<argc) {strlcpy(ttacfile, argv[ai++], FILENAME_MAX);} + if(ai<argc) { + if(atof_with_check(argv[ai], &fitdur) || fitdur<0.0) { + fprintf(stderr, "Error: invalid fit time '%s'.\n", argv[ai]); return(1);} + ai++; } + if(ai<argc) {strlcpy(resfile, argv[ai++], FILENAME_MAX);} + if(ai<argc) {fprintf(stderr, "Error: too many arguments: '%s'.\n", argv[ai]); return(1);} if(doSD || doCL) doBootstrap=1; else doBootstrap=0; /* In verbose mode print arguments and options */ @@ -279,6 +277,7 @@ int main(int argc, char **argv) if(fVa>=0.0) printf("required_fVa := %g\n", fVa); if(fK1k2>=0.0) printf("required_fK1k2 := %g\n", fK1k2); if(!isnan(fDelay)) printf("required_fDelay := %g\n", fDelay); + printf("save_k2 := %d\n", save_k2); printf("lambda := %g [1/s]\n", lambda); fflush(stdout); } @@ -493,7 +492,8 @@ int main(int argc, char **argv) res.time=time(NULL); /* Set parameter number, including also the extra "parameters" and the parameter names and units */ - res.parNr=parNr+1; + res.parNr=parNr+1; // WSS + if(save_k2) res.parNr++; { int pi; pi=0; strcpy(res.parname[pi], "Flow"); @@ -504,6 +504,7 @@ int main(int argc, char **argv) if(per_dl==0) strcpy(res.parunit[pi], "ml/ml"); else strcpy(res.parunit[pi], "%"); pi++; strcpy(res.parname[pi], "delayT"); strcpy(res.parunit[pi], "sec"); + if(save_k2) {pi++; strcpy(res.parname[pi], "k2"); strcpy(res.parunit[pi], "1/min");} pi++; strcpy(res.parname[pi], "WSS"); strcpy(res.parunit[pi], ""); } @@ -588,7 +589,7 @@ int main(int argc, char **argv) for(pi=0; pi<MAX_PARAMS; pi++) printf(" %g", res.voi[ri].parameter[pi]); printf(" -> WSS=%g\n", wss); fflush(stdout); } - res.voi[ri].parameter[parNr]=wss; + res.voi[ri].parameter[res.parNr-1]=wss; /* Bootstrap */ if(doBootstrap) { @@ -623,8 +624,11 @@ int main(int argc, char **argv) /* Set fitted parameters to understandable units */ { - /* flow */ double F, pWater, Va, delayT, f=60.; + /* k2, if requested */ + if(save_k2) + res.voi[ri].parameter[4]=60.0*res.voi[ri].parameter[0]/res.voi[ri].parameter[1]; + /* flow */ if(flow_per_tissue==0) f*=(1.0-res.voi[ri].parameter[2]); res.voi[ri].parameter[0]*=f; if(!isnan(res.voi[ri].cl1[0])) res.voi[ri].cl1[0]*=f; diff --git a/v1/cmfits/test/fit_h2o/test_fit_h2o.sh b/v1/cmfits/test/fit_h2o/test_fit_h2o.sh index 4f01a10459b93581872f4b3c5eae01ff61dca0b2..2cd9b1219b56fbe230abe0e1c6a0ba972c32c004 100644 --- a/v1/cmfits/test/fit_h2o/test_fit_h2o.sh +++ b/v1/cmfits/test/fit_h2o/test_fit_h2o.sh @@ -1,6 +1,6 @@ #!/bin/bash #: Title : test_fit_h2o -#: Date : 2017-04-05 +#: Date : 2018-02-18 #: Author : "Vesa Oikonen" <vesa.oikonen@utu.fi> #: Options : None @@ -13,17 +13,17 @@ fi PROGRAM=../../fit_h2o$EXT; +if [ ! -f $PROGRAM ]; then + printf "Failed: executable does not exist.\n" + exit 1 +fi + printf "=====================================================================\n" printf "creating test data for %s\n" $PROGRAM printf "=====================================================================\n" printf "\n verifying that required data exists \n" -if [ ! -f $PROGRAM ]; then - printf "Failed: executable does not exist.\n" - exit 1 -fi - if [ ! -f blood.dat ]; then printf "Failed: required data does not exist.\n" exit 1 @@ -208,6 +208,9 @@ printf "testing %s\n" $PROGRAM printf "=====================================================================\n" + + + printf "\n 1.0.0 \n" printf " Test case: Fit simulated TACs with realistic range of parameters. \n" printf " Expected result: Result file is created, and results are close to correct. \n" @@ -1112,6 +1115,53 @@ if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi printf "\n passed. \n\n" + + + + +printf "\n 7.1.0 \n" +printf " Test case: Option -k2 with -fpt.\n" +printf " Expected result: Correct k2 values are saved in results. \n\n" + +rm -f output.res +$PROGRAM -k2 -fpt -delay=0 blood.bld quick.tac 0 output.res +if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi +printf "\n ok \n" +parformat -f=ift output.res output.ift +if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi +printf "\n ok \n" +iftisval -abs=0.001 output.ift k2 0.2083 +if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi +printf "\n ok \n" +iftisval -abs=0.01 output.ift Flow 20.833 +if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi +printf "\n passed. \n\n" + +printf "\n 7.1.1 \n" +printf " Test case: Option -k2 without -fpt.\n" +printf " Expected result: Correct k2 values are saved in results. \n\n" + +rm -f output.res +$PROGRAM -k2 -delay=0 blood.bld quick.tac 0 output.res +if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi +printf "\n ok \n" +parformat -f=ift output.res output.ift +if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi +printf "\n ok \n" +iftisval -abs=0.001 output.ift k2 0.2083 +if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi +printf "\n ok \n" +iftisval -abs=0.01 output.ift Flow 20.417 +if [ $? -ne 0 ] ; then printf "Failed!\n" ; exit 1 ; fi +printf "\n passed. \n\n" + + + + + + + + printf "\n===================================================================\n" printf " All passed! \n" printf "===================================================================\n"