Index: trunk/psphot/src/psphotArguments.c
===================================================================
--- trunk/psphot/src/psphotArguments.c	(revision 6522)
+++ trunk/psphot/src/psphotArguments.c	(revision 6571)
@@ -1,7 +1,8 @@
 # include "psphot.h"
+# include <glob.h>
 
 static void usage (void);
 
-ppConfig *psphotArguments (int *argc, char **argv) {
+pmConfig *psphotArguments (int *argc, char **argv) {
 
     int N;
@@ -12,50 +13,97 @@
     psLogSetFormat ("M");
 
-    ppConfig *config = ppConfigAlloc ();
+    // these other options override the PSPHOT recipe options
+    psMetadata *options = psMetadataAlloc ();
 
-    // 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);
+    // 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]));
+
+	psArgumentRemove (N, argc, argv);
+	psArgumentRemove (N, argc, argv);
+	psArgumentRemove (N, argc, argv);
+
+	// specify the modeltest model
+	if ((N = psArgumentGet (*argc, argv, "-model"))) {
+	    psArgumentRemove (N, argc, argv);
+	    psMetadataAddStr (options, PS_LIST_TAIL, "TEST_FIT_MODEL", 0, "", argv[N]);
+	    psArgumentRemove (N, argc, argv);
+	}
+
+	// specify the test fit mode
+	if ((N = psArgumentGet (*argc, argv, "-fitmode"))) {
+	    psArgumentRemove (N, argc, argv);
+	    psMetadataAddStr (options, PS_LIST_TAIL, "TEST_FIT_MODE", 0, "", 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, "", argv[N]);
+	    psArgumentRemove (N, argc, argv);
+	}
     }
 
-    // Parse other command-line arguments
-    config->arguments = psMetadataAlloc ();
-
-    // arguments (must be supplied for each run, or not used)
-    // mask image (input) is used by psphotImageLoop
-    if ((N = psArgumentGet (*argc, argv, "-mask"))) {
+    // photcode : used in output to supplement header data (argument or recipe?)
+    if ((N = psArgumentGet (*argc, argv, "-photcode"))) {
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->arguments, PS_LIST_TAIL, "MASK_IMAGE", PS_META_REPLACE, "", argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "PHOTCODE", PS_META_REPLACE, "", argv[N]);
 	psArgumentRemove (N, argc, argv);
     }
 
-    // weight image (input) is used by psphotImageLoop
-    if ((N = psArgumentGet (*argc, argv, "-weight"))) {
+    // break : used from recipe throughout psphotReadout 
+    if ((N = psArgumentGet (*argc, argv, "-break"))) {
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->arguments, PS_LIST_TAIL, "WEIGHT_IMAGE", PS_META_REPLACE, "", argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "BREAK_POINT", PS_META_REPLACE, "", argv[N]);
 	psArgumentRemove (N, argc, argv);
     }
 
-    // residual image (output) is used by psphotOutput
-    if ((N = psArgumentGet (*argc, argv, "-resid"))) {
+    // fitmode : used from recipe throughout psphotReadout 
+    if ((N = psArgumentGet (*argc, argv, "-fitmode"))) {
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->arguments, PS_LIST_TAIL, "RESID_IMAGE", PS_META_REPLACE, "", argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "FITMODE", PS_META_REPLACE, "", argv[N]);
 	psArgumentRemove (N, argc, argv);
     }
 
-    // background image (output) is used by psphotOutput
-    if ((N = psArgumentGet (*argc, argv, "-background"))) {
+    // analysis region : overrides recipe value, used in psphotReadout/psphotEnsemblePSF
+    if ((N = psArgumentGet (*argc, argv, "-region"))) {
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->arguments, PS_LIST_TAIL, "BACKGROUND_IMAGE", PS_META_REPLACE, "", argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "ANALYSIS_REGION", 0, "", argv[N]);
 	psArgumentRemove (N, argc, argv);
     }
 
-    // background model (output) is used by psphotOutput
-    if ((N = psArgumentGet (*argc, argv, "-backmodel"))) {
+    // other arbitrary recipe values: -D key value (all added as string)
+    while ((N = psArgumentGet (*argc, argv, "-D"))) {
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->arguments, PS_LIST_TAIL, "BACKGROUND_MODEL", PS_META_REPLACE, "", argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, argv[N], 0, "", argv[N+1]);
+	psArgumentRemove (N, argc, argv);
 	psArgumentRemove (N, argc, argv);
     }
+
+    // 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]));
+	psArgumentRemove (N, argc, argv);
+	psArgumentRemove (N, argc, argv);
+    }
+
+    // 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]));
+	psArgumentRemove (N, argc, argv);
+	psArgumentRemove (N, argc, argv);
+    }
+
+    // load config data from default locations 
+    pmConfig *config = pmConfigRead(argc, argv, PSPHOT_RECIPE);
+
+    // Storage for other command-line arguments
+    config->arguments = psMetadataAlloc ();
+
+    // save these recipe options until we have loaded the options
+    psMetadataAddPtr (config->arguments, PS_LIST_TAIL, "PSPHOT.OPTIONS",  PS_META_REPLACE, "", options);
 
     // chip selection is used to limit chips to be processed
