Index: /branches/dvo-mods-2007-02/Ohana/src/libdvo/include/dvo.h
===================================================================
--- /branches/dvo-mods-2007-02/Ohana/src/libdvo/include/dvo.h	(revision 12010)
+++ /branches/dvo-mods-2007-02/Ohana/src/libdvo/include/dvo.h	(revision 12011)
@@ -232,18 +232,5 @@
 float PhotdM (PhotCode *code, Average *average, SecFilt *secfilt);
 
-# if (0)
-short iPhotInst (Measure *measure);
-short iPhotAbs (Measure *measure);
-short iPhotCat (Measure *measure);
-short iPhotSys (Measure *measure, Average *average, SecFilt *secfilt);
-short iPhotRel (Measure *measure, Average *average, SecFilt *secfilt);
-short iPhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code);
-short iPhotAve (PhotCode *code, Average *average, SecFilt *secfilt);
-short iPhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure);
-short iPhotXm (PhotCode *code, Average *average, SecFilt *secfilt);
-short iPhotdM (PhotCode *code, Average *average, SecFilt *secfilt);
-# endif
-
-float iPhotColor (Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code);
+float PhotColorForCode (Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code);
 int PhotColor (Average *average, SecFilt *secfilt, Measure *measure, int c1, int c2, double *color);
 
@@ -297,40 +284,55 @@
 
 /*** conversion functions / I/O conversions ***/
-Average *ReadRawAverage (FILE *f, int Naverage, int format);
+Average *ReadRawAverage (FILE *f, int Naverage, int format, SecFilt **primary);
 Measure *ReadRawMeasure (FILE *f, int Nmeasure, int format);
 SecFilt *ReadRawSecFilt (FILE *f, int Nsecfilt, int format);
-int WriteRawAverage (FILE *f, Average *average, int Naverage, int format);
+int WriteRawAverage (FILE *f, Average *average, int Naverage, int format, SecFilt *primary);
 int WriteRawMeasure (FILE *f, Measure *measure, int Nmeasure, int format);
 int WriteRawSecFilt (FILE *f, SecFilt *secfilt, int Nsecfilt, int format);
 
-Average *FtableToAverage (FTable *ftable, int *Naverage, int *format);
-Average *AverageLoneosToInternal (AverageLoneos *in, int Nvalues);
-Average *AverageElixirToInternal (AverageElixir *in, int Nvalues);
-Average *AveragePanstarrsToInternal (AveragePanstarrs *in, int Nvalues);
-Average *AveragePMtestToInternal (AveragePMtest *in, int Nvalues);
-AverageLoneos *AverageInternalToLoneos (Average *in, int Nvalues);
-AverageElixir *AverageInternalToElixir (Average *in, int Nvalues);
-AveragePanstarrs *AverageInternalToPanstarrs (Average *in, int Nvalues);
-AveragePMtest *AverageInternalToPMtest (Average *in, int Nvalues);
-
+Average *FtableToAverage (FTable *ftable, int *Naverage, int *format, SecFilt **primary);
 Measure *FtableToMeasure (FTable *ftable, int *Nmeasure, int *format);
-Measure *MeasureLoneosToInternal (MeasureLoneos *in, int Nvalues);
-Measure *MeasureElixirToInternal (MeasureElixir *in, int Nvalues);
-Measure *MeasurePanstarrsToInternal (MeasurePanstarrs *in, int Nvalues);
-MeasureLoneos *MeasureInternalToLoneos (Measure *in, int Nvalues);
-MeasureElixir *MeasureInternalToElixir (Measure *in, int Nvalues);
-MeasurePanstarrs *MeasureInternalToPanstarrs (Measure *in, int Nvalues);
-
 SecFilt *FtableToSecFilt (FTable *ftable, int *Nsecfilt, int *format);
-SecFilt *SecFiltLoneosToInternal (SecFiltLoneos *in, int Nvalues);
-SecFilt *SecFiltElixirToInternal (SecFiltElixir *in, int Nvalues);
-SecFilt *SecFiltPanstarrsToInternal (SecFiltPanstarrs *in, int Nvalues);
-SecFiltLoneos *SecFiltInternalToLoneos (SecFilt *in, int Nvalues);
-SecFiltElixir *SecFiltInternalToElixir (SecFilt *in, int Nvalues);
-SecFiltPanstarrs *SecFiltInternalToPanstarrs (SecFilt *in, int Nvalues);
-
-int AverageToFtable (FTable *ftable, Average *average, int Naverage, int format);
+int FtableToImage (FTable *ftable, Header *theader, int *format);
+
+int AverageToFtable (FTable *ftable, Average *average, int Naverage, int format, SecFilt *primary);
 int MeasureToFtable (FTable *ftable, Measure *measure, int Nmeasure, int format);
 int SecFiltToFtable (FTable *ftable, SecFilt *secfilt, int Nsecfilt, int format);
+int ImageToFtable (FTable *ftable, Header *theader, int format);
+int ImageToVtable (VTable *vtable, Header *theader, int format);
+
+Image 		 *ImageElixirToInternal (ImageElixir *in, int Nvalues);
+Image 		 *ImageLoneosToInternal (ImageLoneos *in, int Nvalues);
+Image 		 *ImagePanstarrsToInternal (ImagePanstarrs *in, int Nvalues);
+
+ImageElixir 	 *ImageInternalToElixir (Image *in, int Nvalues);
+ImageLoneos 	 *ImageInternalToLoneos (Image *in, int Nvalues);
+ImagePanstarrs   *ImageInternalToPanstarrs (Image *in, int Nvalues);
+
+Average          *AverageLoneosToInternal (AverageLoneos *in, int Nvalues, SecFilt **primary);
+Average 	 *AverageElixirToInternal (AverageElixir *in, int Nvalues, SecFilt **primary);
+Average 	 *AveragePMtestToInternal (AveragePMtest *in, int Nvalues);
+Average 	 *AveragePanstarrsToInternal (AveragePanstarrs *in, int Nvalues);
+
+AverageLoneos 	 *AverageInternalToLoneos (Average *in, int Nvalues, SecFilt *primary);
+AverageElixir 	 *AverageInternalToElixir (Average *in, int Nvalues, SecFilt *primary);
+AveragePMtest    *AverageInternalToPMtest (Average *in, int Nvalues);
+AveragePanstarrs *AverageInternalToPanstarrs (Average *in, int Nvalues);
+
+Measure          *MeasureLoneosToInternal (MeasureLoneos *in, int Nvalues);
+Measure 	 *MeasureElixirToInternal (MeasureElixir *in, int Nvalues);
+Measure 	 *MeasurePanstarrsToInternal (MeasurePanstarrs *in, int Nvalues);
+
+MeasureLoneos 	 *MeasureInternalToLoneos (Measure *in, int Nvalues);
+MeasureElixir 	 *MeasureInternalToElixir (Measure *in, int Nvalues);
+MeasurePanstarrs *MeasureInternalToPanstarrs (Measure *in, int Nvalues);
+
+SecFilt 	 *SecFiltLoneosToInternal (SecFiltLoneos *in, int Nvalues);
+SecFilt 	 *SecFiltElixirToInternal (SecFiltElixir *in, int Nvalues);
+SecFilt 	 *SecFiltPanstarrsToInternal (SecFiltPanstarrs *in, int Nvalues);
+
+SecFiltLoneos 	 *SecFiltInternalToLoneos (SecFilt *in, int Nvalues);
+SecFiltElixir 	 *SecFiltInternalToElixir (SecFilt *in, int Nvalues);
+SecFiltPanstarrs *SecFiltInternalToPanstarrs (SecFilt *in, int Nvalues);
 
 /*** DVO image db I/O Functions ***/
