Index: trunk/Ohana/src/addstar/src/addstar.c
===================================================================
--- trunk/Ohana/src/addstar/src/addstar.c	(revision 8385)
+++ trunk/Ohana/src/addstar/src/addstar.c	(revision 8386)
@@ -104,4 +104,5 @@
       exit (2);
     }
+    dvo_catalog_test (&catalog, TRUE);
 
     // Nave_disk == 0 implies an empty catalog file
@@ -142,4 +143,5 @@
 	break;
     }
+    dvo_catalog_test (&catalog, TRUE);
 
     // write out catalog, if appropriate
@@ -149,4 +151,5 @@
       SetProtect (FALSE);
     }
+    dvo_catalog_test (&catalog, TRUE);
     dvo_catalog_unlock (&catalog);
     dvo_catalog_free (&catalog);
Index: trunk/Ohana/src/delstar/Makefile
===================================================================
--- trunk/Ohana/src/delstar/Makefile	(revision 8385)
+++ trunk/Ohana/src/delstar/Makefile	(revision 8386)
@@ -28,6 +28,4 @@
 $(SRC)/delete_times.$(ARCH).o 	  \
 $(SRC)/gimages.$(ARCH).o   	  \
-$(SRC)/gcatalog.$(ARCH).o   	  \
-$(SRC)/wcatalog.$(ARCH).o   	  \
 $(SRC)/find_image_db.$(ARCH).o    \
 $(SRC)/find_matches.$(ARCH).o 	  \
Index: trunk/Ohana/src/delstar/src/RegionOps.c
===================================================================
--- trunk/Ohana/src/delstar/src/RegionOps.c	(revision 8385)
+++ 	(revision )
@@ -1,213 +1,0 @@
-# include "delstar.h"
-
-# define NBANDS 24
-
-static double DecBands[] = {
-  -90.0, -82.5, -75.0, -67.5, -60.0, 
-  -52.5, -45.0, -37.5, -30.0, -22.5, 
-  -15.0, -07.5, +00.0, +07.5, +15.0, 
-  +22.5, +30.0, +37.5, +45.0, +52.5, 
-  +60.0, +67.5, +75.0, +82.5, +90.0
-};
-
-static char *DecNames[] = {
-  "s8230", "s7500", "s6730", "s6000", "s5230",
-  "s4500", "s3730", "s3000", "s2230", "s1500", 
-  "s0730", "s0000", "n0000", "n0730", "n1500", 
-  "n2230", "n3000", "n3730", "n4500", "n5230", 
-  "n6000", "n6730", "n7500", "n8230", 
-};
-
-GSCRegion *LoadRegions (int *nregions) {
-  
-  int Nregions, i, NDec, Nx, Ny;
-  char temp[50], file[256];
-  double RA0, RA1, DEC0, DEC1, D0, D1;
-  FILE *f;
-  GSCRegion *regions;
-  Header header;
-  Header theader;
-  Matrix matrix;
-  FTable table;
-  
-  f = fopen (GSCFILE, "r");
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: can't find GSC region file %s\n", GSCFILE);
-    exit (1);
-  }
-
-  /* init & load in table data */
-  table.header = &theader;
-  if (!gfits_fread_header (f, &header))           Shutdown ("can't read primary header for GSC Region table"); 
-  if (!gfits_fread_matrix (f, &matrix, &header))  Shutdown ("can't read primary matrix for GSC Region table");
-  if (!gfits_fread_ftable (f, &table, "REGIONS")) Shutdown ("can't read GSC Region table");
-
-  gfits_scan (table.header, "NAXIS1", "%d", 1, &Nx);
-  gfits_scan (table.header, "NAXIS2", "%d", 1, &Ny);
-
-  Nregions = 0;
-  ALLOCATE (regions, GSCRegion, Ny + 2);  /* allow room for N & S poles */
-
-  /* pole region is artificial - not in table */
-  sprintf (file, "%s/n8230/pole.cpt", CATDIR);
-  regions[Nregions].DEC[0] = 86.25;
-  regions[Nregions].DEC[1] = 93.75;
-  regions[Nregions].RA[0] =  0.0;
-  regions[Nregions].RA[1] =  360.0;
-  strcpy (regions[Nregions].filename, file);
-  Nregions ++;
-
-  /* fill out GSCRegion structure */
-  for (i = 0; i < Ny; i++) {
-    strncpy (temp, &table.buffer[i*48], 48);
-    temp[49] = 0;
-    hstgsc_hms_to_deg (&RA0, &RA1, &DEC0, &DEC1, &temp[7]);
-    if (RA1 < RA0) RA1 += 360.0;
-
-    if (DEC0 < DEC1) {
-      regions[Nregions].DEC[0] = DEC0;
-      regions[Nregions].DEC[1] = DEC1;
-    } else {
-      regions[Nregions].DEC[0] = DEC1;
-      regions[Nregions].DEC[1] = DEC0;
-    }     
-    /* skip the pole entries */
-    if (regions[Nregions].DEC[1] > 86.25) continue;
-
-    regions[Nregions].RA[0] = RA0;
-    regions[Nregions].RA[1] = RA1;
-
-    /** convert DEC0, DEC1 to NBigDec **/
-    NDec = FindDecBand (0.5*(DEC0 + DEC1), &D0, &D1);
-    if (NDec == -1) Shutdown ("programming / table error");
-
-    temp[5] = 0;
-    sprintf (file, "%s/%s/%s.cpt", CATDIR, DecNames[NDec], &temp[1]);
-
-    strcpy (regions[Nregions].filename, file);
-    Nregions ++;
-  }
-  if (Nregions > Ny + 2) {
-    fprintf (stderr, "ERROR: too many regions\n");
-    exit (2);
-  }
-
-  sort_regions (regions, Nregions);
-  *nregions = Nregions;
-  return (regions);
-}
-
-/* given dec value, find upper and lower bounds of enclosing dec band */
-int FindDecBand (double dec, double *DEC0, double *DEC1) {
-
-  int i;
-
-  for (i = 0; i < NBANDS; i++) {
-    if (DecBands[i + 0] >  dec) continue;
-    if (DecBands[i + 1] <= dec) continue;
-    *DEC0 = DecBands[i+0];
-    *DEC1 = DecBands[i+1];
-    return (i);
-  }
-  return (-1);
-}
-
-/* note that region.DEC[0] is sorted, but not necessarily DEC[1] */
-int FindRegionDecBandStart (GSCRegion *region, int Nregion, double dec) {
-
-  int N, Nlo, Nhi;
-  double D0, D1;
-
-  if (dec <= 90) return (0);
-
-  /* D0, D1 are upper lower band boundaries */
-  /* all regions in this band have DEC[0] >= D0 */
-  N = FindDecBand (dec, &D0, &D1);
-  if (N == -1) Shutdown ("programming / table error");
-
-  /* bracket value of interest */
-  Nlo = 0; Nhi = Nregion - 1;
-  while (Nhi - Nlo > 10) {
-    N = 0.5*(Nlo + Nhi);
-    if (region[N].DEC[0] < D0) {
-      Nlo = N;
-    } else {
-      Nhi = N;
-    }
-  }
-  /* Nlo - Nhi bracket the transition across dec */
-  /* v[Nlo] < v <= v[Nhi] */ 
-
-  /* find the last entry < dec */
-  for (N = Nhi; N >= Nlo; N--) {
-    if (region[N].DEC[0] < D0) return (N);
-  }
-  return (-1);
-  /* this will fail if transition value is not in the data range */
-}
-
-/* note that region.DEC[0] is sorted, but not necessarily DEC[1] */
-int FindRegionDecBandStop (GSCRegion *region, int Nregion, double dec) {
-
-  int N, Nlo, Nhi;
-  double D0, D1;
-
-  if (dec >= 90) return (Nregion - 1);
-
-  /* D0, D1 are upper lower band boundaries */
-  /* all regions in this band have DEC[0] < D1 */
-  N = FindDecBand (dec, &D0, &D1);
-  if (N == -1) Shutdown ("programming / table error");
-
-  /* bracket value of interest */
-  Nlo = 0; Nhi = Nregion - 1;
-  while (Nhi - Nlo > 10) {
-    N = 0.5*(Nlo + Nhi);
-    if (region[N].DEC[0] > D1) {
-      Nhi = N;
-    } else {
-      Nlo = N;
-    }
-  }
-  /* Nlo - Nhi bracket the transition across dec */
-  /* v[Nlo] <= v < v[Nhi] */ 
-
-  /* find the last entry < dec */
-  for (N = Nlo; N <= Nhi; N++) {
-    if (region[N].DEC[0] > D1) return (N);
-  }
-  fprintf (stderr, "fail dec band stop: %f: %f  %f, %d - %d, %f %f\n", 
-	   dec, D0, D1, Nlo, Nhi, region[Nlo].DEC[0], region[Nlo].DEC[1]);
-  return (-1);
-  /* this will fail if transition value is not in the data range */
-}
-
-int FindRegionByPoint (GSCRegion *region, double ra, double dec, GSCRegion *gsc, int Ngsc) {
-
-  int i, Ns;
-
-  Ns = FindRegionDecBandStart (gsc, Ngsc, dec);
-  if (Ns < 0) return (FALSE);
-
-  for (i = Ns; i < Ngsc; i++) {
-    if (gsc[i].RA[0]  >= ra) continue;
-    if (gsc[i].RA[1]  <  ra) continue;
-    if (gsc[i].DEC[0] >= dec) continue;
-    if (gsc[i].DEC[1] <  dec) continue;
-    region[0] = gsc[i];
-    return (TRUE);
-  }
-  return (FALSE);
-}
-
-/* bracket search:
-
-   Nlo            T      N                   Nhi
-   X X X X X X X V X X X X X X X X X X X X X X
-                         Nhi
-
-   Nlo                   N      T            Nhi
-   X X X X X X X X X X X X X X X V X X X X X X
-                         Nlo 
-
-*/
Index: trunk/Ohana/src/delstar/src/delete_imagefile.c
===================================================================
--- trunk/Ohana/src/delstar/src/delete_imagefile.c	(revision 8385)
+++ trunk/Ohana/src/delstar/src/delete_imagefile.c	(revision 8386)
@@ -23,21 +23,21 @@
 
   for (i = 0; i < skylist[0].Nregions; i++) {
+
     if (VERBOSE) fprintf (stderr, "deleting from %s\n", skylist[0].filename[i]);
     catalog.filename = skylist[0].filename[i];  /* don't free region before catalog! */
-    switch (lock_catalog (&catalog, LCK_XCLD)) {
-      case 0:
-	fprintf (stderr, "ERROR: can't lock file %s\n", catalog.filename);
-	exit (1);
-      case 1:
-	gcatalog (&catalog);
-	break;
-      case 2:
-	if (VERBOSE) fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
-	unlock_catalog (&catalog);
-	continue;
-      default:
-	fprintf (stderr, "weird lock_catalog exit state\n");
-	exit (1);
+    catalog.Nsecfilt  = GetPhotcodeNsecfilt ();
+    catalog.catflags = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
+
+    // an error exit status here is a significant error
+    if (!dvo_catalog_open (&catalog, skylist[0].regions[i], VERBOSE, "u")) {
+      fprintf (stderr, "ERROR: failure to open catalog file %s\n", catalog.filename);
+      exit (2);
     }
+    if (!catalog.Nave_disk) {
+      dvo_catalog_unlock (&catalog);
+      dvo_catalog_free (&catalog);
+      continue;
+    }
+
     /* pad exposure time by 1 sec to require a valid time */
     /* trate is in 0.1 msec / row  - stop is the latest exposure end time */
@@ -46,6 +46,8 @@
     stop  = image[0].tzero + trange;
     find_matches (&catalog, image[0].source, start, stop);
-    wcatalog (&catalog);
-    unlock_catalog (&catalog);
+
+    dvo_catalog_save (&catalog, VERBOSE);
+    dvo_catalog_unlock (&catalog);
+    dvo_catalog_free (&catalog);
   }
 
Index: trunk/Ohana/src/delstar/src/delete_imagename.c
===================================================================
--- trunk/Ohana/src/delstar/src/delete_imagename.c	(revision 8385)
+++ trunk/Ohana/src/delstar/src/delete_imagename.c	(revision 8386)
@@ -35,18 +35,16 @@
       if (VERBOSE) fprintf (stderr, "deleting from %s\n", skylist[0].filename[i]);
       catalog.filename = skylist[0].filename[i];  /* don't free region before catalog! */
-      switch (lock_catalog (&catalog, LCK_XCLD)) {
-	case 0:
-	  fprintf (stderr, "ERROR: can't lock file %s\n", catalog.filename);
-	  exit (1);
-	case 1:
-	  gcatalog (&catalog);
-	  break;
-	case 2:
-	  if (VERBOSE) fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
-	  unlock_catalog (&catalog);
-	  continue;
-	default:
-	  fprintf (stderr, "weird lock_catalog exit state\n");
-	  exit (1);
+      catalog.Nsecfilt  = GetPhotcodeNsecfilt ();
+      catalog.catflags = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
+
+      // an error exit status here is a significant error
+      if (!dvo_catalog_open (&catalog, skylist[0].regions[i], VERBOSE, "u")) {
+	fprintf (stderr, "ERROR: failure to open catalog file %s\n", catalog.filename);
+	exit (2);
+      }
+      if (!catalog.Nave_disk) {
+	dvo_catalog_unlock (&catalog);
+	dvo_catalog_free (&catalog);
+	continue;
       }
 
@@ -57,6 +55,8 @@
       stop  = image[j].tzero + trange;
       find_matches (&catalog, image[j].source, start, stop);
-      wcatalog (&catalog);
-      unlock_catalog (&catalog);
+
+      dvo_catalog_save (&catalog, VERBOSE);
+      dvo_catalog_unlock (&catalog);
+      dvo_catalog_free (&catalog);
     }
   }
