Index: /trunk/psphot/src/find_peaks.c
===================================================================
--- /trunk/psphot/src/find_peaks.c	(revision 4188)
+++ /trunk/psphot/src/find_peaks.c	(revision 4189)
@@ -19,9 +19,6 @@
     psImageSmooth (smooth, SIGMA, NSIGMA);
 
-    // XXX missing pslib functions:
-    // kernel = psKernelParts ();
-    // smooth = psImageConvolve (smooth, image, kernel, PS_PARTS);
+    psLogMsg ("psphot", 4, "smooth: %f sec\n", psTimerMark ("psphot"));
 
-    psLogMsg ("psphot", 4, "smooth: %f sec\n", psTimerMark ("psphot"));
 
     // find the peaks in the smoothed image 
Index: /trunk/psphot/src/load_args.c
===================================================================
--- /trunk/psphot/src/load_args.c	(revision 4189)
+++ /trunk/psphot/src/load_args.c	(revision 4189)
@@ -0,0 +1,43 @@
+# include "psphot.h"
+
+psMetadata *load_args (int *argc, char **argv) {
+
+  // identify options in args list - these go on config 
+
+  char *mask = NULL;
+  if ((N = get_argument (*argc, argv, "--mask"))) {
+    remove_argument (N, argc, argv);
+    mask = psStringCopy (argv[N]);
+    remove_argument (N, argc, argv);
+  }
+
+  char *noise = NULL;
+  if ((N = get_argument (*argc, argv, "--noise"))) {
+    remove_argument (N, argc, argv);
+    noise = psStringCopy (argv[N]);
+    remove_argument (N, argc, argv);
+  }
+
+  if (argc != 4) usage ();
+
+  psMetadata *config = psMetadataParseConfig (NULL, &Nfail, argv[3], FALSE);
+
+  psMetadataAddStr (config, PS_LIST_HEAD, "INPUT",  "", argv[1]);
+  psMetadataAddStr (config, PS_LIST_HEAD, "OUTPUT", "", argv[2]);
+  if (mask != NULL) {
+    psMetadataAddStr (config, PS_LIST_HEAD, "MASK", "", mask);
+  }
+  if (noise != NULL) {
+    psMetadataAddStr (config, PS_LIST_HEAD, "NOISE", "", noise);
+  }
+  return (config);
+}
+
+int usage () {
+
+    fprintf (stderr, "USAGE: psphot (image.fits) (output.fits) (config)\n");
+    fprintf (stderr, "options: \n");
+    fprintf (stderr, "  --mask  (filename)");
+    fprintf (stderr, "  --noise (filename)");
+    exit (2);
+}
Index: /trunk/psphot/src/psphot.c
===================================================================
--- /trunk/psphot/src/psphot.c	(revision 4188)
+++ /trunk/psphot/src/psphot.c	(revision 4189)
@@ -7,4 +7,6 @@
     psMetadata *header  = NULL;		// input image header
     psImage    *image   = NULL;		// input image data
+    psImage    *noise   = NULL;		// input image data
+    psImage    *mask    = NULL;		// input image data
     psArray    *sources = NULL;
     psArray    *peaks   = NULL;		// a list of pmPeaks 
@@ -14,8 +16,9 @@
     psLogArguments (&argc, argv);
     psTraceArguments (&argc, argv);
-    if (argc != 4) usage ();
+    config = load_args (&argc, argv);
 
     // load input data (image and config)
-    setup (&image, &header, &config, argv);
+    // create or load mask and noise images
+    setup (&image, &mask, &noise, &header, config);
 
     // measure image stats for initial guess 
@@ -58,10 +61,4 @@
 }
 
-int usage () {
-
-    fprintf (stderr, "USAGE: psphot (image.fits) (output.fits) (config)\n");
-    exit (2);
-}
-
 void dump_image (psImage *image, char *filename) {
 
Index: /trunk/psphot/src/setup.c
===================================================================
--- /trunk/psphot/src/setup.c	(revision 4188)
+++ /trunk/psphot/src/setup.c	(revision 4189)
@@ -1,5 +1,5 @@
 # include "psphot.h"
 
-bool setup (psImage **image, psMetadata **header, psMetadata **config, char **argv) 
+bool setup (psImage **image, psImage **mask, psImage **noise, psMetadata **header, psMetadata **config) 
 {
     int       Nfail;
@@ -9,7 +9,6 @@
     psTimerStart ("psphot");
 
-    *config = psMetadataParseConfig (NULL, &Nfail, argv[3], FALSE);
-
-    file   = psFitsAlloc (argv[1]);
+    char *input = pmConfigLookupSTR (&status, *config, *header, "INPUT");
+    file = psFitsAlloc (input);
 
     *header = psMetadataAlloc ();
@@ -27,4 +26,29 @@
     psMetadataAdd (*config, PS_LIST_TAIL, "GAIN",    PS_META_F32 | PS_META_REPLACE, "gain value used", GAIN);
 
+    // load the noise image if it exists, otherwise build from input
+    char *noiseName = pmConfigLookupSTR (&status, *config, *header, "NOISE");
+    if (status == true) {
+      file = psFitsAlloc (noiseName);
+      *noise  = psFitsReadImage  (*noise, file, region, 0);
+      psFree (file);
+    } else {
+      *value = psScalar (1.0 / GAIN);
+      *noise = BinaryOp (NULL, *image, '/', value);
+      psFree (value);
+
+      *value = psScalar (PS_SQR(RDNOISE/GAIN));
+      *noise = BinaryOp (*noise, *noise, '+', value);
+      psFree (value);
+    }
+
+    char *maskName = pmConfigLookupSTR (&status, *config, *header, "MASK");
+    if (status == true) {
+      file = psFitsAlloc (maskName);
+      *mask  = psFitsReadImage  (*mask, file, region, 0);
+      psFree (file);
+    } else {
+      *mask = psImageAlloc (image->numCols, image->numRows, PS_TYPE_U8);
+    }
+
     psLogMsg ("psphot", 3, "load data: %f sec\n", psTimerMark ("psphot"));
 