@@ -66,108 +114,58 @@
     }
 
-    // run the test model (requires X,Y coordinate)
-    if ((N = psArgumentGet (*argc, argv, "-modeltest"))) {
-	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]));
+    // we load all input files onto a psArray, to be parsed later
+    psArray *input = psArrayAlloc (16);
 
+    // load the list of filenames the supplied file (may be a glob: "file*.fits")
+    if ((N = psArgumentGet (*argc, argv, "-file"))) {
+	glob_t globList;
 	psArgumentRemove (N, argc, argv);
-	psArgumentRemove (N, argc, argv);
-	psArgumentRemove (N, argc, argv);
-
-	// specify the modeltest model
-	if ((N = psArgumentGet (*argc, argv, "-model"))) {
-	    psArgumentRemove (N, argc, argv);
-	    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "TEST_FIT_MODEL", 0, "", argv[N]);
-	    psArgumentRemove (N, argc, argv);
+	globList.gl_offs = 0;
+	glob (argv[N], 0, NULL, &globList);
+	for (int i = 0; i < globList.gl_pathc; i++) {
+	    char *filename = psStringCopy (globList.gl_pathv[i]);
+	    psArrayAdd (input, 16, filename);
 	}
-
-	// specify the test fit mode
-	if ((N = psArgumentGet (*argc, argv, "-fitmode"))) {
-	    psArgumentRemove (N, argc, argv);
-	    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "TEST_FIT_MODE", 0, "", argv[N]);
-	    psArgumentRemove (N, argc, argv);
-	}
-	if ((N = psArgumentGet (*argc, argv, "-fitset"))) {
-	    psArgumentRemove (N, argc, argv);
-	    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "TEST_FIT_SET", 0, "", argv[N]);
-	    psArgumentRemove (N, argc, argv);
-	}
-    }
-
-    // these other options override the recipe options
-    config->options = psMetadataAlloc ();
-
-    // PSF : optional psf file to be loaded
-    if ((N = psArgumentGet (*argc, argv, "-psf"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->options, PS_LIST_TAIL, "PSF_INPUT_FILE", PS_META_REPLACE, "", argv[N]);
 	psArgumentRemove (N, argc, argv);
     }
 
-    // PSF : optional psf file to be loaded
-    if ((N = psArgumentGet (*argc, argv, "-psfout"))) {
+    // load the list from the supplied text file
+    if ((N = psArgumentGet (*argc, argv, "-list"))) {
+	int nItems;
+	char line[1024]; // XXX limits the list lines to 1024 chars
+	char word[1024];
+	char *filename;
+
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->options, PS_LIST_TAIL, "PSF_OUTPUT_FILE", PS_META_REPLACE, "", argv[N]);
+	FILE *f = fopen (argv[N], "r");
+	if (f == NULL) {
+	    psAbort ("psphot", "unable to open specified list file");
+	}
+	while (fgets (line, 1024, f) != NULL) {
+	    nItems = sscanf (line, "%s", word);
+	    switch (nItems) {
+	      case 0:
+		break;
+	      case 1:
+		filename = psStringCopy (word);
+		psArrayAdd (input, 16, filename);
+		break;
+	      default:
+		// rigid format, no comments allowed?
+		psAbort ("psphot", "error parsing input list file");
+		break;
+	    }
+	}
 	psArgumentRemove (N, argc, argv);
-    }
+    }		
+    if (input->n < 1) usage ();
 
