Index: trunk/Ohana/src/addstar/include/addstar.h
===================================================================
--- trunk/Ohana/src/addstar/include/addstar.h	(revision 39040)
+++ trunk/Ohana/src/addstar/include/addstar.h	(revision 39041)
@@ -131,4 +131,5 @@
 
 char    ZERO_POINT_OPTION[64];
+char    ZERO_POINT_KEYWORD[64];
 float	ZERO_POINT_OFFSET;
 float	ZERO_POINT_ERROR;
Index: trunk/Ohana/src/addstar/src/ConfigInit.c
===================================================================
--- trunk/Ohana/src/addstar/src/ConfigInit.c	(revision 39040)
+++ trunk/Ohana/src/addstar/src/ConfigInit.c	(revision 39041)
@@ -105,4 +105,8 @@
   if (!ScanConfig (config, "ZERO_POINT_OPTION", "%s",  0, ZERO_POINT_OPTION)) {
       strcpy (ZERO_POINT_OPTION, "NOMINAL"); 
+  }
+  // if this config variable is not set, do not set any zero point offset
+  if (!ScanConfig (config, "ZERO_POINT_KEYWORD", "%s",  0, ZERO_POINT_KEYWORD)) {
+      strcpy (ZERO_POINT_KEYWORD, "ZPT_OBS"); 
   }
 
Index: trunk/Ohana/src/addstar/src/GetZeroPointExposure.c
===================================================================
--- trunk/Ohana/src/addstar/src/GetZeroPointExposure.c	(revision 39040)
+++ trunk/Ohana/src/addstar/src/GetZeroPointExposure.c	(revision 39041)
@@ -53,5 +53,5 @@
 	    Nhead = headerSets[i].extnum_head;
 
