Index: trunk/psastro/src/psastroZeroPoint.c
===================================================================
--- trunk/psastro/src/psastroZeroPoint.c	(revision 26965)
+++ trunk/psastro/src/psastroZeroPoint.c	(revision 26966)
@@ -67,5 +67,4 @@
         psTrace ("psastro", 4, "Chip %d: %x %x\n", view->chip, chip->file_exists, chip->process);
         if (!chip->process || !chip->file_exists) { continue; }
-        if (!chip->toFPA) { continue; }
 
         while ((cell = pmFPAviewNextCell (view, fpa, 1)) != NULL) {
@@ -93,13 +92,47 @@
 
     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;
+	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);
+		}
+	    }
+	}
     }
 
@@ -184,7 +217,7 @@
 
     psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_OBS", PS_META_REPLACE, "measured zero point", stats->clippedMean);
-    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_REF", PS_META_REPLACE, "measured zero point", zeropt);
-    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_ERR", PS_META_REPLACE, "measured zero point", stats->clippedStdev);
-    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_OFF", PS_META_REPLACE, "measured zero point", zeropt - stats->clippedMean);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_REF", PS_META_REPLACE, "reference zero point", zeropt);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_ERR", PS_META_REPLACE, "error on zero point",  stats->clippedStdev);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "ZPT_OFF", PS_META_REPLACE, "zero point offset",    zeropt - stats->clippedMean);
 
     psFree (stats);