Index: trunk/Ohana/src/delstar/src/delete_orphans.c
===================================================================
--- trunk/Ohana/src/delstar/src/delete_orphans.c	(revision 8385)
+++ trunk/Ohana/src/delstar/src/delete_orphans.c	(revision 8386)
@@ -15,5 +15,5 @@
   /* find and load catalog file */
   catalog.filename = name;
-  gcatalog (&catalog);
+  dvo_catalog_load (&catalog);
   gcatstats (&catalog, &catstats);
 
Index: trunk/Ohana/src/delstar/src/delete_times.c
===================================================================
--- trunk/Ohana/src/delstar/src/delete_times.c	(revision 8385)
+++ trunk/Ohana/src/delstar/src/delete_times.c	(revision 8386)
@@ -55,23 +55,22 @@
     if (VERBOSE) fprintf (stderr, "deleting from %s\n", skylist[0].filename[i]);
     catalog.filename = skylist[0].filename[i];  /* don't free region before catalog! */
-    switch (lock_catalog (&catalog, LCK_XCLD)) {
-      case 0:
-	fprintf (stderr, "ERROR: can't lock file\n");
-	exit (1);
-      case 1:
-	gcatalog (&catalog);
-	break;
-      case 2:
-	fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
-	unlock_catalog (&catalog);
-	continue;
-      default:
-	fprintf (stderr, "weird lock_catalog exit state\n");
-	exit (1);
+    catalog.Nsecfilt  = GetPhotcodeNsecfilt ();
+    catalog.catflags = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
+
+    // an error exit status here is a significant error
+    if (!dvo_catalog_open (&catalog, skylist[0].regions[i], VERBOSE, "u")) {
+      fprintf (stderr, "ERROR: failure to open catalog file %s\n", catalog.filename);
+      exit (2);
+    }
+    if (!catalog.Nave_disk) {
+      dvo_catalog_unlock (&catalog);
+      dvo_catalog_free (&catalog);
+      continue;
     }
 
     find_matches (&catalog, code, START, END);
-    wcatalog (&catalog);
-    unlock_catalog (&catalog);
+    dvo_catalog_save (&catalog, VERBOSE);
+    dvo_catalog_unlock (&catalog);
+    dvo_catalog_free (&catalog);
   }
 
Index: trunk/Ohana/src/delstar/src/gcatalog.c
===================================================================
--- trunk/Ohana/src/delstar/src/gcatalog.c	(revision 8385)
+++ 	(revision )
@@ -1,48 +1,0 @@
-# include "delstar.h"
-
-int gcatalog (Catalog *catalog) {
-  
-  int Nsecfilt;
-
-  /* CATMODE and CATFORMAT determined from catalog */
-
-  /* read catalog header */
-  catalog[0].catflags = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
-  if (!load_catalog (catalog, VERBOSE)) {
-    fprintf (stderr, "ERROR: failure loading catalog\n");
-    exit (1);
-  }
-
-  /* check Nsecfile value, update if needed */
-  Nsecfilt = GetPhotcodeNsecfilt ();
-  if (catalog[0].Nsecfilt < Nsecfilt) {
-
-    int i, j, Nextra, in, out;
-    SecFilt *insec, *outsec;
-
-    Nextra = Nsecfilt - catalog[0].Nsecfilt;
-    insec = catalog[0].secfilt;
-    ALLOCATE (outsec, SecFilt, catalog[0].Naverage * Nsecfilt);
-    for (in = out = i = 0; i < catalog[0].Naverage; i++) {
-      for (j = 0; j < catalog[0].Nsecfilt; j++, in++, out++) {
-	outsec[out].M_PS  = insec[in].M_PS;
-	outsec[out].dM_PS = insec[in].dM_PS;
-	outsec[out].Xm    = insec[in].Xm;
-      }
-      for (j = 0; j < Nextra; j++, out++) {
-	outsec[out].M_PS  = NO_MAG;
-	outsec[out].dM_PS = NO_ERR;
-	outsec[out].Xm    = NO_MAG;
-      }
-    }
-    free (catalog[0].secfilt);
-    catalog[0].secfilt = outsec;
-    catalog[0].Nsecfilt = Nsecfilt;
-  }
-
-  if (catalog[0].Nsecfilt > Nsecfilt) {
-    fprintf (stderr, "ERROR: can't reduce number of secondary filters\n");
-    exit (1);
-  }
-  return (TRUE);
-}
Index: trunk/Ohana/src/delstar/src/gregion_image.c
===================================================================
--- trunk/Ohana/src/delstar/src/gregion_image.c	(revision 8385)
+++ 	(revision )
@@ -1,33 +1,0 @@
-# include "delstar.h"
-
-/* given image with coords, find regions which overlap image */
-GSCRegion *gregion_image (Image *image, int *Nregions) {
-  
-  GSCRegion *regions, impatch;
-  double x, y, X, Y, ra, dec;
-  
-  /* this has trouble for images which overlap 0,360 */
-  impatch.RA[0]  = 360;
-  impatch.RA[1]  =   0;
-  impatch.DEC[0] = +90;
-  impatch.DEC[1] = -90;
-
-  if (!strcmp (&image[0].coords.ctype[4], "-WRP")) {
-    Shutdown ("method for deleting mosaic data not defined");
-    // RegisterMosaic (MOSAIC);
-  }    
-
-  for (x = 0; x <= 1; x++) {
-    for (y = 0; y <= 1; y++) {
-      X = image[0].NX*(1.1*x - 0.05);
-      Y = image[0].NY*(1.1*y - 0.05);
-      XY_to_RD (&ra, &dec, X, Y, &image[0].coords);
-      impatch.RA[0]  = MIN (ra,  impatch.RA[0]);
-      impatch.RA[1]  = MAX (ra,  impatch.RA[1]);
-      impatch.DEC[0] = MIN (dec, impatch.DEC[0]);
-      impatch.DEC[1] = MAX (dec, impatch.DEC[1]);
-    }
-  }
-  regions = gregion_patch (&impatch, Nregions);
-  return (regions);
-}
Index: trunk/Ohana/src/delstar/src/gregion_patch.c
===================================================================
--- trunk/Ohana/src/delstar/src/gregion_patch.c	(revision 8385)
+++ 	(revision )
@@ -1,43 +1,0 @@
-# include "delstar.h"
-
-GSCRegion *gregion_patch (GSCRegion *patch, int *nregions) {
-  
-  int i, Ns, Ne, Ngsc, Nregions;
-  GSCRegion *gsc, *regions;
-  
-  gsc = LoadRegions (&Ngsc);
-
-  /* find lower and upper boundaries */
-  Ns = FindRegionDecBandStart (gsc, Ngsc, patch[0].DEC[0]);
-  Ne = FindRegionDecBandStop (gsc, Ngsc, patch[0].DEC[1]);
-  if (Ns < 0) Shutdown ("invalid patch lower bound %f", patch[0].DEC[0]);
-  if (Ne < 0) Shutdown ("invalid patch upper bound %f", patch[0].DEC[1]);
-  
-  Nregions = 0;
-  ALLOCATE (regions, GSCRegion, Ne - Ns);
-
-  /* find all regions in range within ra range */
-  for (i = Ns; i < Ne; i++) {
-    if (gsc[i].RA[0]  >= patch[0].RA[1]) continue;
-    if (gsc[i].RA[1]  <  patch[0].RA[0]) continue;
-    if (gsc[i].DEC[0] >= patch[0].DEC[1]) continue;
-    if (gsc[i].DEC[1] <  patch[0].DEC[0]) continue;
-    /* add to the list */
-    regions[Nregions] = gsc[i];
-    Nregions ++;
-  }
-
-  if (VERBOSE) fprintf (stderr, "Nregions in patch: %d, Ne: %d, Ns: %d\n", Nregions, Ne, Ns);
-  if (Nregions > (Ne - Ns)) {
-    fprintf (stderr, "ERROR: too many regions found\n");
-    exit (1);
-  }
-
-  *nregions = Nregions;
-  return (regions);
-}
-
-/* given a ra,dec bounded region, find all region files which overlap it
-   - split region into two if overlapping 0,360 boundary 
-*/
-
Index: trunk/Ohana/src/delstar/src/image-db.c
===================================================================
--- trunk/Ohana/src/delstar/src/image-db.c	(revision 8385)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# include "delstar.h"
-
-int load_image_db (FITS_DB *db) {
-
-  if (db[0].dbstate == LCK_EMPTY) Shutdown ("ERROR: No images in catalog %s (1)", db[0].filename);
-
-  /* read entire db table */
-  if (!dvo_image_load (db, VERBOSE, FALSE)) Shutdown ("can't read image catalog %s", db[0].filename);
-}
Index: trunk/Ohana/src/delstar/src/missed.c
===================================================================
--- trunk/Ohana/src/delstar/src/missed.c	(revision 8385)
+++ 	(revision )
@@ -1,24 +1,0 @@
-delete_missed () {
-    catalog.filename = argv[1];
-    switch (lock_catalog (&catalog, LCK_XCLD)) {
-    case 0:
-      fprintf (stderr, "ERROR: can't lock file\n");
-      exit (1);
-    case 1:
-      gcatalog (&catalog);
-      break;
-    case 2:
-      fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
-      catalog.Naverage = 0;
-      catalog.Nmeasure = 0;
-      break;
-    default:
-      fprintf (stderr, "weird lock_catalog exit state\n");
-      exit (1);
-    }
-    delete_missed (&catalog);
-    wcatalog (&catalog);
-    fclearlockfile (ImageCat, f, LCK_HARD, &dbstate);
-    fprintf (stderr, "SUCCESS\n");
-    exit (0);
-}
Index: trunk/Ohana/src/delstar/src/orphans.c
===================================================================
--- trunk/Ohana/src/delstar/src/orphans.c	(revision 8385)
+++ 	(revision )
@@ -1,15 +1,0 @@
-// this file is a stub : fix up / clean up
-
-delete_orphans () {
-    ALLOCATE (region, SkyRegion, 1);
-    catalog.filename = argv[1];
-    gcatalog (&catalog);
-    gcatstats (&catalog, &catstats);
-    image = find_images_region (&catstats, &Nimage);
-    match_images (&catalog, image, Nimage);
-    delete_orphans (&catalog);
-    wcatalog (&catalog);
-    fclearlockfile (ImageCat, f, LCK_HARD, &dbstate);
-    fprintf (stderr, "SUCCESS\n");
-    exit (0);
-}
Index: trunk/Ohana/src/delstar/src/wcatalog.c
===================================================================
--- trunk/Ohana/src/delstar/src/wcatalog.c	(revision 8385)
+++ 	(revision )
@@ -1,35 +1,0 @@
-# include "delstar.h"
-
-int wcatalog (Catalog *catalog) {
-  
-  /* output CATMODE and CATFORMAT are set by mkcatalog 
-     or by mode and format of existing data */
-
-  if (!save_catalog (catalog, VERBOSE)) {
-    fprintf (stderr, "ERROR: failure saving catalog\n");
-    exit (1);
-  }
-
-  /* free, initialize data structures */
-
-  if (catalog[0].Naverage) {
-    free (catalog[0].average); 
-    catalog[0].Naverage = 0;
-  }
-  if (catalog[0].Nmeasure) {
-    free (catalog[0].measure); 
-    catalog[0].Nmeasure = 0;
-  }
-  if (catalog[0].Nmissing) {
-    free (catalog[0].missing); 
-    catalog[0].Nmissing = 0;
-  }
-  if (catalog[0].Nsecfilt) {
-    free (catalog[0].secfilt); 
-    catalog[0].Nsecfilt = 0;
-  }
-  gfits_free_header (&catalog[0].header);
-  
-  return (TRUE);
-}
-
Index: trunk/Ohana/src/libdvo/include/dvo.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvo.h	(revision 8385)
+++ trunk/Ohana/src/libdvo/include/dvo.h	(revision 8386)
@@ -280,4 +280,5 @@
 int dvo_catalog_catformat (char *catformat);
 int dvo_catalog_catmode (char *catmode);
+void dvo_catalog_test (Catalog *catalog, int halt);
 
 /* catmode-specific APIs */
Index: trunk/Ohana/src/libdvo/src/dvo_catalog.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_catalog.c	(revision 8385)
+++ trunk/Ohana/src/libdvo/src/dvo_catalog.c	(revision 8386)
@@ -1,4 +1,44 @@
 # include <dvo.h>
 # define DEBUG 1
