TPCCLIB
Loading...
Searching...
No Matches
plotfit.c
Go to the documentation of this file.
1
5/*****************************************************************************/
6
7/*****************************************************************************/
8#include "libtpcmodext.h"
9/*****************************************************************************/
10
11/*****************************************************************************/
18 DFT *dft1,
20 DFT *dft2,
22 char *main_title,
24 double x1,
26 double x2,
28 double y1,
30 double y2,
32 char *fname,
34 int verbose
35) {
36 int ret, n, ri, si, ei;
37 char x_title[64], y_title[64], tac_id[32], tac_title[64];
38 double minx, maxx, miny, maxy, tx1, tx2, ty1, ty2, f;
39 struct svg_viewports viewports; svg_init_viewports(&viewports);
40 int max_color_nr, color_nr;
41 int max_symbol_nr, symbol_nr;
42 SVG_LEGENDS legends; svg_init_legends(&legends);
43 FILE *fp_svg=NULL;
44
45 if(verbose>0) {
46 printf("%s(dft1, dft2, mt, x1, x2, y1, y2, fn, %d)\n", __func__, verbose);
47 }
48
49 /* Check data */
50 if(dft1==NULL || dft1->voiNr<1) return(1);
51 if(dft2==NULL) return(1);
52 if(dft2->voiNr!=dft1->voiNr) return(1);
53
54 /* Check if file exists; backup, if necessary */
55 ret=backupExistingFile(fname, NULL, NULL); if(ret) return(2);
56
57 int is_label=0; if(dft1->voiNr>1) is_label=1;
58
59 /* Determine the plot min and max x values */
60 ret=dftMinMax(dft1, &tx1, &tx2, NULL, NULL); if(ret) return(3);
61 minx=tx1; maxx=tx2;
62 ret=dftMinMax(dft2, &tx1, &tx2, NULL, NULL); if(ret) return(3);
63 if(minx>tx1) minx=tx1;
64 if(maxx<tx2) maxx=tx2;
65 if(minx>0.0) {
66 f=maxx-minx; minx-=0.05*f;
67 if(minx<0.0) minx=0.0;
68 }
69 if(!isnan(x1)) minx=x1;
70 if(!isnan(x2)) maxx=x2;
71
72 /* Determine the plot min and max y values */
73 ret=dftMaxY(dft1, minx, maxx, &ty1, &ty2); if(ret) return(3);
74 miny=ty1; maxy=ty2;
75 ret=dftMaxY(dft2, minx, maxx, &ty1, &ty2); if(ret) return(3);
76 if(miny>ty1) miny=ty1;
77 if(maxy<ty2) maxy=ty2;
78 if(miny>0.0) {
79 f=maxy-miny; miny-=0.05*f;
80 if(miny<0.0) miny=0.0;
81 }
82 if(!isnan(y1)) miny=y1;
83 if(!isnan(y2)) maxy=y2;
84
85 if(verbose>1) printf("minx:=%g\nmaxx:=%g\nminy:=%g\nmaxy:=%g\n", minx, maxx, miny, maxy);
86
87 /* Calculate the axis ticks */
88 viewports.label_area_viewport.is=is_label; // needed for x axis ticks
89 viewports.x.min=minx; viewports.x.max=maxx;
90 viewports.y.min=miny; viewports.y.max=maxy;
91 if(isnan(x1) || isnan(x2)) viewports.x.fixed_min=0;
92 if(isnan(y1) || isnan(y2)) viewports.y.fixed_min=0;
93 else viewports.y.fixed_min=1;
94 ret=svg_calculate_axes(&viewports, verbose-3); if(ret) return(4);
95
96 /* Set x and y axis titles based on activity and time units */
97 strcpy(x_title, "");
98 if(dft1->timeunit==DFTTIME_SEC || dft1->timeunit==DFTTIME_MIN)
99 sprintf(x_title, "Time (%s)", dftTimeunit(dft1->timeunit));
100 else if(dft1->timeunit!=DFTTIME_UNKNOWN)
101 strcpy(x_title, dftTimeunit(dft1->timeunit));
102 strcpy(y_title, "");
103 if(dftUnitId(dft1->unit)!=DFTUNIT_UNKNOWN)
104 strcpy(y_title, dftUnit(dftUnitId(dft1->unit)));
105
106 /* Set the plot window and window area sizes */
107 ret=svg_define_viewports(0, 0, strlen(main_title), strlen(y_title),
108 strlen(x_title), is_label, &viewports, verbose-3);
109 if(ret) return(5);
110
111 /* Initiate graphics file */
112 fp_svg=svg_initiate(fname, 0, 0, &viewports, NULL, verbose-3);
113 if(fp_svg==NULL) return(6);
114
115 /* Put the graph titles into their own viewports */
116 ret=svg_create_main_title(fp_svg, main_title, "", &viewports, NULL,verbose-3);
117 if(ret) return(7);
118 ret=svg_create_yaxis_title(fp_svg, y_title, &viewports, NULL, verbose-3);
119 if(ret) return(8);
120 ret=svg_create_xaxis_title(fp_svg, x_title, &viewports, NULL, verbose-3);
121 if(ret) return(9);
122
123 /* Put the plot into its own viewport */
124 ret=svg_start_plot_viewport(fp_svg, &viewports, NULL, verbose-3);
125 if(ret) return(10);
126
127 /* Start coordinate area viewport */
128 ret=svg_start_coordinate_viewport(fp_svg, &viewports, NULL, verbose-3);
129 if(ret) return(11);
130
131 /* Write plot axes */
132 ret=svg_write_axes(fp_svg, &viewports, NULL, verbose-3);
133 if(ret) return(12);
134
135 /*
136 * Draw the plots
137 */
138 max_color_nr=0; while(svgColorName(max_color_nr)!=NULL) max_color_nr++;
139 if(max_color_nr==0) max_color_nr=1; // remainder works only if 2nd operator>0
140 if(verbose>3) printf("max_color_nr := %d\n", max_color_nr);
141 max_symbol_nr=0; while(svgSymbolName(max_symbol_nr)!=NULL) max_symbol_nr++;
142 if(max_symbol_nr==0) max_symbol_nr=1; // remainder works only if 2nd operator>0
143 if(verbose>3) printf("max_symbol_nr := %d\n", max_symbol_nr);
144 if(dft1->voiNr==1) color_nr=0; else color_nr=1;
145 symbol_nr=0;
146 for(ri=0, n=0; ri<dft1->voiNr; ri++) {
147 sprintf(tac_id, "plot_%d", n);
148/*
149 if(strlen(dft1->studynr)>0 && strcmp(dft1->studynr, ".")!=0)
150 sprintf(tac_title, "%s: %s", dft1->studynr, dft1->voi[ri].name);
151 else strcpy(tac_title, dft1->voi[ri].name);
152*/
153 rnameRmDots(dft1->voi[ri].name, tac_title);
154 /* Draw the fitted line */
155 for(si=0; si<dft2->frameNr; si++) if(!isnan(dft2->voi[ri].y[si])) break;
156 for(ei=dft2->frameNr-1; ei>=si; ei--) if(!isnan(dft2->voi[ri].y[ei])) break;
157 if((ei-si)>0) {
158 ret=svg_write_tac(fp_svg, &viewports, 1, tac_id, tac_title,
159 dft2->x+si, dft2->voi[ri].y+si, 1+ei-si,
160 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, SYMBOLFILLED,
161 NULL, verbose-3);
162 if(ret) {svg_legend_empty(&legends); return(21);}
163 }
164 /* Draw the measured points */
165 ret=svg_write_tac(fp_svg, &viewports, 2, tac_id, tac_title,
166 dft1->x, dft1->voi[ri].y, dft1->frameNr,
167 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, SYMBOLFILLED,
168 NULL, verbose-3);
169 if(ret) {svg_legend_empty(&legends); return(22);}
170 /* Set legend too, if requested */
171 if(is_label!=0) {
172 svg_legend_add(&legends, 0, symbol_nr%max_symbol_nr, SYMBOLFILLED,
173 color_nr%max_color_nr, tac_title);
174 }
175 /* Prepare for the next plot */
176 color_nr++; n++;
177 if(color_nr==max_color_nr) {symbol_nr++; color_nr=0;}
178 if(symbol_nr==max_symbol_nr) symbol_nr=0;
179 }
180
181 /* Close the coordinate viewport */
182 ret=svg_end_coordinate_viewport(fp_svg, NULL, verbose-3);
183 if(ret) {svg_legend_empty(&legends); return(91);}
184
185 /* Write the axis ticks */
186 if(svg_write_xticks(fp_svg, &viewports, NULL, verbose-3)!=0) {
187 svg_legend_empty(&legends); return(92);}
188 if(svg_write_yticks(fp_svg, &viewports, NULL, verbose-3)!=0) {
189 svg_legend_empty(&legends); return(93);}
190
191 /* Close the plot viewport */
192 ret=svg_end_plot_viewport(fp_svg, NULL, verbose-3);
193 if(ret) {svg_legend_empty(&legends); return(94);}
194
195 /* Make the plot legends into their own viewport */
196 if(viewports.label_area_viewport.is!=0) {
197 if(verbose>2) printf("creating plot legends\n");
198 ret=svg_create_legends(fp_svg, &viewports, &legends, NULL, verbose-3);
199 if(ret) {svg_legend_empty(&legends); return(95);}
200 }
201 svg_legend_empty(&legends);
202
203 /* Close the SVG file */
204 ret=svg_close(fp_svg, NULL, verbose-3); if(ret) return(101);
205
206 return(0);
207}
208/*****************************************************************************/
209
210/*****************************************************************************/
218 DFT *dft1,
220 DFT *dft2,
222 char *main_title,
224 char *fname,
226 int verbose
227) {
228 int ret, n, ri, si, ei;
229 char x_title[64], y_title[64], tac_id[32], tac_title[64];
230 double minx, maxx, miny, maxy, tx1, tx2, ty1, ty2, f;
231 struct svg_viewports viewports; svg_init_viewports(&viewports);
232 int max_color_nr, color_nr;
233 int max_symbol_nr, symbol_nr;
234 SVG_LEGENDS legends; svg_init_legends(&legends);
235 FILE *fp_svg=NULL;
236
237
238 if(verbose>0) {
239 printf("%s(dft1, dft2, mt, fn, %d)\n", __func__, verbose);
240 }
241
242 /* Check data */
243 if(dft1==NULL || dft1->voiNr<1) return(1);
244 if(dft2==NULL) return(1);
245 if(dft2->voiNr!=dft1->voiNr) return(1);
246
247 int is_label=0; if(dft1->voiNr>1) is_label=1;
248
249 /* Check if file exists; backup, if necessary */
250 ret=backupExistingFile(fname, NULL, NULL); if(ret) return(2);
251
252 /* Determine the plot min and max values */
253 minx=maxx=miny=maxy=0;
254 ret=dftMinMax(dft1, &tx1, &tx2, &ty1, &ty2); if(ret) return(3);
255 minx=tx1; maxx=tx2; miny=ty1; maxy=ty2;
256 ret=dftMinMax(dft2, &tx1, &tx2, &ty1, &ty2); if(ret) return(3);
257 if(minx>tx1) minx=tx1;
258 if(maxx<tx2) maxx=tx2;
259 if(miny>ty1) miny=ty1;
260 if(maxy<ty2) maxy=ty2;
261 if(verbose>1) printf("minx:=%g\nmaxx:=%g\nminy:=%g\nmaxy:=%g\n", minx, maxx, miny, maxy);
262 if(miny>0.0) {f=maxy-miny; miny-=0.01*f;}
263
264 /* Calculate the axis ticks */
265 viewports.label_area_viewport.is=is_label; // needed for x axis ticks
266 viewports.x.fixed_min=0; viewports.y.fixed_min=0;
267 viewports.x.min=minx; viewports.x.max=maxx;
268 viewports.y.min=miny; viewports.y.max=maxy;
269 ret=svg_calculate_axes(&viewports, verbose-3); if(ret) return(4);
270
271 /* Set x and y axis titles based on activity and time units */
272 if(verbose>2) printf("set x title\n");
273 strcpy(x_title, "");
274 if(dft1->timeunit==DFTTIME_SEC || dft1->timeunit==DFTTIME_MIN)
275 sprintf(x_title, "Time (%s)", dftTimeunit(dft1->timeunit));
276 else if(dft1->timeunit!=DFTTIME_UNKNOWN)
277 strcpy(x_title, dftTimeunit(dft1->timeunit));
278 if(verbose>2) printf("set y title\n");
279 strcpy(y_title, "");
280 if(dftUnitId(dft1->unit)!=DFTUNIT_UNKNOWN)
281 strcpy(y_title, dftUnit(dftUnitId(dft1->unit)));
282
283 /* Set the plot window and window area sizes */
284 if(verbose>2) printf("set window sizes\n");
285 ret=svg_define_viewports(0, 0, strlen(main_title), strlen(y_title),
286 strlen(x_title), is_label, &viewports, verbose-3);
287 if(ret) return(5);
288
289 /* Initiate graphics file */
290 fp_svg=svg_initiate(fname, 0, 0, &viewports, NULL, verbose-3);
291 if(fp_svg==NULL) return(6);
292
293 /* Put the graph titles into their own viewports */
294 ret=svg_create_main_title(fp_svg, main_title, "", &viewports, NULL,verbose-3);
295 if(ret) return(7);
296 ret=svg_create_yaxis_title(fp_svg, y_title, &viewports, NULL, verbose-3);
297 if(ret) return(8);
298 ret=svg_create_xaxis_title(fp_svg, x_title, &viewports, NULL, verbose-3);
299 if(ret) return(9);
300
301 /* Put the plot into its own viewport */
302 ret=svg_start_plot_viewport(fp_svg, &viewports, NULL, verbose-3);
303 if(ret) return(10);
304
305 /* Start coordinate area viewport */
306 ret=svg_start_coordinate_viewport(fp_svg, &viewports, NULL, verbose-3);
307 if(ret) return(11);
308
309 /* Write plot axes */
310 ret=svg_write_axes(fp_svg, &viewports, NULL, verbose-3);
311 if(ret) {
312 if(verbose>0) printf("svg_write_axes() := %d\n", ret);
313 return(12);
314 }
315
316 /*
317 * Draw the plots
318 */
319 max_color_nr=0; while(svgColorName(max_color_nr)!=NULL) max_color_nr++;
320 if(max_color_nr<1) max_color_nr=1; // remainder works only if 2nd operator>0
321 if(verbose>3) printf("max_color_nr := %d\n", max_color_nr);
322 max_symbol_nr=0; while(svgSymbolName(max_symbol_nr)!=NULL) max_symbol_nr++;
323 if(max_symbol_nr<1) max_symbol_nr=1; // remainder works only if 2nd operator>0
324 if(verbose>3) printf("max_symbol_nr := %d\n", max_symbol_nr);
325 if(dft1->voiNr==1) color_nr=0; else color_nr=1;
326 symbol_nr=0;
327 for(ri=0, n=0; ri<dft1->voiNr; ri++) {
328 sprintf(tac_id, "plot_%d", n);
329/*
330 if(strlen(dft1->studynr)>0 && strcmp(dft1->studynr, ".")!=0)
331 sprintf(tac_title, "%s: %s", dft1->studynr, dft1->voi[ri].name);
332 else strcpy(tac_title, dft1->voi[ri].name);
333*/
334 rnameRmDots(dft1->voi[ri].name, tac_title);
335 /* Draw the fitted line */
336 for(si=0; si<dft2->frameNr; si++) if(!isnan(dft2->voi[ri].y[si])) break;
337 for(ei=dft2->frameNr-1; ei>=si; ei--) if(!isnan(dft2->voi[ri].y[ei])) break;
338 if((ei-si)>0) {
339 ret=svg_write_tac(fp_svg, &viewports, 1, tac_id, tac_title,
340 dft2->x+si, dft2->voi[ri].y+si, 1+ei-si,
341 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, SYMBOLFILLED,
342 NULL, verbose-3);
343 if(ret) {svg_legend_empty(&legends); return(21);}
344 }
345 /* Draw the measured points */
346 ret=svg_write_tac(fp_svg, &viewports, 2, tac_id, tac_title,
347 dft1->x, dft1->voi[ri].y, dft1->frameNr,
348 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, SYMBOLFILLED,
349 NULL, verbose-3);
350 if(ret) {svg_legend_empty(&legends); return(22);}
351 /* Set legend too, if requested */
352 if(is_label!=0) {
353 svg_legend_add(&legends, 0, symbol_nr%max_symbol_nr, SYMBOLFILLED,
354 color_nr%max_color_nr, tac_title);
355 }
356 /* Prepare for the next plot */
357 color_nr++; n++;
358 if(color_nr==max_color_nr) {symbol_nr++; color_nr=0;}
359 if(symbol_nr==max_symbol_nr) symbol_nr=0;
360 }
361
362 /* Close the coordinate viewport */
363 ret=svg_end_coordinate_viewport(fp_svg, NULL, verbose-3);
364 if(ret) {svg_legend_empty(&legends); return(91);}
365
366 /* Write the axis ticks */
367 if(svg_write_xticks(fp_svg, &viewports, NULL, verbose-3)!=0) {
368 svg_legend_empty(&legends); return(92);}
369 if(svg_write_yticks(fp_svg, &viewports, NULL, verbose-3)!=0) {
370 svg_legend_empty(&legends); return(93);}
371
372 /* Close the plot viewport */
373 ret=svg_end_plot_viewport(fp_svg, NULL, verbose-3);
374 if(ret) {svg_legend_empty(&legends); return(94);}
375
376 /* Make the plot legends into their own viewport */
377 if(viewports.label_area_viewport.is!=0) {
378 if(verbose>2) printf("creating plot legends\n");
379 ret=svg_create_legends(fp_svg, &viewports, &legends, NULL, verbose-3);
380 if(ret) {svg_legend_empty(&legends); return(95);}
381 }
382 svg_legend_empty(&legends);
383
384 /* Close the SVG file */
385 ret=svg_close(fp_svg, NULL, verbose-3); if(ret) return(101);
386
387 return(0);
388}
389/*****************************************************************************/
390
391/*****************************************************************************/
int backupExistingFile(char *filename, char *backup_ext, char *status)
Definition backup.c:14
int dftMinMax(DFT *dft, double *minx, double *maxx, double *miny, double *maxy)
Definition dft.c:974
int dftMaxY(DFT *dft, double t1, double t2, double *miny, double *maxy)
Definition dft.c:1090
int rnameRmDots(char *rname1, char *rname2)
Definition rname.c:99
Header file for libtpcmodext.
void svg_legend_empty(SVG_LEGENDS *legends)
Definition svg_legend.c:26
int svg_write_xticks(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
Definition svg_plot.c:555
void svg_init_legends(SVG_LEGENDS *legends)
Definition svg_legend.c:14
int svg_create_xaxis_title(FILE *fp, const char *title_text, struct svg_viewports *vp, char *errmsg, int verbose)
Definition svg_title.c:126
char * svgColorName(const svgColor index)
Definition svg_defs.c:38
int svg_create_main_title(FILE *fp, const char *main_title_text, const char *sub_title_text, struct svg_viewports *vp, char *errmsg, int verbose)
Definition svg_title.c:17
int svg_legend_add(SVG_LEGENDS *legends, const int plot_type, const int symbol_type, const svgSymbolFill symbol_fill, const int color, const char *text)
Definition svg_legend.c:43
char * svgSymbolName(const svgSymbolType index)
Definition svg_defs.c:67
int svg_define_viewports(const int main_viewport_width, const int main_viewport_height, const int is_main_title, const int is_yaxis_title, const int is_xaxis_title, const int is_label_area, struct svg_viewports *vp, int verbose)
Definition svg_vport.c:65
int svg_end_plot_viewport(FILE *fp, char *errmsg, int verbose)
Definition svg_plot.c:238
int svg_start_coordinate_viewport(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
Definition svg_plot.c:276
int svg_create_legends(FILE *fp, struct svg_viewports *vp, SVG_LEGENDS *legends, char *errmsg, int verbose)
Definition svg_legend.c:76
void svg_init_viewports(struct svg_viewports *p)
Definition svg_vport.c:43
FILE * svg_initiate(const char *filename, const double height, const double width, struct svg_viewports *vp, char *errmsg, int verbose)
Definition svg_file.c:22
int svg_calculate_axes(struct svg_viewports *vp, int verbose)
Definition svg_plot.c:364
int svg_write_axes(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
Definition svg_plot.c:437
int svg_end_coordinate_viewport(FILE *fp, char *errmsg, int verbose)
Definition svg_plot.c:327
int svg_start_plot_viewport(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
Definition svg_plot.c:181
int svg_create_yaxis_title(FILE *fp, const char *title_text, struct svg_viewports *vp, char *errmsg, int verbose)
Definition svg_title.c:197
int svg_write_yticks(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
Definition svg_plot.c:655
int svg_write_tac(FILE *fp, struct svg_viewports *vp, const int plot_type, const char *tac_id, const char *tac_title, double *x, double *y, const int data_nr, const char *color, const svgSymbolType symbol_type, const svgSymbolFill symbol_fill, char *errmsg, int verbose)
Definition svg_plot.c:746
int svg_close(FILE *fp, char *errmsg, int verbose)
Definition svg_file.c:107
int plot_fit_svg(DFT *dft1, DFT *dft2, char *main_title, char *fname, int verbose)
Definition plotfit.c:216
int plot_fitrange_svg(DFT *dft1, DFT *dft2, char *main_title, double x1, double x2, double y1, double y2, char *fname, int verbose)
Definition plotfit.c:16
Voi * voi
int timeunit
int voiNr
int frameNr
double * x
char unit[MAX_UNITS_LEN+1]
double * y
char name[MAX_REGIONNAME_LEN+1]
double max
Definition libtpcsvg.h:77
int fixed_min
Definition libtpcsvg.h:95
double min
Definition libtpcsvg.h:75
struct svg_viewport_pos label_area_viewport
Definition libtpcsvg.h:112
struct svg_coord x
Definition libtpcsvg.h:118
struct svg_coord y
Definition libtpcsvg.h:120