Index: /tags/ipp-ops-20220906/ippconfig/gpc1/Makefile.am
===================================================================
--- /tags/ipp-ops-20220906/ippconfig/gpc1/Makefile.am	(revision 42296)
+++ /tags/ipp-ops-20220906/ippconfig/gpc1/Makefile.am	(revision 42297)
@@ -16,4 +16,5 @@
 	format_20100228.config \
 	format_20100723.config \
+	format_20220827.config \
 	format_mef.config \
 	format_relphot.config \
Index: /tags/ipp-ops-20220906/ippconfig/gpc1/camera.config
===================================================================
--- /tags/ipp-ops-20220906/ippconfig/gpc1/camera.config	(revision 42296)
+++ /tags/ipp-ops-20220906/ippconfig/gpc1/camera.config	(revision 42297)
@@ -5,4 +5,5 @@
 	MEF		STR	gpc1/format_mef.config
 	RELPHOT		STR	gpc1/format_relphot.config
+	RAW_20220827	STR	gpc1/format_20220827.config
 	RAW_20100723	STR	gpc1/format_20100723.config
 	RAW_20100228	STR	gpc1/format_20100228.config
Index: /tags/ipp-ops-20220906/ippconfig/gpc1/format_20220827.config
===================================================================
--- /tags/ipp-ops-20220906/ippconfig/gpc1/format_20220827.config	(revision 42297)
+++ /tags/ipp-ops-20220906/ippconfig/gpc1/format_20220827.config	(revision 42297)
@@ -0,0 +1,686 @@
+# Refurbished GPC1
+# Change effective from 22 January 2010 (TJD=5219): new CCD temperature keywords
+
+# How to identify this type
+RULE    METADATA
+	ORIGIN		STR	PS1
+        TELESCOP        STR     PS1
+	INSTRUME	STR	gpc1
+        CONTROLR        STR     STARGRASP
+        NAMPS           S32     64
+	MJD-OBS		F64	59818.0		# OP: >=
+END
+
+# How to read this data
+FILE    METADATA
+        PHU             STR     CHIP       # The FITS file represents a single chip
+        EXTENSIONS      STR     CELL       # The extensions represent cells
+        FPA.OBS         STR     FILENAME   # A PHU keyword for unique identifier within the hierarchy level
+        CONTENT         STR     DETECTOR   # How to determine content of FITS file
+        CONTENT.RULE    STR     {CHIP.ID}  # How to derive the CONTENT when writing
+END
+
+# What's in the FITS file?
+CONTENTS        METADATA
+        # CONTENT      =    chip name : type
+        CCID58-2-15a1  STR  XY01:GPCChip  # chip 00
+        CCID58-2-18a1  STR  XY02:GPCChip  # chip 01
+        CCID58-2-04a2  STR  XY03:GPCChip  # chip 02
+        CCID58-1-01b1  STR  XY04:GPCChip  # chip 03
+        CCID58-1-09b1  STR  XY05:GPCChip  # chip 04
+        CCID58-2-09b1  STR  XY06:GPCChip  # chip 05
+        CCID58-2-22a1  STR  XY10:GPCChip  # chip 06
+        CCID58-2-01a1  STR  XY11:GPCChip  # chip 07
+        CCID58-3-11a1  STR  XY12:GPCChip  # chip 08
+        CCID58-3-06a1  STR  XY13:GPCChip  # chip 09
+        CCID58-3-05b1  STR  XY14:GPCChip  # chip 10
+        CCID58-3-08b1  STR  XY15:GPCChip  # chip 11
+        CCID58-1-02b1  STR  XY16:GPCChip  # chip 12
+        CCID58-2-07b2  STR  XY17:GPCChip  # chip 13
+        CCID58-1-19a1  STR  XY20:GPCChip  # chip 14
+        CCID58-1-04a1  STR  XY21:GPCChip  # chip 15
+        CCID58-2-09a2  STR  XY22:GPCChip  # chip 16
+        CCID58-1-02a1  STR  XY23:GPCChip  # chip 17
+        CCID58-3-10b1  STR  XY24:GPCChip  # chip 18
+        CCID58-3-05b2  STR  XY25:GPCChip  # chip 19
+        CCID58-3-04b1  STR  XY26:GPCChip  # chip 20
+        CCID58-1-18b1  STR  XY27:GPCChip  # chip 21
+        CCID58-3-13a2  STR  XY30:GPCChip  # chip 22
+        CCID58-3-05a1  STR  XY31:GPCChip  # chip 23
+        CCID58-2-01a2  STR  XY32:GPCChip  # chip 24
+        CCID58-1-02a2  STR  XY33:GPCChip  # chip 25
+        CCID58-3-03b1  STR  XY34:GPCChip  # chip 26
+        CCID58-1-01b2  STR  XY35:GPCChip  # chip 27
+        CCID58-3-14b1  STR  XY36:GPCChip  # chip 28
+        CCID58-2-23b2  STR  XY37:GPCChip  # chip 29
+        CCID58-3-02b1  STR  XY40:GPCChip  # chip 30
+        CCID58-1-03b2  STR  XY41:GPCChip  # chip 31
+        CCID58-1-07b1  STR  XY42:GPCChip  # chip 32
+        CCID58-2-11b2  STR  XY43:GPCChip  # chip 33
+        CCID58-2-09a1  STR  XY44:GPCChip  # chip 34
+        CCID58-3-04a2  STR  XY45:GPCChip  # chip 35
+        CCID58-3-02a1  STR  XY46:GPCChip  # chip 36
+        CCID58-3-14a1  STR  XY47:GPCChip  # chip 37
+        CCID58-1-17b1  STR  XY50:GPCChip  # chip 38
+        CCID58-2-09b2  STR  XY51:GPCChip  # chip 39
+        CCID58-1-04b1  STR  XY52:GPCChip  # chip 40
+        CCID58-1-05b2  STR  XY53:GPCChip  # chip 41
+        CCID58-3-05a2  STR  XY54:GPCChip  # chip 42
+        CCID58-3-03a2  STR  XY55:GPCChip  # chip 43
+        CCID58-3-02a2  STR  XY56:GPCChip  # chip 44
+        CCID58-3-11a2  STR  XY57:GPCChip  # chip 45
+        CCID58-2-16b1  STR  XY60:GPCChip  # chip 46
+        CCID58-1-03b1  STR  XY61:GPCChip  # chip 47
+        CCID58-3-03b2  STR  XY62:GPCChip  # chip 48
+        CCID58-1-02b2  STR  XY63:GPCChip  # chip 49
+        CCID58-1-07a1  STR  XY64:GPCChip  # chip 50
+        CCID58-2-04a1  STR  XY65:GPCChip  # chip 51
+        CCID58-3-10a1  STR  XY66:GPCChip  # chip 52
+        CCID58-1-09a1  STR  XY67:GPCChip  # chip 53
+        CCID58-2-13b1  STR  XY71:GPCChip  # chip 54
+        CCID58-1-14b1  STR  XY72:GPCChip  # chip 55
+        CCID58-3-11b2  STR  XY73:GPCChip  # chip 56
+        CCID58-1-05a2  STR  XY74:GPCChip  # chip 57
+        CCID58-1-21a1  STR  XY75:GPCChip  # chip 58
+        CCID58-2-05a1  STR  XY76:GPCChip  # chip 59
+END
+
+CHIPS   METADATA
+        GPCChip         METADATA
+                # Extension name, cellName:cellType
+                xy00   STR  xy00:GPCCell
+                xy10   STR  xy10:GPCCell
+                xy20   STR  xy20:GPCCell
+                xy30   STR  xy30:GPCCell
+                xy40   STR  xy40:GPCCell
+                xy50   STR  xy50:GPCCell
+                xy60   STR  xy60:GPCCell
+                xy70   STR  xy70:GPCCell
+                xy01   STR  xy01:GPCCell
+                xy11   STR  xy11:GPCCell
+                xy21   STR  xy21:GPCCell
+                xy31   STR  xy31:GPCCell
+                xy41   STR  xy41:GPCCell
+                xy51   STR  xy51:GPCCell
+                xy61   STR  xy61:GPCCell
+                xy71   STR  xy71:GPCCell
+                xy02   STR  xy02:GPCCell
+                xy12   STR  xy12:GPCCell
+                xy22   STR  xy22:GPCCell
+                xy32   STR  xy32:GPCCell
+                xy42   STR  xy42:GPCCell
+                xy52   STR  xy52:GPCCell
+                xy62   STR  xy62:GPCCell
+                xy72   STR  xy72:GPCCell
+                xy03   STR  xy03:GPCCell
+                xy13   STR  xy13:GPCCell
+                xy23   STR  xy23:GPCCell
+                xy33   STR  xy33:GPCCell
+                xy43   STR  xy43:GPCCell
+                xy53   STR  xy53:GPCCell
+                xy63   STR  xy63:GPCCell
+                xy73   STR  xy73:GPCCell
+                xy04   STR  xy04:GPCCell
+                xy14   STR  xy14:GPCCell
+                xy24   STR  xy24:GPCCell
+                xy34   STR  xy34:GPCCell
+                xy44   STR  xy44:GPCCell
+                xy54   STR  xy54:GPCCell
+                xy64   STR  xy64:GPCCell
+                xy74   STR  xy74:GPCCell
+                xy05   STR  xy05:GPCCell
+                xy15   STR  xy15:GPCCell
+                xy25   STR  xy25:GPCCell
+                xy35   STR  xy35:GPCCell
+                xy45   STR  xy45:GPCCell
+                xy55   STR  xy55:GPCCell
+                xy65   STR  xy65:GPCCell
+                xy75   STR  xy75:GPCCell
+                xy06   STR  xy06:GPCCell
+                xy16   STR  xy16:GPCCell
+                xy26   STR  xy26:GPCCell
+                xy36   STR  xy36:GPCCell
+                xy46   STR  xy46:GPCCell
+                xy56   STR  xy56:GPCCell
+                xy66   STR  xy66:GPCCell
+                xy76   STR  xy76:GPCCell
+                xy07   STR  xy07:GPCCell
+                xy17   STR  xy17:GPCCell
+                xy27   STR  xy27:GPCCell
+                xy37   STR  xy37:GPCCell
+                xy47   STR  xy47:GPCCell
+                xy57   STR  xy57:GPCCell
+                xy67   STR  xy67:GPCCell
+                xy77   STR  xy77:GPCCell
+        END
+END
+
+# Specify the cell data
+CELLS   METADATA
+        GPCCell         METADATA
+                CELL.TRIMSEC.SOURCE     STR     HEADER
+                CELL.TRIMSEC            STR     DATASEC
+                CELL.BIASSEC.SOURCE     STR     HEADER
+                CELL.BIASSEC            STR     BIASSEC
+        END
+END
+
+
+# How to translate PS concepts into FITS headers
+TRANSLATION     METADATA
+        FPA.FILTERID    STR     FILTERID
+        FPA.FILTER      STR     FILTERID
+        FPA.RA          STR     RA
+        FPA.DEC         STR     DEC
+        FPA.RADECSYS    STR     EQUINOX
+        FPA.OBSTYPE     STR     OBSTYPE
+        FPA.OBJECT      STR     OBJECT
+        FPA.OBS.MODE    STR     OBS_MODE
+        FPA.COMMENT     STR     CMMTOBS
+        FPA.AIRMASS     STR     AIRMASS
+        FPA.POSANGLE    STR     POSANGLE
+	FPA.ROTANGLE	STR	ROT
+        FPA.FOCUS       STR     M2Z
+        FPA.TIME        STR     SHMDOUTC 
+        FPA.ALT         STR     ALT
+        FPA.AZ          STR     AZ
+        FPA.TEMP        STR     DETTEM
+        FPA.M1X         STR     M1X
+        FPA.M1Y         STR     M1Y   
+        FPA.M1Z         STR     M1Z   
+        FPA.M1TIP       STR     M1TIP 
+        FPA.M1TILT      STR     M1TILT
+        FPA.M2X         STR     M2X
+        FPA.M2Y         STR     M2Y   
+        FPA.M2Z         STR     M2Z   
+        FPA.M2TIP       STR     M2TIP 
+        FPA.M2TILT      STR     M2TILT
+        FPA.ENV.TEMP    STR     ENVTEM
+        FPA.ENV.HUMID   STR     ENVHUM
+        FPA.ENV.WIND    STR     ENVWIN
+        FPA.ENV.DIR     STR     ENVDIR
+
+        FPA.TELTEMP.M1     STR  TELTEMM1 # Primary mirror temps (C) 
+        FPA.TELTEMP.M1CELL STR  TELTEMMS # Primary mirror support temps (C)   
+        FPA.TELTEMP.M2     STR  TELTEMM2 # Secondary mirror temps (C
+        FPA.TELTEMP.SPIDER STR  TELTEMSP # Spider temperatures (C)  
+        FPA.TELTEMP.TRUSS  STR  TELTEMTR # Mid truss temperatures (C
+        FPA.TELTEMP.EXTRA  STR  TELTEMEX # Miscellaneous temperatures (C)     
+
+        FPA.BURNTOOL.APPLIED STR BTOOLAPP
+	CHIP.VIDEOCELL  STR     CELLMODE
+
+        FPA.SHUTOUTC	STR	SHUTOUTC
+        FPA.SHUTCUTC    STR     SHUTCUTC
+        FPA.SHMDOUTC    STR     SHMDOUTC
+        FPA.SHMDCUTC    STR     SHMDCUTC
+
+        FPA.PON.TIME    STR     PONTIME
+
+        CHIP.ID         STR     DETECTOR
+        CELL.XBIN       STR     CCDSUM
+        CELL.YBIN       STR     CCDSUM
+        CELL.X0         STR     IMNPIX1
+        CELL.Y0         STR     IMNPIX2
+        CELL.XPARITY    STR     ATM1_1
+        CELL.YPARITY    STR     ATM2_2
+	CHIP.TEMP	STR	CDETTEM
+	CHIP.TEMPERATURE STR	DETTEM
+        FPA.EXPOSURE    STR     EXPREQ          # Requested exposure time, presumably camera exposure time
+        CELL.EXPOSURE   STR     EXPTIME         # Exposure time measured by shutter
+        CELL.DARKTIME   STR     DARKTIME        # Exposure time for camera
+        CELL.TIME       STR     SHMDOUTC	# Observation time
+        CELL.GAIN       STR     GAIN		# Cell gain (e/ADU)
+        CELL.READNOISE  STR     RDNOISE		# Cell read noise (ADU)
+        CELL.SATURATION STR     MAXLIN		# Saturation point (ADU)
+END
+
+# Default PS concepts that may be specified by value
+# NOTE: CHIP.X0 = ($ix < 4) ? (4971 * ($ix + 1)) : ($ix * 4971 + 157)
+# NOTE: CHIP.Y0 = (5143 * $iy)
+DEFAULTS        METADATA
+        FPA.TELESCOPE   STR     PS1
+        FPA.INSTRUMENT  STR     GPC1
+        FPA.LONGITUDE   STR     10:25:01.417 # West Longitude in Hours 10.4170608521
+        FPA.LATITUDE    STR     20:42:25.558 # North Latitude in Degrees 20.7070999146
+        FPA.ELEVATION   F32     3048.0 # altitude in meters
+        FPA.DETECTOR    STR     GPC1
+        FPA.TIMESYS     STR     UTC
+	CHIP.XSIZE	S32	4846
+	CHIP.YSIZE	S32	4868
+        CHIP.XPARITY    S32     1
+        CHIP.YPARITY    S32     1
+        CHIP.X0.DEPEND          STR     CHIP.NAME
+        CHIP.X0         METADATA
+          XY01  S32     4971
+          XY02  S32     4971
+          XY03  S32     4971
+          XY04  S32     4971
+          XY05  S32     4971
+          XY06  S32     4971
+          XY10  S32     9942
+          XY11  S32     9942
+          XY12  S32     9942
+          XY13  S32     9942
+          XY14  S32     9942
+          XY15  S32     9942
+          XY16  S32     9942
+          XY17  S32     9942
+          XY20  S32     14913
+          XY21  S32     14913
+          XY22  S32     14913
+          XY23  S32     14913
+          XY24  S32     14913
+          XY25  S32     14913
+          XY26  S32     14913
+          XY27  S32     14913
+          XY30  S32     19884
+          XY31  S32     19884
+          XY32  S32     19884
+          XY33  S32     19884 # should be 19872
+          XY34  S32     19884
+          XY35  S32     19884
+          XY36  S32     19884
+          XY37  S32     19884
+          XY40  S32     20041
+          XY41  S32     20041
+          XY42  S32     20041
+          XY43  S32     20041 # should be 20029
+          XY44  S32     20041
+          XY45  S32     20041
+          XY46  S32     20041
+          XY47  S32     20041
+          XY50  S32     25012
+          XY51  S32     25012
+          XY52  S32     25012
+          XY53  S32     25012
+          XY54  S32     25012
+          XY55  S32     25012
+          XY56  S32     25012
+          XY57  S32     25012
+          XY60  S32     29983
+          XY61  S32     29983
+          XY62  S32     29983
+          XY63  S32     29983
+          XY64  S32     29983
+          XY65  S32     29983
+          XY66  S32     29983
+          XY67  S32     29983
+          XY71  S32     34954
+          XY72  S32     34954
+          XY73  S32     34954
+          XY74  S32     34954
+          XY75  S32     34954
+          XY76  S32     34954
+        END
+        CHIP.Y0.DEPEND          STR     CHIP.NAME
+        CHIP.Y0         METADATA
+          XY01  S32     10286
+          XY02  S32     15429
+          XY03  S32     20572
+          XY04  S32     25715
+          XY05  S32     30858
+          XY06  S32     36001
+          XY10  S32     5143
+          XY11  S32     10286
+          XY12  S32     15429
+          XY13  S32     20572
+          XY14  S32     25715
+          XY15  S32     30858
+          XY16  S32     36001
+          XY17  S32     41144
+          XY20  S32     5143
+          XY21  S32     10286
+          XY22  S32     15429
+          XY23  S32     20572
+          XY24  S32     25715
+          XY25  S32     30858
+          XY26  S32     36001
+          XY27  S32     41144
+          XY30  S32     5143
+          XY31  S32     10286
+          XY32  S32     15429
+          XY33  S32     20572
+          XY34  S32     25715 # should be 25755
+          XY35  S32     30858
+          XY36  S32     36001
+          XY37  S32     41144
+          XY40  S32     306
+          XY41  S32     5449
+          XY42  S32     10592
+          XY43  S32     15735 # should be 15707
+          XY44  S32     20878 # should be 20890
+          XY45  S32     26021
+          XY46  S32     31164
+          XY47  S32     36307
+          XY50  S32     306
+          XY51  S32     5449
+          XY52  S32     10592
+          XY53  S32     15735
+          XY54  S32     20878
+          XY55  S32     26021
+          XY56  S32     31164
+          XY57  S32     36307
+          XY60  S32     306
+          XY61  S32     5449
+          XY62  S32     10592
+          XY63  S32     15735
+          XY64  S32     20878
+          XY65  S32     26021
+          XY66  S32     31164
+          XY67  S32     36307
+          XY71  S32     5449
+          XY72  S32     10592
+          XY73  S32     15735
+          XY74  S32     20878
+          XY75  S32     26021
+          XY76  S32     31164
+        END
+        CHIP.XPARITY.DEPEND     STR     CHIP.NAME
+        CHIP.XPARITY    METADATA
+          XY01  S32     -1
+          XY02  S32     -1
+          XY03  S32     -1
+          XY04  S32     -1
+          XY05  S32     -1
+          XY06  S32     -1
+          XY10  S32     -1
+          XY11  S32     -1
+          XY12  S32     -1
+          XY13  S32     -1
+          XY14  S32     -1
+          XY15  S32     -1
+          XY16  S32     -1
+          XY17  S32     -1
+          XY20  S32     -1
+          XY21  S32     -1
+          XY22  S32     -1
+          XY23  S32     -1
+          XY24  S32     -1
+          XY25  S32     -1
+          XY26  S32     -1
+          XY27  S32     -1
+          XY30  S32     -1
+          XY31  S32     -1
+          XY32  S32     -1
+          XY33  S32     -1
+          XY34  S32     -1
+          XY35  S32     -1
+          XY36  S32     -1
+          XY37  S32     -1
+          XY40  S32     1
+          XY41  S32     1
+          XY42  S32     1
+          XY43  S32     1
+          XY44  S32     1
+          XY45  S32     1
+          XY46  S32     1
+          XY47  S32     1
+          XY50  S32     1
+          XY51  S32     1
+          XY52  S32     1
+          XY53  S32     1
+          XY54  S32     1
+          XY55  S32     1
+          XY56  S32     1
+          XY57  S32     1
+          XY60  S32     1
+          XY61  S32     1
+          XY62  S32     1
+          XY63  S32     1
+          XY64  S32     1
+          XY65  S32     1
+          XY66  S32     1
+          XY67  S32     1
+          XY71  S32     1
+          XY72  S32     1
+          XY73  S32     1
+          XY74  S32     1
+          XY75  S32     1
+          XY76  S32     1
+        END
+        CHIP.YPARITY.DEPEND     STR     CHIP.NAME
+        CHIP.YPARITY    METADATA
+          XY01  S32     -1
+          XY02  S32     -1
+          XY03  S32     -1
+          XY04  S32     -1
+          XY05  S32     -1
+          XY06  S32     -1
+          XY10  S32     -1
+          XY11  S32     -1
+          XY12  S32     -1
+          XY13  S32     -1
+          XY14  S32     -1
+          XY15  S32     -1
+          XY16  S32     -1
+          XY17  S32     -1
+          XY20  S32     -1
+          XY21  S32     -1
+          XY22  S32     -1
+          XY23  S32     -1
+          XY24  S32     -1
+          XY25  S32     -1
+          XY26  S32     -1
+          XY27  S32     -1
+          XY30  S32     -1
+          XY31  S32     -1
+          XY32  S32     -1
+          XY33  S32     -1
+          XY34  S32     -1
+          XY35  S32     -1
+          XY36  S32     -1
+          XY37  S32     -1
+          XY40  S32     1
+          XY41  S32     1
+          XY42  S32     1
+          XY43  S32     1
+          XY44  S32     1
+          XY45  S32     1
+          XY46  S32     1
+          XY47  S32     1
+          XY50  S32     1
+          XY51  S32     1
+          XY52  S32     1
+          XY53  S32     1
+          XY54  S32     1
+          XY55  S32     1
+          XY56  S32     1
+          XY57  S32     1
+          XY60  S32     1
+          XY61  S32     1
+          XY62  S32     1
+          XY63  S32     1
+          XY64  S32     1
+          XY65  S32     1
+          XY66  S32     1
+          XY67  S32     1
+          XY71  S32     1
+          XY72  S32     1
+          XY73  S32     1
+          XY74  S32     1
+          XY75  S32     1
+          XY76  S32     1
+        END
+        CELL.READDIR    S32     1
+        CELL.BAD        S32     0
+	CELL.XSIZE	S32	590
+	CELL.YSIZE	S32	598
+        CELL.TIMESYS    STR     UTC
+END
+
+# How to translation PS concepts into database lookups
+DATABASE        METADATA
+	# this rule is fragile : does not match the camera
+#        FPA.TEMP        STR     SELECT ccd_temp FROM rawExp WHERE dateobs >= '{FPA.DATE}' and abs(timediff(dateobs, cast('{FPA.TIME}' as datetime))) < 2
+END
+
+
+# Where there might be some ambiguity, specify the format
+FORMATS         METADATA
+        FPA.RA          STR     DEGREES
+        FPA.DEC         STR     DEGREES
+	FPA.LONGITUDE	STR	HOURS
+	FPA.LATITUDE	STR	DEGREES
+        FPA.TIME        STR     YEAR.FIRST
+        CELL.TIME       STR     YEAR.FIRST
+        CELL.BINNING    STR     TOGETHER
+        # CELL.X0         STR     FORTRAN
+        # CELL.Y0         STR     FORTRAN
+	CELL.READNOISE	STR	ADU
+END
+
+# Pattern correction information:
+
+# NOTE: PATTERN.ROW.SUBSET is defined in the format_DATE.config files because
+# in different periods, the camera had different amounts of row-by-row bias drift
+# for a given cell.  It is necessary to make the choice of whether to correct the 
+# pattern based on the epoch the exposure was taken.
+
+# NOTE: if PATTERN.ROW.SUBSET entries are missing for a given chip, the default 
+# behavior is to NOT correct for the effect. (This makes sense since most camera
+# are not GPC1 and thus do not need the correction).
+
+# PATTERN.ROW		BOOL 	TRUE	# Do any row pattern correction at all?
+PATTERN.ROW.SUBSET	METADATA	# List of chips and whether to do row pattern correction
+	XY01	BOOL	TRUE
+ 	XY02	BOOL    TRUE
+	XY02	BOOL	TRUE
+	XY03	BOOL	TRUE
+	XY04	BOOL	TRUE
+	XY05	BOOL	TRUE
+	XY06	BOOL	TRUE
+	XY10	BOOL	TRUE
+	XY11	BOOL	TRUE
+	XY12	BOOL	TRUE
+	XY13	BOOL	TRUE
+	XY14	BOOL    TRUE 
+	XY15	BOOL    TRUE 
+	XY16	BOOL	TRUE
+	XY17	BOOL	TRUE
+	XY20	BOOL	TRUE
+	XY21	BOOL	TRUE
+	XY22	BOOL	TRUE
+	XY23	BOOL	TRUE
+	XY24	BOOL	TRUE
+	XY25	BOOL	TRUE
+	XY26	BOOL	TRUE
+	XY27	BOOL    TRUE 
+	XY30	BOOL	TRUE
+	XY31	BOOL    TRUE 
+	XY32	BOOL    TRUE 
+	XY33	BOOL	TRUE
+	XY34	BOOL	TRUE
+	XY35	BOOL	TRUE
+	XY36	BOOL	TRUE
+	XY37	BOOL	TRUE
+	XY40	BOOL	TRUE
+	XY41	BOOL	TRUE
+	XY42	BOOL	TRUE
+	XY43	BOOL	TRUE
+	XY44	BOOL	TRUE
+	XY45	BOOL    TRUE 
+	XY46	BOOL	TRUE
+	XY47	BOOL    TRUE
+	XY50	BOOL	TRUE
+	XY51	BOOL	TRUE
+	XY52	BOOL	TRUE
+	XY53	BOOL	TRUE
+	XY54	BOOL	TRUE
+	XY55	BOOL	TRUE
+	XY56	BOOL	TRUE
+	XY57	BOOL    TRUE 
+	XY60	BOOL	TRUE
+	XY61	BOOL	TRUE
+	XY62	BOOL	TRUE
+	XY63	BOOL	TRUE
+	XY64	BOOL	TRUE
+	XY65	BOOL	TRUE
+	XY66	BOOL	TRUE
+	XY67	BOOL	TRUE
+	XY71	BOOL	TRUE
+	XY72	BOOL	TRUE
+	XY73	BOOL	TRUE
+	XY74	BOOL	TRUE
+	XY75	BOOL	TRUE
+	XY76	BOOL	TRUE
+END
+
+PATTERN.CONTINUITY BOOL TRUE
+ PATTERN.CELL	BOOL 	FALSE		# by default, do not do any cell pattern correction
+# PATTERN.CELL.SUBSET	METADATA	# List of chips and whether to do cell pattern correction
+# 	XY01	BOOL	FALSE
+# 	XY02	BOOL	FALSE
+# 	XY03	BOOL	FALSE
+# 	XY04	BOOL	FALSE
+# 	XY05	BOOL	FALSE
+# #	XY06    STR     0101000000010000000110000100000000000000000000000000000000000000
+# 	XY06	BOOL	FALSE
+# 	XY10	BOOL	FALSE
+# 	XY11	BOOL	FALSE
+# 	XY12	BOOL	FALSE
+# 	XY13	BOOL	FALSE
+# 	XY14	STR     0000000000000000111111110000000000000000000000000000000000000000
+# 	XY15	STR     1111111110000000100000000000000000000000000000000000000000000000
+# #	XY16	STR     0000000100000000000000000000000000000001000000000000000000000000
+# 	XY16	BOOL	FALSE
+# 	XY17	BOOL	FALSE
+# 	XY20	BOOL	FALSE
+# 	XY21	BOOL	FALSE
+# 	XY22	BOOL	FALSE
+# 	XY23	BOOL	FALSE
+# #	XY24	STR     0000000000100000000000000110100000100000001000000011100000000000
+# 	XY24	BOOL	FALSE
+# #	XY25	STR     0100010000001001001011000000001000000111000110000000100000000010
+# 	XY25	BOOL	FALSE
+# #	XY26	STR     0000000000000100000000000000000000001000001000000000000000000000
+# 	XY26	BOOL	FALSE
+# 	XY27	BOOL	FALSE
+# 	XY30	BOOL	FALSE
+# 	XY31	BOOL	FALSE
+# 	XY32	BOOL	FALSE
+# 	XY33	BOOL	FALSE
+# #	XY34	STR     0000000000000000000000000000000000000001000011000000101000111111
+# 	XY34	BOOL	FALSE
+# 	XY35	BOOL	FALSE
+# #	XY36	STR     0001000000000000000000000000000000010000000000000000000000000000
+# 	XY36	BOOL	FALSE
+# #	XY37	STR     0000000000000000000000000000000100010001000000001011000010110110 ?
+# 	XY37	BOOL	FALSE
+# #	XY40	STR     0000000000000000000000000010110000000000000001110000001000011111
+# 	XY40	BOOL	FALSE
+# 	XY41	BOOL	FALSE
+# #	XY42	BOOL	FALSE
+# 	XY42	STR	0000000000000000000100000001000000000000000000000000000000000000
+# #	XY43	STR     0000000000000000000000010000000100000000000010000100000100000100
+# 	XY43	STR 	0000000000000000000000000000000000000000000010000000000000000000
+# 	XY44	BOOL	FALSE
+# 	XY45	BOOL	FALSE
+# 	XY46	BOOL	FALSE
+# 	XY47	BOOL	FALSE
+# 	XY50	BOOL	FALSE
+# 	XY51	BOOL	FALSE
+# 	XY52	BOOL	FALSE
+# 	XY53	BOOL	FALSE
+# 	XY54	BOOL	FALSE
+# 	XY55	BOOL	FALSE
+# 	XY56	BOOL	FALSE
+# 	XY57	BOOL	FALSE
+# 	XY60	BOOL	FALSE
+# 	XY61	BOOL	FALSE
+# #	XY62	STR     0000000000000000000000000000000000000000000000000000000000000010
+# 	XY62	BOOL	FALSE
+# 	XY63	BOOL	FALSE
+# 	XY64	BOOL	FALSE
+# 	XY65	BOOL	FALSE
+# 	XY66	BOOL	FALSE
+# 	XY67	BOOL	FALSE
+# 	XY71	BOOL	FALSE
+# #	XY72	STR     0000000000000000000000000000000000000000000000000000000000000001
+# 	XY72	BOOL	FALSE
+# #	XY73	STR     0001100000000000000000000000001000000000000000000000000000000000
+# 	XY73	BOOL	FALSE
+# 	XY74	BOOL	FALSE
+# 	XY75	BOOL	FALSE
+# 	XY76	BOOL	FALSE
+# END
Index: /tags/ipp-ops-20220906/ippconfig/gpc1/psastro.config
===================================================================
--- /tags/ipp-ops-20220906/ippconfig/gpc1/psastro.config	(revision 42296)
+++ /tags/ipp-ops-20220906/ippconfig/gpc1/psastro.config	(revision 42297)
@@ -407,5 +407,7 @@
 #   PSASTRO.CATDIR               STR     PS1.REF.20140605
 #  PSASTRO.CATDIR		 STR	 PS1.REF.20140713
