Index: /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/StarOps.c
===================================================================
--- /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/StarOps.c	(revision 38316)
+++ /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/StarOps.c	(revision 38317)
@@ -106,5 +106,4 @@
     results->needSYN[i] = FALSE;
     results->measSYN[i] = -1;
-    results->minSYN[i]  = NAN;
 
     results->psfQfMax[i]  = NAN;
@@ -151,5 +150,5 @@
     ALLOCATE (results->minSYN,  float, results->Nsecfilt);
 
-    ALLOCATE (results->psfQfMax, float, results->Nsecfilt);
+    ALLOCATE (results->psfQfMax,     float, results->Nsecfilt);
     ALLOCATE (results->psfQfPerfMax, float, results->Nsecfilt);
 
@@ -158,5 +157,4 @@
     ALLOCATE (results->Next,           int, results->Nsecfilt);
     ALLOCATE (results->NexpPS1,        int, results->Nsecfilt);
-    ALLOCATE (results->havePS1,        int, results->Nsecfilt);
     ALLOCATE (results->haveUbercal,    int, results->Nsecfilt);
 
@@ -199,5 +197,4 @@
     results->Next = NULL;
     results->NexpPS1 = NULL;
-    results->havePS1 = NULL;
     results->haveUbercal = NULL;
 
@@ -231,5 +228,4 @@
   FREE (results->Next);
   FREE (results->NexpPS1);
-  FREE (results->havePS1);
   FREE (results->haveUbercal);
 
Index: /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/args.c
===================================================================
--- /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/args.c	(revision 38316)
+++ /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/args.c	(revision 38317)
@@ -331,14 +331,4 @@
   }
 
-  // if -synthphot_zpts is supplied, the map of corrections needed for the synthetic photometry is supplied
-  // and used to tie down the synthetic magnitudes
-  SYNTH_ZERO_POINTS = NULL;
-  if ((N = get_argument (argc, argv, "-synthphot_zpts"))) {
-    remove_argument (N, &argc, argv);
-    myAssert (N < argc, "missing argument to -synthphot_means");
-    SYNTH_ZERO_POINTS = strcreate (argv[N]);
-    remove_argument (N, &argc, argv);
-  }
-
   // if -synthphot is chosen, an artificial w-band measurement is generated for each object 
   // with r and i photometry.  this was used to apply the ubercal photometry to w-band images.
@@ -384,5 +374,15 @@
     mode = UPDATE_AVERAGES;
   }
+
+  // if -synthphot_zpts is supplied, the map of corrections needed for the synthetic photometry is supplied
+  // and used to tie down the synthetic magnitudes
+  // NOTE: SYNTH_ZERO_POINTS is used for the same file in both -synthphot_zpts and -synthphot_means
   SYNTH_ZERO_POINTS = NULL;
