TPCCLIB
Loading...
Searching...
No Matches
tacinv.c
Go to the documentation of this file.
1
7/*****************************************************************************/
8#include "tpcclibConfig.h"
9/*****************************************************************************/
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13#include <math.h>
14/*****************************************************************************/
15#include "tpcextensions.h"
16#include "tpcift.h"
17#include "tpctac.h"
18/*****************************************************************************/
19
20/*****************************************************************************/
21static char *info[] = {
22 "Inverts the y values (concentrations) in TAC file, that is, calculates 1/y.",
23 " ",
24 "Usage: @P [options] tacfile outputfile",
25 " ",
26 "Options:",
27 " -stdoptions", // List standard options like --help, -v, etc
28 " ",
29 "Values close to zero will be replaced by NaN.",
30 " ",
31 "See also: imginv, taccalc, fit_sigm, tacadd, taccuty",
32 " ",
33 "Keywords: TAC, modelling, simulation, tool",
34 0};
35/*****************************************************************************/
36
37/*****************************************************************************/
38/* Turn on the globbing of the command line, since it is disabled by default in
39 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
40 In Unix&Linux wildcard command line processing is enabled by default. */
41/*
42#undef _CRT_glob
43#define _CRT_glob -1
44*/
45int _dowildcard = -1;
46/*****************************************************************************/
47
48/*****************************************************************************/
52int main(int argc, char **argv)
53{
54 int ai, help=0, version=0, verbose=1;
55 int ret;
56 char tacfile[FILENAME_MAX], outfile[FILENAME_MAX];
57 TAC tac;
58
59
60 /*
61 * Get arguments
62 */
63 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
64 tacInit(&tac);
65 tacfile[0]=outfile[0]=(char)0;
66 /* Options */
67 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
68 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
69 // cptr=argv[ai]+1; if(*cptr=='-') cptr++; if(!*cptr) continue;
70 fprintf(stderr, "Error: invalid option '%s'\n", argv[ai]);
71 return(1);
72 } else break; // tac name argument may start with '-'
73
74 TPCSTATUS status; statusInit(&status);
75 statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
76 status.verbose=verbose-1;
77
78 /* Print help or version? */
79 if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
80 if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
81 if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
82
83 /* Arguments */
84 for(; ai<argc; ai++) {
85 if(!tacfile[0]) {
86 strcpy(tacfile, argv[ai]); continue;
87 } else if(!outfile[0]) {
88 strcpy(outfile, argv[ai]); continue;
89 }
90 fprintf(stderr, "Error: invalid argument '%s'.\n", argv[ai]);
91 return(1);
92 }
93
94 /* Is something missing? */
95 if(!outfile[0]) {tpcPrintUsage(argv[0], info, stdout); return(1);}
96
97
98 /* In verbose mode print arguments and options */
99 if(verbose>1) {
100 for(ai=0; ai<argc; ai++)
101 printf("%s ", argv[ai]);
102 printf("\n");
103 printf("tacfile := %s\n", tacfile);
104 printf("outfile := %s\n", outfile);
105 }
106
107
108 /*
109 * Read the file
110 */
111 if(verbose>1) printf("reading %s\n", tacfile);
112 ret=tacRead(&tac, tacfile, &status);
113 if(ret!=TPCERROR_OK) {
114 fprintf(stderr, "Error (%d): %s\n", ret, errorMsg(status.error));
115 tacFree(&tac); return(2);
116 }
117 if(verbose>2) {
118 printf("fileformat := %s\n", tacFormattxt(tac.format));
119 printf("tacNr := %d\n", tac.tacNr);
120 printf("sampleNr := %d\n", tac.sampleNr);
121 printf("xunit := %s\n", unitName(tac.tunit));
122 printf("yunit := %s\n", unitName(tac.cunit));
123 }
124
125
126 /*
127 * Invert the y data
128 */
129 int fi, ri, okNr=0, failNr=0;
130 double f;
131 for(ri=0; ri<tac.tacNr; ri++) {
132 for(fi=0; fi<tac.sampleNr; fi++) {
133 if(isnan(tac.c[ri].y[fi])) {failNr++; continue;}
134 f=1.0/tac.c[ri].y[fi];
135 if(isfinite(f)) {tac.c[ri].y[fi]=f; okNr++;}
136 else {tac.c[ri].y[fi]=nan(""); failNr++;}
137 continue;
138 }
139 }
140 if(verbose>1) {
141 printf(" failNr := %d\n", failNr);
142 printf(" okNr := %d\n", okNr);
143 }
144 if(okNr<1) {
145 fprintf(stderr, "Error: invalid data contents.\n");
146 tacFree(&tac); return(3);
147 }
148
149
150 /*
151 * Save data
152 */
153 if(verbose>1) printf("writing %s\n", outfile);
154 FILE *fp; fp=fopen(outfile, "w");
155 if(fp==NULL) {
156 fprintf(stderr, "Error: cannot open file for writing (%s)\n", outfile);
157 tacFree(&tac); return(11);
158 }
159 ret=tacWrite(&tac, fp, TAC_FORMAT_UNKNOWN, 1, &status);
160 fclose(fp); tacFree(&tac);
161 if(ret!=TPCERROR_OK) {
162 fprintf(stderr, "Error (%d): %s\n", ret, errorMsg(status.error));
163 return(12);
164 }
165 if(verbose>=0) printf("%s saved.\n", outfile);
166
167 return(0);
168}
169/*****************************************************************************/
170
171/*****************************************************************************/
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:47
int tpcHtmlUsage(const char *program, char *text[], const char *path)
Definition proginfo.c:169
void tpcPrintBuild(const char *program, FILE *fp)
Definition proginfo.c:339
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Definition proginfo.c:114
void statusInit(TPCSTATUS *s)
Definition statusmsg.c:104
char * errorMsg(tpcerror e)
Definition statusmsg.c:68
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
Definition statusmsg.c:142
double * y
Definition tpctac.h:75
Definition tpctac.h:87
unit cunit
Definition tpctac.h:105
tacformat format
Definition tpctac.h:93
int sampleNr
Definition tpctac.h:89
TACC * c
Definition tpctac.h:117
unit tunit
Definition tpctac.h:109
int tacNr
Definition tpctac.h:91
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
void tacFree(TAC *tac)
Definition tac.c:106
void tacInit(TAC *tac)
Definition tac.c:24
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
Definition tacio.c:413
char * tacFormattxt(tacformat c)
Definition tacio.c:98
int tacWrite(TAC *tac, FILE *fp, tacformat format, int extra, TPCSTATUS *status)
Definition tacio.c:332
Header file for library libtpcextensions.
@ TPCERROR_OK
No error.
char * unitName(int unit_code)
Definition units.c:143
Header file for library libtpcift.
Header file for library libtpctac.
@ TAC_FORMAT_UNKNOWN
Unknown format.
Definition tpctac.h:28