-   PSASTRO.CATDIR		 STR	 PS1.REF.20170919
+#   PSASTRO.CATDIR		 STR	 PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
    ZERO.POINT.USE.MEAN		BOOL	TRUE  
 END
@@ -428,5 +430,7 @@
    PSASTRO.MAX.ALLOWED.FWHM    F32   24
 #   PSASTRO.CATDIR              STR   PS1.REF.20140713
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
 END
 
@@ -435,5 +439,7 @@
    PSASTRO.MAX.ALLOWED.FWHM    F32   24
 #   PSASTRO.CATDIR              STR   PS1.REF.20140713
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
 END
 
@@ -441,5 +447,7 @@
    ZERO.POINT.USE.MEAN         BOOL  TRUE
    PSASTRO.MAX.ALLOWED.FWHM    F32   24 
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
 END
 
@@ -448,5 +456,7 @@
    ZERO.POINT.USE.MEAN         BOOL  TRUE
    PSASTRO.MAX.ALLOWED.FWHM    F32   30
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
 END
 
@@ -460,5 +470,7 @@
    DVO.GETSTAR.MIN.MAG.INST    F32   -25.0
 #   PSASTRO.CATDIR              STR   PS1.REF.20140713
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
    ## refcat may be okay astrom but not faint phot -- so need to be able to further limit by ZP 
    ## -- concern w/ new refcat >20 extra sources w/ larger merr over-dominating scatter in ZP 