+  if ((N = get_argument (argc, argv, "-synthphot_zpts"))) {
+    remove_argument (N, &argc, argv);
+    myAssert (N < argc, "missing argument to -synthphot_zpts");
+    SYNTH_ZERO_POINTS = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
   if ((N = get_argument (argc, argv, "-synthphot_means"))) {
     mode = SYNTH_PHOT;
@@ -495,4 +495,10 @@
   }
   SYNTH_ZERO_POINTS = NULL;
+  if ((N = get_argument (argc, argv, "-synthphot_zpts"))) {
+    remove_argument (N, &argc, argv);
+    myAssert (N < argc, "missing argument to -synthphot_zpts");
+    SYNTH_ZERO_POINTS = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
   if ((N = get_argument (argc, argv, "-synthphot_means"))) {
     MODE = MODE_SYNTH_PHOT;
Index: /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/bcatalog.c
===================================================================
--- /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/bcatalog.c	(revision 38316)
+++ /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/bcatalog.c	(revision 38317)
@@ -65,18 +65,4 @@
       int Ns;
 
-# if (0)      
-      DVOSecfiltFlags secfiltBits = 
-	ID_SECF_STAR_FEW | 
-	ID_SECF_STAR_POOR | 
-	ID_PHOTOM_PASS_0 | 
-	ID_PHOTOM_PASS_1 | 
-	ID_PHOTOM_PASS_2 | 
-	ID_PHOTOM_PASS_3 | 
-	ID_PHOTOM_PASS_4 |
-	ID_SECF_USE_SYNTH |
-	ID_SECF_USE_UBERCAL |
-	ID_SECF_OBJ_EXT;
-# endif
-
       for (Ns = 0; Ns < Nphotcodes; Ns++) {
 
@@ -84,18 +70,5 @@
 	int Nsec = GetPhotcodeNsec(thisCode);
 
-	// fprintf (stderr, "really use dvo_secfilt_init?");
-	dvo_secfilt_init (&subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec]);
-
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].M      = NAN;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].Map    = NAN;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].dM     = NAN;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].Mstdev = NAN_S_SHORT;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].Mchisq = NAN;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].M_20   = NAN_S_SHORT;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].M_80   = NAN_S_SHORT;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].Ncode  = 0;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].Nused  = 0;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].flags &= ~secfiltBits;
-	// subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec].ubercalDist = 1000;
+	dvo_secfilt_init (&subcatalog[0].secfilt[Nsecfilt*Naverage+Nsec], SECFILT_RESET_ALL);
       }
     }
Index: /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/global_stats.c
===================================================================
--- /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/global_stats.c	(revision 38316)
+++ /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/global_stats.c	(revision 38317)
@@ -4,4 +4,16 @@
 
   StatType stN, stX, stS, imN, imX, imM, imD, msM, msX, msN, msD;
+
+  liststats_init (&stN);
+  liststats_init (&stX);
+  liststats_init (&stS);
+  liststats_init (&imN);
+  liststats_init (&imX);
+  liststats_init (&imM);
+  liststats_init (&imD);
+  liststats_init (&msN);
+  liststats_init (&msX);
+  liststats_init (&msM);
+  liststats_init (&msD);
 
   // INITTIME;
@@ -26,7 +38,7 @@
   
     fprintf (stderr, "   --- stats for %s ---\n", photcodes[Ns][0].name);
-    fprintf (stderr, "meas / star:    %7.0f  %7.1f  %7.1f  %7.0f  %7.0f  %6d\n",   stN.median, stN.mean, stN.sigma, stN.min, stN.max, stN.Nmeas);
+    fprintf (stderr, "meas / star:    %7.0f  %7.1f  %7.1f  %7.0f  %7.0f  %6d\n", stN.median, stN.mean, stN.sigma, stN.min, stN.max, stN.Nmeas);
     fprintf (stderr, "dMrel star:     %7.4f  %7.4f  %7.4f  %7.4f  %7.4f  %6d\n", stS.median, stS.mean, stS.sigma, stS.min, stS.max, stS.Nmeas);
-    fprintf (stderr, "chisq star:     %7.1f  %7.1f  %7.1f  %7.1f  %7.1f  %6d\n",   stX.median, stX.mean, stX.sigma, stX.min, stX.max, stX.Nmeas);
+    fprintf (stderr, "chisq star:     %7.1f  %7.1f  %7.1f  %7.1f  %7.1f  %6d\n", stX.median, stX.mean, stX.sigma, stX.min, stX.max, stX.Nmeas);
   }
   
Index: /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/liststats.c
===================================================================
--- /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/liststats.c	(revision 38316)
+++ /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/liststats.c	(revision 38317)
@@ -37,4 +37,6 @@
 
   myAssert (stats->statmode != STATS_NONE, "programming error, liststats mode not set");
+
+  liststats_init (stats);
 
   ke = ks = dMo = 0;
Index: /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/reload_catalogs.c
===================================================================
--- /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/reload_catalogs.c	(revision 38316)
+++ /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/reload_catalogs.c	(revision 38317)
@@ -170,4 +170,9 @@
     free (BOUNDARY_TREE);
     BOUNDARY_TREE = tmppath;
