Index: trunk/Ohana/src/libdvo/include/dvo.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvo.h	(revision 37055)
+++ trunk/Ohana/src/libdvo/include/dvo.h	(revision 37116)
@@ -128,5 +128,5 @@
   ID_MEAS_BLEND_MEAS     = 0x00000100,  // detection is within radius of multiple objects 
   ID_MEAS_BLEND_OBJ      = 0x00000200,  // multiple detections within radius of object 
-  ID_MEAS_UNDEF_3        = 0x00000400,  // unused 
+  ID_MEAS_WARP_USED      = 0x00000400,  // measurement used to find mean warp photometry
   ID_MEAS_UNDEF_4        = 0x00000800,  // unused 
   ID_MEAS_BLEND_MEAS_X   = 0x00001000,  // detection is within radius of multiple objects across catalogs		     
@@ -383,12 +383,12 @@
   char  ***name; // projection cell name
   
-  int NX_SUB;
-  int NY_SUB;
+  float NX_SUB;
+  float NY_SUB;
   double dPix;
 
   double **Xo;
   double **Yo;
-  int **dX;
-  int **dY;
+  float **dX;
+  float **dY;
 } BoundaryTree;
 
@@ -411,9 +411,9 @@
   double Do;
   double dPix;
-  int dX;
-  int dY;
-
-  int NX_SUB;
-  int NY_SUB;
+  float dX;
+  float dY;
+
+  float NX_SUB;
+  float NY_SUB;
 
   char *basename;
@@ -710,9 +710,11 @@
 float PhotFluxInstErr (Measure *measure, dvoMagClassType class);
 float PhotFluxCatErr (Measure *measure, dvoMagClassType class);
+float PhotFluxAveErr (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source);
 
 float PhotXm (PhotCode *code, Average *average, SecFilt *secfilt);
 float PhotZeroPoint (Measure *measure, Average *average, SecFilt *secfilt);
 
-float PhotMstdev (PhotCode *code, Average *average, SecFilt *secfilt);
+int   PhotNphot (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source);
+float PhotMstdev (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source);
 float PhotMmin (PhotCode *code, Average *average, SecFilt *secfilt);
 float PhotMmax (PhotCode *code, Average *average, SecFilt *secfilt);
Index: trunk/Ohana/src/libdvo/include/dvodb.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvodb.h	(revision 37055)
+++ trunk/Ohana/src/libdvo/include/dvodb.h	(revision 37116)
@@ -54,7 +54,9 @@
   MAG_OPTION_NPHOT, // Nused
   MAG_OPTION_UC_DIST, 
-  MAG_OPTION_STACK_DET_ID, 
   MAG_OPTION_FLAGS, 
 } dvoMagOptionType;