@@ -345,14 +347,4 @@
 int dvo_image_addrows (FITS_DB *db, Image *new, int Nnew);
 void dvo_image_create (FITS_DB *db, double ZeroPoint);
-
-int FtableToImage (FTable *ftable, Header *theader, int *format);
-int ImageToFtable (FTable *ftable, Header *theader, int format);
-int ImageToVtable (VTable *vtable, Header *theader, int format);
-Image *ImageElixirToInternal (ImageElixir *in, int Nvalues);
-ImageElixir *ImageInternalToElixir (Image *in, int Nvalues);
-Image *ImageLoneosToInternal (ImageLoneos *in, int Nvalues);
-ImageLoneos *ImageInternalToLoneos (Image *in, int Nvalues);
-Image *ImagePanstarrsToInternal (ImagePanstarrs *in, int Nvalues);
-ImagePanstarrs *ImageInternalToPanstarrs (Image *in, int Nvalues);
 
 /* skyregion APIs */
Index: /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/LoadPhotcodes.c
===================================================================
--- /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/LoadPhotcodes.c	(revision 12010)
+++ /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/LoadPhotcodes.c	(revision 12011)
@@ -3,5 +3,5 @@
 # define NCTERMS 4
 # define F 0.001
-# define NO_MAG 100.0
+/* # define NO_MAG 100.0 */
 
 static PhotCodeData *photcodes = NULL;
@@ -380,107 +380,4 @@
 }
 
-/**** conversion to INTERNAL vs TABLE types makes the iPhot versions irrelevant ****/
-# if (0) 
-/******** photometry conversions *********/
-double PhotInst (Measure *measure) {
-
-  short Mi;
-  double M;
-
-  Mi = iPhotInst (measure);
-  M = 0.001*Mi;
-  return (M);
-}
-
-/****/
-double PhotCat (Measure *measure) {
-
-  short Mi;
-  double M;
-
-  Mi = iPhotCat (measure);
-  M = 0.001*Mi;
-  return (M);
-}
-
-/****/
-double PhotSys (Measure *measure, Average *average, SecFilt *secfilt) {
-
-  short Mi;
-  double M;
-
-  Mi = iPhotSys (measure, average, secfilt);
-  M = 0.001*Mi;
-  return (M);
-}
-
-/****/
-double PhotRel (Measure *measure, Average *average, SecFilt *secfilt) {
-
-  short Mi;
-  double M;
-
-  Mi = iPhotRel (measure, average, secfilt);
-  M = 0.001*Mi;
-  return (M);
-}
-
-/****/
-double PhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code) {
-
-  short Mi;
-  double M;
-
-  Mi = iPhotCal (thisone, average, secfilt, measure, code);
-  M = 0.001*Mi;
-  return (M);
-}
-
-/****/
-double PhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure) {
-
-  short Mi;
-  double M;
-
-  Mi = iPhotRef (code, average, secfilt, measure);
-  M = 0.001*Mi;
-  return (M);
-}
-
-/****/
-double PhotAve (PhotCode *code, Average *average, SecFilt *secfilt) {
-
-  short Mi;
-  double M;
-
-  Mi = iPhotAve (code, average, secfilt);
-  M = 0.001*Mi;
-  return (M);
-}
-
-/****/
-double PhotdM (PhotCode *code, Average *average, SecFilt *secfilt) {
-
-  short Mi;
-  double M;
-
-  Mi = iPhotdM (code, average, secfilt);
-  M = 0.001*Mi;
-  return (M);
-}
-
-/****/
-double PhotXm (PhotCode *code, Average *average, SecFilt *secfilt) {
-
-  int Mi;
-  double Xm;
-
-  Mi = iPhotXm (code, average, secfilt);
-  Xm = (Mi == NO_MAG) ? -1.0 : pow (10.0, 0.01*Mi);
-  return (Xm);
-}
-
-# endif 
-
 /******** internal photometry conversions (keeps values in short int millimags) *********/
 float PhotInst (Measure *measure) {
@@ -539,5 +436,5 @@
 
   /* for DEP, color must be made of PRI/SEC */
-  mc = iPhotColor (average, secfilt, NULL, code);
+  mc = PhotColorForCode (average, secfilt, NULL, code);
   if (mc == NO_MAG) return (Mcat);
   mc = mc - F*code[0].dX;
@@ -570,5 +467,5 @@
 
   /* for DEP, color must be made of PRI/SEC */
-  mc = iPhotColor (average, secfilt, NULL, code);
+  mc = PhotColorForCode (average, secfilt, NULL, code);
   if (mc == NO_MAG) return (Mrel);
   mc = mc - F*code[0].dX;
@@ -606,5 +503,5 @@
   Mcal = PhotRel (thisone, average, secfilt) + F*code[0].C;
 
-  mc = iPhotColor (average, secfilt, measure, code);
+  mc = PhotColorForCode (average, secfilt, measure, code);
   if (mc == NO_MAG) return (Mcal);
   mc = mc - F*code[0].dX;
@@ -621,5 +518,5 @@
 
 /* color term may not use DEP magnitude */
-float iPhotColor (Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code) {
+float PhotColorForCode (Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code) {
 
   int i, Ns1, Ns2, Ns;
@@ -633,6 +530,6 @@
     Ns2 = photcodes[0].hashNsec[code[0].c2];
   
-    m1 = (Ns1 == -1) ? average[0].M : secfilt[Ns1].M;
-    m2 = (Ns2 == -1) ? average[0].M : secfilt[Ns2].M;
+    m1 = (Ns1 == -1) ? NO_MAG : secfilt[Ns1].M;
+    m2 = (Ns2 == -1) ? NO_MAG : secfilt[Ns2].M;
     mc = ((m1 == NO_MAG) || (m2 == NO_MAG)) ? NO_MAG : (m1 - m2);
     return (mc);
@@ -650,5 +547,5 @@
   } else {
     Ns = photcodes[0].hashNsec[color[0].code];
-    m1 = (Ns == -1) ? average[0].M : secfilt[Ns].M;
+    m1 = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
   }	
 
@@ -664,5 +561,5 @@
   } else {
     Ns = photcodes[0].hashNsec[color[0].code];
-    m2 = (Ns == -1) ? average[0].M : secfilt[Ns].M;
+    m2 = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
   }	
   mc = ((m1 == NO_MAG) || (m2 == NO_MAG)) ? NO_MAG : (m1 - m2);
@@ -678,8 +575,8 @@
 
   Ns = photcodes[0].hashNsec[code[0].code];
-  Mave = (Ns == -1) ? average[0].M : secfilt[Ns].M;
+  Mave = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
   Mref = Mave + F*code[0].C;
 
-  mc = iPhotColor (average, secfilt, measure, code);
+  mc = PhotColorForCode (average, secfilt, measure, code);
   if (mc == NO_MAG) return (Mref);
   mc = mc - F*code[0].dX;
@@ -702,9 +599,8 @@
 
   Ns = photcodes[0].hashNsec[code[0].code];
-  Mave = (Ns == -1) ? average[0].M : secfilt[Ns].M;
+  Mave = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
   return (Mave);
 }
 
