Index: /trunk/psModules/src/astrom/pmAstrometryTable.c
===================================================================
--- /trunk/psModules/src/astrom/pmAstrometryTable.c	(revision 15674)
+++ /trunk/psModules/src/astrom/pmAstrometryTable.c	(revision 15675)
@@ -8,6 +8,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-11-21 07:02:55 $
+ *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-11-21 09:59:40 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -90,35 +90,74 @@
 }
 
-/********************* WritePHU function *****************************/
-
-bool pmAstromWritePHU (const pmFPAview *view, pmFPAfile *file, const pmConfig *config) { 
-
-    // not needed if already written
-    if (file->wrote_phu) return true;
-
-    // not needed if not FPA
-    // XXX this prevents us from defining a SPLIT/MEF CMF file...
-    if (file->fileLevel != PM_FPA_LEVEL_FPA) return true;
-
-    // find the FPA phu
-    // XXX do we need to supply a header from the image?
-    pmHDU *phu = pmFPAviewThisPHU (view, file->fpa);
-
-    // if there is no PHU, this is a single header+image (extension-less) file. This could be
+/********************* Write Data functions *****************************/
+
+bool pmAstromWriteForView (const pmFPAview *view, pmFPAfile *file, const pmConfig *config) {
+
+    // write the full table in one pass: require the level to be FPA
+    if (view->chip != -1) {
+	psError(PS_ERR_IO, false, "Astrometry must be written at the chip level");
+	return false;
+    }
+
+    if (!pmAstromWriteFPA (file)) {
+	psError(PS_ERR_IO, false, "Failed to write Astrometry for fpa");
+	return false;
+    }
+    return true;
+}
+
+// write out all chip-level Astrometry data for this FPA
+bool pmAstromWriteFPA (pmFPAfile *file) {
+
+    if (!pmAstromWritePHU (file)) {
+	psError(PS_ERR_IO, false, "Failed to write PHU for Astrometry table");
+	return false;
+    }
+
+    if (!pmAstromWriteSky (file)) {
+	psError(PS_ERR_IO, false, "Failed to write Sky for Astrometry table");
+	return false;
+    }
+
+    if (!pmAstromWriteTP (file)) {
+	psError(PS_ERR_IO, false, "Failed to write Sky for Astrometry table");
+	return false;
+    }
+
+    if (!pmAstromWriteFP (file)) {
+	psError(PS_ERR_IO, false, "Failed to write Sky for Astrometry table");
+	return false;
+    }
+
+    if (!pmAstromWriteChips (file)) {
+	psError(PS_ERR_IO, false, "Failed to write Astrometry for chips");
+	return false;
+    }
+    return true;
+}
+
+bool pmAstromWritePHU (pmFPAfile *file) { 
+
+    // output header data 
+    psMetadata *outhead = psMetadataAlloc();
+
+    // use the FPA phu to generate the PHU header
+    pmHDU *phu = file->fpa->hdu;
+
+    // if there is no FPA PHU, this is a single header+image (extension-less) file. This could be
     // the case for an input SPLIT set of files being written out as a MEF.  if there is a PHU,
     // write it out as a 'blank'
-    psMetadata *outhead = psMetadataAlloc();
     if (phu) {
-        psMetadataCopy (outhead, phu->header);
+	psMetadataCopy (outhead, phu->header);
     } else {
-        pmConfigConformHeader (outhead, file->format);
+	pmConfigConformHeader (outhead, file->format);
 
 	// XXX probably need other info to conform the header
-        psMetadata *fileData = psMetadataLookupMetadata(NULL, file->format, "FILE"); // File information
-        const char *fpaNameHdr = psMetadataLookupStr(NULL, fileData, "FPA.NAME");
-        if (fpaNameHdr && strlen(fpaNameHdr) > 0) {
-            const char *fpaName = psMetadataLookupStr(NULL, file->fpa->concepts, "FPA.NAME");
-            psMetadataAddStr(outhead, PS_LIST_TAIL, fpaNameHdr, PS_META_REPLACE, "FPA name", fpaName);
-        }
+	psMetadata *fileData = psMetadataLookupMetadata(NULL, file->format, "FILE"); // File information
+	const char *fpaNameHdr = psMetadataLookupStr(NULL, fileData, "FPA.NAME");
+	if (fpaNameHdr && strlen(fpaNameHdr) > 0) {
+	    const char *fpaName = psMetadataLookupStr(NULL, file->fpa->concepts, "FPA.NAME");
+	    psMetadataAddStr(outhead, PS_LIST_TAIL, fpaNameHdr, PS_META_REPLACE, "FPA name", fpaName);
+	}
     }
 
@@ -133,69 +172,8 @@
 }
 
-/********************* Write Data functions *****************************/
-
-bool pmAstromWriteForView (const pmFPAview *view, pmFPAfile *file, const pmConfig *config) {
-
-    pmFPA *fpa = file->fpa;
-
-    if (view->chip == -1) {
-        if (!pmAstromWriteFPA (fpa, view, file, config)) {
-            psError(PS_ERR_IO, false, "Failed to write Astrometry for fpa");
-            return false;
-        }
-        return true;
-    }
-    if (view->chip >= fpa->chips->n) {
-        return false;
-    }
-    pmChip *chip = fpa->chips->data[view->chip];
-
-    if (view->cell == -1) {
-        if (!pmAstromWriteChip (chip, view, file, config)) {
-            psError(PS_ERR_IO, false, "Failed to write Astrometry for chip");
-            return false;
-        }
-        return true;
-    }
-
-    psError(PS_ERR_IO, false, "Astrometry must be written at the chip level");
-    return false;
-}
-
-// write out all chip-level Astrometry data for this FPA
-bool pmAstromWriteFPA (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
-{
-    pmFPAview *thisView = pmFPAviewAlloc (view->nRows);
-    *thisView = *view;
-
-    for (int i = 0; i < fpa->chips->n; i++) {
-        pmChip *chip = fpa->chips->data[i];
-        thisView->chip = i;
-        if (!pmAstromWriteChip (chip, thisView, file, config)) {
-            psError(PS_ERR_IO, false, "Failed to write Astrometry for %dth chip", i);
-            psFree(thisView);
-            return false;
-        }
-    }
-    psFree(thisView);
-    return true;
-}
-
-// write out chip-level Astrometry data for this chip
-// XXX this function writes out astrometry elements for a chip->fpa->tp->sky layer set
-// XXX we need to ensure the chip and fpa level data are written
-// XXX can we write the rows one at a time (or groups at a time?)
-// XXX allow this to be chip level, or just force to be fpa?  is it valid at the chip level??
-bool pmAstromWriteChip (pmChip *chip, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
-{
-    psArray *table;
-    psMetadata *row;
-    psMetadata *header;
-
-    // write out the blank PHU to start the file
-    psFitsWriteBlank (file->fits, NULL, NULL);
-
-    // first layer is the sky
-    header = psMetadataAlloc();
+// first layer is the sky
+bool pmAstromWriteSky (pmFPAfile *file) {
+
+    psMetadata *header = psMetadataAlloc();
     psMetadataAddStr(header, PS_LIST_TAIL, "COORD",    PS_META_REPLACE, "name of this layer", 	"SKY");
     psMetadataAddStr(header, PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",      	"NONE");
@@ -203,6 +181,6 @@
     psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent",  	"NONE");
 
-    table = psArrayAllocEmpty (1);
-    row = psMetadataAlloc ();
+    psArray *table = psArrayAllocEmpty (1);
+    psMetadata *row = psMetadataAlloc ();
     psMetadataAddStr(row,    PS_LIST_TAIL, "SEGMENT",  PS_META_REPLACE, "name of this segment", "SKY");
     psMetadataAddStr(row,    PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",        "NONE");
@@ -219,7 +197,11 @@
     psFree (table);
     psFree (header);
-
-    // second layer is the tangent plane
-    header = psMetadataAlloc();
+    return (true);
+}
+
+// second layer is the tangent plane
+bool pmAstromWriteTP (pmFPAfile *file) {
+
+    psMetadata *header = psMetadataAlloc();
     psMetadataAddStr(header, PS_LIST_TAIL, "COORD",    PS_META_REPLACE, "name of this layer",	"TANGENT_PLANE");
     psMetadataAddStr(header, PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",     	"SKY");
@@ -227,6 +209,6 @@
     psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", 	"PROJECTION");
 
-    table = psArrayAllocEmpty (1);
-    row = psMetadataAlloc ();
+    psArray *table = psArrayAllocEmpty (1);
+    psMetadata *row = psMetadataAlloc ();
     psMetadataAddStr(row,    PS_LIST_TAIL, "SEGMENT",  PS_META_REPLACE, "name of this segment", "TANGENT_PLANE");
     psMetadataAddStr(row,    PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",        "SKY");
@@ -252,9 +234,14 @@
     }
 
+    psFree (region);
     psFree (table);
     psFree (header);
-
-    // third layer is the focal plane
-    header = psMetadataAlloc();
+    return (true);
+}
+
+// third layer is the focal plane
+bool pmAstromWriteFP (pmFPAfile *file) {
+
+    psMetadata *header = psMetadataAlloc();
     psMetadataAddStr(header, PS_LIST_TAIL, "COORD",    PS_META_REPLACE, "name of this layer",	"FOCAL_PLANE");
     psMetadataAddStr(header, PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",     	"TANGENT_PLANE");
@@ -262,12 +249,12 @@
     psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", 	"POLYNOMIAL");
 
-    table = psArrayAllocEmpty (1);
+    psArray *table = psArrayAllocEmpty (1);
 
     // XXX is this or the tpa region correct?
-    region = pmAstromFPAExtent (file->fpa);
+    psRegion *region = pmAstromFPAExtent (file->fpa);
 
     for (int i = 0; i <= file->fpa->toTPA->x->nX; i++) {
 	for (int j = 0; j <= file->fpa->toTPA->x->nY; j++) {
-	    row = psMetadataAlloc ();
+	    psMetadata *row = psMetadataAlloc ();
 	    psMetadataAddStr(row,    PS_LIST_TAIL, "SEGMENT",  PS_META_REPLACE, "name of this segment", "FOCAL_PLANE");
 	    psMetadataAddStr(row,    PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",        "TANGENT_PLANE");
@@ -297,13 +284,17 @@
     psFree (table);
     psFree (header);
-
-    // fourth layer holds the chips
-    header = psMetadataAlloc();
-    psMetadataAddStr(header, PS_LIST_TAIL, "COORD",    PS_META_REPLACE, "name of this layer",	"FOCAL_PLANE");
-    psMetadataAddStr(header, PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",     	"TANGENT_PLANE");
+    return true;
+}
+
+// fourth layer holds the chips
+bool pmAstromWriteChips (pmFPAfile *file) {
+
+    psMetadata *header = psMetadataAlloc();
+    psMetadataAddStr(header, PS_LIST_TAIL, "COORD",    PS_META_REPLACE, "name of this layer",	"CHIPS");
+    psMetadataAddStr(header, PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",     	"FOCAL_PLANE");
     psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region",   	"RECTANGLE");
     psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", 	"POLYNOMIAL");
 
-    table = psArrayAllocEmpty (1);
+    psArray *table = psArrayAllocEmpty (1);
 
     pmFPAview *view = pmFPAviewAlloc (0);
@@ -314,4 +305,5 @@
 	psRegion *region = pmChipPixels (chip);
 
+	// set the chip name
 	char *chiprule = psStringCopy ("CHIP.{CHIP.NAME}"); 
         char *chipname = pmFPAfileNameFromRule (chiprule, file, view);
@@ -319,8 +311,8 @@
 	for (int i = 0; i <= chip->toFPA->x->nX; i++) {
 	    for (int j = 0; j <= chip->toFPA->x->nY; j++) {
-		row = psMetadataAlloc ();
-		// xXXX set chip name based on metadata
+		psMetadata *row = psMetadataAlloc ();
+		
 		psMetadataAddStr(row,    PS_LIST_TAIL, "SEGMENT",  PS_META_REPLACE, "name of this segment", chipname);
-		psMetadataAddStr(row,    PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",        "TANGENT_PLANE");
+		psMetadataAddStr(row,    PS_LIST_TAIL, "PARENT",   PS_META_REPLACE, "next layer up",        "FOCAL_PLANE");
 		psMetadataAddF32(row,    PS_LIST_TAIL, "MINX",     PS_META_REPLACE, "range", region->x0);
 		psMetadataAddF32(row,    PS_LIST_TAIL, "MAXX",     PS_META_REPLACE, "range", region->x1);
@@ -340,6 +332,6 @@
 	psFree (chiprule);
 	psFree (chipname);
-    }
-    psFree (view);
+	psFree (region);
+    }
 
     if (!psFitsWriteTable (file->fits, header, table, "CHIPS")) {
@@ -349,4 +341,5 @@
     }
 
+    psFree (view);
     psFree (table);
     psFree (header);
@@ -412,7 +405,7 @@
 
     // XXX finish this: uncomment when used
-    # if (0)
+# if (0)
     char *extname = pmFPAfileNameFromRule (rule, file, view);
-    # endif
+# endif
 
     // read the chip elements in the following form:
Index: /trunk/psModules/src/astrom/pmAstrometryTable.h
===================================================================
--- /trunk/psModules/src/astrom/pmAstrometryTable.h	(revision 15674)
+++ /trunk/psModules/src/astrom/pmAstrometryTable.h	(revision 15675)
@@ -4,6 +4,6 @@
  * @author EAM, IfA
  *
- * @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
- * @date $Date: 2007-11-10 01:09:20 $
+ * @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2007-11-21 09:59:40 $
  * Copyright 2006 Institute for Astronomy, University of Hawaii
  */
@@ -19,8 +19,11 @@
 bool pmAstromCheckDataStatusForChip (const pmChip *chip);
 
-bool pmAstromWritePHU (const pmFPAview *view, pmFPAfile *file, const pmConfig *config);
 bool pmAstromWriteForView (const pmFPAview *view, pmFPAfile *file, const pmConfig *config);
-bool pmAstromWriteFPA (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, const pmConfig *config);
-bool pmAstromWriteChip (pmChip *chip, const pmFPAview *view, pmFPAfile *file, const pmConfig *config);
+bool pmAstromWriteFPA (pmFPAfile *file);
+bool pmAstromWritePHU (pmFPAfile *file);
+bool pmAstromWriteSky (pmFPAfile *file);
+bool pmAstromWriteTP (pmFPAfile *file);
+bool pmAstromWriteFP (pmFPAfile *file);
+bool pmAstromWriteChips (pmFPAfile *file);
 
 bool pmAstromReadForView (const pmFPAview *view, pmFPAfile *file, const pmConfig *config);
