Index: trunk/Ohana/src/opihi/cmd.astro/cdensify.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/cdensify.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/cdensify.c	(revision 42821)
@@ -1,3 +1,4 @@
 # include "data.h"
+# define dCOS(A)   ((double) cos ((double)RAD_DEG*A))
 
 # define CHECKVAL(ARG) if (!isfinite(ARG)) { gprint (GP_ERR, "illegal value for %s: %f\n", #ARG, ARG); return (FALSE); }
@@ -116,4 +117,7 @@
   PutCoords (&newcoords, &bf[0].header);
   
+  // use the mask to prevent double-counting
+  ALLOCATE_PTR (mask, char, Nx*Ny); 
+
   float scalescale = scale*scale;
   float scale2 = (scale + 1.0) * (scale + 1.0);
@@ -142,7 +146,13 @@
     coords.crval1 = rn;
     coords.crval2 = *d;
+    
+    // XXX do not oversample by more than a factor of 10
+    float dXn = dX * MAX(fabs(dCOS(*d)), 0.1);
 
     float F = 1.0;
     if (vv) { F = isFloatScale ? Fs[i] : Is[i]; }
+
+    // reset the mask so we do not double-count
+    memset (mask, 0, Nx*Ny);
 
     switch (PSFTYPE) {
@@ -162,5 +172,5 @@
 	break;
       case IS_SQUARE:
-	for (ix = -scale; ix <= scale; ix += dX) {
+	for (ix = -scale; ix <= scale; ix += dXn) {
 	  for (iy = -scale; iy <= scale; iy += dY) {
 	    double rp, dp;
@@ -184,6 +194,6 @@
 	break;
       case IS_CIRCLE:
-	for (ix = -scale; ix <= scale; ix += dX) {
-	  for (iy = -scale; iy <= scale; iy += dY) {
+	for (ix = -scale - dXn; ix <= scale + dXn; ix += dXn) {
+	  for (iy = -scale - dY; iy <= scale + dY; iy += dY) {
 	    float r2 = ix*ix + iy*iy;
 	    double rp, dp;
@@ -199,4 +209,6 @@
 	    if (Xb < 0) continue;
 	    if (Yb < 0) continue;
+	    if (mask[Xb + Yb*Nx]) continue;
+	    mask[Xb + Yb*Nx] = 1;
 	    if (vv) {
 	      val[Xb + Yb*Nx] += Normalize ? fCircle*F : F;
@@ -208,5 +220,5 @@
 	break;
       case IS_GAUSS:
-	for (ix = -3.0*scale; ix <= 3.0*scale; ix += dX) {
+	for (ix = -3.0*scale; ix <= 3.0*scale; ix += dXn) {
 	  for (iy = -3.0*scale; iy <= 3.0*scale; iy += dY) {
 	    float r2 = ix*ix + iy*iy;
@@ -232,4 +244,6 @@
     }
   }
+
+  free (mask);
   return (TRUE);
 }
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-fgauss-pol.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-fgauss-pol.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-fgauss-pol.c	(revision 42821)
@@ -51,4 +51,14 @@
   set_variable ("Zpk",  par[5]);
   set_variable ("Sg",   par[6]);
+
+  /*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  NAN);
+  set_variable ("dSYg",  NAN);
+  set_variable ("dSXYg", NAN);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+  */
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-fgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-fgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-fgauss.c	(revision 42821)
@@ -39,4 +39,14 @@
   set_variable ("Zpk",  par[5]);
   set_variable ("Sg",   par[6]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 / dpar[2]);
+  set_variable ("dSYg",  2.35 / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+*/
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-pgauss-psf.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-pgauss-psf.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-pgauss-psf.c	(revision 42821)
@@ -35,4 +35,11 @@
   set_variable ("Zpk",  par[2]);
   set_variable ("Sg",   par[3]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dZpk",  dpar[2]);
+  set_variable ("dSg",   dpar[3]);
+*/
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-pgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-pgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-pgauss.c	(revision 42821)
@@ -37,4 +37,14 @@
   set_variable ("Zpk",  par[5]);
   set_variable ("Sg",   par[6]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 / dpar[2]);
+  set_variable ("dSYg",  2.35 / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+*/
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-q2gauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-q2gauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-q2gauss.c	(revision 42821)
@@ -41,4 +41,15 @@
   set_variable ("Sg",   par[6]);
   set_variable ("Sr", par[7]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 / dpar[2]);
+  set_variable ("dSYg",  2.35 / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+  set_variable ("dSr",   dpar[7]);
+*/
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-qfgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-qfgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-qfgauss.c	(revision 42821)
@@ -41,4 +41,14 @@
   set_variable ("Zpk",  par[5]);
   set_variable ("Sg",   par[6]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 / dpar[2]);
+  set_variable ("dSYg",  2.35 / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+*/
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-qgauss-psf.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-qgauss-psf.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-qgauss-psf.c	(revision 42821)
@@ -38,4 +38,11 @@
   set_variable ("Zpk", par[2]);
   set_variable ("Sg",  par[3]);
+
+  /*
+  set_variable ("dXg",  dpar[0]);
+  set_variable ("dYg",  dpar[1]);
+  set_variable ("dZpk", dpar[2]);
+  set_variable ("dSg",  dpar[3]);
+  */
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-qgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-qgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-qgauss.c	(revision 42821)
@@ -41,4 +41,15 @@
   set_variable ("Sg",   par[6]);
   set_variable ("Sr",   par[7]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 / dpar[2]);
+  set_variable ("dSYg",  2.35 / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+  set_variable ("dSr",   dpar[7]);
+*/
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-qrgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-qrgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-qrgauss.c	(revision 42821)
@@ -42,4 +42,15 @@
   set_variable ("Sg",   par[6]);
   set_variable ("Npow", par[7]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 / dpar[2]);
+  set_variable ("dSYg",  2.35 / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+  set_variable ("dNpow",   dpar[7]);
+*/
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-r2gauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-r2gauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-r2gauss.c	(revision 42821)
@@ -85,3 +85,16 @@
   set_variable ("SYf", 2.35 * sqrt(2.0) / par[8]);
   set_variable ("SXYf", par[9]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 * sqrt(2.0) / dpar[2]);
+  set_variable ("dSYg",  2.35 * sqrt(2.0) / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+  set_variable ("dSXf", 2.35 * sqrt(2.0) / dpar[7]);
+  set_variable ("dSYf", 2.35 * sqrt(2.0) / dpar[8]);
+  set_variable ("dSXYf", dpar[9]);
+*/
 }
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-rgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-rgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-rgauss.c	(revision 42821)
@@ -42,4 +42,15 @@
   set_variable ("Sg",   par[6]);
   set_variable ("Sr",   par[7]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 / dpar[2]);
+  set_variable ("dSYg",  2.35 / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+  set_variable ("dSr",   dpar[7]);
+*/
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-sgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-sgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-sgauss.c	(revision 42821)
@@ -49,4 +49,17 @@
   set_variable ("SYf", 2.35 / par[8]);
   set_variable ("SXYf", par[9]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 / dpar[2]);
+  set_variable ("dSYg",  2.35 / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+  set_variable ("dSXf", 2.35 / dpar[7]);
+  set_variable ("dSYf", 2.35 / dpar[8]);
+  set_variable ("dSXYf", dpar[9]);
+*/
 }
 
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-tgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-tgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-tgauss.c	(revision 42821)
@@ -80,3 +80,16 @@
   set_variable ("SYf",  2.35 * sqrt(2.0) / par[8]);
   set_variable ("SXYf", par[9]);
+
+/*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 * sqrt(2.0) / dpar[2]);
+  set_variable ("dSYg",  2.35 * sqrt(2.0) / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+  set_variable ("dSXf",  2.35 * sqrt(2.0) / dpar[7]);
+  set_variable ("dSYf",  2.35 * sqrt(2.0) / dpar[8]);
+  set_variable ("dSXYf", dpar[9]);
+*/
 }
Index: trunk/Ohana/src/opihi/cmd.astro/imfit-vgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit-vgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit-vgauss.c	(revision 42821)
@@ -69,3 +69,15 @@
   set_variable ("SXf", par[7]);
   set_variable ("SYf", par[8]);
+
+  /*
+  set_variable ("dXg",   dpar[0]);
+  set_variable ("dYg",   dpar[1]);
+  set_variable ("dSXg",  2.35 / dpar[2]);
+  set_variable ("dSYg",  2.35 / dpar[3]);
+  set_variable ("dSXYg", dpar[4]);
+  set_variable ("dZpk",  dpar[5]);
+  set_variable ("dSg",   dpar[6]);
+  set_variable ("dSXf",  dpar[7]);
+  set_variable ("dSYf",  dpar[8]);
+  */
 }
Index: trunk/Ohana/src/opihi/cmd.astro/imfit.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/imfit.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/imfit.c	(revision 42821)
@@ -13,4 +13,16 @@
   }
 
+  Buffer *var = NULL;
+  if ((N = get_argument (argc, argv, "-var-image"))) {
+    remove_argument (N, &argc, argv);
+    var = SelectBuffer (argv[N], OLDBUFFER, TRUE);
+    if (!var) {
+      gprint (GP_ERR, "unknown buffer for variance %s\n", argv[N]);
+      FREE (Save);
+      return (FALSE);
+    }
+    remove_argument (N, &argc, argv);
+  }
+
   int Insert = FALSE;
   if ((N = get_argument (argc, argv, "-insert"))) {
@@ -18,4 +30,5 @@
     Insert = TRUE;
     if (Save) { gprint (GP_ERR, "-save and -insert are mutually exclusive\n"); free (Save); return (FALSE); }
+    if (var)  { gprint (GP_ERR, "-save and -var-image are mutually exclusive\n"); return (FALSE); }
   }
 
@@ -40,4 +53,5 @@
     Gain = atof(argv[N]);
     remove_argument (N, &argc, argv);
+    if (var) { gprint (GP_ERR, "warning: -var-image selected, -gain will have no effect\n"); }
   }
 
@@ -48,4 +62,5 @@
     RDnoise = atof(argv[N]);
     remove_argument (N, &argc, argv);
+    if (var) { gprint (GP_ERR, "warning: -var-image selected, -rdnoise will have no effect\n"); }
   }
 
@@ -140,4 +155,5 @@
     if (j + sy >= Ny) continue;
     float *V = (float *)(buf[0].matrix.buffer) + (j+sy)*buf[0].matrix.Naxis[0] + sx; 
+    float *dV = (var) ? ((float *)(var[0].matrix.buffer) + (j+sy)*var[0].matrix.Naxis[0] + sx) : NULL;
     for (int i = 0; i < dX; i++) {
       if (i + sx < 0) continue;
@@ -145,5 +161,9 @@
       if (*V > SatThreshold) goto next; // skip pixels above threshold
       if (!isfinite(*V)) goto next; // skip nan pixels
-      dz[N] = (SQ(RDnoise) + MAX(0.0, *V/Gain)); // treat negative pixels as pure read noise
+      if (dV) {
+	dz[N] = *dV;
+      } else {
+	dz[N] = (SQ(RDnoise) + MAX(0.0, *V/Gain)); // treat negative pixels as pure read noise
+      }
       if (dz[N] <= 0) goto next;
       dz[N] = 1.0 / dz[N];
@@ -154,4 +174,5 @@
     next:
       V++;
+      if (dV) { dV++; }
     }
   }
Index: trunk/Ohana/src/opihi/cmd.astro/mkgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/mkgauss.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/mkgauss.c	(revision 42821)
@@ -11,4 +11,5 @@
   Buffer *buf;
 
+  // if TRUE, integrated flux is Flux, else Io is Flux
   int Normalize = FALSE;
   if ((N = get_argument (argc, argv, "-norm"))) {
@@ -16,4 +17,13 @@
     remove_argument (N, &argc, argv);
   }    
+
+  // Io or integrated flux (depending on value of Normalize)
+  float Flux = 1.0;
+  if ((N = get_argument (argc, argv, "-flux"))) {
+    remove_argument (N, &argc, argv);
+    Flux = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }    
+
 
   // this should be Nx/2, Ny/2 if not set
@@ -29,4 +39,7 @@
   if ((argc < 3) || (argc > 5)) {
     gprint (GP_ERR, "USAGE: mkgauss (buffer) (sigma) [[sy/sx] angle]\n");
+    gprint (GP_ERR, " -flux flux : integral or peak is flux (default is 1.0)\n");
+    gprint (GP_ERR, " -norm : integral is flux (else peak)\n");
+    gprint (GP_ERR, " -c X Y : place center at X,Y\n");
     return (FALSE);
   }
@@ -66,5 +79,5 @@
   /* f = exp (-r), r = (x^2 / 2Sx) + (y^2 / 2Sy) + Sxy*x*y */
 
-  double Io = Normalize ? 1.0 / (2.0 * M_PI * Sig_x * Sig_y) : 1.0;
+  double Io = Normalize ? Flux / (2.0 * M_PI * Sig_x * Sig_y) : Flux;
 
   in = (float *) buf[0].matrix.buffer;
Index: trunk/Ohana/src/opihi/cmd.astro/region.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/region.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.astro/region.c	(revision 42821)
@@ -160,6 +160,8 @@
     if (!strcasecmp (argv[CtypeArg], "PAR")) { strcpy (graphmode.coords.ctype, "DEC--PAR"); goto got_ctype; }
     if (!strcasecmp (argv[CtypeArg], "MOL")) { strcpy (graphmode.coords.ctype, "DEC--MOL"); goto got_ctype; }
+    if (!strcasecmp (argv[CtypeArg], "LIN")) { strcpy (graphmode.coords.ctype, "DEC--LIN"); goto got_ctype; }
+    if (!strcasecmp (argv[CtypeArg], "CAR")) { strcpy (graphmode.coords.ctype, "DEC--CAT"); goto got_ctype; }
     gprint (GP_ERR, "ERROR: invalid projection type %s\n", argv[CtypeArg]);
-    gprint (GP_ERR, "allowed values: TAN, SIN, ARC, STG, ZEA, AIT, GLS, PAR, MOL\n");
+    gprint (GP_ERR, "allowed values: TAN, SIN, ARC, STG, ZEA, AIT, GLS, PAR, MOL, LIN, CAR\n");
     return FALSE;
   }
Index: trunk/Ohana/src/opihi/cmd.data/Makefile
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 42821)
@@ -67,4 +67,5 @@
 $(SRC)/ungridify.$(ARCH).o     \
 $(SRC)/histogram.$(ARCH).o	\
+$(SRC)/histbins.$(ARCH).o	\
 $(SRC)/tdhistogram.$(ARCH).o	\
 $(SRC)/hermitian1d.$(ARCH).o	\
@@ -80,4 +81,5 @@
 $(SRC)/imresample.$(ARCH).o	\
 $(SRC)/imcollapse.$(ARCH).o	\
+$(SRC)/impoints.$(ARCH).o	\
 $(SRC)/integrate.$(ARCH).o	\
 $(SRC)/interpolate.$(ARCH).o	\
Index: trunk/Ohana/src/opihi/cmd.data/histbins.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/histbins.c	(revision 42821)
+++ trunk/Ohana/src/opihi/cmd.data/histbins.c	(revision 42821)
@@ -0,0 +1,47 @@
+# include "data.h"
+
+int histbins (int argc, char **argv) {
+  
+  Vector *vals, *mins, *maxs, *out;
+
+  if (argc != 5) {
+    gprint (GP_ERR, "USAGE: histbins <values> <output> <binmin> <binmax>\n");
+    gprint (GP_ERR, "  count <values> in each bin defined by the limit vectors\n");
+    return (FALSE);
+  }
+
+  if ((vals = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((mins = SelectVector (argv[3], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((maxs = SelectVector (argv[4], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if (mins[0].Nelements != maxs[0].Nelements) {
+    gprint (GP_ERR, "binmin and binmax number of elements don't match\n");
+    return (FALSE);
+  }
+  if ((out = SelectVector (argv[2], ANYVECTOR, TRUE)) == NULL) return (FALSE);
+
+  REQUIRE_VECTOR_FLT (vals, FALSE); 
+  REQUIRE_VECTOR_FLT (mins, FALSE); 
+  REQUIRE_VECTOR_FLT (maxs, FALSE); 
+
+  int Nbins = mins->Nelements;
+  ResetVector (out, OPIHI_FLT, Nbins);
+  bzero (out[0].elements.Flt, sizeof(opihi_flt)*out[0].Nelements);
+
+  opihi_flt *V = vals[0].elements.Flt;
+
+  // this function allows the bins to be completely arbitrary and potentially overlapping
+  // find all bins which contain each value
+  for (int i = 0; i < vals->Nelements; i++, V++) {
+    opihi_flt *S = mins[0].elements.Flt;
+    opihi_flt *E = maxs[0].elements.Flt;
+    opihi_flt *O = out[0].elements.Flt;
+    for (int j = 0; j < mins->Nelements; j++, S++, E++, O++) {
+      // note lower bound is inclusive, upper bound is exclusive:
+      if (*V <  *S) continue;
+      if (*V >= *E) continue;
+      *O += 1.0;
+    }
+  }      
+  return (TRUE);
+}
+
Index: trunk/Ohana/src/opihi/cmd.data/impoints.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/impoints.c	(revision 42821)
+++ trunk/Ohana/src/opihi/cmd.data/impoints.c	(revision 42821)
@@ -0,0 +1,47 @@
+# include "data.h"
+
+// insert the vector values into the image
+int impoints (int argc, char **argv) {
+  
+  Vector *vecx = NULL, *vecy = NULL, *vecf = NULL;
+  Buffer *buff;
+
+  if (argc < 4) {
+    gprint (GP_ERR, "USAGE: impoints (buffer) <xvec> <yvec> [fvec]\n");
+    gprint (GP_ERR, " inserts the points in the image, using the value in fvec if supplied (else 1)\n");
+    return (FALSE);
+  }
+
+  if ((buff = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) return (FALSE);
+  if ((vecx = SelectVector (argv[2], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((vecy = SelectVector (argv[3], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+
+  // require vecx and vecy to be same length and floats
+
+
+  if (argc == 5) {
+      if ((vecf = SelectVector (argv[4], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  }
+
+  float *image = (float *) buff[0].matrix.buffer;
+  int Nx = buff[0].matrix.Naxis[0];
+  int Ny = buff[0].matrix.Naxis[1];
+
+  for (int i = 0; i < vecx->Nelements; i++) {
+
+      int ix = vecx->elements.Flt[i];
+      int iy = vecy->elements.Flt[i];
+
+      if (ix < 0) continue;
+      if (iy < 0) continue;
+      if (ix >= Nx) continue;
+      if (iy >= Ny) continue;
+
+      if (vecf) {
+	  image[ix + iy*Nx] += vecf->elements.Flt[i];
+      } else {
+	  image[ix + iy*Nx] ++;
+      }
+  }
+  return (TRUE);
+}
Index: trunk/Ohana/src/opihi/cmd.data/init.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/init.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.data/init.c	(revision 42821)
@@ -56,4 +56,5 @@
 int ungridify        PROTO((int, char **));
 int histogram        PROTO((int, char **));
+int histbins         PROTO((int, char **));
 int tdhistogram      PROTO((int, char **));
 int hermitian1d      PROTO((int, char **));
@@ -70,4 +71,5 @@
 int imresample       PROTO((int, char **));
 int imcollapse       PROTO((int, char **));
+int impoints         PROTO((int, char **));
 int integrate        PROTO((int, char **));
 int interpolate      PROTO((int, char **));
@@ -265,4 +267,5 @@
   {1, "header",       header,           "print image header"},
   {1, "histogram",    histogram,        "generate histogram from vector"},
+  {1, "histbins",     histbins,         "generate histogram from vector, bins specified by vectors"},
   {1, "tdhistogram",  tdhistogram,      "generate 2D histogram image from vector set"},
   {1, "hermitian1d",  hermitian1d,      "generate 1-D Hermitian Polynomial"},
@@ -281,4 +284,5 @@
   {1, "imconvolve",   imconvolve,       "full 2D real-space convolution"},
   {1, "imstats",      imstats,          "statistics on a portion of an image"},
+  {1, "impoints",     impoints,         "insert points into an image by vector pair"},
   {1, "integrate",    integrate,        "integrate a vector"},
   {1, "interpolate_presort",  interpolate_presort,      "interpolate between vector pairs"},
Index: trunk/Ohana/src/opihi/cmd.data/interpolate_presort.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/interpolate_presort.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.data/interpolate_presort.c	(revision 42821)
@@ -17,5 +17,5 @@
   /** check basic syntax **/
   if (argc != 5) {
-    gprint (GP_ERR, "USAGE: interpolate Xi Yi Xo Yo\n");
+    gprint (GP_ERR, "USAGE: interpolate Xi Yi Xo Yo [-fill-ends]\n");
     gprint (GP_ERR, "  Xi Yi - sorted reference vectors\n");
     gprint (GP_ERR, "  Xo    - output positions (vector)\n");
@@ -23,4 +23,5 @@
     gprint (GP_ERR, "  (vectors must be pre-sorted)\n");
     gprint (GP_ERR, "  (use 'threshold' to interpolate to a value)\n");
+    gprint (GP_ERR, "  -fill-ends : values outside of range are set to end-point values\n");
     return (FALSE);
   }
Index: trunk/Ohana/src/opihi/cmd.data/vgroup.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vgroup.c	(revision 42808)
+++ trunk/Ohana/src/opihi/cmd.data/vgroup.c	(revision 42821)
@@ -70,5 +70,7 @@
   ALLOCATE (values, double, xin[0].Nelements);
 
-  for (i = 0; i < xout[0].Nelements - 1; i++) {
+  // if we specify binsize, then we need to examine all bins
+  int Nout = isnan(binsize) ? xout[0].Nelements - 1 : xout[0].Nelements;
+  for (i = 0; i < Nout; i++) {
     if (isnan(binsize)) {
       xmin = xout[0].elements.Flt[i];
@@ -81,6 +83,6 @@
     N = 0;
     for (j = 0; j < xin[0].Nelements; j++) {
-      if (xin[0].elements.Flt[j] < xmin) continue;
-      if (xin[0].elements.Flt[j] > xmax) continue;
+      if (xin[0].elements.Flt[j] <  xmin) continue;
+      if (xin[0].elements.Flt[j] >= xmax) continue;
       if (yin) {
 	values[N] = yin[0].elements.Flt[j];
Index: trunk/Ohana/src/opihi/dvo/avperiodogram.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/avperiodogram.c	(revision 42808)
+++ trunk/Ohana/src/opihi/dvo/avperiodogram.c	(revision 42821)
@@ -274,5 +274,5 @@
 	// The first 3 values[] / fields[] will be time, mag, dmag
 	for (off_t n = 0; n < Nmfields; n++) {
-	  mvalues[n] = dbExtractMeasures (average, secfilt, &measure[k], NULL, NULL, &mfields[n]);
+	  mvalues[n] = dbExtractMeasures (average, secfilt, NULL, &measure[k], NULL, NULL, NULL, &mfields[n]);
 	}
 	if (!dbBooleanCond (mstack, Nmstack, mvalues)) continue;
Index: trunk/Ohana/src/opihi/dvo/avperiodomatch.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/avperiodomatch.c	(revision 42808)
+++ trunk/Ohana/src/opihi/dvo/avperiodomatch.c	(revision 42821)
@@ -302,5 +302,5 @@
 	// The first 3 values[] / fields[] will be time, mag, dmag
 	for (off_t n = 0; n < Nmfields; n++) {
-	  mvalues[n] = dbExtractMeasures (average, secfilt, &measure[k], NULL, NULL, &mfields[n]);
+	  mvalues[n] = dbExtractMeasures (average, secfilt, NULL, &measure[k], NULL, NULL, NULL, &mfields[n]);
 	}
 	if (!dbBooleanCond (mstack, Nmstack, mvalues)) continue;
Index: trunk/Ohana/src/opihi/dvo/avselect.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/avselect.c	(revision 42808)
+++ trunk/Ohana/src/opihi/dvo/avselect.c	(revision 42821)
@@ -17,9 +17,10 @@
   int VERBOSE;
   char name[1024];
-  float RADIUS;
+  opihi_flt RADIUS;
 
   Catalog catalog;
 
   Vector **vec, **invec, *RAvec, *DECvec, *IDXvec, *RADvec;
+  Vector *RINvec = NULL;
   dbField *fields;
   dbValue *values;
@@ -102,7 +103,17 @@
   }
 
-  RADIUS = atof (argv[1]);
-
-  /* load regions which contain all supplied RA,DEC coordinates */
+  if (SelectScalar (argv[1], &RADIUS)) {
+    remove_argument (1, &argc, argv);
+  } else {
+    gprint (GP_ERR, " RADIUS must be a numerical value\n");
+    goto help;
+    if ((RINvec = SelectVector (argv[1], ANYVECTOR, TRUE)) == NULL) goto help;
+    RADIUS = 0.0; // find the max radius for region selection:
+    for (i = 0; i < RINvec->Nelements; i++) {
+      RADIUS = MAX(RINvec->elements.Flt[i], RADIUS);
+    }
+  }
+
+  /* load regions which contain all supplied RA,DEC coordinates (for RINvec, uses max radius) */
   if ((skylist = SelectRegionsByCoordVectorsAndRadius (RAvec, DECvec, RADIUS/3600.0)) == NULL) goto escape;
 
@@ -167,7 +178,4 @@
     return status;
   }
-
-  RADIUS = atof (argv[1]);
-  remove_argument (1, &argc, argv);
 
   // parse the fields to be extracted and returned
Index: trunk/Ohana/src/opihi/dvo/gstar.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/gstar.c	(revision 42808)
+++ trunk/Ohana/src/opihi/dvo/gstar.c	(revision 42821)
@@ -401,4 +401,7 @@
 	  gprint (GP_LOG, "%20s ",     date);
 	  gprint (GP_LOG, "%f   ",     catalog.average[k].Trange / 86400.0);
+
+	  gprint (GP_LOG, "%ld ", catalog.average[k].extID);
+	  // gprint (GP_LOG, "0x%16x ", catalog.average[k].extID);
 	}
 
Index: trunk/Ohana/src/opihi/dvo/mextract.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/mextract.c	(revision 42808)
+++ trunk/Ohana/src/opihi/dvo/mextract.c	(revision 42821)
@@ -221,6 +221,8 @@
   }
 
+  int needLensobj = dbFieldNeedLensobj (fields, Nfields);
   int needLensing = dbFieldNeedLensing (fields, Nfields);
   int needStarpar = dbFieldNeedStarpar (fields, Nfields, FALSE);
+  int needGalphot = dbFieldNeedGalphot (fields, Nfields);
 
   // the lensing table does not have a good index to/from the measure table.  if we need lensing
@@ -247,5 +249,7 @@
     catalog.catflags = DVO_LOAD_AVERAGE | DVO_LOAD_MEASURE | DVO_LOAD_SECFILT;
     catalog.catflags |= needLensing ? DVO_LOAD_LENSING : DVO_SKIP_LENSING;
+    catalog.catflags |= needLensobj ? DVO_LOAD_LENSOBJ : DVO_SKIP_LENSOBJ;
     catalog.catflags |= needStarpar ? DVO_LOAD_STARPAR : DVO_SKIP_STARPAR;
+    catalog.catflags |= needGalphot ? DVO_LOAD_GALPHOT : DVO_SKIP_GALPHOT;
     catalog.Nsecfilt = Nsecfilt;
 
@@ -297,6 +301,12 @@
 	dbExtractMeasuresInitMeas (); // reset counters for saved fields  (costs very little
 
-	int Nstarpar = average->starparOffset;
-	StarPar *starpar = needStarpar && average->Nstarpar ? &catalog.starpar[Nstarpar] : NULL;
+	int nStar = average->starparOffset;
+	StarPar *starpar = needStarpar && average->Nstarpar ? &catalog.starpar[nStar] : NULL;
+
+	int nLens = average->lensobjOffset;
+	Lensobj *lensobj = needLensobj && average->Nlensobj ? &catalog.lensobj[nLens] : NULL;
+
+	int nPhot = average->galphotOffset;
+	GalPhot *galphot = needGalphot && average->Ngalphot ? &catalog.galphot[nPhot] : NULL;
 
 	Lensing *lensing = NULL;
@@ -313,5 +323,5 @@
 
 	for (n = 0; n < Nfields; n++) {
-	  values[n] = dbExtractMeasures (average, secfilt, &catalog.measure[m], lensing, starpar, &fields[n]);
+	  values[n] = dbExtractMeasures (average, secfilt, lensobj, &catalog.measure[m], lensing, starpar, galphot, &fields[n]);
 	}
 	// fprintf (stderr, "object: ave: %f, cat: %f, averef %d\n", fields[n].name, values[2], values[3], catalog.measure[m].averef);
Index: trunk/Ohana/src/opihi/dvo/mmatch.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/mmatch.c	(revision 42808)
+++ trunk/Ohana/src/opihi/dvo/mmatch.c	(revision 42821)
@@ -232,6 +232,8 @@
   ALLOCATE (index, off_t, Nelem);
 
-  // int needLensing = dbFieldNeedLensing (fields, Nfields);
+  int needLensobj = dbFieldNeedLensobj (fields, Nfields);
+//int needLensing = dbFieldNeedLensing (fields, Nfields);
   int needStarpar = dbFieldNeedStarpar (fields, Nfields, FALSE);
+  int needGalphot = dbFieldNeedGalphot (fields, Nfields);
 
   // grab data from all selected sky regions
@@ -249,5 +251,7 @@
     catalog.filename = HOST_ID ? hostfile : skylist[0].filename[i];
     catalog.catflags = DVO_LOAD_AVERAGE | DVO_LOAD_SECFILT | DVO_LOAD_MEASURE;
+    catalog.catflags |= needLensobj ? DVO_LOAD_LENSOBJ : DVO_SKIP_LENSOBJ;
     catalog.catflags |= needStarpar ? DVO_LOAD_STARPAR : DVO_SKIP_STARPAR;
+    catalog.catflags |= needGalphot ? DVO_LOAD_GALPHOT : DVO_SKIP_GALPHOT;
     catalog.Nsecfilt = Nsecfilt;
 
@@ -289,6 +293,12 @@
 	Average *average = &catalog.average[Ncat];
 
-	int Nstarpar = average->starparOffset;
-	StarPar *starpar = needStarpar ? &catalog.starpar[Nstarpar] : NULL;
+	int nStar = average->starparOffset;
+	StarPar *starpar = needStarpar && average->Nstarpar ? &catalog.starpar[nStar] : NULL;
+
+	int nLens = average->lensobjOffset;
+	Lensobj *lensobj = needLensobj && average->Nlensobj ? &catalog.lensobj[nLens] : NULL;
+
+	int nPhot = average->galphotOffset;
+	GalPhot *galphot = needGalphot && average->Ngalphot ? &catalog.galphot[nPhot] : NULL;
 
 	// int Nlensing = average->lensobjOffset;
@@ -299,5 +309,5 @@
 
 	for (n = 0; n < Nfields; n++) {
-	  values[n] = dbExtractMeasures (average, secfilt, &catalog.measure[m], NULL, starpar, &fields[n]);
+	  values[n] = dbExtractMeasures (average, secfilt, lensobj, &catalog.measure[m], NULL, starpar, galphot, &fields[n]);
 	}
 
Index: trunk/Ohana/src/opihi/dvo/mmextract.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/mmextract.c	(revision 42808)
+++ trunk/Ohana/src/opihi/dvo/mmextract.c	(revision 42821)
@@ -174,6 +174,8 @@
   }
 
-  // int needLensing = dbFieldNeedLensing (fields, Nfields);
+  int needLensobj = dbFieldNeedLensobj (fields, Nfields);
+//int needLensing = dbFieldNeedLensing (fields, Nfields);
   int needStarpar = dbFieldNeedStarpar (fields, Nfields, FALSE);
+  int needGalphot = dbFieldNeedGalphot (fields, Nfields);
 
   // grab data from all selected sky regions
@@ -185,4 +187,8 @@
     catalog.filename = skylist[0].filename[i];
     catalog.catflags = DVO_LOAD_AVERAGE | DVO_LOAD_MEASURE | DVO_LOAD_SECFILT;
+//  catalog.catflags |= needLensing ? DVO_LOAD_LENSING : DVO_SKIP_LENSING;
+    catalog.catflags |= needLensobj ? DVO_LOAD_LENSOBJ : DVO_SKIP_LENSOBJ;
+    catalog.catflags |= needStarpar ? DVO_LOAD_STARPAR : DVO_SKIP_STARPAR;
+    catalog.catflags |= needGalphot ? DVO_LOAD_GALPHOT : DVO_SKIP_GALPHOT;
     catalog.Nsecfilt = Nsecfilt;
 
@@ -220,6 +226,12 @@
 	Average *average = &catalog.average[j];
 
-	int Nstarpar = average->starparOffset;
-	StarPar *starpar = needStarpar ? &catalog.starpar[Nstarpar] : NULL;
+	int nStar = average->starparOffset;
+	StarPar *starpar = needStarpar && average->Nstarpar ? &catalog.starpar[nStar] : NULL;
+
+	int nLens = average->lensobjOffset;
+	Lensobj *lensobj = needLensobj && average->Nlensobj ? &catalog.lensobj[nLens] : NULL;
+
+	int nPhot = average->galphotOffset;
+	GalPhot *galphot = needGalphot && average->Ngalphot ? &catalog.galphot[nPhot] : NULL;
 
 	// int Nlensing = average->lensobjOffset;
@@ -231,5 +243,5 @@
 	for (n = 0; n < Nfields; n++) {
 	  // values needs to be a pointer to a type with FLT and INT (with a union, we would save a bit of memory...)
-	  values[n] = dbExtractMeasures (average, secfilt, &catalog.measure[m], NULL, starpar, &fields[n]);
+	  values[n] = dbExtractMeasures (average, secfilt, lensobj, &catalog.measure[m], NULL, starpar, galphot, &fields[n]);
 	}
 	// fprintf (stderr, "object: ave: %f, cat: %f, averef %d\n", fields[n].name, values[2], values[3], catalog.measure[m].averef);
Index: trunk/Ohana/src/opihi/lib.data/mrq2dmin.c
===================================================================
--- trunk/Ohana/src/opihi/lib.data/mrq2dmin.c	(revision 42808)
+++ trunk/Ohana/src/opihi/lib.data/mrq2dmin.c	(revision 42821)
@@ -17,4 +17,5 @@
 static opihi_flt *parmax = NULL;
 
+/** only used locally **/
 opihi_flt mrq2dcof (opihi_flt *x, opihi_flt *t, opihi_flt *y, opihi_flt *dy, int Npts, 
 	      opihi_flt *par, int Npar, opihi_flt **ta, opihi_flt **tb, 
@@ -60,4 +61,5 @@
 }
 
+/** only used in imfit-test.c ?? **/
 opihi_flt mrq2dchi (opihi_flt *x, opihi_flt *t, opihi_flt *y, opihi_flt *dy, int Npts, 
 		opihi_flt *par, int Npar, 
@@ -126,4 +128,6 @@
     chisq = ochisq;
   }
+
+  /* note that the parameter errors are sqrt(alpha[j][j]) */
 
   return (chisq);
Index: trunk/Ohana/src/opihi/lib.data/spline.c
===================================================================
--- trunk/Ohana/src/opihi/lib.data/spline.c	(revision 42808)
+++ trunk/Ohana/src/opihi/lib.data/spline.c	(revision 42821)
@@ -113,7 +113,19 @@
   opihi_flt dx, a, b, value;
   
-  // saturate correction at high and low ends
-  if (X < x[0]) return y[0];
-  if (X > x[N-1]) return y[N-1];
+  // linear extrapolation past endpoints
+  if (X < x[0]) {
+    hi = 1;
+    lo = 0;
+    goto evaluate;
+    // alternative: saturate correction at high and low ends
+    // return y[0]; 
+  }
+  if (X > x[N-1]) {
+    hi = N - 1;
+    lo = N - 2;
+    goto evaluate;
+    // alternative: saturate correction at high and low ends
+    // return y[N-1];
+  }
 
   /* find correct element in array (x must be sorted) */
@@ -128,4 +140,6 @@
     }
   }
+
+evaluate:
 
   /* error condition: duplicate abssisca */
Index: trunk/Ohana/src/opihi/lib.shell/convert_to_RPN.c
===================================================================
--- trunk/Ohana/src/opihi/lib.shell/convert_to_RPN.c	(revision 42808)
+++ trunk/Ohana/src/opihi/lib.shell/convert_to_RPN.c	(revision 42821)
@@ -77,4 +77,6 @@
     if (!strcmp (argv[i], "isflt"))  { type = ST_UNARY; goto gotit; }
     if (!strcmp (argv[i], "length")) { type = ST_UNARY; goto gotit; }
+    if (!strcmp (argv[i], "toupper")) { type = ST_UNARY; goto gotit; }
+    if (!strcmp (argv[i], "tolower")) { type = ST_UNARY; goto gotit; }
 
     /* binary operations */
Index: trunk/Ohana/src/opihi/lib.shell/stack_math.c
===================================================================
--- trunk/Ohana/src/opihi/lib.shell/stack_math.c	(revision 42808)
+++ trunk/Ohana/src/opihi/lib.shell/stack_math.c	(revision 42821)
@@ -1615,16 +1615,14 @@
   int i, Nx;
   
+  // handle string vectors in the L_unary function
+  if (V1->vector->type == OPIHI_STR) {
+    int status = L_unary (OUT, V1, op);
+    return status;
+  }
+
   Nx = V1[0].vector[0].Nelements;
 
   OUT[0].vector = InitVector ();
   OUT[0].type = ST_VECTOR_TMP; /*** <<--- says this is a temporary matrix ***/
-
-  if (V1->vector->type == OPIHI_STR) {
-    ResetVector (OUT->vector, V1->vector->type, V1->vector->Nelements);
-    for (i = 0; i < V1->vector->Nelements; i++) {
-      OUT->vector->elements.Str[i] = strcreate (V1->vector->elements.Str[i]);
-    }
-    goto escape;
-  }
 
 # define V_FUNC(OP,FTYPE) {						\
@@ -1744,4 +1742,22 @@
     for (int i = 0; i < Nx; i++) {			
       Ov[i] = strcreate (Iv[i]);
+    }									
+    goto escape;							
+  }
+  if (!strcmp (op, "toupper")) {
+    for (int i = 0; i < Nx; i++) {			
+      Ov[i] = strcreate (Iv[i]);
+      for (int j = 0; Ov[i][j]; j++) {
+	Ov[i][j] = toupper ((unsigned int) Ov[i][j]);
+      }
+    }									
+    goto escape;							
+  }
+  if (!strcmp (op, "tolower")) {
+    for (int i = 0; i < Nx; i++) {			
+      Ov[i] = strcreate (Iv[i]);
+      for (int j = 0; Ov[i][j]; j++) {
+	Ov[i][j] = tolower ((unsigned int) Ov[i][j]);
+      }
     }									
     goto escape;							
Index: trunk/Ohana/src/opihi/test/cdensify.sh
===================================================================
--- trunk/Ohana/src/opihi/test/cdensify.sh	(revision 42821)
+++ trunk/Ohana/src/opihi/test/cdensify.sh	(revision 42821)
@@ -0,0 +1,51 @@
+
+macro init
+  $STEP = 10
+  create Rraw 0 360 $STEP
+  delete Rtst Dtst
+  for Draw -90 90 $STEP
+    set Draw = $Draw + zero(Rraw)
+    concat Rraw Rtst
+    concat Draw Dtst
+  end
+end
+
+macro go
+  resize 2200 900
+  region 180 0 100 AIT
+# region 180 0 100 LIN
+
+  cgrid -c red
+  box -ticks 0000 -labels 0000
+# section default -imtool none
+  section default -imtool +y
+  parity 0 1
+
+  cdensify Itst Rtst Dtst -psf circle -scale 3 -raw
+  
+  tv Itst 0 2
+end
+
+macro init.rnd
+  create seq 0 100000
+  set Rtst = 360*rnd(seq)
+  set Dtst = dasin(2*rnd(seq) - 1)
+end
+
+macro go.rnd
+  resize 2200 900
+# region 180 0 100 AIT
+  region 180 0 100 LIN
+
+  cgrid -c red
+  box -ticks 0000 -labels 0000
+# section default -imtool none
+  section default -imtool +y
+  parity 0 1
+
+  date
+  cdensify Itst Rtst Dtst -psf circle -scale 1.6 -raw
+  date
+  
+  tv Itst 0 2
+end