+  }
+  if (SYNTH_ZERO_POINTS) {
+    char *tmppath = abspath(SYNTH_ZERO_POINTS, DVO_MAX_PATH);
+    free (SYNTH_ZERO_POINTS);
+    SYNTH_ZERO_POINTS = tmppath;
   }
 
@@ -224,13 +229,13 @@
     
     char tmpline[1024];
-    if (VERBOSE)          { snprintf (tmpline, 1024, "%s -v",           	command);                    			  strcpy (command, tmpline); }
-    if (VERBOSE2)         { snprintf (tmpline, 1024, "%s -vv",          	command); 		     			  strcpy (command, tmpline); }
-    if (RESET)            { snprintf (tmpline, 1024, "%s -reset",       	command); 		     			  strcpy (command, tmpline); }
-    if (RESET_ZEROPTS)    { snprintf (tmpline, 1024, "%s -reset-zpts",       	command); 		     			  strcpy (command, tmpline); }
-    if (UPDATE)           { snprintf (tmpline, 1024, "%s -update",       	command); 		     			  strcpy (command, tmpline); }
-    if (IS_DIFF_DB)       { snprintf (tmpline, 1024, "%s -is-diff-db",       	command); 		     			  strcpy (command, tmpline); }
-    if (!KEEP_UBERCAL)    { snprintf (tmpline, 1024, "%s -reset-ubercal",	command); 		                          strcpy (command, tmpline); }
-    if (UPDATE_CATFORMAT) { snprintf (tmpline, 1024, "%s -update-catformat %s", command, UPDATE_CATFORMAT); 		          strcpy (command, tmpline); }
-    if (BOUNDARY_TREE)    { snprintf (tmpline, 1024, "%s -boundary-tree %s",    command, BOUNDARY_TREE); 		          strcpy (command, tmpline); }
+    if (VERBOSE)           { snprintf (tmpline, 1024, "%s -v",           	command);                    			  strcpy (command, tmpline); }
+    if (VERBOSE2)          { snprintf (tmpline, 1024, "%s -vv",          	command); 		     			  strcpy (command, tmpline); }
+    if (RESET)             { snprintf (tmpline, 1024, "%s -reset",       	command); 		     			  strcpy (command, tmpline); }
+    if (RESET_ZEROPTS)     { snprintf (tmpline, 1024, "%s -reset-zpts",       	command); 		     			  strcpy (command, tmpline); }
+    if (UPDATE)            { snprintf (tmpline, 1024, "%s -update",       	command); 		     			  strcpy (command, tmpline); }
+    if (IS_DIFF_DB)        { snprintf (tmpline, 1024, "%s -is-diff-db",       	command); 		     			  strcpy (command, tmpline); }
+    if (!KEEP_UBERCAL)     { snprintf (tmpline, 1024, "%s -reset-ubercal",	command); 		                          strcpy (command, tmpline); }
+    if (UPDATE_CATFORMAT)  { snprintf (tmpline, 1024, "%s -update-catformat %s", command, UPDATE_CATFORMAT); 		          strcpy (command, tmpline); }
+    if (BOUNDARY_TREE)     { snprintf (tmpline, 1024, "%s -boundary-tree %s",    command, BOUNDARY_TREE); 		          strcpy (command, tmpline); }
     if (SYNTH_ZERO_POINTS) { snprintf (tmpline, 1024, "%s -synthphot-zpts %s", command, SYNTH_ZERO_POINTS); strcpy (command, tmpline); }
     if (SET_MREL_VERSION != 1) { snprintf (tmpline, 1024, "%s -set-mrel-version %d", command, SET_MREL_VERSION);                  strcpy (command, tmpline); }
