7#include "tpcclibConfig.h"
25static const char *par_format[] = {
39static const char *par_fn_ext[] = {
64 return (
char*)par_format[c];
81 if(strcasecmp(par_format[i], s)==0)
return i;
138 return (
char*)par_fn_ext[c];
162 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
167 if(par==NULL || par->
tacNr<1 || par->
parNr<1) {
184 printf(
"%s():\n", __func__);
185 printf(
"writing %d parameters from %d TACs in %s format\n",
217 fflush(fp); fflush(stderr);
220 statusSet(status, __func__, __FILE__, __LINE__, ret);
241 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
242 if(fname==NULL || strlen(fname)<1 || par==NULL) {
246 if(verbose>1) {printf(
"%s(%s)\n", __func__, fname); fflush(stdout);}
253 if(verbose>1) {printf(
"opening file\n"); fflush(stdout);}
255 fp=fopen(fname,
"r");
265 statusSet(status, __func__, __FILE__, __LINE__, ret);
269 printf(
"\n --- CSV contents ---\n");
274 if(verbose>1) {printf(
"checking for magic number\n"); fflush(stdout);}
275 if(strncasecmp(csv.
c[0].
content,
"FIT1", 4)==0) {
277 }
else if(strncasecmp(csv.
c[0].
content,
"<?xml version", 5)==0) {
279 }
else if(strcasecmp(csv.
c[0].
content,
"Parameters")==0) {
288 if(verbose>3) {printf(
"format := %s\n",
parFormattxt(format)); fflush(stdout);}
292 if(verbose>1) {printf(
"format := %s\n",
parFormattxt(format)); fflush(stdout);}
299 fp=fopen(fname,
"r");
308 fp=fopen(fname,
"r");
311 ret=
iftRead(&hdr, fp, 0, 1, status);
316 statusSet(status, __func__, __FILE__, __LINE__, ret);
338 statusSet(status, __func__, __FILE__, __LINE__, ret);
349 if(verbose>3) {printf(
"trying IFT format\n"); fflush(stdout);}
350 fp=fopen(fname,
"r");
353 iftRead(&hdr, fp, 1, 1, status); fclose(fp);
355 if(!strcasecmp(hdr.
item[0].
key,
"content") && !strcasecmp(hdr.
item[0].
value,
"parameters"))
359 if(verbose>1) printf(
"format := %s\n",
parFormattxt(format));
367 if(verbose>3) printf(
"not IFT\n");
372 if(verbose>3) {printf(
"trying RES format\n"); fflush(stdout);}
374 fp=fopen(fname,
"r");
377 ret=
iftRead(&hdr, fp, 0, 1, status); fclose(fp);
380 statusSet(status, __func__, __FILE__, __LINE__, ret);
394 if(verbose>3) {printf(
"currently not supported format\n"); fflush(stdout);}
413 if(par==NULL || par->
parNr<1) {fprintf(fp,
"No parameter limits.\n");
return;}
415 fprintf(fp,
"Parameter limits:\n");
416 for(
int i=0; i<par->
parNr; i++) {
417 if(strlen(par->
n[i].
name)>0) fprintf(fp,
"%s", par->
n[i].
name);
418 else fprintf(fp,
"p%d", 1+i);
419 fprintf(fp,
"\t%g\t%g\n", par->
n[i].
lim1, par->
n[i].
lim2);
440 if(verbose>0) {printf(
"%s(%s)\n", __func__, fname); fflush(stdout);}
447 for(
int i=0; i<par->
parNr; i++) {
448 if(!isnan(par->
n[i].
lim1)) {
449 if(strlen(par->
n[i].
name)>0) strcpy(pname, par->
n[i].
name);
else sprintf(pname,
"p%d", 1+i);
452 if(!isnan(par->
n[i].
lim2)) {
453 if(strlen(par->
n[i].
name)>0) strcpy(pname, par->
n[i].
name);
else sprintf(pname,
"p%d", 1+i);
456 if(!isnan(par->
n[i].
tol)) {
457 if(strlen(par->
n[i].
name)>0) strcpy(pname, par->
n[i].
name);
else sprintf(pname,
"p%d", 1+i);
461 if(verbose>1) printf(
" keyNr=%d\n", ift.
keyNr);
465 if(strcasecmp(fname,
"stdout")==0) {
468 if(verbose>1) printf(
" opening %s\n", fname);
469 FILE *fp=fopen(fname,
"w");
471 if(verbose>1) printf(
" writing in %s\n", fname);
498 if(verbose>0) {printf(
"%s(%s)\n", __func__, fname); fflush(stdout);}
503 if(verbose>1) printf(
" opening %s\n", fname);
504 FILE *fp=fopen(fname,
"r");
508 if(verbose>1) printf(
" reading into IFT\n");
512 if(verbose>1) printf(
" keyNr=%d\n", ift.
keyNr);
518 for(
int i=0; i<par->
parNr; i++) {
519 if(strlen(par->
n[i].
name)>0) strcpy(pname, par->
n[i].
name);
520 else sprintf(pname,
"p%d", 1+i);
521 strcat(pname,
"_lower");
523 if(verbose>2) printf(
" %s -> %g\n", pname, f);
524 pname[strlen(pname)-6]=(char)0; strcat(pname,
"_upper");
526 if(verbose>2) printf(
" %s -> %g\n", pname, f);
527 pname[strlen(pname)-6]=(char)0; strcat(pname,
"_tol");
529 if(verbose>2) printf(
" %s -> %g\n", pname, f);
532 if(verbose>1) printf(
" n=%d\n", n);
int csvRead(CSV *csv, FILE *fp, TPCSTATUS *status)
int csvWrite(CSV *csv, int regular, FILE *fp, TPCSTATUS *status)
char * filenameGetExtensions(const char *s)
Get all extensions of a file name.
int iftPutDouble(IFT *ift, const char *key, const double value, char comment, TPCSTATUS *status)
int iftGetDoubleValue(IFT *ift, const char *key, int index, double *v)
int iftWrite(IFT *ift, FILE *fp, TPCSTATUS *status)
int iftRead(IFT *ift, FILE *fp, int is_key_required, int is_comment_accepted, TPCSTATUS *status)
int parWriteCSV(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
int parReadCSV(PAR *par, CSV *csv, IFT *hdr, TPCSTATUS *status)
int parWriteFIT(PAR *par, FILE *fp, TPCSTATUS *status)
int parReadFIT(PAR *par, CSV *csv, IFT *ift, TPCSTATUS *status)
int parWriteIFT(PAR *par, FILE *fp, TPCSTATUS *status)
int parFromIFT(PAR *par, IFT *ift, TPCSTATUS *status)
char * parFormattxt(parformat c)
int parFormatIdentify(const char *s)
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
int parReadLimits(PAR *par, const char *fname, const int verbose)
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
void parListLimits(PAR *par, FILE *fp)
int parFormatFromExtension(const char *s)
char * parDefaultExtension(parformat c)
int parWriteLimits(PAR *par, const char *fname, const int verbose)
int parWriteRES(PAR *par, FILE *fp, TPCSTATUS *status)
int parReadRES(PAR *par, CSV *csv, IFT *ift, TPCSTATUS *status)
int parWriteXML(PAR *par, FILE *fp, TPCSTATUS *status)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
char * strcasestr(const char *haystack, const char *needle)
char name[MAX_PARNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
Header file for library libtpccsv.
Header file for library libtpcextensions.
#define MAX_PARNAME_LEN
Max string length for PAR name.
@ TPCERROR_FAIL
General error.
@ TPCERROR_INVALID_FORMAT
Invalid file format.
@ TPCERROR_CANNOT_OPEN
Cannot open file.
@ TPCERROR_UNSUPPORTED
Unsupported file type.
@ TPCERROR_INVALID_FILENAME
Invalid file name.
@ TPCERROR_NO_DATA
File contains no data.
@ TPCERROR_CANNOT_READ
Cannot read file.
@ TPCERROR_CANNOT_WRITE
Cannot write file.
Header file for library libtpcift.
Header file for libtpcpar.
@ PAR_FORMAT_XML
XML format (currently not supported)
@ PAR_FORMAT_HTML
HTML table format (currently not supported)
@ PAR_FORMAT_CSV_UK
UK CSV.
@ PAR_FORMAT_CSV_INT
International CSV.
@ PAR_FORMAT_IFT
Interfile-type data (supported for writing)
@ PAR_FORMAT_TSV_INT
International TSV (comma as decimal separator)
@ PAR_FORMAT_RES
Model result format of Turku PET Centre.
@ PAR_FORMAT_FIT
Function fit format of Turku PET Centre.
@ PAR_FORMAT_UNKNOWN
Unknown format.
@ PAR_FORMAT_LAST
End of list.
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator)