Index: /trunk/Ohana/src/delstar/Makefile
===================================================================
--- /trunk/Ohana/src/delstar/Makefile	(revision 4831)
+++ /trunk/Ohana/src/delstar/Makefile	(revision 4832)
@@ -16,5 +16,5 @@
 #  
 INCS	= 	-I$(INC) -I$(LINC) -I$(XINC)
-LIBS	= 	-L$(LLIB) -lFITS -lohana -lm 
+LIBS	= 	-L$(LLIB) -lohana -lFITS -lm 
 CFLAGS	=	-o $*.$(ARCH).o $(INCS) -O2
 CCFLAGS	=	$(INCS) $(LIBS) 
Index: /trunk/Ohana/src/delstar/include/delstar.h
===================================================================
--- /trunk/Ohana/src/delstar/include/delstar.h	(revision 4831)
+++ /trunk/Ohana/src/delstar/include/delstar.h	(revision 4832)
@@ -17,4 +17,6 @@
 char   GSCFILE[256];
 char   CATDIR[256];
+char   CATMODE[16];    /* raw, mef, split, mysql */
+char   CATFORMAT[16];  /* internal, elixir, loneos, panstarrs */
 double NSIGMA;
 double ALPHA;
Index: /trunk/Ohana/src/delstar/src/ConfigInit.c
===================================================================
--- /trunk/Ohana/src/delstar/src/ConfigInit.c	(revision 4831)
+++ /trunk/Ohana/src/delstar/src/ConfigInit.c	(revision 4832)
@@ -23,4 +23,6 @@
   ScanConfig (config, "GSCFILE",                "%s", 0, GSCFILE);
   ScanConfig (config, "CATDIR",                 "%s", 0, CATDIR);
+  ScanConfig (config, "CATMODE",                "%s",  0, CATMODE);
+  ScanConfig (config, "CATFORMAT",              "%s",  0, CATFORMAT);
   ScanConfig (config, "PHOTCODE_FILE",          "%s", 0, PhotCodeFile);
 
@@ -30,4 +32,7 @@
   ScanConfig (config, "MJD-KEYWORD",            "%s", 0, MJDKeyword);
   ScanConfig (config, "JD-KEYWORD",             "%s", 0, JDKeyword);
+
+  if (*CATMODE == 0) strcpy (CATMODE, "RAW");
+  if (*CATFORMAT == 0) strcpy (CATFORMAT, "ELIXIR");
 
   if (!LoadPhotcodes (PhotCodeFile)) {
Index: /trunk/Ohana/src/delstar/src/gcatalog.c
===================================================================
--- /trunk/Ohana/src/delstar/src/gcatalog.c	(revision 4831)
+++ /trunk/Ohana/src/delstar/src/gcatalog.c	(revision 4832)
@@ -5,4 +5,7 @@
   int Nsecfilt;
   char mode;
+
+  /* no autodetect for CATMODE yet */
+  strcpy (catalog[0].catmode, CATMODE);
 
   /* read catalog header */
Index: /trunk/Ohana/src/delstar/src/wcatalog.c
===================================================================
--- /trunk/Ohana/src/delstar/src/wcatalog.c	(revision 4831)
+++ /trunk/Ohana/src/delstar/src/wcatalog.c	(revision 4832)
@@ -3,8 +3,12 @@
 int wcatalog (Catalog *catalog) {
   
-  /* we'll leave these for now, but they are LONEOS specific */
-  fits_modify (&catalog[0].header, "MARKSTAR", "%t", 1, FALSE);
-  fits_modify (&catalog[0].header, "ADDUSNO", "%t", 1, FALSE);
-  fits_modify (&catalog[0].header, "MARKROCK", "%t", 1, FALSE);
+  /* set catalog format (elixir, loneos, etc) */
+  if (!strcmp (CATFORMAT, "INTERNAL")) {
+    sprintf (catalog[0].average_format, "DVO_AVERAGE");
+    sprintf (catalog[0].measure_format, "DVO_MEASURE");
+  } else {
+    sprintf (catalog[0].average_format, "DVO_AVERAGE_%s", CATFORMAT);
+    sprintf (catalog[0].measure_format, "DVO_MEASURE_%s", CATFORMAT);
+  }
 
   if (!save_catalog (catalog, VERBOSE)) {
Index: /trunk/Ohana/src/libautocode/Makefile
===================================================================
--- /trunk/Ohana/src/libautocode/Makefile	(revision 4831)
+++ /trunk/Ohana/src/libautocode/Makefile	(revision 4832)
@@ -25,6 +25,12 @@
 $(SRC)/coords.$(ARCH).o \
 $(SRC)/average.$(ARCH).o \
+$(SRC)/average-loneos.$(ARCH).o \
+$(SRC)/average-elixir.$(ARCH).o \
+$(SRC)/average-panstarrs.$(ARCH).o \
 $(SRC)/secfilt.$(ARCH).o \
 $(SRC)/measure.$(ARCH).o \
+$(SRC)/measure-loneos.$(ARCH).o \
+$(SRC)/measure-elixir.$(ARCH).o \
+$(SRC)/measure-panstarrs.$(ARCH).o \
 $(SRC)/missing.$(ARCH).o \
 $(SRC)/photcode.$(ARCH).o \
@@ -41,6 +47,12 @@
 $(INC)/coords.h \
 $(INC)/average.h \
+$(INC)/average-loneos.h \
+$(INC)/average-elixir.h \
+$(INC)/average-panstarrs.h \
 $(INC)/secfilt.h \
 $(INC)/measure.h \
+$(INC)/measure-loneos.h \
+$(INC)/measure-elixir.h \
+$(INC)/measure-panstarrs.h \
 $(INC)/missing.h \
 $(INC)/photcode.h \
Index: /trunk/Ohana/src/libautocode/def/average-elixir.d
===================================================================
--- /trunk/Ohana/src/libautocode/def/average-elixir.d	(revision 4831)
+++ /trunk/Ohana/src/libautocode/def/average-elixir.d	(revision 4832)
@@ -1,4 +1,4 @@
-STRUCT  Average
-EXTNAME DVO_AVERAGE
+STRUCT  AverageElixir
+EXTNAME DVO_AVERAGE_ELIXIR
 TYPE    BINTABLE
 SIZE    32
Index: /trunk/Ohana/src/libautocode/def/average.d
===================================================================
--- /trunk/Ohana/src/libautocode/def/average.d	(revision 4831)
+++ /trunk/Ohana/src/libautocode/def/average.d	(revision 4832)
@@ -6,6 +6,6 @@
 # elements of data structure / FITS table
 
-FIELD R_PS,              RA,         double,            RA,                	       	  decimal degrees 
-FIELD D_PS,              DEC,        double,            DEC,               	       	  decimal degrees 
+FIELD R_PS,           RA,         double,           RA,                	       	  decimal degrees 
+FIELD D_PS,           DEC,        double,           DEC,               	       	  decimal degrees 
 FIELD M,              MAG,        short,            primary mag,       	       	  millimag
 FIELD Nm,             NMEAS,      unsigned short,   number of measures
Index: /trunk/Ohana/src/libautocode/def/measure-elixir.d
===================================================================
--- /trunk/Ohana/src/libautocode/def/measure-elixir.d	(revision 4831)
+++ /trunk/Ohana/src/libautocode/def/measure-elixir.d	(revision 4832)
@@ -1,4 +1,4 @@
-STRUCT  Measure
-EXTNAME DVO_MEASURE
+STRUCT  MeasureElixir
+EXTNAME DVO_MEASURE_ELIXIR
 TYPE    BINTABLE
 SIZE    32
Index: /trunk/Ohana/src/libautocode/def/measure-panstarrs.d
===================================================================
--- /trunk/Ohana/src/libautocode/def/measure-panstarrs.d	(revision 4831)
+++ /trunk/Ohana/src/libautocode/def/measure-panstarrs.d	(revision 4832)
@@ -1,4 +1,4 @@
-STRUCT  Measure
-EXTNAME DVO_MEASURE
+STRUCT  MeasurePanstarrs
+EXTNAME DVO_MEASURE_PANSTARRS
 TYPE    BINTABLE
 SIZE    32
Index: /trunk/Ohana/src/libautocode/def/measure.d
===================================================================
--- /trunk/Ohana/src/libautocode/def/measure.d	(revision 4831)
+++ /trunk/Ohana/src/libautocode/def/measure.d	(revision 4832)
@@ -9,8 +9,8 @@
 # FIELD dR,             D_RA,      short,          RA offset,                	  1/100 arcsec
 # FIELD dD,             D_DEC,     short,          DEC offset,               	  1/100 arcsec
+
 # replace these with the above names 
 FIELD dR_PS,             D_RA,   float,          RA offset,                	  arcsec
 FIELD dD_PS,             D_DEC,  float,          DEC offset,               	  arcsec
-
 FIELD M,              MAG,        short,          catalog mag,       	       	  millimag
 FIELD Mcal,           Mcal,       short,          image cal mag,	          millimag
Index: /trunk/Ohana/src/libohana/Makefile
===================================================================
--- /trunk/Ohana/src/libohana/Makefile	(revision 4831)
+++ /trunk/Ohana/src/libohana/Makefile	(revision 4832)
@@ -33,22 +33,40 @@
 $(SRC)/ohana_allocate.$(ARCH).o  \
 $(SRC)/string.$(ARCH).o		 \
-$(SRC)/time.$(ARCH).o		 \
 $(SRC)/findexec.$(ARCH).o	 \
 $(SRC)/glockfile.$(ARCH).o	 \
+$(SRC)/time.$(ARCH).o		 \
 $(SRC)/config.$(ARCH).o		 \
 $(SRC)/version.$(ARCH).o
 
 OBJ2 = \
+$(SRC)/Fread.$(ARCH).o		 \
 $(SRC)/coordops.$(ARCH).o	 \
-$(SRC)/Fread.$(ARCH).o		 \
 $(SRC)/LoadPhotcodes.$(ARCH).o   \
-$(SRC)/photfits.$(ARCH).o	 \
-$(SRC)/phot_catalog.$(ARCH).o    \
 $(SRC)/imreg_datatypes.$(ARCH).o \
 $(SRC)/mosaic_astrom.$(ARCH).o   \
-$(SRC)/fits_db.$(ARCH).o	 
+$(SRC)/fits_db.$(ARCH).o	 \
+$(SRC)/photfits.$(ARCH).o        \
+$(SRC)/phot_catalog.$(ARCH).o    \
+$(SRC)/phot_catalog_mef.$(ARCH).o      \
+$(SRC)/phot_catalog_raw.$(ARCH).o      \
+$(SRC)/dvo_convert.$(ARCH).o           \
+$(SRC)/dvo_convert_elixir.$(ARCH).o    \
+$(SRC)/dvo_convert_loneos.$(ARCH).o    \
+$(SRC)/dvo_convert_panstarrs.$(ARCH).o
 
 AOBJ = \
 $(ASRC)/coords.$(ARCH).o \
+$(ASRC)/average.$(ARCH).o \
+$(ASRC)/average-loneos.$(ARCH).o \
+$(ASRC)/average-elixir.$(ARCH).o \
+$(ASRC)/average-panstarrs.$(ARCH).o \
+$(ASRC)/secfilt.$(ARCH).o \
+$(ASRC)/measure.$(ARCH).o \
+$(ASRC)/measure-loneos.$(ARCH).o \
+$(ASRC)/measure-elixir.$(ARCH).o \
+$(ASRC)/measure-panstarrs.$(ARCH).o \
+$(ASRC)/missing.$(ARCH).o \
+$(ASRC)/photcode.$(ARCH).o \
+$(ASRC)/image.$(ARCH).o \
 $(ASRC)/regimage.$(ARCH).o \
 $(ASRC)/detreg.$(ARCH).o \
@@ -57,6 +75,5 @@
 $(ASRC)/smpdata.$(ARCH).o \
 $(ASRC)/spectrum.$(ARCH).o \
-$(ASRC)/spectrum-ascii.$(ARCH).o \
-$(ASRC)/image.$(ARCH).o
+$(ASRC)/spectrum-ascii.$(ARCH).o
 
 ACOM = $(ADEF)/autocode.c $(ADEF)/autocode.h $(ADEF)/common.h
Index: /trunk/Ohana/src/libohana/doc/dvo-structures.txt
===================================================================
--- /trunk/Ohana/src/libohana/doc/dvo-structures.txt	(revision 4831)
+++ /trunk/Ohana/src/libohana/doc/dvo-structures.txt	(revision 4832)
@@ -36,2 +36,21 @@
    (can be loaded with translation, losing the exptime,
    and limited the number of Naverage to 0xffffff - in load_catalog) */
+
+------
+
+the DVO structure Catalog contains the data from a single sky patch, including:
+    average, measure, missing, and secfilt.  
+
+the catalog may be saved in one of 4 modes (catalog.catmode):
+    raw   : the old Elixir style which is a header + 4 binary tables
+    mef   : catalog is a single file with header and 4 fits tables
+    split : catalog is 5 files, one with the header and one for each table
+    mysql : catalog is 4 (or 5?) mysql tables
+
+    in split mode, the filename is the file of the descriptive header
+    and the averages, the measure, missing, and secfilt data are
+    stored in additional files referenced in the header and named
+    based on the filename (replacing extension .cpa with .cpb, .cpc,
+    .cpd, for example)
+
+    
Index: /trunk/Ohana/src/libohana/doc/libohana.html
===================================================================
--- /trunk/Ohana/src/libohana/doc/libohana.html	(revision 4831)
+++ /trunk/Ohana/src/libohana/doc/libohana.html	(revision 4832)
@@ -1,4 +1,21 @@
 
-<h2> libohana API reference </h2>
+<h1> libohana API reference </h1>
+
+<h2> generic ohana functions </h2>
+
+<h3> basic macros </h3>
+
+<pre>
+TRUE
+FALSE
+SIGN(X)  
+ROUND(X) 
+SQR(X)   
+SQ(X)    
+MIN(X,Y) 
+MAX(X,Y) 
+SWAP(X,Y) 
+whitespace (char c)
+</pre>
 
 <h3> ohana memory management functions </h3>
@@ -66,124 +83,7 @@
 <pre> int   fclearlockfile (char *filename, FILE *f, int type, int *state); </pre>
 
-<h3> read/write (Fread.c) </h3>
-
-<pre> int Fread (char ptr, int size, int nitems, FILE *f, char *type); </pre>
-<pre> int Fwrite (char ptr, int size, int nitems, FILE *f, char *type); </pre>
-<pre> int ByteSwap (char *ptr, int size, int nitems, char *type); </pre>
-<pre> int ConvertStruct (char *buffer, int size, int nitems, char *type); </pre>
-
-Several of these functions are used to perform byte-swapping for
-structures in the pre-autocode days.  They should be deprecated and
-dropped, but the autocoding must superceed the hard-wired structure
-first.
-
-<h3> miscellaneous functions </h3>
-
-<pre> char *ohana_version (); </pre>
-
-<h3> photcode manipulations (LoadPhotcodes.c) </h3>
-
-<pre> int   	LoadPhotcodes (char *filename, PhotCodeData *photcodes); </pre>
-<pre> int   	FreePhotcodes (PhotCodeData *photcodes); </pre>
-
-<pre> PhotCode *GetPhotcodebyName (char *name); </pre>
-<pre> PhotCode *GetPhotcodeEquivbyName (char *name); </pre>
-<pre> PhotCode *GetPhotcodebyCode (int code); </pre>
-<pre> PhotCode *GetPhotcodeEquivbyCode (int code); </pre>
-<pre> PhotCode *GetPhotcodebyNsec (int Nsec); </pre>
-<pre> char     *GetPhotcodeNamebyCode (int code); </pre>
-
-<pre> int 	GetPhotcodeCodebyName (char *name); </pre>
-<pre> int 	GetPhotcodeEquivCodebyName (char *name); </pre>
-<pre> int 	GetPhotcodeEquivCodebyCode (int code); </pre>
-<pre> int 	GetPhotcodeNsec (int code); </pre>
-<pre> int 	GetPhotcodeNsecfilt (); </pre>
-<pre> int      *GetPhotcodeEquivList (int code, int *nlist); </pre>
-
-<pre> void 	SetZeroPoint (double ZP); </pre>
-<pre> void 	ParseColorTerms (char *terms, float *X, int *N); </pre>
-
-<pre> int       PhotColor (Average *average, SecFilt *secfilt, Measure *measure, int c1, int c2, double *color); </pre>
-<pre> short 	iPhotColor (Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code); </pre>
-
-<pre> double 	PhotInst (Measure *measure); </pre>
-<pre> double 	PhotCat (Measure *measure); </pre>
-<pre> double 	PhotSys (Measure *measure, Average *average, SecFilt *secfilt); </pre>
-<pre> double 	PhotRel (Measure *measure, Average *average, SecFilt *secfilt); </pre>
-<pre> double 	PhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code); </pre>
-<pre> double 	PhotAve (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
-<pre> double 	PhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure); </pre>
-<pre> double 	PhotdM (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
-<pre> double 	PhotXm (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
-
-<pre> short 	iPhotInst (Measure *measure); </pre>
-<pre> short 	iPhotCat (Measure *measure); </pre>
-<pre> short 	iPhotSys (Measure *measure, Average *average, SecFilt *secfilt); </pre>
-<pre> short 	iPhotRel (Measure *measure, Average *average, SecFilt *secfilt); </pre>
-<pre> short 	iPhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code); </pre>
-<pre> short 	iPhotAve (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
-<pre> short 	iPhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure); </pre>
-<pre> short 	iPhotdM (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
-<pre> short 	iPhotXm (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
-
-<h3> functions in config.c </h3>
-
-<pre> char *SelectConfigFile (int *argc, char **argv, char *progname); </pre>
-<pre> char *LoadConfigFile (char *filename); </pre>
-<pre> char *ScanConfig (char *config, char *field, char *mode, int Nentry, ...); </pre>
-<pre> char *expandline (char *line, char *config); </pre>
-<pre> char *LoadRawConfigFile (char *filename, int options); </pre>
-
-<h3> functions in coordops.c </h3>
-
-<pre> int XY_to_RD (double *ra, double *dec, double x,  double y,   Coords *coords); </pre>
-<pre> int RD_to_XY (double *x,  double *y,   double ra, double dec, Coords *coords); </pre>
-<pre> int fXY_to_RD (float *ra, float *dec, float x,  float y,   Coords *coords); </pre>
-<pre> int fRD_to_XY (float *x,  float *y,   float ra, float dec, Coords *coords); </pre>
-<pre> int GetCoords (Coords *coords, Header *header); </pre>
-<pre> int coords_precess (double *ra, double *dec, double in_epoch, double out_epoch); </pre>
-
-<h3> functions in phot_catalog.c </h3>
-
-<pre> int lock_catalog (Catalog *catalog, int lockmode); </pre>
-<pre> int unlock_catalog (Catalog *catalog); </pre>
-<pre> int load_catalog (Catalog *catalog, char mode, int VERBOSE); </pre>
-<pre> int save_catalog (Catalog *catalog, char VERBOSE); </pre>
-<pre> Measure *FixOldMeasure (OldMeasure *in, int Nvalues); </pre>
-<pre> Average *FixOldAverage (OldAverage *in, int Nvalues); </pre>
-<pre> SecFilt *FixOldSecFilt (OldSecFilt *in, int Nvalues); </pre>
-
-<h3> functions in photfits.c </h3>
-
-<pre> short int putMi (double value); </pre>
-<pre> double getMi (short int value); </pre>
-<pre> void returnMcal (Image *image, double *c); </pre>
-<pre> void assignMcal (Image *image, double *c, int order); </pre>
-<pre> double applyMcal (Image *image, double x, double y); </pre>
-<pre> double findscatter (double *X, double *Y, double *M, double *dM, int N, double *c, int order); </pre>
-
-<h3> defined macros </h3>
-
-the ohana library includes the following macros:
+associated constants:
 
 <pre>
-
-SIGN(X)  
-ROUND(X) 
-SQR(X)   
-SQ(X)    
-MIN(X,Y) 
-MAX(X,Y) 
-SWAP(X,Y) 
-
-whitespace (char c)
-</pre>
-
-<h3> defined constants </h3>
-
-<pre>
-TRUE
-FALSE
-
 LCK_SOFT - block writing
 LCK_XCLD - block reading and writing
@@ -200,2 +100,148 @@
 LCK_UNKNOWN  - can't stat file to get size 
 </pre>
+
+<h3> time / radec manipulation functions (time.c) </h3>
+
+<pre> int dms_to_ddd (double *Value, char *string); </pre>
+<pre> int str_to_radec (double *ra, double *dec, char *str1, char *str2); </pre>
+<pre> int chk_time (char *line); </pre>
+<pre> int str_to_time (char *line, time_t *second); </pre>
+<pre> int str_to_dtime (char *line, double *second); </pre>
+<pre> double sec_to_jd (time_t second); </pre>
+<pre> time_t jd_to_sec (double jd); </pre>
+<pre> double sec_to_mjd (time_t second); </pre>
+<pre> time_t mjd_to_sec (double mjd); </pre>
+<pre> char *sec_to_date (time_t second); </pre>
+<pre> time_t date_to_sec (char *date); </pre>
+<pre> time_t short_date_to_sec (char *date); </pre>
+<pre> int hstgsc_hms_to_deg (double *h0, double *h1, double *d0, double *d1, char *string); </pre>
+
+<h3> functions in config.c </h3>
+
+<pre> char *SelectConfigFile (int *argc, char **argv, char *progname); </pre>
+<pre> char *LoadConfigFile (char *filename); </pre>
+<pre> char *ScanConfig (char *config, char *field, char *mode, int Nentry, ...); </pre>
+<pre> char *expandline (char *line, char *config); </pre>
+<pre> char *LoadRawConfigFile (char *filename, int options); </pre>
+
+<h3> miscellaneous functions </h3>
+
+<pre> char *ohana_version (); </pre>
+
+<h2> DVO data structures and catalog I/O functions </h2>
+
+<h3> read/write (Fread.c) </h3>
+
+<pre> int Fread (char ptr, int size, int nitems, FILE *f, char *type); </pre>
+<pre> int Fwrite (char ptr, int size, int nitems, FILE *f, char *type); </pre>
+<pre> int ByteSwap (char *ptr, int size, int nitems, char *type); </pre>
+<pre> int ConvertStruct (char *buffer, int size, int nitems, char *type); </pre>
+
+Several of these functions are used to perform byte-swapping for
+structures in the pre-autocode days.  They should be deprecated and
+dropped, but the autocoding must superceed the hard-wired structure
+first.
+
+<h3> coordinate structure manipulations (coordops.c) </h3>
+
+<pre> int XY_to_RD (double *ra, double *dec, double x,  double y,   Coords *coords); </pre>
+<pre> int RD_to_XY (double *x,  double *y,   double ra, double dec, Coords *coords); </pre>
+<pre> int fXY_to_RD (float *ra, float *dec, float x,  float y,   Coords *coords); </pre>
+<pre> int fRD_to_XY (float *x,  float *y,   float ra, float dec, Coords *coords); </pre>
+<pre> int GetCoords (Coords *coords, Header *header); </pre>
+<pre> int coords_precess (double *ra, double *dec, double in_epoch, double out_epoch); </pre>
+
+<h3> photcode manipulations (LoadPhotcodes.c) </h3>
+
+<pre> int   	LoadPhotcodes (char *filename, PhotCodeData *photcodes); </pre>
+<pre> int   	FreePhotcodes (PhotCodeData *photcodes); </pre>
+
+<pre> PhotCode *GetPhotcodebyName (char *name); </pre>
+<pre> PhotCode *GetPhotcodeEquivbyName (char *name); </pre>
+<pre> PhotCode *GetPhotcodebyCode (int code); </pre>
+<pre> PhotCode *GetPhotcodeEquivbyCode (int code); </pre>
+<pre> PhotCode *GetPhotcodebyNsec (int Nsec); </pre>
+<pre> char     *GetPhotcodeNamebyCode (int code); </pre>
+
+<pre> int 	GetPhotcodeCodebyName (char *name); </pre>
+<pre> int 	GetPhotcodeEquivCodebyName (char *name); </pre>
+<pre> int 	GetPhotcodeEquivCodebyCode (int code); </pre>
+<pre> int 	GetPhotcodeNsec (int code); </pre>
+<pre> int 	GetPhotcodeNsecfilt (); </pre>
+<pre> int      *GetPhotcodeEquivList (int code, int *nlist); </pre>
+
+<pre> void 	SetZeroPoint (double ZP); </pre>
+<pre> void 	ParseColorTerms (char *terms, float *X, int *N); </pre>
+
+<pre> int       PhotColor (Average *average, SecFilt *secfilt, Measure *measure, int c1, int c2, double *color); </pre>
+<pre> short 	iPhotColor (Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code); </pre>
+
+<pre> double 	PhotInst (Measure *measure); </pre>
+<pre> double 	PhotCat (Measure *measure); </pre>
+<pre> double 	PhotSys (Measure *measure, Average *average, SecFilt *secfilt); </pre>
+<pre> double 	PhotRel (Measure *measure, Average *average, SecFilt *secfilt); </pre>
+<pre> double 	PhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code); </pre>
+<pre> double 	PhotAve (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
+<pre> double 	PhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure); </pre>
+<pre> double 	PhotdM (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
+<pre> double 	PhotXm (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
+
+<pre> short 	iPhotInst (Measure *measure); </pre>
+<pre> short 	iPhotCat (Measure *measure); </pre>
+<pre> short 	iPhotSys (Measure *measure, Average *average, SecFilt *secfilt); </pre>
+<pre> short 	iPhotRel (Measure *measure, Average *average, SecFilt *secfilt); </pre>
+<pre> short 	iPhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code); </pre>
+<pre> short 	iPhotAve (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
+<pre> short 	iPhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure); </pre>
+<pre> short 	iPhotdM (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
+<pre> short 	iPhotXm (PhotCode *code, Average *average, SecFilt *secfilt); </pre>
+
+<h3> photometry catalog I/O functions (phot_catalog.c) </h3>
+
+<pre> int lock_catalog (Catalog *catalog, int lockmode); </pre>
+<pre> int unlock_catalog (Catalog *catalog); </pre>
+<pre> int load_catalog (Catalog *catalog, char mode, int VERBOSE); </pre>
+<pre> int save_catalog (Catalog *catalog, char VERBOSE); </pre>
+
+<h3> DVO format conversions (dvo_convert.c) </h3>
+
+<pre> Measure *FixOldMeasure (OldMeasure *in, int Nvalues); </pre>
+<pre> Average *FixOldAverage (OldAverage *in, int Nvalues); </pre>
+<pre> SecFilt *FixOldSecFilt (OldSecFilt *in, int Nvalues); </pre>
+
+<h3> image type / mode lookups (imreg_datatypes.c) </h3>
+<pre> int   get_image_type (char *name); </pre>
+<pre> char *get_type_name (int type); </pre>
+<pre> int   get_image_mode (char *name); </pre>
+<pre> char *get_mode_name (int mode); </pre>
+
+<h3> mosaic astrometry functions (mosaic_astrom.c) </h3>
+
+<pre> int FindMosaicForImage (Image *images, int Nimages, int entry); </pre>
+<pre> int FindMosaicForImage_TableSearch (Image *images, int Nimages, int entry); </pre>
+<pre> int FindMosaicForImage_MatchSearch (Image *images, int Nimages, int entry); </pre>
+<pre> int BuildChipMatch (Image *images, int Nimages); </pre>
+
+<h3> FITS DB I/O functions (fits_db.c) </h3>
+
+<pre> int fits_db_init (FITS_DB *db); </pre>
+<pre> int fits_db_create (FITS_DB *db); </pre>
+<pre> int fits_db_lock (FITS_DB *db, char *filename); </pre>
+<pre> int fits_db_load (FITS_DB *db); </pre>
+<pre> int fits_db_save (FITS_DB *db); </pre>
+<pre> int fits_db_update (FITS_DB *db, VTable *vtable); </pre>
+<pre> int fits_db_free (FITS_DB *db); </pre>
+<pre> int fits_db_close (FITS_DB *db); </pre>
+
+<h3> functions in photfits.c </h3>
+
+<pre> short int putMi (double value); </pre>
+<pre> double getMi (short int value); </pre>
+<pre> void returnMcal (Image *image, double *c); </pre>
+<pre> void assignMcal (Image *image, double *c, int order); </pre>
+<pre> double applyMcal (Image *image, double x, double y); </pre>
+<pre> double findscatter (double *X, double *Y, double *M, double *dM, int N, double *c, int order); </pre>
+
+These functions manipulate the high-order polynomial fit of magnitude
+offset as a function of image position for the Image structure.
+
Index: /trunk/Ohana/src/libohana/include/dvo.h
===================================================================
--- /trunk/Ohana/src/libohana/include/dvo.h	(revision 4831)
+++ /trunk/Ohana/src/libohana/include/dvo.h	(revision 4832)
@@ -108,15 +108,22 @@
 /* a catalog contains this data */
 typedef struct {
-  /* data in the file: */
+  /* description of the catalog file: */
+  char *filename;
+  int lockmode;
+  FILE *f;
+
+  /* extra table data if needed (move these to enums?) */
+  char catmode[10];         /* storage mode: raw, mef, split, mysql */
+  char average_format[80];  /* table format: internal, loneos, elixir, panstarrs */
+  char measure_format[80];  /* table format: must match average_format */
+  
+  /* data in the catalog */
+  Header  header;
   Average *average;
   Measure *measure; 
   Missing *missing; 
   SecFilt *secfilt;
-  Header  header;
   int Naverage, Nmeasure, Nmissing, Nsecfilt;
-  /* description of the catalog file: */
-  char *filename;
-  int lockmode;
-  FILE *f;
+
   /* pointers for data manipulation */
   int *found;
@@ -222,3 +229,30 @@
 int   ConvertStruct (char *buffer, int size, int Nbytes, char *type);
 
+/*** conversion functions / I/O conversions ***/
+
+Average *AveragePanstarrsToInternal (AveragePanstarrs *in, int Nvalues);
+Average *FtableToAverage (FTable *ftable, int *Naverage, char *extname);
+Average *ReadRawAverage (FILE *f, int Naverage, char *format);
+Average *AverageLoneosToInternal (AverageLoneos *in, int Nvalues);
+Average *AverageElixirToInternal (AverageElixir *in, int Nvalues);
+AverageElixir *AverageInternalToElixir (Average *in, int Nvalues);
+AverageLoneos *AverageInternalToLoneos (Average *in, int Nvalues);
+AveragePanstarrs *AverageInternalToPanstarrs (Average *in, int Nvalues);
+Measure *MeasurePanstarrsToInternal (MeasurePanstarrs *in, int Nvalues);
+Measure *FtableToMeasure (FTable *ftable, int *Nmeasure, char *extname);
+Measure *ReadRawMeasure (FILE *f, int Nmeasure, char *format);
+Measure *MeasureLoneosToInternal (MeasureLoneos *in, int Nvalues);
+Measure *MeasureElixirToInternal (MeasureElixir *in, int Nvalues);
+MeasureElixir *MeasureInternalToElixir (Measure *in, int Nvalues);
+MeasureLoneos *MeasureInternalToLoneos (Measure *in, int Nvalues);
+MeasurePanstarrs *MeasureInternalToPanstarrs (Measure *in, int Nvalues);
+int AverageToFtable (FTable *ftable, Average *average, int Naverage, char *extname);
+int MeasureToFtable (FTable *ftable, Measure *measure, int Nmeasure, char *extname);
+int WriteRawAverage (FILE *f, Average *average, int Naverage, char *format);
+int WriteRawMeasure (FILE *f, Measure *measure, int Nmeasure, char *format);
+int load_catalog_raw (Catalog *catalog, char mode, int VERBOSE);
+int save_catalog_raw (Catalog *catalog, char VERBOSE);
+int load_catalog_mef (Catalog *catalog, char mode, int VERBOSE);
+int save_catalog_mef (Catalog *catalog, char VERBOSE);
+
 # endif
Index: /trunk/Ohana/src/libohana/src/dvo_convert.c
===================================================================
--- /trunk/Ohana/src/libohana/src/dvo_convert.c	(revision 4831)
+++ /trunk/Ohana/src/libohana/src/dvo_convert.c	(revision 4832)
@@ -1,261 +1,392 @@
-SecFilt *FixOldSecFilt (OldSecFilt *in, int Nvalues);
-Average *FixOldAverage (OldAverage *in, int Nvalues);
-Measure *FixOldMeasure (OldMeasure *in, int Nvalues);
-
-/* the old load_catalog automatically converted
-   now we error, and require conversion by hand 
-*/
-
-/* this is (a bit) dangerous: the load function will automatically
-   convert from the old (Loneos) format to the new (CFHT) format.
-   But, if you load an old-format catalog, then save the new-format
-   version, the new file will be corrupted unless you load all four
-   data components.  Actually, 'save_catalog' assumes you've loaded
-   all four anyway, so it is not such a problem... */
-
-int load_catalog (Catalog *catalog, char mode, int VERBOSE) {
-  
-  int Nitems, nitems;
-  int i, Nmeas, Nmiss, size, ssize;
-  int NewMeasure, NewAverage, NewSecFilt;
-  FILE *f;
-  OldMeasure *tmpmeasure;
-  OldAverage *tmpaverage;
-  OldSecFilt *tmpsecfilt;
-  struct stat filestatus;
-
-  f = catalog[0].f;
-  fseek (f, 0, SEEK_SET);
-
-  /* read catalog header */
-  if (!fits_load_header (f, &catalog[0].header)) {
-    if (VERBOSE) fprintf (stderr, "catalog file does not exist: %s\n", catalog[0].filename);
+# include <ohana.h>
+# include <dvo.h>
+
+/* The Ftable-TYPE conversion functions determine the format of table based on EXTNAME in header.
+   they convert the table to the internal format, and set 'extname'.  
+
+   The TYPE-Ftable conversions functions create output tables in the format requested
+   by the 'extname' function parameter.
+ */
+
+/** this file might be more readable if I use macros for the repetative
+    constructions below **/
+
+/*** Average / FTable conversion functions ***/
+
+Average *FtableToAverage (FTable *ftable, int *Naverage, char *extname) {
+
+  Average *average;
+
+  /* convert to the internal format */
+  if (!fits_scan (ftable[0].header, "EXTNAME", "%s", 1, extname)) {
+    fprintf (stderr, "EXTNAME missing for average table\n");
     return (FALSE);
   }
-
-  /* this is done by the load anyway... */
-  fseek (f, catalog[0].header.size, SEEK_SET); 
-
-  /* get the components from the header */
-  catalog[0].Naverage = catalog[0].Nmeasure = catalog[0].Nmissing = catalog[0].Nsecfilt = 0;
-  if (!fits_scan (&catalog[0].header, "NSTARS",   "%d", 1, &catalog[0].Naverage)) return (FALSE);
-  if (!fits_scan (&catalog[0].header, "NMEAS",    "%d", 1, &catalog[0].Nmeasure)) return (FALSE);
-  if (!fits_scan (&catalog[0].header, "NMISS",    "%d", 1, &catalog[0].Nmissing)) return (FALSE);
-  if (!fits_scan (&catalog[0].header, "NSECFILT", "%d", 1, &catalog[0].Nsecfilt)) catalog[0].Nsecfilt = 0;
-  if (!fits_scan (&catalog[0].header, "NEWMEAS",  "%t", 1, &NewMeasure)) NewMeasure = FALSE;
-  if (!fits_scan (&catalog[0].header, "NEWAVES",  "%t", 1, &NewAverage)) NewAverage = FALSE;
-  if (!fits_scan (&catalog[0].header, "NEWSECF",  "%t", 1, &NewSecFilt)) NewSecFilt = FALSE;
-
-  /* predicted file size - for double checking data validity */
-  size = catalog[0].header.size;
-  ssize = NewAverage ? sizeof (Average) : sizeof (OldAverage);
-  size += ssize * catalog[0].Naverage;
-  ssize = NewMeasure ? sizeof (Measure) : sizeof (OldMeasure);
-  size += ssize * catalog[0].Nmeasure;
-  ssize = sizeof (Missing);
-  size += ssize * catalog[0].Nmissing;
-  ssize = NewSecFilt ? sizeof (SecFilt) : sizeof (OldSecFilt);
-  size += ssize * catalog[0].Nsecfilt * catalog[0].Naverage;
-
-  /* check that file size makes sense */
-  if (stat (catalog[0].filename, &filestatus) == -1) {
-    if (VERBOSE) fprintf (stderr, "failed to get status of catalog\n");
+  if (!strcmp (extname, "DVO_AVERAGE")) {
+    average = fits_table_get_Average (ftable, Naverage);
+    return (average);
+  }
+  if (!strcmp (extname, "DVO_AVERAGE_ELIXIR")) {
+    AverageElixir *tmpaverage;
+    tmpaverage = fits_table_get_AverageElixir (ftable, Naverage);
+    average = AverageElixirToInternal (tmpaverage, *Naverage);
+    free (tmpaverage);
+    return (average);
+  }
+  if (!strcmp (extname, "DVO_AVERAGE_LONEOS")) {
+    AverageLoneos *tmpaverage;
+    tmpaverage = fits_table_get_AverageLoneos (ftable, Naverage);
+    average = AverageLoneosToInternal (tmpaverage, *Naverage);
+    free (tmpaverage);
+    return (average);
+  }
+  if (!strcmp (extname, "DVO_AVERAGE_PANSTARRS")) {
+    AveragePanstarrs *tmpaverage;
+    tmpaverage = fits_table_get_AveragePanstarrs (ftable, Naverage);
+    average = AveragePanstarrsToInternal (tmpaverage, *Naverage);
+    free (tmpaverage);
+    return (average);
+  }
+
+  fprintf (stderr, "table format unknown: %s\n", extname);
+
+  *Naverage = 0;
+  return (NULL);
+}
+
+int AverageToFtable (FTable *ftable, Average *average, int Naverage, char *extname) {
+
+  /* convert from the internal format */
+  if (!strcmp (extname, "DVO_AVERAGE")) {
+    fits_table_set_Average (ftable, average, Naverage);
+    return (TRUE);
+  }
+  if (!strcmp (extname, "DVO_AVERAGE_ELIXIR")) {
+    AverageElixir *tmpaverage;
+    tmpaverage = AverageInternalToElixir (average, Naverage);
+    fits_table_set_AverageElixir (ftable, tmpaverage, Naverage);
+    free (tmpaverage);
+    return (TRUE);
+  }
+  if (!strcmp (extname, "DVO_AVERAGE_LONEOS")) {
+    AverageLoneos *tmpaverage;
+    tmpaverage = AverageInternalToLoneos (average, Naverage);
+    fits_table_set_AverageLoneos (ftable, tmpaverage, Naverage);
+    free (tmpaverage);
+    return (TRUE);
+  }
+  if (!strcmp (extname, "DVO_AVERAGE_PANSTARRS")) {
+    AveragePanstarrs *tmpaverage;
+    tmpaverage = AverageInternalToPanstarrs (average, Naverage);
+    fits_table_set_AveragePanstarrs (ftable, tmpaverage, Naverage);
+    free (tmpaverage);
+    return (TRUE);
+  }
+  fprintf (stderr, "table format unknown: %s\n", extname);
+  return (FALSE);
+}
+
+/*** Measure / FTable conversion functions ***/
+
+Measure *FtableToMeasure (FTable *ftable, int *Nmeasure, char *extname) {
+
+  Measure *measure;
+
+  /* convert to the internal format */
+  if (!fits_scan (ftable[0].header, "EXTNAME", "%s", 1, extname)) {
+    fprintf (stderr, "EXTNAME missing for measure table\n");
     return (FALSE);
   }
-  if (size > filestatus.st_size) {
-    if (VERBOSE) {
-      fprintf (stderr, "star catalog has inconsistent size\n");
-      ssize = NewAverage ? sizeof (Average) : sizeof (OldAverage);
-      fprintf (stderr, "average: %d = %d bytes\n", catalog[0].Naverage, catalog[0].Naverage*ssize);
-      ssize = NewMeasure ? sizeof (Measure) : sizeof (OldMeasure);
-      fprintf (stderr, "measure: %d = %d bytes\n", catalog[0].Nmeasure, catalog[0].Nmeasure*ssize);
-      ssize = sizeof (Missing);
-      fprintf (stderr, "missing: %d = %d bytes\n", catalog[0].Nmissing, catalog[0].Nmissing*ssize);
-      ssize = NewSecFilt ? sizeof (SecFilt) : sizeof (OldSecFilt);
-      fprintf (stderr, "secfilt: %d = %d bytes\n", catalog[0].Nsecfilt, catalog[0].Nsecfilt*catalog[0].Naverage*ssize);
-      fprintf (stderr, "expect: %d, found: %d\n", size, (int)filestatus.st_size);
-    }
-    return (FALSE);
-  } 
-  if (size < filestatus.st_size) {
-    if (VERBOSE) fprintf (stderr, "warning: file larger than expected\n");
-  } 
-
-  if (catalog[0].Naverage == 0) {
-    if (VERBOSE) fprintf (stderr, "no stars yet in catalog %s\n", catalog[0].filename);
-    return (TRUE);
-  }
-
-  if (mode & LOAD_AVES) {
-    /* read average values */
-    if (NewAverage) {
-      ALLOCATE (catalog[0].average, Average, MAX (catalog[0].Naverage, 1));
-      Nitems = catalog[0].Naverage;
-      nitems = Fread (catalog[0].average, sizeof(Average), Nitems, f, "average");
-    } else {
-      ALLOCATE (tmpaverage, OldAverage, MAX (catalog[0].Naverage, 1));
-      Nitems = catalog[0].Naverage;
-      nitems = Fread (tmpaverage, sizeof(OldAverage), Nitems, f, "oldaverage");
-      catalog[0].average = FixOldAverage (tmpaverage, Nitems);
-    }
-    if (nitems != Nitems) {
-      if (VERBOSE) fprintf (stderr, "failed to read averages from catalog file %s (%d vs %d)\n", catalog[0].filename, nitems, Nitems);
-      return (FALSE);
-    }
-  } else {
-    /* skip over averages */
-    fseek (f, catalog[0].Naverage * sizeof(Average), SEEK_CUR); 
-  }    
-  
-  if (mode & LOAD_MEAS) {
-    /* read measurements */
-    if (NewMeasure) {
-      ALLOCATE (catalog[0].measure, Measure, MAX (catalog[0].Nmeasure, 1));
-      Nitems = catalog[0].Nmeasure;
-      nitems = Fread (catalog[0].measure, sizeof(Measure), Nitems, f, "measure");
-    } else {
-      ALLOCATE (tmpmeasure, OldMeasure, MAX (catalog[0].Nmeasure, 1));
-      Nitems = catalog[0].Nmeasure;
-      nitems = Fread (tmpmeasure, sizeof(OldMeasure), Nitems, f, "oldmeasure");
-      catalog[0].measure = FixOldMeasure (tmpmeasure, Nitems);
-    }
-    if (nitems != Nitems) {
-      if (VERBOSE) fprintf (stderr, "failed to read measures from catalog file %s (%d vs %d)\n", catalog[0].filename, nitems, Nitems);
-      return (FALSE);
-    }
-  } else {
-    /* skip over measures */
-    fseek (f, catalog[0].Nmeasure * sizeof(Measure), SEEK_CUR); 
-  } 
-
-  if (mode & LOAD_MISS) {
-    /* read missing */
-    ALLOCATE (catalog[0].missing, Missing, MAX (catalog[0].Nmissing, 1));
-    Nitems = catalog[0].Nmissing;
-    nitems = Fread (catalog[0].missing, sizeof(Missing), Nitems, f, "missing");
-    if (nitems != Nitems) {
-      if (VERBOSE) fprintf (stderr, "failed to read missing from catalog file %s (%d vs %d)\n", catalog[0].filename, nitems, Nitems);
-      return (FALSE);
-    }
-  } else {
-    /* skip over missings */
-    fseek (f, catalog[0].Nmissing * sizeof(Missing), SEEK_CUR); 
-  }
-  
-  if (mode & LOAD_SECF) {
-    /* read missing */
-    if (NewSecFilt) {
-      Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
-      ALLOCATE (catalog[0].secfilt, SecFilt, MAX (Nitems, 1));
-      nitems = Fread (catalog[0].secfilt, sizeof(SecFilt), Nitems, f, "secfilt");
-    } else {
-      Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
-      ALLOCATE (tmpsecfilt, OldSecFilt, MAX (Nitems, 1));
-      nitems = Fread (tmpsecfilt, sizeof(OldSecFilt), Nitems, f, "oldsecfilt");
-      catalog[0].secfilt = FixOldSecFilt (tmpsecfilt, Nitems);
-    } 
-    if (nitems != Nitems) {
-      if (VERBOSE) fprintf (stderr, "failed to read secondary filters from catalog file %s (%d vs %d)\n", catalog[0].filename, nitems, Nitems);
-      return (FALSE);
-    }
-  } else {
-    /* skip over secfilts */
-    fseek (f, catalog[0].Naverage * catalog[0].Nsecfilt * sizeof(SecFilt), SEEK_CUR); 
-  }
-
-  if (VERBOSE) fprintf (stderr, "read %d stars from catalog file %s (%d measurements, %d missing, %d secondary filters)\n", 
-	   catalog[0].Naverage, catalog[0].filename, catalog[0].Nmeasure, catalog[0].Nmissing, catalog[0].Nsecfilt);
-
-  /* check data integrity */
-  if (mode & LOAD_AVES) {
-    for (i = Nmeas = Nmiss = 0; i < catalog[0].Naverage; i++) {
-      Nmeas += catalog[0].average[i].Nm; 
-      Nmiss += catalog[0].average[i].Nn; 
-    }
-    if ((Nmeas != catalog[0].Nmeasure) || (Nmiss != catalog[0].Nmissing)) {
-      if (VERBOSE) {
-	fprintf (stderr, "****** data in catalog %s is corrupt, sums don't check\n", catalog[0].filename);
-	fprintf (stderr, "****** Nmeas: %d, %d\n", Nmeas, catalog[0].Nmeasure);
-	fprintf (stderr, "****** Nmiss: %d, %d\n", Nmiss, catalog[0].Nmissing);
-      }
-      return (FALSE);
-    }
-  }
-  return (TRUE);
-}
-
-/**** tools to convert between formats - this happens automatically in load_catalog */
-
-Measure *FixOldMeasure (OldMeasure *in, int Nvalues) {
-
-  int i;
-  Measure *out;
-
-  ALLOCATE (out, Measure, Nvalues);
-
-  for (i = 0; i < Nvalues; i++) {
-    out[i].dR = in[i].dR;
-    out[i].dD = in[i].dD;
-    out[i].M  = in[i].M;
-    out[i].dM = in[i].dM;
-    out[i].Mcal = in[i].Mcal;
-    out[i].dophot = in[i].dophot;
-    out[i].source = in[i].source;
-    out[i].t = in[i].t;
-
-    out[i].dt = 0xffff;
-    out[i].averef = in[i].average & 0x00ffffff;
-    out[i].flags  = (in[i].average & 0xff000000) >> 24;
-  }
-
-  free (in);
-  
-  return (out);
-}
-
-Average *FixOldAverage (OldAverage *in, int Nvalues) {
-
-  int i;
-  Average *out;
-
-  ALLOCATE (out, Average, Nvalues);
-
-  for (i = 0; i < Nvalues; i++) {
-    out[i].R       = in[i].R;      
-    out[i].D       = in[i].D;      
-    out[i].M       = in[i].M;      
-    out[i].Xp      = in[i].Xp;     
-    out[i].Xm      = in[i].Xm;     
-    out[i].Nm      = in[i].Nm;     
-    out[i].Nn      = in[i].Nn;     
-    out[i].code    = in[i].code;   
-    out[i].offset  = in[i].offset; 
-    out[i].missing = in[i].missing;
-
-    out[i].dM = 0xffff;
-  }
-
-  free (in);
-  
-  return (out);
-}
-
-SecFilt *FixOldSecFilt (OldSecFilt *in, int Nvalues) {
-
-  int i;
-  SecFilt *out;
-
-  ALLOCATE (out, SecFilt, Nvalues);
-
-  for (i = 0; i < Nvalues; i++) {
-    out[i].M    = in[i].M;      
-    out[i].Xm   = in[i].Xm;      
-
-    out[i].dM   = 0xffff;
-  }
-
-  free (in);
-  
-  return (out);
-}
-
+  if (!strcmp (extname, "DVO_MEASURE")) {
+    measure = fits_table_get_Measure (ftable, Nmeasure);
+    return (measure);
+  }
+  if (!strcmp (extname, "DVO_MEASURE_ELIXIR")) {
+    MeasureElixir *tmpmeasure;
+    tmpmeasure = fits_table_get_MeasureElixir (ftable, Nmeasure);
+    measure = MeasureElixirToInternal (tmpmeasure, *Nmeasure);
+    free (tmpmeasure);
+    return (measure);
+  }
+  if (!strcmp (extname, "DVO_MEASURE_LONEOS")) {
+    MeasureLoneos *tmpmeasure;
+    tmpmeasure = fits_table_get_MeasureLoneos (ftable, Nmeasure);
+    measure = MeasureLoneosToInternal (tmpmeasure, *Nmeasure);
+    free (tmpmeasure);
+    return (measure);
+  }
+  if (!strcmp (extname, "DVO_MEASURE_PANSTARRS")) {
+    MeasurePanstarrs *tmpmeasure;
+    tmpmeasure = fits_table_get_MeasurePanstarrs (ftable, Nmeasure);
+    measure = MeasurePanstarrsToInternal (tmpmeasure, *Nmeasure);
+    free (tmpmeasure);
+    return (measure);
+  }
+
+  fprintf (stderr, "table format unknown: %s\n", extname);
+
+  *Nmeasure = 0;
+  return (NULL);
+}
+
+int MeasureToFtable (FTable *ftable, Measure *measure, int Nmeasure, char *extname) {
+
+  /* convert from the internal format */
+  if (!strcmp (extname, "DVO_MEASURE")) {
+    fits_table_set_Measure (ftable, measure, Nmeasure);
+    return (TRUE);
+  }
+  if (!strcmp (extname, "DVO_MEASURE_ELIXIR")) {
+    MeasureElixir *tmpmeasure;
+    tmpmeasure = MeasureInternalToElixir (measure, Nmeasure);
+    fits_table_set_MeasureElixir (ftable, tmpmeasure, Nmeasure);
+    free (tmpmeasure);
+    return (TRUE);
+  }
+  if (!strcmp (extname, "DVO_MEASURE_LONEOS")) {
+    MeasureLoneos *tmpmeasure;
+    tmpmeasure = MeasureInternalToLoneos (measure, Nmeasure);
+    fits_table_set_MeasureLoneos (ftable, tmpmeasure, Nmeasure);
+    free (tmpmeasure);
+    return (TRUE);
+  }
+  if (!strcmp (extname, "DVO_MEASURE_PANSTARRS")) {
+    MeasurePanstarrs *tmpmeasure;
+    tmpmeasure = MeasureInternalToPanstarrs (measure, Nmeasure);
+    fits_table_set_MeasurePanstarrs (ftable, tmpmeasure, Nmeasure);
+    free (tmpmeasure);
+    return (TRUE);
+  }
+
+  fprintf (stderr, "table format unknown: %s\n", extname);
+  return (FALSE);
+}
+
+/** Average / Raw Table conversions **/
+
+Average *ReadRawAverage (FILE *f, int Naverage, char *format) {
+
+  int nitems;
+  Average *average;
+
+  if (!strcmp (format, "DVO_AVERAGE")) {
+    ALLOCATE (average, Average, MAX (Naverage, 1));
+    nitems = fread (average, sizeof(Average), Naverage, f);
+    if (nitems != Naverage) {
+      fprintf (stderr, "failed to read averages (%d vs %d)\n", nitems, Naverage);
+      return (NULL);
+    }
+    fits_convert_Average (average, sizeof(Average), Naverage);
+    return (average);
+  }
+  if (!strcmp (format, "DVO_AVERAGE_ELIXIR")) {
+    AverageElixir *tmpaverage;
+    ALLOCATE (tmpaverage, AverageElixir, MAX (Naverage, 1));
+    nitems = fread (tmpaverage, sizeof(AverageElixir), Naverage, f);
+    if (nitems != Naverage) {
+      fprintf (stderr, "failed to read averages (%d vs %d)\n", nitems, Naverage);
+      return (NULL);
+    }
+    fits_convert_AverageElixir (tmpaverage, sizeof(AverageElixir), Naverage);
+    average = AverageElixirToInternal (tmpaverage, Naverage);
+    free (tmpaverage);
+    return (average);
+  }
+  if (!strcmp (format, "DVO_AVERAGE_LONEOS")) {
+    AverageLoneos *tmpaverage;
+    ALLOCATE (tmpaverage, AverageLoneos, MAX (Naverage, 1));
+    nitems = fread (tmpaverage, sizeof(AverageLoneos), Naverage, f);
+    if (nitems != Naverage) {
+      fprintf (stderr, "failed to read averages (%d vs %d)\n", nitems, Naverage);
+      return (NULL);
+    }
+    fits_convert_AverageLoneos (tmpaverage, sizeof(AverageLoneos), Naverage);
+    average = AverageLoneosToInternal (tmpaverage, Naverage);
+    free (tmpaverage);
+    return (average);
+  }
+  if (!strcmp (format, "DVO_AVERAGE_PANSTARRS")) {
+    AveragePanstarrs *tmpaverage;
+    ALLOCATE (tmpaverage, AveragePanstarrs, MAX (Naverage, 1));
+    nitems = fread (tmpaverage, sizeof(AveragePanstarrs), Naverage, f);
+    if (nitems != Naverage) {
+      fprintf (stderr, "failed to read averages (%d vs %d)\n", nitems, Naverage);
+      return (NULL);
+    }
+    fits_convert_AveragePanstarrs (tmpaverage, sizeof(AveragePanstarrs), Naverage);
+    average = AveragePanstarrsToInternal (tmpaverage, Naverage);
+    free (tmpaverage);
+    return (average);
+  }
+  fprintf (stderr, "error reading averages\n");
+  return (NULL);
+}
+
+/* accepts and converts internal average formats and outputs 
+   raw data in the specified format */
+int WriteRawAverage (FILE *f, Average *average, int Naverage, char *format) {
+
+  int nitems;
+
+  if (!strcmp (format, "DVO_AVERAGE")) {
+    fits_convert_Average (average, sizeof(Average), Naverage);
+    nitems = fwrite (average, sizeof(Average), Naverage, f);
+    if (nitems != Naverage) {
+      fprintf (stderr, "failed to write averages (%d vs %d)\n", nitems, Naverage);
+      return (FALSE);
+    }
+    return (TRUE);
+  }
+  if (!strcmp (format, "DVO_AVERAGE_ELIXIR")) {
+    AverageElixir *tmpaverage;
+    tmpaverage = AverageInternalToElixir (average, Naverage);
+    fits_convert_AverageElixir (tmpaverage, sizeof(AverageElixir), Naverage);
+    nitems = fwrite (tmpaverage, sizeof(AverageElixir), Naverage, f);
+    free (tmpaverage);
+    if (nitems != Naverage) {
+      fprintf (stderr, "failed to write averages (%d vs %d)\n", nitems, Naverage);
+      return (FALSE);
+    }
+    return (TRUE);
+  }
+  if (!strcmp (format, "DVO_AVERAGE_LONEOS")) {
+    AverageLoneos *tmpaverage;
+    tmpaverage = AverageInternalToLoneos (average, Naverage);
+    fits_convert_AverageLoneos (tmpaverage, sizeof(AverageLoneos), Naverage);
+    nitems = fwrite (tmpaverage, sizeof(AverageLoneos), Naverage, f);
+    free (tmpaverage);
+    if (nitems != Naverage) {
+      fprintf (stderr, "failed to write averages (%d vs %d)\n", nitems, Naverage);
+      return (FALSE);
+    }
+    return (TRUE);
+  }
+  if (!strcmp (format, "DVO_AVERAGE_PANSTARRS")) {
+    AveragePanstarrs *tmpaverage;
+    tmpaverage = AverageInternalToPanstarrs (average, Naverage);
+    fits_convert_AveragePanstarrs (tmpaverage, sizeof(AveragePanstarrs), Naverage);
+    nitems = fwrite (tmpaverage, sizeof(AveragePanstarrs), Naverage, f);
+    free (tmpaverage);
+    if (nitems != Naverage) {
+      fprintf (stderr, "failed to write averages (%d vs %d)\n", nitems, Naverage);
+      return (FALSE);
+    }
+    return (TRUE);
+  }
+  fprintf (stderr, "error writing averages\n");
+  return (FALSE);
+}
+/** Average / Raw Table conversions **/
+
+Measure *ReadRawMeasure (FILE *f, int Nmeasure, char *format) {
+
+  int nitems;
+  Measure *measure;
+
+  if (!strcmp (format, "DVO_MEASURE")) {
+    ALLOCATE (measure, Measure, MAX (Nmeasure, 1));
+    nitems = fread (measure, sizeof(Measure), Nmeasure, f);
+    if (nitems != Nmeasure) {
+      fprintf (stderr, "failed to read measures (%d vs %d)\n", nitems, Nmeasure);
+      return (NULL);
+    }
+    fits_convert_Measure (measure, sizeof(Measure), Nmeasure);
+    return (measure);
+  }
+  if (!strcmp (format, "DVO_MEASURE_ELIXIR")) {
+    MeasureElixir *tmpmeasure;
+    ALLOCATE (tmpmeasure, MeasureElixir, MAX (Nmeasure, 1));
+    nitems = fread (tmpmeasure, sizeof(MeasureElixir), Nmeasure, f);
+    if (nitems != Nmeasure) {
+      fprintf (stderr, "failed to read measures (%d vs %d)\n", nitems, Nmeasure);
+      return (NULL);
+    }
+    fits_convert_MeasureElixir (tmpmeasure, sizeof(MeasureElixir), Nmeasure);
+    measure = MeasureElixirToInternal (tmpmeasure, Nmeasure);
+    free (tmpmeasure);
+    return (measure);
+  }
+  if (!strcmp (format, "DVO_MEASURE_LONEOS")) {
+    MeasureLoneos *tmpmeasure;
+    ALLOCATE (tmpmeasure, MeasureLoneos, MAX (Nmeasure, 1));
+    nitems = fread (tmpmeasure, sizeof(MeasureLoneos), Nmeasure, f);
+    if (nitems != Nmeasure) {
+      fprintf (stderr, "failed to read measures (%d vs %d)\n", nitems, Nmeasure);
+      return (NULL);
+    }
+    fits_convert_MeasureLoneos (tmpmeasure, sizeof(MeasureLoneos), Nmeasure);
+    measure = MeasureLoneosToInternal (tmpmeasure, Nmeasure);
+    free (tmpmeasure);
+    return (measure);
+  }
+  if (!strcmp (format, "DVO_MEASURE_PANSTARRS")) {
+    MeasurePanstarrs *tmpmeasure;
+    ALLOCATE (tmpmeasure, MeasurePanstarrs, MAX (Nmeasure, 1));
+    nitems = fread (tmpmeasure, sizeof(MeasurePanstarrs), Nmeasure, f);
+    if (nitems != Nmeasure) {
+      fprintf (stderr, "failed to read measures (%d vs %d)\n", nitems, Nmeasure);
+      return (NULL);
+    }
+    fits_convert_MeasurePanstarrs (tmpmeasure, sizeof(MeasurePanstarrs), Nmeasure);
+    measure = MeasurePanstarrsToInternal (tmpmeasure, Nmeasure);
+    free (tmpmeasure);
+    return (measure);
+  }
+  fprintf (stderr, "error reading measures\n");
+  return (NULL);
+}
+
+/* accepts and converts internal measure formats and outputs 
+   raw data in the specified format */
+int WriteRawMeasure (FILE *f, Measure *measure, int Nmeasure, char *format) {
+
+  int nitems;
+
+  if (!strcmp (format, "DVO_MEASURE")) {
+    fits_convert_Measure (measure, sizeof(Measure), Nmeasure);
+    nitems = fwrite (measure, sizeof(Measure), Nmeasure, f);
+    if (nitems != Nmeasure) {
+      fprintf (stderr, "failed to write measures (%d vs %d)\n", nitems, Nmeasure);
+      return (FALSE);
+    }
+    return (TRUE);
+  }
+  if (!strcmp (format, "DVO_MEASURE_ELIXIR")) {
+    MeasureElixir *tmpmeasure;
+    tmpmeasure = MeasureInternalToElixir (measure, Nmeasure);
+    fits_convert_MeasureElixir (tmpmeasure, sizeof(MeasureElixir), Nmeasure);
+    nitems = fwrite (tmpmeasure, sizeof(MeasureElixir), Nmeasure, f);
+    free (tmpmeasure);
+    if (nitems != Nmeasure) {
+      fprintf (stderr, "failed to write measures (%d vs %d)\n", nitems, Nmeasure);
+      return (FALSE);
+    }
+    return (TRUE);
+  }
+  if (!strcmp (format, "DVO_MEASURE_LONEOS")) {
+    MeasureLoneos *tmpmeasure;
+    tmpmeasure = MeasureInternalToLoneos (measure, Nmeasure);
+    fits_convert_MeasureLoneos (tmpmeasure, sizeof(MeasureLoneos), Nmeasure);
+    nitems = fwrite (tmpmeasure, sizeof(MeasureLoneos), Nmeasure, f);
+    free (tmpmeasure);
+    if (nitems != Nmeasure) {
+      fprintf (stderr, "failed to write measures (%d vs %d)\n", nitems, Nmeasure);
+      return (FALSE);
+    }
+    return (TRUE);
+  }
+  if (!strcmp (format, "DVO_MEASURE_PANSTARRS")) {
+    MeasurePanstarrs *tmpmeasure;
+    tmpmeasure = MeasureInternalToPanstarrs (measure, Nmeasure);
+    fits_convert_MeasurePanstarrs (tmpmeasure, sizeof(MeasurePanstarrs), Nmeasure);
+    nitems = fwrite (tmpmeasure, sizeof(MeasurePanstarrs), Nmeasure, f);
+    free (tmpmeasure);
+    if (nitems != Nmeasure) {
+      fprintf (stderr, "failed to write measures (%d vs %d)\n", nitems, Nmeasure);
+      return (FALSE);
+    }
+    return (TRUE);
+  }
+  fprintf (stderr, "error writing measures\n");
+  return (FALSE);
+}
Index: /trunk/Ohana/src/libohana/src/phot_catalog.c
===================================================================
--- /trunk/Ohana/src/libohana/src/phot_catalog.c	(revision 4831)
+++ /trunk/Ohana/src/libohana/src/phot_catalog.c	(revision 4832)
@@ -36,212 +36,42 @@
 int load_catalog (Catalog *catalog, char mode, int VERBOSE) {
   
-  int Nitems, nitems;
-  int i, Nmeas, Nmiss, size, ssize;
-  int NewMeasure, NewAverage, NewSecFilt;
-  FILE *f;
-  struct stat filestatus;
+  if (!strcmp (catalog[0].catmode, "RAW")) {
+    load_catalog_raw (catalog, mode, VERBOSE);
+    return (TRUE);
+  }
+  if (!strcmp (catalog[0].catmode, "MEF")) {
+    load_catalog_mef (catalog, mode, VERBOSE);
+    return (TRUE);
+  }
+  /*
+  if (!strcmp (catalog[0].catmode, "SPLIT")) {
+    load_catalog_split (catalog, mode, VERBOSE);
+    return (TRUE);
+  }
+  if (!strcmp (catalog[0].catmode, "MYSQL")) {
+    load_catalog_mysql (catalog, mode, VERBOSE);
+    return (TRUE);
+  }
+  */
+  return (FALSE);
+}
 
-  f = catalog[0].f;
-  fseek (f, 0, SEEK_SET);
+int save_catalog (Catalog *catalog, char VERBOSE) {
 
-  /* read catalog header */
-  if (!fits_load_header (f, &catalog[0].header)) {
-    if (VERBOSE) fprintf (stderr, "catalog file does not exist: %s\n", catalog[0].filename);
-    return (FALSE);
+  if (!strcmp (catalog[0].catmode, "RAW")) {
+    save_catalog_raw (catalog, VERBOSE);
+    return (TRUE);
   }
-
-  /* this is done by the load anyway... */
-  fseek (f, catalog[0].header.size, SEEK_SET); 
-
-  /* require the file to contain the NEW versions (ELIXIR) */
-  if (!fits_scan (&catalog[0].header, "NEWMEAS",  "%t", 1, &NewMeasure)) return (FALSE);
-  if (!fits_scan (&catalog[0].header, "NEWAVES",  "%t", 1, &NewAverage)) return (FALSE);
-  if (!fits_scan (&catalog[0].header, "NEWSECF",  "%t", 1, &NewSecFilt)) return (FALSE);
-
-  /* get the components from the header */
-  catalog[0].Naverage = catalog[0].Nmeasure = catalog[0].Nmissing = catalog[0].Nsecfilt = 0;
-  if (!fits_scan (&catalog[0].header, "NSTARS",   "%d", 1, &catalog[0].Naverage)) return (FALSE);
-  if (!fits_scan (&catalog[0].header, "NMEAS",    "%d", 1, &catalog[0].Nmeasure)) return (FALSE);
-  if (!fits_scan (&catalog[0].header, "NMISS",    "%d", 1, &catalog[0].Nmissing)) return (FALSE);
-  if (!fits_scan (&catalog[0].header, "NSECFILT", "%d", 1, &catalog[0].Nsecfilt)) catalog[0].Nsecfilt = 0;
-
-  /* predicted file size - for double checking data validity */
-  size = catalog[0].header.size;
-  ssize = sizeof (Average);
-  size += ssize * catalog[0].Naverage;
-  ssize = sizeof (Measure);
-  size += ssize * catalog[0].Nmeasure;
-  ssize = sizeof (Missing);
-  size += ssize * catalog[0].Nmissing;
-  ssize = sizeof (SecFilt);
-  size += ssize * catalog[0].Nsecfilt * catalog[0].Naverage;
-
-  /* check that file size makes sense */
-  if (stat (catalog[0].filename, &filestatus) == -1) {
-    if (VERBOSE) fprintf (stderr, "failed to get status of catalog\n");
-    return (FALSE);
-  }
-  if (size > filestatus.st_size) {
-    if (VERBOSE) {
-      fprintf (stderr, "star catalog has inconsistent size\n");
-      ssize = sizeof (Average);
-      fprintf (stderr, "average: %d = %d bytes\n", catalog[0].Naverage, catalog[0].Naverage*ssize);
-      ssize = sizeof (Measure);
-      fprintf (stderr, "measure: %d = %d bytes\n", catalog[0].Nmeasure, catalog[0].Nmeasure*ssize);
-      ssize = sizeof (Missing);
-      fprintf (stderr, "missing: %d = %d bytes\n", catalog[0].Nmissing, catalog[0].Nmissing*ssize);
-      ssize = sizeof (SecFilt);
-      fprintf (stderr, "secfilt: %d = %d bytes\n", catalog[0].Nsecfilt, catalog[0].Nsecfilt*catalog[0].Naverage*ssize);
-      fprintf (stderr, "expect: %d, found: %d\n", size, (int)filestatus.st_size);
-    }
-    return (FALSE);
-  } 
-  if (size < filestatus.st_size) {
-    if (VERBOSE) fprintf (stderr, "warning: file larger than expected\n");
-  } 
-
-  if (catalog[0].Naverage == 0) {
-    if (VERBOSE) fprintf (stderr, "no stars yet in catalog %s\n", catalog[0].filename);
+  if (!strcmp (catalog[0].catmode, "MEF")) {
+    save_catalog_mef (catalog, VERBOSE);
     return (TRUE);
   }
 
-  if (mode & LOAD_AVES) {
-    ALLOCATE (catalog[0].average, Average, MAX (catalog[0].Naverage, 1));
-    Nitems = catalog[0].Naverage;
-    nitems = Fread (catalog[0].average, sizeof(Average), Nitems, f, "average");
-    if (nitems != Nitems) {
-      if (VERBOSE) fprintf (stderr, "failed to read averages from catalog file %s (%d vs %d)\n", catalog[0].filename, nitems, Nitems);
-      return (FALSE);
-    }
-  } else {
-    /* skip over averages */
-    fseek (f, catalog[0].Naverage * sizeof(Average), SEEK_CUR); 
-  }    
-  
-  if (mode & LOAD_MEAS) {
-    ALLOCATE (catalog[0].measure, Measure, MAX (catalog[0].Nmeasure, 1));
-    Nitems = catalog[0].Nmeasure;
-    nitems = Fread (catalog[0].measure, sizeof(Measure), Nitems, f, "measure");
-    if (nitems != Nitems) {
-      if (VERBOSE) fprintf (stderr, "failed to read measures from catalog file %s (%d vs %d)\n", catalog[0].filename, nitems, Nitems);
-      return (FALSE);
-    }
-  } else {
-    /* skip over measures */
-    fseek (f, catalog[0].Nmeasure * sizeof(Measure), SEEK_CUR); 
-  } 
-
-  if (mode & LOAD_MISS) {
-    /* read missing */
-    ALLOCATE (catalog[0].missing, Missing, MAX (catalog[0].Nmissing, 1));
-    Nitems = catalog[0].Nmissing;
-    nitems = Fread (catalog[0].missing, sizeof(Missing), Nitems, f, "missing");
-    if (nitems != Nitems) {
-      if (VERBOSE) fprintf (stderr, "failed to read missing from catalog file %s (%d vs %d)\n", catalog[0].filename, nitems, Nitems);
-      return (FALSE);
-    }
-  } else {
-    /* skip over missings */
-    fseek (f, catalog[0].Nmissing * sizeof(Missing), SEEK_CUR); 
-  }
-  
-  if (mode & LOAD_SECF) {
-    Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
-    ALLOCATE (catalog[0].secfilt, SecFilt, MAX (Nitems, 1));
-    nitems = Fread (catalog[0].secfilt, sizeof(SecFilt), Nitems, f, "secfilt");
-    if (nitems != Nitems) {
-      if (VERBOSE) fprintf (stderr, "failed to read secondary filters from catalog file %s (%d vs %d)\n", catalog[0].filename, nitems, Nitems);
-      return (FALSE);
-    }
-  } else {
-    /* skip over secfilts */
-    fseek (f, catalog[0].Naverage * catalog[0].Nsecfilt * sizeof(SecFilt), SEEK_CUR); 
-  }
-
-  if (VERBOSE) fprintf (stderr, "read %d stars from catalog file %s (%d measurements, %d missing, %d secondary filters)\n", 
-	   catalog[0].Naverage, catalog[0].filename, catalog[0].Nmeasure, catalog[0].Nmissing, catalog[0].Nsecfilt);
-
-  /* check data integrity */
-  if (mode & LOAD_AVES) {
-    for (i = Nmeas = Nmiss = 0; i < catalog[0].Naverage; i++) {
-      Nmeas += catalog[0].average[i].Nm; 
-      Nmiss += catalog[0].average[i].Nn; 
-    }
-    if ((Nmeas != catalog[0].Nmeasure) || (Nmiss != catalog[0].Nmissing)) {
-      if (VERBOSE) {
-	fprintf (stderr, "****** data in catalog %s is corrupt, sums don't check\n", catalog[0].filename);
-	fprintf (stderr, "****** Nmeas: %d, %d\n", Nmeas, catalog[0].Nmeasure);
-	fprintf (stderr, "****** Nmiss: %d, %d\n", Nmiss, catalog[0].Nmissing);
-      }
-      return (FALSE);
-    }
-  }
-  return (TRUE);
+  return (FALSE);
 }
 
-/* this is not robust: an error will not return us to the original
-   state.  But, it is faster: only limited data written to disk? *
+/*
+  mode   : items to read (LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF)
+  format : what structure on disk (INTERNAL, ELIXIR, LONEOS, PANSTARRS)
+  style  : raw, mef, split, mysql
 */
-
-int save_catalog (Catalog *catalog, char VERBOSE) {
-
-  int Nitems, nitems;
-  FILE *f;
-
-  if (catalog[0].Naverage == 0) {
-    if (VERBOSE) fprintf (stderr, "no stars in catalog, skipping\n");
-    return (TRUE);
-  }
-
-  /* make sure header is consistent with data */
-  fits_modify (&catalog[0].header, "NSTARS",   "%d", 1, catalog[0].Naverage);
-  fits_modify (&catalog[0].header, "NMEAS",    "%d", 1, catalog[0].Nmeasure);
-  fits_modify (&catalog[0].header, "NMISS",    "%d", 1, catalog[0].Nmissing);
-  fits_modify (&catalog[0].header, "NSECFILT", "%d", 1, catalog[0].Nsecfilt);
-  fits_modify (&catalog[0].header, "NEWMEAS",  "%t", 1, TRUE);
-  fits_modify (&catalog[0].header, "NEWAVES",  "%t", 1, TRUE);
-  fits_modify (&catalog[0].header, "NEWSECF",  "%t", 1, TRUE);
-
-  f = catalog[0].f;
-  /* rewind file pointers and truncate */
-  fseek (f, 0, SEEK_SET);
-  ftruncate (fileno (catalog[0].f), 0);
-
-  nitems = Fwrite (catalog[0].header.buffer, 1, catalog[0].header.size, f, "char");
-  if (nitems != catalog[0].header.size) {
-    if (VERBOSE) fprintf (stderr, "failed to write header\n");
-    return (FALSE);
-  }
-
-  Nitems = catalog[0].Naverage;
-  nitems = Fwrite (catalog[0].average, sizeof(Average), Nitems, f, "average");
-  if (nitems != Nitems) {
-    if (VERBOSE) fprintf (stderr, "failed to write catalog file aves %s\n", catalog[0].filename);
-    return (FALSE);
-  }
-  
-  Nitems = catalog[0].Nmeasure;
-  nitems = Fwrite (catalog[0].measure, sizeof(Measure), Nitems, f, "measure");
-  if (nitems != Nitems) {
-    if (VERBOSE) fprintf (stderr, "failed to write catalog file meas %s\n", catalog[0].filename);
-    return (FALSE);
-  }
-
-  Nitems = catalog[0].Nmissing;
-  nitems = Fwrite (catalog[0].missing, sizeof(Missing), Nitems, f, "missing");
-  if (nitems != Nitems) {
-    if (VERBOSE) fprintf (stderr, "failed to write catalog file miss %s\n", catalog[0].filename);
-    return (FALSE);
-  }
-
-  Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
-  nitems = Fwrite (catalog[0].secfilt, sizeof(SecFilt), Nitems, f, "secfilt");
-  if (nitems != Nitems) {
-    if (VERBOSE) fprintf (stderr, "failed to write catalog file secondary filters %s\n", catalog[0].filename);
-    return (FALSE);
-  }
-
-  return (TRUE);
-
-}
-
