Index: trunk/psModules/src/camera/pmFPAMaskWeight.c
===================================================================
--- trunk/psModules/src/camera/pmFPAMaskWeight.c	(revision 23244)
+++ trunk/psModules/src/camera/pmFPAMaskWeight.c	(revision 23259)
@@ -331,5 +331,5 @@
 
     if (!psMemIncrRefCounter(rng)) {
-        rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        rng = psRandomAlloc(PS_RANDOM_TAUS);
     }
 
@@ -371,5 +371,5 @@
 
     if (!psMemIncrRefCounter(rng)) {
-        rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        rng = psRandomAlloc(PS_RANDOM_TAUS);
     }
 
@@ -532,5 +532,5 @@
 
     if (!psMemIncrRefCounter(rng)) {
-        rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        rng = psRandomAlloc(PS_RANDOM_TAUS);
     }
 
Index: trunk/psModules/src/camera/pmFPA_JPEG.c
===================================================================
--- trunk/psModules/src/camera/pmFPA_JPEG.c	(revision 23244)
+++ trunk/psModules/src/camera/pmFPA_JPEG.c	(revision 23259)
@@ -154,5 +154,5 @@
 
     // measure the image statistics for scaling
-    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS);
     psStats *stats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN);
     stats->nSubsample = 10000;
Index: trunk/psModules/src/config/pmConfig.c
===================================================================
--- trunk/psModules/src/config/pmConfig.c	(revision 23244)
+++ trunk/psModules/src/config/pmConfig.c	(revision 23259)
@@ -13,4 +13,5 @@
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <strings.h>            /* for strn?casecmp */
@@ -24,9 +25,11 @@
 #include <pslib.h>
 
-#include "pmConfig.h"
 #include "pmErrorCodes.h"
 #include "pmFPALevel.h"
 #include "pmConfigRecipes.h"
 #include "pmConfigCamera.h"
+#include "pmConfigRun.h"
+
+#include "pmConfig.h"
 
 #ifdef HAVE_NEBCLIENT
@@ -432,8 +435,7 @@
     // variable will contain the name of the configuration file.
 
-    char *configFile = NULL;
-    //
+    char *configFile = NULL;            // Name of configuration file
+
     // First, try command line
-    //
     psS32 argNum = psArgumentGet(*argc, argv, "-ipprc");
     if (argNum != 0) {
@@ -447,17 +449,14 @@
         }
     }
-    //
+
     // Next, try environment variable
-    //
     if (!configFile) {
         configFile = getenv(IPPRC_ENV);
         if (configFile) {
-            configFile = psStringCopy (configFile);
-        }
-    }
-
-    //
+            configFile = psStringCopy(configFile);
+        }
+    }
+
     // Last chance is ~/.ipprc
-    //
     if (!configFile) {
         char *home = getenv("HOME");
@@ -466,8 +465,6 @@
     }
 
-    // We have the configuration filename; now we read and parse the config
-    // file and store in psMetadata struct user.
+    // Read and parse the config file and store in struct user.
     // XXX move this section to pmConfigReadUser.c ?
-
     if (!pmConfigFileRead(&config->user, configFile, "user")) {
         psFree(config);
@@ -477,11 +474,10 @@
     psFree(configFile);
 
-    // XXX why was this being called here?  Is someone calling pmConfigRead multiple times?
-    // pmConfigDone();
-    assert (configPath == NULL);
+    pmConfigRunCommand(config, *argc, argv);
 
     // define the config-file search path (configPath).
+    psAssert(configPath == NULL, "Configuration path is already defined.");
     psString path = psMetadataLookupStr(NULL, config->user, "PATH");
-    pmConfigSet (path);
+    pmConfigSet(path);
 
     // read the SITE file
@@ -525,5 +521,4 @@
             psLogSetLevel(logLevel);
         }
-
 
         // Set logging format
@@ -646,4 +641,26 @@
             psTimeInit(timeName);
         }
+    }
+
+    // Set the random number generator seed
+    {
+        psU64 seed = 0;                 // RNG seed
+        int argNum = psArgumentGet(*argc, argv, "-seed"); // Argument number
+        if (argNum > 0) {
+            psArgumentRemove(argNum, argc, argv);
+            if (argNum >= *argc) {
+                psWarning("-seed command-line switch provided without the required seed value --- ignored.");
+            } else {
+                char *end = NULL;       // Pointer to end of consumed string
+                seed = strtoll(argv[argNum], &end, 0);
+                if (strlen(end) > 0) {
+                    psError(PS_ERR_IO, true, "Unable to read random number generator seed: %s", argv[argNum]);
+                    psFree(config);
+                    return NULL;
+                }
+                psArgumentRemove(argNum, argc, argv);
+            }
+        }
+        pmConfigRunSeed(config, seed);
     }
 
