Index: trunk/psphot/src/pspsf.c
===================================================================
--- trunk/psphot/src/pspsf.c	(revision 4375)
+++ trunk/psphot/src/pspsf.c	(revision 4642)
@@ -21,4 +21,5 @@
 	psf->params->data[i] = Polynomial2DAlloc(1, 1, PS_POLYNOMIAL_ORD);
     }
+    // set the destructors
     return(psf);
 }
@@ -48,4 +49,6 @@
 	test->fitMag->data.F64[i] = 0;
     }	
+    // set the destructors
+
     return (test);
 }
@@ -92,5 +95,7 @@
     psLogMsg ("psphot.psftest", 4, "fit flt:   %f sec for %d sources\n", psTimerMark ("fit"), sources->n);
     psTrace ("psphot.psftest", 3, "keeping %d of %d PSF candidates (FLT)\n", Nflt, sources->n);
-    DumpModelFits (test->modelFLT, "modelsFLT.dat");
+
+    // make this optional? 
+    // DumpModelFits (test->modelFLT, "modelsFLT.dat");
 
     // stage 2: construct a psf (pmPSF) from this collection of model fits
@@ -141,5 +146,7 @@
     psLogMsg ("psphot.psftest", 4, "fit psf:   %f sec for %d sources\n", psTimerMark ("fit"), sources->n);
     psTrace ("psphot.psftest", 3, "keeping %d of %d PSF candidates (PSF)\n", Npsf, sources->n);
-    DumpModelFits (test->modelPSF, "modelsPSF.dat");
+
+    // make this optional
+    // DumpModelFits (test->modelPSF, "modelsPSF.dat");
 
     // XXX this function wants aperture radius from pmSourcePhotometry
@@ -188,4 +195,9 @@
 	// psPolynomial2DDump (psf->params->data[i]);
     }
+    
+    psFree (x);
+    psFree (y);
+    psFree (z);
+    psFree (dz);
     return (true);
 }
@@ -228,9 +240,4 @@
     rflux->data.F64[i] = pow(10.0, 0.4*test->fitMag->data.F64[i]);
   }
-  // psScalar *t1 = psScalar(0.4);
-  // psVector *v1 = psBinaryOp (NULL, test->fitMag, "*", t1);
-  // psVector *rflux = psUnaryOp (NULL, v1, "ten");
-  // psFree (t1);
-  // psFree (v1);
 
   // find min and max of (1/flux):
@@ -247,4 +254,5 @@
   psTrace ("psphot.metricmodel", 3, "rflux max: %g, min: %g, delta: %g\n", stats->max, stats->min, dBin);
 
+  // group data in daBin bins, measure lower 50% mean
   for (int i = 0; i < daBin->n; i++) {
 
@@ -277,4 +285,12 @@
     // dA values are contaminated with low outliers 
     // measure statistics only on upper 50% of points
+    // this would be easier if we could sort in reverse:
+    //
+    // psVectorSort (tmp, tmp);
+    // tmp->n = 0.5*tmp->n;
+    // stats = psStatsAlloc (PS_STAT_SAMPLE_MEDIAN);
+    // psVectorStats (stats, tmp, NULL, NULL, 0);
+    // psTrace ("psphot.metricmodel", 4, "rfBin %d (%g): %d pts, %g\n", i, rfBin->data.F64[i], tmp->n, stats->sampleMedian);
+
     psVectorSort (tmp, tmp);
     nKeep = 0.5*tmp->n;
@@ -291,4 +307,8 @@
 
     daBin->data.F64[i] = stats->sampleMedian;
+
+    psFree (stats);
+    psFree (tmp);
+    psFree (tmp2);
   }
 
@@ -307,4 +327,12 @@
   test->skyBias = poly->coeff[1] / (M_PI * PS_SQR(RADIUS));
 
+  psFree (maskB);
+  psFree (rfBin);
+  psFree (daBin);
+  psFree (daBinFit);
+  psFree (daResid);
+  psFree (poly);
+  psFree (stats);
+
   return true;
 }