+
+//  MAG_OPTION_STACK_PRIMARY_OFF, 
+//  MAG_OPTION_STACK_BEST_OFF, 
 
 typedef enum {
Index: trunk/Ohana/src/libdvo/src/BoundaryTree.c
===================================================================
--- trunk/Ohana/src/libdvo/src/BoundaryTree.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/BoundaryTree.c	(revision 37116)
@@ -84,6 +84,6 @@
   gfits_scan (headerPHU, "DEC_ORI",  "%lf", 1, &tree->DEC_origin);
   gfits_scan (headerPHU, "DEC_OFF",  "%lf", 1, &tree->DEC_offset);
-  gfits_scan (headerPHU, "NX_SUB",   "%d",  1, &tree->NX_SUB);
-  gfits_scan (headerPHU, "NY_SUB",   "%d",  1, &tree->NY_SUB);
+  gfits_scan (headerPHU, "NX_SUB",   "%f",  1, &tree->NX_SUB);
+  gfits_scan (headerPHU, "NY_SUB",   "%f",  1, &tree->NY_SUB);
   gfits_scan (headerPHU, "PIXSCALE", "%lf", 1, &tree->dPix);
 
@@ -111,6 +111,6 @@
   ALLOCATE (tree->Xo,   double *, tree->Nzone);
   ALLOCATE (tree->Yo,   double *, tree->Nzone);
-  ALLOCATE (tree->dX,      int *, tree->Nzone);
-  ALLOCATE (tree->dY,      int *, tree->Nzone);
+  ALLOCATE (tree->dX,    float *, tree->Nzone);
+  ALLOCATE (tree->dY,    float *, tree->Nzone);
   ALLOCATE (tree->cell,    int *, tree->Nzone);
   ALLOCATE (tree->projID,  int *, tree->Nzone);
@@ -121,6 +121,6 @@
     ALLOCATE (tree->Xo[i],   double, tree->Nband[i]);
     ALLOCATE (tree->Yo[i],   double, tree->Nband[i]);
-    ALLOCATE (tree->dX[i],      int, tree->Nband[i]);
-    ALLOCATE (tree->dY[i],      int, tree->Nband[i]);
+    ALLOCATE (tree->dX[i],    float, tree->Nband[i]);
+    ALLOCATE (tree->dY[i],    float, tree->Nband[i]);
     ALLOCATE (tree->cell[i],    int, tree->Nband[i]);
     ALLOCATE (tree->projID[i],  int, tree->Nband[i]);
@@ -147,6 +147,6 @@
   GET_COLUMN_NEW(&headerCell, &ftableCell, Xo,    "X_CENT",      double);
   GET_COLUMN_NEW(&headerCell, &ftableCell, Yo,    "Y_CENT",      double);
-  GET_COLUMN_NEW(&headerCell, &ftableCell, dX,    "X_GRID",      int);
-  GET_COLUMN_NEW(&headerCell, &ftableCell, dY,    "Y_GRID",      int);
+  GET_COLUMN_NEW(&headerCell, &ftableCell, dX,    "X_GRID",      float);
+  GET_COLUMN_NEW(&headerCell, &ftableCell, dY,    "Y_GRID",      float);
   GET_COLUMN_NEW(&headerCell, &ftableCell, name,  "NAME",        char); // XXX how is this done?
   gfits_free_header (&headerCell);
@@ -214,6 +214,6 @@
   gfits_modify (&header, "DEC_OFF", "%lf", 1, tree->DEC_offset);
 
-  gfits_modify (&header, "NX_SUB", "%d", 1, tree->NX_SUB);
-  gfits_modify (&header, "NY_SUB", "%d", 1, tree->NY_SUB);
+  gfits_modify (&header, "NX_SUB", "%f", 1, tree->NX_SUB);
+  gfits_modify (&header, "NY_SUB", "%f", 1, tree->NY_SUB);
   gfits_modify (&header, "PIXSCALE", "%lf", 1, tree->dPix);
 
@@ -289,6 +289,6 @@
     gfits_define_bintable_column (&theader, "D", "X_CENT", "projection cell center pixel", "none", 1.0, 0.0);
     gfits_define_bintable_column (&theader, "D", "Y_CENT", "projection cell center pixel", "none", 1.0, 0.0);
-    gfits_define_bintable_column (&theader, "J", "X_GRID", "skycell grid spacing", "none", 1.0, 0.0);
-    gfits_define_bintable_column (&theader, "J", "Y_GRID", "skycell grid spacing", "none", 1.0, 0.0);
+    gfits_define_bintable_column (&theader, "E", "X_GRID", "skycell grid spacing", "none", 1.0, 0.0);
+    gfits_define_bintable_column (&theader, "E", "Y_GRID", "skycell grid spacing", "none", 1.0, 0.0);
     gfits_define_bintable_column (&theader, fmt, "NAME", "cell name", "none", 1.0, 0.0);
 
@@ -310,6 +310,6 @@
     double *Xo            ; ALLOCATE (Xo,    double, Ncell);
     double *Yo            ; ALLOCATE (Yo,    double, Ncell);
-    int    *dX            ; ALLOCATE (dX,    int,    Ncell);
-    int    *dY            ; ALLOCATE (dY,    int,    Ncell);
+    float  *dX            ; ALLOCATE (dX,    float,  Ncell);
+    float  *dY            ; ALLOCATE (dY,    float,  Ncell);
     char   *name          ; ALLOCATE (name,  char,   Ncell*BOUNDARY_TREE_NAME_LENGTH);
 
Index: trunk/Ohana/src/libdvo/src/TessellationTable.c
===================================================================
--- trunk/Ohana/src/libdvo/src/TessellationTable.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/TessellationTable.c	(revision 37116)
@@ -28,9 +28,9 @@
     tess[i].dPix = NAN;
 
-    tess[i].dX = 0;
-    tess[i].dY = 0;
-
-    tess[i].NX_SUB = 0;
-    tess[i].NY_SUB = 0;
+    tess[i].dX = NAN;
+    tess[i].dY = NAN;
+
+    tess[i].NX_SUB = NAN;
+    tess[i].NY_SUB = NAN;
 
     tess[i].basename = NULL;
@@ -123,6 +123,6 @@
   GET_COLUMN_NEW(Xo,     "X_CENT", double);
   GET_COLUMN_NEW(Yo,     "Y_CENT", double);
-  GET_COLUMN_NEW(dX,     "X_GRID", int);
-  GET_COLUMN_NEW(dY,     "Y_GRID", int);
+  GET_COLUMN_NEW(dX,     "X_GRID", float);
+  GET_COLUMN_NEW(dY,     "Y_GRID", float);
   GET_COLUMN_NEW(Rmin,   "R_MIN",  double);
   GET_COLUMN_NEW(Rmax,   "R_MAX",  double);
@@ -130,6 +130,6 @@
   GET_COLUMN_NEW(Dmax,   "D_MAX",  double);
   GET_COLUMN_NEW(dPix,   "SCALE",  double);
-  GET_COLUMN_NEW(NX_SUB, "NX_SUB", int);
-  GET_COLUMN_NEW(NY_SUB, "NY_SUB", int);
+  GET_COLUMN_NEW(NX_SUB, "NX_SUB", float);
+  GET_COLUMN_NEW(NY_SUB, "NY_SUB", float);
   GET_COLUMN_NEW(TYPE,   "TYPE",   int);
 
@@ -280,6 +280,6 @@
     gfits_modify (&header, "DEC_OFF", "%lf", 1, rings->DEC_offset);
 
-    gfits_modify (&header, "NX_SUB", "%d", 1, rings->NX_SUB);
-    gfits_modify (&header, "NY_SUB", "%d", 1, rings->NY_SUB);
+    gfits_modify (&header, "NX_SUB", "%f", 1, rings->NX_SUB);
+    gfits_modify (&header, "NY_SUB", "%f", 1, rings->NY_SUB);
     gfits_modify (&header, "PIXSCALE", "%lf", 1, rings->dPix);
   }