+
+void dvo_catalog_test (Catalog *catalog, int halt) {
+
+  Catalog *subcat;
+
+  // fprintf (stderr, "catalog: Naverage = %d, average = %zx\n", catalog[0].Naverage, (size_t) catalog[0].average);
+  // fprintf (stderr, "catalog: Nmeasure = %d, measure = %zx\n", catalog[0].Nmeasure, (size_t) catalog[0].measure);
+  // fprintf (stderr, "catalog: Nmissing = %d, missing = %zx\n", catalog[0].Nmissing, (size_t) catalog[0].missing);
+  // fprintf (stderr, "catalog: Nsecfilt = %d, secfilt = %zx\n", catalog[0].Nsecfilt, (size_t) catalog[0].secfilt);
+
+  if (!catalog[0].measure || !catalog[0].secfilt) {
+    fprintf (stderr, "error: %s\n", catalog[0].filename);
+    if (halt) abort ();
+  }
+
+  // XXX test that things are correctly initialized
+  if (catalog[0].catmode != DVO_MODE_SPLIT) return;
+
+  subcat = catalog[0].measure_catalog;
+  if (subcat) {
+    if (subcat[0].measure_catalog || subcat[0].secfilt_catalog || subcat[0].missing_catalog) {
+      fprintf (stderr, "error in init\n");
+      abort ();
+    }
+  }
+  subcat = catalog[0].missing_catalog;
+  if (subcat) {
+    if (subcat[0].measure_catalog || subcat[0].secfilt_catalog || subcat[0].missing_catalog) {
+      fprintf (stderr, "error in init\n");
+      abort ();
+    }
+  }
+  subcat = catalog[0].secfilt_catalog;
+  if (subcat) {
+    if (subcat[0].measure_catalog || subcat[0].secfilt_catalog || subcat[0].missing_catalog) {
+      fprintf (stderr, "error in init\n");
+      abort ();
+    }
+  }
+}
 
 int dvo_catalog_catformat (char *catformat) {
@@ -35,7 +75,7 @@
     catalog[0].catflags = 0;
     catalog[0].sorted = 0;
-
-    gfits_init_header (&catalog[0].header);
-  }
+  }
+
+  gfits_init_header (&catalog[0].header);
 
   // the following describe the catalog files on disk
@@ -102,5 +142,5 @@
   // attempt to unlink an empty file
   fd = fileno (catalog[0].f);
