5#include "tpcclibConfig.h"
39 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
44 if(verbose>0) {printf(
"%s():\n", __func__); fflush(stdout);}
45 if(par==NULL || par->
tacNr<1 || par->
parNr<1) {
56 tointl=1; separator=
';';
58 tointl=0; separator=
',';
60 tointl=1; separator=
'\t';
62 tointl=0; separator=
'\t';
68 printf(
"writing %d parameters from %d TACs in %s format\n",
76 if(verbose>1) printf(
" add common info into header\n");
81 iftPut(&par->
h,
"model", tmp, 1, NULL);
85 sprintf(tmp,
"%d", par->
r[0].
dataNr);
86 iftPut(&par->
h,
"dataNr", tmp, 1, NULL);
90 sprintf(tmp,
"%d", par->
r[0].
fitNr);
91 iftPut(&par->
h,
"fitNr", tmp, 1, NULL);
99 if(
unitIsTime(tunit)) sprintf(unittext,
" %s",
unitName(tunit));
else strcpy(unittext,
"");
101 sprintf(tmp,
"%g%s", par->
r[0].
start, unittext);
102 iftPut(&par->
h,
"fit_start", tmp, 1, NULL);
104 sprintf(tmp,
"%g%s", par->
r[0].
end, unittext);
105 iftPut(&par->
h,
"fit_end", tmp, 1, NULL);
107 if(verbose>1) {printf(
" writing parameter header\n"); fflush(stdout);}
118 if(verbose>1) {fprintf(stderr,
"Error: cannot allocate memory for CSV.\n"); fflush(stderr);}
119 statusSet(status, __func__, __FILE__, __LINE__, ret);
125 if(verbose>1) {printf(
" writing parameter table\n"); fflush(stdout);}
128 if(verbose>2) {printf(
" writing parameter names\n"); fflush(stdout);}
160 statusSet(status, __func__, __FILE__, __LINE__, ret);
164 if(verbose>2) {printf(
" writing parameter values\n"); fflush(stdout);}
166 if(verbose>3) {printf(
" for region %d\n", 1+ri); fflush(stdout);}
168 if(strlen(par->
r[ri].
name)>0) {
171 char buf[16]; sprintf(buf,
"tac%d", 1+ri);
199 statusSet(status, __func__, __FILE__, __LINE__, ret);
204 if(verbose>2) {printf(
" actually writing CSV in file\n"); fflush(stdout);}
210 statusSet(status, __func__, __FILE__, __LINE__, ret);
232 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
243 if(verbose>0) printf(
"%s()\n", __func__);
246 if(strcasecmp(csv->
c[0].
content,
"Parameters")) {
256 int colNr=1, parNr=0;
257 for(
int i=1; i<csv->
nr; i++) {
258 if(csv->
c[i].
row==0) {
261 if(strncasecmp(csv->
c[i].
content,
"SD", 2)==0)
continue;
262 if(strncasecmp(csv->
c[i].
content,
"95%CL", 5)==0)
continue;
263 if(strcasecmp(csv->
c[i].
content,
"WSS")==0)
continue;
264 if(strcasecmp(csv->
c[i].
content,
"Model")==0)
continue;
265 if(strcasecmp(csv->
c[i].
content,
"Start[min]")==0)
continue;
266 if(strcasecmp(csv->
c[i].
content,
"End[min]")==0)
continue;
267 if(strcasecmp(csv->
c[i].
content,
"dataNr")==0)
continue;
268 if(strcasecmp(csv->
c[i].
content,
"fitNr")==0)
continue;
272 if(parNr<1 || csv->row_nr<2) {
276 if(verbose>2) printf(
" parNr := %d\n colNr := %d\n", parNr, colNr);
286 int decimal_comma=-1;
287 ret=0;
if(csv->
separator==
',') decimal_comma=0;
289 for(
int ri=1; ri<csv->
row_nr; ri++) {
290 int i=ri*colNr;
if(i>=csv->
nr || csv->
c[i].
col!=0) {ret++;
break;}
296 for(
int ci=1; ci<colNr && ret==0; ci++) {
298 if(parNr>par->
parNr) {ret++;
break;}
299 int ri=0;
int i=ri*colNr+ci;
300 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
301 if(strcasecmp(csv->
c[i].
content,
"Model")==0) {
302 for(ri=1; ri<csv->
row_nr; ri++) {
304 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
309 if(strncasecmp(csv->
c[i].
content,
"SD", 2)==0) {
310 if(parNr==0) {ret++;
break;}
311 for(ri=1; ri<csv->
row_nr; ri++) {
313 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
318 if(strncasecmp(csv->
c[i].
content,
"95%CL1", 6)==0) {
319 if(parNr==0) {ret++;
break;}
320 for(ri=1; ri<csv->
row_nr; ri++) {
322 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
327 if(strncasecmp(csv->
c[i].
content,
"95%CL2", 6)==0) {
328 if(parNr==0) {ret++;
break;}
329 for(ri=1; ri<csv->
row_nr; ri++) {
331 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
336 if(strcasecmp(csv->
c[i].
content,
"WSS")==0 || strcasecmp(csv->
c[i].
content,
"SS")==0) {
337 for(ri=1; ri<csv->
row_nr; ri++) {
339 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
344 if(strncasecmp(csv->
c[i].
content,
"Start", 5)==0) {
345 for(ri=1; ri<csv->
row_nr; ri++) {
347 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
352 if(strncasecmp(csv->
c[i].
content,
"End", 3)==0) {
353 for(ri=1; ri<csv->
row_nr; ri++) {
355 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
360 if(strcasecmp(csv->
c[i].
content,
"dataNr")==0) {
361 for(ri=1; ri<csv->
row_nr; ri++) {
363 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
368 if(strcasecmp(csv->
c[i].
content,
"fitNr")==0) {
369 for(ri=1; ri<csv->
row_nr; ri++) {
371 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
386 for(ri=1; ri<csv->
row_nr; ri++) {
388 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
390 if(decimal_comma<1) {
392 if(strchr(csv->
c[i].
content,
'.')!=NULL) decimal_comma=0;
393 else if(strchr(csv->
c[i].
content,
',')!=NULL) decimal_comma=1;
409 for(
int i=0; i<par->
parNr; i++) {
410 if(!strcasecmp(par->
n[i].
name,
"WSS") || !strcasecmp(par->
n[i].
name,
"SS")) ci=i;
412 if(ci>=0 && ci<par->parNr && par->
parNr>1) {
414 printf(
"column %d contains WSS, moving to correct place\n", 1+ci); fflush(stdout);}
415 for(
int i=0; i<par->
tacNr; i++) par->
r[i].
wss=par->
r[i].
p[ci];
439 if(hdr!=NULL && hdr->
keyNr>0) {
441 printf(
"copying header contents (%d items) to PAR struct\n", hdr->
keyNr); fflush(stdout);}
443 if(verbose>0) {printf(
" error in iftDuplicate()\n"); fflush(stdout);}
453 strcpy(key,
"fit_start");
458 strcpy(key,
"fit_end");
461 for(i=0; i<par->
tacNr; i++)
if(isnan(par->
r[i].
end)) par->
r[i].
end=v;
463 strcpy(key,
"dataNr");
467 strcpy(key,
"model");
int csvPutInt(CSV *csv, int v, int newline)
int csvAllocate(CSV *csv, int nr)
int csvPutString(CSV *csv, const char *s, int newline)
int csvPutDouble(CSV *csv, double v, int newline, int tointl)
int csvCleanSpaces(CSV *csv)
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 iftDelete(IFT *ift, int index)
int iftDuplicate(IFT *ift1, IFT *ift2)
void iftDeleteKey(IFT *ift, const char *key)
int iftFindKey(IFT *ift, const char *key, int start_index)
int iftGetDoubleWithUnit(IFT *ift, int index, double *v, int *unit)
int iftGetInt(IFT *ift, int index, int *v)
int iftWrite(IFT *ift, FILE *fp, TPCSTATUS *status)
char * modelCode(const unsigned int i)
unsigned int modelCodeIndex(const char *s)
int parIsFitRange(PAR *par)
int parSDWithPar(PAR *par, int pi)
int parDeletePar(PAR *par, int pi)
int parAllocate(PAR *par, int parNr, int tacNr)
int parCLWithPar(PAR *par, int pi)
int parIsDataNr(PAR *par)
int parWriteCSV(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
int parReadCSV(PAR *par, CSV *csv, IFT *hdr, TPCSTATUS *status)
char * parFormattxt(parformat c)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
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)
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_INVALID_HEADER
Invalid header contents.
@ TPCERROR_UNSUPPORTED
Unsupported file type.
@ TPCERROR_NO_DATA
File contains no data.
@ TPCERROR_CANNOT_WRITE
Cannot write file.
int unitIdentify(const char *s)
double unitConversionFactor(const int u1, const int u2)
char * unitName(int unit_code)
#define MAX_UNITS_LEN
Define max units string length.
Header file for library libtpcift.
Header file for libtpcpar.
@ PAR_FORMAT_CSV_UK
UK CSV.
@ PAR_FORMAT_CSV_INT
International CSV.
@ PAR_FORMAT_TSV_INT
International TSV (comma as decimal separator)
@ PAR_FORMAT_LAST
End of list.
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator)