5#include "tpcclibConfig.h"
37 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
38 if(verbose>0) printf(
"%s()\n", __func__);
48 char *cptr, tunit[128], cunit[128];
61 if(cptr!=NULL) {*cptr=
'c'; cptr++; *cptr=
'c';}
65 if(verbose>2) printf(
"constructing TAC names\n");
69 if(verbose>2) printf(
"writing obligatory title lines\n");
70 if(tac->
isframe==0) n=fprintf(fp,
"time[%s]", tunit);
71 else n=fprintf(fp,
"start[%s]\tend[%s]", tunit, cunit);
76 for(
int ri=0; ri<tac->
tacNr; ri++) {
80 n=fprintf(fp,
"\t%s", tac->
c[ri].
name);
86 if(ri==0 && tac->
isframe==0) fprintf(fp,
"[%s]", cunit);
89 n=fprintf(fp,
"\n");
if(n<1) {
95 if(verbose>2) printf(
"writing data table\n");
96 for(
int fi=0, n=0; fi<tac->
sampleNr; fi++) {
98 if(tac->
isframe==0) v=tac->
x[fi];
else v=tac->
x1[fi];
99 if(!isfinite(v)) n=fprintf(fp,
".");
else n=fprintf(fp,
"%.5f", v);
103 if(!isfinite(v)) n=fprintf(fp,
"\t.");
else n=fprintf(fp,
"\t%.5f", v);
107 for(
int ri=0; ri<tac->
tacNr; ri++) {
108 if(!isfinite(tac->
c[ri].
y[fi])) n=fprintf(fp,
"\t.");
109 else fprintf(fp,
"\t%.*e", prec, tac->
c[ri].
y[fi]);
114 if(!isfinite(tac->
w[fi])) n=fprintf(fp,
"\t.");
115 else n=fprintf(fp,
"\t%.*e", prec, tac->
w[fi]);
118 if(n>0) n=fprintf(fp,
"\n");
158 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
163 if(verbose>0) printf(
"%s()\n", __func__);
174 if(strncasecmp(csv->
c[0].
content,
"Time", 4)==0) isframe=0;
175 else if(strncasecmp(csv->
c[0].
content,
"Start", 5)==0 &&
176 strncasecmp(csv->
c[1].
content,
"End", 3)==0) isframe=1;
184 n=csv->
col_nr-1;
if(isframe==1) n--;
190 statusSet(status, __func__, __FILE__, __LINE__, ret);
200 cptr=strchr(csv->
c[0].
content,
'[');
202 cptr=strchr(csv->
c[0].
content,
'(');
209 cptr=strrchr(tmp,
']');
if(cptr==NULL) cptr=strrchr(tmp,
')');
210 if(cptr!=NULL) *cptr=
'\0';
216 cptr=strchr(csv->
c[1].
content,
'[');
221 cptr=strrchr(tmp,
']');
if(cptr!=NULL) *cptr=
'\0';
228 n=0;
if(isframe==0) i=1;
else i=2;
229 for(; i<csv->
nr; i++) {
230 if(csv->
c[i].
row!=0 || n>=tac->
tacNr)
break;
232 if(strchr(csv->
c[i].
content,
'[')) {
234 cptr=strchr(tmp,
'['); *cptr=
'\0';
240 if(strcmp(tac->
c[n].
name,
".")==0) strcpy(tac->
c[n].
name,
"");
248 if(verbose>2) printf(
" tacNr=%d\n sampleNr=%d\n", tac->
tacNr, tac->
sampleNr);
251 int fi=0, ri=0, oknr=0;
254 for(i=0; i<csv->
nr; i++)
if(csv->
c[i].
row==1)
break;
255 for(; i<csv->
nr; i++) {
256 if(verbose>10) printf(
"i=%d\trow=%d\tcol=%d\n", i, csv->
c[i].
row, csv->
c[i].
col);
257 fi=csv->
c[i].
row-1;
if(fi<0 || fi>=tac->
sampleNr) {ret++;
continue;}
258 if(csv->
c[i].
col<0) {ret++;
continue;}
260 if(ri>=tac->
tacNr) {ret++;
continue;}
262 if(verbose>10) printf(
" -> fi=%d\tri=%d\t=\t%g\n", fi, ri, v);
265 if(ri==-2) tac->
x1[fi]=v;
else if(ri==-1) tac->
x2[fi]=v;
267 }
else tac->
c[ri].
y[fi]=v;
269 if(verbose>0 && ret>0) printf(
"%d error(s) in reading PMOD file format.\n", ret);
277 tac->
x[fi]=0.5*(tac->
x1[fi]+tac->
x2[fi]);
282 if(strlen(tac->
c[ci].
name)>0)
break;
284 for(i=0; i<tac->
sampleNr; i++)
if(isfinite(tac->
c[ci].
y[i]))
break;
285 if(i<tac->sampleNr)
break;
299 statusSet(status, __func__, __FILE__, __LINE__, ret);
double atofVerified(const char *s)
int iftDuplicate(IFT *ift1, IFT *ift2)
int iftWrite(IFT *ift, FILE *fp, TPCSTATUS *status)
int tacReadPMOD(TAC *tac, CSV *csv, IFT *hdr, TPCSTATUS *status)
int tacWritePMOD(TAC *tac, FILE *fp, int extra, TPCSTATUS *status)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
void strReplaceChar(char *s, char c1, char c2)
char * strdup(const char *s)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
char * strcasestr(const char *haystack, const char *needle)
char name[MAX_TACNAME_LEN+1]
IFT h
Optional (but often useful) header information.
int verbose
Verbose level, used by statusPrint() etc.
int tacAllocate(TAC *tac, int sampleNr, int tacNr)
int tacGetHeaderUnit(TAC *tac, TPCSTATUS *status)
int tacGetHeaderTimeunit(TAC *tac, TPCSTATUS *status)
int tacSetHeaderTimeunit(IFT *h, int u)
int tacSetHeaderUnit(IFT *h, int u)
void tacEnsureNames(TAC *tac)
int tacWMove(TAC *tac, int ow, TPCSTATUS *status)
int tacIsWeighted(TAC *tac)
Header file for library libtpccsv.
#define MAX_TACNAME_LEN
Max length of TAC ID name (not including trailing zero)
@ UNIT_UNKNOWN
Unknown unit.
@ TPCERROR_FAIL
General error.
@ TPCERROR_INVALID_FORMAT
Invalid file format.
@ TPCERROR_NO_WEIGHTS
File contains no weights.
@ 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 library libtpcisotope.
Header file for library libtpctac.
@ TAC_FORMAT_PMOD
PMOD TAC format.