Index: /branches/eam_branches/ohana.20150429/src/libautocode/Makefile.Targets
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libautocode/Makefile.Targets	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libautocode/Makefile.Targets	(revision 38331)
@@ -167,4 +167,6 @@
 $(AINC)/starpar-ps1-v5.h \
 $(AINC)/starpar-ps1-sim.h \
+$(AINC)/galshape.h \
+$(AINC)/galshape-ps1-v5.h \
 $(AINC)/missing.h \
 $(AINC)/photcode.h \
Index: /branches/eam_branches/ohana.20150429/src/libautocode/def/galshape.d
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libautocode/def/galshape.d	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libautocode/def/galshape.d	(revision 38331)
@@ -7,17 +7,12 @@
 FIELD Xfit,         XFIT,    	    float,          centroid for fit
 FIELD Yfit,         YFIT,    	    float,          centroid for fit
-
 FIELD mag,          MAG,    	    float,          galaxy magnitude
 FIELD magErr,       MAG_ERR,	    float,          galaxy magnitude error
-
 FIELD majorAxis,    MAJOR_AXIS,     float,          major axis size
 FIELD minorAxis,    MINOR_AXIS,     float,          minor axis size
-
 FIELD majorAxisErr, MAJOR_AXIS_ERR, float,          major axis size error
 FIELD minorAxisErr, MINOR_AXIS_ERR, float,          minor axis size error
-
 FIELD theta,        THETA,          float,          angle
 FIELD theta_err,    THETA_ERR,      float,          angle error
-
 FIELD index,        INDEX,          float,          sersic index (if relevant)
 FIELD chisq,        CHISQ,   	    float,          fit chisq
Index: /branches/eam_branches/ohana.20150429/src/libdvo/include/dvo.h
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/include/dvo.h	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/include/dvo.h	(revision 38331)
@@ -490,5 +490,5 @@
   unsigned short   Nmeasure;             // number of psf measurements
   unsigned short   Nmissing;             // number of missings
-  unsigned short   Nextend;              // number of extended measurements
+  unsigned short   Ngalshape;            // number of extended measurements
   uint32_t         measureOffset;        // offset to first psf measurement
   uint32_t         missingOffset;        // offset to first missing obs
@@ -713,7 +713,7 @@
   int              measureOffset;        // offset to first psf measurement
   int              missingOffset;        // offset to first missing obs
-  int              galshapeOffset;       // offset to first lensing obs
+  int              lensingOffset;        // offset to first lensing obs
   int              lensobjOffset;        // offset to mean lensing data
-  int              extendOffset;         // offset to extended object entry
+  int              galshapeOffset;       // offset to extended object entry
   int              starparOffset;        // offset to stellar parameter data
   float            refColorBlue;         // color of astrometry ref stars
@@ -972,4 +972,6 @@
 Lensobj *FtableToLensobj (FTable *ftable, off_t *Nlensobj, char *format);
 StarPar *FtableToStarPar (FTable *ftable, off_t *Nstarpar, char *format);
+GalShape *FtableToGalShape (FTable *ftable, off_t *Ngalshape, char *format);
+
 int      FtableToImage   (FTable *ftable, Header *theader, char *format);
 
@@ -980,4 +982,6 @@
 int LensobjToFtable (FTable *ftable, Lensobj *lensobj, off_t Nlensobj, char format);
 int StarParToFtable (FTable *ftable, StarPar *starpar, off_t Nstarpar, char format);
+int GalShapeToFtable (FTable *ftable, GalShape *galshape, off_t Ngalshape, char format);
+
 int ImageToFtable (FTable *ftable, Header *theader, char format);
 int ImageToVtable (VTable *vtable, Header *theader, char format);
Index: /branches/eam_branches/ohana.20150429/src/libdvo/include/ps1_v5_defs.h
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/include/ps1_v5_defs.h	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/include/ps1_v5_defs.h	(revision 38331)
@@ -23,4 +23,7 @@
 StarPar_PS1_V5          *StarParInternalTo_PS1_V5 (StarPar *in, off_t Nvalues);
 