-  if (fstat (fd, &filestat)) {
+  if (!fstat (fd, &filestat)) {
     if (filestat.st_size == 0) {
       unlink (catalog[0].filename);
@@ -121,16 +161,17 @@
 // returns FALSE if a catalog could not be opened
 // returns TRUE if the catalog was empty
+enum {DVO_OPEN_NONE, DVO_OPEN_READ, DVO_OPEN_WRITE, DVO_OPEN_UPDATE);
 int dvo_catalog_open (Catalog *catalog, SkyRegion *region, int VERBOSE, char *iomode) {
 
-  int Nsecfilt;
-  int readonly;
-
-  readonly = -1;
-  if (!strcasecmp (iomode, "r")) readonly = TRUE;
-  if (!strcasecmp (iomode, "w")) readonly = FALSE;
-  if (readonly == -1) return (FALSE);
+  int Nsecfilt, mode;
+
+  mode = DVO_OPEN_NONE;
+  if (!strcasecmp (iomode, "r")) mode = DVO_OPEN_READ;
+  if (!strcasecmp (iomode, "w")) mode = DVO_OPEN_WRITE;
+  if (!strcasecmp (iomode, "a")) mode = DVO_OPEN_UPDATE;
+  if (mode == DVO_OPEN_NONE) return (FALSE);
 
   catalog[0].lockmode  = LCK_XCLD;
-  if (readonly) catalog[0].lockmode  = LCK_SOFT;
+  if (mode == DVO_OPEN_READ) catalog[0].lockmode  = LCK_SOFT;
 
   // XXX make a backup?  always?
@@ -161,5 +202,5 @@
     break;
   case 2:
-    if (readonly) return (TRUE);
+    if (DVO_OPEN_READ || DVO_OPEN_UPDATE) return (TRUE);
     dvo_catalog_create (region, catalog, Nsecfilt); /* fills in new header info */
     if (VERBOSE) fprintf (stderr, "creating new file %s\n", catalog[0].filename);
@@ -177,4 +218,6 @@
   char measure[80];
 
+  dvo_catalog_init (catalog, FALSE);
+
   // load the main catalog header, determine characteristics
   if (!gfits_fread_header (catalog[0].f, &catalog[0].header)) {
@@ -200,9 +243,4 @@
   catalog[0].catformat = DVO_FORMAT_UNDEF;
 
-  catalog[0].average = NULL;
-  catalog[0].secfilt = NULL;
-  catalog[0].measure = NULL;
-  catalog[0].missing = NULL;
-
   switch (catalog[0].catmode) {
     case DVO_MODE_RAW:
@@ -217,4 +255,5 @@
       if (VERBOSE) fprintf (stderr, "reading catalog (mode DVO_MODE_SPLIT)\n");
       dvo_catalog_load_split (catalog, VERBOSE);
+      dvo_catalog_test (catalog, TRUE);
       break;
     default:
Index: trunk/Ohana/src/libdvo/src/dvo_catalog_create.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_catalog_create.c	(revision 8385)
+++ trunk/Ohana/src/libdvo/src/dvo_catalog_create.c	(revision 8386)
@@ -1,4 +1,4 @@
 # include <dvo.h>
-# define DEBUG 1
+# define DEBUG 0
 
 // create a new dvo catalog file (if split, lock extra files as well?)
Index: trunk/Ohana/src/libdvo/src/dvo_catalog_split.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 8385)
+++ trunk/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 8386)
@@ -60,4 +60,5 @@
     gfits_free_header (&header);
   } 
+  dvo_catalog_test (catalog, FALSE);
 
   /*** Measure Table ***/
@@ -68,7 +69,5 @@
   if (catalog[0].catflags & LOAD_MEAS) {
     ALLOCATE (measure, Catalog, 1);
-    measure[0].measure_catalog = NULL;
-    measure[0].missing_catalog = NULL;
-    measure[0].secfilt_catalog = NULL;
+    dvo_catalog_init (measure, TRUE);
 
     /* get split filename from main header (paths relative to cpt file) */
@@ -90,15 +89,15 @@
     /* matrix should be empty */
     if (!gfits_fread_matrix (measure[0].f, &matrix, &measure[0].header)) {
-      if (VERBOSE) fprintf (stderr, "can't read primary matrix");
+      if (VERBOSE) fprintf (stderr, "can't read primary matrix\n");
       return (FALSE);
     }
     /* read Measure table header */
     if (!gfits_fread_header (measure[0].f, &header)) {
-      if (VERBOSE) fprintf (stderr, "can't read measure PHU header");
+      if (VERBOSE) fprintf (stderr, "can't read measure PHU header\n");
       return (FALSE);
     }
     /* read Measure table data */
     if (!gfits_fread_ftable_data (measure[0].f, &ftable)) {
-      if (VERBOSE) fprintf (stderr, "can't read table measure data");
+      if (VERBOSE) fprintf (stderr, "can't read table measure data\n");
       return (FALSE);
     }
@@ -112,8 +111,10 @@
     gfits_free_matrix (&matrix);
   }
+  dvo_catalog_test (catalog, FALSE);
 
   /* (Meta Load) */
   if (catalog[0].catflags & LOAD_MEAS_META) {
     ALLOCATE (measure, Catalog, 1);
+    dvo_catalog_init (measure, TRUE);
 
     /* get split filename from main header (paths relative to cpt file) */
@@ -142,4 +143,5 @@
   }
   catalog[0].measure_catalog = measure;
+  dvo_catalog_test (catalog, FALSE);
 
   /*** Missing Table ***/
@@ -148,7 +150,5 @@
   if (catalog[0].catflags & LOAD_MISS) {
     ALLOCATE (missing, Catalog, 1);
-    missing[0].measure_catalog = NULL;
-    missing[0].missing_catalog = NULL;
-    missing[0].secfilt_catalog = NULL;
+    dvo_catalog_init (missing, TRUE);
 
     /* get split filename from main header (paths relative to cpt file) */
@@ -170,15 +170,15 @@
     /* matrix should be empty */
     if (!gfits_fread_matrix (missing[0].f, &matrix, &missing[0].header)) {
-      if (VERBOSE) fprintf (stderr, "can't read primary matrix");
+      if (VERBOSE) fprintf (stderr, "can't read primary matrix\n");
       return (FALSE);
     }
     /* read Missing table header */
     if (!gfits_fread_header (missing[0].f, &header)) {
-      if (VERBOSE) fprintf (stderr, "can't read table missing header");
+      if (VERBOSE) fprintf (stderr, "can't read table missing header\n");
       return (FALSE);
     }
     /* read Missing table data */
     if (!gfits_fread_ftable_data (missing[0].f, &ftable)) {
-      if (VERBOSE) fprintf (stderr, "can't read table missing data");
+      if (VERBOSE) fprintf (stderr, "can't read table missing data\n");
       return (FALSE);
     }
@@ -192,4 +192,5 @@
   } 
   catalog[0].missing_catalog = missing;
+  dvo_catalog_test (catalog, FALSE);
 
   /*** Secfilt Table ***/
@@ -198,7 +199,5 @@
   if (catalog[0].catflags & LOAD_SECF) {
     ALLOCATE (secfilt, Catalog, 1);
-    secfilt[0].measure_catalog = NULL;
-    secfilt[0].missing_catalog = NULL;
-    secfilt[0].secfilt_catalog = NULL;
+    dvo_catalog_init (secfilt, TRUE);
 
     /* get split filename from main header (paths relative to cpt file) */
@@ -220,15 +219,15 @@
     /* matrix should be empty */
     if (!gfits_fread_matrix (secfilt[0].f, &matrix, &secfilt[0].header)) {
-      if (VERBOSE) fprintf (stderr, "can't read primary matrix");
+      if (VERBOSE) fprintf (stderr, "can't read primary matrix\n");
       return (FALSE);
     }
     /* read secfilt table header */
     if (!gfits_fread_header (secfilt[0].f, &header)) {
-      if (VERBOSE) fprintf (stderr, "can't read table secfilt header");
+      if (VERBOSE) fprintf (stderr, "can't read table secfilt header\n");
       return (FALSE);
     }
     /* read secfilt table data */
     if (!gfits_fread_ftable_data (secfilt[0].f, &ftable)) {
-      if (VERBOSE) fprintf (stderr, "can't read table secfilt data");
+      if (VERBOSE) fprintf (stderr, "can't read table secfilt data\n");
       return (FALSE);
     }
@@ -242,4 +241,5 @@
   } 
   catalog[0].secfilt_catalog = secfilt;
+  dvo_catalog_test (catalog, FALSE);
 
   /* save the current number so we can do partial updates */
Index: trunk/Ohana/src/libdvo/src/skyregion_gsc.c
===================================================================
--- trunk/Ohana/src/libdvo/src/skyregion_gsc.c	(revision 8385)
+++ trunk/Ohana/src/libdvo/src/skyregion_gsc.c	(revision 8386)
@@ -2,4 +2,5 @@
 # define NDECBANDS 24
 # define NDIV 4
+# define DEBUG 0
 
 static int DecLines[] = {593, 584, 551, 530, 522, 465, 406, 362, 280, 198, 123, 25, 597, 578, 574, 577, 534, 499, 442, 376, 294, 212, 144, 48};
@@ -85,5 +86,5 @@
   L0.regions[0].childE  =  NDECBANDS;
   strcpy (L0.regions[0].name, "fullsky");
-  // SkyRegionPrint (&L0.regions[0]);
+  if (DEBUG) SkyRegionPrint (&L0.regions[0]);
 
   /* allocate space for all levels */
@@ -93,4 +94,8 @@
   ALLOCATE (L3.regions, SkyRegion, 1);
   ALLOCATE (L4.regions, SkyRegion, 1);
+
+  // skipLines = 0;
+  // for (i = 0; i < 16; i++) skipLines += DecLines[i];
+  // for (i = 16; i < 17; i++) {
 
   /* L1 : dec bands */
@@ -107,5 +112,5 @@
     L1.regions[i].table    = -1;
     strcpy (L1.regions[i].name, DecNames[i]);
-    // SkyRegionPrint (&L1.regions[i]);
+    if (DEBUG) SkyRegionPrint (&L1.regions[i]);
 
     /* build the L2 regions for this L1 region (based on zones) */
@@ -123,4 +128,5 @@
     /* subdivide each zone */
     for (j = 0; j < Nzones; j++) {
+      if (DEBUG) fprintf (stderr, "zone: %d : %f - %f : %f - %f\n", j, zones[j].Rmin, zones[j].Rmax, zones[j].Dmin, zones[j].Dmax);
       SkyTableL2fromZone (&L2, &L3, &L4, band, &zones[j], i);
     }
@@ -273,5 +279,5 @@
     Dmax = MAX (regions[i].Dmax, Dmax);
     dDec = regions[i].Dmax - regions[i].Dmin;
-    if (dDec != zones[Nz].dDec) {
+    if (fabs(dDec - zones[Nz].dDec) > 0.001) {
       /* we've found the end of the current zone */
       zones[Nz].L3end = i;
@@ -347,5 +353,5 @@
     *p = '/';
     strcpy (L2[0].regions[Nr].name, name);
-    // SkyRegionPrint (&L2[0].regions[Nr]);
+    if (DEBUG) SkyRegionPrint (&L2[0].regions[Nr]);
 
     /* childS and childE are set in SkyTableL3fromL2 */
@@ -383,5 +389,5 @@
     L3[0].regions[Nr].childE   =  0;
 
-    // SkyRegionPrint (&L3[0].regions[Nr]);
+    if (DEBUG) SkyRegionPrint (&L3[0].regions[Nr]);
     /* name is set for the band in SkyRegionForDecBand */
 
@@ -432,5 +438,5 @@
       sprintf (name, "%s.%02d", L3[0].name, Nbox);
       strcpy (L4[0].regions[Nr].name, name);
-      // SkyRegionPrint (&L4[0].regions[Nr]);
+      if (DEBUG) SkyRegionPrint (&L4[0].regions[Nr]);
 
       Nr ++;
Index: trunk/Ohana/src/markrock/src/aregion.c
===================================================================
--- trunk/Ohana/src/markrock/src/aregion.c	(revision 8385)
+++ 	(revision )
@@ -1,118 +1,0 @@
-# include "markrock.h"
-
-double BigDecBounds[] = {0.0, 7.5, 15.0, 22.5, 30.0, 37.5, 45.0, 
-			 52.5, 60.0, 67.5, 75.0, 82.5, 90.0,
-			 0.0, -7.5, -15.0, -22.5, -30.0, -37.5, -45.0, 
-			 -52.5, -60.0, -67.5, -75.0, -82.5, -90.0};
-char *DecSections[] = {"N0000", "N0730", "N1500", "N2230", "N3000", "N3730", "N4500", 
-		       "N5230", "N6000", "N6730", "N7500", "N8230", "weirdness", 
-		       "S0000", "S0730", "S1500", "S2230", "S3000", "S3730", "S4500", 
-		       "S5230", "S6000", "S6730", "S7500", "S8230", "weirdness"};
-
-char *Dec2Sections[] = {"n0000", "n0730", "n1500", "n2230", "n3000", "n3730", "n4500", 
-			"n5230", "n6000", "n6730", "n7500", "n8230", "weirdness", 
-			"s0000", "s0730", "s1500", "s2230", "s3000", "s3730", "s4500", 
-			"s5230", "s6000", "s6730", "s7500", "s8230", "weirdness"};
-
-char *disk[] = {"disk 1", "disk 1", "disk 1", "disk 1", "disk 1", "disk 1", "disk 1", 
-		"disk 1", "disk 1", "disk 1", "disk 1", "disk 1", "weirdness", 
-		"disk 1", "disk 2", "disk 2", "disk 2", "disk 2", "disk 2", "disk 2", 
-		"disk 2", "disk 2", "disk 2", "disk 2", "disk 2", "weirdness"};
-
-int NBigRASections [] = {48, 47, 45, 43, 40, 36, 32, 28, 21, 15, 9, 3, 3, 48, 47, 45, 43, 40, 36, 32, 28, 21, 15, 9, 3, 3};
-
-int NDecLines[] = {593, 584, 551, 530, 522, 465, 406, 362, 280, 198, 123, 24, 
-                   0, 597, 578, 574, 577, 534, 499, 442, 376, 294, 212, 144, 48};
-
-/* find region file which contains ra, dec */
-aregion (region, f, ra, dec) 
-GSCRegion region[];
-FILE *f;
-double ra, dec;
-{
-  
-  
-  char buffer[28800], temp[50], file[50];
-  double dr, dd;
-  double RA0, RA1, DEC0, DEC1;
-  int i, NBigDec, NLINES, done, nregion;
-  
-  while (ra < 0) { ra += 360.0; }
-  while (ra >= 360.0) { ra -= 360.0; }
-    
-  if (dec >= 86.25) {
-    sprintf (file, "%s/n8230/pole.cpt\0", GSCDIR);
-    region[0].DEC[0] = 86.25;
-    region[0].DEC[1] = 93.75;
-    region[0].RA[0] = -180.0;
-    region[0].RA[1] =  540.0;
-    strcpy (region[0].filename, file);
-    return;
-  }
-    
-  NBigDec = -1;
-  for (i = 0; i < 12; i++) {
-# ifdef DEBUG
-    fprintf (stderr, "%d %f %f %f\n", i, dec, BigDecBounds[i], BigDecBounds[i+1]);
-# endif
-    if ((dec >= BigDecBounds[i]) && (dec < BigDecBounds[i+1])) {
-      NBigDec = i;
-      break;
-    }
-  }
-  if (NBigDec < 0) {
-    for (i = 13; i < 24; i++) {
-# ifdef DEBUG
-      fprintf (stderr, "%d %f %f %f\n", i, dec, BigDecBounds[i], BigDecBounds[i+1]);
-# endif
-      if ((dec < BigDecBounds[i]) && (dec >= BigDecBounds[i+1])) {
-	NBigDec = i;
-	break;
-      }
-    }
-  }
-  if (NBigDec < 0) {
-    fprintf (stderr, "dec out of range: %f\n", dec);
-  }
-    
-  NLINES = 0;
-  for (i = 0; i < NBigDec; i++) {
-    NLINES += NDecLines[i];
-  }
-  fseek (f, 5*2880 + 48*NLINES, SEEK_SET);
-      
-  done = FALSE;
-  fread (buffer, 1, 48*NDecLines[NBigDec], f);
-  for (i = 0; !done && (i < NDecLines[NBigDec]); i++) {
-    strncpy (temp, &buffer[i*48], 48);
-    temp[49] = 0;
-    hstgsc_hms_to_deg (&RA0, &RA1, &DEC0, &DEC1, &temp[7]);
-    if (RA1 < RA0) RA1 += 360.0;
-# ifdef DEBUG
-    fprintf (stderr, "%f %f %f  %f %f %f  %s\n", DEC0, dec, DEC1, RA0, ra, RA1, temp);
-# endif
-    if ((dec >= 0) && (dec >= DEC0) && (dec < DEC1) && (ra >= RA0) && (ra < RA1)) {
-      done = TRUE;
-    }
-    if ((dec < 0) && (dec < DEC0) && (dec >= DEC1) && (ra >= RA0) && (ra < RA1)) {
-      done = TRUE;
-    }
-  }
-  if (!done) {
-    fprintf (stderr, "error in search: %f %f\n", ra, dec);
-    exit (0);
-  }
-  temp[5] = 0;
-  sprintf (file, "%s/%s/%s.cpt\0", GSCDIR, Dec2Sections[NBigDec],&temp[1]);
-  if (DEC0 < DEC1) {
-    region[0].DEC[0] = DEC0;
-    region[0].DEC[1] = DEC1;
-  } else {
-    region[0].DEC[0] = DEC1;
-    region[0].DEC[1] = DEC0;
-  }     
-  region[0].RA[0] = RA0;
-  region[0].RA[1] = RA1;
-  strcpy (region[0].filename, file);
-  return;
-}
Index: trunk/Ohana/src/markrock/src/check_lockfile.c
===================================================================
--- trunk/Ohana/src/markrock/src/check_lockfile.c	(revision 8385)
+++ 	(revision )
@@ -1,39 +1,0 @@
-# include "markrock.h"
-
-check_lockfile ()
-{
-  
-  FILE *f;
-  char filename[128];
-  struct stat filestat;
-
-  sprintf (filename, "%s/lock\0", CATDIR);
-  if (stat (filename, &filestat) != -1) {
-    fprintf (stderr, "ERROR: catalog %s is locked, try again later\n", CATDIR);
-    exit (0);
-  }
-
-  f = fopen (filename, "w");
-  if (f == (FILE *) NULL) {
-    fprintf (stderr, "ERROR: can't set lock file %s\n", filename);
-    exit (0);
-  }
-  fclose (f);
-
-}
-
-clear_lockfile ()
-{
-  
-  char filename[128], line[256];
-  struct stat filestat;
-
-  sprintf (filename, "%s/lock\0", CATDIR);
-  if (stat (filename, &filestat) != -1) {
-    sprintf (line, "rm %s\0", filename);
-    system (line);
-  } else {
-    fprintf (stderr, "can't remove lockfile, why not?\n");
-  }
-
-}
Index: trunk/Ohana/src/markrock/src/check_permissions.c
===================================================================
--- trunk/Ohana/src/markrock/src/check_permissions.c	(revision 8385)
+++ 	(revision )
@@ -1,63 +1,0 @@
-# include "markrock.h"
-
-check_permissions (char *basefile) {
-  
-  FILE *f;
-  char *c, dir[256], filename[256];
-  struct stat filestat;
-  uid_t fuid, uid;
-  gid_t fgid, gid;
-  int status;
-
-  uid = getuid();
-  gid = getgid();
-
-  /* check permission to write to directory */
-  sprintf (filename, "%s\0", basefile);
-  c = strrchr (filename, '/');
-  if (c == (char *) NULL) {
-    strcpy (dir, ".");
-  } else {
-    *c = 0;
-    strcpy (dir, filename);
-  }
-  status = stat (dir, &filestat);
-  if (status == -1) {
-    fprintf (stderr, "ERROR: can't write to %s\n", dir);
-    exit (0);
-  } 
-  if (((uid == filestat.st_uid) && (filestat.st_mode & S_IRWXU)) ||
-      ((gid == filestat.st_gid) && (filestat.st_mode & S_IRWXG)) || 
-      (filestat.st_mode & S_IRWXO)) {
-  } else {
-    fprintf (stderr, "ERROR: can't write to %s\n", dir);
-    exit (0);
-  }
-  
-  /* check permission to write to file */
-  sprintf (filename, "%s\0", basefile);
-  status = stat (filename, &filestat);
-  if (status == 0) { /* file exists, are permissions OK? */
-    if (((uid == filestat.st_uid) && (filestat.st_mode & S_IRUSR) && (filestat.st_mode & S_IWUSR)) ||
-	((gid == filestat.st_gid) && (filestat.st_mode & S_IRGRP) && (filestat.st_mode & S_IWGRP)) || 
-	((filestat.st_mode & S_IROTH) && (filestat.st_mode & S_IWOTH))) {
-    } else {
-      fprintf (stderr, "ERROR: can't write to %s\n", filename);
-      exit (0);
-    }
-  }
-  
-  /* check permission to write to backup file */
-  sprintf (filename, "%s~\0", basefile);
-  status = stat (filename, &filestat);
-  if (status == 0) { /* file exists, are permissions OK? */
-    if (((uid == filestat.st_uid) && (filestat.st_mode & S_IRUSR) && (filestat.st_mode & S_IWUSR)) ||
-	((gid == filestat.st_gid) && (filestat.st_mode & S_IRGRP) && (filestat.st_mode & S_IWGRP)) || 
-	((filestat.st_mode & S_IROTH) && (filestat.st_mode & S_IWOTH))) {
-    } else {
-      fprintf (stderr, "ERROR: can't write to %s\n", filename);
-      exit (0);
-    }
-  }
-  
-}
Index: trunk/Ohana/src/markrock/src/gcatalog.c
===================================================================
--- trunk/Ohana/src/markrock/src/gcatalog.c	(revision 8385)
+++ 	(revision )
@@ -1,34 +1,0 @@
-# include "markrock.h"
-
-gcatalog (Catalog *catalog) {
-  
-  char filename[128];
-  int i, status, mode;
-  unsigned int NotTrail;
-  unsigned short NotBad;
-
-  mode = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
-
-  /* no autodetect for CATMODE yet */
-  strcpy (catalog[0].catmode, CATMODE);
-
-  if (!load_catalog (catalog, mode, VERBOSE)) {
-    fprintf (stderr, "ERROR: failure loading catalog\n");
-    exit (1);
-  }
-
-  if (RESET) {
-    NotBad = (0xffff ^ 0xc003);
-    for (i = 0; i < catalog[0].Naverage; i++) {
-      if ((catalog[0].average[i].code & ID_MOVING) &&
-	  (catalog[0].average[i].code & ID_BAD_OBJECT) &&
-	  (catalog[0].average[i].code & 0x0003)) {
-	/* this will set the correct bit for each to 0 */ 
-	catalog[0].average[i].code &= NotBad;
-      }
-    }
-    for (i = 0; i < catalog[0].Nmeasure; i++) {
-      catalog[0].measure[i].flags &= ~PART_OF_TRAIL;
-    }
-  }
-}
Index: trunk/Ohana/src/markrock/src/gregions.c
===================================================================
--- trunk/Ohana/src/markrock/src/gregions.c	(revision 8385)
+++ 	(revision )
@@ -1,134 +1,0 @@
-# include "markrock.h"
-
-GSCRegion *gregions1 (catstats, Nregions)
-CatStats catstats[];
-int *Nregions;
-{
-  
-  GSCRegion *region;
-  int i, j, k, x, y, done, nregion, nregion2, NREGION;
-  double ra, dec, dx, dy, Xo[4], Yo[4];
-  FILE *f;
-
-  f = fopen (GSCFILE, "r");
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: could not open GSC region file %s\n", GSCFILE);
-    exit (0);
-  }
-  nregion = 0;
-  NREGION = 10;
-  ALLOCATE (region, GSCRegion, NREGION);
-
-  if (catstats[0].DEC[0] == 86.25) { /* pole region */
-    dec = 86.0;
-    for (ra = 0.1; ra < 370; ra+= 30.0) {
-      aregion (&region[nregion], f, ra, dec);
-      done = FALSE;
-      for (j = 0; (j < nregion - 1) && !done; j++) {
-	if (!strcmp (region[nregion].filename, region[j].filename)) {
-	  nregion --;
-	  done = TRUE;
-	}
-      }
-      nregion ++;
-      if (nregion == NREGION) {
-	NREGION += 10;
-	REALLOCATE (region, GSCRegion, NREGION);
-      }
-    }
-  } else {
-    for (x = 0; x < 2; x++) {
-      for (y = 0; y < 2; y++) {
-	for (dx = -0.1; dx <= 0.1; dx += 0.2) {
-	  for (dy = -0.1; dy <= 0.1; dy += 0.2) {
-	    ra  = catstats[0].RA[x] + dx;
-	    dec = catstats[0].DEC[y] + dy;
-	    aregion (&region[nregion], f, ra, dec);
-	    done = FALSE;
-	    for (j = 0; (j < nregion) && !done; j++) {
-	      if (!strcmp (region[nregion].filename, region[j].filename)) {
-		done = TRUE;
-	      }
-	    }
-	    if (!done) {
-	      nregion ++;
-	    } 
-	    if (nregion == NREGION) {
-	      NREGION += 10;
-	      REALLOCATE (region, GSCRegion, NREGION);
-	    }
-	  }
-	}
-      }
-    }
-  }
-
-  if (VERBOSE) {
-    fprintf (stderr, "using %d regions\n", nregion);
-    for (i = 0; i < nregion; i++) {
-      fprintf (stderr, "region %d: %f %f  %f %f\n", i, region[i].RA[0], region[i].RA[1], region[i].DEC[0], region[i].DEC[1]);
-    } 
-  }
-
-  REALLOCATE (region, GSCRegion, MAX (nregion, 1));
-  *Nregions = nregion;
-  
-  fclose (f);
-  return (region);
-  
-}
-
-GSCRegion *gregions2 (image, Nregions)
-Image *image;
-int *Nregions;
-{
-  
-  GSCRegion *region;
-  FILE *f;
-  double x, y;
-  double dr, dd, dec, ra;
-  int i, j, done, nregion, NREGION;
-  
-  f = fopen (GSCFILE, "r");
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: can't find GSC region file %s\n", GSCFILE);
-    exit (0);
-  }
-  
-  /* find regions at image corners */
-  NREGION = 10;
-  ALLOCATE (region, GSCRegion, NREGION);
-  nregion = 0;
-
-  /* look for new regions on grid across image */ 
-  for (x = 0.0; x <= 1.0; x+=0.25) {
-    for (y = 0.0; y <= 1.0; y+=0.25) {
-      XY_to_RD (&ra, &dec, image[0].NX*(1.1*x - 0.05), image[0].NY*(1.1*y - 0.05), &image[0].coords);
-      aregion (&region[nregion], f, ra, dec);
-      done = FALSE;
-      for (j = 0; (j < nregion) && !done; j++) {
-	if (!strcmp (region[nregion].filename, region[j].filename)) {
-	  nregion --;
-	  done = TRUE;
-	}
-      }
-      nregion ++;
-      if (nregion == NREGION) {
-	NREGION += 10;
-	REALLOCATE (region, GSCRegion, NREGION);
-      }
-    }
-  }
-
-  if (VERBOSE) {
-    fprintf (stderr, "found %d region files:\n", nregion);
-    for (i = 0; i < nregion; i++) {
-      fprintf (stderr, "  %d %s\n", i, region[i].filename);
-    }
-  }
-  *Nregions = nregion;
-  
-  fclose (f);
-  return (region);
-  
-}
Index: trunk/Ohana/src/markrock/src/load_gsc_data.c
===================================================================
--- trunk/Ohana/src/markrock/src/load_gsc_data.c	(revision 8385)
+++ 	(revision )
@@ -1,61 +1,0 @@
-# include "markrock.h"
-# define NBYTES 160000
-# define BYTES_STAR 23
-# define BLOCK 1000
-# define DNSTARS 1000
-
-load_gsc_data (catalog, catstats)
-Catalog catalog[];
-CatStats catstats[];
-{
-
-  /* load data from the GSC files */
-  char filename[128];
-  char *tbuffer;
-  int nstar, NSTARS;
-  int i, j, Nbytes, nbytes, Nregions;
-  double R, D, M, MagLimit;
-  FILE *f;
-  GSCRegion *region, *gregions1(), *gregions2();
-  
-  region = gregions1 (catstats, &Nregions);
-
-  MagLimit = 25;
-  nstar = 0;
-  NSTARS = DNSTARS;
-  ALLOCATE (tbuffer, char, (BLOCK*BYTES_STAR));
-  ALLOCATE (catalog[0].average, Average, NSTARS);
-  Nbytes = BLOCK*BYTES_STAR;
-  
-  for (j = 0; j < Nregions; j++) {
-    f = fopen (region[j].filename, "r");
-    if (f == (FILE *) NULL) {
-      fprintf (stderr, "GSC file for region %s missing\n", region[j].filename);
-      exit (0);
-    }
-    
-    while ((nbytes = fread (tbuffer, 1, Nbytes, f)) > 0) {
-      for (i = 0; i < nbytes / BYTES_STAR; i++) {
-	dparse (&M, 3, &tbuffer[i*BYTES_STAR]);
-	if (M > MagLimit) continue;
-	dparse (&R, 1, &tbuffer[i*BYTES_STAR]);
-	dparse (&D, 2, &tbuffer[i*BYTES_STAR]);
-	catalog[0].average[nstar].R = R;
-	catalog[0].average[nstar].D = D;
-	catalog[0].average[nstar].M = M * 1000.0;
-	nstar++;
-	if (nstar == NSTARS - 1) {
-	  NSTARS += DNSTARS;
-	  REALLOCATE (catalog[0].average, Average, NSTARS);
-	}
-      }
-    }
-    fclose (f);
-  }
-
-  free (tbuffer);
-  REALLOCATE (catalog[0].average, Average, nstar);
-  catalog[0].Naverage = nstar;
-  
-}
-
Index: trunk/Ohana/src/markrock/src/markrock.c
===================================================================
--- trunk/Ohana/src/markrock/src/markrock.c	(revision 8385)
+++ trunk/Ohana/src/markrock/src/markrock.c	(revision 8386)
@@ -37,20 +37,16 @@
 
   catalog.filename = argv[1];
-  switch (lock_catalog (&catalog, LCK_XCLD)) {
-  case 0:
-    fprintf (stderr, "ERROR: can't lock file\n");
-    exit (1);
-  case 1:
-    gcatalog (&catalog); /* load from disk */
-    break;
-  case 2:
-    fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
-    catalog.Naverage = 0;
-    catalog.Nmeasure = 0;
-    unlock_catalog (&catalog);
-    exit (0);
-  default:
-    fprintf (stderr, "weird lock_catalog exit state\n");
-    exit (1);
+  catalog.Nsecfilt  = GetPhotcodeNsecfilt ();
+  catalog.catflags = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
+
+  // an error exit status here is a significant error
+  if (!dvo_catalog_open (&catalog, skylist[0].regions[i], VERBOSE, "a")) {
+    fprintf (stderr, "ERROR: failure to open catalog file %s\n", catalog.filename);
+    exit (2);
+  }
+  if (catalog.Nave_disk) {
+    dvo_catalog_unlock (&catalog);
+    dvo_catalog_free (&catalog);
+    continue;
   }
 
@@ -63,9 +59,9 @@
 
   /* rocks2 = find_slow_rocks (&catalog, &catstats, &Nrocks2);  */
+  dvo_catalog_save (&catalog, VERBOSE);
+  dvo_catalog_unlock (&catalog);
+  dvo_catalog_free (&catalog);
 
-  wcatalog (&catalog);
   wrocks (rocks1, Nrocks1);
-
-  unlock_catalog (&catalog);
   /* wrocks (rocks2, Nrocks2); */
 
Index: trunk/Ohana/src/markrock/src/wcatalog.c
===================================================================
--- trunk/Ohana/src/markrock/src/wcatalog.c	(revision 8385)
+++ 	(revision )
@@ -1,39 +1,0 @@
-# include "markrock.h"
-
-wcatalog (Catalog *catalog) {
-  
-  /* 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)) {
-    fprintf (stderr, "ERROR: failure saving catalog\n");
-    exit (1);
-  }
-
-  /* free, initialize data structures */
-
-  if (catalog[0].Naverage) {
-    free (catalog[0].average); 
-    catalog[0].Naverage = 0;
-  }
-  if (catalog[0].Nmeasure) {
-    free (catalog[0].measure); 
-    catalog[0].Nmeasure = 0;
-  }
-  if (catalog[0].Nmissing) {
-    free (catalog[0].missing); 
-    catalog[0].Nmissing = 0;
-  }
-  if (catalog[0].Nsecfilt) {
-    free (catalog[0].secfilt); 
-    catalog[0].Nsecfilt = 0;
-  }
-  gfits_free_header (&catalog[0].header);
-}
-
Index: trunk/Ohana/src/markstar/src/aregion.c
===================================================================
--- trunk/Ohana/src/markstar/src/aregion.c	(revision 8385)
+++ 	(revision )
@@ -1,118 +1,0 @@
-# include "markstar.h"
-
-double BigDecBounds[] = {0.0, 7.5, 15.0, 22.5, 30.0, 37.5, 45.0, 
-			 52.5, 60.0, 67.5, 75.0, 82.5, 90.0,
-			 0.0, -7.5, -15.0, -22.5, -30.0, -37.5, -45.0, 
-			 -52.5, -60.0, -67.5, -75.0, -82.5, -90.0};
-char *DecSections[] = {"N0000", "N0730", "N1500", "N2230", "N3000", "N3730", "N4500", 
-		       "N5230", "N6000", "N6730", "N7500", "N8230", "weirdness", 
-		       "S0000", "S0730", "S1500", "S2230", "S3000", "S3730", "S4500", 
-		       "S5230", "S6000", "S6730", "S7500", "S8230", "weirdness"};
-
-char *Dec2Sections[] = {"n0000", "n0730", "n1500", "n2230", "n3000", "n3730", "n4500", 
-			"n5230", "n6000", "n6730", "n7500", "n8230", "weirdness", 
-			"s0000", "s0730", "s1500", "s2230", "s3000", "s3730", "s4500", 
-			"s5230", "s6000", "s6730", "s7500", "s8230", "weirdness"};
-
-char *disk[] = {"disk 1", "disk 1", "disk 1", "disk 1", "disk 1", "disk 1", "disk 1", 
-		"disk 1", "disk 1", "disk 1", "disk 1", "disk 1", "weirdness", 
-		"disk 1", "disk 2", "disk 2", "disk 2", "disk 2", "disk 2", "disk 2", 
-		"disk 2", "disk 2", "disk 2", "disk 2", "disk 2", "weirdness"};
-
-int NBigRASections [] = {48, 47, 45, 43, 40, 36, 32, 28, 21, 15, 9, 3, 3, 48, 47, 45, 43, 40, 36, 32, 28, 21, 15, 9, 3, 3};
-
-int NDecLines[] = {593, 584, 551, 530, 522, 465, 406, 362, 280, 198, 123, 24, 
-                   0, 597, 578, 574, 577, 534, 499, 442, 376, 294, 212, 144, 48};
-
-/* find region file which contains ra, dec */
-aregion (region, f, ra, dec) 
-GSCRegion region[];
-FILE *f;
-double ra, dec;
-{
-  
-  
-  char buffer[28800], temp[50], file[50];
-  double dr, dd;
-  double RA0, RA1, DEC0, DEC1;
-  int i, NBigDec, NLINES, done, nregion;
-  
-  while (ra < 0) { ra += 360.0; }
-  while (ra >= 360.0) { ra -= 360.0; }
-    
-  if (dec >= 86.25) {
-    sprintf (file, "%s/n8230/pole.cpt\0", GSCDIR);
-    region[0].DEC[0] = 86.25;
-    region[0].DEC[1] = 93.75;
-    region[0].RA[0] = -180.0;
-    region[0].RA[1] =  540.0;
-    strcpy (region[0].filename, file);
-    return;
-  }
-    
-  NBigDec = -1;
-  for (i = 0; i < 12; i++) {
-# ifdef DEBUG
-    fprintf (stderr, "%d %f %f %f\n", i, dec, BigDecBounds[i], BigDecBounds[i+1]);
-# endif
-    if ((dec >= BigDecBounds[i]) && (dec < BigDecBounds[i+1])) {
-      NBigDec = i;
-      break;
-    }
-  }
-  if (NBigDec < 0) {
-    for (i = 13; i < 24; i++) {
-# ifdef DEBUG
-      fprintf (stderr, "%d %f %f %f\n", i, dec, BigDecBounds[i], BigDecBounds[i+1]);
-# endif
-      if ((dec < BigDecBounds[i]) && (dec >= BigDecBounds[i+1])) {
-	NBigDec = i;
-	break;
-      }
-    }
-  }
-  if (NBigDec < 0) {
-    fprintf (stderr, "dec out of range: %f\n", dec);
-  }
-    
-  NLINES = 0;
-  for (i = 0; i < NBigDec; i++) {
-    NLINES += NDecLines[i];
-  }
-  fseek (f, 5*2880 + 48*NLINES, SEEK_SET);
-      
-  done = FALSE;
-  fread (buffer, 1, 48*NDecLines[NBigDec], f);
-  for (i = 0; !done && (i < NDecLines[NBigDec]); i++) {
-    strncpy (temp, &buffer[i*48], 48);
-    temp[49] = 0;
-    hstgsc_hms_to_deg (&RA0, &RA1, &DEC0, &DEC1, &temp[7]);
-    if (RA1 < RA0) RA1 += 360.0;
-# ifdef DEBUG
-    fprintf (stderr, "%f %f %f  %f %f %f  %s\n", DEC0, dec, DEC1, RA0, ra, RA1, temp);
-# endif
-    if ((dec >= 0) && (dec >= DEC0) && (dec < DEC1) && (ra >= RA0) && (ra < RA1)) {
-      done = TRUE;
-    }
-    if ((dec < 0) && (dec < DEC0) && (dec >= DEC1) && (ra >= RA0) && (ra < RA1)) {
-      done = TRUE;
-    }
-  }
-  if (!done) {
-    fprintf (stderr, "error in search: %f %f\n", ra, dec);
-    exit (0);
-  }
-  temp[5] = 0;
-  sprintf (file, "%s/%s/%s.cpt\0", GSCDIR, Dec2Sections[NBigDec],&temp[1]);
-  if (DEC0 < DEC1) {
-    region[0].DEC[0] = DEC0;
-    region[0].DEC[1] = DEC1;
-  } else {
-    region[0].DEC[0] = DEC1;
-    region[0].DEC[1] = DEC0;
-  }     
-  region[0].RA[0] = RA0;
-  region[0].RA[1] = RA1;
-  strcpy (region[0].filename, file);
-  return;
-}
Index: trunk/Ohana/src/markstar/src/check_lockfile.c
===================================================================
--- trunk/Ohana/src/markstar/src/check_lockfile.c	(revision 8385)
+++ 	(revision )
@@ -1,39 +1,0 @@
-# include "markstar.h"
-
-check_lockfile ()
-{
-  
-  FILE *f;
-  char filename[128];
-  struct stat filestat;
-
-  sprintf (filename, "%s/lock\0", CATDIR);
-  if (stat (filename, &filestat) != -1) {
-    fprintf (stderr, "ERROR: catalog %s is locked, try again later\n", CATDIR);
-    exit (0);
-  }
-
-  f = fopen (filename, "w");
-  if (f == (FILE *) NULL) {
-    fprintf (stderr, "ERROR: can't set lock file %s\n", filename);
-    exit (0);
-  }
-  fclose (f);
-
-}
-
-clear_lockfile ()
-{
-  
-  char filename[128], line[256];
-  struct stat filestat;
-
-  sprintf (filename, "%s/lock\0", CATDIR);
-  if (stat (filename, &filestat) != -1) {
-    sprintf (line, "rm %s\0", filename);
-    system (line);
-  } else {
-    fprintf (stderr, "can't remove lockfile, why not?\n");
-  }
-
-}
Index: trunk/Ohana/src/markstar/src/check_permissions.c
===================================================================
--- trunk/Ohana/src/markstar/src/check_permissions.c	(revision 8385)
+++ 	(revision )
@@ -1,63 +1,0 @@
-# include "markstar.h"
-
-check_permissions (char *basefile) {
-  
-  FILE *f;
-  char *c, dir[256], filename[256];
-  struct stat filestat;
-  uid_t fuid, uid;
-  gid_t fgid, gid;
-  int status;
-
-  uid = getuid();
-  gid = getgid();
-
-  /* check permission to write to directory */
-  sprintf (filename, "%s\0", basefile);
-  c = strrchr (filename, '/');
-  if (c == (char *) NULL) {
-    strcpy (dir, ".");
-  } else {
-    *c = 0;
-    strcpy (dir, filename);
-  }
-  status = stat (dir, &filestat);
-  if (status == -1) {
-    fprintf (stderr, "ERROR: can't write to %s\n", dir);
-    exit (0);
-  } 
-  if (((uid == filestat.st_uid) && (filestat.st_mode & S_IRWXU)) ||
-      ((gid == filestat.st_gid) && (filestat.st_mode & S_IRWXG)) || 
-      (filestat.st_mode & S_IRWXO)) {
-  } else {
-    fprintf (stderr, "ERROR: can't write to %s\n", dir);
-    exit (0);
-  }
-  
-  /* check permission to write to file */
-  sprintf (filename, "%s\0", basefile);
-  status = stat (filename, &filestat);
-  if (status == 0) { /* file exists, are permissions OK? */
-    if (((uid == filestat.st_uid) && (filestat.st_mode & S_IRUSR) && (filestat.st_mode & S_IWUSR)) ||
-	((gid == filestat.st_gid) && (filestat.st_mode & S_IRGRP) && (filestat.st_mode & S_IWGRP)) || 
-	((filestat.st_mode & S_IROTH) && (filestat.st_mode & S_IWOTH))) {
-    } else {
-      fprintf (stderr, "ERROR: can't write to %s\n", filename);
-      exit (0);
-    }
-  }
-  
-  /* check permission to write to backup file */
-  sprintf (filename, "%s~\0", basefile);
-  status = stat (filename, &filestat);
-  if (status == 0) { /* file exists, are permissions OK? */
-    if (((uid == filestat.st_uid) && (filestat.st_mode & S_IRUSR) && (filestat.st_mode & S_IWUSR)) ||
-	((gid == filestat.st_gid) && (filestat.st_mode & S_IRGRP) && (filestat.st_mode & S_IWGRP)) || 
-	((filestat.st_mode & S_IROTH) && (filestat.st_mode & S_IWOTH))) {
-    } else {
-      fprintf (stderr, "ERROR: can't write to %s\n", filename);
-      exit (0);
-    }
-  }
-  
-}
Index: trunk/Ohana/src/markstar/src/find_bright_stars.c
===================================================================
--- trunk/Ohana/src/markstar/src/find_bright_stars.c	(revision 8385)
+++ trunk/Ohana/src/markstar/src/find_bright_stars.c	(revision 8386)
@@ -15,4 +15,5 @@
   double dX, dY, dR, MaxDist, MaxDist1, MaxRadius, radius, radius2;
 
+  // put limits on the ref catalog mags
   load_gsc_data (&GSCdata, catstats);
 
Index: trunk/Ohana/src/markstar/src/find_ghosts.c
===================================================================
--- trunk/Ohana/src/markstar/src/find_ghosts.c	(revision 8385)
+++ trunk/Ohana/src/markstar/src/find_ghosts.c	(revision 8386)
@@ -32,4 +32,5 @@
     
     /* find ghost stars */
+    // put limits on the ref catalog mags
     load_gsc_data_ghost (&GSCdata, region, Nregions, &timage);
 
Index: trunk/Ohana/src/markstar/src/gcatalog.c
===================================================================
--- trunk/Ohana/src/markstar/src/gcatalog.c	(revision 8385)
+++ 	(revision )
@@ -1,44 +1,0 @@
-# include "markstar.h"
-
-gcatalog (char *catname, Catalog *catalog) {
-  
-  char filename[128];
-  int i, status, mode;
-  unsigned int NotTrail;
-  unsigned short NotBad;
-
-  sprintf (filename, "%s/%s\0", CATDIR, catname);
-
-  /* no autodetect for CATMODE yet */
-  strcpy (catalog[0].catmode, CATMODE);
-
-  mode = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
-  status = load_catalog (filename, catalog, mode, VERBOSE);
-
-  switch (status) {
-  case 2:
-  case 0:
-    exit (0);
-  case 1:
-    break;
-  } 
-  if (catalog[0].Nsecfilt != photcodes.Nsecfilt) {
-    fprintf (stderr, "ERROR: mismatch in secondary photometry values\n");
-    exit (0);
-  }
-
-  if (RESET) {
-    NotBad = (0xffff ^ 0xc003);
-    for (i = 0; i < catalog[0].Naverage; i++) {
-      if ((catalog[0].average[i].code & ID_MOVING) &&
-	  (catalog[0].average[i].code & ID_BAD_OBJECT) &&
-	  (catalog[0].average[i].code & 0x0003)) {
-	/* this will set the correct bit for each to 0 */ 
-	catalog[0].average[i].code &= NotBad;
-      }
-    }
-    for (i = 0; i < catalog[0].Nmeasure; i++) {
-      catalog[0].measure[i].average &= ~PART_OF_TRAIL;
-    }
-  }
-}
Index: trunk/Ohana/src/markstar/src/gregions.c
===================================================================
--- trunk/Ohana/src/markstar/src/gregions.c	(revision 8385)
+++ 	(revision )
@@ -1,134 +1,0 @@
-# include "markstar.h"
-
-GSCRegion *gregions1 (catstats, Nregions)
-CatStats catstats[];
-int *Nregions;
-{
-  
-  GSCRegion *region;
-  int i, j, k, x, y, done, nregion, nregion2, NREGION;
-  double ra, dec, dx, dy, Xo[4], Yo[4];
-  FILE *f;
-
-  f = fopen (GSCFILE, "r");
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: could not open GSC region file %s\n", GSCFILE);
-    exit (0);
-  }
-  nregion = 0;
-  NREGION = 10;
-  ALLOCATE (region, GSCRegion, NREGION);
-
-  if (catstats[0].DEC[0] == 86.25) { /* pole region */
-    dec = 86.0;
-    for (ra = 0.1; ra < 370; ra+= 30.0) {
-      aregion (&region[nregion], f, ra, dec);
-      done = FALSE;
-      for (j = 0; (j < nregion - 1) && !done; j++) {
-	if (!strcmp (region[nregion].filename, region[j].filename)) {
-	  nregion --;
-	  done = TRUE;
-	}
-      }
-      nregion ++;
-      if (nregion == NREGION) {
-	NREGION += 10;
-	REALLOCATE (region, GSCRegion, NREGION);
-      }
-    }
-  } else {
-    for (x = 0; x < 2; x++) {
-      for (y = 0; y < 2; y++) {
-	for (dx = -0.1; dx <= 0.1; dx += 0.2) {
-	  for (dy = -0.1; dy <= 0.1; dy += 0.2) {
-	    ra  = catstats[0].RA[x] + dx;
-	    dec = catstats[0].DEC[y] + dy;
-	    aregion (&region[nregion], f, ra, dec);
-	    done = FALSE;
-	    for (j = 0; (j < nregion) && !done; j++) {
-	      if (!strcmp (region[nregion].filename, region[j].filename)) {
-		done = TRUE;
-	      }
-	    }
-	    if (!done) {
-	      nregion ++;
-	    } 
-	    if (nregion == NREGION) {
-	      NREGION += 10;
-	      REALLOCATE (region, GSCRegion, NREGION);
-	    }
-	  }
-	}
-      }
-    }
-  }
-
-  if (VERBOSE) {
-    fprintf (stderr, "using %d regions\n", nregion);
-    for (i = 0; i < nregion; i++) {
-      fprintf (stderr, "region %d: %f %f  %f %f\n", i, region[i].RA[0], region[i].RA[1], region[i].DEC[0], region[i].DEC[1]);
-    } 
-  }
-
-  REALLOCATE (region, GSCRegion, MAX (nregion, 1));
-  *Nregions = nregion;
-  
-  fclose (f);
-  return (region);
-  
-}
-
-GSCRegion *gregions2 (image, Nregions)
-Image *image;
-int *Nregions;
-{
-  
-  GSCRegion *region;
-  FILE *f;
-  double x, y;
-  double dr, dd, dec, ra;
-  int i, j, done, nregion, NREGION;
-  
-  f = fopen (GSCFILE, "r");
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: can't find GSC region file %s\n", GSCFILE);
-    exit (0);
-  }
-  
-  /* find regions at image corners */
-  NREGION = 10;
-  ALLOCATE (region, GSCRegion, NREGION);
-  nregion = 0;
-
-  /* look for new regions on grid across image */ 
-  for (x = 0.0; x <= 1.0; x+=0.25) {
-    for (y = 0.0; y <= 1.0; y+=0.25) {
-      XY_to_RD (&ra, &dec, image[0].NX*(1.1*x - 0.05), image[0].NY*(1.1*y - 0.05), &image[0].coords);
-      aregion (&region[nregion], f, ra, dec);
-      done = FALSE;
-      for (j = 0; (j < nregion) && !done; j++) {
-	if (!strcmp (region[nregion].filename, region[j].filename)) {
-	  nregion --;
-	  done = TRUE;
-	}
-      }
-      nregion ++;
-      if (nregion == NREGION) {
-	NREGION += 10;
-	REALLOCATE (region, GSCRegion, NREGION);
-      }
-    }
-  }
-
-  if (VERBOSE) {
-    fprintf (stderr, "found %d region files:\n", nregion);
-    for (i = 0; i < nregion; i++) {
-      fprintf (stderr, "  %d %s\n", i, region[i].filename);
-    }
-  }
-  *Nregions = nregion;
-  
-  fclose (f);
-  return (region);
-  
-}
Index: trunk/Ohana/src/markstar/src/load_gsc_data.c
===================================================================
--- trunk/Ohana/src/markstar/src/load_gsc_data.c	(revision 8385)
+++ 	(revision )
@@ -1,61 +1,0 @@
-# include "markstar.h"
-# define NBYTES 160000
-# define BYTES_STAR 23
-# define BLOCK 1000
-# define DNSTARS 1000
-
-load_gsc_data (catalog, catstats)
-Catalog catalog[];
-CatStats catstats[];
-{
-
-  /* load data from the GSC files */
-  char filename[128];
-  char *tbuffer;
-  int nstar, NSTARS;
-  int i, j, Nbytes, nbytes, Nregions;
-  double R, D, M, MagLimit;
-  FILE *f;
-  GSCRegion *region, *gregions1(), *gregions2();
-  
-  region = gregions1 (catstats, &Nregions);
-
-  MagLimit = MAX (MAX (BRIGHT_HALO_MAG, BRIGHT_XTRAIL_MAG), BRIGHT_YTRAIL_MAG); 
-  nstar = 0;
-  NSTARS = DNSTARS;
-  ALLOCATE (tbuffer, char, (BLOCK*BYTES_STAR));
-  ALLOCATE (catalog[0].average, Average, NSTARS);
-  Nbytes = BLOCK*BYTES_STAR;
-  
-  for (j = 0; j < Nregions; j++) {
-    f = fopen (region[j].filename, "r");
-    if (f == (FILE *) NULL) {
-      fprintf (stderr, "GSC file for region %s missing\n", region[j].filename);
-      exit (0);
-    }
-    
-    while ((nbytes = fread (tbuffer, 1, Nbytes, f)) > 0) {
-      for (i = 0; i < nbytes / BYTES_STAR; i++) {
-	dparse (&M, 3, &tbuffer[i*BYTES_STAR]);
-	if (M > MagLimit) continue;
-	dparse (&R, 1, &tbuffer[i*BYTES_STAR]);
-	dparse (&D, 2, &tbuffer[i*BYTES_STAR]);
-	catalog[0].average[nstar].R = R;
-	catalog[0].average[nstar].D = D;
-	catalog[0].average[nstar].M = M * 1000.0;
-	nstar++;
-	if (nstar == NSTARS - 1) {
-	  NSTARS += DNSTARS;
-	  REALLOCATE (catalog[0].average, Average, NSTARS);
-	}
-      }
-    }
-    fclose (f);
-  }
-
-  free (tbuffer);
-  REALLOCATE (catalog[0].average, Average, nstar);
-  catalog[0].Naverage = nstar;
-  
-}
-
Index: trunk/Ohana/src/markstar/src/load_gsc_data_ghost.c
===================================================================
--- trunk/Ohana/src/markstar/src/load_gsc_data_ghost.c	(revision 8385)
+++ 	(revision )
@@ -1,75 +1,0 @@
-# include "markstar.h"
-# define NBYTES 160000
-# define BYTES_STAR 23
-# define BLOCK 1000
-# define DNSTARS 1000
-
-/* this routine is basically identical to load_gsc_data, but
-   it is not limited to a single region file, and it merges the 
-   results */
-
-load_gsc_data_ghost (catalog, region, Nregion, image)
-Catalog catalog[];
-GSCRegion *region;
-int Nregion;
-Image image[];
-{
-
-  /* load data from the GSC files */
-  char filename[128];
-  char *tbuffer;
-  int nstar, NSTARS;
-  int i, j, Nbytes, nbytes;
-  double R, D, M, X, Y;
-  FILE *f;
-  Coords *tcoords;
-  int MinX, MinY, MaxX, MaxY;
-  
-  nstar = 0;
-  NSTARS = DNSTARS;
-  ALLOCATE (tbuffer, char, (BLOCK*BYTES_STAR));
-  ALLOCATE (catalog[0].average, Average, NSTARS);
-  tcoords = &image[0].coords;
-  MinX = 0;
-  MinY = 0;
-  MaxX = image[0].NX;
-  MaxY = image[0].NY;
-  
-  for (j = 0; j < Nregion; j++) {
-    
-    f = fopen (region[j].filename, "r");
-    if (f == (FILE *) NULL) {
-      fprintf (stderr, "no GSC file for region %s (2)\n", region[j].filename);
-      exit (0);
-    }
-    
-    Nbytes = BLOCK*BYTES_STAR;
-    while ((nbytes = fread (tbuffer, 1, Nbytes, f)) > 0) {
-      for (i = 0; i < nbytes / BYTES_STAR; i++) {
-	dparse (&M, 3, &tbuffer[i*BYTES_STAR]);
-	if (M > GHOST_MAG) continue;
-	dparse (&R, 1, &tbuffer[i*BYTES_STAR]);
-	dparse (&D, 2, &tbuffer[i*BYTES_STAR]);
-	RD_to_XY (&X, &Y, R, D, tcoords);
-	if ((X < MinX) || (X > MaxX) || (Y < MinY) || (Y > MaxY)) continue;
-	catalog[0].average[nstar].R = R;
-	catalog[0].average[nstar].D = D;
-	catalog[0].average[nstar].M = M * 1000.0;
-	nstar++;
-	if (nstar == NSTARS - 1) {
-	  NSTARS += DNSTARS;
-	  REALLOCATE (catalog[0].average, Average, NSTARS);
-	}
-      }
-    }
-    fclose (f);
-
-  }
-
-  free (tbuffer);
-  REALLOCATE (catalog[0].average, Average, MAX (nstar, 1));
-  catalog[0].Naverage = nstar;
-
-}
-
-
Index: trunk/Ohana/src/markstar/src/markstar.c
===================================================================
--- trunk/Ohana/src/markstar/src/markstar.c	(revision 8385)
+++ trunk/Ohana/src/markstar/src/markstar.c	(revision 8386)
@@ -37,7 +37,20 @@
 
   set_db (&db);
-  lock_image_db (&db, ImageCat);
+  dvo_image_lock (&db, ImageCat, 3600.0, LCK_XCLD);
 
-  gcatalog (argv[1], &catalog);
+  catalog.filename = argv[1];
+  catalog.Nsecfilt  = GetPhotcodeNsecfilt ();
+  catalog.catflags = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
+
+  // an error exit status here is a significant error
+  if (!dvo_catalog_open (&catalog, NULL, VERBOSE, "a")) {
+    fprintf (stderr, "ERROR: failure to open catalog file %s\n", catalog.filename);
+    exit (2);
+  }
+  if (!catalog.Nave_disk) {
+    dvo_catalog_unlock (&catalog);
+    dvo_catalog_free (&catalog);
+    exit (0);
+  }
 
   gcatstats (&catalog, &catstats);
@@ -53,6 +66,7 @@
   /* find_ghosts (&catalog, &catstats, argv[1], image, Nimage); */
 
-
-  wcatalog (argv[1], &catalog);
+  dvo_catalog_save (&catalog, VERBOSE);
+  dvo_catalog_unlock (&catalog);
+  dvo_catalog_free (&catalog);
 
   if (VERBOSE) {
@@ -61,5 +75,4 @@
 	     (now.tv_sec - then.tv_sec) + 1e-6*(now.tv_usec - then.tv_usec));
   }
-  clear_lockfile (); 
   fprintf (stderr, "SUCCESS\n");
 }
