Index: trunk/psphot/src/psphotArguments.c
===================================================================
--- trunk/psphot/src/psphotArguments.c	(revision 5993)
+++ trunk/psphot/src/psphotArguments.c	(revision 6117)
@@ -1,66 +1,36 @@
 # include "psphot.h"
 
-static void usage (void) ;
+static void usage (psMetadata *arguments) ;
 
-psMetadata *psphotArguments (int *argc, char **argv) {
+ppConfig *psphotArguments (int *argc, char **argv) {
 
     int N;
-    unsigned int Nfail;
-
-    psMetadata *options = psMetadataAlloc ();
 
     // basic pslib options
     psLogSetFormat ("M");
-    psArgumentVerbosity (argc, argv);
 
-    // command-line options -- place on options MD
-    // mask image
-    if ((N = psArgumentGet (*argc, argv, "-mask"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (options, PS_LIST_TAIL, "MASK_IMAGE", 0, "", psStringCopy(argv[N]));
-	psArgumentRemove (N, argc, argv);
+    ppConfig *config = ppConfigAlloc ();
+
+    // load config data from default locations 
+    if (!pmConfigRead(&config->site, &config->camera, &config->recipe, argc, argv, PSPHOT_RECIPE)) {
+        psErrorStackPrint(stderr, "Can't find site configuration!\n");
+        exit (EXIT_FAILURE);
     }
 
-    // weight image
-    if ((N = psArgumentGet (*argc, argv, "-weight"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (options, PS_LIST_TAIL, "WEIGHT_IMAGE", 0, "", psStringCopy(argv[N]));
-	psArgumentRemove (N, argc, argv);
-    }
+    // Parse other command-line arguments
+    config->arguments = psMetadataAlloc ();
 
-    // output residual image
-    if ((N = psArgumentGet (*argc, argv, "-resid"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (options, PS_LIST_TAIL, "RESID_IMAGE", 0, "", psStringCopy(argv[N]));
-	psArgumentRemove (N, argc, argv);
-    }
-
-    // analysis region
-    if ((N = psArgumentGet (*argc, argv, "-region"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (options, PS_LIST_TAIL, "ANALYSIS_REGION", 0, "", psStringCopy(argv[N]));
-	psArgumentRemove (N, argc, argv);
-    }
-
-    // output residual image
-    psMetadataAddStr (options, PS_LIST_TAIL, "PHOTCODE", 0, "", psStringCopy("NONE"));
-    if ((N = psArgumentGet (*argc, argv, "-photcode"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (options, PS_LIST_TAIL, "PHOTCODE", PS_META_REPLACE, "", psStringCopy(argv[N]));
-	psArgumentRemove (N, argc, argv);
-    }
-
-    // input PSF file
-    if ((N = psArgumentGet (*argc, argv, "-psf"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (options, PS_LIST_TAIL, "PSF_INPUT_FILE", 0, "", psStringCopy (argv[N]));
-	psArgumentRemove (N, argc, argv);
-    }
-
-    // run the 0ltest model (requires X,Y coordinate)
+    // arguments (must be supplied for each run, or not used)
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-psf", 0, "input psf file", "");
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-mask", 0,   "Name of the mask image", "");
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-resid", 0,  "Name of the output residual image", "");
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-weight", 0, "Name of the weight image", "");
+    psMetadataAddS32(config->arguments, PS_LIST_TAIL, "-chip", 0, "Chip number to process (if positive)", -1);
+    
+    // run the test model (requires X,Y coordinate)
     if ((N = psArgumentGet (*argc, argv, "-modeltest"))) {
-	psMetadataAddBool (options, PS_LIST_TAIL, "TEST_FIT",   0, "", true);
-	psMetadataAddF32  (options, PS_LIST_TAIL, "TEST_FIT_X", 0, "", atof(argv[N+1]));
-	psMetadataAddF32  (options, PS_LIST_TAIL, "TEST_FIT_Y", 0, "", atof(argv[N+2]));
+	psMetadataAddBool (config->arguments, PS_LIST_TAIL, "TEST_FIT",   0, "", true);
+	psMetadataAddF32  (config->arguments, PS_LIST_TAIL, "TEST_FIT_X", 0, "", atof(argv[N+1]));
+	psMetadataAddF32  (config->arguments, PS_LIST_TAIL, "TEST_FIT_Y", 0, "", atof(argv[N+2]));
 
 	psArgumentRemove (N, argc, argv);
@@ -71,5 +41,5 @@
 	if ((N = psArgumentGet (*argc, argv, "-model"))) {
 	    psArgumentRemove (N, argc, argv);
-	    psMetadataAddStr (options, PS_LIST_TAIL, "TEST_FIT_MODEL", 0, "", psStringCopy (argv[N]));
+	    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "TEST_FIT_MODEL", 0, "", psStringCopy (argv[N]));
 	    psArgumentRemove (N, argc, argv);
 	}
@@ -78,76 +48,90 @@
 	if ((N = psArgumentGet (*argc, argv, "-fitmode"))) {
 	    psArgumentRemove (N, argc, argv);
-	    psMetadataAddStr (options, PS_LIST_TAIL, "TEST_FIT_MODE", 0, "", psStringCopy (argv[N]));
+	    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "TEST_FIT_MODE", 0, "", psStringCopy (argv[N]));
 	    psArgumentRemove (N, argc, argv);
 	}
 	if ((N = psArgumentGet (*argc, argv, "-fitset"))) {
 	    psArgumentRemove (N, argc, argv);
-	    psMetadataAddStr (options, PS_LIST_TAIL, "TEST_FIT_SET", 0, "", psStringCopy (argv[N]));
+	    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "TEST_FIT_SET", 0, "", psStringCopy (argv[N]));
 	    psArgumentRemove (N, argc, argv);
 	}
     }
 
-    // other arbitrary options: -D key value (all added as string)
+    // Parse command-line overrides of recipe values
+    psMetadata *recipe = psMetadataAlloc ();
+
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-photcode", 0, "photometry code", "NONE");
+    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "-break", 0, "", "NONE");
+    psMetadataAddS32 (config->arguments, PS_LIST_TAIL, "-fitmode", 0, "", 2);
+
+    // analysis region : XXX override recipe 
+    if ((N = psArgumentGet (*argc, argv, "-photcode"))) {
+	psArgumentRemove (N, argc, argv);
+	psMetadataAddStr (recipe, PS_LIST_TAIL, "PHOTCODE", PS_META_REPLACE, "", psStringCopy(argv[N]));
+	psArgumentRemove (N, argc, argv);
+    }
+
+    // analysis region : XXX override recipe 
+    if ((N = psArgumentGet (*argc, argv, "-break"))) {
+	psArgumentRemove (N, argc, argv);
+	psMetadataAddStr (recipe, PS_LIST_TAIL, "BREAK_POINT", PS_META_REPLACE, "", psStringCopy(argv[N]));
+	psArgumentRemove (N, argc, argv);
+    }
+
+    // analysis region : XXX override recipe 
+    if ((N = psArgumentGet (*argc, argv, "-fitmode"))) {
+	psArgumentRemove (N, argc, argv);
+	psMetadataAddStr (recipe, PS_LIST_TAIL, "FITMODE", PS_META_REPLACE, "", psStringCopy(argv[N]));
+	psArgumentRemove (N, argc, argv);
+    }
+
+    // analysis region : XXX override recipe 
+    if ((N = psArgumentGet (*argc, argv, "-region"))) {
+	psArgumentRemove (N, argc, argv);
+	psMetadataAddStr (recipe, PS_LIST_TAIL, "ANALYSIS_REGION", 0, "", psStringCopy(argv[N]));
+	psArgumentRemove (N, argc, argv);
+    }
+
+    // other arbitrary recipe values: -D key value (all added as string)
     while ((N = psArgumentGet (*argc, argv, "-D"))) {
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (options, PS_LIST_TAIL, argv[N], 0, "", argv[N+1]);
+	psMetadataAddStr (recipe, PS_LIST_TAIL, argv[N], 0, "", argv[N+1]);
 	psArgumentRemove (N, argc, argv);
 	psArgumentRemove (N, argc, argv);
     }
 
-    // other arbitrary options: -Df key value (all added as float)
+    // other arbitrary recipe values: -Df key value (all added as float)
     while ((N = psArgumentGet (*argc, argv, "-Df"))) {
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddF32 (options, PS_LIST_TAIL, argv[N], 0, "", atof(argv[N+1]));
+	psMetadataAddF32 (recipe, PS_LIST_TAIL, argv[N], 0, "", atof(argv[N+1]));
 	psArgumentRemove (N, argc, argv);
 	psArgumentRemove (N, argc, argv);
     }
 
-    // other arbitrary options: -Di key value (all added as int)
+    // other arbitrary recipe values: -Di key value (all added as int)
     while ((N = psArgumentGet (*argc, argv, "-Di"))) {
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddS32 (options, PS_LIST_TAIL, argv[N], 0, "", atoi(argv[N+1]));
+	psMetadataAddS32 (recipe, PS_LIST_TAIL, argv[N], 0, "", atoi(argv[N+1]));
 	psArgumentRemove (N, argc, argv);
 	psArgumentRemove (N, argc, argv);
     }
 
-    if (*argc != 4) usage ();
+    // place the recipe options on the arguments stack
+    psMetadataAddPtr (config->arguments, PS_LIST_TAIL, "RECIPE.OPTIONS", PS_DATA_UNKNOWN, "", recipe);
 
-    // load config information
-    psMetadata *config = psMetadataAlloc ();
+    if (!psArgumentParse(config->arguments, argc, argv)) usage (config->arguments);
+    if (*argc != 3) usage (config->arguments);
 
-    // add default values
-    psMetadataAddStr (config, PS_LIST_TAIL, "BREAK_POINT", 0, "", "NONE");
-    psMetadataAddS32 (config, PS_LIST_TAIL, "FIT_MODE", 0, "", 2);
-
-    psMetadataAdd (config, PS_LIST_TAIL, "PSF_MODEL", PS_DATA_METADATA_MULTI, "folder for psf model entries", NULL);
-
-    // config file values override defaults set here
-    config = psMetadataConfigParse (config, &Nfail, argv[3], TRUE);
-
-    psMetadataItem *item = NULL;
-    psMetadataIterator *iter = psMetadataIteratorAlloc (options, PS_LIST_HEAD, NULL);
-    while ((item = psMetadataGetAndIncrement (iter)) != NULL) {
-	psMetadataAddItem (config, item, PS_LIST_TAIL, PS_META_REPLACE);
-	psFree (item);
-    }
-    psFree (iter);
-
-    // identify input image & optional weight & mask images
-    // command-line entries override config-file entries
-    psMetadataAddStr (config, PS_LIST_TAIL, "IMAGE",       PS_META_REPLACE, "", argv[1]);
-    psMetadataAddStr (config, PS_LIST_TAIL, "OUTPUT_FILE", PS_META_REPLACE, "", argv[2]);
+    // input and output positions are fixed
+    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "-input",  PS_META_REPLACE, "", argv[1]);
+    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "-output", PS_META_REPLACE, "", argv[2]);
 
     return (config);
 }
 
-static void usage (void) {
+static void usage (psMetadata *arguments) {
 
-    fprintf (stderr, "USAGE: psphot (image) (output) (config)\n");
-    fprintf (stderr, "options: \n");
-    fprintf (stderr, "  -mask  (filename)\n");
-    fprintf (stderr, "  -weight (filename)\n");
-    fprintf (stderr, "  -resid (filename)\n");
-    fprintf (stderr, "  -photcode (photcode)\n");
+    fprintf (stderr, "USAGE: psphot (image) (output)\n");
+    psArgumentHelp (arguments);
     exit (2);
 }
