Index: /branches/pap_branch_080207/ppStack/src/ppStack.h
===================================================================
--- /branches/pap_branch_080207/ppStack/src/ppStack.h	(revision 16406)
+++ /branches/pap_branch_080207/ppStack/src/ppStack.h	(revision 16407)
@@ -28,5 +28,7 @@
 bool ppStackReadout(const pmConfig *config,   // Configuration
                     pmReadout *outRO,   // Output readout
-                    const psArray *readouts // Input readouts
+                    const psArray *readouts, // Input readouts
+                    const psArray *regions, // Array with array of regions used in each PSF matching
+                    const psArray *kernels // Array with array of kernels used in each PSF matching
     );
 
Index: /branches/pap_branch_080207/ppStack/src/ppStackLoop.c
===================================================================
--- /branches/pap_branch_080207/ppStack/src/ppStackLoop.c	(revision 16406)
+++ /branches/pap_branch_080207/ppStack/src/ppStackLoop.c	(revision 16407)
@@ -10,4 +10,6 @@
 
 #include "ppStack.h"
+
+#define ARRAY_BUFFER 16                 // Number to add to array at a time
 
 // Here follows lists of files for activation/deactivation at various stages.  Each must be NULL-terminated.
@@ -39,5 +41,5 @@
                              "PSPHOT.INPUT.CMF", 0 };
 
-#define CONVOLVED_ALREADY               // Already have the convolution products --- testing
+//#define CONVOLVED_ALREADY               // Already have the convolution products --- testing
 
 
@@ -308,5 +310,6 @@
     // Generate convolutions and write them to disk
     psArray *cells = psArrayAlloc(num); // Cells for convolved images --- a handle for reading again
-    psArray *kernels = psArrayAlloc(num); // Subtraction kernels --- required in the stacking
+    psArray *subKernels = psArrayAlloc(num); // Subtraction kernels --- required in the stacking
+    psArray *subRegions = psArrayAlloc(num); // Subtraction regions --- required in the stacking
     for (int i = 0; i < num; i++) {
         pmFPAfileActivate(config->files, false, NULL);
@@ -339,7 +342,34 @@
 #endif
 
+        // Extract the regions and solutions used in the image matching
+        // This stops them from being freed when we iterate back up the FPA
+        psArray *regions = psArrayAllocEmpty(ARRAY_BUFFER); // Array of regions
+        {
+            psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD,
+                                                               PM_SUBTRACTION_ANALYSIS_REGION); // Iterator
+            psMetadataItem *item = NULL;// Item from iteration
+            while ((item = psMetadataGetAndIncrement(iter))) {
+                assert(item->type == PS_DATA_REGION);
+                regions = psArrayAdd(regions, ARRAY_BUFFER, item->data.V);
+            }
+            psFree(iter);
+        }
+        psArray *kernels = psArrayAllocEmpty(ARRAY_BUFFER); // Array of kernels
+        {
+            psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD,
+                                                               PM_SUBTRACTION_ANALYSIS_KERNEL); // Iterator
+            psMetadataItem *item = NULL;// Item from iteration
+            while ((item = psMetadataGetAndIncrement(iter))) {
+                assert(item->type == PS_DATA_VECTOR);
+                kernels = psArrayAdd(kernels, ARRAY_BUFFER, item->data.V);
+            }
+            psFree(iter);
+        }
+        assert(regions->n == kernels->n);
+
+        subRegions->data[i] = regions;
+        subKernels->data[i] = kernels;
         cells->data[i] = psMemIncrRefCounter(readout->parent);
-        kernels->data[i] = psMemIncrRefCounter(psMetadataLookupPtr(NULL, readout->analysis,
-                                                                   PM_SUBTRACTION_ANALYSIS_KERNEL));
+
         filesIterateUp(config);
     }
@@ -357,5 +387,6 @@
         if (!view) {
             psFree(cells);
-            psFree(kernels);
+            psFree(subKernels);
+            psFree(subRegions);
             return false;
         }
@@ -391,5 +422,6 @@
                     psError(PS_ERR_IO, false, "Unable to read chunk %d for file %d", numChunk, i);
                     psFree(readouts);
