Index: /trunk/ippconfig/gpc1/format_orig.config
===================================================================
--- /trunk/ippconfig/gpc1/format_orig.config	(revision 26970)
+++ /trunk/ippconfig/gpc1/format_orig.config	(revision 26971)
@@ -229,4 +229,5 @@
 #       CELL.SATURATION STR     SATURATE
 
+	CHIP.SEEING	STR	SEEING
 #        CHIP.TEMP       STR     DETTEM	# XY24 is bad, so get it from the database; all others from header
 	CHIP.TEMP.DEPEND	STR	CHIP.NAME
Index: /trunk/ippconfig/gpc1/format_relphot.config
===================================================================
--- /trunk/ippconfig/gpc1/format_relphot.config	(revision 26970)
+++ /trunk/ippconfig/gpc1/format_relphot.config	(revision 26971)
@@ -117,4 +117,5 @@
 	FPA.TEMP	STR	DETTEM
 	FPA.ZP		STR	MAG_ZP
+	CHIP.SEEING	STR	SEEING
 	CHIP.ID         STR	DETECTOR
 	CELL.XBIN	STR	CCDSUM
Index: /trunk/ppSub/src/ppSubMatchPSFs.c
===================================================================
--- /trunk/ppSub/src/ppSubMatchPSFs.c	(revision 26970)
+++ /trunk/ppSub/src/ppSubMatchPSFs.c	(revision 26971)
@@ -144,7 +144,12 @@
     psAssert (refSources, "missing refSources?");
 
-    float inFWHM = subImagePSF(data, inRO, inSources); // FWHM for input
-    float refFWHM = subImagePSF(data, refRO, refSources); // FWHM for reference
-
+    float inFWHM = psMetadataLookupF32(NULL, inRO->parent->parent->analysis, "CHIP.SEEING"); // FWHM for input
+    if (!isfinite(inFWHM)) {
+        inFWHM = subImagePSF(data, inRO, inSources);
+    }
+    float refFWHM = psMetadataLookupF32(NULL, refRO->parent->parent->analysis, "CHIP.SEEING"); // FWHM for ref
+    if (!isfinite(refFWHM)) {
+        refFWHM = subImagePSF(data, refRO, refSources);
+    }
     psLogMsg("ppSub", PS_LOG_INFO, "Input FWHM: %f\nReference FWHM: %f\n", inFWHM, refFWHM);
     if (!isfinite(inFWHM) || !isfinite(refFWHM)) {
Index: /trunk/psModules/src/concepts/pmConcepts.c
===================================================================
--- /trunk/psModules/src/concepts/pmConcepts.c	(revision 26970)
+++ /trunk/psModules/src/concepts/pmConcepts.c	(revision 26971)
@@ -335,5 +335,4 @@
         conceptRegisterF32("FPA.PON.TIME", "Power On Time", NULL, NULL, NULL, false, PM_FPA_LEVEL_FPA);
         conceptRegisterS32("FPA.BURNTOOL.APPLIED", "[T=applied] Burn streaks applied to image data", p_pmConceptParse_BTOOLAPP,p_pmConceptFormat_BTOOLAPP,NULL,false,PM_FPA_LEVEL_FPA);
-        //      conceptRegisterBool("FPA.BURNTOOL.APPLIED", "Status of burntool processing", NULL, NULL, NULL, false, PM_FPA_LEVEL_FPA);
         conceptRegisterF32("FPA.EXPOSURE", "Exposure time (sec)", NULL, NULL, NULL, false, PM_FPA_LEVEL_FPA);
         conceptRegisterF32("FPA.ZP", "Magnitude zero point", NULL, NULL, NULL, false, PM_FPA_LEVEL_FPA);
@@ -352,5 +351,5 @@
         conceptRegisterF32("CHIP.TEMP", "Temperature of chip", NULL, NULL, NULL, false, PM_FPA_LEVEL_CHIP);
         conceptRegisterStr("CHIP.ID", "Chip identifier", NULL, NULL, NULL, false, PM_FPA_LEVEL_CHIP);
-
+        conceptRegisterF32("CHIP.SEEING", "Seeing FWHM (pixels)", NULL, NULL, NULL, false, PM_FPA_LEVEL_CHIP);
     }
 
Index: /trunk/psModules/src/concepts/pmConceptsAverage.c
===================================================================
--- /trunk/psModules/src/concepts/pmConceptsAverage.c	(revision 26970)
+++ /trunk/psModules/src/concepts/pmConceptsAverage.c	(revision 26971)
@@ -284,4 +284,5 @@
 
     float temp = 0.0;                   // Temperature
+    float seeing = 0.0;                 // Seeing FWHM
     int x0 = 0, y0 = 0;                 // Offset
     int xParity = 0, yParity = 0;       // Parity
@@ -297,4 +298,5 @@
         }
         temp += psMetadataLookupF32(NULL, chip->concepts, "CHIP.TEMP");
