TPCCLIB
Loading...
Searching...
No Matches
parxmlio.c
Go to the documentation of this file.
1
4/*****************************************************************************/
5#include "tpcclibConfig.h"
6/*****************************************************************************/
7#include "tpcextensions.h"
8#include "tpcift.h"
9#include "tpccsv.h"
10/*****************************************************************************/
11#include <stdio.h>
12#include <stdlib.h>
13#include <math.h>
14#include <time.h>
15#include <string.h>
16/*****************************************************************************/
17#include "tpcpar.h"
18/*****************************************************************************/
19
20/*****************************************************************************/
28 PAR *par,
30 FILE *fp,
32 TPCSTATUS *status
33) {
34 int verbose=0; if(status!=NULL) verbose=status->verbose;
35 if(verbose>0) printf("%s()\n", __func__);
36 if(fp==NULL) {
37 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_CANNOT_WRITE);
39 }
40 if(par==NULL || par->tacNr<1 || par->parNr<1) {
41 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_NO_DATA);
42 return TPCERROR_NO_DATA;
43 }
44
45 /* Calculate column number */
46 int colNr=par->parNr+1; // including tac name
47 if(parIsModel(par)>0) colNr++;
48 for(int pi=0; pi<par->parNr; pi++) {
49 if(parSDWithPar(par, pi)) colNr++;
50 if(parCLWithPar(par, pi)) colNr+=2;
51 }
52 if(parIsWSS(par)) colNr++;
53 if(parIsFitRange(par)>0) colNr+=2;
54 if(parIsDataNr(par)>0) colNr++;
55 if(parIsFitNr(par)>0) colNr++;
56 if(verbose>1) printf(" colNr := %d\n", colNr);
57
58 /* Write XML header */
59 if(verbose>2) printf("writing XML header\n");
60 int n=fprintf(fp, "<?xml version=\"1.0\"?>\n");
61 if(n<1) {
62 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_CANNOT_WRITE);
64 }
65 fprintf(fp, "<ss:Workbook xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">\n");
66 fprintf(fp, " <ss:Styles>\n");
67 fprintf(fp, " <ss:Style ss:ID=\"1\">\n");
68 fprintf(fp, " <ss:Font ss:Bold=\"1\"/>\n");
69 fprintf(fp, " </ss:Style>\n");
70 fprintf(fp, " </ss:Styles>\n");
71 fprintf(fp, " <ss:Worksheet ss:Name=\"Sheet1\">\n");
72 fprintf(fp, " <ss:Table>\n");
73
74 /* Set column widths */
75 for(int i=0; i<colNr; i++) fprintf(fp, " <ss:Column ss:Width=\"80\"/>\n");
76
77 /* Write the title line */
78 if(verbose>2) printf("writing title line\n");
79 fprintf(fp, " <ss:Row ss:StyleID=\"1\">\n");
80 fprintf(fp, " <ss:Cell>\n");
81 fprintf(fp, " <ss:Data ss:Type=\"String\">Parameters</ss:Data>\n");
82 fprintf(fp, " </ss:Cell>\n");
83 /* model id */
84 if(parIsModel(par)>0) {
85 fprintf(fp, " <ss:Cell>\n");
86 fprintf(fp, " <ss:Data ss:Type=\"String\">Model</ss:Data>\n");
87 fprintf(fp, " </ss:Cell>\n");
88 }
89 /* parameter names with units, and SD and/or CLs, if available */
90 for(int pi=0; pi<par->parNr; pi++) {
91 if(par->n[pi].unit==UNIT_UNKNOWN) {
92 fprintf(fp, " <ss:Cell>\n");
93 fprintf(fp, " <ss:Data ss:Type=\"String\">%s</ss:Data>\n", par->n[pi].name);
94 fprintf(fp, " </ss:Cell>\n");
95 } else {
96 fprintf(fp, " <ss:Cell>\n");
97 fprintf(fp, " <ss:Data ss:Type=\"String\">%s[%s]</ss:Data>\n",
98 par->n[pi].name, unitName(par->n[pi].unit));
99 fprintf(fp, " </ss:Cell>\n");
100 }
101 if(parSDWithPar(par, pi)) {
102 fprintf(fp, " <ss:Cell>\n");
103 fprintf(fp, " <ss:Data ss:Type=\"String\">SD</ss:Data>\n");
104 fprintf(fp, " </ss:Cell>\n");
105 }
106 if(parCLWithPar(par, pi)) {
107 fprintf(fp, " <ss:Cell>\n");
108 fprintf(fp, " <ss:Data ss:Type=\"String\">95%%CL1</ss:Data>\n");
109 fprintf(fp, " </ss:Cell>\n");
110 fprintf(fp, " <ss:Cell>\n");
111 fprintf(fp, " <ss:Data ss:Type=\"String\">95%%CL2</ss:Data>\n");
112 fprintf(fp, " </ss:Cell>\n");
113 }
114 }
115 if(parIsWSS(par)) {
116 fprintf(fp, " <ss:Cell>\n");
117 fprintf(fp, " <ss:Data ss:Type=\"String\">WSS</ss:Data>\n");
118 fprintf(fp, " </ss:Cell>\n");
119 }
120 if(parIsFitRange(par)>0) {
121 fprintf(fp, " <ss:Cell>\n");
122 fprintf(fp, " <ss:Data ss:Type=\"String\">Start[min]</ss:Data>\n");
123 fprintf(fp, " </ss:Cell>\n");
124 fprintf(fp, " <ss:Cell>\n");
125 fprintf(fp, " <ss:Data ss:Type=\"String\">End[min]</ss:Data>\n");
126 fprintf(fp, " </ss:Cell>\n");
127 }
128 if(parIsDataNr(par)>0) {
129 fprintf(fp, " <ss:Cell>\n");
130 fprintf(fp, " <ss:Data ss:Type=\"String\">DataNr</ss:Data>\n");
131 fprintf(fp, " </ss:Cell>\n");
132 }
133 if(parIsFitNr(par)>0) {
134 fprintf(fp, " <ss:Cell>\n");
135 fprintf(fp, " <ss:Data ss:Type=\"String\">FitNr</ss:Data>\n");
136 fprintf(fp, " </ss:Cell>\n");
137 }
138 /* End the title line */
139 n=fprintf(fp, " </ss:Row>\n");
140 if(n<1) {
141 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_CANNOT_WRITE);
143 }
144
145 /* Write parameters */
146 if(verbose>2) printf("writing data table\n");
147 for(int ri=0; ri<par->tacNr; ri++) {
148 if(verbose>3) printf(" for region %d\n", 1+ri);
149 /* Start the line */
150 fprintf(fp, " <ss:Row>\n");
151 /* Region names and parameter values */
152 fprintf(fp, " <ss:Cell>\n");
153 char *senc=strEncodeForXML(par->r[ri].name);
154 if(senc==NULL) fprintf(fp, " <ss:Data ss:Type=\"String\">%s</ss:Data>\n", par->r[ri].name);
155 else {fprintf(fp, " <ss:Data ss:Type=\"String\">%s</ss:Data>\n", senc); free(senc);}
156 fprintf(fp, " </ss:Cell>\n");
157 if(parIsModel(par)>0) {
158 fprintf(fp, " <ss:Cell>\n");
159 fprintf(fp, " <ss:Data ss:Type=\"String\">%s</ss:Data>\n", modelCode(par->r[ri].model));
160 fprintf(fp, " </ss:Cell>\n");
161 }
162 for(int pi=0; pi<par->parNr; pi++) {
163 fprintf(fp, " <ss:Cell>\n");
164 if(isnan(par->r[ri].p[pi])) fprintf(fp, " <ss:Data ss:Type=\"Number\"></ss:Data>\n");
165 else fprintf(fp, " <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", par->r[ri].p[pi]);
166 fprintf(fp, " </ss:Cell>\n");
167 if(parSDWithPar(par, pi)) {
168 fprintf(fp, " <ss:Cell>\n");
169 if(isnan(par->r[ri].sd[pi])) fprintf(fp, " <ss:Data ss:Type=\"Number\"></ss:Data>\n");
170 else fprintf(fp, " <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", par->r[ri].sd[pi]);
171 fprintf(fp, " </ss:Cell>\n");
172 }
173 if(parCLWithPar(par, pi)) {
174 fprintf(fp, " <ss:Cell>\n");
175 if(isnan(par->r[ri].cl1[pi])) fprintf(fp, " <ss:Data ss:Type=\"Number\"></ss:Data>\n");
176 else fprintf(fp, " <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", par->r[ri].cl1[pi]);
177 fprintf(fp, " </ss:Cell>\n");
178 fprintf(fp, " <ss:Cell>\n");
179 if(isnan(par->r[ri].cl2[pi])) fprintf(fp, " <ss:Data ss:Type=\"Number\"></ss:Data>\n");
180 else fprintf(fp, " <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", par->r[ri].cl2[pi]);
181 fprintf(fp, " </ss:Cell>\n");
182 }
183 }
184 /* WSS etc */
185 if(parIsWSS(par)) {
186 fprintf(fp, " <ss:Cell>\n");
187 if(isnan(par->r[ri].wss)) fprintf(fp, " <ss:Data ss:Type=\"Number\"></ss:Data>\n");
188 else fprintf(fp, " <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", par->r[ri].wss);
189 fprintf(fp, " </ss:Cell>\n");
190 }
191 if(parIsFitRange(par)>0) {
192 fprintf(fp, " <ss:Cell>\n");
193 if(isnan(par->r[ri].start)) fprintf(fp, " <ss:Data ss:Type=\"Number\"></ss:Data>\n");
194 else fprintf(fp, " <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", par->r[ri].start);
195 fprintf(fp, " </ss:Cell>\n");
196 fprintf(fp, " <ss:Cell>\n");
197 if(isnan(par->r[ri].end)) fprintf(fp, " <ss:Data ss:Type=\"Number\"></ss:Data>\n");
198 else fprintf(fp, " <ss:Data ss:Type=\"Number\">%g</ss:Data>\n", par->r[ri].end);
199 fprintf(fp, " </ss:Cell>\n");
200 }
201 if(parIsDataNr(par)>0) {
202 fprintf(fp, " <ss:Cell>\n");
203 fprintf(fp, " <ss:Data ss:Type=\"Number\">%d</ss:Data>\n", par->r[ri].dataNr);
204 fprintf(fp, " </ss:Cell>\n");
205 }
206 if(parIsFitNr(par)>0) {
207 fprintf(fp, " <ss:Cell>\n");
208 fprintf(fp, " <ss:Data ss:Type=\"Number\">%d</ss:Data>\n", par->r[ri].fitNr);
209 fprintf(fp, " </ss:Cell>\n");
210 }
211 /* End the line */
212 n=fprintf(fp, " </ss:Row>\n");
213 if(n<1) {
214 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_CANNOT_WRITE);
216 }
217 }
218
219 /* Write XML end part */
220 fprintf(fp, " </ss:Table>\n");
221 fprintf(fp, " </ss:Worksheet>\n");
222 n=fprintf(fp, "</ss:Workbook>\n");
223 if(n<1) {
224 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_CANNOT_WRITE);
226 }
227
228 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_OK);
229 return(TPCERROR_OK);
230}
231/*****************************************************************************/
232
233/*****************************************************************************/
char * modelCode(const unsigned int i)
Definition modell.c:175
int parIsFitRange(PAR *par)
Definition par.c:267
int parSDWithPar(PAR *par, int pi)
Definition par.c:307
int parCLWithPar(PAR *par, int pi)
Definition par.c:325
int parIsFitNr(PAR *par)
Definition par.c:343
int parIsWSS(PAR *par)
Definition par.c:252
int parIsDataNr(PAR *par)
Definition par.c:362
int parIsModel(PAR *par)
Definition par.c:288
int parWriteXML(PAR *par, FILE *fp, TPCSTATUS *status)
Definition parxmlio.c:26
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
Definition statusmsg.c:142
char * strEncodeForXML(const char *s)
Definition stringext.c:731
Definition tpcpar.h:101
int parNr
Definition tpcpar.h:109
int tacNr
Definition tpcpar.h:105
PARR * r
Definition tpcpar.h:115
PARN * n
Definition tpcpar.h:113
int unit
Definition tpcpar.h:87
char name[MAX_PARNAME_LEN+1]
Definition tpcpar.h:83
double wss
Definition tpcpar.h:73
int fitNr
Definition tpcpar.h:59
char name[MAX_TACNAME_LEN+1]
Definition tpcpar.h:50
int dataNr
Definition tpcpar.h:63
double * cl2
Definition tpcpar.h:71
unsigned int model
Definition tpcpar.h:48
double * p
Definition tpcpar.h:65
double start
Definition tpcpar.h:52
double * sd
Definition tpcpar.h:67
double * cl1
Definition tpcpar.h:69
double end
Definition tpcpar.h:54
int verbose
Verbose level, used by statusPrint() etc.
Header file for library libtpccsv.
Header file for library libtpcextensions.
@ UNIT_UNKNOWN
Unknown unit.
@ TPCERROR_OK
No error.
@ TPCERROR_NO_DATA
File contains no data.
@ TPCERROR_CANNOT_WRITE
Cannot write file.
char * unitName(int unit_code)
Definition units.c:143
Header file for library libtpcift.
Header file for libtpcpar.