Index: trunk/ppSim/.cvsignore
===================================================================
--- trunk/ppSim/.cvsignore	(revision 12833)
+++ trunk/ppSim/.cvsignore	(revision 12834)
@@ -13,2 +13,3 @@
 Makefile.in
 missing
+test
Index: trunk/ppSim/src/ppSim.h
===================================================================
--- trunk/ppSim/src/ppSim.h	(revision 12833)
+++ trunk/ppSim/src/ppSim.h	(revision 12834)
@@ -24,5 +24,5 @@
 ///
 /// Returns a borrowed pointer to the FPA file.
-pmFPAfile *ppSimCreate(const pmConfig *config ///< Configuration
+pmFPAfile *ppSimCreate(pmConfig *config ///< Configuration
     );
 
Index: trunk/ppSim/src/ppSimArguments.c
===================================================================
--- trunk/ppSim/src/ppSimArguments.c	(revision 12833)
+++ trunk/ppSim/src/ppSimArguments.c	(revision 12834)
@@ -55,4 +55,5 @@
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-format", 0, "Camera format name", NULL);
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-type", 0, "Exposure type (BIAS|DARK|FLAT|OBJECT)", NULL);
+    psMetadataAddStr(arguments, PS_LIST_TAIL, "-filter", 0, "Filter name", NULL);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-exptime", 0, "Exposure time (s)", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-biaslevel", 0, "Bias level (e)", NAN);
@@ -69,5 +70,5 @@
     }
 
-    if (*config->argc == 1 || !psArgumentParse(arguments, config->argc, config->argv)) {
+    if (*config->argc == 1 || !psArgumentParse(arguments, config->argc, config->argv) || *config->argc != 2) {
         usage(arguments, config);
     }
@@ -98,5 +99,8 @@
         usage(arguments, config);
     }
-    psMetadataAdd(config->arguments, PS_LIST_TAIL, "TYPE", 0, "Exposure type", type);
+    psMetadataAddS32(config->arguments, PS_LIST_TAIL, "TYPE", 0, "Exposure type", type);
+
+    const char *filter = psMetadataLookupStr(NULL, arguments, "-filter"); // Filter name
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "FILTER", 0, "Filter name", filter);
 
     float expTime;
@@ -110,5 +114,5 @@
         }
     }
-    psMetadataAdd(config->arguments, PS_LIST_TAIL, "EXPTIME", 0, "Exposure time (s)", expTime);
+    psMetadataAddF32(config->arguments, PS_LIST_TAIL, "EXPTIME", 0, "Exposure time (s)", expTime);
 
     psMetadata *recipe = psMetadataLookupMetadata(NULL, config->recipes, PPSIM_RECIPE); // Recipe for ppSim
@@ -128,4 +132,7 @@
     valueArgRecipe(config, arguments, "-skyrate",     recipe, "SKY.RATE",     config->arguments);
 
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "OUTPUT", 0, "Name of the output image",
+                     config->argv[1]);
+
     psFree(arguments);
 }
Index: trunk/ppSim/src/ppSimCreate.c
===================================================================
--- trunk/ppSim/src/ppSimCreate.c	(revision 12833)
+++ trunk/ppSim/src/ppSimCreate.c	(revision 12834)
@@ -9,9 +9,10 @@
 #include "ppSim.h"
 
-pmFPAfile *ppSimCreate(const pmConfig *config)
+pmFPAfile *ppSimCreate(pmConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    const char *formatName = psMetadataLookupStr(NULL, config->arguments, "FORMAT"); // Input format name
+    psString formatName = psMetadataLookupStr(NULL, config->arguments, "FORMAT"); // Input format name
+    config->formatName = psMemIncrRefCounter(formatName);
 
     psMetadata *formats = psMetadataLookupMetadata(NULL, config->camera, "FORMATS"); // The camera formats
@@ -20,5 +21,5 @@
         return NULL;
     }