@@ -690,5 +702,7 @@
 #   PSASTRO.CATDIR                  STR   PS1.REF.20140605 (BAD catalog)
 #   PSASTRO.CATDIR                  STR   PS1.REF.20140713
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
    REFSTAR_MASK                    BOOL  FALSE
    PSASTRO.SAVE.REFMATCH           BOOL  FALSE
@@ -729,5 +743,7 @@
    #PSASTRO.CATDIR                  STR   PS1.REF.20140605  # ensure same catalog is used when reprocessing MD set uniformly (BAD catalog)
 #   PSASTRO.CATDIR                  STR   PS1.REF.20140713 
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
    REFSTAR_MASK                    BOOL  FALSE
    PSASTRO.SAVE.REFMATCH           BOOL  FALSE
@@ -879,5 +895,7 @@
 
 SWEETSPOT_TEST METADATA
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
    ZERO.POINT.USE.MEAN          BOOL    TRUE
 END
Index: /tags/ipp-ops-20220906/ippconfig/gpc2/psastro.config
===================================================================
--- /tags/ipp-ops-20220906/ippconfig/gpc2/psastro.config	(revision 42296)
+++ /tags/ipp-ops-20220906/ippconfig/gpc2/psastro.config	(revision 42297)
@@ -402,5 +402,7 @@
    ZERO.POINT.USE.MEAN         BOOL  TRUE
    PSASTRO.MAX.ALLOWED.FWHM    F32   24
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
 END
 