+GalShape 	       	*GalShape_PS1_V5_ToInternal (GalShape_PS1_V5 *in, off_t Nvalues);
+GalShape_PS1_V5         *GalShapeInternalTo_PS1_V5 (GalShape *in, off_t Nvalues);
+
 PhotCode                *PhotCode_PS1_V5_To_Internal (PhotCode_PS1_V5 *in, off_t Nvalues);
 PhotCode_PS1_V5         *PhotCode_Internal_To_PS1_V5 (PhotCode *in, off_t Nvalues);
Index: /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog.c
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog.c	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog.c	(revision 38331)
@@ -488,7 +488,4 @@
   galshape->photcode = 0;
   galshape->modelType = 0;
-
-  galshape->averef = 0;
-  galshape->padding = 0;
 }
 
Index: /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog_create.c
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog_create.c	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog_create.c	(revision 38331)
@@ -107,4 +107,16 @@
     free (file);
 
+    /* define galshape catalog file */
+    ALLOCATE (catalog[0].galshape_catalog, Catalog, 1);
+    dvo_catalog_init (catalog[0].galshape_catalog, TRUE);
+
+    /* create basic data for galshape catalog file */
+    gfits_create_header (&catalog[0].galshape_catalog[0].header);
+    ALLOCATE (catalog[0].galshape_catalog[0].filename, char, length);
+    sprintf (catalog[0].galshape_catalog[0].filename, "%s/%s.cpx", path, root);
+    file = filebasename (catalog[0].galshape_catalog[0].filename);
+    gfits_modify (&catalog[0].header, "GALSHAPE", "%s", 1, file);
+    free (file);
+
     free (path);
     free (root);