@@ -300,6 +300,6 @@
   gfits_define_bintable_column (&theader, "D", "X_CENT", "projection cell center pixel", "none", 1.0, 0.0);
   gfits_define_bintable_column (&theader, "D", "Y_CENT", "projection cell center pixel", "none", 1.0, 0.0);
-  gfits_define_bintable_column (&theader, "J", "X_GRID", "skycell grid spacing", "none", 1.0, 0.0);
-  gfits_define_bintable_column (&theader, "J", "Y_GRID", "skycell grid spacing", "none", 1.0, 0.0);
+  gfits_define_bintable_column (&theader, "E", "X_GRID", "skycell grid spacing", "none", 1.0, 0.0);
+  gfits_define_bintable_column (&theader, "E", "Y_GRID", "skycell grid spacing", "none", 1.0, 0.0);
   gfits_define_bintable_column (&theader, "D", "R_MIN",  "RA limit (lower)", "none", 1.0, 0.0);
   gfits_define_bintable_column (&theader, "D", "R_MAX",  "RA limit (upper)", "none", 1.0, 0.0);
@@ -307,6 +307,6 @@
   gfits_define_bintable_column (&theader, "D", "D_MAX",  "DEC limit (upper)", "none", 1.0, 0.0);
   gfits_define_bintable_column (&theader, "D", "SCALE",  "pixel scale for projection cell", "none", 1.0, 0.0);
-  gfits_define_bintable_column (&theader, "J", "NX_SUB", "skycell subdivision in x", "none", 1.0, 0.0);
-  gfits_define_bintable_column (&theader, "J", "NY_SUB", "skycell subdivision in y", "none", 1.0, 0.0);
+  gfits_define_bintable_column (&theader, "E", "NX_SUB", "skycell subdivision in x", "none", 1.0, 0.0);
+  gfits_define_bintable_column (&theader, "E", "NY_SUB", "skycell subdivision in y", "none", 1.0, 0.0);
   gfits_define_bintable_column (&theader, "J", "TYPE",   "type of tessellation", "none", 1.0, 0.0);
 
@@ -330,6 +330,6 @@
   double *Xo            ; ALLOCATE (Xo    ,    double, Nout);
   double *Yo            ; ALLOCATE (Yo    ,    double, Nout);
-  int    *dX            ; ALLOCATE (dX    ,    int,    Nout);
-  int    *dY            ; ALLOCATE (dY    ,    int,    Nout);
+  float  *dX            ; ALLOCATE (dX    ,    float,  Nout);
+  float  *dY            ; ALLOCATE (dY    ,    float,  Nout);
   double *Rmin          ; ALLOCATE (Rmin  ,    double, Nout);
   double *Rmax          ; ALLOCATE (Rmax  ,    double, Nout);
@@ -337,6 +337,6 @@
   double *Dmax          ; ALLOCATE (Dmax  ,    double, Nout);
   double *dPix          ; ALLOCATE (dPix  ,    double, Nout);