@@ -408,5 +410,7 @@
    ZERO.POINT.USE.MEAN         BOOL  TRUE
    PSASTRO.MAX.ALLOWED.FWHM    F32   24 
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
 END
 
@@ -415,5 +419,7 @@
    ZERO.POINT.USE.MEAN         BOOL  TRUE
    PSASTRO.MAX.ALLOWED.FWHM    F32   30
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR		STR	PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
 END
 
@@ -551,5 +557,7 @@
 
 SWEETSPOT_TEST METADATA
-   PSASTRO.CATDIR               STR     PS1.REF.20170919
+#   PSASTRO.CATDIR               STR     PS1.REF.20170919
+   PSASTRO.CATDIR               STR     PS1.REF.20220324
+   DVO.GETSTAR.PM.APPLY         BOOL    TRUE
    ZERO.POINT.USE.MEAN          BOOL    TRUE
    PSASTRO.GRID.MIN.ANGLE F32 -6.0 
Index: /tags/ipp-ops-20220906/psLib/src/astro/psCoord.c
===================================================================
--- /tags/ipp-ops-20220906/psLib/src/astro/psCoord.c	(revision 42296)
+++ /tags/ipp-ops-20220906/psLib/src/astro/psCoord.c	(revision 42297)
@@ -242,7 +242,4 @@
     const psPlane* coords)
 {
-  if (!transform) {
-    fprintf (stderr, "problem\n");
-  }
     PS_ASSERT_PTR_NON_NULL(transform, NULL);
     PS_ASSERT_PTR_NON_NULL(transform->x, NULL);
Index: /tags/ipp-ops-20220906/psastro/src/psastroAstromGuess.c
===================================================================
--- /tags/ipp-ops-20220906/psastro/src/psastroAstromGuess.c	(revision 42296)
+++ /tags/ipp-ops-20220906/psastro/src/psastroAstromGuess.c	(revision 42297)
@@ -320,13 +320,20 @@
         if (!chip->process || !chip->file_exists || !chip->data_exists) { continue; }
 
-	if (!chip->toFPA || !chip->fromFPA) {
+	// if a chip fails during the calibration, the associated readout->data_exists
+	// gets set to false.  This may be the wrong solution, but it does not break this
+	// analysis here.  Note this is not the chip->data_exists field tested above.
+	// chip->data_exists is only false if the chip data is missing.
+
+	// chip->fromFPA can be NULL if the inversion fails, but I'm not sure
+	// chip->toFPA can be NULL unless it was not in the original model
+	if (!chip->toFPA) {
 	  char *name = psMetadataLookupStr (NULL, chip->concepts, "CHIP.NAME");
 	  fprintf (stderr, "no astrom model for %s, skipping\n", name);
 	  continue;
 	}
-
-        // XXX we are currently inconsistent with marking the good vs the bad data
-        // psastroChipAstrom sets data_exists to false if the fit is bad.  this is
-        // probably wrong since it implies there is no data!
+	if (!chip->fromFPA) {
+	  char *name = psMetadataLookupStr (NULL, chip->concepts, "CHIP.NAME");
+	  fprintf (stderr, "inversion faiulre for %s (%d), will be skipped\n", name, view->chip);
+	}
 
         // skip chips for which the astrometry failed (NASTRO == 0)
@@ -350,4 +357,8 @@
         float astError = psMetadataLookupF32 (&status, updates, "CERROR");
         if (fabs(astError) < 1e-6) goto skip_chip;
+
+	// XXX EAM 2022.09.22 : a more robust analysis would put the corner points
+	// on the chip metadata so we can be certain the old and new corner values
+	// are correctly matched.
 
         psPlane ptCH, ptFP, ptTP;
Index: /tags/ipp-ops-20220906/psastro/src/psastroMosaicOneChip.c
===================================================================
--- /tags/ipp-ops-20220906/psastro/src/psastroMosaicOneChip.c	(revision 42296)
+++ /tags/ipp-ops-20220906/psastro/src/psastroMosaicOneChip.c	(revision 42297)
@@ -148,4 +148,7 @@
     if (order == 1) { minNstar = PS_MAX ( 8, minNstar); }
 
+    // determine fromFPA transformation and apply new transformation to raw & ref stars
+    psastroUpdateChipToFPA (fpa, chip);
+
     bool validSolution = true;
 
@@ -162,4 +165,8 @@
     if (astNstar < minNstar) {
         psLogMsg("psastro", PS_LOG_INFO, "solution uses too few stars: %d < %d", astNstar, minNstar);
+        validSolution = false;
+    }
+    if (!chip->fromFPA) {
+        psLogMsg("psastro", PS_LOG_INFO, "toFPA/fromFPA inversion failure");
         validSolution = false;
     }
@@ -189,8 +196,5 @@
     psMetadataAddF32 (updates, PS_LIST_TAIL, "AST_MRY",   PS_META_REPLACE, "mosaic astrometry Y 10-90 percentile (arcsec)", results->dYrange * plateScale);
 
-    // determine fromFPA transformation and apply new transformation to raw & ref stars
-    psastroUpdateChipToFPA (fpa, chip);
-
-    //plot results
+    // plot results
     pmAstromVisualPlotMosaicOneChip(rawstars, refstars, match, recipe);
 
Index: /tags/ipp-ops-20220906/psastro/src/psastroOneChipFit.c
===================================================================
--- /tags/ipp-ops-20220906/psastro/src/psastroOneChipFit.c	(revision 42296)
+++ /tags/ipp-ops-20220906/psastro/src/psastroOneChipFit.c	(revision 42297)
@@ -217,4 +217,8 @@
         validSolution = false;
     }
+    if (!chip->fromFPA) {
+        psLogMsg("psastro", PS_LOG_INFO, "toFPA/fromFPA inversion failure");
+        validSolution = false;
+    }
 
     // DVO expects NASTRO = 0 if we fail to find a solution
Index: /tags/ipp-ops-20220906/psastro/src/psastroOneChipGrid.c
===================================================================
--- /tags/ipp-ops-20220906/psastro/src/psastroOneChipGrid.c	(revision 42296)
+++ /tags/ipp-ops-20220906/psastro/src/psastroOneChipGrid.c	(revision 42297)
@@ -22,4 +22,6 @@
     bool status;
     pmAstromStats *stats = NULL;
+    char *chipname = psMetadataLookupStr (NULL, chip->concepts, "CHIP.NAME");
+
 
     // do we need to get a rough initial match?
@@ -49,10 +51,10 @@
     }
 
