Index: trunk/psastro/src/psastroZeroPoint.c
===================================================================
--- trunk/psastro/src/psastroZeroPoint.c	(revision 27033)
+++ trunk/psastro/src/psastroZeroPoint.c	(revision 27034)
@@ -62,4 +62,7 @@
     psVector *dMag = NULL;
 
+    float fpaZP = 0.0;                  // Average zero point
+    int numZP = 0.0;                    // Number of measurements
+
     // this loop selects the matched stars for all chips
     // XXX optionally measure zero point for entire exposure in a single statistic
@@ -86,4 +89,12 @@
                     psFree (dMag);
                     dMag = NULL;
+
+                    float zp = psMetadataLookupF32(NULL, header, "ZPT_OBS");
+                    if (isfinite(zp)) {
+                        fpaZP += zp;
+                        numZP++;
+                    }
+
+
                 }
             }
@@ -92,51 +103,55 @@
 
     if (byExposure) {
-	psMetadata *header = psMetadataLookupMetadata (&status, fpa->analysis, "PSASTRO.HEADER");
-	if (!header) {
-	    header = psMetadataAlloc ();
-	    psMetadataAddMetadata (fpa->analysis, PS_LIST_TAIL, "PSASTRO.HEADER",  PS_META_REPLACE, "psastro header stats", header);
-	    psFree (header);
-	}
-	psastroZeroPointAnalysis (header, dMag, zeropt, recipe);
-	psFree (dMag);
-	dMag = NULL;
-
-	float zptObs = psMetadataLookupF32 (&status, header, "ZPT_OBS");
-	float zptRef = psMetadataLookupF32 (&status, header, "ZPT_REF");
-	float zptErr = psMetadataLookupF32 (&status, header, "ZPT_ERR");
-	float zptOff = psMetadataLookupF32 (&status, header, "ZPT_OFF");
-
-	// copy the zero point metadata from the fpa header to the chip headers
-	for (int i = 0; i < fpa->chips->n; i++) {
-	    pmChip *chip = fpa->chips->data[i];
-	    if (!chip) continue;
-	    if (!chip->process) continue;
-	    if (!chip->file_exists) continue;
-
-	    for (int j = 0; j < chip->cells->n; j++) {
-		pmCell *cell = chip->cells->data[j];
-		if (!cell) continue;
-		if (!cell->process) continue;
-		if (!cell->file_exists) continue;
-
-		for (int k = 0; k < cell->readouts->n; k++) {
-		    pmReadout *readout = cell->readouts->data[k];
-		    if (!readout) continue;
-		    if (!readout->data_exists) continue;
-
-		    // calculate dMag for the matched stars just for this readout (well, chip)
-		    psMetadata *header = psMetadataLookupMetadata (&status, readout->analysis, "PSASTRO.HEADER");
-
-		    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_OBS", PS_META_REPLACE, "measured zero point",  zptObs);
-		    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_REF", PS_META_REPLACE, "reference zero point", zptRef);
-		    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_ERR", PS_META_REPLACE, "error on zero point",  zptErr);
-		    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_OFF", PS_META_REPLACE, "zero point offset",    zptOff);
-		}
-	    }
-	}
-    }
+        psMetadata *header = psMetadataLookupMetadata (&status, fpa->analysis, "PSASTRO.HEADER");
+        if (!header) {
+            header = psMetadataAlloc ();
+            psMetadataAddMetadata (fpa->analysis, PS_LIST_TAIL, "PSASTRO.HEADER",  PS_META_REPLACE, "psastro header stats", header);
+            psFree (header);
+        }
+        psastroZeroPointAnalysis (header, dMag, zeropt, recipe);
+        psFree (dMag);
+        dMag = NULL;
+
+        float zptObs = psMetadataLookupF32 (&status, header, "ZPT_OBS");
+        float zptRef = psMetadataLookupF32 (&status, header, "ZPT_REF");
+        float zptErr = psMetadataLookupF32 (&status, header, "ZPT_ERR");
+        float zptOff = psMetadataLookupF32 (&status, header, "ZPT_OFF");
+
+        fpaZP = zptObs;
+        numZP = 1;
+
+        // copy the zero point metadata from the fpa header to the chip headers
+        for (int i = 0; i < fpa->chips->n; i++) {
+            pmChip *chip = fpa->chips->data[i];
+            if (!chip) continue;
+            if (!chip->process) continue;
+            if (!chip->file_exists) continue;
+
+            for (int j = 0; j < chip->cells->n; j++) {
+                pmCell *cell = chip->cells->data[j];
+                if (!cell) continue;
+                if (!cell->process) continue;
+                if (!cell->file_exists) continue;
+
+                for (int k = 0; k < cell->readouts->n; k++) {
+                    pmReadout *readout = cell->readouts->data[k];
+                    if (!readout) continue;
+                    if (!readout->data_exists) continue;
+
+                    // calculate dMag for the matched stars just for this readout (well, chip)
+                    psMetadata *header = psMetadataLookupMetadata (&status, readout->analysis, "PSASTRO.HEADER");
+
+                    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_OBS", PS_META_REPLACE, "measured zero point",  zptObs);
+                    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_REF", PS_META_REPLACE, "reference zero point", zptRef);
+                    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_ERR", PS_META_REPLACE, "error on zero point",  zptErr);
+                    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_OFF", PS_META_REPLACE, "zero point offset",    zptOff);
+                }
+            }
+        }
+    }
+
 
     psMetadataItem *item = psMetadataLookup(fpa->concepts, "FPA.ZP");
-    item->data.F32 = zeropt;
+    item->data.F32 = fpaZP / (float)numZP;
 
     psFree (view);
