278 {
279 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
280 if(verbose>0) {printf("%s()\n", __func__); fflush(stdout);}
281 if(par==NULL) {
284 }
286
287 if(csv==NULL || ift==NULL || csv->
row_nr<1 || csv->
col_nr<1) {
290 }
291
292 if(verbose>10) {
293 printf("\n CSV contents shown with separator ; \n\n");
296 printf("\n IFT contents \n\n");
298 }
299
300 int i, ret, titlerow;
301 int ri, ci, parNr=0, tacNr=0;
302 char *cptr;
303
304
305 i=0; if(verbose>2) printf("estimating parNr and tacNr\n");
306 while(i<csv->nr) {
308 if(i>=0 && csv->
c[i].
col==0)
break;
309 i++;
310 }
311 if(i<0 || i==csv->nr) {
315 }
316 titlerow=csv->
c[i].
row;
317
319
320 ci=parNr;
while(ci>0 && strlen(csv->
c[ci].
content)<1) {ci--; parNr--;}
321
322 if(strlen(csv->
c[i+1].
content)<1) parNr--;
323
324 ri=1+titlerow; ci=0;
326 while(cptr!=NULL) {
328 if(strncasecmp(cptr, "SD . .", 3) && strncasecmp(cptr, "CL 95% ", 7)) tacNr++;
329 } else {
330 if(strcasecmp(cptr, "SD") && strcasecmp(cptr, "CL")) tacNr++;
331 }
332 ri++; cptr=
csvCell(csv, ri, ci);
333 }
334 if(verbose>2) {
335 printf(" parNr := %d\n", parNr);
336 printf(" tacNr := %d\n", tacNr);
337 }
338 if(parNr<1 || tacNr<1) {
342 }
343
346 statusSet(status, __func__, __FILE__, __LINE__, ret);
347 return ret;
348 }
350
351
352 if(verbose>2) printf("searching obligatory program name\n");
353 i=0;
355 if(verbose>3) {
356 printf(
"ift->item[%d].value := '%s'\n", i, ift->
item[i].
value);
357 }
361 }
363
364
367
368
371
372
385
386
389
390
405
406
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);
412 } else {
414 if(i>=0) {
416 } else {
420 }
421 }
422
423
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);
429 }
430
431
432 int tac=0;
433 double *dptr;
435 do {
436 ci=0; cptr=
csvCell(csv, ri, ci);
438
439
440
441 dptr=NULL;
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;
452 }
453 }
454 } else {
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;
464 }
465 }
466 if(dptr!=NULL) {
467
468 for(i=0; i<parNr; i++) {
472 ci++;
473 }
474 ri++; continue;
475 }
476 if(tac>=tacNr) break;
477
478
481 ci++; cptr=
csvCell(csv, ri, ci);
484 ci++; cptr=
csvCell(csv, ri, ci);
487 }
488
489 ci++;
490 for(i=0; i<parNr; i++) {
494 ci++;
495 }
497 ri++; tac++;
498 } while(1);
501 statusSet(status, __func__, __FILE__, __LINE__, ret);
502 return ret;
503 }
504
505
507 if(i>0) {
509 if(n>parNr) n=parNr;
510 char tmp[256];
511 for(int j=0; j<n; j++) {
514 }
515 }
516
517
518 {
519 int i, tac;
521 for(tac=0; tac<par->
tacNr; tac++) {
522 for(i=0; i<3; i++) {
524 strcmp(fnsp[i], ".")==0)
525 strcpy(fnsp[i], "");
526 }
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]);}
532 }
533 }
534
535
537 if(i>=0) {
538 double t1, t2;
539 char tmp[256];
540 int n;
541 n=sscanf(ift->
item[i].
value,
"%lf - %lf %s", &t1, &t2, tmp);
543 t1/=60.; t2/=60.;
544 }
545 if(n>=2)
for(i=0; i<par->
tacNr; i++) {par->
r[i].
start=t1; par->
r[i].
end=t2;}
546 }
547
548
549
551 if(i>=0) {
554 }
555
556
557
558 ci=-1;
559 for(i=0; i<par->
parNr; i++) {
560 if(!strcasecmp(par->
n[i].
name,
"WSS") || !strcasecmp(par->
n[i].
name,
"SS"))
561 ci=i;
562 }
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];
566
568 }
569
570
572
573
576}
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)
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)
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.
#define MAX_TACNAME_LEN
Max length of TAC ID name (not including trailing zero).
#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.
int unitIdentify(const char *s)
@ PAR_FORMAT_RES
Model result format of Turku PET Centre.