-/*** note that this is NOT a wrapper around iPhotdM ***/
 float PhotdM (PhotCode *code, Average *average, SecFilt *secfilt) {
 
@@ -713,9 +609,8 @@
 
   Ns = photcodes[0].hashNsec[code[0].code];
-  dM  = (Ns == -1) ? average[0].dM : secfilt[Ns].dM;
+  dM  = (Ns == -1) ? NO_MAG : secfilt[Ns].dM;
   return (dM);
 }
 
-/*** note that this is NOT a wrapper around iPhotXm ***/
 float PhotXm (PhotCode *code, Average *average, SecFilt *secfilt) {
 
@@ -725,5 +620,5 @@
 
   Ns = photcodes[0].hashNsec[code[0].code];
-  Mi = (Ns == -1) ? average[0].Xm : secfilt[Ns].Xm;
+  Mi = (Ns == -1) ? NO_MAG : secfilt[Ns].Xm;
   Xm = (Mi == NO_MAG) ? -1.0 : pow (10.0, 0.01*Mi);
   return (Xm);
@@ -749,5 +644,5 @@
   } else {
     Ns = photcodes[0].hashNsec[code[0].code];
-    M1 = (Ns == -1) ? average[0].M : secfilt[Ns].M;
+    M1 = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
   }	
 
@@ -765,5 +660,5 @@
   } else {
     Ns = photcodes[0].hashNsec[code[0].code];
-    M2 = (Ns == -1) ? average[0].M : secfilt[Ns].M;
+    M2 = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
   }	
   
Index: /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_catalog_mef.c
===================================================================
--- /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_catalog_mef.c	(revision 12010)
+++ /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_catalog_mef.c	(revision 12011)
@@ -9,4 +9,5 @@
   Matrix matrix;
   FTable ftable;
+  SecFilt *primary;
 
   f = catalog[0].f;
@@ -44,5 +45,6 @@
       return (FALSE);
     }
-    catalog[0].average = FtableToAverage (&ftable, &catalog[0].Naverage, &catalog[0].catformat);
+    /* old versions of DVO stored one of the average magnitudes in Average. we save this if needed */
+    catalog[0].average = FtableToAverage (&ftable, &catalog[0].Naverage, &catalog[0].catformat, &primary);
     if (Naverage != catalog[0].Naverage) {
       fprintf (stderr, "Warning: mismatch between Naverage in PHU and Table headers (%d vs %d)\n", Naverage, catalog[0].Naverage);
@@ -96,7 +98,4 @@
   }
 
-  // catalog[0].secfilt = gfits_table_get_SecFilt (&ftable, &Nitems, NULL);
-  // catalog[0].Nsecfilt = Nitems / catalog[0].Naverage;
-
   /* read secfilt table header */
   if (!gfits_fread_header (f, &header)) {
@@ -110,4 +109,6 @@
       return (FALSE);
     }
+
+    /* how many entries do we expect from the secfilt table? */
     Nexpect = catalog[0].Nsecfilt * catalog[0].Naverage;
     catalog[0].secfilt = FtableToSecFilt (&ftable, &Nitems, &catalog[0].catformat);
@@ -115,8 +116,30 @@
       fprintf (stderr, "Warning: mismatch between Nsecfilt items in PHU and Table headers (%d vs %d)\n", Nexpect, Nitems);
     }
+
+    /* if primary is defined, we were supplied with one additional average magnitude from Average
+       we need to interleave these magnitudes with the secfilt entries just loaded */
+    if (primary != NULL) {
+      int Ntmpfilt, Ntotal, i, j;
+      SecFilt *tmpfilt;
+      tmpfilt  = catalog[0].secfilt;
+      Ntmpfilt = catalog[0].Nsecfilt;
+      Nsecfilt = catalog[0].Nsecfilt + 1;
+      Ntotal = Nsecfilt * catalog[0].Naverage;
+      ALLOCATE (catalog[0].secfilt, SecFilt, Ntotal);
+      for (i = 0; i < catalog[0].Naverage; i++) {
+	catalog[0].secfilt[i*Nsecfilt + 0] = primary[i];
+	for (j = 0; j < Ntmpfilt; j++) {
+	  catalog[0].secfilt[i*Nsecfilt + j + 1] = tmpfilt[i*Ntmpfilt + j];
+	}
+      }		
+      catalog[0].Nsecfilt = Nsecfilt;
+      free (primary);
+    } 
+
   } else {
     /* no real need to skip the data array here... */
     Nbytes = gfits_matrix_size (&header);
     fseek (f, Nbytes, SEEK_CUR);
+    if (primary != NULL) free (primary);
   }
 
@@ -129,6 +152,6 @@
 }
 
+/* XXX need to decompose the primary and secfilt entries for ELIXIR and LONEOS */
 /* save_catalog_mef writes a complete new file from scratch */