-                    psFree(kernels);
+                    psFree(subKernels);
+                    psFree(subRegions);
                     psFree(outRO);
                     psFree(view);
@@ -406,8 +438,9 @@
 #endif
 
-            if (!ppStackReadout(config, outRO, readouts)) {
+            if (!ppStackReadout(config, outRO, readouts, subRegions, subKernels)) {
                 psError(PS_ERR_UNKNOWN, false, "Unable to stack images.\n");
                 psFree(readouts);
-                psFree(kernels);
+                psFree(subKernels);
+                psFree(subRegions);
                 psFree(outRO);
                 psFree(view);
@@ -425,5 +458,6 @@
 
         psFree(readouts);
-        psFree(kernels);
+        psFree(subKernels);
+        psFree(subRegions);
         for (int i = 0; i < num; i++) {
             psFitsClose(imageFits->data[i]);
Index: /branches/pap_branch_080207/ppStack/src/ppStackReadout.c
===================================================================
--- /branches/pap_branch_080207/ppStack/src/ppStackReadout.c	(revision 16406)
+++ /branches/pap_branch_080207/ppStack/src/ppStackReadout.c	(revision 16407)
@@ -11,5 +11,4 @@
 
 
-#define ARRAY_BUFFER 16                 // Number to add to array at a time
 #define WCS_TOLERANCE 0.001             // Tolerance for WCS
 
@@ -17,9 +16,14 @@
 //#define INSPECTION_FILES                // Write inspection mask?
 
-bool ppStackReadout(const pmConfig *config, pmReadout *outRO, const psArray *readouts)
+bool ppStackReadout(const pmConfig *config, pmReadout *outRO, const psArray *readouts,
+                    const psArray *regions, const psArray *kernels)
 {
     assert(config);
     assert(outRO);
     assert(readouts);
+    assert(regions);
+    assert(kernels);
+    assert(readouts->n == regions->n);
+    assert(regions->n == kernels->n);
 
     // Get the recipe values
@@ -63,4 +67,5 @@
         totExposure += exposure;        // Total exposure time
 
+#if 0
         if (i == 0) {
             // Copy astrometry over
@@ -84,4 +89,5 @@
             }
         }
+#endif
 
         // Ensure there is a mask, or pmStackCombine will complain
@@ -128,39 +134,11 @@
 #endif
 
+    // Reject pixels
     for (int i = 0; i < num; i++) {
         pmStackData *data = stack->data[i]; // Data for this image
-        pmReadout *readout = data->readout; // Readout for this image
-
-        // Extract the regions and solutions used in the image matching
-        psArray *regions = psArrayAllocEmpty(ARRAY_BUFFER); // Array of regions
-        {
-            psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD,
-                                                               PM_SUBTRACTION_ANALYSIS_REGION); // Iterator
-            psMetadataItem *item = NULL;// Item from iteration
-            while ((item = psMetadataGetAndIncrement(iter))) {
-                assert(item->type == PS_DATA_REGION);
-                regions = psArrayAdd(regions, ARRAY_BUFFER, item->data.V);
-            }
-            psFree(iter);
-        }
-        psArray *kernels = psArrayAllocEmpty(ARRAY_BUFFER); // Array of kernels
-        {
-            psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD,
-                                                               PM_SUBTRACTION_ANALYSIS_KERNEL); // Iterator
-            psMetadataItem *item = NULL;// Item from iteration
-            while ((item = psMetadataGetAndIncrement(iter))) {
-                assert(item->type == PS_DATA_VECTOR);
-                kernels = psArrayAdd(kernels, ARRAY_BUFFER, item->data.V);
-            }
-            psFree(iter);
-        }
-        assert(regions->n == kernels->n);
-
-        psPixels *reject = pmStackReject(data->pixels, threshold, regions, kernels); // Pixels to reject
+        psPixels *reject = pmStackReject(data->pixels, threshold, regions->data[i],
+                                         kernels->data[i]); // Pixels to reject
         psFree(data->pixels);
         data->pixels = reject;
-
-        psFree(kernels);
-        psFree(regions);
     }
 
