Index: trunk/ppSim/src/ppSimArguments.c
===================================================================
--- trunk/ppSim/src/ppSimArguments.c	(revision 12834)
+++ trunk/ppSim/src/ppSimArguments.c	(revision 12873)
@@ -16,5 +16,5 @@
 {
     fprintf(stderr, "\nPan-STARRS data simulator\n\n");
-    fprintf(stderr, "Usage: %s -camera CAMERA_NAME -format FORMAT_NAME\n", config->argv[0]);
+    fprintf(stderr, "Usage: %s -camera CAMERA_NAME\n", config->argv[0]);
     fprintf(stderr, "\n");
     psArgumentHelp(arguments);
@@ -35,6 +35,7 @@
     float value = psMetadataLookupF32(NULL, arguments, argName); // Bias level
     if (isnan(value)) {
-        value = psMetadataLookupF32(NULL, recipe, recipeName);
-        if (isnan(value)) {
+        bool mdok;                      // Status of MD lookup
+        value = psMetadataLookupF32(&mdok, recipe, recipeName);
+        if (!mdok) {
             psErrorStackPrint(stderr, "Unable to find %s in recipe %s", recipeName, PPSIM_RECIPE);
             psFree((psPtr)arguments);
@@ -43,8 +44,6 @@
         }
     }
-
     return psMetadataAddF32(target, PS_LIST_TAIL, recipeName, 0, NULL, value);
 }
-
 
 void ppSimArguments(pmConfig *config)
@@ -64,4 +63,14 @@
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-shuttertime", 0, "Shutter time (s)", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-skyrate", 0, "Sky rate (e/s)", NAN);
+    psMetadataAddStr(arguments, PS_LIST_TAIL, "-stars", 0, "File with star RA, Dec, Mag", NULL);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-ra", 0, "RA (degrees)", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-dec", 0, "Dec (degrees)", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-pa", 0, "Position angle (degrees)", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-scale", 0, "Plate scale (arcsec/pixel)", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-zp", 0, "Photometric zero point", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-seeing", 0, "Seeing FWHM (arcsec)", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-starslum", 0, "Fake star luminosity function slope", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-starsmag", 0, "Brightest magnitude for fake stars", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-starsdensity", 0, "Density of fake stars at magnitude", NAN);
 
     if (!config->camera) {
@@ -74,10 +83,24 @@
     }
 
-    const char *formatName = psMetadataLookupStr(NULL, arguments, "-format"); // Name of format
-    if (!formatName) {
-        psErrorStackPrint(stderr, "A camera format must be specified using -format");
-        usage(arguments, config);
-    }
-    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "FORMAT", 0, "Camera format name", formatName);
+    psString formatName = psMetadataLookupStr(NULL, arguments, "-format"); // Name of format
+    if (formatName) {
+        config->formatName = psMemIncrRefCounter(formatName);
+
+        psMetadata *formats = psMetadataLookupMetadata(NULL, config->camera, "FORMATS"); // The camera formats
+        if (!formats) {
+            psErrorStackPrint(stderr, "Unable to find FORMATS in camera configuration.");
+            psFree(arguments);
+            psFree(config);
+            exit(PS_EXIT_CONFIG_ERROR);
+        }
+        psMetadata *format = psMetadataLookupMetadata(NULL, formats, formatName); // Format of interest
+        if (!format) {
+            psErrorStackPrint(stderr, "Unable to find format %s in camera FORMATS.", formatName);
+            psFree(arguments);
+            psFree(config);
+            exit(PS_EXIT_CONFIG_ERROR);
+        }
+        config->format = psMemIncrRefCounter(format);
+    }
 
     const char *typeStr = psMetadataLookupStr(NULL, arguments, "-type"); // Exposure type
@@ -124,15 +147,87 @@
     }
 
-    valueArgRecipe(config, arguments, "-biaslevel",   recipe, "BIAS.LEVEL",   config->arguments);
-    valueArgRecipe(config, arguments, "-biasrange",   recipe, "BIAS.RANGE",   config->arguments);
-    valueArgRecipe(config, arguments, "-darkrate",    recipe, "DARK.RATE",    config->arguments);
-    valueArgRecipe(config, arguments, "-flatsigma",   recipe, "FLAT.SIGMA",   config->arguments);
-    valueArgRecipe(config, arguments, "-flatrate",    recipe, "FLAT.RATE",    config->arguments);
-    valueArgRecipe(config, arguments, "-shuttertime", recipe, "SHUTTER.TIME", config->arguments);
-    valueArgRecipe(config, arguments, "-skyrate",     recipe, "SKY.RATE",     config->arguments);
+    valueArgRecipe(config, arguments, "-biaslevel",    recipe, "BIAS.LEVEL",    config->arguments);
+    valueArgRecipe(config, arguments, "-biasrange",    recipe, "BIAS.RANGE",    config->arguments);
+    valueArgRecipe(config, arguments, "-darkrate",     recipe, "DARK.RATE",     config->arguments);
+    valueArgRecipe(config, arguments, "-flatsigma",    recipe, "FLAT.SIGMA",    config->arguments);
+    valueArgRecipe(config, arguments, "-flatrate",     recipe, "FLAT.RATE",     config->arguments);
+    valueArgRecipe(config, arguments, "-shuttertime",  recipe, "SHUTTER.TIME",  config->arguments);
+    valueArgRecipe(config, arguments, "-skyrate",      recipe, "SKY.RATE",      config->arguments);
+    valueArgRecipe(config, arguments, "-starslum",     recipe, "STARS.LUM",     config->arguments);
+    valueArgRecipe(config, arguments, "-starsmag",     recipe, "STARS.MAG",     config->arguments);
+    valueArgRecipe(config, arguments, "-starsdensity", recipe, "STARS.DENSITY", config->arguments);
+
+    bool mdok;                          // Status of MD lookup
+    int biasOrder = psMetadataLookupS32(&mdok, recipe, "BIAS.ORDER"); // Overscan polynomial order
+    if (!mdok) {
+        psWarning("BIAS.ORDER(S32) is not set in the recipe %s --- assuming %d", PPSIM_RECIPE, biasOrder);
+    }
+    psMetadataAddS32(config->arguments, PS_LIST_TAIL, "BIAS.ORDER", 0,
+                     "Overscan polynomial order", biasOrder);
+
 
     psMetadataAddStr(config->arguments, PS_LIST_TAIL, "OUTPUT", 0, "Name of the output image",
                      config->argv[1]);
 
