Index: trunk/ppBackground/src/ppBackgroundStackMath.c
===================================================================
--- trunk/ppBackground/src/ppBackgroundStackMath.c	(revision 36580)
+++ trunk/ppBackground/src/ppBackgroundStackMath.c	(revision 36615)
@@ -20,4 +20,7 @@
 #include "ppBackgroundStack.h"
 
+// data->models->name->XY__->{image/ra/dec/calibrated/offset/scale}
+// data->models->counter->XY__->{image/ra/dec/calibrated/offset/scale}
+
 //
 // Determine the best OTA-to-OTA solution for this set of exposures/chips.
@@ -26,10 +29,9 @@
 // solution_{OTA}(u,v) = < data_{OTA}(u,v) >_{exposures}
 bool ppBackgroundStackModelFitOTASolution(ppBackgroundStackData *data) {
-  long i;
-  int u,v;
-  pmFPAview *view    = pmFPAviewAlloc(0);
+  int u,v;
   psMetadataIterator *iter = psMetadataIteratorAlloc(data->OTA_solutions, PS_LIST_HEAD, NULL); // Iterate over all chips.
   psMetadataItem *item;
   psStats *stats = psStatsAlloc( PS_STAT_ROBUST_MEDIAN );
+  psS16 N = psMetadataLookupS16(NULL, data->models, "N");
   
   while ((item = psMetadataGetAndIncrement(iter))) {
@@ -43,30 +45,28 @@
     for (v = 0; v < solution->numRows; v++) {
       for (u = 0; u < solution->numCols; u++) {
-	psVector *tmp = psVectorAllocEmpty(data->smfs->n,PS_TYPE_F32);	
-	
-	for (i = 0; i < data->smfs->n; i++) {
-	  pmFPAviewReset(view);
-	  pmFPAfile *smfFile = data->smfs->data[i];
-	  
-	  pmChip *chip;                       // Chip from FPA
-	  while ((chip = pmFPAviewNextChip(view, smfFile->fpa, 1))) { 
-	    if (!chip->process || !chip->file_exists) { 
-	      continue;
-	    }
-	    const char *chipName = psMetadataLookupStr(NULL, chip->concepts, "CHIP.NAME"); // Name of chip
-	    if (workingChip && strcmp(chipName, workingChip) != 0) { // Is this chip the one we want?
-	      continue;
-	    }
-	    psImage *image = psMetadataLookupPtr(NULL,chip->concepts, "bkg image");
-	    psVectorAppend(tmp,image->data.F32[v][u]);
-	  } // End chip scan
-	} // End smf scan
+
+	psVector *tmp = psVectorAllocEmpty(N,PS_TYPE_F32);	
+
+	psMetadataIterator *expIter = psMetadataIteratorAlloc(data->models, PS_LIST_HEAD, NULL);
+	psMetadataItem *expItem;
+	while ((expItem = psMetadataGetAndIncrement(expIter))) {
+	  if (expItem->type != PS_DATA_METADATA) {
+	    continue; // This is the N counter
+	  }
+	  psMetadata *chipData = psMetadataLookupPtr(NULL, expItem->data.md, workingChip);
+	  psImage *image      = psMetadataLookupPtr(NULL, chipData, "bkg image");
+	  psVectorAppend(tmp,image->data.F32[v][u]);
+	} // End loop over exposures
 	psStatsInit(stats);
 	psVectorStats(stats,tmp,NULL,NULL,0);
 	solution->data.F32[v][u] = stats->robustMedian;
+
+	psFree(expIter);
       } // End u
     } // End v
   } // End working chip scan
 
+  psFree(iter);
+  psFree(stats);
   return(true);
 }