-	    if (!gfits_scan (headers[Nhead], "ZPT_OBS", "%f", 1, &ZPT_OBS)) {
+	    if (!gfits_scan (headers[Nhead], ZERO_POINT_KEYWORD, "%f", 1, &ZPT_OBS)) {
 		fprintf (stderr, "zero point not supplied in header\n");
 		continue;
@@ -113,5 +113,5 @@
 	    
             float ZPT_OBS, ZPT_ERR;
-	    if (!gfits_scan (headers[Nhead], "ZPT_OBS", "%f", 1, &ZPT_OBS)) {
+	    if (!gfits_scan (headers[Nhead], ZERO_POINT_KEYWORD, "%f", 1, &ZPT_OBS)) {
 		fprintf (stderr, "WARNING: zero point is not measured, no valid entries in headers\n");
 		return (FALSE);
Index: trunk/Ohana/src/addstar/src/ReadImageHeader.c
===================================================================
--- trunk/Ohana/src/addstar/src/ReadImageHeader.c	(revision 39040)
+++ trunk/Ohana/src/addstar/src/ReadImageHeader.c	(revision 39041)
@@ -237,5 +237,5 @@
   if (!strcasecmp(ZERO_POINT_OPTION, "CHIP_HEADER")) {
       float ZPT_OBS;
-      if (!photcodeData || !gfits_scan (header, "ZPT_OBS", "%f", 1, &ZPT_OBS)) {
+      if (!photcodeData || !gfits_scan (header, ZERO_POINT_KEYWORD, "%f", 1, &ZPT_OBS)) {
           fprintf (stderr, "zero point not supplied in header\n");
           ZERO_POINT_OFFSET = 0.0;
Index: trunk/Ohana/src/libdvo/include/dvo.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvo.h	(revision 39040)
+++ trunk/Ohana/src/libdvo/include/dvo.h	(revision 39041)
@@ -191,4 +191,5 @@
   ID_OBJ_SUSPECT_STACK = 0x20000000, // suspect object in the stack (> 1 good or suspect stack, < 2 good)
   ID_OBJ_BAD_STACK     = 0x40000000, // good-quality object in the stack (> 1 good stack)
+  ID_OBJ_BEST_STACK    = 0x80000000, // the primary stack measurement are the best measurements
 } DVOAverageFlags;
 
Index: trunk/Ohana/src/libdvo/include/dvodb.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvodb.h	(revision 39040)
+++ trunk/Ohana/src/libdvo/include/dvodb.h	(revision 39041)
@@ -309,4 +309,8 @@
       AVE_NMEAS, 
       AVE_NMISS, 
+      AVE_NLENSING, 
+      AVE_NLENSOBJ, 
+      AVE_NSTARPAR, 
+      AVE_NGALPHOT, 
       AVE_NPOS, 
       AVE_OBJ_FLAGS, 
Index: trunk/Ohana/src/libdvo/src/dbExtractAverages.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dbExtractAverages.c	(revision 39040)
+++ trunk/Ohana/src/libdvo/src/dbExtractAverages.c	(revision 39041)
@@ -127,4 +127,16 @@
     case AVE_NMISS:
       value.Int = average[0].Nmissing;
+      break;
+    case AVE_NLENSING:
+      value.Int = average[0].Nlensing;
+      break;
+    case AVE_NLENSOBJ:
+      value.Int = average[0].Nlensobj;
+      break;
+    case AVE_NGALPHOT:
+      value.Int = average[0].Ngalphot;
+      break;
+    case AVE_NSTARPAR:
+      value.Int = average[0].Nstarpar;
       break;
     case AVE_NPOS:
Index: trunk/Ohana/src/libdvo/src/dbFields.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dbFields.c	(revision 39040)
+++ trunk/Ohana/src/libdvo/src/dbFields.c	(revision 39041)
@@ -711,4 +711,9 @@
   if (!strcasecmp (fieldName, "NMEAS"))       ESCAPE (AVE_NMEAS,       OPIHI_INT);
   if (!strcasecmp (fieldName, "NMISS"))       ESCAPE (AVE_NMISS,       OPIHI_INT);
+  if (!strcasecmp (fieldName, "NLENSMEAS"))   ESCAPE (AVE_NLENSING,    OPIHI_INT);
+  if (!strcasecmp (fieldName, "NLENSING"))    ESCAPE (AVE_NLENSING,    OPIHI_INT);
+  if (!strcasecmp (fieldName, "NLENSOBJ"))    ESCAPE (AVE_NLENSOBJ,    OPIHI_INT);
+  if (!strcasecmp (fieldName, "NSTARPAR"))    ESCAPE (AVE_NSTARPAR,    OPIHI_INT);
+  if (!strcasecmp (fieldName, "NGALPHOT"))    ESCAPE (AVE_NGALPHOT,    OPIHI_INT);
   if (!strcasecmp (fieldName, "NPOS"))        ESCAPE (AVE_NPOS,        OPIHI_INT);
   if (!strcasecmp (fieldName, "NASTROM"))     ESCAPE (AVE_NPOS,        OPIHI_INT);
Index: trunk/Ohana/src/relphot/src/setMrelCatalog.c
===================================================================
--- trunk/Ohana/src/relphot/src/setMrelCatalog.c	(revision 39040)
+++ trunk/Ohana/src/relphot/src/setMrelCatalog.c	(revision 39041)
@@ -674,4 +674,22 @@
   } // Nsecfilt loop
 
+  // in PSPS, there will be a stackObject row with the primary values.  if all filter primary values which
+  // exist are also best values, then this row will be the best entry
+
+  // the secfilt[Ns] entries are defined to be the Best values, so
+
+  // conversely, if any secfilt[Ns] values are not PRIMARY, then the PRIMARY row is not the BEST row
+
+  int PrimaryIsBest = TRUE;
+  for (Ns = 0; Ns < Nphotcodes; Ns++) {
+    if (!(secfilt[Ns].flags & ID_SECF_HAS_PS1_STACK)) continue; // no stack detection in PS1, nothing is best
+    if (secfilt[Ns].flags & ID_SECF_STACK_PRIMARY) continue;    // primary stack detection is best
+    PrimaryIsBest = FALSE;
+  }
+
+  if (PrimaryIsBest) {
+    average[0].flags |= ID_OBJ_BEST_STACK;
+  }
+
   if (NstackGood >= 2) {
     average[0].flags |= ID_OBJ_GOOD_STACK;
