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