Index: trunk/psModules/src/config/pmConfigCamera.c
===================================================================
--- trunk/psModules/src/config/pmConfigCamera.c	(revision 23244)
+++ trunk/psModules/src/config/pmConfigCamera.c	(revision 23259)
@@ -213,4 +213,5 @@
     psStringAppend(&newName, "_%s-SKYCELL", name);
     if (psMetadataLookup(oldCameras, newName)) {
+        psFree(newName);
         return true;
     }
@@ -469,4 +470,5 @@
     psStringAppend(&newName, "_%s-%s", name, mosaicLevel == PM_FPA_LEVEL_CHIP ? "CHIP" : "FPA");
     if (psMetadataLookup(oldCameras, newName)) {
+        psFree(newName);
         return true;
     }
Index: trunk/psModules/src/config/pmConfigRecipes.h
===================================================================
--- trunk/psModules/src/config/pmConfigRecipes.h	(revision 23244)
+++ trunk/psModules/src/config/pmConfigRecipes.h	(revision 23259)
@@ -1,9 +1,9 @@
 /*  @file pmConfigRecipes.h
  *  @brief Configuration Recipe functions
- * 
+ *
  *  @author ?, MHPCC
  *  @author Paul Price, IfA
  *  @author Eugene Magnier, IfA
- * 
+ *
  *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
  *  @date $Date: 2007-04-19 02:10:12 $
@@ -13,4 +13,6 @@
 #ifndef PM_CONFIG_RECIPES_H
 #define PM_CONFIG_RECIPES_H
+
+#include <pmConfig.h>
 
 /// @addtogroup Config Configuration System
@@ -26,7 +28,7 @@
 
 
-bool pmConfigLoadRecipeArguments (int *argc, char **argv, pmConfig *config);
-bool pmConfigLoadRecipeOptions (int *argc, char **argv, pmConfig *config, char *flag);
-psMetadata *pmConfigRecipeOptions (pmConfig *config, char *recipe);
+bool pmConfigLoadRecipeArguments(int *argc, char **argv, pmConfig *config);
+bool pmConfigLoadRecipeOptions(int *argc, char **argv, pmConfig *config, char *flag);
+psMetadata *pmConfigRecipeOptions(pmConfig *config, char *recipe);
 
 /// @}
Index: trunk/psModules/src/config/pmConfigRun.c
===================================================================
--- trunk/psModules/src/config/pmConfigRun.c	(revision 23244)
+++ trunk/psModules/src/config/pmConfigRun.c	(revision 23259)
@@ -72,5 +72,5 @@
 
 
-bool pmConfigRunCommand(pmConfig *config, int argc, const char **argv)
+bool pmConfigRunCommand(pmConfig *config, int argc, char **argv)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -81,5 +81,5 @@
     psString command = NULL;
     for (int i = 0; i < argc; i++) {
-        psStringAppend(&command, "%s", argv[i]);
+        psStringAppend(&command, "%s ", argv[i]);
     }
 
@@ -89,2 +89,25 @@
     return true;
 }
+
+
+bool pmConfigRunSeed(pmConfig *config, psU64 seed)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *run = configRun(config);// Run-time information
+    psAssert(run, "Require run-time information");
+
+    if (!seed) {
+        bool mdok;                          // Status of MD lookup
+        seed = psMetadataLookupU64(&mdok, run, "SEED");
+    }
+    if (!seed) {
+        bool mdok;                          // Status of MD lookup
+        seed = psMetadataLookupU64(&mdok, config->user, "SEED");
+    }
+
+    // seed may still be zero by this point
+    seed = psRandomSeed(seed);
+    return psMetadataAddU64(run, PS_LIST_TAIL, "SEED", PS_META_REPLACE, "Random number generator seed", seed);
+}
+
Index: trunk/psModules/src/config/pmConfigRun.h
===================================================================
--- trunk/psModules/src/config/pmConfigRun.h	(revision 23244)
+++ trunk/psModules/src/config/pmConfigRun.h	(revision 23259)
@@ -4,4 +4,5 @@
 #include <pslib.h>
 #include <pmConfig.h>
+#include <pmFPAfile.h>
 
 /// Add a file to the list of files used in the run-time information
@@ -12,6 +13,13 @@
 
 /// Add the command line to the run-time information
-bool pmConfigRunCommand(pmConfig *config, ///< Configuration
-                        int argc, const char **argv ///< Command line arguments
+bool pmConfigRunCommand(
+    pmConfig *config,                   ///< Configuration
+    int argc, char **argv               ///< Command line arguments
+    );
+
+/// Record the random number generator seed in the run-time information
+bool pmConfigRunSeed(
+    pmConfig *config,                   ///< Configuration
+    psU64 seed                          ///< RNG seed
     );
 
Index: trunk/psModules/src/detrend/pmFringeStats.c
===================================================================
--- trunk/psModules/src/detrend/pmFringeStats.c	(revision 23244)
+++ trunk/psModules/src/detrend/pmFringeStats.c	(revision 23259)
@@ -65,5 +65,5 @@
         rng = psMemIncrRefCounter(random);
     } else {
-        rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        rng = psRandomAlloc(PS_RANDOM_TAUS);
     }
 
Index: trunk/psModules/src/detrend/pmRemnance.c
===================================================================
--- trunk/psModules/src/detrend/pmRemnance.c	(revision 23244)
+++ trunk/psModules/src/detrend/pmRemnance.c	(revision 23259)
@@ -28,5 +28,5 @@
     int numCols = image->numCols, numRows = image->numRows; // Size of image
 
-    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0); // Random number generator
+    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator
 
     psStats *stats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); // Statistics
Index: trunk/psModules/src/detrend/pmShutterCorrection.c
===================================================================
--- trunk/psModules/src/detrend/pmShutterCorrection.c	(revision 23244)
+++ trunk/psModules/src/detrend/pmShutterCorrection.c	(revision 23259)
@@ -911,5 +911,5 @@
     psStats *stats = psStatsAlloc(meanStat | stdevStat); // Statistics to apply
     if (!rng) {
-        rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        rng = psRandomAlloc(PS_RANDOM_TAUS);
     } else {
         psMemIncrRefCounter(rng);
Index: trunk/psModules/src/imcombine/pmSubtractionMatch.c
===================================================================
--- trunk/psModules/src/imcombine/pmSubtractionMatch.c	(revision 23244)
+++ trunk/psModules/src/imcombine/pmSubtractionMatch.c	(revision 23259)
@@ -214,5 +214,5 @@
     int numCols = ro1->image->numCols, numRows = ro1->image->numRows; // Image dimensions
 
-    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0); // Random number generator
+    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator
 
     memCheck("start");
Index: trunk/psModules/test/detrend/tap_pmMaskBadPixels.c
===================================================================
--- trunk/psModules/test/detrend/tap_pmMaskBadPixels.c	(revision 23244)
+++ trunk/psModules/test/detrend/tap_pmMaskBadPixels.c	(revision 23259)
@@ -282,5 +282,5 @@
         pmCell *cell = generateSimpleCell(NULL);
         pmReadout *in = generateSimpleReadout(cell);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
 
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with NULL input pmReadout");
@@ -301,5 +301,5 @@
         psFree(in->image);
         in->image = NULL;
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with NULL input pmReadout->image");
         psFree(rng);
@@ -319,5 +319,5 @@
         psFree(in->image);
         in->image = psImageAlloc(0, 0, PS_TYPE_F32);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with empty input pmReadout->image");
         psFree(rng);
@@ -337,5 +337,5 @@
         psFree(in->image);
         in->image = psImageAlloc(TEST_NUM_COLS, TEST_NUM_ROWS, PS_TYPE_S32);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with incorrect type for pmReadout->image");
         psFree(rng);
@@ -355,5 +355,5 @@
         psFree(in->mask);
         in->mask = psImageAlloc(0, 0, PS_TYPE_MASK);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with incorrect type for pmReadout->image");
         psFree(rng);
@@ -373,5 +373,5 @@
         psFree(in->mask);
         in->mask = psImageAlloc(TEST_NUM_COLS/2, TEST_NUM_ROWS/2, PS_TYPE_MASK);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with bad size for in->mask");
         psFree(rng);
@@ -391,5 +391,5 @@
         psFree(in->mask);
         in->mask = psImageAlloc(TEST_NUM_COLS, TEST_NUM_ROWS, PS_TYPE_S32);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with bad type for in->mask");
         psFree(rng);
@@ -407,5 +407,5 @@
         pmCell *cell = generateSimpleCell(NULL);
         pmReadout *in = generateSimpleReadout(cell);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with empty out image");
         psFree(rng);
@@ -423,5 +423,5 @@
         pmCell *cell = generateSimpleCell(NULL);
         pmReadout *in = generateSimpleReadout(cell);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with incorrect type for out image");
         psFree(rng);
@@ -439,5 +439,5 @@
         pmCell *cell = generateSimpleCell(NULL);
         pmReadout *in = generateSimpleReadout(cell);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
         ok(!pmMaskFlagSuspectPixels(out, NULL, 1.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with incorrect size for out image");
         psFree(rng);
@@ -455,5 +455,5 @@
         pmCell *cell = generateSimpleCell(NULL);
         pmReadout *in = generateSimpleReadout(cell);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
 
         ok(!pmMaskFlagSuspectPixels(out, in, 0.0, 1, 1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with rej input <= 0.0");
@@ -472,5 +472,5 @@
         pmCell *cell = generateSimpleCell(NULL);
         pmReadout *in = generateSimpleReadout(cell);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 0);
 
         ok(!pmMaskFlagSuspectPixels(out, in, 1.0, 1, -1.0, rng), "pmMaskFlagSuspectPixels() returned NULL with frac input < 0.0");
Index: trunk/psModules/test/imcombine/tap_pmImageCombine.c
===================================================================
--- trunk/psModules/test/imcombine/tap_pmImageCombine.c	(revision 23244)
+++ trunk/psModules/test/imcombine/tap_pmImageCombine.c	(revision 23259)
@@ -9,5 +9,5 @@
 psArray *generate_images(void)
 {
-    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 12345);   // Random Number Generator
+    psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 12345);   // Random Number Generator
 
     // Generate images
Index: trunk/psModules/test/objects/tap_pmFringe.c
===================================================================
--- trunk/psModules/test/objects/tap_pmFringe.c	(revision 23244)
+++ trunk/psModules/test/objects/tap_pmFringe.c	(revision 23259)
@@ -89,5 +89,5 @@
         ok(fringe != NULL, "pmFringeRegionsAlloc() returned non-NULL");
         psImage *img = psImageAlloc(NUM_COLS, NUM_ROWS, PS_TYPE_F32);
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 10);
+        psRandom *rng = psRandomAllocSpecific(PS_RANDOM_TAUS, 10);
         fringe->x = psVectorAlloc(NUM_FRINGE_PNTS/2, PS_TYPE_F32);
         fringe->y = psVectorAlloc(NUM_FRINGE_PNTS/2, PS_TYPE_F32);
Index: trunk/psModules/test/objects/tap_pmSourceFitModel.c
===================================================================
--- trunk/psModules/test/objects/tap_pmSourceFitModel.c	(revision 23244)
+++ trunk/psModules/test/objects/tap_pmSourceFitModel.c	(revision 23259)
@@ -27,5 +27,5 @@
 
     // build a gauss-deviate vector (mean = 0.0, sigma = 1.0)
-    psRandom *seed = psRandomAlloc (PS_RANDOM_TAUS, 0);
+    psRandom *seed = psRandomAllocSpecific (PS_RANDOM_TAUS, 0);
 
     static float radius[] = {3.0, 5.0, 7.0, 10.0, 15.0, 25.0};
Index: trunk/psModules/test/objects/tap_pmSourceFitModel_Delta.c
===================================================================
--- trunk/psModules/test/objects/tap_pmSourceFitModel_Delta.c	(revision 23244)
+++ trunk/psModules/test/objects/tap_pmSourceFitModel_Delta.c	(revision 23259)
@@ -23,5 +23,5 @@
 
     // build a gauss-deviate vector (mean = 0.0, sigma = 1.0)
-    psRandom *seed = psRandomAlloc (PS_RANDOM_TAUS, 0);
+    psRandom *seed = psRandomAllocSpecific (PS_RANDOM_TAUS, 0);
 
     // noise vector to noise up the image
@@ -167,5 +167,5 @@
 
     // build a gauss-deviate vector (mean = 0.0, sigma = 1.0)
-    psRandom *seed = psRandomAlloc (PS_RANDOM_TAUS, 0);
+    psRandom *seed = psRandomAllocSpecific (PS_RANDOM_TAUS, 0);
 
     static float radius[] = {3.0, 5.0, 7.0, 10.0, 15.0, 25.0};
