Index: branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/StarOps.c
===================================================================
--- branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/StarOps.c	(revision 34426)
+++ branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/StarOps.c	(revision 34427)
@@ -11,10 +11,19 @@
   int Nmos;
   int Ngrid;
-  double *list;
-  double *dlist;
-  double *wlist;
-  double *aplist;
-  double *kronlist;
-  double *dkronlist;
+
+  // NOTE: the following arrays are (possibly) pre-allocated and carried down to each
+  // thread.  The first 3 (list, dlist, wlist) are used in all relphot analyses; the
+  // others are only used on the final output steps.
+
+  double *list;		      // list of measure.mag values for a given star
+  double *dlist;	      // mag errors for a star
+  double *wlist;	      // weights to use for mean mags
+  double *aplist;	      // ap mags for a star
+  double *kronlist;	      // kron mags for a star
+  double *dkronlist;	      // kron mag errors 
+
+  double *psfqf_list;	      // psfqf for all filters
+  double *psfqfperf_list;     // psfqfperf for all filters
+  double *stargal_list;	      // stargal for all filters
 } SetMrelInfo;
 
@@ -168,4 +177,8 @@
   ALLOCATE (results.dkronlist, double, Nmax);
 
+  ALLOCATE (results.psfqf_list, double, Nmax);
+  ALLOCATE (results.psfqfperf_list, double, Nmax);
+  ALLOCATE (results.stargal_list, double, Nmax);
+
   for (i = 0; i < Ncatalog; i++) {
     setMrel_catalog  (catalog, i, pass, flatcorr, &results, Nsecfilt); // XXX add arguments as needed for options
@@ -178,4 +191,8 @@
   free (results.kronlist);
   free (results.dkronlist);
+
+  free (results.psfqf_list);
+  free (results.psfqfperf_list);
+  free (results.stargal_list);
   return (TRUE);
 }
@@ -315,4 +332,7 @@
   liststats_setmode (&kronstats, STATMODE);
 
+  // StatType psfstats;
+  // liststats_setmode (&psfstats, "MEAN");
+
   double *list      = results->list;
   double *dlist     = results->dlist;
@@ -322,4 +342,8 @@
   double *dkronlist = results->dkronlist;
 
+  double *psfqf_list     = results->psfqf_list;
+  double *psfqfperf_list = results->psfqfperf_list;
+  double *stargal_list   = results->stargal_list;
+
   SetMrelInfoInit (results, FALSE); // do not allocate list,dlist,wlist arrays
 
@@ -350,4 +374,6 @@
     int NextPS1 = 0;
     int NpsfPS1 = 0;
+
+    int Nmeas = 0; // number of meas used for psfqf, psfqfperf, and stargal
 
     int Ns;
@@ -425,4 +451,5 @@
 
 	if (isSetMrelFinal) {
+	  // Map (aplist) and Mkron (kronlist,dkronlist) are used to calculate mean mags per filter
 	  float Map = PhotAper (&catalog[Nc].measure[m]);
 	  aplist[N] = Map - Mcal - Mmos - Mgrid;
@@ -431,4 +458,9 @@
 	  kronlist[N] = Mkron - Mcal - Mmos - Mgrid;
 	  dkronlist[N] = catalog[Nc].measure[m].dMkron;
+
+	  // mean psfQF, psfQFperf, and stargal values are calculated per object (all filters)
+	  psfqf_list[Nmeas]     = catalog[Nc].measure[m].psfQF;
+	  psfqfperf_list[Nmeas] = catalog[Nc].measure[m].psfQF;
+	  stargal_list[Nmeas]   = catalog[Nc].measure[m].extNsigma;
 
 	  // special options for PS1 data
@@ -554,4 +586,5 @@
 	}
 	N++;
+	Nmeas++;
       }
 
@@ -720,4 +753,28 @@
 	catalog[Nc].average[j].flags |= ID_OBJ_GOOD_ALT;
       }