Index: /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/relphot_objects.c
===================================================================
--- /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/relphot_objects.c	(revision 38316)
+++ /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/relphot_objects.c	(revision 38317)
@@ -62,18 +62,5 @@
     if (RESET) {
       Nsecfilt = catalog.Nsecfilt;
-      DVOSecfiltFlags secfiltBits = 
-	ID_SECF_STAR_FEW    | 
-	ID_SECF_STAR_POOR   | 
-	ID_PHOTOM_PASS_0    | 
-	ID_PHOTOM_PASS_1    | 
-	ID_PHOTOM_PASS_2    | 
-	ID_PHOTOM_PASS_3    | 
-	ID_PHOTOM_PASS_4    |
-	ID_SECF_USE_SYNTH   |
-	ID_SECF_USE_UBERCAL |
-	ID_SECF_HAS_STACK   |
-	ID_SECF_HAS_PS1     |
-	ID_SECF_OBJ_EXT     ;
-      
+
       DVOAverageFlags astromBits = 
 	ID_STAR_FIT_AVE   | 
@@ -91,6 +78,5 @@
 	catalog.average[j].stargal   = NAN;	// reset (will be re-calculated here)
 	for (k = 0; k < Nsecfilt; k++) {
-	  dvo_secfilt_init (&catalog.secfilt[j*Nsecfilt + k]);
-	  catalog.secfilt[j*Nsecfilt + k].flags &= ~secfiltBits; // XXX: only reset photom bits: 
+	  dvo_secfilt_init (&catalog.secfilt[j*Nsecfilt + k], SECFILT_RESET_ALL);
 	}
       }
@@ -101,4 +87,5 @@
     initMrel (&catalog, 1);
     setMrelFinal (&catalog, NULL, TRUE);
+    // XXX if we want to have options for setting warp, chip, stack independently, we need to init only the desired ones
 
     if (!UPDATE) {
Index: /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/setMrelCatalog.c
===================================================================
--- /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/setMrelCatalog.c	(revision 38316)
+++ /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/setMrelCatalog.c	(revision 38317)
@@ -12,13 +12,11 @@
     continue; }
 
-# define CHECK_VALID_MAG(MAG) (!isnan(MAG) && (MAG > 0.0) && (MAG < 30.0))
-# define CHECK_VALID_FLUX(MAG) (!isnan(FLUX))
-
-# if (0)
+# define CHECK_VALID_MAG(MAG) (!isnan(MAG) && (MAG > -5.0) && (MAG < 30.0))
+# define CHECK_VALID_FLUX(FLUX) (!isnan(FLUX))
+
 static float MagToFlux (float Mag) {
   float Flux = pow(10.0, -0.4*(Mag));
   return (Flux);
 }