-    // photcode : used in output to supplement header data (argument or recipe?)
-    if ((N = psArgumentGet (*argc, argv, "-photcode"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->options, PS_LIST_TAIL, "PHOTCODE", PS_META_REPLACE, "", argv[N]);
-	psArgumentRemove (N, argc, argv);
-    }
+    // input list gets places as an array on the config->arguements list
+    psMetadataAddPtr (config->arguments, PS_LIST_TAIL, "INPUT",  PS_META_REPLACE, "", input);
 
-    // break : used from recipe throughout psphotReadout 
-    if ((N = psArgumentGet (*argc, argv, "-break"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->options, PS_LIST_TAIL, "BREAK_POINT", PS_META_REPLACE, "", argv[N]);
-	psArgumentRemove (N, argc, argv);
-    }
-
-    // fitmode : used from recipe throughout psphotReadout 
-    if ((N = psArgumentGet (*argc, argv, "-fitmode"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->options, PS_LIST_TAIL, "FITMODE", PS_META_REPLACE, "", argv[N]);
-	psArgumentRemove (N, argc, argv);
-    }
-
-    // analysis region : overrides recipe value, used in psphotReadout/psphotEnsemblePSF
-    if ((N = psArgumentGet (*argc, argv, "-region"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->options, PS_LIST_TAIL, "ANALYSIS_REGION", 0, "", 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 (config->options, PS_LIST_TAIL, argv[N], 0, "", argv[N+1]);
-	psArgumentRemove (N, argc, argv);
-	psArgumentRemove (N, argc, argv);
-    }
-
-    // other arbitrary recipe values: -Df key value (all added as float)
-    while ((N = psArgumentGet (*argc, argv, "-Df"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddF32 (config->options, PS_LIST_TAIL, argv[N], 0, "", atof(argv[N+1]));
-	psArgumentRemove (N, argc, argv);
-	psArgumentRemove (N, argc, argv);
-    }
-
-    // other arbitrary recipe values: -Di key value (all added as int)
-    while ((N = psArgumentGet (*argc, argv, "-Di"))) {
-	psArgumentRemove (N, argc, argv);
-	psMetadataAddS32 (config->options, PS_LIST_TAIL, argv[N], 0, "", atoi(argv[N+1]));
-	psArgumentRemove (N, argc, argv);
-	psArgumentRemove (N, argc, argv);
-    }
-
-    if (*argc != 3) usage ();
+    if (*argc != 2) usage ();
 
     // input and output positions are fixed
-    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "INPUT_FILE",  PS_META_REPLACE, "", argv[1]);
-    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "OUTPUT_ROOT", PS_META_REPLACE, "", argv[2]);
+    psMetadataAddStr (config->arguments, PS_LIST_TAIL, "OUTPUT", PS_META_REPLACE, "", argv[1]);
 
     psTrace(__func__, 1, "Done with psphotArguments...\n");
@@ -176,5 +174,5 @@
 
 static void usage (void) {
-    fprintf (stderr, "USAGE: psphot (image) (output)\n");
+    fprintf (stderr, "USAGE: psphot [-file image(s)] [-list imagelist] (output)\n");
     exit (2);
 }