-    psLogMsg ("psastro", 3, "grid search using %ld raw vs %ld ref stars\n", rawGridStars->n, refGridStars->n);
+    psLogMsg ("psastro", 3, "grid search for chip %s using %ld raw vs %ld ref stars\n",chipname,rawGridStars->n, refGridStars->n);
 
     // find initial offset / rotation / scale
     pmAstromStats *gridStats = pmAstromGridMatch (rawGridStars, refGridStars, recipe);
     if (gridStats == NULL) {
-	psLogMsg ("psastro", 3, "failed to find a grid match solution\n");
+	psLogMsg ("psastro", 3, "failed to find a grid match solution for chip %s\n",chipname);
 	psFree (rawGridStars);
 	psFree (refGridStars);
@@ -60,5 +62,5 @@
 	return false;
     }
-    psLogMsg ("psastro", 3, "basic grid search result - offset: %f,%f pixels, rotation: %f deg\n", gridStats->offset.x, gridStats->offset.y, DEG_RAD*gridStats->angle);
+    psLogMsg ("psastro", 3, "basic grid search result for chip %s - offset: %f,%f pixels, rotation: %f deg\n",chipname, gridStats->offset.x, gridStats->offset.y, DEG_RAD*gridStats->angle);
 
 # if (1) 
@@ -73,5 +75,5 @@
 	return false;
     }
