Index: /branches/eam_branch_20071130/Ohana/src/libdvo/src/dvo_catalog.c
===================================================================
--- /branches/eam_branch_20071130/Ohana/src/libdvo/src/dvo_catalog.c	(revision 15729)
+++ /branches/eam_branch_20071130/Ohana/src/libdvo/src/dvo_catalog.c	(revision 15730)
@@ -276,11 +276,5 @@
   gfits_modify (&catalog[0].header, "SORTED",  "%t", 1, catalog[0].sorted);
 
-  if (catalog[0].Nmeas_off != 0) {
-    if (!dvo_catalog_update (catalog, VERBOSE)) {
-      return (FALSE);
-    } 
-    return (TRUE);
-  }
-
+  // XXX handle return status
   switch (catalog[0].catmode) {
     case DVO_MODE_RAW:
@@ -300,4 +294,6 @@
 }
 
+# if (0)
+// XXX deprecate this function: choice of update or not is made in dvo_catalog_save_split, etc
 int dvo_catalog_update (Catalog *catalog, char VERBOSE) {
 
@@ -334,4 +330,5 @@
   return (TRUE);
 }
+# endif
 
 int dvo_catalog_check (Catalog *catalog, int Nsecfilt, int extend) {
Index: /branches/eam_branch_20071130/Ohana/src/libdvo/src/dvo_catalog_split.c
===================================================================
--- /branches/eam_branch_20071130/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 15729)
+++ /branches/eam_branch_20071130/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 15730)
@@ -447,4 +447,248 @@
       (catalog[0].catformat == DVO_FORMAT_LONEOS)) { // special case for LONEOS
     if (catalog[0].secfilt == NULL) {       
+      fprintf (stderr, "missing secfilt, cannot build output averages (dvo_catalog_split.c)\n");
+      exit (1);
+    }
+    secfilt = catalog[0].secfilt;
+
+    // XXX this translation only works if we have loaded / created a matched average/secfilt set
+    assert (catalog[0].Nsecf_mem == catalog[0].Nsecfilt*catalog[0].Naverage);
+
+    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];
+      }
+    }		
+    catalog[0].Nsecfilt --;
+    catalog[0].Nsecf_mem = catalog[0].Naverage*catalog[0].Nsecfilt;
+  } else {
+    primary = NULL;
+    secfilt = catalog[0].secfilt;
+    Nsecfilt = catalog[0].Nsecfilt;
+  }
+
+  /* make sure header is consistent with data */
+  gfits_modify (&catalog[0].header, "NSTARS",   "%d", 1, catalog[0].Naverage);
+  gfits_modify (&catalog[0].header, "NMEAS",    "%d", 1, catalog[0].Nmeasure);
+  gfits_modify (&catalog[0].header, "NMISS",    "%d", 1, catalog[0].Nmissing);
+  gfits_modify (&catalog[0].header, "NSECFILT", "%d", 1, Nsecfilt);
+  gfits_modify (&catalog[0].header, "EXTEND",   "%t", 1, TRUE);
+
+  /* rewind file pointers and truncate (file is still open) */
+  fseek (catalog[0].f, 0, SEEK_SET);
+
+  /* write table PHU header - always write this out */
+  /* XXX EAM : check if disk file size has changed */
+  if (!gfits_fwrite_header  (catalog[0].f, &catalog[0].header)) {
+    fprintf (stderr, "can't write primary header");
+    goto failure;
+  }
+
+  /* in split mode, we can save only part of the data */ 
+
+  /*** Average Table ***/
+
+  if (catalog[0].average != NULL) {
+    ftruncate (fileno (catalog[0].f), catalog[0].header.size);
+
+    /* this is probably a NOP, do I have to keep it in? */
+    gfits_create_matrix (&catalog[0].header, &matrix);
+    if (!gfits_fwrite_matrix  (catalog[0].f, &matrix)) {
+      fprintf (stderr, "can't write primary matrix");
+      goto failure;
+    }
+    gfits_free_matrix (&matrix);
+
+    /* write out Average table (convert to FITS table format) */
+    if (!AverageToFtable (&ftable, catalog[0].average, catalog[0].Naverage, catalog[0].catformat, primary)) {
+      fprintf (stderr, "trouble converting format\n");
+      goto failure;
+    }
+    if (!gfits_fwrite_Theader (catalog[0].f, &header)) {
+      fprintf (stderr, "can't write table header");
+      goto failure;
+    }
+    if (!gfits_fwrite_table (catalog[0].f, &ftable)) {
+      fprintf (stderr, "can't write table data");
+      goto failure;
+    }
+    gfits_free_table (&ftable);
+    gfits_free_header (&header);
+  }
+
+  /*** Measure Table ***/
+  if (catalog[0].measure != NULL) {
+
+    /* catalog file data is stored in separate structure */
+    catfile = catalog[0].measure_catalog;
+
+    /* XXX EAM : warn about this condition; add code to handle? */
+    if (catalog[0].Nmeas_off != 0) {
+      fprintf (stderr, "WARNING: LOAD_MEAS_META mixed with save??\n");
+      fprintf (stderr, "WARNING: this should not be allowed to happen!\n");
+    }
+
+    /* rewind file pointers and truncate (file is still open) */
+    fseek (catfile[0].f, 0, SEEK_SET);
+    ftruncate (fileno (catfile[0].f), 0);
+
+    /* write table PHU header */
+    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
+      fprintf (stderr, "can't write primary header");
+      goto failure;
+    }
+
+    /* this is probably a NOP, do I have to keep it in? */
+    gfits_create_matrix (&catfile[0].header, &matrix);
+    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
+      fprintf (stderr, "can't write primary matrix");
+      goto failure;
+    }
+    gfits_free_matrix (&matrix);
+
+    /* write out Measure table (convert to FITS table format) */
+    MeasureToFtable (&ftable, catalog[0].measure, catalog[0].Nmeasure, catalog[0].catformat);
+    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
+      fprintf (stderr, "can't write table header");
+      goto failure;
+    }
+    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
+      fprintf (stderr, "can't write table data");
+      goto failure;
+    }
+    gfits_free_table (&ftable);
+    gfits_free_header (&header);
+  }
+
+  /*** Missing Table ***/
+  if (catalog[0].missing != NULL) {
+
+    /* catalog data is stored in separate catalog */
+    catfile = catalog[0].missing_catalog;
+
+    /* rewind file pointers and truncate (file is still open) */
+    fseek (catfile[0].f, 0, SEEK_SET);
+    ftruncate (fileno (catfile[0].f), 0);
+
+    /* write table PHU header */
+    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
+      fprintf (stderr, "can't write primary header");
+      goto failure;
+    }
+
+    /* this is probably a NOP, do I have to keep it in? */
+    gfits_create_matrix (&catfile[0].header, &matrix);
+    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
+      fprintf (stderr, "can't write primary matrix");
+      goto failure;
+    }
+    gfits_free_matrix (&matrix);
+
+    /* write out Missing table (convert to FITS table format) */
+    gfits_table_set_Missing (&ftable, catalog[0].missing, catalog[0].Nmissing);
+    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
+      fprintf (stderr, "can't write table header");
+      goto failure;
+    }
+    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
+      fprintf (stderr, "can't write table data");
+      goto failure;
+    }
+    gfits_free_table (&ftable);
+    gfits_free_header (&header);
+  }
+
+  /*** Secfilt Table ***/
+  if (catalog[0].secfilt != NULL) {
+
+    /* 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 (catfile[0].f, 0, SEEK_SET);
+    ftruncate (fileno (catfile[0].f), 0);
+
+    /* write table PHU header */
+    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
+      fprintf (stderr, "can't write primary header");
+      goto failure;
+    }
+
+    /* this is probably a NOP, do I have to keep it in? */
+    gfits_create_matrix (&catfile[0].header, &matrix);
+    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
+      fprintf (stderr, "can't write primary matrix");
+      goto failure;
+    }
+    gfits_free_matrix (&matrix);
+
+    /* write out SecFilt table (convert to FITS table format) */
+    Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
+    SecFiltToFtable (&ftable, secfilt, Nitems, catalog[0].catformat);
+    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
+      fprintf (stderr, "can't write table header");
+      goto failure;
+    }
+    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
+      fprintf (stderr, "can't write table data");
+      goto failure;
+    }
+    gfits_free_table (&ftable);
+    gfits_free_header (&header);
+  }
+
+  /* free temp storage */
+  if (primary != NULL) {
+    free (primary);
+    free (secfilt);
+  }
+
+  return (TRUE);
+
+failure:
+  /* free temp storage */
+  if (primary != NULL) {
+    free (primary);
+    free (secfilt);
+  }
+  return (FALSE);
+}
+
+/* update_catalog_split only writes new lines to file.  
+ * if file is empty, call save_catalog_split instead.
+ * XXX EAM : save_catalog SHOULD do this
+ */
+
+int dvo_catalog_update_split (Catalog *catalog, char VERBOSE) {
+
+  int i, Nx, Ny, Nlines;
+  int Nitems, Nskip, Nout, Ndisk, Nstart;
+  Matrix matrix;
+  Header header;
+  FTable ftable;
+  VTable vtable;
+  Catalog *catfile;
+  SecFilt *primary, *secfilt;
+  int j, Nsecfilt, Nallfilt, Ntotal;
+
+  ftable.header = &header;
+  vtable.header = &header;
+
+  if (catalog[0].Naverage == 0) {
+    if (VERBOSE) fprintf (stderr, "no stars in catalog, skipping\n");
+    return (TRUE);
+  }
+
+  /** for the appropriate types, pull out the first secfilt and pass to AverageToFtable as primary **/
+  if ((catalog[0].catformat == DVO_FORMAT_ELIXIR) || // special case for ELIXIR
+      (catalog[0].catformat == DVO_FORMAT_LONEOS)) { // special case for LONEOS
+    if (catalog[0].secfilt == NULL) { 
       fprintf (stderr, "missing secfilt, cannot build output averages (dvo_catalog_split.c:544)\n");
       exit (1);
@@ -472,243 +716,4 @@
   /* make sure header is consistent with data */
   gfits_modify (&catalog[0].header, "NSTARS",   "%d", 1, catalog[0].Naverage);
-  gfits_modify (&catalog[0].header, "NMEAS",    "%d", 1, catalog[0].Nmeasure);
-  gfits_modify (&catalog[0].header, "NMISS",    "%d", 1, catalog[0].Nmissing);
-  gfits_modify (&catalog[0].header, "NSECFILT", "%d", 1, Nsecfilt);
-  gfits_modify (&catalog[0].header, "EXTEND",   "%t", 1, TRUE);
-
-  /* rewind file pointers and truncate (file is still open) */
-  fseek (catalog[0].f, 0, SEEK_SET);
-
-  /* write table PHU header - always write this out */
-  /* XXX EAM : check if disk file size has changed */
-  if (!gfits_fwrite_header  (catalog[0].f, &catalog[0].header)) {
-    fprintf (stderr, "can't write primary header");
-    goto failure;
-  }
-
-  /* in split mode, we can save only part of the data */ 
-
-  /*** Average Table ***/
-
-  if (catalog[0].average != NULL) {
-    ftruncate (fileno (catalog[0].f), catalog[0].header.size);
-
-    /* this is probably a NOP, do I have to keep it in? */
-    gfits_create_matrix (&catalog[0].header, &matrix);
-    if (!gfits_fwrite_matrix  (catalog[0].f, &matrix)) {
-      fprintf (stderr, "can't write primary matrix");
-      goto failure;
-    }
-    gfits_free_matrix (&matrix);
-
-    /* write out Average table (convert to FITS table format) */
-    if (!AverageToFtable (&ftable, catalog[0].average, catalog[0].Naverage, catalog[0].catformat, primary)) {
-      fprintf (stderr, "trouble converting format\n");
-      goto failure;
-    }
-    if (!gfits_fwrite_Theader (catalog[0].f, &header)) {
-      fprintf (stderr, "can't write table header");
-      goto failure;
-    }
-    if (!gfits_fwrite_table (catalog[0].f, &ftable)) {
-      fprintf (stderr, "can't write table data");
-      goto failure;
-    }
-    gfits_free_table (&ftable);
-    gfits_free_header (&header);
-  }
-
-  /*** Measure Table ***/
-  if (catalog[0].measure != NULL) {
-
-    /* catalog file data is stored in separate structure */
-    catfile = catalog[0].measure_catalog;
-
-    /* XXX EAM : warn about this condition; add code to handle? */
-    if (catalog[0].Nmeas_off != 0) {
-      fprintf (stderr, "WARNING: LOAD_MEAS_META mixed with save??\n");
-      fprintf (stderr, "WARNING: this should not be allowed to happen!\n");
-    }
-
-    /* rewind file pointers and truncate (file is still open) */
-    fseek (catfile[0].f, 0, SEEK_SET);
-    ftruncate (fileno (catfile[0].f), 0);
-
-    /* write table PHU header */
-    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
-      fprintf (stderr, "can't write primary header");
-      goto failure;
-    }
-
-    /* this is probably a NOP, do I have to keep it in? */
-    gfits_create_matrix (&catfile[0].header, &matrix);
-    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
-      fprintf (stderr, "can't write primary matrix");
-      goto failure;
-    }
-    gfits_free_matrix (&matrix);
-
-    /* write out Measure table (convert to FITS table format) */
-    MeasureToFtable (&ftable, catalog[0].measure, catalog[0].Nmeasure, catalog[0].catformat);
-    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
-      fprintf (stderr, "can't write table header");
-      goto failure;
-    }
-    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
-      fprintf (stderr, "can't write table data");
-      goto failure;
-    }
-    gfits_free_table (&ftable);
-    gfits_free_header (&header);
-  }
-
-  /*** Missing Table ***/
-  if (catalog[0].missing != NULL) {
-
-    /* catalog data is stored in separate catalog */
-    catfile = catalog[0].missing_catalog;
-
-    /* rewind file pointers and truncate (file is still open) */
-    fseek (catfile[0].f, 0, SEEK_SET);
-    ftruncate (fileno (catfile[0].f), 0);
-
-    /* write table PHU header */
-    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
-      fprintf (stderr, "can't write primary header");
-      goto failure;
-    }
-
-    /* this is probably a NOP, do I have to keep it in? */
-    gfits_create_matrix (&catfile[0].header, &matrix);
-    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
-      fprintf (stderr, "can't write primary matrix");
-      goto failure;
-    }
-    gfits_free_matrix (&matrix);
-
-    /* write out Missing table (convert to FITS table format) */
-    gfits_table_set_Missing (&ftable, catalog[0].missing, catalog[0].Nmissing);
-    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
-      fprintf (stderr, "can't write table header");
-      goto failure;
-    }
-    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
-      fprintf (stderr, "can't write table data");
-      goto failure;
-    }
-    gfits_free_table (&ftable);
-    gfits_free_header (&header);
-  }
-
-  /*** Secfilt Table ***/
-  if (catalog[0].secfilt != NULL) {
-
-    /* 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 (catfile[0].f, 0, SEEK_SET);
-    ftruncate (fileno (catfile[0].f), 0);
-
-    /* write table PHU header */
-    if (!gfits_fwrite_header  (catfile[0].f, &catfile[0].header)) {
-      fprintf (stderr, "can't write primary header");
-      goto failure;
-    }
-
-    /* this is probably a NOP, do I have to keep it in? */
-    gfits_create_matrix (&catfile[0].header, &matrix);
-    if (!gfits_fwrite_matrix  (catfile[0].f, &matrix)) {
-      fprintf (stderr, "can't write primary matrix");
-      goto failure;
-    }
-    gfits_free_matrix (&matrix);
-
-    /* write out SecFilt table (convert to FITS table format) */
-    Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
-    SecFiltToFtable (&ftable, secfilt, Nitems, catalog[0].catformat);
-    if (!gfits_fwrite_Theader (catfile[0].f, &header)) {
-      fprintf (stderr, "can't write table header");
-      goto failure;
-    }
-    if (!gfits_fwrite_table (catfile[0].f, &ftable)) {
-      fprintf (stderr, "can't write table data");
-      goto failure;
-    }
-    gfits_free_table (&ftable);
-    gfits_free_header (&header);
-  }
-
-  /* free temp storage */
-  if (primary != NULL) {
-    free (primary);
-    free (secfilt);
-  }
-
-  return (TRUE);
-
-failure:
-  /* free temp storage */
-  if (primary != NULL) {
-    free (primary);
-    free (secfilt);
-  }
-  return (FALSE);
-}
-
-/* update_catalog_split only writes new lines to file.  
- * if file is empty, call save_catalog_split instead.
- * XXX EAM : save_catalog SHOULD do this
- */
-
-int dvo_catalog_update_split (Catalog *catalog, char VERBOSE) {
-
-  int i, Nx, Ny, Nlines;
-  int Nitems, Nskip, Nout, Ndisk, Nstart;
-  Matrix matrix;
-  Header header;
-  FTable ftable;
-  VTable vtable;
-  Catalog *catfile;
-  SecFilt *primary, *secfilt;
-  int j, Nsecfilt, Nallfilt, Ntotal;
-
-  ftable.header = &header;
-  vtable.header = &header;
-
-  if (catalog[0].Naverage == 0) {
-    if (VERBOSE) fprintf (stderr, "no stars in catalog, skipping\n");
-    return (TRUE);
-  }
-
-  /** for the appropriate types, pull out the first secfilt and pass to AverageToFtable as primary **/
-  if ((catalog[0].catformat == DVO_FORMAT_ELIXIR) || // special case for ELIXIR
-      (catalog[0].catformat == DVO_FORMAT_LONEOS)) { // special case for 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;
-  }
-
-  /* make sure header is consistent with data */
-  gfits_modify (&catalog[0].header, "NSTARS",   "%d", 1, catalog[0].Naverage);
   gfits_modify (&catalog[0].header, "NMEAS",    "%d", 1, catalog[0].Nmeasure + catalog[0].Nmeas_off);
   gfits_modify (&catalog[0].header, "NMISS",    "%d", 1, catalog[0].Nmissing);