Index: trunk/Ohana/src/markstar/src/wcatalog.c
===================================================================
--- trunk/Ohana/src/markstar/src/wcatalog.c	(revision 8385)
+++ 	(revision )
@@ -1,37 +1,0 @@
-# include "markstar.h"
-
-wcatalog (Catalog *catalog) {
-  
-  /* 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)) {
-    fprintf (stderr, "ERROR: failure saving catalog\n");
-    exit (1);
-  }
-
-  if (catalog[0].Naverage) {
-    free (catalog[0].average); 
-    catalog[0].Naverage = 0;
-  }
-  if (catalog[0].Nmeasure) {
-    free (catalog[0].measure); 
-    catalog[0].Nmeasure = 0;
-  }
-  if (catalog[0].Nmissing) {
-    free (catalog[0].missing); 
-    catalog[0].Nmissing = 0;
-  }
-  if (catalog[0].Nsecfilt) {
-    free (catalog[0].secfilt); 
-    catalog[0].Nsecfilt = 0;
-  }
-  gfits_free_header (&catalog[0].header);
-}
-
Index: trunk/Ohana/src/relphot/Makefile
===================================================================
--- trunk/Ohana/src/relphot/Makefile	(revision 8385)
+++ trunk/Ohana/src/relphot/Makefile	(revision 8386)
@@ -28,5 +28,4 @@
 $(SRC)/select_images.$(ARCH).o	 \
 $(SRC)/load_catalogs.$(ARCH).o	 \
-$(SRC)/gcatalog.$(ARCH).o 	 \
 $(SRC)/bcatalog.$(ARCH).o	 \
 $(SRC)/GridOps.v2.$(ARCH).o	 \
@@ -37,14 +36,11 @@
 $(SRC)/plot_scatter.$(ARCH).o	 \
 $(SRC)/plotstuff.$(ARCH).o	 \
-$(SRC)/misc.$(ARCH).o		 \
+$(SRC)/sort.$(ARCH).o		 \
 $(SRC)/reload_catalogs.$(ARCH).o \
-$(SRC)/image-db.$(ARCH).o \
-$(SRC)/free_catalogs.$(ARCH).o   \
 $(SRC)/setMrelFinal.$(ARCH).o 	 \
 $(SRC)/write_coords.$(ARCH).o 	 \
 $(SRC)/setExclusions.$(ARCH).o 	 \
 $(SRC)/Shutdown.$(ARCH).o 	 \
-$(SRC)/SetSignals.$(ARCH).o 	 \
-$(SRC)/wcatalog.$(ARCH).o
+$(SRC)/SetSignals.$(ARCH).o 	
 
 OLD = \
Index: trunk/Ohana/src/relphot/src/gcatalog.c
===================================================================
--- trunk/Ohana/src/relphot/src/gcatalog.c	(revision 8385)
+++ 	(revision )
@@ -1,26 +1,0 @@
-# include "relphot.h"
-
-int gcatalog (Catalog *catalog, int FINAL) {
-  
-  if (FINAL) {
-    catalog[0].catflags = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
-  } else {
-    catalog[0].catflags = LOAD_AVES | LOAD_MEAS | LOAD_SECF;
-  }    
-
-  /* CATMODE and CATFORMAT determined from catalog */
-
-  if (!load_catalog (catalog, VERBOSE)) {
-    fprintf (stderr, "ERROR: failure loading catalog %s\n", catalog[0].filename);
-    exit (1);
-  }
-
-  if (VERBOSE) {
-    fprintf (stderr, "read %d stars from catalog file %s (%d measurements)\n", 
-	     catalog[0].Naverage, catalog[0].filename, catalog[0].Nmeasure);
-  }
-  return (TRUE);
-}
-
-
-
Index: trunk/Ohana/src/relphot/src/load_catalogs.c
===================================================================
--- trunk/Ohana/src/relphot/src/load_catalogs.c	(revision 8385)
+++ trunk/Ohana/src/relphot/src/load_catalogs.c	(revision 8386)
@@ -8,36 +8,28 @@
   if (VERBOSE) fprintf (stderr, "loading catalog data\n");
 
