10#include "tpcclibConfig.h"
24static char *info[] = {
25 "Calculate difference between parameters in two files as percent change",
26 "in file2 from file1 using equation 100%*(result2-result1)/|result1|.",
27 "If file name for %-difference is not given, output is printed",
28 "on screen (stdout).",
30 "Usage: @P [options] <file1> <file2> [%-difference file]",
35 " Occupance or inhibition percentage is calculated, that is,",
36 " 100%*(result1-result2)/result1.",
38 " Difference result2-result1 is calculated.",
40 " Result files are allowed to contain different parameter and TAC names",
43 " Differences are rounded to the nearest integer percentage.",
46 "See also: parrenp, parcoll, parai, parformat, parmatch, paradd, parsort",
48 "Keywords: parameter, modelling, simulation, occupancy, inhibition",
67int main(
int argc,
char **argv)
69 int ai, help=0, version=0, verbose=1;
76 char parfile1[FILENAME_MAX], parfile2[FILENAME_MAX], diffile[FILENAME_MAX];
83 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
85 parfile1[0]=parfile2[0]=diffile[0]=(char)0;
87 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
89 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
90 if(strcasecmp(cptr,
"F")==0 || strcasecmp(cptr,
"FORCE")==0) {
91 use_force=1;
continue;
92 }
else if(strncasecmp(cptr,
"NOCHECK", 4)==0) {
93 use_force=1;
continue;
94 }
else if(strncasecmp(cptr,
"OCCUPANCE", 3)==0) {
95 diff_type=1;
continue;
96 }
else if(strncasecmp(cptr,
"INHIBITION", 3)==0) {
97 diff_type=2;
continue;
98 }
else if(strncasecmp(cptr,
"DIFFERENCE", 3)==0) {
99 diff_type=3;
continue;
100 }
else if(strcasecmp(cptr,
"ROUND")==0) {
101 rounding=1;
continue;
103 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
108 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
113 for(; ai<argc; ai++) {
115 strlcpy(parfile1, argv[ai], FILENAME_MAX);
continue;
116 }
else if(!parfile2[0]) {
117 strlcpy(parfile2, argv[ai], FILENAME_MAX);
continue;
118 }
else if(!diffile[0]) {
119 strlcpy(diffile, argv[ai], FILENAME_MAX);
continue;
121 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
130 if(!parfile2[0]) {
tpcPrintUsage(argv[0], info, stdout);
return(1);}
134 for(ai=0; ai<argc; ai++) printf(
"%s ", argv[ai]);
136 printf(
"parfile1 := %s\n", parfile1);
137 printf(
"parfile2 := %s\n", parfile2);
138 printf(
"diffile := %s\n", diffile);
139 printf(
"diff_type := %d\n", diff_type);
140 printf(
"use_force := %d\n", use_force);
141 printf(
"rounding := %d\n", rounding);
149 if(verbose>1) fprintf(stdout,
"reading %s\n", parfile1);
150 if(
parRead(&par1, parfile1, &status)) {
151 fprintf(stderr,
"Error: %s (%s)\n",
errorMsg(status.
error), parfile1);
155 if(verbose>1) printf(
"reading %s\n", parfile2);
156 if(
parRead(&par2, parfile2, &status)) {
157 fprintf(stderr,
"Error: %s (%s)\n",
errorMsg(status.
error), parfile2);
163 if(verbose>1) fprintf(stdout,
"sorting regions\n");
168 if(verbose>1) fprintf(stdout,
"check for matching results\n");
170 fprintf(stderr,
"Error: different TAC number in parameter files.\n");
174 fprintf(stderr,
"Error: different parameters in parameter files.\n");
178 fprintf(stderr,
"Error: different TAC names in parameter files.\n");
185 if(verbose>1) fprintf(stdout,
"calculating differences\n");
186 for(ri=0; ri<par1.
tacNr; ri++) {
187 for(pi=0; pi<par1.
parNr && pi<par2.
parNr; pi++) {
188 if(par1.
r[ri].
p[pi]!=0.0) {
190 f=par2.
r[ri].
p[pi]-par1.
r[ri].
p[pi];
191 f/=fabs(par1.
r[ri].
p[pi]);
192 f*=100.0;
if(rounding) f=roundf(f);
193 }
else if(diff_type==3) {
194 f=par2.
r[ri].
p[pi]-par1.
r[ri].
p[pi];
196 f=par1.
r[ri].
p[pi]-par2.
r[ri].
p[pi];
198 f*=100.0;
if(rounding) f=roundf(f);
202 par1.
r[ri].
p[pi]=0.0;
204 par1.
r[ri].
sd[pi]=par1.
r[ri].
cl1[pi]=par1.
r[ri].
cl2[pi]=nan(
"");
212 if(verbose>1) fprintf(stdout,
"writing differences in %s\n", diffile);
219 iftPut(&par1.
h,
"program", buf, 0, NULL);
227 iftPut(&par1.
h,
"reffile", parfile1, 0, NULL);
228 iftPut(&par1.
h,
"datafile", parfile2, 0, NULL);
244 for(ri=0; ri<par1.
tacNr; ri++) par1.
r[ri].
wss=nan(
"");
248 if(!diffile[0]) fp=stdout;
else fp=fopen(diffile,
"w");
250 fprintf(stderr,
"Error: cannot open file for writing.\n");
254 if(diffile[0]) fclose(fp);
260 if(verbose>0 && diffile[0])
261 printf(
"parameter differences saved in %s\n", diffile);
int iftPut(IFT *ift, const char *key, const char *value, char comment, TPCSTATUS *status)
int iftDelete(IFT *ift, int index)
int iftFindKey(IFT *ift, const char *key, int start_index)
int parCompareTacNames(PAR *d1, PAR *d2, const int i, const int casens, TPCSTATUS *status)
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
int parSortByName(PAR *d, TPCSTATUS *status)
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
void tpcProgramName(const char *program, int version, int copyright, char *prname, int n)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
void statusInit(TPCSTATUS *s)
char * errorMsg(tpcerror e)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
IFT h
Optional (but often useful) header information.
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpcextensions.
@ UNIT_PERCENTAGE
Percentage (%).
Header file for library libtpcift.
Header file for libtpcpar.
@ PAR_FORMAT_UNKNOWN
Unknown format.