-# endif
 
 int print_measure_set_alt (Average *average, SecFilt *secfilt, Measure *measure) {
@@ -123,4 +121,6 @@
   int Galaxy2MASS = FALSE;
   int haveTYCHO = FALSE;
+
+  float stargalmax = 0.0;
 
   // assign measurements to the photcode lists 
@@ -154,20 +154,30 @@
     results->Nmeas[Nsec] ++;
 
-    // force the use of SYN even if we have PS1 mags?
-    if (isSetMrelFinal && isGPC1synth(measureT[k].photcode)) {
-      results->haveSYN[Nsec] = TRUE;
-      results->measSYN[Nsec] = k;
-      if (measureT[k].M < results->minSYN[Nsec]) results->needSYN[Nsec] = TRUE;
-      continue;
-    }
-
-    // assign the max psfQF values for each Nsec value
+    // various steps only relevant to the final pass 
     if (isSetMrelFinal) {
-      if (measure[k].psfQF     > results->psfQfMax[Nsec])     results->psfQfMax[Nsec]     = measure[k].psfQF;
-      if (measure[k].psfQFperf > results->psfQfPerfMax[Nsec]) results->psfQfPerfMax[Nsec] = measure[k].psfQFperf;
-    }
-
-    // are we a PS1 exposure photcode? (hard-wired photcodes)
-    if (isGPC1chip(measureT[k].photcode)) { results->NexpPS1[Nsec] ++; results->havePS1[Nsec] = TRUE; }
+      if (isfinite(measure[k].psfQF)     && (measure[k].psfQF     > results->psfQfMax[Nsec]))     results->psfQfMax[Nsec]     = measure[k].psfQF;
+      if (isfinite(measure[k].psfQFperf) && (measure[k].psfQFperf > results->psfQfPerfMax[Nsec])) results->psfQfPerfMax[Nsec] = measure[k].psfQFperf;
+
+      // are we a PS1 exposure photcode? (hard-wired photcodes)
+      if (isGPC1chip(measure[k].photcode)) { 
+	results->NexpPS1[Nsec] ++; 
+	results->havePS1[Nsec] = TRUE; 
+	
+	// only count psfQF > 0.85 here
+	if (isfinite(measure[k].extNsigma) && isfinite(measure[k].psfQF) && (measure[k].psfQF > 0.85)) {
+	  stargalmax = MAX (stargalmax, measure[k].extNsigma);
+	}
+      }
+
+      // force the use of SYN even if we have PS1 mags?
+      if (isGPC1synth(measure[k].photcode)) {
+	results->haveSYN[Nsec] = TRUE;
+	results->measSYN[Nsec] = k;
+	measureT[k].dbFlags |= ID_MEAS_SYNTH_MAG; // redundant with photcode
+	// note that synthetic mags have the real mags in measure.M (no zero point offset)
+	if (measure[k].M < results->minSYN[Nsec]) results->needSYN[Nsec] = TRUE;
+	continue;
+      }
+    }
 
     // ** Choose the calibration (depends on the mode : do I have an image reference or not?) 
@@ -190,5 +200,4 @@
     }
 
-    // XXX ubercal dist should be by Nsec
     int myUbercalDist = getUbercalDist(meas, cat);
     results->minUbercalDist[Nsec] = MIN(results->minUbercalDist[Nsec], myUbercalDist);
@@ -200,5 +209,6 @@
     int useUbercalWeight = isUbercal || (refPhotcode && (code->code == refPhotcode->code));
 