-  // XXX skip over the empty catalogs? don't add to the list?
   ALLOCATE (catalog, Catalog, skylist[0].Nregions);
 
-  /* load data from each region file, only use bright stars */
-  // we use LCK_SOFT since we assume the image is locked 
+  // load data from each region file, only use bright stars
   for (i = 0; i < skylist[0].Nregions; i++) {
+
+    // set up the basic catalog info
     tcatalog.filename = skylist[0].filename[i];
+    tcatalog.catformat = dvo_catalog_catformat (CATFORMAT);    // set the default catformat from config data
+    tcatalog.catmode   = dvo_catalog_catmode (CATMODE);        // set the default catmode from config data
+    tcatalog.catflags  = LOAD_AVES | LOAD_MEAS | LOAD_SECF; // don't need to load all data at this point
 
-    tcatalog.catformat = dvo_catalog_format (CATFORMAT);  // set the default catformat from config data
-    tcatalog.catmode   = dvo_catalog_mode (CATMODE);      // set the default catmode from config data
-    tcatalog.lockmode  = LCK_SOFT;
-    dvo_catalog_open (&tcatalog, skylist[0].regions[i], Nsecfilt, "r");
-
-    switch (lock_catalog (&tcatalog, LCK_SOFT)) {
-    case 0:
-      fprintf (stderr, "ERROR: can't lock file %s\n", tcatalog.filename);
-      exit (1);
-    case 1:
-      gcatalog (&tcatalog, FALSE); /* load from disk */
-      break;
-    case 2:
-      if (VERBOSE) fprintf (stderr, "no data in %s, skipping\n", tcatalog.filename);
-      tcatalog.Naverage = 0;
-      tcatalog.Nmeasure = 0;
-      break;
-    default:
-      fprintf (stderr, "weird lock_catalog exit state\n");
+    if (!dvo_catalog_open (&tcatalog, skylist[0].regions[i], VERBOSE, "r")) {
+      fprintf (stderr, "ERROR: failure reading catalog %s\n", tcatalog.filename);
       exit (1);
     }
+    if (VERBOSE && !tcatalog.Nave_disk) fprintf (stderr, "no data in %s, skipping\n", tcatalog.filename);
+
+    // select only the brighter stars
     bcatalog (&catalog[i], &tcatalog);
+    dvo_catalog_unlock (&tcatalog);
+    dvo_catalog_free (&tcatalog);
   }
 
+  // XXX keep this test?
   Nstar = 0;
   for (i = 0; i < skylist[0].Nregions; i++) {
@@ -49,5 +41,12 @@
   }
 
+  // XXX consider only returning the populated catalogs
   *Ncatalog = skylist[0].Nregions;
   return (catalog);
 }
