Index: /branches/czw_branch/20120906/ppStack/src/Makefile.am
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/Makefile.am	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/Makefile.am	(revision 34666)
@@ -1,3 +1,3 @@
-bin_PROGRAMS = ppStack
+bin_PROGRAMS = ppStack ppStackMedian
 
 if HAVE_SVNVERSION
@@ -25,4 +25,7 @@
 ppStack_LDFLAGS = $(PSLIB_LIBS)   $(PSMODULE_LIBS)   $(PSPHOT_LIBS)   $(PPSTATS_LIBS)   $(PPSTACK_LIBS)
 
+ppStackMedian_CFLAGS 	= $(PSLIB_CFLAGS) $(PSMODULE_CFLAGS) $(PSPHOT_CFLAGS) $(PPSTATS_CFLAGS) $(PPSTACK_CFLAGS)
+ppStackMedian_LDFLAGS = $(PSLIB_LIBS)   $(PSMODULE_LIBS)   $(PSPHOT_LIBS)   $(PPSTATS_LIBS)   $(PPSTACK_LIBS)
+
 ppStack_SOURCES =		\
 	ppStack.c		\
@@ -43,4 +46,35 @@
 	ppStackCombinePrepare.c	\
 	ppStackCombineInitial.c	\
+	ppStackCombineAlternate.c	\
+	ppStackReject.c		\
+	ppStackCombineFinal.c	\
+	ppStackCleanup.c	\
+	ppStackPhotometry.c	\
+	ppStackFinish.c		\
+	ppStackTarget.c		\
+	ppStackUpdateHeader.c	\
+	ppStackJPEGs.c		\
+	ppStackStats.c		\
+	ppStackErrorCodes.c
+
+ppStackMedian_SOURCES =		\
+	ppStackMedian.c		\
+	ppStackArguments.c	\
+	ppStackCamera.c		\
+	ppStackFiles.c		\
+	ppStackMedianLoop.c		\
+	ppStackPSF.c		\
+	ppStackReadout.c	\
+	ppStackVersion.c	\
+	ppStackMatch.c		\
+	ppStackSources.c	\
+	ppStackThread.c		\
+	ppStackOptions.c	\
+	ppStackSetup.c		\
+	ppStackPrepare.c	\
+	ppStackConvolve.c	\
+	ppStackCombinePrepare.c	\
+	ppStackCombineInitial.c	\
+	ppStackCombineAlternate.c	\
 	ppStackReject.c		\
 	ppStackCombineFinal.c	\
Index: /branches/czw_branch/20120906/ppStack/src/ppStack.h
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStack.h	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStack.h	(revision 34666)
@@ -39,5 +39,7 @@
     PPSTACK_FILES_UNCONV,               // Unconvolved stack files
     PPSTACK_FILES_PHOT,                 // Files for photometry
-    PPSTACK_FILES_BKG                   // Files for bkg
+    PPSTACK_FILES_BKG,                  // Files for bkg
+    PPSTACK_FILES_MEDIAN,                // Files for median only stacks.
+    PPSTACK_FILES_MINIMAL                // Files for median only stacks.
 } ppStackFileList;
 
@@ -114,4 +116,5 @@
 // Perform median stacking for background
 bool ppStackCombineBackground(ppStackThreadData *stack, ppStackOptions *options, pmConfig *config);
+bool ppStackCombineMedian(ppStackThreadData *stack, ppStackOptions *options, pmConfig *config);
 
 // Return software version
Index: /branches/czw_branch/20120906/ppStack/src/ppStackArguments.c
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackArguments.c	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackArguments.c	(revision 34666)
@@ -324,4 +324,5 @@
     }
 
+    
     psTrace("ppStack", 1, "Done parsing arguments\n");
 
Index: /branches/czw_branch/20120906/ppStack/src/ppStackCleanup.c
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackCleanup.c	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackCleanup.c	(revision 34666)
@@ -22,14 +22,20 @@
     options->outRO = NULL;
 
