5#include "tpcclibConfig.h"
34 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
39 if(verbose>0) {printf(
"%s():\n", __func__); fflush(stdout);}
40 if(par==NULL || par->
tacNr<1 || par->
parNr<1) {
56 n=fprintf(fp,
"results (c) none\n\n");
73 fprintf(fp,
"Date:\t%s\n", par->
h.
item[i].
value);
79 if(i>=0) fprintf(fp,
"Study:\t%s\n", par->
h.
item[i].
value);
83 if(i>=0) fprintf(fp,
"Data file:\t%s\n", par->
h.
item[i].
value);
85 if(i>=0) fprintf(fp,
"Plasma file:\t%s\n", par->
h.
item[i].
value);
87 if(i>=0) fprintf(fp,
"2nd Plasma file:\t%s\n", par->
h.
item[i].
value);
89 if(i>=0) fprintf(fp,
"Blood file:\t%s\n", par->
h.
item[i].
value);
91 if(i>=0) fprintf(fp,
"Reference file:\t%s\n", par->
h.
item[i].
value);
93 if(i>=0) fprintf(fp,
"Reference region:\t%s\n", par->
h.
item[i].
value);
96 if(!isnan(par->
r[0].
start) && !isnan(par->
r[0].
end))
97 fprintf(fp,
"Data range:\t%g - %g min\n", par->
r[0].
start, par->
r[0].
end);
99 fprintf(fp,
"Data nr:\t%d\n", par->
r[0].
dataNr);
101 if(i>=0) fprintf(fp,
"Fit method:\t%s\n", par->
h.
item[i].
value);
105 if(i>=0) fprintf(fp,
"Tissue density:\t%s\n", par->
h.
item[i].
value);
107 if(i>=0) fprintf(fp,
"Lumped constant:\t%s\n", par->
h.
item[i].
value);
109 if(i>=0) fprintf(fp,
"Concentration:\t%s\n", par->
h.
item[i].
value);
111 if(i>=0) fprintf(fp,
"Beta:\t%s\n", par->
h.
item[i].
value);
113 if(i>=0) fprintf(fp,
"Vb:\t%s\n", par->
h.
item[i].
value);
115 if(i>=0) fprintf(fp,
"fA:\t%s\n", par->
h.
item[i].
value);
118 if(i>=0) fprintf(fp,
"Extraction:\t%s\n", par->
h.
item[i].
value);
122 if(i>=0) fprintf(fp,
"Weighting:\t%s\n", par->
h.
item[i].
value);
123 else fprintf(fp,
"Weighting:\t%s\n",
"unknown");
126 int partype[par->
parNr];
130 fprintf(fp,
"\n%s",
"Region");
131 for(i=0; i<par->
parNr; i++) {
132 if(strlen(par->
n[i].
name)<1) strcpy(tmp,
".");
133 else strcpy(tmp, par->
n[i].
name);
134 fprintf(fp,
"\t%s", tmp);
136 if(
parIsWSS(par)) fprintf(fp,
"\tWSS");
142 fprintf(fp,
"%s",
"# Units:");
143 for(i=0; i<par->
parNr; i++) {
146 if(
parIsWSS(par)) fprintf(fp,
"\t.");
152 for(i=0; i<par->
tacNr; i++) {
153 if(strlen(par->
r[i].
name)>0) {
155 fprintf(fp,
"%s ", tmp);
157 fprintf(fp,
"%s ", tmp);
159 fprintf(fp,
"%s", tmp);
161 fprintf(fp,
"tac%d . .", 1+i);
163 for(j=0; j<par->
parNr; j++) {
164 if(isnan(par->
r[i].
p[j])) {fprintf(fp,
"\t.");
continue;}
166 case 0: fprintf(fp,
"\t%.0f", par->
r[i].
p[j]);
break;
168 if(par->
r[i].
p[j]>=0) n=4;
else n=3;
169 fprintf(fp,
"\t%.*f", n, par->
r[i].
p[j]);
172 if(par->
r[i].
p[j]>=0) n=4;
else n=3;
173 fprintf(fp,
"\t%.*e", n, par->
r[i].
p[j]);
178 if(isnan(par->
r[i].
wss)) fprintf(fp,
"\t.");
179 else fprintf(fp,
"\t%g", par->
r[i].
wss);
183 for(j=n=0; j<par->
parNr; j++)
if(!isnan(par->
r[i].
sd[j])) n++;
185 fprintf(fp,
"SD . .");
186 for(j=0; j<par->
parNr; j++) {
187 if(!isnan(par->
r[i].
sd[j])) {
189 case 0: fprintf(fp,
"\t%.0f", par->
r[i].
sd[j]);
break;
191 if(par->
r[i].
sd[j]>=0) n=4;
else n=3;
192 fprintf(fp,
"\t%.*f", n, par->
r[i].
sd[j]);
195 if(par->
r[i].
sd[j]>=0) n=4;
else n=3;
196 fprintf(fp,
"\t%.*e", n, par->
r[i].
sd[j]);
203 if(
parIsWSS(par)) fprintf(fp,
"\t.");
207 for(j=n=0; j<par->
parNr; j++)
if(!isnan(par->
r[i].
cl1[j])) n++;
209 fprintf(fp,
"CL 95%% Lower");
210 for(j=0; j<par->
parNr; j++) {
211 if(!isnan(par->
r[i].
cl1[j])) {
213 case 0: fprintf(fp,
"\t%.0f", par->
r[i].
cl1[j]);
break;
215 if(par->
r[i].
cl1[j]>=0) n=4;
else n=3;
216 fprintf(fp,
"\t%.*f", n, par->
r[i].
cl1[j]);
219 if(par->
r[i].
cl1[j]>=0) n=4;
else n=3;
220 fprintf(fp,
"\t%.*e", n, par->
r[i].
cl1[j]);
227 if(
parIsWSS(par)) fprintf(fp,
"\t.");
231 for(j=n=0; j<par->
parNr; j++)
if(!isnan(par->
r[i].
cl2[j])) n++;
233 fprintf(fp,
"CL 95%% Upper");
234 for(j=0; j<par->
parNr; j++) {
235 if(!isnan(par->
r[i].
cl2[j])) {
237 case 0: fprintf(fp,
"\t%.0f", par->
r[i].
cl2[j]);
break;
239 if(par->
r[i].
cl2[j]>=0) n=4;
else n=3;
240 fprintf(fp,
"\t%.*f", n, par->
r[i].
cl2[j]);
243 if(par->
r[i].
cl2[j]>=0) n=4;
else n=3;
244 fprintf(fp,
"\t%.*e", n, par->
r[i].
cl2[j]);
251 if(
parIsWSS(par)) fprintf(fp,
"\t.");
279 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
280 if(verbose>0) {printf(
"%s()\n", __func__); fflush(stdout);}
287 if(csv==NULL || ift==NULL || csv->
row_nr<1 || csv->
col_nr<1) {
293 printf(
"\n CSV contents shown with separator ; \n\n");
296 printf(
"\n IFT contents \n\n");
300 int i, ret, titlerow;
301 int ri, ci, parNr=0, tacNr=0;
305 i=0;
if(verbose>2) printf(
"estimating parNr and tacNr\n");
308 if(i>=0 && csv->
c[i].
col==0)
break;
311 if(i<0 || i==csv->nr) {
316 titlerow=csv->
c[i].
row;
320 ci=parNr;
while(ci>0 && strlen(csv->
c[ci].
content)<1) {ci--; parNr--;}
322 if(strlen(csv->
c[i+1].
content)<1) parNr--;
328 if(strncasecmp(cptr,
"SD . .", 3) && strncasecmp(cptr,
"CL 95% ", 7)) tacNr++;
330 if(strcasecmp(cptr,
"SD") && strcasecmp(cptr,
"CL")) tacNr++;
332 ri++; cptr=
csvCell(csv, ri, ci);
335 printf(
" parNr := %d\n", parNr);
336 printf(
" tacNr := %d\n", tacNr);
338 if(parNr<1 || tacNr<1) {
346 statusSet(status, __func__, __FILE__, __LINE__, ret);
352 if(verbose>2) printf(
"searching obligatory program name\n");
356 printf(
"ift->item[%d].value := '%s'\n", i, ift->
item[i].
value);
407 if(verbose>2) printf(
"searching obligatory information on weighting\n");
409 iftPut(&par->
h,
"weighting",
"no", 0, NULL);
411 iftPut(&par->
h,
"weighting",
"yes", 0, NULL);
424 ri=titlerow; ci=1; cptr=
csvCell(csv, ri, ci);
425 if(strlen(cptr)<1) {ci++; cptr=
csvCell(csv, ri, ci);}
426 for(i=0; i<parNr; i++) {
428 ci++; cptr=
csvCell(csv, ri, ci);
436 ci=0; cptr=
csvCell(csv, ri, ci);
443 if(!strcasecmp(cptr,
"SD")) {
445 ci=3; dptr=par->
r[tac-1].
sd;
446 }
else if(!strcasecmp(cptr,
"CL")) {
448 if(!strcasecmp(
csvCell(csv, ri, 2),
"Lower")) {
449 ci=3; dptr=par->
r[tac-1].
cl1;
450 }
else if(!strcasecmp(
csvCell(csv, ri, 2),
"Upper")) {
451 ci=3; dptr=par->
r[tac-1].
cl2;
455 if(!strncasecmp(cptr,
"SD . .", 3)) {
457 ci=1; dptr=par->
r[tac-1].
sd;
458 }
else if(!strncasecmp(cptr,
"CL 95% Lower", 8)) {
460 ci=1; dptr=par->
r[tac-1].
cl1;
461 }
else if(!strncasecmp(cptr,
"CL 95% Upper", 8)) {
463 ci=1; dptr=par->
r[tac-1].
cl2;
468 for(i=0; i<parNr; i++) {
476 if(tac>=tacNr)
break;
481 ci++; cptr=
csvCell(csv, ri, ci);
484 ci++; cptr=
csvCell(csv, ri, ci);
490 for(i=0; i<parNr; i++) {
501 statusSet(status, __func__, __FILE__, __LINE__, ret);
511 for(
int j=0; j<n; j++) {
521 for(tac=0; tac<par->
tacNr; tac++) {
524 strcmp(fnsp[i],
".")==0)
527 strcpy(par->
r[tac].
name, fnsp[0]);
528 if(strlen(fnsp[1]) || strlen(fnsp[2])) strcat(par->
r[tac].
name,
"_");
529 if(strlen(fnsp[1])) strcat(par->
r[tac].
name, fnsp[1]);
530 if(strlen(fnsp[2])) {
531 strcat(par->
r[tac].
name,
"_"); strcat(par->
r[tac].
name, fnsp[2]);}
541 n=sscanf(ift->
item[i].
value,
"%lf - %lf %s", &t1, &t2, tmp);
545 if(n>=2)
for(i=0; i<par->
tacNr; i++) {par->
r[i].
start=t1; par->
r[i].
end=t2;}
559 for(i=0; i<par->
parNr; i++) {
560 if(!strcasecmp(par->
n[i].
name,
"WSS") || !strcasecmp(par->
n[i].
name,
"SS"))
563 if(ci>=0 && ci<par->parNr && par->
parNr>1) {
564 if(verbose>4) printf(
"column %d contains WSS, moving to correct place\n", 1+ci);
565 for(i=0; i<par->
tacNr; i++) par->
r[i].
wss=par->
r[i].
p[ci];
591 double x, m=0.0, pint;
593 if(par==NULL || par->
tacNr<1 || parIndex<0 || parIndex>=par->
tacNr)
595 for(vi=0; vi<par->
tacNr; vi++) {
596 x=par->
r[vi].
p[parIndex];
597 if(modf(x, &pint)!=0.0) partype=1;
598 x=fabs(x);
if(x>m) m=x;
600 if(partype==1 && (m>=10.0 || m<0.1)) partype=2;
char * csvCell(CSV *csv, int row, int col)
int csvRowLength(CSV *csv, int row)
int csvFindField(CSV *csv, const char *s, int start_index)
int csvWrite(CSV *csv, int regular, FILE *fp, TPCSTATUS *status)
char * ctime_r_int(const time_t *t, char *buf)
Convert calendar time t into a null-terminated string of the form YYYY-MM-DD hh:mm:ss,...
double atofVerified(const char *s)
int iftPut(IFT *ift, const char *key, const char *value, char comment, TPCSTATUS *status)
int iftSearchValue(IFT *ift, const char *s, int start_index)
int iftFindKey(IFT *ift, const char *key, int start_index)
int iftWrite(IFT *ift, FILE *fp, TPCSTATUS *status)
int parDeletePar(PAR *par, int pi)
int parAllocate(PAR *par, int parNr, int tacNr)
int parWriteRES(PAR *par, FILE *fp, TPCSTATUS *status)
int parReadRES(PAR *par, CSV *csv, IFT *ift, TPCSTATUS *status)
int parPrintType(PAR *par, int parIndex)
char * roinameSubpart(const char *roiname, const char *dlm, const unsigned int si, char *subpart, const unsigned int slen)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
int strTokenNr(const char *s1, const char *s2)
int strTokenNCpy(const char *s1, const char *s2, int i, char *s3, int count)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
char * strcasestr(const char *haystack, const char *needle)
size_t strlcat(char *dst, const char *src, size_t dstsize)
IFT h
Optional (but often useful) header information.
char name[MAX_PARNAME_LEN+1]
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
Header file for library libtpccsv.
Header file for library libtpcextensions.
#define MAX_TACNAME_LEN
Max length of TAC ID name (not including trailing zero)
@ UNIT_UNKNOWN
Unknown unit.
#define MAX_PARNAME_LEN
Max string length for PAR name.
@ TPCERROR_FAIL
General error.
@ TPCERROR_INVALID_FORMAT
Invalid file format.
@ TPCERROR_UNSUPPORTED
Unsupported file type.
@ TPCERROR_NO_DATA
File contains no data.
@ TPCERROR_CANNOT_WRITE
Cannot write file.
int unitIdentify(const char *s)
char * unitName(int unit_code)
Header file for library libtpcift.
Header file for libtpcpar.
@ PAR_FORMAT_RES
Model result format of Turku PET Centre.