+
+    // Values common for stars
+    float scale = psMetadataLookupF32(NULL, arguments, "-scale"); // Plate scale
+    float zp = psMetadataLookupF32(NULL, arguments, "-zp"); // Zero point
+    float seeing = psMetadataLookupF32(NULL, arguments, "-seeing"); // Zero point
+    psMetadataAddF32(config->arguments, PS_LIST_TAIL, "SCALE", 0, "Plate scale (arcsec/pix)", scale);
+    psMetadataAddF32(config->arguments, PS_LIST_TAIL, "ZEROPOINT", 0, "Photometric zeropoint", zp);
+    psMetadataAddF32(config->arguments, PS_LIST_TAIL, "SEEING", 0, "Seeing simga (pix)",
+                     seeing / 2.0 / sqrt(2.0 * log(2.0)) / scale);
+
+    const char *starName = psMetadataLookupStr(NULL, arguments, "-stars"); // Name of file with stars
+    if (starName) {
+        float ra0 = psMetadataLookupF32(NULL, arguments, "-ra"); // Right Ascension of boresight
+        float dec0 = psMetadataLookupF32(NULL, arguments, "-dec"); // Declination of boresight
+        float pa = psMetadataLookupF32(NULL, arguments, "-pa"); // Position angle
+
+        if (isnan(ra0) || isnan(dec0) || isnan(pa) || isnan(scale) || isnan(zp) || isnan(seeing)) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, false,
+                    "-ra, -dec, -pa -scale, -zp, -seeing must be specified with -stars");
+            usage(arguments, config);
+        }
+        psMetadataAddF32(config->arguments, PS_LIST_TAIL, "RA", 0, "Boresight RA (radians)",
+                         ra0 * M_PI / 180.0);
+        psMetadataAddF32(config->arguments, PS_LIST_TAIL, "DEC", 0, "Boresight Declination (radians)",
+                         dec0 * M_PI / 180.0);
+        psMetadataAddF32(config->arguments, PS_LIST_TAIL, "PA", 0, "Boresight position angle (radians)",
+                         pa * M_PI / 180.0);
+
+        psArray *raDecMag = psVectorsReadFromFile(starName, "%f %f %f"); // Vectors for RA Dec Mag
+        if (!raDecMag || raDecMag->n != 3) {
+            psError(PS_ERR_IO, false, "Unable to read RA Dec Mag from %s", starName);
+            psFree(raDecMag);
+            psFree(arguments);
+            psFree(config);
+            exit(PS_EXIT_CONFIG_ERROR);
+        }
+
+        psVector *ra = raDecMag->data[0]; // Star RAs
+        psVector *dec = raDecMag->data[1]; // Star Declinations
+        psVector *mag = raDecMag->data[2]; // Star magnitudes
+        for (long i = 0; i < ra->n; i++) {
+            ra->data.F32[i] *= M_PI / 180.0;
+            dec->data.F32[i] *= M_PI / 180.0;
+        }
+
+        psMetadataAddVector(config->arguments, PS_LIST_TAIL, "CATALOG.RA", 0, "Star RAs (radians)", ra);
+        psMetadataAddVector(config->arguments, PS_LIST_TAIL, "CATALOG.DEC", 0, "Star Decs (radians)", dec);
+        psMetadataAddVector(config->arguments, PS_LIST_TAIL, "CATALOG.MAG", 0, "Star magnitudes", mag);
+        psFree(raDecMag);
+    }
+
+    if (psMetadataLookupF32(NULL, config->arguments, "STARS.DENSITY") > 0 &&
+        (isnan(scale) || isnan(zp) || isnan(seeing))) {
+        psWarning("-scale, -zp, -seeing must be specified if fake stars are to be generated --- turned off.");
+        psMetadataAddS32(config->arguments, PS_LIST_TAIL, "STASR.NUM", PS_META_REPLACE,
+                         "Fake stars turned off", 0);
+    }
+
+
     psFree(arguments);
+    return;
 }