-    options->expRO->data_exists = false;
-    options->expRO->parent->data_exists = false;
-    options->expRO->parent->parent->data_exists = false;
-    psFree(options->expRO);
-    options->expRO = NULL;
+    if (options->expRO) {
+      options->expRO->data_exists = false;
+      if (options->expRO->parent) {
+	options->expRO->parent->data_exists = false;
+	options->expRO->parent->parent->data_exists = false;
+      }
+      psFree(options->expRO);
+      options->expRO = NULL;
+    }
 
     if (options->bkgRO) {
       options->bkgRO->data_exists = false;
-      options->bkgRO->parent->data_exists = false;
-      options->bkgRO->parent->parent->data_exists = false;
+      if (options->bkgRO->parent) {
+	options->bkgRO->parent->data_exists = false;
+	options->bkgRO->parent->parent->data_exists = false;
+      }
       psFree(options->bkgRO);
       options->bkgRO = NULL;
Index: /branches/czw_branch/20120906/ppStack/src/ppStackCombineFinal.c
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackCombineFinal.c	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackCombineFinal.c	(revision 34666)
@@ -3,61 +3,4 @@
 // This is the doomsday switch.
 // #define TESTING                         // Enable test output
-bool ppStackCombineBackground(ppStackThreadData *stack, ppStackOptions *options, pmConfig *config)
-{
-  psAssert(stack, "Require stack");
-  psAssert(options, "Require options");
-  psAssert(config, "Require configuration");
-
-  psTimerStart("PPSTACK_BKGMED");
-
-
-  pmReadout *bkgRO = options->bkgRO;
-  
-  psArray *inputs  = psArrayAlloc(options->num);
-  for (int i = 0; i < options->num; i++) {
-    ppStackFileActivationSingle(config, PPSTACK_FILES_BKG, true, i);
-    pmFPAfile *file = pmFPAfileSelectSingle(config->files, "PPSTACK.INPUT.BKGMODEL", i);
-    pmFPAview *view = ppStackFilesIterateDown(config);
-    pmReadout *ro = pmFPAviewThisReadout(view,file->fpa);
-    inputs->data[i] = ro;
-    pmFPAfileClose(file,view);
-  }
-  if (!pmStackSimpleMedianCombine(bkgRO,inputs)) {
-    psFree(inputs);
-    return(false);
-  }
-#if 0
-  if (!ppStackWriteImage("/tmp/test_forced.bkgmdl.fits",
-			 bkgRO->parent->parent->parent->hdu->header,
-			 bkgRO->image,
-			 config)) {
-    fprintf(stderr,"Failed to write image because fail.\n");
-  }
-#endif
-  for (int i = 0; i < options->num; i++) {
-    pmFPAfile *file = pmFPAfileSelectSingle(config->files, "PPSTACK.INPUT.BKGMODEL", i);
-    pmFPAview *view = ppStackFilesIterateDown(config);
-    bool success = pmFPAfileClose(file,view);
-    if (!success) {
-      psTrace("ppStack",5,"I failed at closing a file.\n");
-    }
-	      
-    psFitsClose(file->fits);
-    file->fits = NULL;
-    file->header = NULL;
-    file->state = PM_FPA_STATE_CLOSED;
-    file->wrote_phu = false;
-    ppStackFileActivationSingle(config, PPSTACK_FILES_BKG, false, i);
-  }
-  psFree(inputs);
-  bkgRO->data_exists = true;
-  bkgRO->parent->data_exists = true;
-  bkgRO->parent->parent->data_exists = true;
-  
-  return(true);
-}
-  
-
-
 
 bool ppStackCombineFinal(ppStackThreadData *stack, psArray *covariances, ppStackOptions *options,
Index: /branches/czw_branch/20120906/ppStack/src/ppStackCombinePrepare.c
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackCombinePrepare.c	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackCombinePrepare.c	(revision 34666)
@@ -62,4 +62,7 @@
 
     }
+    else {
+      options->bkgRO = NULL;
+    }
 
     psFree(view);
Index: /branches/czw_branch/20120906/ppStack/src/ppStackFiles.c
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackFiles.c	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackFiles.c	(revision 34666)
@@ -17,4 +17,11 @@
 /// Files required for the background
 static char *filesBkg[] = { "PPSTACK.INPUT.BKGMODEL", NULL };
+
+/// Files required for median only stacking
+static char *filesMedian[] =  { "PPSTACK.INPUT",                              			     
+                              NULL };
+/// Files required for median only stacking
+static char *filesMinimal[] =  { "PPSTACK.OUTPUT",                              			     
+                              NULL };
 
 /// Regular (convolved) stack files
@@ -46,4 +53,6 @@
       case PPSTACK_FILES_PHOT:     return filesPhot;
     case PPSTACK_FILES_BKG:        return filesBkg;
+    case PPSTACK_FILES_MEDIAN:        return filesMedian;
+    case PPSTACK_FILES_MINIMAL:        return filesMinimal;
       default:
         psAbort("Unrecognised file list: %x", list);
Index: /branches/czw_branch/20120906/ppStack/src/ppStackLoop.h
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackLoop.h	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackLoop.h	(revision 34666)
@@ -4,4 +4,9 @@
 // Loop over the inputs, doing the combination
 bool ppStackLoop(
+    pmConfig *config,                    // Configuration
+    ppStackOptions *options             // Options for stacking
+    );
+// Median only loop.
+bool ppStackMedianLoop(
     pmConfig *config,                    // Configuration
     ppStackOptions *options             // Options for stacking
Index: /branches/czw_branch/20120906/ppStack/src/ppStackPrepare.c
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackPrepare.c	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackPrepare.c	(revision 34666)
@@ -132,4 +132,5 @@
     psVectorInit(options->inputMask, 0);
     options->exposures = psVectorAlloc(options->num, PS_TYPE_F32);
+
     psVectorInit(options->exposures, NAN);
 
@@ -150,4 +151,8 @@
 
         options->exposures->data.F32[i] = psMetadataLookupF32(NULL, cell->concepts, "CELL.EXPOSURE");
+	if ((options->exposures->data.F32[i] == 0)||
+	    (!(isfinite(options->exposures->data.F32[i])))){
+	  options->exposures->data.F32[i] = psMetadataLookupF32(NULL,recipe,"DEFAULT.EXPTIME");
+	}
         options->sumExposure += options->exposures->data.F32[i];
 
Index: /branches/czw_branch/20120906/ppStack/src/ppStackSetup.c
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackSetup.c	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackSetup.c	(revision 34666)
@@ -91,4 +91,6 @@
     options->bkgImages = psArrayAlloc(num);
     pmFPAview *view = pmFPAviewAlloc(0);
+    int nullMasks = 0;
+    int nullVariances = 0;
     for (int i = 0; i < num; i++) {
         {
@@ -98,9 +100,21 @@
         {
             // We want the convolved mask, since that defines the area that has been tested for outliers
+	  if (options->convolve) {
             options->origMasks->data[i] = psMemIncrRefCounter(options->convMasks->data[i]);
+	  }
+	  else {
+	    pmFPAfile *file = pmFPAfileSelectSingle(config->files, "PPSTACK.INPUT.MASK", i);
+	    options->origMasks->data[i] = pmFPAfileName(file, view, config);
+	  }
+	  if (!(options->origMasks->data[i])) {
+	    nullMasks++;
+	  }
         }
         {
             pmFPAfile *file = pmFPAfileSelectSingle(config->files, "PPSTACK.INPUT.VARIANCE", i);
             options->origVariances->data[i] = pmFPAfileName(file, view, config);
+	    if (!(options->origVariances->data[i])) {
+	      nullVariances++;
+	    }
         }
 /* 	{ */
@@ -109,4 +123,11 @@
 /* 	} */
     }
+    if (nullMasks == num) {
+      psFree(options->origMasks);
+    }
+    if (nullVariances == num) {
+      psFree(options->origVariances);
+    }
+    
     psFree(view);
 
Index: /branches/czw_branch/20120906/ppStack/src/ppStackThread.c
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackThread.c	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackThread.c	(revision 34666)
@@ -68,5 +68,5 @@
         PS_ASSERT_ARRAYS_SIZE_EQUAL(cells, covariances, NULL);
     }
-
+    
     ppStackThreadData *stack = psAlloc(sizeof(ppStackThreadData)); // Thread data, to return
     psMemSetDeallocator(stack, (psFreeFunc)stackThreadDataFree);
@@ -97,7 +97,14 @@
             psFree(resolved); \
         }
+	fprintf(stderr,"ppST:99 %s %s\n",pmConfigConvertFilename(imageNames->data[i], config, false, false),
+		(char*)imageNames->data[i]);
+		
         IMAGE_OPEN(imageNames, stack->imageFits, i);
-        IMAGE_OPEN(maskNames, stack->maskFits, i);
-        IMAGE_OPEN(varianceNames, stack->varianceFits, i);
+	if (maskNames) {
+	  IMAGE_OPEN(maskNames, stack->maskFits, i);
+	}
+	if (varianceNames) {
+	  IMAGE_OPEN(varianceNames, stack->varianceFits, i);
+	}
     }
 