@@ -133,4 +145,8 @@
     }
     if (dvo_catalog_lock (catalog[0].starpar_catalog, catalog[0].lockmode) != DVO_CAT_OPEN_EMPTY) {
+      fprintf (stderr, "error with file lock\n");
+      exit (2);
+    }
+    if (dvo_catalog_lock (catalog[0].galshape_catalog, catalog[0].lockmode) != DVO_CAT_OPEN_EMPTY) {
       fprintf (stderr, "error with file lock\n");
       exit (2);
@@ -163,4 +179,5 @@
   ALLOCATE (catalog[0].lensobj, Lensobj, 1);
   ALLOCATE (catalog[0].starpar, StarPar, 1);
+  ALLOCATE (catalog[0].galshape, GalShape, 1);
 
   /* setup secondary filters to match photcodes:
Index: /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog_mef.c
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog_mef.c	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog_mef.c	(revision 38331)
@@ -293,14 +293,14 @@
     catalog[0].galshape = FtableToGalShape (&ftable, &catalog[0].Ngalshape, &catalog[0].catformat);
     if (Ngalshape != catalog[0].Ngalshape_disk) {
-      fprintf (stderr, "Warning: mismatch between Ngalshape in PHU and Table headers ("OFF_T_FMT" vs "OFF_T_FMT")\n",  Nlensing,  catalog[0].Nlensing_disk);
-    }
-    catalog[0].Nlensing = catalog[0].Nlensing_disk;
-    catalog[0].Nlensing_off = 0;
-  } else {
-    Nbytes = gfits_data_size (&header);
-    fseeko (catalog[0].f, Nbytes, SEEK_CUR);
-    ALLOCATE (catalog[0].lensing, Lensing, 1);
-    catalog[0].Nlensing = 0;
-    catalog[0].Nlensing_off = catalog[0].Nlensing_disk;
+      fprintf (stderr, "Warning: mismatch between Ngalshape in PHU and Table headers ("OFF_T_FMT" vs "OFF_T_FMT")\n",  Ngalshape,  catalog[0].Ngalshape_disk);
+    }
+    catalog[0].Ngalshape = catalog[0].Ngalshape_disk;
+    catalog[0].Ngalshape_off = 0;
+  } else {
+    Nbytes = gfits_data_size (&header);
+    fseeko (catalog[0].f, Nbytes, SEEK_CUR);
+    ALLOCATE (catalog[0].galshape, GalShape, 1);
+    catalog[0].Ngalshape = 0;
+    catalog[0].Ngalshape_off = catalog[0].Ngalshape_disk;
   }
 
@@ -356,4 +356,6 @@
   gfits_modify (&catalog[0].header, "NLENSOBJ", OFF_T_FMT, 1,  catalog[0].Nlensobj);
   gfits_modify (&catalog[0].header, "NSTARPAR", OFF_T_FMT, 1,  catalog[0].Nstarpar);
+  gfits_modify (&catalog[0].header, "NGALSHAPE", OFF_T_FMT, 1,  catalog[0].Ngalshape);
+
   gfits_modify_alt (&catalog[0].header, "EXTEND",   "%t", 1, TRUE);
   gfits_modify (&catalog[0].header, "OBJID",    "%d", 1, catalog[0].objID);
@@ -461,13 +463,19 @@
   gfits_free_header (&header);
 
-  /* free temp storage */
-  if (primary != NULL) {
-    free (primary);
-    free (secfilt);
-  }
-  return (TRUE);
-
   /* write out StarPar table (convert to FITS table format) */
   StarParToFtable (&ftable, catalog[0].starpar, catalog[0].Nstarpar, catalog[0].catformat);
+  if (!gfits_fwrite_Theader (catalog[0].f, &header)) {
+    fprintf (stderr, "can't write table header");
+    goto failure;
+  }
+  if (!gfits_fwrite_table (catalog[0].f, &ftable)) {
+    fprintf (stderr, "can't write table data");
+    goto failure;
+  }
+  gfits_free_table (&ftable);
+  gfits_free_header (&header);
+
+  /* write out GalShape table (convert to FITS table format) */
+  GalShapeToFtable (&ftable, catalog[0].galshape, catalog[0].Ngalshape, catalog[0].catformat);
   if (!gfits_fwrite_Theader (catalog[0].f, &header)) {
     fprintf (stderr, "can't write table header");
Index: /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog_split.c
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog_split.c	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_catalog_split.c	(revision 38331)
@@ -192,7 +192,8 @@
     // databases created prior to ~2014.07.01 did not have the LENSING, LENSOBJ, STARPAR paths in their headers.
     // in these cases, we do not try to lock or open the relevant file
-    if (!strcmp (name, "LENSING")) return (DVO_CAT_OPEN_EMPTY);
-    if (!strcmp (name, "LENSOBJ")) return (DVO_CAT_OPEN_EMPTY);
-    if (!strcmp (name, "STARPAR")) return (DVO_CAT_OPEN_EMPTY);
+    if (!strcmp (name, "LENSING"))  return (DVO_CAT_OPEN_EMPTY);
+    if (!strcmp (name, "LENSOBJ"))  return (DVO_CAT_OPEN_EMPTY);
+    if (!strcmp (name, "STARPAR"))  return (DVO_CAT_OPEN_EMPTY);
+    if (!strcmp (name, "GALSHAPE")) return (DVO_CAT_OPEN_EMPTY);
     return (DVO_CAT_OPEN_FAIL);
   }
@@ -240,4 +241,5 @@
   off_t Nlensobj;
   off_t Nstarpar;
+  off_t Ngalshape;
   off_t Nitems;
   int status, Nsecfilt;
@@ -254,12 +256,13 @@
 
   /* get the components from the header - these duplicate information in the split files (NAXIS2) */
-  // NSTARS, NMEAS, NMISS are required; NLENSING, NLENSOBJ, NSTARPAR are not (0 if not found)
-  if (!gfits_scan (&catalog[0].header, "NSTARS",   OFF_T_FMT, 1,  &Naverage)) return (FALSE);
-  if (!gfits_scan (&catalog[0].header, "NMEAS",    OFF_T_FMT, 1,  &Nmeasure)) return (FALSE);
-  if (!gfits_scan (&catalog[0].header, "NMISS",    OFF_T_FMT, 1,  &Nmissing)) return (FALSE);
-  if (!gfits_scan (&catalog[0].header, "NSECFILT",      "%d", 1,  &Nsecfilt)) Nsecfilt = 0;
-  if (!gfits_scan (&catalog[0].header, "NLENSING", OFF_T_FMT, 1,  &Nlensing)) Nlensing = 0;
-  if (!gfits_scan (&catalog[0].header, "NLENSOBJ", OFF_T_FMT, 1,  &Nlensobj)) Nlensobj = 0;
-  if (!gfits_scan (&catalog[0].header, "NSTARPAR", OFF_T_FMT, 1,  &Nstarpar)) Nstarpar = 0;
+  // NSTARS, NMEAS, NMISS are required; NLENSING, NLENSOBJ, NSTARPAR, NGALSHAPE are not (0 if not found)
+  if (!gfits_scan (&catalog[0].header, "NSTARS",    OFF_T_FMT, 1,  &Naverage))  return (FALSE);
+  if (!gfits_scan (&catalog[0].header, "NMEAS",     OFF_T_FMT, 1,  &Nmeasure))  return (FALSE);
+  if (!gfits_scan (&catalog[0].header, "NMISS",     OFF_T_FMT, 1,  &Nmissing))  return (FALSE);
+  if (!gfits_scan (&catalog[0].header, "NSECFILT",       "%d", 1,  &Nsecfilt))  Nsecfilt  = 0;
+  if (!gfits_scan (&catalog[0].header, "NLENSING",  OFF_T_FMT, 1,  &Nlensing))  Nlensing  = 0;
+  if (!gfits_scan (&catalog[0].header, "NLENSOBJ",  OFF_T_FMT, 1,  &Nlensobj))  Nlensobj  = 0;
+  if (!gfits_scan (&catalog[0].header, "NSTARPAR",  OFF_T_FMT, 1,  &Nstarpar))  Nstarpar  = 0;
+  if (!gfits_scan (&catalog[0].header, "NGALSHAPE", OFF_T_FMT, 1,  &Ngalshape)) Ngalshape = 0;
 
   /* the OBJID is a counter that uniquely defines an average entry and never changes.  if
@@ -280,7 +283,8 @@
   catalog[0].Nmiss_disk = Nmissing;
   catalog[0].Nsecf_disk = Naverage * Nsecfilt;
-  catalog[0].Nlensing_disk = Nlensing;
-  catalog[0].Nlensobj_disk = Nlensobj;
-  catalog[0].Nstarpar_disk = Nstarpar;
+  catalog[0].Nlensing_disk  = Nlensing;
+  catalog[0].Nlensobj_disk  = Nlensobj;
+  catalog[0].Nstarpar_disk  = Nstarpar;
+  catalog[0].Ngalshape_disk = Ngalshape;
 
   /**  Nsecfilt is unusual: it does not list the number of data items in the table
@@ -289,11 +293,12 @@
 
   /* default values, but we will assign these a valid value before we exit (even if empty) */
-  catalog[0].average = NULL;
-  catalog[0].measure = NULL;
-  catalog[0].missing = NULL;
-  catalog[0].secfilt = NULL;
-  catalog[0].lensing = NULL;
-  catalog[0].lensobj = NULL;
-  catalog[0].starpar = NULL;
+  catalog[0].average  = NULL;
+  catalog[0].measure  = NULL;
+  catalog[0].missing  = NULL;
+  catalog[0].secfilt  = NULL;
+  catalog[0].lensing  = NULL;
+  catalog[0].lensobj  = NULL;
+  catalog[0].starpar  = NULL;
+  catalog[0].galshape = NULL;
 
   /*** Average Table ***/
@@ -567,4 +572,44 @@
   gfits_free_header (&header);
 
+  /*** GalShape Table ***/
+  if (!(catalog[0].catflags & SKIP_GALSHAPE)) {
+    // unless we specify 'skip', we still need to load the GalShape table
+    status = dvo_catalog_open_subcat (catalog, &catalog[0].galshape_catalog, ftable.header, "GALSHAPE", VERBOSE);
+    if (status == DVO_CAT_OPEN_FAIL) {
+      return (FALSE);
+    }
+    // the GalShape file need not exist, unless we expect data to exist
+    if ((status == DVO_CAT_OPEN_EMPTY) && (catalog[0].Ngalshape_disk > 0)) {
+      return (FALSE);
+    }
+  }
+  if ((status != DVO_CAT_OPEN_EMPTY) && (catalog[0].catflags & LOAD_GALSHAPE)) {
+    // only read the GalShape table if the file actually exists
+    /* read GalShape table data */
+    if (!gfits_fread_ftable_data (catalog[0].galshape_catalog[0].f, &ftable, FALSE)) {
+      if (VERBOSE) fprintf (stderr, "can't read table galshape data\n");
+      return (FALSE);
+    }
+    /* convert data format to internal : returns number of row read in Ngalshape */
+    catalog[0].galshape = FtableToGalShape (&ftable, &Ngalshape, &catalog[0].catformat);
+    if (Ngalshape != catalog[0].Ngalshape_disk) {
+      fprintf (stderr, "Warning: mismatch between Ngalshape in PHU and Table headers ("OFF_T_FMT" vs "OFF_T_FMT")\n",  Ngalshape,  catalog[0].Ngalshape_disk);
+    }
+    catalog[0].Ngalshape = catalog[0].Ngalshape_disk;
+    catalog[0].Ngalshape_off = 0;
+  } else {
+    if (catalog[0].galshape_catalog) {
+      gfits_free_header (&catalog[0].galshape_catalog[0].header);
+    } else {
+      ALLOCATE (catalog[0].galshape_catalog, Catalog, 1);
+      dvo_catalog_init (catalog[0].galshape_catalog, TRUE);
+    }
+    gfits_create_header (&catalog[0].galshape_catalog[0].header);
+    ALLOCATE (catalog[0].galshape, GalShape, 1);
+    catalog[0].Ngalshape = 0;
+    catalog[0].Ngalshape_off = catalog[0].Ngalshape_disk;
+  }
+  gfits_free_header (&header);
+
   return (TRUE);
 }
