1 /*
2 * Copyright (c) 1996-2000 Lucent Technologies.
3 * See README file for details.
4 */
5
6 #include "local.h"
7
8 vari *growvar(vari* vold, int n);
9
10 plots *cpl, pl[MAXWIN];
11 extern device devps, devwin;
12 extern INT curwin;
13 char *psfn;
14 extern lfit lf;
15 extern pplot pp;
16 extern char *curstr;
17
get_graphics_window(v)18 plots *get_graphics_window(v)
19 vari *v;
20 { int win_no;
21 char *w;
22
23 w = getargval(v,"win",0);
24 if (w != NULL)
25 { sscanf(w,"%d",&win_no);
26 if ((win_no<0) | (win_no>=MAXWIN))
27 { WARN(("Invalid window %d",win_no));
28 }
29 else
30 curwin = win_no;
31 }
32 return( &pl[curwin] );
33 }
34
settype(xyz,type,def)35 char *settype(xyz,type,def)
36 plxyz *xyz;
37 char *type, def;
38 { if ((type==NULL) || (strlen(type)==0))
39 { xyz->type = def;
40 return(NULL);
41 }
42 xyz->type = type[0];
43 return(&type[1]);
44 }
45
pvarname(xyz,c,vn)46 char *pvarname(xyz,c,vn)
47 plxyz *xyz;
48 char c;
49 varname vn;
50 { sprintf(vn,"_plv%d%c",xyz->id,c);
51 return(vn);
52 }
53
nextxyz(win,add,ck)54 plxyz *nextxyz(win,add,ck)
55 plots *win;
56 INT add, ck;
57 { plxyz *xyz;
58 vari *v;
59 varname vn;
60
61 if (!add)
62 { sprintf(vn,"_xyz%d",curwin);
63 v = win->xyzs = createvar(vn,STSYSTEM,5,VXYZ);
64 v->n = 0;
65 win->xlab[0] = win->ylab[0] = win->zlab[0] = '\0';
66 }
67 else
68 v = win->xyzs = growvar(win->xyzs,vlength(win->xyzs)+ck);
69
70 xyz = (plxyz *)viptr(v,vlength(v));
71 xyz->id = (vlength(v) << 4) + win->id;
72 xyz->pch = 1;
73 v->n++;
74 return(xyz);
75 }
76
plotopt(v,re)77 void plotopt(v,re)
78 vari *v;
79 INT re;
80 { INT i, j, h, w;
81 double z[2];
82 char *fmt, *ty;
83 plxyz *xyz;
84
85 cpl = get_graphics_window(v);
86
87 if (!re)
88 { cpl->main[0] = '\0';
89 cpl->xl[0] = cpl->xl[1] = cpl->yl[0]
90 = cpl->yl[1] = cpl->zl[0] = cpl->zl[1] = 0.0;
91 cpl->nsl = 0;
92 }
93
94 arvect(getargval(v,"xlim",1), cpl->xl, 2, 2);
95 arvect(getargval(v,"ylim",1), cpl->yl, 2, 2);
96 arvect(getargval(v,"zlim",1), cpl->zl, 2, 2);
97
98 i = getarg(v,"main",1);
99 if (i>0) { strcpy(cpl->main,argval(v,i)); strip(cpl->main); }
100 i = getarg(v,"xlab",1);
101 if (i>0) { strcpy(cpl->xlab,argval(v,i)); strip(cpl->xlab); }
102 i = getarg(v,"ylab",1);
103 if (i>0) { strcpy(cpl->ylab,argval(v,i)); strip(cpl->ylab); }
104 i = getarg(v,"zlab",1);
105 if (i>0) { strcpy(cpl->zlab,argval(v,i)); strip(cpl->zlab); }
106
107 if ( arvect(getargval(v,"view",1), z, 2, 2) == 2 )
108 { cpl->theta=z[0];
109 cpl->phi =z[1];
110 }
111
112 fmt = getargval(v,"fmt",1);
113 if (fmt==NULL) fmt = "xwin";
114
115 i = getarg(v,"split",1);
116 if (i>0)
117 cpl->nsl = arvect(argval(v,i),cpl->sl,10,1);
118 i = getarg(v,"h",1);
119 if (i>0) sscanf(argval(v,i),"%d",&h); else h = 0;
120 i = getarg(v,"w",1);
121 if (i>0) sscanf(argval(v,i),"%d",&w); else w = 0;
122
123 ty = getargval(v,"type",1);
124 if (ty != NULL)
125 { for (j=0; j<vlength(cpl->xyzs); j++)
126 { xyz = (plxyz *)viptr(cpl->xyzs,j);
127 ty = settype(xyz,ty,xyz->type);
128 }
129 }
130 if (stm(fmt,"xwin",1)) { plotxwin(cpl,&devwin,curwin,w,h,0); return; }
131 if (stm(fmt,"win",1)) { plotxwin(cpl,&devwin,curwin,w,h,0); return; }
132 if (stm(fmt,"post",1))
133 { psfn = getargval(v,"file",1);
134 plotxwin(cpl,&devps,curwin,w,h,0);
135 return;
136 }
137 }
138
pvari(cmd,xyz,win,ax)139 void pvari(cmd,xyz,win,ax)
140 char *cmd, ax;
141 plxyz *xyz;
142 plots *win;
143 { vari *vv;
144 INT k;
145 varname vname;
146 vv = varith(cmd,pvarname(xyz,ax,vname),STPLOTVAR);
147 if (vv==NULL) return;
148 k = xyz->id>>4;
149 switch(ax)
150 { case 'x':
151 xyz->x = vv;
152 if (k==0) strcpy(win->xlab,cmd);
153 return;
154 case 'y':
155 xyz->y = vv;
156 if (k==0) strcpy(win->ylab,cmd);
157 return;
158 case 'z':
159 xyz->z = vv;
160 if (k==0) strcpy(win->zlab,cmd);
161 return;
162 }
163 ERROR(("pvari: unknown axis %c",ax));
164 }
165
plotdata(v)166 void plotdata(v)
167 vari *v;
168 { INT add, i, j, k;
169 plxyz *xyz = NULL, *xyz2 = NULL;
170 char *type;
171
172 cpl = get_graphics_window(v);
173
174 i = getarg(v,"add",0);
175 add = (i>0) ? getlogic(v,i) : 0;
176
177 type = getargval(v,"type",0);
178
179 i = getarg(v,"data",0);
180 if (i>0) doreaddata(argval(v,i),(INT)0);
181
182 i = getarg(v,"pch",0);
183 if (i>0) sscanf(argval(v,i),"%d",&xyz->pch);
184
185 xyz = nextxyz(cpl,add,2);
186 if (xyz==NULL) return;
187 xyz->x = xyz->y = xyz->z = NULL;
188 type = settype(xyz,type,'p');
189
190 i = getarg(v,"x",1);
191 j = getarg(v,"y",1);
192 k = getarg(v,"z",1);
193
194 if (!add) /* set the default view angle */
195 { cpl->theta = 45*( 1 - ((j==0)|(k==0)) - 3*(i==0) );
196 cpl->phi = 45*( 1 + ((i==0)|(j==0)) - (k==0) );
197 }
198
199 if (i>0) pvari(argval(v,i),xyz,cpl,'x');
200 if (j>0) pvari(argval(v,j),xyz,cpl,'y');
201 if (k>0) pvari(argval(v,k),xyz,cpl,'z');
202
203 i = getarg(v,"x2",1);
204 j = getarg(v,"y2",1);
205 k = getarg(v,"z2",1);
206 if (i+j+k>0)
207 { xyz2= nextxyz(cpl,1,1);
208 if (xyz2==NULL) return;
209 xyz2->x = xyz->x;
210 xyz2->y = xyz->y;
211 xyz2->z = xyz->z;
212 type = settype(xyz2,type,'s');
213 if (i>0) pvari(argval(v,i),xyz2,cpl,'x');
214 if (j>0) pvari(argval(v,j),xyz2,cpl,'y');
215 if (k>0) pvari(argval(v,k),xyz2,cpl,'z');
216 }
217 if (lf_error) return;
218
219 cpl->ty |= PLDATA;
220
221 plotopt(v,add);
222 }
223
plotfit(v)224 void plotfit(v)
225 vari *v;
226 { INT add, d, dp, i = 0, j = 0, n, sef;
227 INT dt, mg[MXDIM], ix, iy;
228 double c, sd, xl[2*MXDIM], xll[2];
229 char cb;
230 varname vn;
231 plxyz *xyz, *xyzl, *xyzu, *xyzd;
232 char *type;
233
234 cpl = get_graphics_window(v);
235
236 i = getarg(v,"fit",1);
237 if (i>0) dosavefit(&lf,argval(v,i),"rb",(INT)0);
238 if (nofit()) ERROR(("plotfit: no fit to plot."));
239 if (lf_error) return;
240 dp = 0;
241
242 d = lf.mi[MDIM];
243 for (i=0; i<d; i++)
244 { j = getarg(v,lf.xname[i],0);
245 if (j>0)
246 { j = arvect(argval(v,j),xll,2,1);
247 if (j==1)
248 xl[i] = xl[i+d] = xll[0];
249 else
250 { xl[i] = xll[0];
251 xl[i+d] = xll[1];
252 }
253 }
254 else
255 { xl[i] = lf.fl[i];
256 xl[i+d] = lf.fl[i+d];
257 j = 2;
258 }
259 if (j==2)
260 { if (dp==2)
261 { xl[i] = xl[i+d] = (xl[i]+xl[i+d])/2;
262 WARN(("plotfit: fixing %s=%f",lf.xname[i],xl[i]));
263 j = 1;
264 }
265 if (dp==1) { iy = i; dp++; }
266 if (dp==0) { ix = i; dp++; }
267 }
268 mg[i] = 2-j;
269 }
270 if (dp<=0)
271 { ERROR(("No plot variables"));
272 return;
273 }
274 sef = 0; dt = 0;
275 i = getarg(v,"data",1); if (i>0) dt =getlogic(v,i);
276 i = getarg(v,"band",1); cb = (i>0) ? *argval(v,i) : 'n';
277
278 for (i=0; i<d; i++) mg[i] = 1;
279 if (dp==1)
280 mg[ix] = 100;
281 else
282 mg[ix] = mg[iy] = 50;
283 i = getarg(v,"m",1);
284 if (i>0) readilist(mg,argval(v,i),1,lf.mi[MDIM],1);
285
286 i = getarg(v,"add",1);
287 add = (i>0) ? getlogic(v,i) : 0;
288
289 type = getargval(v,"type",1);
290
291 if ((lf.mi[MEV]==EDATA) | (lf.mi[MEV]==ECROS))
292 n = setpppoints(&pp,"fitp",mg,xl);
293 else
294 n = setpppoints(&pp,"grid",mg,xl);
295 pp.fit = createvar("_ppfit",STPLOTVAR,n,VDOUBLE);
296 if (cb=='n')
297 pp.se = NULL;
298 else
299 pp.se = createvar("_ppsef",STPLOTVAR,n,VDOUBLE);
300 if (lf_error) return;
301 cpreplot(&pp,v,cb);
302 if (lf_error) return;
303
304 xyz = nextxyz(cpl,add,4);
305 if (xyz==NULL) return;
306 /* set up first predictor variable */
307 xyz->x = pp.data[ix];
308 setvarname(xyz->x,pvarname(xyz,'x',vn));
309 strcpy(cpl->xlab,lf.xname[ix]);
310
311 /* set up second predictor variable */
312 if (dp==2)
313 { xyz->y = pp.data[iy];
314 setvarname(xyz->y,pvarname(xyz,'y',vn));
315 strcpy(cpl->ylab,lf.xname[iy]);
316 }
317 else
318 { xyz->y = NULL;
319 cpl->ylab[0] = '\0';
320 }
321
322 xyz->z = pp.fit;
323 setvarname(xyz->z,pvarname(xyz,'z',vn));
324 switch(lf.mi[MTG]&63)
325 { case TDEN: strcpy(cpl->zlab,"Density"); break;
326 case TRAT: strcpy(cpl->zlab,"Rate"); break;
327 case THAZ: strcpy(cpl->zlab,"Hazard"); break;
328 default: strcpy(cpl->zlab,lf.yname);
329 }
330 type = settype(xyz,type,(dp==1) ? 'l' : 'c');
331
332 if (pp.se!=NULL)
333 { xyzl = nextxyz(cpl,1,3); xyzu = nextxyz(cpl,1,2);
334 if ((xyzl!=NULL) & (xyzu!=NULL))
335 { sd = sqrt(lf.dp[DRV]);
336 xyzl->x = xyzu->x = xyz->x;
337 xyzl->y = xyzu->y = xyz->y;
338 xyzl->z = createvar(pvarname(xyzl,'z',vn),STPLOTVAR,n,VDOUBLE);
339 xyzu->z = createvar(pvarname(xyzu,'z',vn),STPLOTVAR,n,VDOUBLE);
340 if (lf_error) return;
341 c = docrit(v);
342 for (i=0; i<n; i++)
343 { vassn(xyzu->z,i,backtr(vitem(pp.fit,i)+c*vitem(pp.se,i),lf.mi,lf.nd));
344 vassn(xyzl->z,i,backtr(vitem(pp.fit,i)-c*vitem(pp.se,i),lf.mi,lf.nd));
345 }
346 type = settype(xyzl,type,(d==1) ? 'l' : 'c');
347 type = settype(xyzu,type,(d==1) ? 'l' : 'c');
348 }
349 deletevar(pp.se);
350 }
351 if (pp.wh==PCOEF)
352 for (i=0; i<vlength(xyz->z); i++)
353 vassn(xyz->z,i,backtr(vitem(pp.fit,i),lf.mi,lf.nd));
354 if (dt)
355 {
356 recondat(0,&n);
357 if (lf_error) return;
358 xyzd = nextxyz(cpl,1,1);
359 if (xyzd!=NULL)
360 { xyzd->x = createvar(pvarname(xyzd,'x',vn),STPLOTVAR,n,VDOUBLE);
361 for (i=0; i<n; i++) vassn(xyzd->x,i,datum(&lf,ix,i));
362 if (d==2)
363 { xyzd->y = createvar(pvarname(xyzd,'y',vn),STPLOTVAR,n,VDOUBLE);
364 for (i=0; i<n; i++) vassn(xyzd->y,i,datum(&lf,iy,i));
365 }
366 else xyzd->y = NULL;
367 xyzd->z = createvar(pvarname(xyzd,'z',vn),STPLOTVAR,n,VDOUBLE);
368 for (i=0; i<n; i++)
369 vassn(xyzd->z,i,((lf.mi[MTG]&63)==TGAUS) ? resp(&lf,i) : resp(&lf,i)/prwt(&lf,i));
370 type = settype(xyzd,type,'p');
371 }
372 }
373
374 /* now, set default view angle */
375 if (!add)
376 { if (dp==1) { cpl->theta = 0; cpl->phi = 90; } /* x-z axis */
377 else
378 { if (xyz->type=='w')
379 cpl->theta = cpl->phi = 45; /* wireframes */
380 else
381 cpl->theta = cpl->phi = 0; /* x-y plot; e.g. for contours */
382 }
383 }
384 if (lf_error) return;
385 cpl->ty |= PLFIT;
386 if (dt) cpl->ty |= PLDATA;
387
388 plotopt(v,add);
389 }
390
plottrack(v)391 void plottrack(v)
392 vari *v;
393 { INT i, j;
394 plxyz *xyz;
395 varname vn;
396
397 cpl = get_graphics_window(v);
398
399 if ((cpl->ty & PLTRK)!=PLTRK) /* initialize */
400 { xyz = nextxyz(cpl,0,1);
401 xyz->x = createvar(pvarname(xyz,'x',vn),STPLOTVAR,100,VDOUBLE);
402 xyz->y = createvar(pvarname(xyz,'y',vn),STPLOTVAR,100,VDOUBLE);
403 xyz->z = createvar(pvarname(xyz,'z',vn),STPLOTVAR,100,VDOUBLE);
404 if (lf_error) return;
405 vlength(xyz->x) = vlength(xyz->y) = vlength(xyz->z) = 0;
406 settype(xyz,NULL,'p');
407 cpl->theta = cpl->phi = 0;
408 cpl->ty = PLTRK;
409 }
410 else
411 { vlength(cpl->xyzs) = 0;
412 xyz = nextxyz(cpl,1,1);
413 }
414 j = vlength(xyz->x);
415 i = getarg(v,"x",1);
416 if (i>0)
417 { vassn(xyz->x,j,darith(argval(v,i)));
418 strcpy(cpl->xlab,argval(v,i));
419 vlength(xyz->x) = j+1;
420 }
421 i = getarg(v,"y",1);
422 if (i>0)
423 { vassn(xyz->y,j,darith(argval(v,i)));
424 strcpy(cpl->ylab,argval(v,i));
425 vlength(xyz->y) = j+1;
426 }
427 i = getarg(v,"z",1);
428 if (i>0)
429 { vassn(xyz->z,j,darith(argval(v,i)));
430 strcpy(cpl->zlab,argval(v,i));
431 vlength(xyz->z) = j+1;
432 }
433 plotopt(v,0);
434 }
435
setplot(v)436 void setplot(v)
437 vari *v;
438 { INT i, j, w;
439 carg *ct;
440 varname tname;
441 i = getarg(v,"win",1);
442 if (i==0)
443 { ERROR(("setplot: no win argument"));
444 return;
445 }
446 sscanf(argval(v,i),"%d",&w);
447 if ((w<0) | (w>=MAXWIN))
448 { ERROR(("setplot: invalid win %s",argval(v,i)));
449 return;
450 }
451 if (vlength(v)==2)
452 { deletevar(pl[w].track);
453 pl[w].track = NULL;
454 return;
455 }
456 sprintf(tname,"=tpc%d",w);
457 pl[w].track = createvar(tname,STSYSTEM,v->n-2,VARGL);
458 j = 0;
459 pl[w].ty = PLNONE; /* to ensure previous track is cleared */
460 for (i=1; i<vlength(v); i++)
461 { if (!argused(v,i))
462 { ct = (carg *)viptr(pl[w].track,j);
463 ct->arg = argarg(v,i);
464 ct->val = argval(v,i);
465 setused(v,i);
466 j++;
467 }
468 }
469 sprintf(tname,"=tps%d",w);
470 setvarname(curstr,tname);
471 }
472