Index: trunk/ppSim/src/ppSimArguments.c
===================================================================
--- trunk/ppSim/src/ppSimArguments.c	(revision 14797)
+++ trunk/ppSim/src/ppSimArguments.c	(revision 16494)
@@ -57,4 +57,5 @@
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-shuttertime", 0, "Shutter time (s)", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-skyrate", 0, "Sky rate (e/s)", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-skymags", 0, "Sky brightness in mags / square arcsec", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-ra", 0, "RA (degrees)", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-dec", 0, "Dec (degrees)", NAN);
@@ -69,4 +70,8 @@
     psMetadataAddS32(arguments, PS_LIST_TAIL, "-bin", 0, "Binning in x and y", 1);
 
+    if (psArgumentGet (argc, argv, "-h")) { usage(argv[0], arguments, config); }
+    if (psArgumentGet (argc, argv, "--h")) { usage(argv[0], arguments, config); }
+    if (psArgumentGet (argc, argv, "--help")) { usage(argv[0], arguments, config); }
+
     pmConfigFileSetsMD (config->arguments, &argc, argv, "PSPHOT.PSF", "-psf", "-psflist");
 
@@ -75,10 +80,15 @@
     if (!config->camera && !status) {
         psErrorStackPrint(stderr, "A camera name (-camera NAME) or an image (-file NAME) must be specified");
-        usage(argv[0], arguments, config);
-    }
-
-    if (!psArgumentParse(arguments, &argc, argv)) { usage (argv[0], arguments, config); }
-
-    if (argc != 2) { usage(argv[0], arguments, config); }
+	exit(PS_EXIT_CONFIG_ERROR);
+    }
+
+    if (!psArgumentParse(arguments, &argc, argv)) { 
+	exit(PS_EXIT_CONFIG_ERROR);
+    }
+
+    if (argc != 2) { 
+        psErrorStackPrint(stderr, "Missing output filename");
+	exit(PS_EXIT_CONFIG_ERROR);
+    }
 
     psString formatName = psMetadataLookupStr(NULL, arguments, "-format"); // Name of format
@@ -107,5 +117,5 @@
     if (!typeStr) {
         psErrorStackPrint(stderr, "An exposure type must be specified using -type");
-        usage(argv[0], arguments, config);
+	exit(PS_EXIT_CONFIG_ERROR);
     }
     ppSimType type = PPSIM_TYPE_NONE;   // Type to simulate
@@ -120,5 +130,5 @@
     } else {
         psErrorStackPrint(stderr, "Unrecognised exposure type: %s", typeStr);
-        usage(argv[0], arguments, config);
+	exit(PS_EXIT_CONFIG_ERROR);
     }
     assert(type != PPSIM_TYPE_NONE);
@@ -135,5 +145,5 @@
         if (isnan(expTime)) {
             psErrorStackPrint(stderr, "The exposure time must be specified using -exptime");
-            usage(argv[0], arguments, config);
+	    exit(PS_EXIT_CONFIG_ERROR);
         }
     }
@@ -170,5 +180,5 @@
     if (binning <= 0) {
         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Binning (%d) is non-positive.", binning);
-        usage(argv[0], arguments, config);
+	exit(PS_EXIT_CONFIG_ERROR);
     }
     psMetadataAddS32(config->arguments, PS_LIST_TAIL, "BINNING", 0, "Binning in x and y", binning);
@@ -178,26 +188,58 @@
     if (type == PPSIM_TYPE_OBJECT) {
         // Load values required for adding 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
-        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)) {
+        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
+        float seeing  = psMetadataLookupF32(NULL, arguments, "-seeing"); // Zero point
+
+	// XXX scale and zp should be supplied by the config file (allow override, but this is camera-dependent)
+        if (isnan(ra0) || isnan(dec0) || isnan(pa) || isnan(seeing)) {
             psErrorStackPrint(stderr, "-ra, -dec, -pa, -scale, -zp, -seeing must be specified for OBJECT type");
-            usage(argv[0], arguments, config);
-        }
+	    exit(PS_EXIT_CONFIG_ERROR);
+        }
+
+        float zp      = psMetadataLookupF32(NULL, arguments, "-zp"); // Zero point
+	if (isnan(zp)) {
+	    // use the filter to get the zeropoint from the recipe
+	    psMetadataItem *zpItem = psMetadataLookup (recipe, "ZEROPTS");
+	    // check that item is multi...
+	    
+	    psArray *entries = psListToArray (zpItem->data.list);
+	  
+	    // search for matching filter
+	    for (int i = 0; i < entries->n; i++) {
+		psMetadataItem *item = entries->data[i];
+		psMetadata *entry = item->data.V;
+
+		char *filterName = psMetadataLookupStr (&status, entry, "FILTER");
+		assert (filterName);
+
+		if (strcmp(filterName, filter)) continue;
+
+		zp = psMetadataLookupF32 (&status, entry, "ZERO_PT");
+		assert (status);
+		break;
+            }
+	    psFree (entries);
+	}
+
+        float scale   = psMetadataLookupF32(NULL, arguments, "-scale"); // Plate scale
+	if (isnan(scale)) {
+	    scale = psMetadataLookupF32 (&status, recipe, "PIXEL.SCALE");
+	}
+
+        float skymags = psMetadataLookupF32(NULL, arguments, "-skymags"); // Position angle
+	if (isnan(skymags)) {
+	    skymags = psMetadataLookupF32 (&status, recipe, "SKY.MAGS");
+	}
+
+        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);
+        psMetadataAddF32(config->arguments, PS_LIST_TAIL, "SEEING", 0, "Seeing sigma (pix)", seeing / 2.0 / sqrt(2.0 * log(2.0)) / scale);
+
         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);
-        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);
-
+        psMetadataAddF32(config->arguments, PS_LIST_TAIL, "SKY.MAGS", 0, "sky surface brightness", skymags);
 
         const char *psfClass = psMetadataLookupStr(NULL, arguments, "-psfclass"); // Filter name