-  int    *NX_SUB        ; ALLOCATE (NX_SUB,    int,    Nout);
-  int    *NY_SUB        ; ALLOCATE (NY_SUB,    int,    Nout);
+  float  *NX_SUB        ; ALLOCATE (NX_SUB,    float,  Nout);
+  float  *NY_SUB        ; ALLOCATE (NY_SUB,    float,  Nout);
   int    *TYPE          ; ALLOCATE (TYPE,      int,    Nout);
 
@@ -559,4 +559,8 @@
     int xi = x / tess[myTess].tree->dX[zone][band];
     int yi = y / tess[myTess].tree->dY[zone][band];
+
+    xi = MAX(MIN(xi, tess[myTess].tree->NX_SUB - 1.0), 0);
+    yi = MAX(MIN(yi, tess[myTess].tree->NY_SUB - 1.0), 0);
+
     int N = xi + tess[myTess].tree->NX_SUB * yi;
   
Index: trunk/Ohana/src/libdvo/src/dbExtractAverages.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dbExtractAverages.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/dbExtractAverages.c	(revision 37116)
@@ -200,4 +200,14 @@
       }
 
+      /* in some cases below we need a measurement which matches the requested photcode.
+	 here is some sample code to find this.
+
+	  for (i = 0; i < average[0].Nmeasure; i++) {
+	    if (field->photcode->code != measure[i].photcode) continue;
+	    value.Flt = measure[i].M;
+	    break;
+	  }
+      */
+
       switch (field->magOption) {
 	case MAG_OPTION_MAG:
@@ -207,5 +217,5 @@
 	      break;
 	    case MAG_LEVEL_REF:
-	      // why is measure needed here?
+	      // which measure is needed here?
 	      // PhotRef  (field->photcode, average, secfilt, measure, field->magClass, field->magSource); 
 	      break;
@@ -242,5 +252,6 @@
 	      break;
 	    case MAG_LEVEL_REF:
-	      // value.Flt = PhotFluxRef  (equiv, average, secfilt, measure, field->magClass, field->magSource); 
+	      // XXX which measure is needed here?
+	      // value.Flt = PhotFluxRef  (field->photcode, average, secfilt, measure, field->magClass, field->magSource); 
 	      break;
 	    case MAG_LEVEL_INST:
@@ -258,5 +269,5 @@
 	    case MAG_LEVEL_AVE:
 	    case MAG_LEVEL_REF:
-	      // value.Flt = PhotFluxAveErr (equiv, average, secfilt, field->magClass, field->magSource);  
+	      value.Flt = PhotFluxAveErr (field->photcode, average, secfilt, field->magClass, field->magSource);  
 	      break;
 	    case MAG_LEVEL_INST:
@@ -271,7 +282,15 @@
 
 	case MAG_OPTION_STDEV:
+	  value.Flt = PhotMstdev (field->photcode, average, secfilt, field->magClass, field->magSource);
+	  break;
 	case MAG_OPTION_CHISQ:
+	  value.Flt = PhotXm (field->photcode, average, secfilt);
+	  break;
 	case MAG_OPTION_MIN:
+	  value.Flt = PhotMmin (field->photcode, average, secfilt);
+	  break;
 	case MAG_OPTION_MAX:
+	  value.Flt = PhotMmax (field->photcode, average, secfilt);
+	  break;
 	case MAG_OPTION_NCODE: {
 	  int Nsec = GetPhotcodeNsec (field->photcode->code);
@@ -281,13 +300,13 @@
 	}
 	case MAG_OPTION_NPHOT: {
-	  int Nsec = GetPhotcodeNsec (field->photcode->code);
-	  if (Nsec == -1) break;
-	  value.Int = secfilt[Nsec].Nused;
+	  value.Int = PhotNphot (field->photcode, average, secfilt, field->magClass, field->magSource);
 	  break;
 	}
 	case MAG_OPTION_UC_DIST:
-	case MAG_OPTION_STACK_DET_ID:
-	  value.Int = PhotStackID (field->photcode, average, secfilt);
-	  break;
+	  value.Flt = PhotUCdist (field->photcode, average, secfilt);
+	  break;
+	// XX case MAG_OPTION_STACK_DET_ID:
+	// XX   value.Int = PhotStackID (field->photcode, average, secfilt);
+	// XX   break;
 	case MAG_OPTION_FLAGS: {
 	  int Nsec = GetPhotcodeNsec (field->photcode->code);
@@ -301,124 +320,4 @@
       break;
 
-# if (0)
-      switch (field->magMode) {
-	case MAG_AVE:
-	  value.Flt = PhotAve  (field->photcode, average, secfilt);
-	  break;
-	case MAG_REF:
-	  value.Flt = PhotRef  (field->photcode, average, secfilt, measure);
-	  break;
-	case MAG_INST:
-	case MAG_CAT:
-	case MAG_SYS:
-	case MAG_REL:
-	case MAG_CAL:
-	  // XXX need to code this correctly: this returns just the first matching value
-	  value.Flt = NAN;
-	  for (i = 0; i < average[0].Nmeasure; i++) {
-	    if (field->photcode->code != measure[i].photcode) continue;
-	    value.Flt = measure[i].M;
-	    break;
-	  }
-	  break;
-	case MAG_CHISQ:
-	  value.Flt = PhotXm (field->photcode, average, secfilt);
-	  break;
-	case MAG_ERR:
-	  if ((field->photcode->type == PHOT_REF) || (field->photcode->type == PHOT_DEP)) {
-	    for (i = 0; i < average[0].Nmeasure; i++) {
-	      if (field->photcode->code != measure[i].photcode) continue;
-	      value.Flt = measure[i].dM;
-	      break;
-	    }
-	  } else {
-	    value.Flt = PhotAveErr (field->photcode, average, secfilt);
-	  }
-	  break;
-	case MAG_STDEV:
-	  value.Flt = PhotMstdev (field->photcode, average, secfilt);
-	  break;
-	case MAG_PHOT_FLAGS:
-	  if ((field->photcode->type == PHOT_REF) || (field->photcode->type == PHOT_DEP)) {
-	    for (i = 0; i < average[0].Nmeasure; i++) {
-	      if (field->photcode->code != measure[i].photcode) continue;
-	      value.Int = measure[i].photFlags;
-	      break;
-	    }
-	  } else {
-	    int Nsec = GetPhotcodeNsec (field->photcode->code);
-	    if (Nsec == -1) break;
-	    value.Int = secfilt[Nsec].flags;
-	  }
-	  break;
-	case MAG_NCODE:
-	  // XXX push these into dvo_photcode_ops APIs
-	  // XXX do I need to allow for conversion to equiv?
-	  int Nsec = GetPhotcodeNsec (field->photcode->code);
-	  if (Nsec == -1) break;
-	  value.Int = secfilt[Nsec].Ncode;
-	  break;
-	case MAG_NPHOT:
-	  int Nsec = GetPhotcodeNsec (field->photcode->code);
-	  if (Nsec == -1) break;
-	  value.Int = secfilt[Nsec].Nused;
-	  break;
-
-	case MAG_APER:
-	case MAG_APER_AVE:
-	  value.Flt = PhotAperAve (field->photcode, average, secfilt);
-	  break;
-
-	case MAG_APER_REF:
-	  value.Flt = PhotAperRef (field->photcode, average, secfilt, measure);
-	  break;
-
-	case MAG_KRON:
-	case MAG_KRON_AVE:
-	  value.Flt = PhotKronAve (field->photcode, average, secfilt);
-	  break;
-
-	case MAG_KRON_REF:
-	  value.Flt = PhotKronRef (field->photcode, average, secfilt, measure);
-	  break;
-
-	case MAG_KRON_ERR:
-	  value.Flt = PhotKronAveErr (field->photcode, average, secfilt);
-	  break;
-
-	case MAG_MIN:
-	  value.Flt = PhotMmin (field->photcode, average, secfilt);
-	  break;
-	case MAG_MAX:
-	  value.Flt = PhotMmax (field->photcode, average, secfilt);
-	  break;
-	case MAG_UC_DIST:
-	  value.Flt = PhotUCdist (field->photcode, average, secfilt);
-	  break;
-	case MAG_STACK_DET_ID:
-	  value.Int = PhotStackID (field->photcode, average, secfilt);
-	  break;
-
-	case MAG_FLUX_PSF:
-	  value.Flt = PhotAveFluxPSF (field->photcode, average, secfilt);
-	  break;
-	case MAG_FLUX_PSF_ERR:
-	  value.Flt = PhotAvedFluxPSF (field->photcode, average, secfilt);
-	  break;
-	case MAG_FLUX_KRON:
-	  value.Flt = PhotAveFluxKron (field->photcode, average, secfilt);
-	  break;
-	case MAG_FLUX_KRON_ERR:
-	  value.Flt = PhotAvedFluxKron (field->photcode, average, secfilt);
-	  break;
-      }
-      break;
-    case AVE_dMAG:
-      value.Flt = PhotAveErr (field->photcode, average, secfilt);
-      break;
-    case AVE_Xm:
-      value.Flt = PhotXm (field->photcode, average, secfilt);
-      break;
-# endif
     case AVE_TYPE:
       break;
Index: trunk/Ohana/src/libdvo/src/dbExtractMeasures.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dbExtractMeasures.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/dbExtractMeasures.c	(revision 37116)
@@ -248,5 +248,4 @@
 	case MAG_OPTION_NPHOT:
 	case MAG_OPTION_UC_DIST:
-	case MAG_OPTION_STACK_DET_ID:
 	case MAG_OPTION_FLAGS:
 	case MAG_OPTION_NONE:
Index: trunk/Ohana/src/libdvo/src/dbFields.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dbFields.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/dbFields.c	(revision 37116)
@@ -78,5 +78,4 @@
   if (!strcasecmp (string, "nphot"))        return (MAG_OPTION_NPHOT);
   if (!strcasecmp (string, "uc_dist"))      return (MAG_OPTION_UC_DIST);
-  if (!strcasecmp (string, "stack_det_id")) return (MAG_OPTION_STACK_DET_ID);
   if (!strcasecmp (string, "flags"))        return (MAG_OPTION_FLAGS);
 
@@ -145,5 +144,4 @@
   if (!strcasecmp (string, "max"))         return (MAG_MAX);
   if (!strcasecmp (string, "ucdist"))      return (MAG_UC_DIST);
-  if (!strcasecmp (string, "stackDetectID")) return (MAG_STACK_DET_ID);
   if (!strcasecmp (string, "fluxpsf"))     return (MAG_FLUX_PSF);
   if (!strcasecmp (string, "fluxpsferr"))  return (MAG_FLUX_PSF_ERR);
@@ -296,5 +294,4 @@
 
   switch (field->magOption) {
-    case MAG_OPTION_STACK_DET_ID:
     case MAG_OPTION_NCODE:
     case MAG_OPTION_NPHOT:
Index: trunk/Ohana/src/libdvo/src/dvo_catalog.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_catalog.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/dvo_catalog.c	(revision 37116)
@@ -197,5 +197,6 @@
   secfilt->dFapStk     = NAN;
 
-  secfilt->stackDetectID = 0;
+  secfilt->stackPrmryOff = -1;
+  secfilt->stackBestOff  = -1;
 
   secfilt->MpsfWrp     = NAN;
@@ -860,11 +861,7 @@
     catalog[0].lensobj = NULL;
   }
-  // if (catalog[0].X_t)      free (catalog[0].X_t);
-  // if (catalog[0].Y_t)      free (catalog[0].Y_t);
-  if (catalog[0].nOwn_t)      free (catalog[0].nOwn_t);
-  if (catalog[0].found_t)     free (catalog[0].found_t);
-  // if (catalog[0].image_t)  free (catalog[0].image_t);
-  // if (catalog[0].mosaic_t) free (catalog[0].mosaic_t);
-  if (catalog[0].foundWarp_t) free (catalog[0].foundWarp_t);
+  if (catalog[0].nOwn_t)      { free (catalog[0].nOwn_t); catalog[0].nOwn_t = NULL; }
+  if (catalog[0].found_t)     { free (catalog[0].found_t); catalog[0].found_t = NULL; }
+  if (catalog[0].foundWarp_t) { free (catalog[0].foundWarp_t); catalog[0].foundWarp_t = NULL; }
 }
 
Index: trunk/Ohana/src/libdvo/src/dvo_convert.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/dvo_convert.c	(revision 37116)
@@ -392,4 +392,11 @@
     return (lensing); }
 