@@ -78,20 +78,19 @@
 // FOR: scale, offset
 bool ppBackgroundStackDataModelFit(ppBackgroundStackData *data) {
-  long i;
-  int u,v;
-  
-  pmFPAview *view    = pmFPAviewAlloc(0);
-  for (i = 0; i < data->smfs->n; i++) {
-    pmFPAviewReset(view);
-    pmFPAfile *smfFile = data->smfs->data[i];
+  int u,v;
+
+  psMetadataIterator *expIter = psMetadataIteratorAlloc(data->models, PS_LIST_HEAD, NULL);
+  psMetadataItem *expItem;
+  while ((expItem = psMetadataGetAndIncrement(expIter))) {
+    if (expItem->type != PS_DATA_METADATA) {
+      continue; // This is the N counter
+    }
     
-    pmChip *chip;                       // Chip from FPA
-    while ((chip = pmFPAviewNextChip(view, smfFile->fpa, 1))) {
-      if (!chip->process || !chip->file_exists) {
-	continue;
-      }
-      psImage *image = psMetadataLookupPtr(NULL, chip->concepts, "bkg image");
-      psImage *ra    = psMetadataLookupPtr(NULL, chip->concepts, "bkg ra");
-      psImage *dec   = psMetadataLookupPtr(NULL, chip->concepts, "bkg dec");
+    psMetadataIterator *chipIter = psMetadataIteratorAlloc(expItem->data.md, PS_LIST_HEAD, NULL);
+    psMetadataItem *chipItem;
+    while ((chipItem = psMetadataGetAndIncrement(chipIter))) {
+      psImage *image = psMetadataLookupPtr(NULL, chipItem->data.md, "bkg image");
+      psImage *ra    = psMetadataLookupPtr(NULL, chipItem->data.md, "bkg ra");
+      psImage *dec   = psMetadataLookupPtr(NULL, chipItem->data.md, "bkg dec");
       
       psVector *obs  = psVectorAlloc(image->numRows * image->numCols, PS_TYPE_F32);
@@ -108,11 +107,12 @@
       int status = psVectorFitPolynomial1D(poly,NULL,0,model,NULL,obs);
       if (!status) {
-	psMetadataAddF32(chip->analysis,PS_LIST_TAIL,"bkg offset", PS_META_REPLACE, "background offset for this exposure/ota pair", poly->coeff[0]);
-	psMetadataAddF32(chip->analysis,PS_LIST_TAIL,"bkg scale", PS_META_REPLACE, "background scale for this exposure/ota pair", poly->coeff[1]);
-      }
-      //      psFree(tmp);
+	psMetadataAddF32(chipItem->data.md,PS_LIST_TAIL,"bkg offset", PS_META_REPLACE, "background offset for this exposure/ota pair", poly->coeff[0]);
+	psMetadataAddF32(chipItem->data.md,PS_LIST_TAIL,"bkg scale", PS_META_REPLACE, "background scale for this exposure/ota pair", poly->coeff[1]);
+      }
+      psFree(poly);
     } // End OTA loop
+    psFree(chipIter);
   } // End smf/exp loop
-  psFree(view);
+  psFree(expIter);
   return(true);
 }
@@ -124,26 +124,23 @@
 // calib_{exposure,OTA}(r,d) = scale * data_{exposure,OTA}(r,d) + offset + solution_{OTA}(u,v)
 bool ppBackgroundStackCalibApply(ppBackgroundStackData *data) {
-  long i;
-  int u,v;
-  
-  pmFPAview *view    = pmFPAviewAlloc(0);
-  //  psStats *stats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN);
-  for (i = 0; i < data->smfs->n; i++) {
-    pmFPAviewReset(view);
-    pmFPAfile *smfFile = data->smfs->data[i];
-    
-    pmChip *chip;                       // Chip from FPA
-    while ((chip = pmFPAviewNextChip(view, smfFile->fpa, 1))) {
-      if (!chip->process || !chip->file_exists) {
-	continue;
-      }
-      const char *chipName = psMetadataLookupStr(NULL, chip->concepts, "CHIP.NAME"); // Name of chip
-      
-      psImage *image = psMetadataLookupPtr(NULL, chip->concepts, "bkg image");
-      psImage *model = psMetadataLookupPtr(NULL, chip->concepts, "bkg calibrated data");
+  int u,v;
+
+  psMetadataIterator *expIter = psMetadataIteratorAlloc(data->models, PS_LIST_HEAD, NULL);
+  psMetadataItem *expItem;
+  while ((expItem = psMetadataGetAndIncrement(expIter))) {
+    if (expItem->type != PS_DATA_METADATA) {
+      continue; // This is the N counter
+    }
+    psMetadataIterator *chipIter = psMetadataIteratorAlloc(expItem->data.md, PS_LIST_HEAD, NULL);
+    psMetadataItem *chipItem;
+    while ((chipItem = psMetadataGetAndIncrement(chipIter))) {
+      const char *chipName = chipItem->name;
+      
+      psImage *image = psMetadataLookupPtr(NULL, chipItem->data.md, "bkg image");
+      psImage *model = psMetadataLookupPtr(NULL, chipItem->data.md, "bkg calibrated data");
       psImage *camera= psMetadataLookupPtr(NULL, data->OTA_solutions, chipName);
       
-      psF32 offset = psMetadataLookupF32(NULL,chip->concepts,"bkg offset");
-      psF32 scale  = psMetadataLookupF32(NULL,chip->concepts,"bkg scale");
+      psF32 offset = psMetadataLookupF32(NULL,chipItem->data.md,"bkg offset");
+      psF32 scale  = psMetadataLookupF32(NULL,chipItem->data.md,"bkg scale");
 
       for (v = 0; v < image->numRows; v++) {
@@ -153,6 +150,7 @@
       }
     } // End chip
+    psFree(chipIter);
   } // End smf
-  psFree(view);
+  psFree(expIter);
   return(true);
 }
@@ -163,28 +161,30 @@
 // This "averaging" is done using the psImageMapClipFit.
 bool ppBackgroundStackModelFit(ppBackgroundStackData *data) {
-  long i,j;
-  int u,v;
-
-  psVector *X = psVectorAllocEmpty(data->smfs->n,PS_TYPE_F32);
-  psVector *Y = psVectorAllocEmpty(data->smfs->n,PS_TYPE_F32);
-  psVector *Z = psVectorAllocEmpty(data->smfs->n,PS_TYPE_F32);
-  psVector *E = psVectorAllocEmpty(data->smfs->n,PS_TYPE_F32);
+  long j;
+  int u,v;
+
+  psS16 N = psMetadataLookupS16(NULL, data->models, "N");
+  psVector *X = psVectorAlloc(N * 60 * 13 * 13,PS_TYPE_F32);
+  psVector *Y = psVectorAlloc(N * 60 * 13 * 13,PS_TYPE_F32);
+  psVector *Z = psVectorAlloc(N * 60 * 13 * 13,PS_TYPE_F32);
+  psVector *E = psVectorAlloc(N * 60 * 13 * 13,PS_TYPE_F32);
+  psVector *mask = psVectorAlloc(N * 60 * 13 * 13,PS_TYPE_VECTOR_MASK);
   j = 0;
   
   pmFPAview *view    = pmFPAviewAlloc(0);
   psStats *stats     = psStatsAlloc( PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV );
-  for (i = 0; i < data->smfs->n; i++) {
-    pmFPAviewReset(view);
-    pmFPAfile *smfFile = data->smfs->data[i];
-    
-    pmChip *chip;                       // Chip from FPA
-    while ((chip = pmFPAviewNextChip(view, smfFile->fpa, 1))) {
-      if (!chip->process || !chip->file_exists) {
-	continue;
-      }
-      //      const char *chipName = psMetadataLookupStr(NULL, chip->concepts, "CHIP.NAME"); // Name of chip
-      psImage *calib = psMetadataLookupPtr(NULL, chip->concepts, "bkg calibrated data");
-      psImage *ra    = psMetadataLookupPtr(NULL, chip->concepts, "bkg ra");
-      psImage *dec    = psMetadataLookupPtr(NULL, chip->concepts, "bkg dec");
+
+  psMetadataIterator *expIter = psMetadataIteratorAlloc(data->models, PS_LIST_HEAD, NULL);
+  psMetadataItem *expItem;
+  while ((expItem = psMetadataGetAndIncrement(expIter))) {
+    if (expItem->type != PS_DATA_METADATA) {
+      continue; // This is the N counter
+    }
+    psMetadataIterator *chipIter = psMetadataIteratorAlloc(expItem->data.md, PS_LIST_HEAD, NULL);
+    psMetadataItem *chipItem;
+    while ((chipItem = psMetadataGetAndIncrement(chipIter))) {
+      psImage *calib = psMetadataLookupPtr(NULL, chipItem->data.md, "bkg calibrated data");
+      psImage *ra    = psMetadataLookupPtr(NULL, chipItem->data.md, "bkg ra");
+      psImage *dec   = psMetadataLookupPtr(NULL, chipItem->data.md, "bkg dec");
       for (v = 0; v < calib->numRows; v++) {
 	for (u = 0; u < calib->numCols; u++) {
@@ -193,16 +193,21 @@
 	  Z->data.F32[j] = calib->data.F32[v][u];
 	  E->data.F32[j] = 1.0;
+	  mask->data.PS_TYPE_VECTOR_MASK_DATA[j] = 0;
+	  j++;
 	}
       }
     } // End chip
+    psFree(chipIter);
   } // End smfs
 
   bool fitStatus;
-  bool status = psImageMapClipFit(&fitStatus,data->modelMap,stats, NULL, 0, X, Y, Z, E);
-  
+  bool status = psImageMapClipFit(&fitStatus,data->modelMap,stats, mask, 0, X, Y, Z, E);
+
+  psFree(expIter);
   psFree(X);
   psFree(Y);
   psFree(Z);
   psFree(E);
+  psFree(mask);
   psFree(stats);
   psFree(view);
