Index: trunk/ppStack/src/ppStackConvolve.c
===================================================================
--- trunk/ppStack/src/ppStackConvolve.c	(revision 23341)
+++ trunk/ppStack/src/ppStackConvolve.c	(revision 23573)
@@ -30,6 +30,6 @@
     int num = options->num;             // Number of inputs
     options->cells = psArrayAlloc(num); // Cells for convolved images --- a handle for reading again
-    options->subKernels = psArrayAlloc(num); // Subtraction kernels --- required in the stacking
-    options->subRegions = psArrayAlloc(num); // Subtraction regions --- required in the stacking
+    options->kernels = psArrayAlloc(num); // PSF-matching kernels --- required in the stacking
+    options->regions = psArrayAlloc(num); // PSF-matching regions --- required in the stacking
     int numGood = 0;                    // Number of good frames
     options->numCols = 0;
@@ -38,5 +38,5 @@
     psVectorInit(options->matchChi2, NAN);
     options->weightings = psVectorAlloc(num, PS_TYPE_F32); // Combination weightings for images (1/noise^2)
-    psVectorInit(options->weightings, NAN);
+    psVectorInit(options->weightings, 0.0);
     options->covariances = psArrayAlloc(num); // Covariance matrices
 
@@ -78,12 +78,8 @@
 
         // Background subtraction, scaling and normalisation is performed automatically by the image matching
-        psArray *regions = NULL, *kernels = NULL; // Regions and kernels used in subtraction
         psTimerStart("PPSTACK_MATCH");
-
-        if (!ppStackMatch(readout, &regions, &kernels, &options->matchChi2->data.F32[i],
-                          &options->weightings->data.F32[i], options->sourceLists->data[i],
-                          options->psf, rng, config)) {
+        if (!ppStackMatch(readout, options, i, config)) {
             psErrorStackPrint(stderr, "Unable to match image %d --- ignoring.", i);
-            options->inputMask->data.PS_TYPE_VECTOR_MASK_DATA[i] = PPSTACK_MASK_MATCH;
+            options->inputMask->data.PS_TYPE_VECTOR_MASK_DATA[i] |= PPSTACK_MASK_MATCH;
             psErrorClear();
             continue;
@@ -92,45 +88,48 @@
 
         if (options->stats) {
-            pmSubtractionKernels *kernels = psMetadataLookupPtr(NULL, readout->analysis,
-                                                                PM_SUBTRACTION_ANALYSIS_KERNEL);// Conv kernel
             psMetadataAddF32(options->stats, PS_LIST_TAIL, "TIME_MATCH", PS_META_DUPLICATE_OK,
                              "Time to match PSF", psTimerMark("PPSTACK_MATCH"));
-            psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.MEAN", PS_META_DUPLICATE_OK,
-                             "Mean deviation for stamps", kernels->mean);
-            psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.RMS", PS_META_DUPLICATE_OK,
-                             "RMS deviation for stamps", kernels->rms);
-            psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.NUM", PS_META_DUPLICATE_OK,
-                             "Number of stamps", kernels->numStamps);
-            float deconv = psMetadataLookupF32(NULL, readout->analysis,
-                                               PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Deconvolution fraction
-            psMetadataAddF32(options->stats, PS_LIST_TAIL, "KERNEL.DECONV", PS_META_DUPLICATE_OK,
-                             "Deconvolution fraction for kernel", deconv);
             psMetadataAddF32(options->stats, PS_LIST_TAIL, "PPSTACK.WEIGHTING", PS_META_DUPLICATE_OK,
                              "Weighting for image", options->weightings->data.F32[i]);
+
+            if (options->convolve) {
+                // Pull parameters out of convolution kernel
+                pmSubtractionKernels *kernels = psMetadataLookupPtr(NULL, readout->analysis,
+                                                                    PM_SUBTRACTION_ANALYSIS_KERNEL);
+                psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.MEAN", PS_META_DUPLICATE_OK,
+                                 "Mean deviation for stamps", kernels->mean);
+                psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.RMS", PS_META_DUPLICATE_OK,
+                                 "RMS deviation for stamps", kernels->rms);
+                psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.NUM", PS_META_DUPLICATE_OK,
+                                 "Number of stamps", kernels->numStamps);
+                float deconv = psMetadataLookupF32(NULL, readout->analysis,
+                                                   PM_SUBTRACTION_ANALYSIS_DECONV_MAX);
+                psMetadataAddF32(options->stats, PS_LIST_TAIL, "KERNEL.DECONV", PS_META_DUPLICATE_OK,
+                                 "Deconvolution fraction for kernel", deconv);
+            }
         }
         psLogMsg("ppStack", PS_LOG_INFO, "Time to match image %d: %f sec", i, psTimerClear("PPSTACK_MATCH"));
 
-        options->subRegions->data[i] = regions;
-        options->subKernels->data[i] = kernels;
-
         // Write the temporary convolved files
-        pmHDU *hdu = readout->parent->parent->parent->hdu; // HDU for convolved image
-        assert(hdu);
-        ppStackWriteImage(options->imageNames->data[i], hdu->header, readout->image, config);
-        psMetadata *maskHeader = psMetadataCopy(NULL, hdu->header); // Copy of header, for mask
-        pmConfigMaskWriteHeader(config, maskHeader);
-        ppStackWriteImage(options->maskNames->data[i], maskHeader, readout->mask, config);
-        psFree(maskHeader);
-        psImageCovarianceTransfer(readout->variance, readout->covariance);
-        ppStackWriteImage(options->varianceNames->data[i], hdu->header, readout->variance, config);
+        if (options->convolve) {
+            pmHDU *hdu = readout->parent->parent->parent->hdu; // HDU for convolved image
+            assert(hdu);
+            ppStackWriteImage(options->imageNames->data[i], hdu->header, readout->image, config);
+            psMetadata *maskHeader = psMetadataCopy(NULL, hdu->header); // Copy of header, for mask
+            pmConfigMaskWriteHeader(config, maskHeader);
+            ppStackWriteImage(options->maskNames->data[i], maskHeader, readout->mask, config);
+            psFree(maskHeader);
+            psImageCovarianceTransfer(readout->variance, readout->covariance);
+            ppStackWriteImage(options->varianceNames->data[i], hdu->header, readout->variance, config);
 #ifdef TESTING
-        {
-            psString name = NULL;
-            psStringAppend(&name, "covariance_%d.fits", i);
-            ppStackWriteImage(name, hdu->header, readout->covariance->image, config);
-            pmStackVisualPlotTestImage(readout->covariance->image, name);
-            psFree(name);
-        }
+            {
+                psString name = NULL;
+                psStringAppend(&name, "covariance_%d.fits", i);
+                ppStackWriteImage(name, hdu->header, readout->covariance->image, config);
+                pmStackVisualPlotTestImage(readout->covariance->image, name);
+                psFree(name);
+            }
 #endif
+        }
 
         pmCell *inCell = readout->parent; // Input cell
@@ -152,4 +151,5 @@
     psFree(rng);
 
+    psFree(options->norm); options->norm = NULL;
     psFree(options->sourceLists); options->sourceLists = NULL;
     psFree(options->psf); options->psf = NULL;