+
+/* this function loads all relevant catalog files for the first pass.  it currently loads the data
+   read only (SOFT lock) since it assumes the image table has been locked. if we go to the new
+   addstar locking paradigm, in which the images and catalogs are updated independently, then we may
+   need to use an XCLD lock here.  
+*/
Index: trunk/Ohana/src/relphot/src/misc.c
===================================================================
--- trunk/Ohana/src/relphot/src/misc.c	(revision 8385)
+++ 	(revision )
@@ -1,182 +1,0 @@
-# include "relphot.h"
-
-void sortA (double *X, int N) {
-
-  int l,j,ir,i;
-  double tX;
-  
-  if (N < 2) return;
-
-  l = N >> 1;
-  ir = N - 1;
-  for (;;) {
-    if (l > 0) {
-      l--;
-      tX = X[l];
-    }
-    else {
-      tX = X[ir];
-      X[ir] = X[0];
-      if (--ir == 0) {
-	X[0] = tX;
-	return;
-      }
-    }
-    i = l;
-    j = (l << 1) + 1;
-    while (j <= ir) {
-      if (j < ir && X[j] < X[j+1]) j++;
-      if (tX < X[j]) {
-	X[i] = X[j];
-	j += (i=j) + 1;
-      }
-      else j = ir + 1;
-    }
-    X[i] = tX;
-  }
-}
-
-void sortB (double *X, double *Y, int N) {
-
-  int l,j,ir,i;
-  double tX, tY;
-  
-  if (N < 2) return;
-
-  l = N >> 1;
-  ir = N - 1;
-  for (;;) {
-    if (l > 0) {
-      l--;
-      tX = X[l];
-      tY = Y[l];
-    }
-    else {
-      tX = X[ir];
-      X[ir] = X[0];
-      tY = Y[ir];
-      Y[ir] = Y[0];
-      if (--ir == 0) {
-	X[0] = tX;
-	Y[0] = tY;
-	return;
-      }
-    }
-    i = l;
-    j = (l << 1) + 1;
-    while (j <= ir) {
-      if (j < ir && X[j] < X[j+1]) j++;
-      if (tX < X[j]) {
-	X[i] = X[j];
-	Y[i] = Y[j];
-	j += (i=j) + 1;
-      }
-      else j = ir + 1;
-    }
-    X[i] = tX;
-    Y[i] = tY;
-  }
-}
-
-void sortC (double *X, double *Y, double *F1, double *F2, int N) {
-
-  int l,j,ir,i;
-  double tX, tY;
-  double t1, t2;
-  
-  if (N < 2) return;
-
-  l = N >> 1;
-  ir = N - 1;
-  for (;;) {
-    if (l > 0) {
-      l--;
-      tX = X[l];
-      tY = Y[l];
-      t1 = F1[l];
-      t2 = F2[l];
-    }
-    else {
-      tX = X[ir];
-      X[ir] = X[0];
-      tY = Y[ir];
-      Y[ir] = Y[0];
-      t1 = F1[ir];
-      F1[ir] = F1[0];
-      t2 = F2[ir];
-      F2[ir] = F2[0];
-      if (--ir == 0) {
-	X[0] = tX;
-	Y[0] = tY;
-	F1[0] = t1;
-	F2[0] = t2;
-	return;
-      }
-    }
-    i = l;
-    j = (l << 1) + 1;
-    while (j <= ir) {
-      if (j < ir && X[j] < X[j+1]) j++;
-      if (tX < X[j]) {
-	X[i] = X[j];
-	Y[i] = Y[j];
-	F1[i] = F1[j];
-	F2[i] = F2[j];
-	j += (i=j) + 1;
-      }
-      else j = ir + 1;
-    }
-    X[i] = tX;
-    Y[i] = tY;
-    F1[i] = t1;
-    F2[i] = t2;
-  }
-}
-
-void sortD (double *X, double *Y, double *Z, int N) {
-
-  int l,j,ir,i;
-  double tX, tY, tZ;
-  
-  if (N < 2) return;
-
-  l = N >> 1;
-  ir = N - 1;
-  for (;;) {
-    if (l > 0) {
-      l--;
-      tX = X[l];
-      tY = Y[l];
-      tZ = Z[l];
-    }
-    else {
-      tX = X[ir];
-      X[ir] = X[0];
-      tY = Y[ir];
-      Y[ir] = Y[0];
-      tZ = Z[ir];
-      Z[ir] = Z[0];
-      if (--ir == 0) {
-	X[0] = tX;
-	Y[0] = tY;
-	Z[0] = tZ;
-	return;
-      }
-    }
-    i = l;
-    j = (l << 1) + 1;
-    while (j <= ir) {
-      if (j < ir && X[j] < X[j+1]) j++;
-      if (tX < X[j]) {
-	X[i] = X[j];
-	Y[i] = Y[j];
-	Z[i] = Z[j];
-	j += (i=j) + 1;
-      }
-      else j = ir + 1;
-    }
-    X[i] = tX;
-    Y[i] = tY;
-    Z[i] = tZ;
-  }
-}
Index: trunk/Ohana/src/relphot/src/reload_catalogs.c
===================================================================
--- trunk/Ohana/src/relphot/src/reload_catalogs.c	(revision 8385)
+++ trunk/Ohana/src/relphot/src/reload_catalogs.c	(revision 8386)
@@ -14,5 +14,5 @@
     catalog.filename = skylist[0].filename[i];
 
