Index: trunk/ppSub/src/Makefile.am
===================================================================
--- trunk/ppSub/src/Makefile.am	(revision 23740)
+++ trunk/ppSub/src/Makefile.am	(revision 23753)
@@ -32,7 +32,5 @@
 	ppSubReadoutStats.c		\
 	ppSubReadoutSubtract.c		\
-	ppSubSetMasks.c			\
-	ppSubReadoutRenorm.c		\
-	ppSubVarianceFactors.c
+	ppSubSetMasks.c
 
 ppSubKernel_CPPFLAGS = $(PSLIB_CFLAGS) $(PSMODULE_CFLAGS) $(PPSUB_CFLAGS)
Index: trunk/ppSub/src/ppSub.c
===================================================================
--- trunk/ppSub/src/ppSub.c	(revision 23740)
+++ trunk/ppSub/src/ppSub.c	(revision 23753)
@@ -41,4 +41,5 @@
         psErrorStackPrint(stderr, "Error initialising model classes.\n");
         exitValue = PS_EXIT_PROG_ERROR;
+        psFree(config);
         goto die;
     }
@@ -47,10 +48,11 @@
         psErrorStackPrint(stderr, "Error initialising psphot.\n");
         exitValue = PS_EXIT_PROG_ERROR;
+        psFree(config);
         goto die;
     }
 
-    data = ppSubDataAlloc(); // Processing data
+    data = ppSubDataAlloc(config);
 
