Index: trunk/psphot/src/setup.c
===================================================================
--- trunk/psphot/src/setup.c	(revision 4114)
+++ 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"));
 