+# define SKIPPING_FORMAT(NAME, FORMAT, TYPE)		\
+  if (!strcmp (extname, NAME)) {					\
+    fprintf (stderr, "ERROR: format %s not defined for lensing, skipping\n", NAME); \
+    *Nlensing = 0; \
+    return NULL; \
+  }
+
   if (!strcmp (extname, "DVO_LENSING")) {
     lensing = gfits_table_get_Lensing (ftable, Nlensing, NULL);
@@ -402,16 +409,16 @@
   }
 
-// CONVERT_FORMAT ("DVO_LENSING_PS1_REF",         PS1_REF,         PS1_REF);
-// CONVERT_FORMAT ("DVO_LENSING_ELIXIR", 	  ELIXIR,  	   Elixir);
-// CONVERT_FORMAT ("DVO_LENSING_LONEOS", 	  LONEOS,          Loneos);
-// CONVERT_FORMAT ("DVO_LENSING_PANSTARRS_DEV_0", PANSTARRS_DEV_0, Panstarrs_DEV_0);
-// CONVERT_FORMAT ("DVO_LENSING_PANSTARRS_DEV_1", PANSTARRS_DEV_1, Panstarrs_DEV_1);
-// CONVERT_FORMAT ("DVO_LENSING_PS1_DEV_1",       PS1_DEV_1,       PS1_DEV_1);
-// CONVERT_FORMAT ("DVO_LENSING_PS1_DEV_2",       PS1_DEV_2,       PS1_DEV_2);
-// CONVERT_FORMAT ("DVO_LENSING_PS1_V1",          PS1_V1,          PS1_V1);
-// CONVERT_FORMAT ("DVO_LENSING_PS1_V2",          PS1_V2,          PS1_V2);
-// CONVERT_FORMAT ("DVO_LENSING_PS1_V3",          PS1_V3,          PS1_V3);
-// CONVERT_FORMAT ("DVO_LENSING_PS1_V4",          PS1_V4,          PS1_V4);
-  CONVERT_FORMAT ("DVO_LENSING_PS1_V5",          PS1_V5,          PS1_V5);
+  SKIPPING_FORMAT ("DVO_LENSING_PS1_REF",         PS1_REF,         PS1_REF);
+  SKIPPING_FORMAT ("DVO_LENSING_ELIXIR", 	  ELIXIR,  	   Elixir);
+  SKIPPING_FORMAT ("DVO_LENSING_LONEOS", 	  LONEOS,          Loneos);
+  SKIPPING_FORMAT ("DVO_LENSING_PANSTARRS_DEV_0", PANSTARRS_DEV_0, Panstarrs_DEV_0);
+  SKIPPING_FORMAT ("DVO_LENSING_PANSTARRS_DEV_1", PANSTARRS_DEV_1, Panstarrs_DEV_1);
+  SKIPPING_FORMAT ("DVO_LENSING_PS1_DEV_1",       PS1_DEV_1,       PS1_DEV_1);
+  SKIPPING_FORMAT ("DVO_LENSING_PS1_DEV_2",       PS1_DEV_2,       PS1_DEV_2);
+  SKIPPING_FORMAT ("DVO_LENSING_PS1_V1",          PS1_V1,          PS1_V1);
+  SKIPPING_FORMAT ("DVO_LENSING_PS1_V2",          PS1_V2,          PS1_V2);
+  SKIPPING_FORMAT ("DVO_LENSING_PS1_V3",          PS1_V3,          PS1_V3);
+  SKIPPING_FORMAT ("DVO_LENSING_PS1_V4",          PS1_V4,          PS1_V4);
+  CONVERT_FORMAT  ("DVO_LENSING_PS1_V5",          PS1_V5,          PS1_V5);
 # undef CONVERT_FORMAT
 