-    if (!ppSubArguments(argc, argv, config, data)) {
+    if (!ppSubArguments(argc, argv, data)) {
         psErrorStackPrint(stderr, "Error reading arguments.\n");
         exitValue = PS_EXIT_CONFIG_ERROR;
@@ -58,5 +60,5 @@
     }
 
-    if (!ppSubCamera(config, data)) {
+    if (!ppSubCamera(data)) {
         psErrorStackPrint(stderr, "Error setting up camera.\n");
         exitValue = PS_EXIT_CONFIG_ERROR;
@@ -64,5 +66,5 @@
     }
 
-    if (!ppSubLoop(config, data)) {
+    if (!ppSubLoop(data)) {
         psErrorStackPrint(stderr, "Error performing subtraction.\n");
         exitValue = PS_EXIT_SYS_ERROR;
@@ -75,5 +77,4 @@
 
     psFree(data);
-    psFree(config);
 
     pmVisualClose(); //close plot windows, if -visual is set
Index: trunk/ppSub/src/ppSub.h
===================================================================
--- trunk/ppSub/src/ppSub.h	(revision 23740)
+++ trunk/ppSub/src/ppSub.h	(revision 23753)
@@ -40,4 +40,5 @@
 /// Data for processing
 typedef struct {
+    pmConfig *config;                   // Configuration
     psErrorCode quality;                // Quality code; 0 for no problem
     bool photometry;                    // Perform photometry?
@@ -45,4 +46,5 @@
     psString stamps;                    // Stamps file
     pmPSF *psf;                         // Point Spread Function
+    psString statsName;                 // Name of statistics file
     FILE *statsFile;                    // Statistics file
     psMetadata *stats;                  // Statistics
@@ -50,25 +52,18 @@
 
 /// Constructor
-ppSubData *ppSubDataAlloc(void);
+ppSubData *ppSubDataAlloc(pmConfig *config ///< Configuration
+    );
 
 /// Setup the arguments parsing
 bool ppSubArguments(int argc, char *argv[], ///< Command-line arguments
-                    pmConfig *config, ///< Configuration
                     ppSubData *data ///< Processing data
     );
 
 /// Parse the camera input
-bool ppSubCamera(pmConfig *config,      ///< Configuration
-                 ppSubData *data        ///< Processing data
+bool ppSubCamera(ppSubData *data        ///< Processing data
     );
 
 /// Loop over the FPA hierarchy
-bool ppSubLoop(pmConfig *config,        ///< Configuration
-               ppSubData *data          ///< Processing data
-    );
-
-/// Perform PSF-matched image subtraction on the readout
-bool ppSubReadout(pmConfig *config,     ///< Configuration
-                  ppSubData *data       ///< Processing data
+bool ppSubLoop(ppSubData *data          ///< Processing data
     );
 
@@ -79,6 +74,5 @@
 /// Generate the PSF-matching kernel and convolve the images as needed.  Most of this function involves
 /// looking up the parameters in the recipe and supplying them to the function pmSubtractionMatch()
-bool ppSubMatchPSFs(pmConfig *config,   ///< Configuration
-                    ppSubData *data     ///< Processing data
+bool ppSubMatchPSFs(ppSubData *data     ///< Processing data
     );
 
@@ -89,6 +83,5 @@
 
 /// Photometry stage 1: measure the PSF from the minuend image
-bool ppSubMakePSF(pmConfig *config,     ///< Configuration
-                  ppSubData *data       ///< Processing data
+bool ppSubMakePSF(ppSubData *data       ///< Processing data
     );
 
@@ -100,11 +93,5 @@
 /// Photometry stage 2: find and measure sources on the subtracted image
 bool ppSubReadoutPhotometry(const char *name, ///< Name of file to photometer
-                            pmConfig *config, ///< Configuration
                             ppSubData *data ///< Processing data
-    );
-
-/// Renormalize, update headers and generate JPEGs
-bool ppSubReadoutUpdate(pmConfig *config, ///< Configuration
-                        ppSubData *data ///< Processing data
     );
 
@@ -121,6 +108,5 @@
 
 /// Mark the data quality as bad and prepare to suspend processing
-void ppSubDataQuality(pmConfig *config, ///< Configuration
-                      ppSubData *data,  ///< Processing data
+void ppSubDataQuality(ppSubData *data,  ///< Processing data
                       psErrorCode error,///< Error code
                       ppSubFiles files  ///< Files to deactivate
@@ -150,6 +136,5 @@
 
 /// Collect statistics
-bool ppSubReadoutStats(pmConfig *config,// Configuration
-                       ppSubData *data  // Processing data
+bool ppSubReadoutStats(ppSubData *data  // Processing data
     );
 
Index: trunk/ppSub/src/ppSubArguments.c
===================================================================
--- trunk/ppSub/src/ppSubArguments.c	(revision 23740)
+++ trunk/ppSub/src/ppSubArguments.c	(revision 23753)
@@ -57,6 +57,8 @@
 }
 
-bool ppSubArguments(int argc, char *argv[], pmConfig *config, ppSubData *data)
+bool ppSubArguments(int argc, char *argv[], ppSubData *data)
 {
+    assert(data);
+    pmConfig *config = data->config;
     assert(config);
 
@@ -127,7 +129,7 @@
     data->stamps = psMemIncrRefCounter(psMetadataLookupStr(NULL, arguments, "-stamps"));
 
-    const char *statsName = psMetadataLookupStr(NULL, arguments, "-stats"); // Filename for statistics
-    if (statsName && strlen(statsName) > 0) {
-        psString resolved = pmConfigConvertFilename(statsName, config, true, true); // Resolved filename
+    data->statsName = psMetadataLookupStr(NULL, arguments, "-stats"); // Filename for statistics
+    if (data->statsName && strlen(data->statsName) > 0) {
+        psString resolved = pmConfigConvertFilename(data->statsName, config, true, true); // Resolved filename
         data->statsFile = fopen(resolved, "w");
         if (!data->statsFile) {
Index: trunk/ppSub/src/ppSubCamera.c
===================================================================
--- trunk/ppSub/src/ppSubCamera.c	(revision 23740)
+++ trunk/ppSub/src/ppSubCamera.c	(revision 23753)
@@ -134,6 +134,8 @@
 
 
-bool ppSubCamera(pmConfig *config, ppSubData *data)
+bool ppSubCamera(ppSubData *data)
 {
+    psAssert(data, "Require processing data");
+    pmConfig *config = data->config;
     psAssert(config, "Require configuration");
 
Index: trunk/ppSub/src/ppSubData.c
===================================================================
--- trunk/ppSub/src/ppSubData.c	(revision 23740)
+++ trunk/ppSub/src/ppSubData.c	(revision 23753)
@@ -22,16 +22,26 @@
         psFree(stats);
         fclose(data->statsFile);
+        pmConfigRunFilenameAddWrite(data->config, "STATS", data->statsName);
     }
+    psFree(data->statsName);
     psFree(data->stamps);
     psFree(data->psf);
     psFree(data->stats);
+
+    psString dump_file = psMetadataLookupStr(NULL, data->config->arguments, "-dumpconfig");
+    if (dump_file) {
+        pmConfigDump(data->config, dump_file);
+    }
+    psFree(data->config);
+
     return;
 }
 
-ppSubData *ppSubDataAlloc(void)
+ppSubData *ppSubDataAlloc(pmConfig *config)
 {
     ppSubData *data = psAlloc(sizeof(ppSubData)); // Processing data, to return
     psMemSetDeallocator(data, (psFreeFunc)subDataFree);
 
+    data->config = config;
     data->quality = 0;
     data->photometry = false;
@@ -39,4 +49,5 @@
     data->stamps = NULL;
     data->psf = NULL;
+    data->statsName = NULL;
     data->statsFile = NULL;
     data->stats = psMetadataAlloc();
@@ -47,7 +58,6 @@
 
 
-void ppSubDataQuality(pmConfig *config, ppSubData *data, psErrorCode error, ppSubFiles files)
+void ppSubDataQuality(ppSubData *data, psErrorCode error, ppSubFiles files)
 {
-    psAssert(config, "Require configuration");
     psAssert(data, "Require processing data");
 
@@ -57,5 +67,5 @@
     }
 
-    ppSubFilesActivate(config, files, false);
+    ppSubFilesActivate(data->config, files, false);
 
     psErrorClear();
Index: trunk/ppSub/src/ppSubLoop.c
===================================================================
--- trunk/ppSub/src/ppSubLoop.c	(revision 23740)
+++ trunk/ppSub/src/ppSubLoop.c	(revision 23753)
@@ -20,6 +20,8 @@
 #include "ppSub.h"
 
-bool ppSubLoop(pmConfig *config, ppSubData *data)
+bool ppSubLoop(ppSubData *data)
 {
+    psAssert(data, "Require processing data");
+    pmConfig *config = data->config;    // Configuration
     psAssert(config, "Require configuration.");
 
@@ -45,5 +47,5 @@
     }
 
-    if (!ppSubMatchPSFs(config, data)) {
+    if (!ppSubMatchPSFs(data)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to match PSFs.");
         return false;
@@ -74,5 +76,5 @@
     }
 
-    if (!data->quality && !ppSubMakePSF(config, data)) {
+    if (!data->quality && !ppSubMakePSF(data)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to generate PSF.");
         return false;
@@ -101,5 +103,5 @@
     }
 
-    if (!data->quality && !ppSubReadoutPhotometry("PPSUB.OUTPUT", config, data)) {
+    if (!data->quality && !ppSubReadoutPhotometry("PPSUB.OUTPUT", data)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to perform photometry.");
         return false;
@@ -112,5 +114,5 @@
 
     // Perform statistics on the cell
-    if (!ppSubReadoutStats(config, data)) {
+    if (!ppSubReadoutStats(data)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to collect statistics");
         return false;
@@ -150,5 +152,5 @@
         }
 
-        if (!data->quality && !ppSubReadoutPhotometry("PPSUB.INVERSE", config, data)) {
+        if (!data->quality && !ppSubReadoutPhotometry("PPSUB.INVERSE", data)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to perform photometry.");
             return false;
@@ -168,10 +170,4 @@
     }
 
-    psString dump_file = psMetadataLookupStr(NULL, config->arguments, "-dumpconfig");
-    if (dump_file) {
-        pmFPAfile *input = psMetadataLookupPtr(NULL, config->files, "PPSUB.INPUT"); // Input file
-        pmConfigDump(config, input->fpa, dump_file);
-    }
-
     return true;
 }
Index: trunk/ppSub/src/ppSubMakePSF.c
===================================================================
--- trunk/ppSub/src/ppSubMakePSF.c	(revision 23740)
+++ trunk/ppSub/src/ppSubMakePSF.c	(revision 23753)
@@ -22,6 +22,8 @@
 #include "ppSub.h"
 
-bool ppSubMakePSF(pmConfig *config, ppSubData *data)
+bool ppSubMakePSF(ppSubData *data)
 {
+    psAssert(data, "Require processing data");
+    pmConfig *config = data->config;    // Configuration
     psAssert(config, "Require configuration");
 
@@ -105,5 +107,5 @@
         psErrorStackPrint(stderr, "Unable to determine PSF");
         psWarning("Unable to determine PSF --- suspect bad data quality.");
-        ppSubDataQuality(config, data, PSPHOT_ERR_PSF, PPSUB_FILES_PHOT_SUB | PPSUB_FILES_PHOT_INV);
+        ppSubDataQuality(data, PSPHOT_ERR_PSF, PPSUB_FILES_PHOT_SUB | PPSUB_FILES_PHOT_INV);
         psFree(view);
         return true;
Index: trunk/ppSub/src/ppSubMatchPSFs.c
===================================================================
--- trunk/ppSub/src/ppSubMatchPSFs.c	(revision 23740)
+++ trunk/ppSub/src/ppSubMatchPSFs.c	(revision 23753)
@@ -22,6 +22,8 @@
 #include "ppSub.h"
 
-bool ppSubMatchPSFs(pmConfig *config, ppSubData *data)
+bool ppSubMatchPSFs(ppSubData *data)
 {
+    psAssert(data, "Require processing data");
+    pmConfig *config = data->config;    // Configuration
     psAssert(config, "Require configuration");
 
@@ -161,5 +163,5 @@
             psErrorStackPrint(stderr, "Unable to find stamps");
             psWarning("Unable to find stamps --- suspect bad data quality.");
-            ppSubDataQuality(config, data, error, PPSUB_FILES_ALL);
+            ppSubDataQuality(data, error, PPSUB_FILES_ALL);
             return true;
         } else {
Index: trunk/ppSub/src/ppSubReadout.c
===================================================================
--- trunk/ppSub/src/ppSubReadout.c	(revision 23740)
+++ trunk/ppSub/src/ppSubReadout.c	(revision 23753)
@@ -21,9 +21,11 @@
 #include "ppSub.h"
 
-bool ppSubReadout(const char *name, bool reverse, pmConfig *config, ppSubData *data, const pmFPAview *view)
+bool ppSubReadout(const char *name, bool reverse, ppSubData *data, const pmFPAview *view)
 {
+    psAssert(data, "Require processing data");
+    pmConfig *config = data->config;    // Configuration
+    psAssert(config, "Require configuration");
+
     psAssert(name, "Require name");
-    psAssert(config, "Require configuration");
-    psAssert(data, "Require data");
     psAssert(view, "Require view");
 
Index: trunk/ppSub/src/ppSubReadoutPhotometry.c
===================================================================
--- trunk/ppSub/src/ppSubReadoutPhotometry.c	(revision 23740)
+++ trunk/ppSub/src/ppSubReadoutPhotometry.c	(revision 23753)
@@ -22,6 +22,8 @@
 #include "ppSub.h"
 
-bool ppSubReadoutPhotometry(const char *name, pmConfig *config, ppSubData *data)
+bool ppSubReadoutPhotometry(const char *name, ppSubData *data)
 {
+    psAssert(data, "Require processing data");
+    pmConfig *config = data->config;    // Configuration
     psAssert(config, "Require configuration");
 
@@ -51,5 +53,5 @@
         psErrorStackPrint(stderr, "No PSF available");
         psWarning("No PSF available --- suspect bad data quality.");
-        ppSubDataQuality(config, data, psErrorCodeLast(), PPSUB_FILES_PHOT_SUB | PPSUB_FILES_PHOT_INV);
+        ppSubDataQuality(data, psErrorCodeLast(), PPSUB_FILES_PHOT_SUB | PPSUB_FILES_PHOT_INV);
         return true;
     }
@@ -94,5 +96,5 @@
         psErrorStackPrint(stderr, "Unable to perform photometry on image");
         psWarning("Unable to perform photometry on image --- suspect bad data quality.");
-        ppSubDataQuality(config, data, psErrorCodeLast(), PPSUB_FILES_PHOT_SUB | PPSUB_FILES_PHOT_INV);
+        ppSubDataQuality(data, psErrorCodeLast(), PPSUB_FILES_PHOT_SUB | PPSUB_FILES_PHOT_INV);
     }
 
Index: trunk/ppSub/src/ppSubReadoutRenorm.c
===================================================================
--- trunk/ppSub/src/ppSubReadoutRenorm.c	(revision 23740)
+++ 	(revision )
@@ -1,65 +1,0 @@
-/** @file ppSubReadoutRenorm.c
- *
- *  @brief
- *
- *  @ingroup ppSub
- *
- *  @author IfA
- *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2009-02-06 03:20:02 $
- *  Copyright 2009 Institute for Astronomy, University of Hawaii
- */
-
-#include "ppSub.h"
-
-bool ppSubReadoutRenormPixels (pmConfig *config, psMetadata *recipe, pmReadout *readout) {
-
-    bool mdok = false;
-
-    if (!psMetadataLookupBool(&mdok, recipe, "RENORM")) return true;
-
-    // Statistics for renormalisation
-    psStatsOptions renormMean = psStatsOptionFromString(psMetadataLookupStr(&mdok, recipe, "RENORM.MEAN"));
-    psStatsOptions renormStdev = psStatsOptionFromString(psMetadataLookupStr(&mdok, recipe, "RENORM.STDEV"));
-    if (renormMean == PS_STAT_NONE || renormStdev == PS_STAT_NONE) {
-        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
-                "Unable to parse renormalisation statistics from recipe.");
-        return false;
-    }
-    psImageMaskType maskValue = pmConfigMaskGet("BLANK", config); // Bits to mask
-    if (!pmReadoutVarianceRenormPixels(readout, maskValue, renormMean, renormStdev, NULL)) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to renormalise variances.");
-        return false;
-    }
-    return true;
-}
-
-/**
- * old-style variance renormalization
- */
-bool ppSubReadoutRenormPhot (pmConfig *config, psMetadata *recipe, pmReadout *readout) {
-
-    bool mdok = false;
-
-    if (!psMetadataLookupBool(&mdok, recipe, "RENORM")) return true;
-
-    // Statistics for renormalisation
-    psStatsOptions renormMean = psStatsOptionFromString(psMetadataLookupStr(&mdok, recipe, "RENORM.MEAN"));
-    psStatsOptions renormStdev = psStatsOptionFromString(psMetadataLookupStr(&mdok, recipe, "RENORM.STDEV"));
-    if (renormMean == PS_STAT_NONE || renormStdev == PS_STAT_NONE) {
-        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
-                "Unable to parse renormalisation statistics from recipe.");
-        return false;
-    }
-
-    // other renorm parameters
-    int renormNum = psMetadataLookupS32(&mdok, recipe, "RENORM.NUM"); // Number of samples for renormalisation
-    float renormWidth = psMetadataLookupS32(&mdok, recipe, "RENORM.WIDTH"); // Width of Gaussian phot
-
-    psImageMaskType maskValue = pmConfigMaskGet("BLANK", config); // Bits to mask
-    if (!pmReadoutVarianceRenormPhot(readout, maskValue, renormNum, renormWidth, renormMean, renormStdev, NULL)) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to renormalise variances.");
-        return false;
-    }
-    return true;
-}
Index: trunk/ppSub/src/ppSubReadoutStats.c
===================================================================
--- trunk/ppSub/src/ppSubReadoutStats.c	(revision 23740)
+++ trunk/ppSub/src/ppSubReadoutStats.c	(revision 23753)
@@ -10,8 +10,9 @@
 
 
-bool ppSubReadoutStats(pmConfig *config, ppSubData *data)
+bool ppSubReadoutStats(ppSubData *data)
 {
+    psAssert(data, "Require processing data");
+    pmConfig *config = data->config;    // Configuration
     psAssert(config, "Require configuration");
-    psAssert(data, "Require data");
 
     if (!data->statsFile) {
Index: trunk/ppSub/src/ppSubReadoutUpdate.c
===================================================================
--- trunk/ppSub/src/ppSubReadoutUpdate.c	(revision 23740)
+++ 	(revision )
@@ -1,21 +1,0 @@
-/** @file ppSubReadoutUpdate.c
- *
- *  @brief
- *
- *  @ingroup ppSub
- *
- *  @author IfA
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2009-02-18 00:31:20 $
- *  Copyright 2009 Institute for Astronomy, University of Hawaii
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <pslib.h>
-#include <psmodules.h>
-
-#include "ppSub.h"
Index: trunk/ppSub/src/ppSubVarianceFactors.c
===================================================================
--- trunk/ppSub/src/ppSubVarianceFactors.c	(revision 23740)
+++ 	(revision )
@@ -1,99 +1,0 @@
-/** @file ppSubVarianceFactors.c
- *
- *  @brief
- *
- *  @ingroup ppSub
- *
- *  @author IfA
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2009-02-18 00:31:20 $
- *  Copyright 2009 Institute for Astronomy, University of Hawaii
- */
-
-#include "ppSub.h"
-
-/**
- * Calculate the variance factor for the output image based on the input images
- */
-bool ppSubVarianceFactors (pmConfig *config, psMetadata *stats, const pmFPAview *view) {
-
-    // Look up recipe values
-    psMetadata *recipe = psMetadataLookupMetadata(NULL, config->recipes, PPSUB_RECIPE); // Recipe for ppSim
-    psAssert(recipe, "We checked this earlier, so it should be here.");
-
-    // convolved input images
-    pmCell *inCell = pmFPAfileThisCell(config->files, view, "PPSUB.INPUT.CONV"); // Input cell
-    pmCell *refCell = pmFPAfileThisCell(config->files, view, "PPSUB.REF.CONV"); // Reference cell
-
-    pmReadout *inConv = pmFPAfileThisReadout(config->files, view, "PPSUB.INPUT.CONV"); // Input cell
-    pmReadout *refConv = pmFPAfileThisReadout(config->files, view, "PPSUB.REF.CONV"); // Reference cell
-
-    pmReadout *outRO = pmFPAfileThisReadout(config->files, view, "PPSUB.OUTPUT"); // Output readout
-
-    // Update variance factors
-    // It's not possible to do this perfectly, since we're combining different images:
-    // vf_sum sigma_sum^2 = vf_1 * sigma_1^2 + vf_2 * sigma_2^2
-    // It's not possible to write vf_sum as a function of vf_1 and vf_2 with no reference to the sigmas.
-    // Instead, we're going to cheat.
-
-    bool mdok;                      // Status of MD lookup
-    pmSubtractionKernels *kernels = psMetadataLookupPtr(&mdok, outRO->analysis, PM_SUBTRACTION_ANALYSIS_KERNEL); // Kernels
-    if (!mdok) {
-        psError(PS_ERR_UNEXPECTED_NULL, true, "Unable to find subtraction kernels.");
-        return false;
-    }
-
-    float vfIn = psMetadataLookupF32(NULL, inCell->concepts, "CELL.VARFACTOR"); // Variance factor for input
-    if (!isfinite(vfIn)) {
-        vfIn = 1.0;
-    }
-    float vfRef = psMetadataLookupF32(NULL, refCell->concepts, "CELL.VARFACTOR"); // Variance factor for ref
-    if (!isfinite(vfRef)) {
-        vfRef = 1.0;
-    }
-
-    if (kernels->mode == PM_SUBTRACTION_MODE_1) {
-        vfIn *= pmSubtractionVarianceFactor(kernels, 0.0, 0.0, false);
-    }
-    if (kernels->mode == PM_SUBTRACTION_MODE_2) {
-        vfRef *= pmSubtractionVarianceFactor(kernels, 0.0, 0.0, false);
-    }
-    if (kernels->mode == PM_SUBTRACTION_MODE_DUAL) {
-        vfIn *= pmSubtractionVarianceFactor(kernels, 0.0, 0.0, false);
-        vfRef *= pmSubtractionVarianceFactor(kernels, 0.0, 0.0, true);
-    }
-
-    psStats *vfStats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN); // Statistics
-    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator
-
-    // mask these values when examining the background
-    psImageMaskType maskVal = pmConfigMaskGet("MASK.VALUE", config); // Bits to mask going in to pmSubtractionMatch
-    psImageMaskType maskBad = pmConfigMaskGet("BLANK", config); // Bits to mask for bad pixels
-
-    // measure the mean of the convolved input variance image
-    if (!psImageBackground(vfStats, NULL, inConv->variance, inConv->mask, maskVal | maskBad, rng)) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to measure mean variance for convolved input");
-        psFree(vfStats);
-        psFree(rng);
-        return false;
-    }
-    float inMeanVar = vfStats->robustMedian; // Mean variance of input
-
-    // measure the mean of the convolved reference variance image
-    if (!psImageBackground(vfStats, NULL, refConv->variance, refConv->mask, maskVal | maskBad, rng)) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to measure mean variance for convolved reference");
-        psFree(vfStats);
-        psFree(rng);
-        return false;
-    }
-    float refMeanVar = vfStats->robustMedian; // Mean variance of reference
-
-    psFree(rng);
-    psFree(vfStats);
-
-    float vf = (vfIn * inMeanVar + vfRef * refMeanVar) / (inMeanVar + refMeanVar); // Resulting var factor
-    psMetadataItem *vfItem = psMetadataLookup(outRO->parent->concepts, "CELL.VARFACTOR");
-    vfItem->data.F32 = vf;
-
-    return true;
-}
