Index: trunk/ppSub/src/ppSubReadout.c
===================================================================
--- trunk/ppSub/src/ppSubReadout.c	(revision 14328)
+++ trunk/ppSub/src/ppSubReadout.c	(revision 14362)
@@ -12,4 +12,29 @@
 #define TESTING
 #define WCS_TOLERANCE 0.001             // Tolerance for WCS
+
+#include <unistd.h>
+static void memCheck(const char *where)
+{
+    return;
+    psMemBlock **leaks = NULL;
+    int numLeaks = psMemCheckLeaks(0, &leaks, NULL, true);
+    size_t largestSize = 0;
+    psMemId largest = 0;
+    size_t totalSize = 0;
+    for (int i = 0; i < numLeaks; i++) {
+        psMemBlock *mb = leaks[i];
+        totalSize += mb->userMemorySize;
+        if (mb->userMemorySize > largestSize) {
+            largestSize = mb->userMemorySize;
+            largest = mb->id;
+        }
+    }
+    psFree(leaks);
+    fprintf(stderr, "%s:\n", where);
+    fprintf(stderr, "    Memory in use: %zd\n", totalSize);
+    fprintf(stderr, "    Largest block: %ld\n", largest);
+    fprintf(stderr, "    sbrk(): %zd\n", (unsigned long)sbrk(0));
+    return;
+}
 
 bool ppSubReadout(pmConfig *config, const pmFPAview *view)
@@ -38,4 +63,5 @@
     psVector *orders = psMetadataLookupPtr(NULL, config->arguments, "ISIS.ORDERS"); // ISIS Polynomial orders
     int inner = psMetadataLookupS32(NULL, config->arguments, "INNER"); // Inner radius
+    int ringsOrder = psMetadataLookupS32(NULL, config->arguments, "RINGS.ORDER"); // RINGS polynomial order
     int binning = psMetadataLookupS32(NULL, config->arguments, "SPAM.BINNING"); // Binning for SPAM kernel
     psMaskType maskBad = pmConfigMask(psMetadataLookupStr(NULL, config->arguments, "MASK.BAD"),
@@ -62,6 +88,10 @@
     }
 
+    memCheck("start");
+
     // Mask for subtraction
     psImage *subMask = pmSubtractionMask(inRO->mask, refRO->mask, maskBad, size, footprint);
+
+    memCheck("mask");
 
 #if 0
@@ -81,8 +111,11 @@
 #endif
 
+    // Kernel basis functions
     pmSubtractionKernels *kernels = pmSubtractionKernelsGenerate(type, size, order, widths, orders,
-                                                                 inner, binning); // Kernel basis functions
+                                                                 inner, binning, ringsOrder);
     psArray *stamps = NULL;             // Stamps for matching PSF
     psVector *solution = NULL;          // Solution to match PSF
+
+    memCheck("kernels");
 
     int numRejected = -1;               // Number of rejected stamps in each iteration
@@ -94,4 +127,6 @@
         }
 
+        memCheck("  find stamps");
+
         if (!pmSubtractionCalculateEquation(stamps, refRO->image, inRO->image, inRO->weight,
                                             kernels, footprint)) {
@@ -100,4 +135,6 @@
          }
 
+        memCheck("  calculate equation");
+
         solution = pmSubtractionSolveEquation(solution, stamps);
         if (!solution) {
@@ -105,4 +142,6 @@
             goto ERROR;
         }
+
+        memCheck("  solve equation");
 
         numRejected = pmSubtractionRejectStamps(stamps, refRO->image, inRO->image, subMask,
@@ -113,4 +152,6 @@
         }
         psLogMsg("ppSub", PS_LOG_INFO, "%d stamps rejected on iteration %d.", numRejected, i);
+
+        memCheck("  reject stamps");
     }
 
@@ -124,4 +165,6 @@
     psFree(stamps);
     stamps = NULL;
+
+    memCheck("solution");
 
 #ifdef TESTING
@@ -179,4 +222,6 @@
 #endif
 
+    memCheck("diag outputs");
+
     psImage *convImage = NULL, *convWeight = NULL, *convMask = NULL; // Convolved images
     if (!pmSubtractionConvolve(&convImage, &convWeight, &convMask, refRO->image, refRO->weight, subMask,
@@ -191,4 +236,6 @@
     psFree(solution);
 
+    memCheck("convolution");
+
     // Do the subtraction
     if (reverse) {
@@ -202,7 +249,11 @@
     }
 
+    memCheck("subtraction");
+
     psFree(convImage);
     psFree(convMask);
     psFree(convWeight);
+
+    memCheck("subtraction freed");
 
     outRO->data_exists = true;
@@ -257,4 +308,6 @@
     }
 
+    memCheck("header");
+
     psFree(outRO);
 