-    // XXX only update existing db tables
+    // only update existing db tables
     status = stat (catalog.filename, &filestat);
     if ((status == -1) && (errno == ENOENT)) {
@@ -20,19 +20,20 @@
       continue;
     }
-    switch (lock_catalog (&catalog, LCK_XCLD)) {
-      case 0: // file cannot be locked
-	fprintf (stderr, "ERROR: can't lock file %s\n", catalog.filename);
-	exit (1);
-      case 1: // file is now locked
-	gcatalog (&catalog, TRUE); /* load from disk */
-	break;
-      case 2: // file is empty
-	if (VERBOSE) fprintf (stderr, "no data in file %s, skipping\n", catalog.filename);
-	unlock_catalog (&catalog);
+
+    catalog.catformat = dvo_catalog_catformat (CATFORMAT);    // set the default catformat from config data
+    catalog.catmode   = dvo_catalog_catmode (CATMODE);        // set the default catmode from config data
+    catalog.catflags  = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
+
+    if (!dvo_catalog_open (&catalog, skylist[0].regions[i], VERBOSE, "w")) {
+      fprintf (stderr, "ERROR: failure reading catalog %s\n", catalog.filename);
+      exit (1);
+    }
+    if (VERBOSE && (catalog.Nave_disk == 0)) {
+	fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
+	dvo_catalog_unlock (&catalog);
+	dvo_catalog_free (&catalog);
 	continue;
-      default:
-	fprintf (stderr, "weird lock_catalog exit state %s\n", catalog.filename);
-	exit (1);
     }
+
     initImageBins  (&catalog, 1);
     initMosaicBins (&catalog, 1);
@@ -43,6 +44,7 @@
 
     setMrelFinal (&catalog);
-    wcatalog (&catalog); 
-    unlock_catalog (&catalog);
+    dvo_catalog_save (&catalog, VERBOSE); 
+    dvo_catalog_unlock (&catalog);
+    dvo_catalog_free (&catalog);
 
     freeImageBins (1);
Index: trunk/Ohana/src/relphot/src/relphot.c
===================================================================
--- trunk/Ohana/src/relphot/src/relphot.c	(revision 8385)
+++ trunk/Ohana/src/relphot/src/relphot.c	(revision 8386)
@@ -88,5 +88,5 @@
 
   /* at this point, we have correct cal coeffs in the image/mosaic structures */
-  free_catalogs (catalog, Ncatalog);
+  for (i = 0; i < Ncatalog; i++) dvo_catalog_free (&catalog[i]);
   freeImageBins (Ncatalog);
   freeMosaicBins (Ncatalog);
Index: trunk/Ohana/src/relphot/src/sort.c
===================================================================
--- trunk/Ohana/src/relphot/src/sort.c	(revision 8386)
+++ trunk/Ohana/src/relphot/src/sort.c	(revision 8386)
@@ -0,0 +1,182 @@
+# include "relphot.h"
+
+void sortA (double *X, int N) {
+
+  int l,j,ir,i;
+  double tX;
+  
+  if (N < 2) return;
+
+  l = N >> 1;
+  ir = N - 1;
+  for (;;) {
+    if (l > 0) {
+      l--;
+      tX = X[l];
+    }
+    else {
+      tX = X[ir];
+      X[ir] = X[0];
+      if (--ir == 0) {
+	X[0] = tX;
+	return;
+      }
+    }
+    i = l;
+    j = (l << 1) + 1;
+    while (j <= ir) {
+      if (j < ir && X[j] < X[j+1]) j++;
+      if (tX < X[j]) {
+	X[i] = X[j];
+	j += (i=j) + 1;
+      }
+      else j = ir + 1;
+    }
+    X[i] = tX;
+  }
+}
+
+void sortB (double *X, double *Y, int N) {
+
+  int l,j,ir,i;
+  double tX, tY;
+  
+  if (N < 2) return;
+
+  l = N >> 1;
+  ir = N - 1;
+  for (;;) {
+    if (l > 0) {
+      l--;
+      tX = X[l];
+      tY = Y[l];
+    }
+    else {
+      tX = X[ir];
+      X[ir] = X[0];
+      tY = Y[ir];
+      Y[ir] = Y[0];
+      if (--ir == 0) {
+	X[0] = tX;
+	Y[0] = tY;
+	return;
+      }
+    }
+    i = l;
+    j = (l << 1) + 1;
+    while (j <= ir) {
+      if (j < ir && X[j] < X[j+1]) j++;
+      if (tX < X[j]) {
+	X[i] = X[j];
+	Y[i] = Y[j];
+	j += (i=j) + 1;
+      }
+      else j = ir + 1;
+    }
+    X[i] = tX;
+    Y[i] = tY;
+  }
+}
+
+void sortC (double *X, double *Y, double *F1, double *F2, int N) {
+
+  int l,j,ir,i;
+  double tX, tY;
+  double t1, t2;
+  
+  if (N < 2) return;
+
+  l = N >> 1;
+  ir = N - 1;
+  for (;;) {
+    if (l > 0) {
+      l--;
+      tX = X[l];
+      tY = Y[l];
+      t1 = F1[l];
+      t2 = F2[l];
+    }
+    else {
+      tX = X[ir];
+      X[ir] = X[0];
+      tY = Y[ir];
+      Y[ir] = Y[0];
+      t1 = F1[ir];
+      F1[ir] = F1[0];
+      t2 = F2[ir];
+      F2[ir] = F2[0];
+      if (--ir == 0) {
+	X[0] = tX;
+	Y[0] = tY;
+	F1[0] = t1;
+	F2[0] = t2;
+	return;
+      }
+    }
+    i = l;
+    j = (l << 1) + 1;
+    while (j <= ir) {
+      if (j < ir && X[j] < X[j+1]) j++;
+      if (tX < X[j]) {
+	X[i] = X[j];
+	Y[i] = Y[j];
+	F1[i] = F1[j];
+	F2[i] = F2[j];
+	j += (i=j) + 1;
+      }
+      else j = ir + 1;
+    }
+    X[i] = tX;
+    Y[i] = tY;
+    F1[i] = t1;
+    F2[i] = t2;
+  }
+}
+
+void sortD (double *X, double *Y, double *Z, int N) {
+
+  int l,j,ir,i;
+  double tX, tY, tZ;
+  
+  if (N < 2) return;
+
+  l = N >> 1;
+  ir = N - 1;
+  for (;;) {
+    if (l > 0) {
+      l--;
+      tX = X[l];
+      tY = Y[l];
+      tZ = Z[l];
+    }
+    else {
+      tX = X[ir];
+      X[ir] = X[0];
+      tY = Y[ir];
+      Y[ir] = Y[0];
+      tZ = Z[ir];
+      Z[ir] = Z[0];
+      if (--ir == 0) {
+	X[0] = tX;
+	Y[0] = tY;
+	Z[0] = tZ;
+	return;
+      }
+    }
+    i = l;
+    j = (l << 1) + 1;
+    while (j <= ir) {
+      if (j < ir && X[j] < X[j+1]) j++;
+      if (tX < X[j]) {
+	X[i] = X[j];
+	Y[i] = Y[j];
+	Z[i] = Z[j];
+	j += (i=j) + 1;
+      }
+      else j = ir + 1;
+    }
+    X[i] = tX;
+    Y[i] = tY;
+    Z[i] = tZ;
+  }
+}