-
 int dvo_catalog_save_mef (Catalog *catalog, char VERBOSE) {
 
@@ -138,4 +161,7 @@
   Header header;
   FTable ftable;
+  SecFilt *primary;
+  SecFilt *secfilt;
+  int i, j, Nsecfilt, Nallfilt, Ntotal;
 
   if (catalog[0].Naverage == 0) {
@@ -171,6 +197,26 @@
   gfits_free_matrix (&matrix);
 
+  /* for the appropriate types, pull out the first secfilt and pass to AverageToFtable as primary */
+  if ((catalog[0].catformat == DVO_FORMAT_ELIXIR) || (catalog[0].catformat == DVO_FORMAT_LONEOS)) {
+    Nallfilt = catalog[0].Nsecfilt;
+    Nsecfilt = catalog[0].Nsecfilt - 1;
+    Ntotal = Nsecfilt * catalog[0].Naverage;
+    ALLOCATE (primary, SecFilt, catalog[0].Naverage);
+    ALLOCATE (secfilt, SecFilt, Ntotal);
+
+    for (i = 0; i < catalog[0].Naverage; i++) {
+      primary[i] = catalog[0].secfilt[i*Nallfilt + 0];
+      for (j = 0; j < Nsecfilt; j++) {
+	secfilt[i*Nsecfilt + j] = catalog[0].secfilt[i*Nallfilt + j + 1];
+      }
+    }		
+  } else {
+    primary = NULL;
+    secfilt = catalog[0].secfilt;
+    Nsecfilt = catalog[0].Nsecfilt;
+  }
+
   /* write out Average table (convert to FITS table format) */
-  AverageToFtable (&ftable, catalog[0].average, catalog[0].Naverage, catalog[0].catformat);
+  AverageToFtable (&ftable, catalog[0].average, catalog[0].Naverage, catalog[0].catformat, primary);
   if (!gfits_fwrite_Theader (catalog[0].f, &header)) {
     fprintf (stderr, "can't write table header");
@@ -211,16 +257,22 @@
 
   /* write out SecFilt table (convert to FITS table format) */
-  Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
-  SecFiltToFtable (&ftable, catalog[0].secfilt, Nitems, catalog[0].catformat);
-  if (!gfits_fwrite_Theader (catalog[0].f, &header)) {
-    fprintf (stderr, "can't write table header");
-    return (FALSE);
-  }
-  if (!gfits_fwrite_table (catalog[0].f, &ftable)) {
-    fprintf (stderr, "can't write table data");
-    return (FALSE);
-  }
-  gfits_free_table (&ftable);
-  gfits_free_header (&header);
+  Nitems = catalog[0].Naverage * Nsecfilt;
+  SecFiltToFtable (&ftable, secfilt, Nitems, catalog[0].catformat);
+  if (!gfits_fwrite_Theader (catalog[0].f, &header)) {
+    fprintf (stderr, "can't write table header");
+    return (FALSE);
+  }
+  if (!gfits_fwrite_table (catalog[0].f, &ftable)) {
+    fprintf (stderr, "can't write table data");
+    return (FALSE);
+  }
+  gfits_free_table (&ftable);
+  gfits_free_header (&header);
+
+  /* free temp storage */
+  if (primary != NULL) {
+    free (primary);
+    free (secfilt);
+  }
 
   return (TRUE);
@@ -228,15 +280,15 @@
 
 /*
-   catalog data is:
-   header (bitpix == 8)
-   matrix (empty)
-   average header
-   average table
-   measure header
-   measure table
-   missing header
-   missing table
-   secfilt header
-   secfilt table
+  catalog data is:
+  header (bitpix == 8)
+  matrix (empty)
+  average header
+  average table
+  measure header
+  measure table
+  missing header
+  missing table
+  secfilt header
+  secfilt table
 */
    
Index: /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_catalog_raw.c
===================================================================
--- /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_catalog_raw.c	(revision 12010)
+++ /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_catalog_raw.c	(revision 12011)
@@ -12,4 +12,5 @@
   struct stat filestatus;
   char format[80], telescope[80];
+  SecFilt *primary;
 
   f = catalog[0].f;
@@ -122,6 +123,7 @@
 
   /* read and convert the averages (use a macro to clean this up?) */
+  /* old versions of DVO stored one of the average magnitudes in Average. we save this if needed */
   if (catalog[0].catflags & LOAD_AVES) {
-    catalog[0].average = ReadRawAverage (catalog[0].f, catalog[0].Naverage, catalog[0].catformat);
+    catalog[0].average = ReadRawAverage (catalog[0].f, catalog[0].Naverage, catalog[0].catformat, &primary);
   } else {
     /* skip over averages */
@@ -159,8 +161,30 @@
     Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
     catalog[0].secfilt = ReadRawSecFilt (catalog[0].f, Nitems, catalog[0].catformat);
+
+    /* if primary is defined, we were supplied with one additional average magnitude from Average
+       we need to interleave these magnitudes with the secfilt entries just loaded */
+    if (primary != NULL) {
+      int Ntmpfilt, Nsecfilt, Ntotal, i, j;
+      SecFilt *tmpfilt;
+      tmpfilt  = catalog[0].secfilt;
+      Ntmpfilt = catalog[0].Nsecfilt;
+      Nsecfilt = catalog[0].Nsecfilt + 1;
+      Ntotal = Nsecfilt * catalog[0].Naverage;
+      ALLOCATE (catalog[0].secfilt, SecFilt, Ntotal);
+      for (i = 0; i < catalog[0].Naverage; i++) {
+	catalog[0].secfilt[i*Nsecfilt + 0] = primary[i];
+	for (j = 0; j < Ntmpfilt; j++) {
+	  catalog[0].secfilt[i*Nsecfilt + j + 1] = tmpfilt[i*Ntmpfilt + j];
+	}
+      }		
+      catalog[0].Nsecfilt = Nsecfilt;
+      free (primary);
+    } 
+
   } else {
     /* skip over secfilts */
     Nskip = catalog[0].Nsecfilt * catalog[0].Naverage * SecFiltSize;
     fseek (f, Nskip, SEEK_CUR); 
+    if (primary != NULL) free (primary);
   }
 
@@ -196,4 +220,7 @@
   int Nitems, nitems;
   FILE *f;
+  SecFilt *primary;
+  SecFilt *secfilt;
+  int i, j, Nsecfilt, Nallfilt, Ntotal;
 
   if (catalog[0].Naverage == 0) {
@@ -227,6 +254,26 @@
   }
 
+  /* for the appropriate types, pull out the first secfilt and pass to WriteRawAverage as primary */
+  if ((catalog[0].catformat == DVO_FORMAT_ELIXIR) || (catalog[0].catformat == DVO_FORMAT_LONEOS)) {
+    Nallfilt = catalog[0].Nsecfilt;
+    Nsecfilt = catalog[0].Nsecfilt - 1;
+    Ntotal = Nsecfilt * catalog[0].Naverage;
+    ALLOCATE (primary, SecFilt, catalog[0].Naverage);
+    ALLOCATE (secfilt, SecFilt, Ntotal);
+
+    for (i = 0; i < catalog[0].Naverage; i++) {
+      primary[i] = catalog[0].secfilt[i*Nallfilt + 0];
+      for (j = 0; j < Nsecfilt; j++) {
+	secfilt[i*Nsecfilt + j] = catalog[0].secfilt[i*Nallfilt + j + 1];
+      }
+    }		
+  } else {
+    primary = NULL;
+    secfilt = catalog[0].secfilt;
+    Nsecfilt = catalog[0].Nsecfilt;
+  }
+
   /* write averages and measures */
-  WriteRawAverage (f, catalog[0].average, catalog[0].Naverage, catalog[0].catformat);
+  WriteRawAverage (f, catalog[0].average, catalog[0].Naverage, catalog[0].catformat, primary);
   WriteRawMeasure (f, catalog[0].measure, catalog[0].Nmeasure, catalog[0].catformat);
 
@@ -242,4 +289,11 @@
   Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
   WriteRawSecFilt (f, catalog[0].secfilt, Nitems, catalog[0].catformat);
+
+  /* free temp storage */
+  if (primary != NULL) {
+    free (primary);
+    free (secfilt);
+  }
+
   return (TRUE);
 }
@@ -252,5 +306,5 @@
 /** Average / Raw Table conversions **/
 
-Average *ReadRawAverage (FILE *f, int Naverage, int format) {
+Average *ReadRawAverage (FILE *f, int Naverage, int format, SecFilt **primary) {
 
   int nitems;
@@ -261,4 +315,8 @@
   // AveragePMtest *tmpAveragePMtest;
 
+  /* in the ELIXIR and LONEOS cases, we are supplied with an average magnitude in Average
+     in these cases, save these values in primary; otherwise set primary to NULL */
+  *primary = NULL;
+
   switch (format) {
     case DVO_FORMAT_INTERNAL:
@@ -279,5 +337,5 @@
       }
       gfits_convert_AverageElixir (tmpAverageElixir, sizeof(AverageElixir), Naverage);
-      average = AverageElixirToInternal (tmpAverageElixir, Naverage);
+      average = AverageElixirToInternal (tmpAverageElixir, Naverage, primary);
       free (tmpAverageElixir);
       break;
@@ -290,5 +348,5 @@
       }
       gfits_convert_AverageLoneos (tmpAverageLoneos, sizeof(AverageLoneos), Naverage);
-      average = AverageLoneosToInternal (tmpAverageLoneos, Naverage);
+      average = AverageLoneosToInternal (tmpAverageLoneos, Naverage, primary);
       free (tmpAverageLoneos);
       break;
@@ -326,5 +384,5 @@
 /* accepts and converts internal average formats and outputs 
    raw data in the specified format */
-int WriteRawAverage (FILE *f, Average *average, int Naverage, int format) {
+int WriteRawAverage (FILE *f, Average *average, int Naverage, int format, SecFilt *primary) {
 
   int nitems;
@@ -344,5 +402,5 @@
       break;
     case DVO_FORMAT_ELIXIR:
-      tmpAverageElixir = AverageInternalToElixir (average, Naverage);
+      tmpAverageElixir = AverageInternalToElixir (average, Naverage, primary);
       gfits_convert_AverageElixir (tmpAverageElixir, sizeof(AverageElixir), Naverage);
       nitems = fwrite (tmpAverageElixir, sizeof(AverageElixir), Naverage, f);
@@ -354,5 +412,5 @@
       break;
     case DVO_FORMAT_LONEOS:
-      tmpAverageLoneos = AverageInternalToLoneos (average, Naverage);
+      tmpAverageLoneos = AverageInternalToLoneos (average, Naverage, primary);
       gfits_convert_AverageLoneos (tmpAverageLoneos, sizeof(AverageLoneos), Naverage);
       nitems = fwrite (tmpAverageLoneos, sizeof(AverageLoneos), Naverage, f);
Index: /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_catalog_split.c
===================================================================
--- /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 12010)
+++ /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 12011)
@@ -8,4 +8,5 @@
   Matrix matrix;
   FTable ftable;
+  SecFilt *primary;
   Catalog *measure, *missing, *secfilt;
 
@@ -54,5 +55,6 @@
       return (FALSE);
     }
-    catalog[0].average = FtableToAverage (&ftable, &catalog[0].Naverage, &catalog[0].catformat);
+    /* old versions of DVO stored one of the average magnitudes in Average. we save this if needed */
+    catalog[0].average = FtableToAverage (&ftable, &catalog[0].Naverage, &catalog[0].catformat, &primary);
     if (Naverage != catalog[0].Naverage) {
       fprintf (stderr, "Warning: mismatch between Naverage in PHU and Table headers (%d vs %d)\n", Naverage, catalog[0].Naverage);
@@ -240,7 +242,32 @@
       fprintf (stderr, "Warning: mismatch between Nsecfilt items in PHU and Table headers (%d vs %d)\n", Nexpect, Nitems);
     }
+
+    /* if primary is defined, we were supplied with one additional average magnitude from Average
+       we need to interleave these magnitudes with the secfilt entries just loaded */
+    if (primary != NULL) {
+      int Ntmpfilt, Ntotal, i, j;
+      SecFilt *tmpfilt;
+      tmpfilt  = catalog[0].secfilt;
+      Ntmpfilt = catalog[0].Nsecfilt;
+      Nsecfilt = catalog[0].Nsecfilt + 1;
+      Ntotal = Nsecfilt * catalog[0].Naverage;
+      ALLOCATE (catalog[0].secfilt, SecFilt, Ntotal);
+      for (i = 0; i < catalog[0].Naverage; i++) {
+	catalog[0].secfilt[i*Nsecfilt + 0] = primary[i];
+	for (j = 0; j < Ntmpfilt; j++) {
+	  catalog[0].secfilt[i*Nsecfilt + j + 1] = tmpfilt[i*Ntmpfilt + j];
+	}
+      }		
+      catalog[0].Nsecfilt = Nsecfilt;
+      free (primary);
+    } 
+
+
     gfits_free_header (&header);
     gfits_free_matrix (&matrix);
-  } 
+  } else {
+    if (primary != NULL) free (primary);
+  }
+
   catalog[0].secfilt_catalog = secfilt;
 
