Index: trunk/Ohana/src/opihi/cmd.astro/cdensify.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/cdensify.c	(revision 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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 42078)
+++ 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;
   }