Index: trunk/Ohana/src/libdvo/src/dvo_convert_PS1_V4.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_PS1_V4.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_PS1_V4.c	(revision 37116)
@@ -251,5 +251,6 @@
     out[i].Mstdev        = in[i].Mstdev;      
     out[i].ubercalDist   = in[i].ubercalDist;      
-    out[i].stackDetectID = in[i].stackDetectID;      
+    out[i].stackPrmryOff = in[i].stackPrmryOff;      
+    out[i].stackBestOff  = in[i].stackBestOff;      
  }
   return (out);
@@ -281,5 +282,6 @@
     out[i].Mstdev      	 = in[i].Mstdev;      
     out[i].ubercalDist 	 = in[i].ubercalDist;      
-    out[i].stackDetectID = in[i].stackDetectID;
+    out[i].stackPrmryOff = in[i].stackPrmryOff;      
+    out[i].stackBestOff  = in[i].stackBestOff;      
   }
   return (out);
Index: trunk/Ohana/src/libdvo/src/dvo_convert_PS1_V5.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_PS1_V5.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_PS1_V5.c	(revision 37116)
@@ -319,5 +319,6 @@
     out[i].dFapStk       = in[i].dFapStk;
 
-    out[i].stackDetectID = in[i].stackDetectID;      
+    out[i].stackPrmryOff = in[i].stackPrmryOff;      
+    out[i].stackBestOff  = in[i].stackBestOff;      
 
     out[i].MpsfWrp       = in[i].MpsfWrp;