Index: /branches/czw_branch/20120906/ppStack/src/ppStackUpdateHeader.c
===================================================================
--- /branches/czw_branch/20120906/ppStack/src/ppStackUpdateHeader.c	(revision 34665)
+++ /branches/czw_branch/20120906/ppStack/src/ppStackUpdateHeader.c	(revision 34666)
@@ -11,5 +11,5 @@
     bool wcsDone = false;           // Have we done the WCS?
     for (int i = 0; i < options->num && !wcsDone; i++) {
-        if (options->inputMask->data.PS_TYPE_VECTOR_MASK_DATA[i]) {
+      if ((options->inputMask)&&(options->inputMask->data.PS_TYPE_VECTOR_MASK_DATA[i])) {
             continue;
         }
@@ -127,18 +127,19 @@
 
     // Copy information into expRO, because it should be there too.
-    pmHDU *expROhdu = pmHDUFromCell(expRO->parent);
-    if (!expROhdu->header) {
-      expROhdu->header = psMetadataAlloc();
+    if ((expRO)&&(expRO->parent)) {
+      pmHDU *expROhdu = pmHDUFromCell(expRO->parent);
+      if (!expROhdu->header) {
+	expROhdu->header = psMetadataAlloc();
+      }
+      expRO->parent->parent->parent->hdu->header = psMetadataCopy(expRO->parent->parent->parent->hdu->header,
+								  outRO->parent->parent->parent->hdu->header);
+      
+      expRO->parent->concepts = psMetadataCopy(expRO->parent->concepts,
+					       outRO->parent->concepts);
+      expRO->parent->parent->concepts = psMetadataCopy(expRO->parent->parent->concepts,
+						       outRO->parent->concepts);
+      expRO->parent->parent->parent->concepts = psMetadataCopy(expRO->parent->parent->parent->concepts,
+							       outRO->parent->parent->parent->concepts);
     }
-    expRO->parent->parent->parent->hdu->header = psMetadataCopy(expRO->parent->parent->parent->hdu->header,
-								outRO->parent->parent->parent->hdu->header);
-    
-    expRO->parent->concepts = psMetadataCopy(expRO->parent->concepts,
-					     outRO->parent->concepts);
-    expRO->parent->parent->concepts = psMetadataCopy(expRO->parent->parent->concepts,
-						     outRO->parent->concepts);
-    expRO->parent->parent->parent->concepts = psMetadataCopy(expRO->parent->parent->parent->concepts,
-							     outRO->parent->parent->parent->concepts);
-    
     
     return true;