-    psMetadata *format = psMetadataLookupMetadata(NULL, formats, config->formatName); // The format of interest
+    psMetadata *format = psMetadataLookupMetadata(NULL, formats, formatName); // Format of interest
     if (!format) {
         psError(PS_ERR_UNEXPECTED_NULL, true, "Unable to find format %s in camera FORMATS.", formatName);
Index: trunk/ppSim/src/ppSimLoop.c
===================================================================
--- trunk/ppSim/src/ppSimLoop.c	(revision 12833)
+++ trunk/ppSim/src/ppSimLoop.c	(revision 12834)
@@ -93,5 +93,5 @@
 
     psRegion *bounds = fpaBounds(fpa);  // Bounds of FPA
-    if (!bounds) {
+    if (!bounds || (bounds->x0 == 0.0 && bounds->x1 == 0.0) || (bounds->y0 == 0.0 && bounds->y1 == 0.0)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to determine bounds of FPA");
         return PS_EXIT_CONFIG_ERROR;
@@ -105,9 +105,29 @@
     float shutterTime = psMetadataLookupF32(NULL, config->arguments, "SHUTTER.TIME"); // Shutter time
     float skyRate = psMetadataLookupF32(NULL, config->arguments, "SKY.RATE"); // Sky rate
+
     float expTime = psMetadataLookupF32(NULL, config->arguments, "EXPTIME"); // Exposure time
+    const char *filter = psMetadataLookupStr(NULL, config->arguments, "FILTER"); // Filter name
     ppSimType type = psMetadataLookupS32(NULL, config->arguments, "TYPE"); // Type of image to simulate
 
     psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0); // Random number generator
     pmFPAview *view = pmFPAviewAlloc(0);// View for iterating over FPA
+
+    // Update concepts
+    const char *typeStr;                // Exposure type String
+    switch (type) {
+      case PPSIM_TYPE_BIAS:   typeStr = "BIAS";   break;
+      case PPSIM_TYPE_DARK:   typeStr = "DARK";   break;
+      case PPSIM_TYPE_FLAT:   typeStr = "FLAT";   break;
+      case PPSIM_TYPE_OBJECT: typeStr = "OBJECT"; break;
+      default:
+        psAbort("Should never get here.");
+    }
+    psMetadataAddStr(fpa->concepts, PS_LIST_TAIL, "FPA.OBSTYPE", PS_META_REPLACE,
+                     "Observation type", typeStr);
+    psMetadataAddF32(fpa->concepts, PS_LIST_TAIL, "FPA.EXPTIME", PS_META_REPLACE,
+                     "Exposure time (sec)", expTime);
+    psMetadataAddStr(fpa->concepts, PS_LIST_TAIL, "FPA.FILTERID", PS_META_REPLACE, "Filter name", filter);
+    psMetadataAddStr(fpa->concepts, PS_LIST_TAIL, "FPA.FILTER", PS_META_REPLACE, "Filter name", filter);
+
 
     pmChip *chip;                       // Chip from FPA
@@ -144,5 +164,5 @@
 
             // TO DO: Decide if cell is to be video readout
-            int numReadouts = 0.0;      // Number of readouts in cell
+            int numReadouts = 1;        // Number of readouts in cell
 
             for (int i = 0; i < numReadouts; i++) {
@@ -203,4 +223,7 @@
                 }
 
+                // TO DO: Add overscan
+
+#if 0
                 // Add the noise into the image
                 for (int y = 0; y < numRows; y++) {
@@ -211,4 +234,5 @@
                     }
                 }
+#endif
                 readout->image = signal;
                 psFree(variance);
@@ -217,6 +241,8 @@
             }
 
-            psMetadataAddF32(cell->concepts, PS_LIST_TAIL, "CELL.EXPTIME", 0, "Exposure time (sec)", expTime);
-            psMetadataAddF32(cell->concepts, PS_LIST_TAIL, "CELL.DARKTIME", 0, "Dark time (sec)", expTime);
+            psMetadataAddF32(cell->concepts, PS_LIST_TAIL, "CELL.EXPOSURE", PS_META_REPLACE,
+                             "Exposure time (sec)", expTime);
+            psMetadataAddF32(cell->concepts, PS_LIST_TAIL, "CELL.DARKTIME", PS_META_REPLACE,
+                             "Dark time (sec)", expTime);
 
             if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) {
@@ -239,25 +265,11 @@
     }
 
-    const char *typeStr;                // Exposure type String
-    switch (type) {
-      case PPSIM_TYPE_BIAS:   typeStr = "BIAS";   break;
-      case PPSIM_TYPE_DARK:   typeStr = "DARK";   break;
-      case PPSIM_TYPE_FLAT:   typeStr = "FLAT";   break;
-      case PPSIM_TYPE_OBJECT: typeStr = "OBJECT"; break;
-      default:
-        psAbort("Should never get here.");
-    }
-
-    psMetadataAddStr(fpa->concepts, PS_LIST_TAIL, "FPA.OBSTYPE", 0, "Observation type", typeStr);
-    psMetadataAddF32(fpa->concepts, PS_LIST_TAIL, "FPA.EXPTIME", 0, "Exposure time (sec)", expTime);
-
-            if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) {
-                psError(PS_ERR_IO, false, "Unable to write file.");
-                psFree(rng);
-                psFree(view);
-                psFree(bounds);
-                return PS_EXIT_SYS_ERROR;
-            }
-
+    if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) {
+        psError(PS_ERR_IO, false, "Unable to write file.");
+        psFree(rng);
+        psFree(view);
+        psFree(bounds);
+        return PS_EXIT_SYS_ERROR;
+    }
 
     psFree(rng);