@@ -575,5 +620,5 @@
 
   off_t Nbytes;
-  off_t Naverage, Nexpect, Nitems, Nmeasure, Nmissing, Nlensing, Nlensobj, Nstarpar;
+  off_t Naverage, Nexpect, Nitems, Nmeasure, Nmissing, Nlensing, Nlensobj, Nstarpar, Ngalshape;
   Header header;
   FTable ftable;
@@ -808,4 +853,35 @@
   }
 
+  // XXX check the open status of the catalog
+  if (catalog[0].catflags & LOAD_GALSHAPE) {
+
+    Catalog *subcat = catalog[0].galshape_catalog;
+
+    /* move pointer past header -- must be already read (load_catalog) */
+    Nbytes = subcat[0].header.datasize + gfits_data_size (&subcat[0].header);
+    fseeko (subcat[0].f, Nbytes, SEEK_SET);
+
+    /* read GalShape table header */
+    if (!gfits_fread_header (subcat[0].f, &header)) {
+      if (VERBOSE) fprintf (stderr, "can't read table galshape header");
+      return (FALSE);
+    }
+    /* read GalShape table data : format is irrelevant here */
+    if (!gfits_fread_ftable_range (subcat[0].f, FALSE, &ftable, start, Nrows)) {
+      if (VERBOSE) fprintf (stderr, "can't read table galshape data");
+      return (FALSE);
+    }
+
+    /* convert data format to internal : returns number of row read in Ngalshape */
+    catalog[0].galshape = FtableToGalShape (&ftable, &Ngalshape, &catalog[0].catformat);
+    if (Ngalshape != Nrows) {
+      // XXX this condition denotes the eof has been reached; not an error or a warning
+      // fprintf (stderr, "Warning: mismatch between Ngalshape in PHU and Table headers ("OFF_T_FMT" vs "OFF_T_FMT")\n",  Ngalshape,  Nrows);
+    }
+    gfits_free_header (&header);
+    catalog[0].Ngalshape = Ngalshape;
+    catalog[0].Ngalshape_off = start;
+  }
+
   return (TRUE);
 }