@@ -387,5 +388,6 @@
     out[i].dFapStk       = in[i].dFapStk;
 
-    out[i].stackDetectID = in[i].stackDetectID;      
+    out[i].stackPrmryOff = in[i].stackPrmryOff;      
+    out[i].stackBestOff  = in[i].stackBestOff;      
 
     out[i].MpsfWrp       = in[i].MpsfWrp;
Index: trunk/Ohana/src/libdvo/src/dvo_photcode_ops.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 37055)
+++ trunk/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 37116)
@@ -687,14 +687,94 @@
 }
 
-float PhotMstdev (PhotCode *code, Average *average, SecFilt *secfilt) {
-
-  int Ns;
-  float Mstdev;
-
-  if (code == NULL) return NAN;
-
-  Ns = photcodes[0].hashNsec[code[0].code];
-  Mstdev  = (Ns == -1) ? NAN : 0.001*secfilt[Ns].Mstdev;
+float PhotMstdev (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source) {
+
+  if (code == NULL) return NAN;
+
+  int Ns = photcodes[0].hashNsec[code[0].code];
+  if (Ns == -1) return (NAN);
+
+  float Mstdev = NAN;
+  switch (source) {
+    case MAG_SRC_CHP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  Mstdev = secfilt[Ns].Mstdev;
+	  break;
+	case MAG_CLASS_KRON:
+	  Mstdev = secfilt[Ns].sMkron;
+	  break;
+	case MAG_CLASS_APER:
+	  Mstdev = secfilt[Ns].sMap;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_WRP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  Mstdev = secfilt[Ns].sFpsfWrp;
+	  break;
+	case MAG_CLASS_KRON:
+	  Mstdev = secfilt[Ns].sFkronWrp;
+	  break;
+	case MAG_CLASS_APER:
+	  Mstdev = secfilt[Ns].sFapWrp;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_STK:
+    default:
+      break;
+  }
   return (Mstdev);
+}
+
+int PhotNphot (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source) {
+
+  if (code == NULL) return 0;
+
+  int Ns = photcodes[0].hashNsec[code[0].code];
+  if (Ns == -1) return 0;
+
+  int Nphot = 0;
+  switch (source) {
+    case MAG_SRC_CHP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  Nphot = secfilt[Ns].Nused;
+	  break;
+	case MAG_CLASS_KRON:
+	  Nphot = secfilt[Ns].NusedKron;
+	  break;
+	case MAG_CLASS_APER:
+	  Nphot = secfilt[Ns].NusedAp;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_WRP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  Nphot = secfilt[Ns].NusedWrp;
+	  break;
+	case MAG_CLASS_KRON:
+	  Nphot = secfilt[Ns].NusedKronWrp;
+	  break;
+	case MAG_CLASS_APER:
+	  Nphot = secfilt[Ns].NusedApWrp;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_STK:
+    default:
+      break;
+  }
+  return (Nphot);
 }
 
@@ -783,15 +863,15 @@
 }
 