@@ -254,5 +281,4 @@
 
 /* save_catalog_split writes complete new files from scratch */
-
 int dvo_catalog_save_split (Catalog *catalog, char VERBOSE) {
 
@@ -261,5 +287,7 @@
   Header header;
   FTable ftable;
-  Catalog *measure, *missing, *secfilt;
+  Catalog *catfile;
+  SecFilt *primary, *secfilt;
+  int i, j, Nsecfilt, Nallfilt, Ntotal;
 
   ftable.header = &header;
@@ -289,4 +317,30 @@
   /* in split mode, we can save only part of the data */ 
 
+  /* for the appropriate types, pull out the first secfilt and pass to AverageToFtable as primary */
+  if ((catalog[0].catformat == DVO_FORMAT_ELIXIR) || (catalog[0].catformat == DVO_FORMAT_LONEOS)) {
+    if (catalog[0].secfilt == NULL) {       
+      fprintf (stderr, "missing secfilt, cannot build output averages (dvo_catalog_split.c:544)\n");
+      exit (1);
+    }
+    secfilt = catalog[0].secfilt;
+
+    Nallfilt = catalog[0].Nsecfilt;
+    Nsecfilt = catalog[0].Nsecfilt - 1;
+    Ntotal = Nsecfilt * catalog[0].Naverage;
+    ALLOCATE (primary, SecFilt, catalog[0].Naverage);
+    ALLOCATE (secfilt, SecFilt, Ntotal);
+
+    for (i = 0; i < catalog[0].Naverage; i++) {
+      primary[i] = secfilt[i*Nallfilt + 0];
+      for (j = 0; j < Nsecfilt; j++) {
+	secfilt[i*Nsecfilt + j] = catalog[0].secfilt[i*Nallfilt + j + 1];
+      }
+    }		
+  } else {
+    primary = NULL;
+    secfilt = catalog[0].secfilt;
+    Nsecfilt = catalog[0].Nsecfilt;
+  }
+
   /*** Average Table ***/
 
@@ -303,5 +357,5 @@
 
     /* write out Average table (convert to FITS table format) */
-    AverageToFtable (&ftable, catalog[0].average, catalog[0].Naverage, catalog[0].catformat);
+    AverageToFtable (&ftable, catalog[0].average, catalog[0].Naverage, catalog[0].catformat, primary);
     if (!gfits_fwrite_Theader (catalog[0].f, &header)) {
       fprintf (stderr, "can't write table header");
@@ -317,8 +371,8 @@
 
   /*** Measure Table ***/
-
   if (catalog[0].measure != NULL) {
 
-    measure = catalog[0].measure_catalog;
+    /* catalog file data is stored in separate structure */
+    catfile = catalog[0].measure_catalog;
 
     /* XXX EAM : warn about this condition; add code to handle? */
@@ -329,9 +383,9 @@
 
     /* rewind file pointers and truncate (file is still open) */
-    fseek (measure[0].f, 0, SEEK_SET);
-    ftruncate (fileno (measure[0].f), 0);
+    fseek (catfile[0].f, 0, SEEK_SET);
+    ftruncate (fileno (catfile[0].f), 0);
 
     /* write table PHU header */
-    if (!gfits_fwrite_header  (measure[0].f, &measure[0].header)) {
+    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
       fprintf (stderr, "can't write primary header");
       return (FALSE);
@@ -339,6 +393,6 @@
 
     /* this is probably a NOP, do I have to keep it in? */
-    gfits_create_matrix (&measure[0].header, &matrix);
-    if (!gfits_fwrite_matrix  (measure[0].f, &matrix)) {
+    gfits_create_matrix (&catfile[0].header, &matrix);
+    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
       fprintf (stderr, "can't write primary matrix");
       return (FALSE);
@@ -348,9 +402,9 @@
     /* write out Measure table (convert to FITS table format) */
     MeasureToFtable (&ftable, catalog[0].measure, catalog[0].Nmeasure, catalog[0].catformat);
-    if (!gfits_fwrite_Theader (measure[0].f, &header)) {
+    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
       fprintf (stderr, "can't write table header");
       return (FALSE);
     }
-    if (!gfits_fwrite_table (measure[0].f, &ftable)) {
+    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
       fprintf (stderr, "can't write table data");
       return (FALSE);
@@ -361,15 +415,15 @@
 
   /*** Missing Table ***/
-
   if (catalog[0].missing != NULL) {
 
-    missing = catalog[0].missing_catalog;
+    /* catalog data is stored in separate catalog */
+    catfile = catalog[0].missing_catalog;
 
     /* rewind file pointers and truncate (file is still open) */
-    fseek (missing[0].f, 0, SEEK_SET);
-    ftruncate (fileno (missing[0].f), 0);
+    fseek (catfile[0].f, 0, SEEK_SET);
+    ftruncate (fileno (catfile[0].f), 0);
 
     /* write table PHU header */
-    if (!gfits_fwrite_header  (missing[0].f, &missing[0].header)) {
+    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
       fprintf (stderr, "can't write primary header");
       return (FALSE);
@@ -377,6 +431,6 @@
 
     /* this is probably a NOP, do I have to keep it in? */
-    gfits_create_matrix (&missing[0].header, &matrix);
-    if (!gfits_fwrite_matrix  (missing[0].f, &matrix)) {
+    gfits_create_matrix (&catfile[0].header, &matrix);
+    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
       fprintf (stderr, "can't write primary matrix");
       return (FALSE);
@@ -386,9 +440,9 @@
     /* write out Missing table (convert to FITS table format) */
     gfits_table_set_Missing (&ftable, catalog[0].missing, catalog[0].Nmissing);
-    if (!gfits_fwrite_Theader (missing[0].f, &header)) {
+    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
       fprintf (stderr, "can't write table header");
       return (FALSE);
     }
-    if (!gfits_fwrite_table (missing[0].f, &ftable)) {
+    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
       fprintf (stderr, "can't write table data");
       return (FALSE);
@@ -399,15 +453,15 @@
 
   /*** Secfilt Table ***/
-
   if (catalog[0].secfilt != NULL) {
 
-    secfilt = catalog[0].secfilt_catalog;
+    /* catalog file data is stored in a separate catalog structure */
+    catfile = catalog[0].secfilt_catalog;
 
     /* rewind file pointers and truncate (file is still open) */
-    fseek (secfilt[0].f, 0, SEEK_SET);
-    ftruncate (fileno (secfilt[0].f), 0);
+    fseek (catfile[0].f, 0, SEEK_SET);
+    ftruncate (fileno (catfile[0].f), 0);
 
     /* write table PHU header */
-    if (!gfits_fwrite_header  (secfilt[0].f, &secfilt[0].header)) {
+    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
       fprintf (stderr, "can't write primary header");
       return (FALSE);
@@ -415,6 +469,6 @@
 
     /* this is probably a NOP, do I have to keep it in? */
-    gfits_create_matrix (&secfilt[0].header, &matrix);
-    if (!gfits_fwrite_matrix  (secfilt[0].f, &matrix)) {
+    gfits_create_matrix (&catfile[0].header, &matrix);
+    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
       fprintf (stderr, "can't write primary matrix");
       return (FALSE);
@@ -424,10 +478,10 @@
     /* write out SecFilt table (convert to FITS table format) */
     Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
-    SecFiltToFtable (&ftable, catalog[0].secfilt, Nitems, catalog[0].catformat);
-    if (!gfits_fwrite_Theader (secfilt[0].f, &header)) {
+    SecFiltToFtable (&ftable, secfilt, Nitems, catalog[0].catformat);
+    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
       fprintf (stderr, "can't write table header");
       return (FALSE);
     }
-    if (!gfits_fwrite_table (secfilt[0].f, &ftable)) {
+    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
       fprintf (stderr, "can't write table data");
       return (FALSE);
@@ -435,4 +489,10 @@
     gfits_free_table (&ftable);
     gfits_free_header (&header);
+  }
+
+  /* free temp storage */
+  if (primary != NULL) {
+    free (primary);
+    free (secfilt);
   }
 
@@ -453,5 +513,7 @@
   FTable ftable;
   VTable vtable;
-  Catalog *measure, *missing, *secfilt;
+  Catalog *catfile;
+  SecFilt *primary, *secfilt;
+  int j, Nsecfilt, Nallfilt, Ntotal;
 
   ftable.header = &header;
@@ -480,6 +542,31 @@
   }
 
+  /** for the appropriate types, pull out the first secfilt and pass to AverageToFtable as primary **/
+  if ((catalog[0].catformat == DVO_FORMAT_ELIXIR) || (catalog[0].catformat == DVO_FORMAT_LONEOS)) {
+    if (catalog[0].secfilt == NULL) { 
+      fprintf (stderr, "missing secfilt, cannot build output averages (dvo_catalog_split.c:544)\n");
+      exit (1);
+    }
+    secfilt = catalog[0].secfilt;
+
+    Nallfilt = catalog[0].Nsecfilt;
+    Nsecfilt = catalog[0].Nsecfilt - 1;
+    Ntotal = Nsecfilt * catalog[0].Naverage;
+    ALLOCATE (primary, SecFilt, catalog[0].Naverage);
+    ALLOCATE (secfilt, SecFilt, Ntotal);
+
+    for (i = 0; i < catalog[0].Naverage; i++) {
+      primary[i] = secfilt[i*Nallfilt + 0];
+      for (j = 0; j < Nsecfilt; j++) {
+	secfilt[i*Nsecfilt + j] = catalog[0].secfilt[i*Nallfilt + j + 1];
+      }
+    }		
+  } else {
+    primary = NULL;
+    secfilt = catalog[0].secfilt;
+    Nsecfilt = catalog[0].Nsecfilt;
+  }
+
   /*** Average Table ***/
-
   if (catalog[0].average != NULL) {
 
@@ -492,5 +579,5 @@
 
     /* write out Average table (convert to FITS table format) */
-    AverageToFtable (&ftable, catalog[0].average, catalog[0].Naverage, catalog[0].catformat);
+    AverageToFtable (&ftable, catalog[0].average, catalog[0].Naverage, catalog[0].catformat, primary);
     /* convert only output rows to vtable */
     gfits_table_to_vtable (&ftable, &vtable, catalog[0].Nave_disk, Nout);
@@ -510,12 +597,11 @@
 
   /*** Measure Table ***/
-
   if (catalog[0].measure != NULL) {
 
-    measure = catalog[0].measure_catalog;
+    catfile = catalog[0].measure_catalog;
 
     /* skip past PHU header and matrix */
-    Nskip = measure[0].header.size + gfits_matrix_size (&measure[0].header);
-    fseek (measure[0].f, Nskip, SEEK_SET);
+    Nskip = catfile[0].header.size + gfits_matrix_size (&catfile[0].header);
+    fseek (catfile[0].f, Nskip, SEEK_SET);
 
     Ndisk  = catalog[0].Nmeas_disk;
@@ -547,9 +633,9 @@
     vtable.pad = vtable.size - Nx*Ny;
 
-    if (!gfits_fwrite_Theader (measure[0].f, &header)) {
+    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
       fprintf (stderr, "can't write table header");
       return (FALSE);
     }
-    if (!gfits_fwrite_vtable (measure[0].f, &vtable)) {
+    if (!gfits_fwrite_vtable (catfile[0].f, &vtable)) {
       fprintf (stderr, "can't write table data");
       return (FALSE);
@@ -566,12 +652,12 @@
   if (catalog[0].missing != NULL) {
 
-    missing = catalog[0].missing_catalog;
+    catfile = catalog[0].missing_catalog;
 
     /* rewind file pointers and truncate (file is still open) */
-    fseek (missing[0].f, 0, SEEK_SET);
-    ftruncate (fileno (missing[0].f), 0);
+    fseek (catfile[0].f, 0, SEEK_SET);
+    ftruncate (fileno (catfile[0].f), 0);
 
     /* write table PHU header */
-    if (!gfits_fwrite_header  (missing[0].f, &missing[0].header)) {
+    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
       fprintf (stderr, "can't write primary header");
       return (FALSE);
@@ -579,6 +665,6 @@
 
     /* this is probably a NOP, do I have to keep it in? */
-    gfits_create_matrix (&missing[0].header, &matrix);
-    if (!gfits_fwrite_matrix  (missing[0].f, &matrix)) {
+    gfits_create_matrix (&catfile[0].header, &matrix);
+    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
       fprintf (stderr, "can't write primary matrix");
       return (FALSE);
@@ -588,9 +674,9 @@
     /* write out Missing table (convert to FITS table format) */
     gfits_table_set_Missing (&ftable, catalog[0].missing, catalog[0].Nmissing);
-    if (!gfits_fwrite_Theader (missing[0].f, &header)) {
+    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
       fprintf (stderr, "can't write table header");
       return (FALSE);
     }
-    if (!gfits_fwrite_table (missing[0].f, &ftable)) {
+    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
       fprintf (stderr, "can't write table data");
       return (FALSE);
@@ -601,12 +687,11 @@
 
   /*** Secfilt Table ***/
-
   if (catalog[0].secfilt != NULL) {
 
-    secfilt = catalog[0].secfilt_catalog;
+    catfile = catalog[0].secfilt_catalog;
 
     /* skip past PHU header and matrix */
-    Nskip = secfilt[0].header.size + gfits_matrix_size (&secfilt[0].header);
-    fseek (secfilt[0].f, Nskip, SEEK_SET);
+    Nskip = catfile[0].header.size + gfits_matrix_size (&catfile[0].header);
+    fseek (catfile[0].f, Nskip, SEEK_SET);
 
     /* how many lines to write out? */
@@ -616,13 +701,13 @@
     /* convert to output format FITS table */
     Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
-    SecFiltToFtable (&ftable, catalog[0].secfilt, Nitems, catalog[0].catformat);
+    SecFiltToFtable (&ftable, secfilt, Nitems, catalog[0].catformat);
     /* convert only output rows to vtable */
     gfits_table_to_vtable (&ftable, &vtable, Ndisk, Nout);
 
-    if (!gfits_fwrite_Theader (secfilt[0].f, &header)) {
+    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
       fprintf (stderr, "can't write table header");
       return (FALSE);
     }
-    if (!gfits_fwrite_vtable (secfilt[0].f, &vtable)) {
+    if (!gfits_fwrite_vtable (catfile[0].f, &vtable)) {
       fprintf (stderr, "can't write table data");
       return (FALSE);
@@ -631,4 +716,10 @@
     gfits_free_table (&ftable);
     gfits_free_header (&header);
+  }
+
+  /* free temp storage */
+  if (primary != NULL) {
+    free (primary);
+    free (secfilt);
   }
 
Index: /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_convert.c
===================================================================
--- /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_convert.c	(revision 12010)
+++ /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_convert.c	(revision 12011)
@@ -13,8 +13,12 @@
 /*** Average / FTable conversion functions ***/
 
-Average *FtableToAverage (FTable *ftable, int *Naverage, int *format) {
+Average *FtableToAverage (FTable *ftable, int *Naverage, int *format, SecFilt **primary) {
 
   Average *average;
   char extname[80];
+
+  /* in the ELIXIR and LONEOS cases, we are supplied with an average magnitude in Average
+     in these cases, save these values in primary; otherwise set primary to NULL */
+  *primary = NULL;
 
   /* convert to the internal format */
@@ -31,5 +35,5 @@
     AverageElixir *tmpAverage;
     tmpAverage = gfits_table_get_AverageElixir (ftable, Naverage, NULL);
-    average = AverageElixirToInternal (tmpAverage, *Naverage);
+    average = AverageElixirToInternal (tmpAverage, *Naverage, primary);
     free (tmpAverage);
     *format = DVO_FORMAT_ELIXIR;
@@ -39,5 +43,5 @@
     AverageLoneos *tmpAverage;
     tmpAverage = gfits_table_get_AverageLoneos (ftable, Naverage, NULL);
-    average = AverageLoneosToInternal (tmpAverage, *Naverage);
+    average = AverageLoneosToInternal (tmpAverage, *Naverage, primary);
     free (tmpAverage);
     *format = DVO_FORMAT_LONEOS;
@@ -72,5 +76,5 @@
 }
 
-int AverageToFtable (FTable *ftable, Average *average, int Naverage, int format) {
+int AverageToFtable (FTable *ftable, Average *average, int Naverage, int format, SecFilt *primary) {
 
   AverageElixir *tmpAverageElixir;
@@ -85,11 +89,11 @@
       break;
     case DVO_FORMAT_ELIXIR:
-      tmpAverageElixir = AverageInternalToElixir (average, Naverage);
+      tmpAverageElixir = AverageInternalToElixir (average, Naverage, primary);
       gfits_table_set_AverageElixir (ftable, tmpAverageElixir, Naverage);
       free (tmpAverageElixir);
       break;
     case DVO_FORMAT_LONEOS:
-      tmpAverageLoneos  = AverageInternalToLoneos (average, Naverage);
-      gfits_table_set_AverageLoneos (ftable, tmpAverageLoneos , Naverage);
+      tmpAverageLoneos  = AverageInternalToLoneos (average, Naverage, primary);
+      gfits_table_set_AverageLoneos (ftable, tmpAverageLoneos, Naverage);
       free (tmpAverageLoneos );
       break;
Index: /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_convert_elixir.c
===================================================================
--- /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_convert_elixir.c	(revision 12010)
+++ /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_convert_elixir.c	(revision 12011)
@@ -78,5 +78,5 @@
 
 /* convert elixir-format averages to internal averages */
-Average *AverageElixirToInternal (AverageElixir *in, int Nvalues) {
+Average *AverageElixirToInternal (AverageElixir *in, int Nvalues, SecFilt **primary) {
 
   int i;
@@ -84,12 +84,10 @@
 
   ALLOCATE (out, Average, Nvalues);
+  ALLOCATE (*primary, SecFilt, 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  * 0.001;      
-    out[i].dM      = in[i].dM * 0.001;      
     out[i].Xp      = in[i].Xp;     
-    out[i].Xm      = in[i].Xm;     
     out[i].Nm      = in[i].Nm;     
     out[i].Nn      = in[i].Nn;     
@@ -97,5 +95,4 @@
     out[i].offset  = in[i].offset; 
     out[i].missing = in[i].missing;
-    out[i].Xg      = in[i].Xg;
 
     /* these don't exist in Elixir */
@@ -112,4 +109,13 @@
     out[i].objID_hi = 0;
     out[i].objID_lo = 0;
+
+    primary[0][i].M  = in[i].M  * 0.001;      
+    primary[0][i].dM = in[i].dM * 0.001;      
+    primary[0][i].Xm = in[i].Xm;     
+    primary[0][i].Ncode = 0;     
+    primary[0][i].Nused = 0;
+
+    // XXX drop this or keep this?
+    // primary[0][i].Xg = in[i].Xg;
   }
   return (out);
@@ -117,5 +123,5 @@
 
 /* convert internal averages to elixir-format averages */
-AverageElixir *AverageInternalToElixir (Average *in, int Nvalues) {
+AverageElixir *AverageInternalToElixir (Average *in, int Nvalues, SecFilt *primary) {
 
   int i;
@@ -127,8 +133,5 @@
     out[i].R       = in[i].R;      
     out[i].D       = in[i].D;      
-    out[i].M       = in[i].M  * 1000.0;      
-    out[i].dM      = in[i].dM * 1000.0;
     out[i].Xp      = in[i].Xp;     
-    out[i].Xm      = in[i].Xm;     
     out[i].Nm      = in[i].Nm;     
     out[i].Nn      = in[i].Nn;     
@@ -136,5 +139,9 @@
     out[i].offset  = in[i].offset; 
     out[i].missing = in[i].missing;
-    out[i].Xg      = in[i].Xg;
+
+    out[i].M       = primary[i].M  * 1000.0;      
+    out[i].dM      = primary[i].dM * 1000.0;
+    out[i].Xm      = primary[i].Xm;     
+    // out[i].Xg      = in[i].Xg;
   }
   return (out);
Index: /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_convert_loneos.c
===================================================================
--- /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_convert_loneos.c	(revision 12010)
+++ /branches/dvo-mods-2007-02/Ohana/src/libdvo/src/dvo_convert_loneos.c	(revision 12011)
@@ -75,5 +75,5 @@
 
 /* convert loneos-format averages to internal averages */
-Average *AverageLoneosToInternal (AverageLoneos *in, int Nvalues) {
+Average *AverageLoneosToInternal (AverageLoneos *in, int Nvalues, SecFilt **primary) {
 
   int i;
@@ -81,11 +81,10 @@
 
   ALLOCATE (out, Average, Nvalues);
+  ALLOCATE (*primary, SecFilt, 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 * 0.001;      
     out[i].Xp      = in[i].Xp;     
-    out[i].Xm      = in[i].Xm;     
     out[i].Nm      = in[i].Nm;     
     out[i].Nn      = in[i].Nn;     
@@ -103,10 +102,17 @@
     out[i].P       = 0;
     out[i].dP      = 0;
-    out[i].dM      = 0xffff;
-    out[i].Xg      = 0xffff;
 
     /* XXX add these later */
     out[i].objID_hi = 0;
     out[i].objID_lo = 0;
+
+    primary[0][i].M  = in[i].M  * 0.001;      
+    primary[0][i].Xm = in[i].Xm;     
+    primary[0][i].dM = 0xffff;
+    primary[0][i].Ncode = 0;     
+    primary[0][i].Nused = 0;
+
+    // XXX drop this or keep this?
+    // primary[0][i].Xg = in[i].Xg;
   }
   return (out);
@@ -114,5 +120,5 @@
 
 /* convert internal averages to loneos-format averages */
-AverageLoneos *AverageInternalToLoneos (Average *in, int Nvalues) {
+AverageLoneos *AverageInternalToLoneos (Average *in, int Nvalues, SecFilt *primary) {
 
   int i;
@@ -124,7 +130,5 @@
     out[i].R       = in[i].R;      
     out[i].D       = in[i].D;      
-    out[i].M       = in[i].M * 1000.0;      
     out[i].Xp      = in[i].Xp;     
-    out[i].Xm      = in[i].Xm;     
     out[i].Nm      = in[i].Nm;     
     out[i].Nn      = in[i].Nn;     
@@ -132,4 +136,7 @@
     out[i].offset  = in[i].offset; 
     out[i].missing = in[i].missing;
+
+    out[i].M       = primary[i].M * 1000.0;      
+    out[i].Xm      = primary[i].Xm;     
   }
   return (out);