@@ -819,5 +895,5 @@
   SecFilt *primary, *secfilt;
   int Nsecfilt;
-  off_t Naves_disk_new, Nmeas_disk_new, Nmiss_disk_new, Nsecf_disk_new, Nlensing_disk_new, Nlensobj_disk_new, Nstarpar_disk_new;
+  off_t Naves_disk_new, Nmeas_disk_new, Nmiss_disk_new, Nsecf_disk_new, Nlensing_disk_new, Nlensobj_disk_new, Nstarpar_disk_new, Ngalshape_disk_new;
   off_t first, start, Nrows;
 
@@ -853,13 +929,16 @@
   Nlensobj_disk_new = MAX (catalog[0].Nlensobj_disk, catalog[0].Nlensobj + catalog[0].Nlensobj_off);
   Nstarpar_disk_new = MAX (catalog[0].Nstarpar_disk, catalog[0].Nstarpar + catalog[0].Nstarpar_off);
+  Ngalshape_disk_new = MAX (catalog[0].Ngalshape_disk, catalog[0].Ngalshape + catalog[0].Ngalshape_off);
 
   /* make sure header is consistent with data */
-  gfits_modify (&catalog[0].header, "NSTARS",   OFF_T_FMT, 1,  Naves_disk_new);
-  gfits_modify (&catalog[0].header, "NMEAS",    OFF_T_FMT, 1,  Nmeas_disk_new);
-  gfits_modify (&catalog[0].header, "NMISS",    OFF_T_FMT, 1,  Nmiss_disk_new);
-  gfits_modify (&catalog[0].header, "NSECFILT", "%d",   1, Nsecfilt);
-  gfits_modify (&catalog[0].header, "NLENSING", OFF_T_FMT, 1,  Nlensing_disk_new);
-  gfits_modify (&catalog[0].header, "NLENSOBJ", OFF_T_FMT, 1,  Nlensobj_disk_new);
-  gfits_modify (&catalog[0].header, "NSTARPAR", OFF_T_FMT, 1,  Nstarpar_disk_new);
+  gfits_modify (&catalog[0].header, "NSTARS",    OFF_T_FMT, 1,  Naves_disk_new);
+  gfits_modify (&catalog[0].header, "NMEAS",     OFF_T_FMT, 1,  Nmeas_disk_new);
+  gfits_modify (&catalog[0].header, "NMISS",     OFF_T_FMT, 1,  Nmiss_disk_new);
+  gfits_modify (&catalog[0].header, "NSECFILT",  "%d",      1,  Nsecfilt);
+  gfits_modify (&catalog[0].header, "NLENSING",  OFF_T_FMT, 1,  Nlensing_disk_new);
+  gfits_modify (&catalog[0].header, "NLENSOBJ",  OFF_T_FMT, 1,  Nlensobj_disk_new);
+  gfits_modify (&catalog[0].header, "NSTARPAR",  OFF_T_FMT, 1,  Nstarpar_disk_new);
+  gfits_modify (&catalog[0].header, "NGALSHAPE", OFF_T_FMT, 1,  Ngalshape_disk_new);
+
   gfits_modify_alt (&catalog[0].header, "EXTEND",   "%t", 1, TRUE);
   gfits_modify (&catalog[0].header, "OBJID",    "%d", 1, catalog[0].objID);