-    psLogMsg ("psastro", 3, "tweak grid search result - offset: %f,%f pixels, rotation: %f deg\n", stats->offset.x, stats->offset.y, DEG_RAD*stats->angle);
+    psLogMsg ("psastro", 3, "tweak grid search result for chip %s - offset: %f,%f pixels, rotation: %f deg\n",chipname, stats->offset.x, stats->offset.y, DEG_RAD*stats->angle);
 # else
     // EAM TEST: skip tweak
@@ -82,5 +84,5 @@
     // adjust the chip.toFPA terms only
     pmAstromGridApply (chip->toFPA, stats);
-    psastroUpdateChipToFPA (fpa, chip); // updates PSASTRO.RAWSTARS and PSASTRO.REFSTARS
+    psastroUpdateChipToFPA (fpa, chip); // updates PSASTRO.RAWSTARS and PSASTRO.REFSTARS (see note below)
     psFree (gridStats);
     psFree (rawGridStars);
@@ -90,2 +92,8 @@
     return true;
 }
+
+/* if psastroUpdateChiptoFPA fails to invert the toFPA transformation, 
+   the ref->chip coordinates will not be set.  This is not a problem
+   at this stage since they are not used in the calculation.  Later
+   passes can still yield a valid solution.
+*/
Index: /tags/ipp-ops-20220906/psastro/src/psastroUtils.c
===================================================================
--- /tags/ipp-ops-20220906/psastro/src/psastroUtils.c	(revision 42296)
+++ /tags/ipp-ops-20220906/psastro/src/psastroUtils.c	(revision 42297)
@@ -109,8 +109,18 @@
 
     psRegion *region = pmChipPixels (chip);
-
     psFree (chip->fromFPA);
     chip->fromFPA = psPlaneTransformInvert (NULL, chip->toFPA, *region, 50, 4);
     psFree (region);
+
+    // XXX EAM 2022.09.22 : for a specific case, psPlaneTransformInvert fails.
+    // This probably means the solution was poor in any case.  
+    // Some options:
+    // 1) skip the chip in psastroAstromGuessCheck (supply bad corners)
+    // 2) mark this chip as bad (return an error here and trap in psastroMosaicOneChip)
+    // 3) warn of the failure:
+    if (!chip->fromFPA) {
+	char *name = psMetadataLookupStr (NULL, chip->concepts, "CHIP.NAME");
+	psLogMsg ("psastro", PS_LOG_INFO, "WARNING: failure to invert toFPA for %s", name);
+    }
 
     // loop over cells in this chip
@@ -150,4 +160,5 @@
 		    pmAstromObj *ref = refstars->data[i];
 		    psPlaneTransformApply (ref->chip, chip->fromFPA, ref->FP);
+		    // if chip->fromFPA is NULL (non-invertable), the action is skipped
 		}
 	    }