-unsigned int PhotStackID (PhotCode *code, Average *average, SecFilt *secfilt) {
-
-  int Ns;
-  unsigned int ID;
-
-  if (code == NULL) return 0;
-
-  Ns = photcodes[0].hashNsec[code[0].code];
-  ID = (Ns == -1) ? 0 : secfilt[Ns].stackDetectID;
-  return (ID);
-}
+// XX unsigned int PhotStackID (PhotCode *code, Average *average, SecFilt *secfilt) {
+// XX 
+// XX   int Ns;
+// XX   unsigned int ID;
+// XX 
+// XX   if (code == NULL) return 0;
+// XX 
+// XX   Ns = photcodes[0].hashNsec[code[0].code];
+// XX   ID = (Ns == -1) ? 0 : secfilt[Ns].stackDetectID;
+// XX   return (ID);
+// XX }
 
 // Xm is now (2014.07.03) stored as the chisq except in dvo formats which use as short
@@ -1112,4 +1192,64 @@
   }
   return (Fave);
+}
+
+float PhotFluxAveErr (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source) {
+
+  if (code == NULL) return NAN;
+
+  int Ns = photcodes[0].hashNsec[code[0].code];
+  if (Ns == -1) return (NAN);
+
+  float dFave = NAN;
+  switch (source) {
+    case MAG_SRC_CHP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  dFave = secfilt[Ns].dM * MagToFlux(secfilt[Ns].M);
+	  break;
+	case MAG_CLASS_KRON:
+	  dFave = secfilt[Ns].dMkron * MagToFlux(secfilt[Ns].Mkron);
+	  break;
+	case MAG_CLASS_APER:
+	  dFave = secfilt[Ns].dMap * MagToFlux(secfilt[Ns].Map);
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_WRP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  dFave = secfilt[Ns].dFpsfWrp;
+	  break;
+	case MAG_CLASS_KRON:
+	  dFave = secfilt[Ns].dFkronWrp;
+	  break;
+	case MAG_CLASS_APER:
+	  dFave = secfilt[Ns].dFapWrp;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_STK:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  dFave = secfilt[Ns].dFpsfStk;
+	  break;
+	case MAG_CLASS_KRON:
+	  dFave = secfilt[Ns].dFkronStk;
+	  break;
+	case MAG_CLASS_APER:
+	  dFave = secfilt[Ns].dFapStk;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    default:
+      break;
+  }
+  return (dFave);
 }
 