+        seeing += psMetadataLookupF32(NULL, chip->concepts, "CHIP.SEEING");
         if (nChips == 0) {
             xSize = psMetadataLookupS32(NULL, chip->concepts, "CHIP.XSIZE");
@@ -341,6 +343,8 @@
 
     temp /= (float)nChips;
+    seeing /= (float)nChips;
 
     MD_UPDATE(target->concepts, "CHIP.TEMP", F32, temp);
+    MD_UPDATE(target->concepts, "CHIP.SEEING", F32, seeing);
     if (same) {
         MD_UPDATE(target->concepts, "CHIP.X0", S32, x0);
Index: /trunk/psphot/src/psphotChoosePSF.c
===================================================================
--- /trunk/psphot/src/psphotChoosePSF.c	(revision 26970)
+++ /trunk/psphot/src/psphotChoosePSF.c	(revision 26971)
@@ -15,8 +15,8 @@
     // loop over the available readouts
     for (int i = 0; i < num; i++) {
-	if (!psphotChoosePSFReadout (config, view, "PSPHOT.INPUT", i, recipe)) {
+        if (!psphotChoosePSFReadout (config, view, "PSPHOT.INPUT", i, recipe)) {
             psError (PSPHOT_ERR_CONFIG, false, "failed to choose a psf model for PSPHOT.INPUT entry %d", i);
-	    return false;
-	}
+            return false;
+        }
     }
     return true;
@@ -39,5 +39,5 @@
     // do not generate a PSF if we already were supplied one
     if (psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.PSF")) {
-	psLogMsg ("psphot", PS_LOG_DETAIL, "psf model supplied for input file %d", index);
+        psLogMsg ("psphot", PS_LOG_DETAIL, "psf model supplied for input file %d", index);
         return true;
     }
@@ -50,6 +50,6 @@
 
     if (!sources->n) {
-	psLogMsg ("psphot", PS_LOG_INFO, "no sources, skipping PSF model");
-	return true;
+        psLogMsg ("psphot", PS_LOG_INFO, "no sources, skipping PSF model");
+        return true;
     }
 
@@ -111,5 +111,5 @@
     float gaussSigma = psMetadataLookupF32 (&status, readout->analysis, "MOMENTS_GAUSS_SIGMA");
     if (!status) {
-	gaussSigma = psMetadataLookupF32 (&status, recipe, "MOMENTS_GAUSS_SIGMA");
+        gaussSigma = psMetadataLookupF32 (&status, recipe, "MOMENTS_GAUSS_SIGMA");
     }
     float fitScale = psMetadataLookupF32(&status, recipe, "PSF_FIT_RADIUS_SCALE");
@@ -162,8 +162,8 @@
 
     if (stars->n < 50) {
-	// ROBUST is too agressive if we only have a small number of PSF stars
-	options->stats = psStatsAlloc (PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_STDEV);
+        // ROBUST is too agressive if we only have a small number of PSF stars
+        options->stats = psStatsAlloc (PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_STDEV);
     } else {
-	options->stats = psStatsAlloc (PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV);
+        options->stats = psStatsAlloc (PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV);
     }
 
@@ -354,10 +354,10 @@
     // save PSF on readout->analysis
     if (!psMetadataAddPtr (readout->analysis, PS_LIST_TAIL, "PSPHOT.PSF", PS_META_REPLACE | PS_DATA_UNKNOWN, "psphot psf model", psf)) {
-	psError (PSPHOT_ERR_UNKNOWN, false, "problem saving sources on readout");
+        psError (PSPHOT_ERR_UNKNOWN, false, "problem saving sources on readout");
         return false;
     }
     psFree (psf); // XXX double-check
 
-    // move into psphotChoosePSF 
+    // move into psphotChoosePSF
     psphotVisualShowPSFModel (readout, psf);
 
@@ -391,7 +391,7 @@
             pmModel *modelPSF = pmModelFromPSFforXY (psf, xc, yc, 1.0);
             if (!modelPSF) {
-		fprintf (stderr, "?");
-		continue;
-	    }
+                fprintf (stderr, "?");
+                continue;
+            }
 
             // get the model full-width at half-max
@@ -407,7 +407,7 @@
             float FWHM_MINOR = FWHM_MAJOR * (axes.minor / axes.major);
             if (!isfinite(FWHM_MAJOR) || !isfinite(FWHM_MINOR)) {
-		fprintf (stderr, "!");
-		continue;
-	    }
+                fprintf (stderr, "!");
+                continue;
+            }
             psVectorAppend (fwhmMajor, FWHM_MAJOR);
             psVectorAppend (fwhmMinor, FWHM_MINOR);
@@ -426,4 +426,6 @@
     psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MJ_UQ",   PS_META_REPLACE, "PSF FWHM Major axis (upper quartile)", stats->sampleUQ);
 
+    float fwhmMaj = stats->sampleMean;  // FWHM on major axis
+
     if (!psVectorStats (stats, fwhmMinor, NULL, NULL, 0)) {
         psError(PS_ERR_UNKNOWN, false, "failure to measure stats for FWHM MINOR");
@@ -434,4 +436,12 @@
     psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MN_LQ",   PS_META_REPLACE, "PSF FWHM Minor axis (lower quartile)", stats->sampleLQ);
     psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MN_UQ",   PS_META_REPLACE, "PSF FWHM Minor axis (upper quartile)", stats->sampleUQ);
+
+    float fwhmMin = stats->sampleMean;  // FWHM on minor axis
+    if (readout->parent) {
+        pmChip *chip = readout->parent->parent; // Parent chip
+        psAssert(chip, "Cell should be attached to a chip.");
+        psMetadataItem *item = psMetadataLookup(chip->analysis, "CHIP.SEEING"); // Item with chip
+        item->data.F32 = 0.5 * (fwhmMaj + fwhmMin);
+    }
 
     psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "ANGLE",    PS_META_REPLACE, "PSF angle",           axes.theta);
@@ -486,4 +496,11 @@
     FWHM_Y /= FWHM_N;
     FWHM_T /= FWHM_N;
+
+    if (readout->parent) {
+        pmChip *chip = readout->parent->parent; // Parent chip
+        psAssert(chip, "Cell should be attached to a chip.");
+        psMetadataItem *item = psMetadataLookup(chip->analysis, "CHIP.SEEING"); // Item with chip
+        item->data.F32 = 0.5 * (FWHM_X + FWHM_Y);
+    }
 
     psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FWHM_MAJ",   PS_META_REPLACE, "PSF FWHM Major axis (mean)", FWHM_X);