-    float Map, dMap;
+    float Map  = NAN;
+    float dMap = NAN;
     if (isSetMrelFinal) {
       Map = PhotCat (&measure[k], MAG_CLASS_APER);
@@ -243,5 +253,5 @@
 
     // count the extended detections (all PS1 bands)
-    if (isGPC1chip(measureT[k].photcode) && !isnan(Map) && !isnan(Mpsf)) {
+    if (isSetMrelFinal && isGPC1chip(measureT[k].photcode) && !isnan(Map) && !isnan(Mpsf)) {
       float dMagAp = Mpsf - Map;
       float SigmaAp = hypot(0.1, 2.5*dMpsf);
@@ -260,7 +270,11 @@
   SynthZeroPoints *synthzpts = SynthZeroPointsGet();
 
+  // find max values across filters
+  float psfQfMax     = 0.0;
+  float psfQfPerfMax = 0.0;
+
   // now calculate the mean stats for the Nsec bands.
   for (Nsec = 0; Nsec < Nsecfilt; Nsec++) {
-    dvo_secfilt_init (&secfilt[Nsec]); // XXX does this reset astrometry bits? no, right?
+    dvo_secfilt_init (&secfilt[Nsec], SECFILT_RESET_CHIP); // this does not reset astrometry or STACK bits
 
     // XXX hardwired
@@ -272,8 +286,8 @@
 
     if (haveTYCHO) {
-      // secfilt[Nsec].flags |= ID_SECF_HAVE_TYCHO;
-    }
-
-    // XXX need to also supply ZP from map, apply tycho logic
+      secfilt[Nsec].flags |= ID_SECF_HAS_TYCHO;
+    }
+
+    // force the synthetic magnitude (apply zpt calibration if no tycho photometry exists)
     if (results->needSYN[Nsec]) {
       if (!isSetMrelFinal) continue;
@@ -300,4 +314,7 @@
 	float *value = (float *) synthzpts->matrix[Nsec].buffer;
 	ZP = !isnan(value[Npix]) ? value[Npix] : 0.0;
+	if (isfinite(value[Npix])) {
+	  secfilt[Nsec].flags |= ID_SECF_FIX_SYNTH;
+	}
       }
       secfilt[Nsec].M      = Mpsf + ZP;
@@ -343,4 +360,7 @@
       secfilt[Nsec].psfQfPerfMax = results->psfQfPerfMax[Nsec];
 
+      if (isfinite(secfilt[Nsec].psfQfMax)     && (secfilt[Nsec].psfQfMax     > psfQfMax))     psfQfMax     = secfilt[Nsec].psfQfMax;
+      if (isfinite(secfilt[Nsec].psfQfPerfMax) && (secfilt[Nsec].psfQfPerfMax > psfQfPerfMax)) psfQfPerfMax = secfilt[Nsec].psfQfPerfMax;
+
       StatType *apstats = &results->apstats;
       Nranking = magStatsByRanking (&results->aperData[Nsec], apstats);
@@ -370,20 +390,20 @@
       switch (minRank) {
 	case 0:
-	  secfilt[Nsec].flags |= ID_PHOTOM_PASS_0;
+	  secfilt[Nsec].flags |= ID_SECF_RANK_0;
 	  if (results->havePS1[Nsec]) GoodPS1 = TRUE;
 	  break;
 	case 1:
-	  secfilt[Nsec].flags |= ID_PHOTOM_PASS_1;
+	  secfilt[Nsec].flags |= ID_SECF_RANK_1;
 	  if (results->havePS1[Nsec]) GoodPS1 = TRUE;
 	  break;
 	case 2:
-	  secfilt[Nsec].flags |= ID_PHOTOM_PASS_2;
+	  secfilt[Nsec].flags |= ID_SECF_RANK_2;
 	  if (results->havePS1[Nsec]) GoodPS1 = TRUE;
 	  break;
 	case 3:
-	  secfilt[Nsec].flags |= ID_PHOTOM_PASS_3;
+	  secfilt[Nsec].flags |= ID_SECF_RANK_3;
 	  break;
 	case 4:
-	  secfilt[Nsec].flags |= ID_PHOTOM_PASS_4;
+	  secfilt[Nsec].flags |= ID_SECF_RANK_4;
 	  break;
 	default:
@@ -412,4 +432,6 @@
       average[0].flags |= ID_OBJ_GOOD_ALT;
     }
+    average[0].psfQF     = psfQfMax;
+    average[0].psfQFperf = psfQfPerfMax;
   }
   return (TRUE);
@@ -636,6 +658,4 @@
   }
 
-  setGlobalObjStats (average, measure);
-
   return (TRUE);
 }