+
+      // use NAN values for catalog[Nc].average[j].psfQF as signal
+      if (!isfinite(catalog[Nc].average[j].psfQF)) {
+	// do something here
+	float psfQFmax     = 0.0;
+	float psfQFperfmax = 0.0;
+	float stargalmax   = 0.0;
+	int seq;
+	for (seq = 0; seq < Nmeas; seq++) {
+	  if (isfinite(psfqf_list[seq])) {
+	    psfQFmax     = MAX (psfqf_list[seq], psfQFmax);
+	  }
+	  if (isfinite(psfqfperf_list[seq])) {
+	    psfQFperfmax = MAX (psfqfperf_list[seq], psfQFperfmax);
+	  }
+	  if (isfinite(stargal_list[seq])) {
+	    stargalmax   = MAX (stargal_list[seq], stargalmax);
+	  }
+	}
+
+	catalog[Nc].average[j].psfQF     = psfQFmax;
+	catalog[Nc].average[j].psfQFperf = psfQFperfmax;
+	catalog[Nc].average[j].stargal   = stargalmax;
+      }
     }
   }
Index: branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/liststats.c
===================================================================
--- branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/liststats.c	(revision 34426)
+++ branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/liststats.c	(revision 34427)
@@ -38,5 +38,9 @@
     dsortthree (value, dvalue, weight, N);
   } else {
-    dsortpair (value, dvalue, N);
+    if (dvalue) {
+      dsortpair (value, dvalue, N);
+    } else {
+      dsort (value, N);
+    }
   }
 
Index: branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/relphot_objects.c
===================================================================
--- branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/relphot_objects.c	(revision 34426)
+++ branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/relphot_objects.c	(revision 34427)
@@ -85,17 +85,10 @@
       for (j = 0; j < catalog.Naverage; j++) {
 	catalog.average[j].flags &= astromBits; // reset all except astrometry bits
+	catalog.average[j].psfQF     = NAN;     // reset (will be re-calculated here)
+	catalog.average[j].psfQFperf = NAN;	// reset (will be re-calculated here)
+	catalog.average[j].stargal   = NAN;	// reset (will be re-calculated here)
 	for (k = 0; k < Nsecfilt; k++) {
-	  catalog.secfilt[j*Nsecfilt + k].M    	 = NAN;
-	  catalog.secfilt[j*Nsecfilt + k].Map    = NAN;
-	  catalog.secfilt[j*Nsecfilt + k].dM   	 = NAN;
-	  catalog.secfilt[j*Nsecfilt + k].Mstdev = NAN_S_SHORT;
-	  catalog.secfilt[j*Nsecfilt + k].Xm     = NAN;
-	  catalog.secfilt[j*Nsecfilt + k].M_20 	 = NAN_S_SHORT;
-	  catalog.secfilt[j*Nsecfilt + k].M_80 	 = NAN_S_SHORT;
-	  catalog.secfilt[j*Nsecfilt + k].Ncode  = 0;
-	  catalog.secfilt[j*Nsecfilt + k].Nused  = 0;
+	  dvo_secfilt_init (&catalog.secfilt[j*Nsecfilt + k]);
 	  catalog.secfilt[j*Nsecfilt + k].flags &= ~secfiltBits; // XXX: only reset photom bits: 
-	  catalog.secfilt[j*Nsecfilt + k].flags  = 0;            // XXX: reset all secfilt flag bits:
-	  catalog.secfilt[j*Nsecfilt + k].ubercalDist = 1000;
 	}
       }
Index: branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/setMrelFinal.c
===================================================================
--- branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/setMrelFinal.c	(revision 34426)
+++ branches/eam_branches/ipp-20120905/Ohana/src/relphot/src/setMrelFinal.c	(revision 34427)
@@ -94,4 +94,10 @@
   }
 
+  for (i = 0; i < catalog[0].Naverage; i++) {
+    catalog[0].average[i].psfQF     = NAN;	// force recalculation below
+    catalog[0].average[i].psfQFperf = NAN;	// force recalculation below
+    catalog[0].average[i].stargal   = NAN;	// force recalculation below
+  }
+
   // XXX make this optional? (do not clean for -averages?)
   if (!simpleAverage) clean_measures (catalog, 1, TRUE, flatcorr);    /* mark outliers ID_MEAS_POOR_PHOTOM */
