Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

extract/lib/proc_plot.c

Go to the documentation of this file.
00001 /* === Doxygen Comment ======================================= */
00013 /* =========================================================== */
00014 
00015 #include <IFU_io.h>
00016 #include <IFU_math.h>
00017 #include <snifs.h>
00018 #include <extract.h>
00019 #include <gsl/gsl_statistics.h>
00020 
00021 #ifdef HAVE_LIBDISLIN
00022 #include <dislin.h>
00023 #endif
00024 
00026 #define NCOORD 100
00027 
00029 #define MAXNBIN 100
00030 
00032 #define NTICKS  6
00033 
00034 /* === Doxygen Comment ======================================= */
00049 /* =========================================================== */
00050 
00051 void plot_set_limits(const float x[],const float y[], int n, PlotLimits *limits)
00052 {
00053   float xmin,xmax,ymin,ymax;
00054 
00055   gsl_stats_float_minmax(&xmin,&xmax,x,1,n);
00056   gsl_stats_float_minmax(&ymin,&ymax,y,1,n);
00057 
00058   if (!limits->xmin && !limits->xmax && !limits->ymin && !limits->ymax) {
00059     /* Limits have never been set: set them */
00060     limits->xmin = xmin;
00061     limits->xmax = xmax;
00062     limits->ymin = ymin;
00063     limits->ymax = ymax;
00064   }
00065   else {
00066     /* Limits have *already* been set: update them */
00067     limits->xmin = MIN(limits->xmin,xmin);
00068     limits->xmax = MAX(limits->xmax,xmax);
00069     limits->ymin = MIN(limits->ymin,ymin);
00070     limits->ymax = MAX(limits->ymax,ymax);
00071   }
00072 }
00073 
00074 /* === Doxygen Comment ======================================= */
00078 /* =========================================================== */
00079 
00080 void plot_increase_limits(PlotLimits *limits)
00081 {
00082   double delta;
00083   
00084   if (limits->ymin == limits->ymax) delta = 1;
00085   else delta = (limits->ymax - limits->ymin) * 0.1;
00086   limits->ymin -= delta;
00087   limits->ymax += delta;
00088 
00089   if (limits->xmin == limits->xmax) delta = 1;
00090   else delta = (limits->xmax - limits->xmin) * 0.1;
00091   limits->xmin -= delta;
00092   limits->xmax += delta;
00093 }
00094 
00095 /* === Doxygen Comment ======================================= */
00104 /* =========================================================== */
00105 
00106 int inside_plot_limits(float x,float y, PlotLimits limits)
00107 {
00108   return( (x>=limits.xmin && x<=limits.xmax && 
00109            y>=limits.ymin && y<=limits.ymax)? TRUE:FALSE );
00110 }
00111 
00112 /* === Doxygen Comment ======================================= */
00124 /* =========================================================== */
00125 
00126 int plot_compticks(int nticks, float min, float max, float *first, float *step)
00127 {
00128   float delta, magn;
00129   int carac;
00130   
00131   delta = (max - min)/nticks;
00132   /* Express delta as a * 10^carac = a * magn, w/ 1<=a<10 */
00133   carac = floor(log10(delta));
00134   magn = pow(10,carac);  
00135 
00136   switch ((int)rint(3*log10(delta/magn))) {
00137   case 0: *step = 1.; break;                 /* a = 1 */
00138   case 1: *step = 2.; break;                 /* a = 2 or 3 */
00139   case 2: *step = 5.; break;                 /* a = 3 to 7 */
00140   case 3: *step = 10; break;                 /* a = 8 or 9 */
00141   }
00142   *step *= magn;
00143 
00144   *first = (*step)*ceil(min/(*step));
00145   return(floor((max-(*first))/(*step)));
00146 }
00147 
00148 /* === Doxygen Comment ======================================= */
00158 /* =========================================================== */
00159 
00160 void plot_set_device(char *devname)
00161 {
00162   char *ext;
00163   int ASCII;
00164 
00165   if ((ASCII = !strlen(devname))) {          /* Empty devname = ASCII */
00166     print_warning("No need to set graphical device for ASCII output");
00167     return;
00168   }
00169 #ifndef HAVE_LIBDISLIN
00170   else {
00171     print_error("Non-ASCII output device requires DISLIN support");
00172     exit_session(ERR_GRAPH_DEV);
00173   }
00174 
00175 #else  /* HAVE_LIBDISLIN */
00176 
00177   if ((ext = rindex(devname,'.')) == NULL) { /* No extension in devname: e.g. XWIN,CONS,EPS,... */
00178     metafl(devname);                         /* Output device */
00179     if (strcasecmp(devname,"XWIN") && strcasecmp(devname,"CONS")) {
00180       char *copy = strdup(devname);
00181       lower_strg(copy);
00182       print_warning("DISLIN output file: dislin.%s",copy);
00183       free(copy);
00184     }
00185   }
00186   else {                                     /* Extension in devname: e.g. toto.pdf */
00187     metafl(ext+1);                           /* Extension gives the output device */
00188     setfil(devname);                         /* Output file */
00189   }
00190 #endif
00191 }
00192 
00193 /* === Doxygen Comment ======================================= */
00207 /* =========================================================== */
00208 
00209 void plot_start(Plot *plot, float scale)
00210 {
00211 #ifdef HAVE_LIBDISLIN
00212   float xsize,ysize, dx,dy, axscale;
00213 
00214   filmod("delete");                          /* Overwrite output file */
00215   plot_set_device(plot->devname);            /* Output device or file */
00216   setpag("DA4P");                            /* Portrait */
00217 
00218   disini();                                  /* DISLIN initialization: level 0 -> 1 */
00219 
00220   if (DEBUG) errmod("CHECK","OFF");          /* No check on boundaries */
00221   else       errmod("ALL","OFF");
00222 
00223   if (VERBOSE) paghdr("$Name:  $", "",1,0);  /* Technical header */
00224 
00225   if (scale) {
00226     /* Axes lengthes: by default, resolution is 100/cm (e.g. 2100 x 2970 for
00227        DA4P), and axe lengthes is 2/3 of page (e.g. 1400 x 1980) */
00228     xsize = ABS(scale)*2100;
00229     ysize = ABS(scale)*2970;                   /* Window size [DISLIN units] */
00230     if (scale<0) {
00231       axscale = MIN(xsize/(dx = plot->Limits.xmax - plot->Limits.xmin),  /* X-scale */
00232                     ysize/(dy = plot->Limits.ymax - plot->Limits.ymin)); /* Y-scale */
00233       xsize = dx*axscale;
00234       ysize = dy*axscale;
00235     }
00236     axslen(xsize,ysize);
00237   }
00238   
00239   center();                                  /* Use axspos(250,2700); to set position */
00240   labtyp("VERT","Y");
00241   intax();                                   /* Integer labels */
00242   /* ticpos("REVERS", "XY"); */              /* Ticks inward */
00243 
00244   setvlt("SPEC");                            /* A LUT brighter than RAIN */
00245   /* Fonts: disalf,simplx,complx,duplx,triplx,gothic,serif,helve,helves */
00246   complx(); 
00247 
00248   texmod("ON");                              /* TeX support */
00249 
00250 #else
00251   print_error("Function plot_start requires DISLIN support");
00252   /* C99 __func__ (gcc 3.0) */
00253   //  print_error("Function %s requires DISLIN support",__func__);
00254   exit_session(UNKNOWN);
00255 #endif
00256 }
00257 
00258 /* === Doxygen Comment ======================================= */
00269 /* =========================================================== */
00270 
00271 void plot_axes(const Plot *plot, char *xlabel,char *ylabel)
00272 {
00273 #ifdef HAVE_LIBDISLIN
00274 
00275   float xfirst,xstep,yfirst,ystep;
00276   
00277   name(xlabel,"x"); name(ylabel,"y");
00278 
00279   plot_compticks(NTICKS, plot->Limits.xmin,plot->Limits.xmax, &xfirst,&xstep);
00280   plot_compticks(NTICKS, plot->Limits.ymin,plot->Limits.ymax, &yfirst,&ystep);
00281 
00282   if (plot->mincut || plot->maxcut) {        /* 3D plot */
00283     graf3(plot->Limits.xmin,plot->Limits.xmax,xfirst,xstep,
00284           plot->Limits.ymin,plot->Limits.ymax,yfirst,ystep,
00285           plot->mincut,plot->maxcut,plot->mincut,
00286           (plot->maxcut-plot->mincut)/10.);
00287   }
00288   else {                                     /* Pure 2D plot */
00289     graf(plot->Limits.xmin,plot->Limits.xmax,xfirst,xstep,
00290          plot->Limits.ymin,plot->Limits.ymax,yfirst,ystep);
00291   }
00292 #else
00293   print_error("Function plot_axes requires DISLIN support");
00294   exit_session(UNKNOWN);
00295 #endif
00296 }
00297 
00298 /* === Doxygen Comment ======================================= */
00307 /* =========================================================== */
00308 
00309 void plot_title(char *string)
00310 {
00311 #ifdef HAVE_LIBDISLIN
00312   char *copy, *chunk;
00313   int i;
00314   
00315   copy = strdup(string);                     /* Copy the input string */
00316   for (i=0; i<4; i++)                        /* Split the input title */
00317     if ((chunk = strsep(&copy,"\n"))!=NULL && strlen(chunk))
00318       titlin(chunk,(i? (i+1):-1));           /* 1st title underlined */
00319 
00320   title();                                   /* Write the title */
00321   free(copy);
00322 #else
00323   print_error("Function plot_title requires DISLIN support");
00324   exit_session(UNKNOWN);
00325 #endif
00326 }
00327 
00328 /* === Doxygen Comment ======================================= */
00342 /* =========================================================== */
00343 
00344 void plot_set_bkgnd(IMAGE2D *bkgndima, Plot *plot, float mincut,float maxcut,
00345                     int *nx,int *ny, float ***zmat)
00346 {
00347   SPECTRUM *histospec;
00348   PlotLimits lim;
00349 
00350   int i,j;
00351   int imin,imax,jmax,jmin, nbin;
00352   float min,max;
00353 
00354   /* Update plot limits */
00355 
00356   lim = plot->Limits;                        /* Just to shorten the code */
00357 
00358   /* Restrict graph to background frame */
00359   lim.xmin = MAX(bkgndima->startx,lim.xmin);
00360   lim.xmax = MIN(bkgndima->endx  ,lim.xmax);
00361   lim.ymin = MAX(bkgndima->starty,lim.ymin);
00362   lim.ymax = MIN(bkgndima->endy  ,lim.ymax);
00363 
00364   pixel_frame(bkgndima,lim.xmin,lim.ymin,&imin,&jmin);
00365   pixel_frame(bkgndima,lim.xmax,lim.ymax,&imax,&jmax);
00366   coord_frame(bkgndima,imin,jmin,&(lim.xmin),&(lim.ymin));
00367   coord_frame(bkgndima,imax,jmax,&(lim.xmax),&(lim.ymax));
00368 
00369 //#ifdef HAVE_LIBDISLIN
00370 //  /* Set DISLIN coordinates... */
00371 //  sursze(lim.xmin,lim.xmax,lim.ymin,lim.ymax);
00372 //#endif
00373 //  /* ... but add half a pixel on each side to cover whole peripheric pixels */
00374 //  lim.xmin -= 0.5*bkgndima->stepx;
00375 //  lim.xmax += 0.5*bkgndima->stepx;
00376 //  lim.ymin -= 0.5*bkgndima->stepy;
00377 //  lim.ymax += 0.5*bkgndima->stepy;
00378 
00379   plot->Limits = lim;
00380 
00381   *nx = imax-imin+1;
00382   *ny = jmax-jmin+1;
00383 
00384   print_msg("Updating limits from %s: [%.1f,%.1f:%.1f,%.1f] (%dx%d)",
00385             bkgndima->name, lim.xmin,lim.ymin,lim.xmax,lim.ymax, *nx,*ny);
00386 
00387   /* Dump frame in 2D-matrix */
00388 
00389   alloc2d(zmat,*nx,*ny,FLOAT);
00390   for (min=MAXFLOAT, max=-MAXFLOAT, i=0; i<*nx; i++) {
00391     for (j=0; j<*ny; j++) {
00392       (*zmat)[i][j] = RD_frame(bkgndima,i+imin,j+jmin);
00393       min = MIN(min,(*zmat)[i][j]);
00394       max = MAX(max,(*zmat)[i][j]);
00395     }
00396   }
00397   
00398   /* Set cuts */
00399 
00400   nbin = MIN(MAXNBIN,(int)((*nx)*(*ny)/10));
00401 
00402   print_msg("Building %s histogram: %d bins in [%g,%g]",
00403             bkgndima->name,nbin,min,max);
00404   histospec = subframe_histo(bkgndima,imin,imax,jmin,jmax,min,max,nbin);
00405 
00406   min = histo_threshold(histospec,mincut/100.);
00407   max = histo_threshold(histospec,maxcut/100.);
00408   print_msg("   [%.1f%%,%.1f%%] cut-off: [%g,%g],",mincut,maxcut,min,max);
00409 
00410   plot->mincut = min;
00411   plot->maxcut = max;
00412 
00413   free_spec_mem(histospec); 
00414   free(histospec);
00415 }
00416 
00417 
00418 /* === Doxygen Comment ======================================= */
00426 /* =========================================================== */
00427 
00428 void plot_max(const Maxima_Set *maxset, const Plot *plot, const double shift[])
00429 {
00430   char *xcoord, *ycoord;
00431   int i,j,counter, ASCII; 
00432   float x,y;
00433 
00434   print_msg("Plotting max...");
00435 
00436   if ((ASCII = !strlen(plot->devname))) {    /* Empty devname = ASCII */
00437 
00438     /* ===== Initialization (ASCII) ============================== */
00439   
00440     xcoord = (char *)malloc(10*(NCOORD+1)*sizeof(char));
00441     ycoord = (char *)malloc(10*(NCOORD+1)*sizeof(char));
00442 
00443     strcpy(xcoord,"-xdata {");
00444     strcpy(ycoord,"-ydata {"); 
00445   }
00446 #ifdef HAVE_LIBDISLIN
00447   else {
00448     hsymbl(plot->Symbol.size);
00449     setclr(plot->Symbol.color);
00450   }
00451 #endif
00452     
00453   /* ===== Plotting max ============================== */
00454 
00455   for (counter=i=0; i<maxset->nb_ycoords; i++) { /* loop over y */
00456     y = maxset->line[i].ycoord;
00457     if (shift != NULL) y -= shift[1];        /* Apply offset */
00458     for (j=0; j<maxset->line[i].nb_max; j++) { /* loop over x */
00459       x = maxset->line[i].maxima[j].xcoord;
00460       if (shift != NULL) x -= shift[0];      /* Apply offset */
00461 
00462       if (inside_plot_limits(x,y,plot->Limits)) {
00463 
00464         if (ASCII) {
00465 
00466           /* ----- Plain ASCII output ------------------------------ */
00467 
00468           sprintf(xcoord,"%s %g",xcoord,x);
00469           sprintf(ycoord,"%s %g",ycoord,y);
00470           counter ++;
00471 
00472           if (counter%NCOORD == 0) { /* Display & reinitialize strings */
00473             printf("%s} %s}\n",xcoord,ycoord);
00474             fflush(stdout);
00475 
00476             strcpy(xcoord,"-xdata {");
00477             strcpy(ycoord,"-ydata {");
00478           }
00479         }
00480 #ifdef HAVE_LIBDISLIN
00481         else {
00482 
00483           /* ----- Graphical output ------------------------------ */
00484 
00485           rlsymb(plot->Symbol.shape,x,y);
00486         }
00487 #endif
00488       } 
00489         
00490     } /* x */
00491   } /* y */
00492 
00493   if (ASCII) {
00494 
00495     /* ===== Conclusion (ASCII) ============================== */
00496 
00497     if (counter%NCOORD != 0) { /* Display & reinitialize strings */
00498       printf("%s} %s}\n",xcoord,ycoord);
00499       fflush(stdout);
00500     }
00501 
00502     free(xcoord); free(ycoord);
00503   }
00504 }
00505 
00506 /* === Doxygen Comment ======================================= */
00527 /* =========================================================== */
00528 
00529 void plot_lens(const SnifsOptics *optics, int nopup,float xppup,float yppup, 
00530                int nlbda,const float lbda[], int order,
00531                const Plot *plot, float lbdaref,float pixsize,
00532                int dxnc, double dxcoeff[], const double shift[],
00533                double *xmla,double *ymla)
00534 {
00535   char *xcoord, *ycoord;
00536   int j,counter,ASCII, status;
00537 
00538   double xccd,yccd;
00539 
00540   if ((ASCII = !strlen(plot->devname))) {    /* Empty devname = ASCII */
00541 
00542     /* ===== Initialization (ASCII) ============================== */
00543   
00544     xcoord = (char *)malloc(10*(NCOORD+1)*sizeof(char));
00545     ycoord = (char *)malloc(10*(NCOORD+1)*sizeof(char));
00546 
00547     strcpy(xcoord,"-xdata {");
00548     strcpy(ycoord,"-ydata {"); 
00549   }
00550 #ifdef HAVE_LIBDISLIN
00551   else {
00552     hsymbl(plot->Symbol.size);
00553     setclr(plot->Symbol.color);
00554   }
00555 #endif
00556 
00557   /* Compute the image position on MLA if needed */
00558   if (*xmla == MAXDOUBLE || *ymla == MAXDOUBLE)
00559     /* [CCD/px] -> [MLA/mm] */
00560     snifs_optics_CCD2MLA(optics, xppup,yppup, xmla,ymla, pixsize,lbdaref);
00561 
00562   /* Loop over wavelengthes */
00563   for (counter=j=0; j<nlbda; j++) {
00564     /* [MLA/mm] -> [CCD/px] */
00565     snifs_optics_MLA2CCD(optics, *xmla,*ymla, &xccd,&yccd, 
00566                          pixsize,lbda[j],order);
00567 
00568     if (dxnc && dxcoeff!=NULL && order==1) /* Apply local adjustment to mask position */
00569       xccd += val_poly_nag(lbda[j], dxcoeff, dxnc,
00570                            optics->filter.inf_util, optics->filter.sup_util,
00571                            &status);
00572     if (shift != NULL) {  /* Apply offset */
00573       xccd -= shift[0];
00574       yccd -= shift[1];
00575     }
00576 
00577     if (inside_plot_limits(xccd,yccd,plot->Limits)) {
00578 
00579       if (ASCII) {
00580 
00581         /* ----- Plain ASCII output ------------------------------ */
00582 
00583         sprintf(xcoord,"%s %g",xcoord,xccd);
00584         sprintf(ycoord,"%s %g",ycoord,yccd);
00585         counter ++;
00586               
00587         if (counter%NCOORD == 0) { /* Display & reinitialize strings */
00588           printf("%s} %s}\n",xcoord,ycoord);
00589           fflush(stdout);
00590 
00591           strcpy(xcoord,"-xdata {");
00592           strcpy(ycoord,"-ydata {");
00593         }
00594       }
00595 #ifdef HAVE_LIBDISLIN
00596       else {
00597         char label[256];
00598 
00599         /* ----- Graphical output ------------------------------ */
00600 
00601         if (order!=0 && !counter) {          /* Label w/ lens_number[order] */
00602           sprintf(label," %d[%d]",nopup,order);
00603           rlmess(label,xccd,yccd);
00604           counter++;
00605         }
00606 
00607         if (plot->Symbol.size == 20) { /* Hard-coded: see plot_optics */
00608           if (order == 1)         
00609             hsymbl((int)plot->Symbol.size*
00610                    blaze_function(&(optics->grism),order,lbda[j]));
00611           else
00612             hsymbl((int)plot->Symbol.size*10*
00613                    blaze_function(&(optics->grism),order,lbda[j]));
00614         }
00615 
00616         rlsymb(plot->Symbol.shape,xccd,yccd);
00617       }
00618 #endif
00619     } /* inside_plot_limits */
00620 
00621   } /* lbda */
00622 
00623   if (ASCII) {
00624 
00625     /* ===== Conclusion (ASCII) ============================== */
00626 
00627     if (counter%NCOORD != 0) { /* Display strings */
00628       printf("%s} %s}\n",xcoord,ycoord);
00629       fflush(stdout);
00630     }
00631 
00632     free(xcoord); free(ycoord);
00633   }
00634 }
00635 
00636 /* === Doxygen Comment ======================================= */
00659 /* =========================================================== */
00660 
00661 void plot_lens_tab(const SnifsOptics *optics, float xppup,float yppup,
00662                    int nlbda,const float lbda[], int order,
00663                    TABLE *table, const int colid[], int row,
00664                    float lbdaref,float pixsize,
00665                    int dxnc, double dxcoeff[], const double shift[],
00666                    double *xmla,double *ymla)
00667 {
00668   int j, status;
00669   float xf, yf;
00670   double xccd,yccd;
00671 
00672   /* Compute the image position on MLA if needed */
00673   if (*xmla == MAXDOUBLE || *ymla == MAXDOUBLE)
00674     /* [CCD/px] -> [MLA/mm] */
00675     snifs_optics_CCD2MLA(optics, xppup,yppup, xmla,ymla, pixsize,lbdaref);
00676 
00677   /* Loop over wavelengthes */
00678   for (j=0; j<nlbda; j++) {
00679     /* [MLA/mm] -> [CCD/px] */
00680     snifs_optics_MLA2CCD(optics, *xmla,*ymla, &xccd,&yccd, 
00681                          pixsize,lbda[j],order);
00682 
00683     if (dxnc && dxcoeff!=NULL && order==1) /* Apply local adjustment to mask position */
00684       xccd += val_poly_nag(lbda[j], dxcoeff, dxnc,
00685                            optics->filter.inf_util, optics->filter.sup_util,
00686                            &status);
00687     if (shift != NULL) {  /* Apply offset */
00688       xccd -= shift[0];
00689       yccd -= shift[1];
00690     }
00691 
00692     /* Storage in table */
00693     xf = xccd; yf = yccd;
00694     WR_tbl(table,row,colid[2*j],  &xf);
00695     WR_tbl(table,row,colid[2*j+1],&yf);
00696 
00697   } /* lbda */
00698 
00699 }
00700 
00701 /* === Doxygen Comment ======================================= */
00712 /* =========================================================== */
00713 
00714 void plot_array_err(const PlotSymbol *symbol, float x[], float y[], int n,
00715                     float dx[], float dy[])
00716 {
00717 #ifdef HAVE_LIBDISLIN
00718   incmrk(-1); /* Plot every symbols without curve */
00719   marker(symbol->shape); /* Symbol */
00720   hsymbl(symbol->size);  /* Size   */
00721   setclr(symbol->color); /* Color  */
00722 
00723   /* Symbols */
00724   curve(x,y,n);
00725   
00726   /* Error-bars (if any) */
00727   if (dx != NULL) {
00728     bartyp("HORI");
00729     errbar(x,y,dx,dx,n);
00730   }
00731   if (dy != NULL) {
00732     bartyp("VERT");
00733     errbar(x,y,dy,dy,n);
00734   }
00735 
00736   incmrk(0); /* Default */
00737 
00738 #else
00739   print_error("Function plot_array_err requires DISLIN support");
00740   exit_session(UNKNOWN);  
00741 #endif
00742 }
00743 
00744 /* === Doxygen Comment ======================================= */
00755 /* =========================================================== */
00756 
00757 void plot_initialize(Plot *plot, const char *devname, 
00758                      const PlotLimits *limits, const PlotSymbol *symbol, 
00759                      float mincut, float maxcut)
00760 {
00761   strcpy(plot->devname,devname);
00762 
00763   if (limits != NULL) {
00764     plot->Limits.xmin = limits->xmin;
00765     plot->Limits.xmax = limits->xmax;
00766     plot->Limits.ymin = limits->ymin;
00767     plot->Limits.ymax = limits->ymax;
00768   }
00769   else {
00770     plot->Limits.xmin = 0;
00771     plot->Limits.xmax = 0;
00772     plot->Limits.ymin = 0;
00773     plot->Limits.ymax = 0;
00774   }
00775   
00776   if (symbol != NULL) {
00777     plot->Symbol.shape = symbol->shape;
00778     plot->Symbol.size  = symbol->size;
00779     plot->Symbol.color = symbol->color;
00780   }
00781   else {
00782     /* Default symbol */
00783     plot->Symbol.shape = 16;  /* 0=[], 3=+, 5=<>, 15=(), 16=[*], 21=(*) */
00784     plot->Symbol.size  = 15;  /* DISLIN default: 35 */
00785     plot->Symbol.color = 255; /* Foreground */
00786   }
00787 
00788   plot->mincut = mincut;
00789   plot->maxcut = maxcut;
00790 }
00791 
00792 /* 
00793 ;;; Local Variables: ***
00794 ;;; eval: (add-to-list 'c-font-lock-extra-types "PlotLimits") ***
00795 ;;; eval: (add-to-list 'c-font-lock-extra-types "PlotSymbol") ***
00796 ;;; eval: (add-to-list 'c-font-lock-extra-types "Plot") ***
00797 ;;; End: ***
00798 */

Generated on Wed Oct 26 23:59:39 2005 for Snifs by doxygen 1.3.5