@@ -647,15 +667,13 @@
 int setMrelAverageForcedWarp (Catalog *catalog, int cat, off_t ave, int Nsecfilt, FlatCorrectionTable *flatcorr, SetMrelInfo *results) {
 
+  // we are guaranteed to have average, measure, secfilt
+  Average *average    = &catalog[0].average[ave];
   off_t measureOffset = average->measureOffset;
 
-  // we are guaranteed to have average, measure, secfilt
-  Average *average  = &catalog[0].average[ave];
-  Measure *measure  = &catalog[0].measure[measureOffset];
-  SecFilt *secfilt  = &catalog[0].secfilt[ave*Nsecfilt];
-  char *measureRank = &catalog[0].measureRank[measureOffset];
-
-  off_t measureOffset = average->measureOffset;
-
-  off_t k;
+  Measure *measure    = &catalog[0].measure[measureOffset];
+  SecFilt *secfilt    = &catalog[0].secfilt[ave*Nsecfilt];
+  char *measureRank   = &catalog[0].measureRank[measureOffset];
+
+  off_t k, Nsec;
   float Mcal = 0;
 
@@ -674,6 +692,6 @@
   for (Nsec = 0; Nsec < Nsecfilt; Nsec++) {
     if (!IS_DIFF_DB) {
-      myAssert (secfilt[Nsec].stackBestOff <= Nmeasure, "stackBestOff out of range");
-      if (!FindImageSkycellID (secfilt[Nsec].stackBestOff, cat, &stkTessID[Nsec], &stkProjID[Nsec], &stkSkycellID[Nsec])) continue;
+      myAssert (secfilt[Nsec].stackBestOff <= average->Nmeasure, "stackBestOff out of range");
+      if (!FindImageSkycellID (secfilt[Nsec].stackBestOff, cat, &tessID, &projID, &skycellID)) continue;
     }
     results->tessID[Nsec]    = tessID;
@@ -684,4 +702,5 @@
   // assign measurements to the photcode lists 
   for (k = 0; k < average[0].Nmeasure; k++) {
+    off_t meas = measureOffset + k;
 
     // skip measurements that do not have a valid photcode (raise exception?)
@@ -702,21 +721,15 @@
 
     // use primary skycell for DIFF, stack skycell for WARP
-    if (IS_DIFF_DB) {
-      if (MatchImageSkycellID (meas, cat, priTessID, priProjID, priSkycellID)) {
-	measure[k].dbFlags |= ID_MEAS_STACK_PRIMARY;
-      } else {
-	continue;
-      }
-    } else {
-      if (!MatchImageSkycellID (meas, cat, stkTessID, stkProjID, stkSkycellID)) continue;
+    if (MatchImageSkycellID (meas, cat, results->tessID[Nsec], results->projID[Nsec], results->skycellID[Nsec])) {
+      continue;
     }
 
     // assign the max psfQF values for each Nsec value
     if (IS_DIFF_DB) {
+      measure[k].dbFlags |= ID_MEAS_STACK_PRIMARY;
       if (measure[k].psfQF     > results->psfQfMax[Nsec])     results->psfQfMax[Nsec]     = measure[k].psfQF;
       if (measure[k].psfQFperf > results->psfQfPerfMax[Nsec]) results->psfQfPerfMax[Nsec] = measure[k].psfQFperf;
     }
 
-    off_t meas = measureOffset + k;
     if (getImageEntry (meas, cat) < 0) {
       // measurements without an image are either external reference photometry or
@@ -731,7 +744,4 @@
     }
     float Fcal = MagToFlux(-Mcal);
-
-    // XX measure[k].dbFlags &= ~ID_MEAS_WARP_USED;
-    // XXX measure[k].dbFlags |= ID_MEAS_WARP_USED;
 
     // NOTE : I am using PhotCat not PhotSys for now since GPC1 chip-to-chip color terms
@@ -765,6 +775,6 @@
     if (CHECK_VALID_FLUX(Fkron)) {
       int Nkron = results->kronData[Nsec].Nlist;
-      results->kronData[Nsec].flxlist[Nkron] = Fap * Fcal;
-      results->kronData[Nsec].errlist[Nkron] = dFap * Fcal;
+      results->kronData[Nsec].flxlist[Nkron] = Fkron * Fcal;
+      results->kronData[Nsec].errlist[Nkron] = dFkron * Fcal;
       results->kronData[Nsec].wgtlist[Nkron] = 1.0;
       results->kronData[Nsec].ranking[Nkron] = measureRank ? measureRank[k] : 0;
@@ -774,8 +784,11 @@
   }
 
+  // find max values across filters
+  float psfQfMax     = 0.0;
+  float psfQfPerfMax = 0.0;
+
   // now calculate the mean stats for the Nsec bands.
   for (Nsec = 0; Nsec < Nsecfilt; Nsec++) {
-    // XXX cannot do this -- resets psf mags
-    // dvo_secfilt_init (&secfilt[Nsec]); // XXX does this reset astrometry bits? no, right?
+    dvo_secfilt_init (&secfilt[Nsec], SECFILT_RESET_WARP);
 
     if (IS_DIFF_DB) {
@@ -783,4 +796,7 @@
       secfilt[Nsec].psfQfMax     = results->psfQfMax[Nsec];
       secfilt[Nsec].psfQfPerfMax = results->psfQfPerfMax[Nsec];
+
+      if (isfinite(secfilt[Nsec].psfQfMax)     && (secfilt[Nsec].psfQfMax     > psfQfMax))     psfQfMax     = secfilt[Nsec].psfQfMax;
+      if (isfinite(secfilt[Nsec].psfQfPerfMax) && (secfilt[Nsec].psfQfPerfMax > psfQfPerfMax)) psfQfPerfMax = secfilt[Nsec].psfQfPerfMax;
     }
 
@@ -799,11 +815,11 @@
 
     // if too few valid measurements meet the minimum criteria, go to the next entry
-    StatType *aperstats = &results->aperstats;
-    Nranking = magStatsByRanking (&results->aperData[Nsec], aperstats);
+    StatType *apstats = &results->apstats;
+    Nranking = magStatsByRanking (&results->aperData[Nsec], apstats);
     if (Nranking) {
-      secfilt[Nsec].FapWrp     = aperstats->mean;
-      secfilt[Nsec].dFapWrp    = aperstats->error;
-      secfilt[Nsec].sFapWrp    = (aperstats->Nmeas > 1) ? aperstats->chisq : NAN;
-      secfilt[Nsec].NusedApWrp = aperstats->Nmeas;
+      secfilt[Nsec].FapWrp     = apstats->mean;
+      secfilt[Nsec].dFapWrp    = apstats->error;
+      secfilt[Nsec].sFapWrp    = (apstats->Nmeas > 1) ? apstats->chisq : NAN;
+      secfilt[Nsec].NusedApWrp = apstats->Nmeas;
       secfilt[Nsec].MapWrp     = isnan(secfilt[Nsec].FapWrp) ? NAN : 8.9 - 2.5*log10(secfilt[Nsec].FapWrp); // 8.9 since flux is in Jy
     }
@@ -823,38 +839,4 @@
     secfilt[Nsec].NwarpGood = results->NmeasGood[Nsec];
   }
-
-  setGlobalObjStats (average, measure);
-
-  return (TRUE);
-}
-
-int setGlobalObjStats (Average *average, Measure *measure) {
-
-  off_t k;
-
-  myAbort ("this function makes no sense");
-
-  float psfQFmax     = 0.0;
-  float psfQFperfmax = 0.0;
-  float stargalmax   = 0.0;
-
-  for (k = 0; k < average[0].Nmeasure; k++) {
-
-    if (isfinite(measure[k].psfQF)) {
-      psfQFmax     = MAX (psfQFmax,     measure[k].psfQF);
-    }
-    if (isfinite(measure[k].psfQFperf)) {
-      psfQFperfmax = MAX (psfQFperfmax, measure[k].psfQFperf);
-    }
-
-    // only count psfQF > 0.85 here
-    if (isfinite(measure[k].extNsigma) && (measure[k].psfQF > 0.85)) {
-      stargalmax   = MAX (stargalmax,   measure[k].extNsigma);
-    }
-  }
-  average[0].psfQF     = psfQFmax;
-  average[0].psfQFperf = psfQFperfmax;
-  average[0].stargal   = stargalmax;
-
   return (TRUE);
 }
Index: /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/setMrelFinal.c
===================================================================
--- /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/setMrelFinal.c	(revision 38316)
+++ /branches/eam_branches/ipp-20150419/Ohana/src/relphot/src/setMrelFinal.c	(revision 38317)
@@ -46,5 +46,5 @@
       for (i = 0; i < catalog[0].Naverage; i++) {
 	off_t N = Nsecfilt*i+Nsec;
-	dvo_secfilt_init (&catalog[0].secfilt[N]);
+	dvo_secfilt_init (&catalog[0].secfilt[N], SECFILT_RESET_ALL);
 
 	off_t m = catalog[0].average[i].measureOffset;