@@ -1067,4 +1146,33 @@
   }
 
+  /*** GalShape Table (optional, do not save if not loaded) ***/
+  if ((catalog[0].catflags & LOAD_GALSHAPE) && catalog[0].galshape_catalog->f && catalog[0].galshape) {
+
+    first  = 0;                    // first row in memory to write
+    start  = catalog[0].Ngalshape_off; // first disk row to write
+    Nrows  = catalog[0].Ngalshape - first;
+
+    assert (Nrows >= 0);
+    assert (first >= 0);
+    assert (first <= catalog[0].Ngalshape);
+    assert (catalog[0].Ngalshape_disk >= catalog[0].Ngalshape_off);
+
+    if (catalog[0].Ngalshape) {
+      // convert to external table format (note that the block above does not damage or free catalog.average) 
+      if (!GalShapeToFtable (&ftable, &catalog[0].galshape[first], Nrows, catalog[0].catformat)) {
+	fprintf (stderr, "trouble converting format\n");
+	goto failure;
+      }
+
+      // write out GalShape table
+      if (!dvo_catalog_save_subcat (catalog[0].galshape_catalog, &ftable, start, Nrows, catalog[0].Ngalshape_disk, Ngalshape_disk_new)) {
+	fprintf (stderr, "trouble writing GalShape table\n");
+	goto failure;
+      }
+      gfits_free_header (&header);
+      gfits_free_table (&ftable);
+    }
+  }
+
   /* free temp storage */
   if (primary != NULL) {
@@ -1093,5 +1201,5 @@
   SecFilt *primary, *secfilt;
   int Nsecfilt;
-  off_t Naves_disk_new, Nmeas_disk_new, Nmiss_disk_new, Nsecf_disk_new, Nlensing_disk_new, Nlensobj_disk_new, Nstarpar_disk_new;
+  off_t Naves_disk_new, Nmeas_disk_new, Nmiss_disk_new, Nsecf_disk_new, Nlensing_disk_new, Nlensobj_disk_new, Nstarpar_disk_new, Ngalshape_disk_new;
   off_t first, start, Nrows;
 
@@ -1128,4 +1236,8 @@
   if (catalog[0].Nstarpar_off > 0) {
     fprintf (stderr, "ERROR: only partial catalog (StarPar) was loaded\n");
+    goto failure;
+  }
+  if (catalog[0].Ngalshape_off > 0) {
+    fprintf (stderr, "ERROR: only partial catalog (GalShape) was loaded\n");
     goto failure;
   }
@@ -1157,4 +1269,5 @@
   Nlensobj_disk_new = catalog[0].Nlensobj;
   Nstarpar_disk_new = catalog[0].Nstarpar;
+  Ngalshape_disk_new = catalog[0].Ngalshape;
 
   /* make sure header is consistent with data */
@@ -1166,4 +1279,5 @@
   gfits_modify (&catalog[0].header, "NLENSOBJ", OFF_T_FMT, 1,  Nlensobj_disk_new);
   gfits_modify (&catalog[0].header, "NSTARPAR", OFF_T_FMT, 1,  Nstarpar_disk_new);
+  gfits_modify (&catalog[0].header, "NGALSHAPE", OFF_T_FMT, 1, Ngalshape_disk_new);
   gfits_modify_alt (&catalog[0].header, "EXTEND",   "%t", 1, TRUE);
   gfits_modify (&catalog[0].header, "OBJID",    "%d", 1, catalog[0].objID);
@@ -1359,4 +1473,31 @@
     if (!dvo_catalog_save_subcat (catalog[0].starpar_catalog, &ftable, start, Nrows, catalog[0].Nstarpar_disk, Nstarpar_disk_new)) {
       fprintf (stderr, "trouble writing StarPar table\n");
+      goto failure;
+    }
+    gfits_free_header (&header);
+    gfits_free_table (&ftable);
+  }
+
+  /*** GalShape Table ***/
+  if ((catalog[0].catflags & LOAD_GALSHAPE) && (catalog[0].galshape != NULL)) {
+
+    first  = 0;                    // first row in memory to write
+    start  = catalog[0].Ngalshape_off; // first disk row to write
+    Nrows  = catalog[0].Ngalshape - first;
+
+    assert (Nrows >= 0);
+    assert (first >= 0);
+    assert (first <= catalog[0].Ngalshape);
+    assert (catalog[0].Ngalshape_disk >= catalog[0].Ngalshape_off);
+
+    // convert to external table format
+    if (!GalShapeToFtable (&ftable, &catalog[0].galshape[first], Nrows, catalog[0].catformat)) {
+      fprintf (stderr, "trouble converting format\n");
+      goto failure;
+    }
+
+    // write out GalShape table
+    if (!dvo_catalog_save_subcat (catalog[0].galshape_catalog, &ftable, start, Nrows, catalog[0].Ngalshape_disk, Ngalshape_disk_new)) {
+      fprintf (stderr, "trouble writing GalShape table\n");
       goto failure;
     }
@@ -1390,5 +1531,5 @@
   SecFilt *primary, *secfilt;
   int Nsecfilt;
-  off_t Naves_disk_new, Nmeas_disk_new, Nmiss_disk_new, Nsecf_disk_new, Nlensing_disk_new, Nlensobj_disk_new, Nstarpar_disk_new;
+  off_t Naves_disk_new, Nmeas_disk_new, Nmiss_disk_new, Nsecf_disk_new, Nlensing_disk_new, Nlensobj_disk_new, Nstarpar_disk_new, Ngalshape_disk_new;
   off_t first, start, Nrows;
 
@@ -1423,4 +1564,5 @@
   Nlensobj_disk_new = MAX (catalog[0].Nlensobj_disk, catalog[0].Nlensobj + catalog[0].Nlensobj_off);
   Nstarpar_disk_new = MAX (catalog[0].Nstarpar_disk, catalog[0].Nstarpar + catalog[0].Nstarpar_off);
+  Ngalshape_disk_new = MAX (catalog[0].Ngalshape_disk, catalog[0].Ngalshape + catalog[0].Ngalshape_off);
 
   /* make sure header is consistent with data */
@@ -1432,4 +1574,6 @@
   gfits_modify (&catalog[0].header, "NLENSOBJ", OFF_T_FMT, 1,  Nlensobj_disk_new);
   gfits_modify (&catalog[0].header, "NSTARPAR", OFF_T_FMT, 1,  Nstarpar_disk_new);
+  gfits_modify (&catalog[0].header, "NGALSHAPE", OFF_T_FMT, 1,  Ngalshape_disk_new);
+
   gfits_modify_alt (&catalog[0].header, "EXTEND",   "%t", 1, TRUE);
   gfits_modify (&catalog[0].header, "OBJID",    "%d", 1, catalog[0].objID);
@@ -1630,4 +1774,32 @@
     if (!dvo_catalog_save_subcat (catalog[0].starpar_catalog, &ftable, start, Nrows, catalog[0].Nstarpar_disk, Nstarpar_disk_new)) {
       fprintf (stderr, "trouble writing StarPar table\n");
+      goto failure;
+    }
+    gfits_free_header (&header);
+    gfits_free_table (&ftable);
+  }
+
+  /*** GalShape Table ***/
+  if (catalog[0].galshape != NULL) {
+
+    first  = catalog[0].Ngalshape_disk - catalog[0].Ngalshape_off;  // first row in memory to write
+    start  = catalog[0].Ngalshape_disk; // first disk row to write
+    Nrows  = catalog[0].Ngalshape - first;
+
+    assert (Nrows >= 0);
+    assert (first >= 0);
+    assert (first <= catalog[0].Ngalshape);
+    assert (catalog[0].Ngalshape_disk >= catalog[0].Ngalshape_off);
+
+    // convert to external table format
+    // XXX does catalog.galshape have averef correctly set up?
+    if (!GalShapeToFtable (&ftable, &catalog[0].galshape[first], Nrows, catalog[0].catformat)) {
+      fprintf (stderr, "trouble converting format\n");
+      goto failure;
+    }
+
+    // write out GalShape table
+    if (!dvo_catalog_save_subcat (catalog[0].galshape_catalog, &ftable, start, Nrows, catalog[0].Ngalshape_disk, Ngalshape_disk_new)) {
+      fprintf (stderr, "trouble writing GalShape table\n");
       goto failure;
     }
Index: /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_DEV_2.c
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_DEV_2.c	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_DEV_2.c	(revision 38331)
@@ -118,5 +118,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Nextend;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
@@ -152,5 +152,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Nextend       = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
Index: /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V1.c
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V1.c	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V1.c	(revision 38331)
@@ -138,5 +138,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
@@ -173,5 +173,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
Index: /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V2.c
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V2.c	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V2.c	(revision 38331)
@@ -143,5 +143,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
@@ -182,5 +182,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
Index: /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V3.c
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V3.c	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V3.c	(revision 38331)
@@ -143,5 +143,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
@@ -184,5 +184,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
Index: /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V4.c
===================================================================
--- /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V4.c	(revision 38330)
+++ /branches/eam_branches/ohana.20150429/src/libdvo/src/dvo_convert_PS1_V4.c	(revision 38331)
@@ -164,5 +164,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
@@ -208,5 +208,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
@@ -690,5 +690,5 @@
     out[i].Nmeasure      = in[i].Nmeasure;     
     out[i].Nmissing      = in[i].Nmissing;     
-    out[i].Nextend       = in[i].Nextend;     
+    out[i].Ngalshape     = in[i].Ngalshape;     
     out[i].measureOffset = in[i].measureOffset; 
     out[i].missingOffset = in[i].missingOffset;
