Index: trunk/Ohana/src/gastro2/Makefile
===================================================================
--- trunk/Ohana/src/gastro2/Makefile	(revision 8463)
+++ trunk/Ohana/src/gastro2/Makefile	(revision 8496)
@@ -29,6 +29,4 @@
 
 GASTRO = \
-$(SRC)/getptolemy.$(ARCH).o \
-$(SRC)/gptolemy2.$(ARCH).o \
 $(SRC)/plots.$(ARCH).o \
 $(SRC)/gheader2.$(ARCH).o \
@@ -42,5 +40,4 @@
 $(SRC)/grid.$(ARCH).o \
 $(SRC)/lumfunc.$(ARCH).o \
-$(SRC)/gregions2.$(ARCH).o \
 $(SRC)/sort.$(ARCH).o \
 $(SRC)/misc.$(ARCH).o \
@@ -52,8 +49,12 @@
 $(SRC)/getusno.$(ARCH).o \
 $(SRC)/getusnob.$(ARCH).o \
-$(SRC)/gcatalog.$(ARCH).o \
+$(SRC)/getptolemy.$(ARCH).o \
+$(SRC)/getgsc.$(ARCH).o \
 $(SRC)/remove_clumps.$(ARCH).o \
 $(SRC)/rfits.$(ARCH).o \
 $(SRC)/rtext.$(ARCH).o
+
+#$(SRC)/gptolemy2.$(ARCH).o \
+#$(SRC)/gregions2.$(ARCH).o \
 
 OBJ = $(GASTRO)
@@ -64,7 +65,4 @@
 
 $(GASTRO): $(INC)/gastro2.h
-
-extr2mass: $(2MASS)
-	$(CC) $(2MASS) -o $(BIN)/extr2mass.linux $(CCFLAGS)
 
 coordtest: $(COORDTEST)
Index: trunk/Ohana/src/gastro2/include/gastro2.h
===================================================================
--- trunk/Ohana/src/gastro2/include/gastro2.h	(revision 8463)
+++ trunk/Ohana/src/gastro2/include/gastro2.h	(revision 8496)
@@ -93,6 +93,4 @@
 int FLIPX, FLIPY;
 int NPOLYTERMS;
-char CDROM[256];
-char USNO_B_DIR[256];
 char CATDIR[256];
 char   CATMODE[16];    /* raw, mef, split, mysql */
@@ -117,8 +115,16 @@
 double F_DEC;
 
-char GSCFILE[256], GSC_DIR[256], LONEOS_REGION_FILE[256];
-char TWO_MASS_DIR[256];
 double ASEC_PIX;
 char ROUGH_ASTROMETRY[64];
+
+/* locations for reference data */
+char GSCFILE[256];
+char GSCDIR[256];
+char CATDIR[256];
+char USNO_A_DIR[256];
+char USNO_B_DIR[256];
+char TWO_MASS_CATDIR[256];
+char ASTROM_CATDIR[256];
+char LONEOS_REGION_FILE[256];
 
 typedef struct {
@@ -143,4 +149,5 @@
 void 	  ahelp ();
 void 	  area_of_region (CatStats *region);
+double    area_of_skyregion (SkyRegion *region);
 void 	  args (int *argc, char **argv, Coords *coords);
 void 	  define_region (CatStats *catstats, CmpCatalog *Target);
@@ -182,6 +189,9 @@
 int 	  mk_vector (int n, int m, int norder);
 int 	  open_graph (int N);
+
 void 	  pair_add (int i1, int i2);
 void 	  pair_init ();
+int       pair_lists (int **index1, int **index2);
+
 int 	  parse_GSC_line (CatStats *tregion, char *line);
 int 	  plot_addpt_gridplot (double x, double y);
Index: trunk/Ohana/src/gastro2/src/ConfigInit.c
===================================================================
--- trunk/Ohana/src/gastro2/src/ConfigInit.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/ConfigInit.c	(revision 8496)
@@ -15,4 +15,5 @@
   if (VERBOSE) fprintf (stderr, "loaded config file: %s\n", file);
 
+  GASTRO_MAX_NSTARS = 300;
   ScanConfig (config, "OFFSET_RADIUS",     "%lf", 0, &SEARCH_RADIUS);
   ScanConfig (config, "MIN_MATCHES",       "%d",  0, &MIN_MATCHES);
@@ -34,6 +35,4 @@
   ScanConfig (config, "POLAR_ALIGNMENT",   "%d",  0, &POLAR_ALIGNMENT);
   ScanConfig (config, "GSCFILE",           "%s",  0, GSCFILE);
-  ScanConfig (config, "GSCDIR",            "%s",  0, GSC_DIR);
-  ScanConfig (config, "2MASS_DIR",         "%s",  0, TWO_MASS_DIR);
   ScanConfig (config, "POLAR_AXIS_RA",     "%lf", 0, &POLE_RA);
   ScanConfig (config, "POLAR_AXIS_DEC",    "%lf", 0, &POLE_DEC);
@@ -41,6 +40,14 @@
   ScanConfig (config, "DEC_OFFSET",        "%lf", 0, &DEC_OFFSET);
   ScanConfig (config, "LONEOS_REGIONS",    "%s",  0, LONEOS_REGION_FILE);
-  ScanConfig (config, "USNO_CDROM",        "%s",  0, CDROM);
+
+  /* possible sources of astrometric reference data */
+  if (!ScanConfig (config, "USNO_A_DIR",             "%s",  0, USNO_A_DIR)) {
+    ScanConfig (config, "USNO_CDROM",             "%s",  0, USNO_A_DIR);
+  }
   ScanConfig (config, "USNO_B_DIR",        "%s",  0, USNO_B_DIR);
+  ScanConfig (config, "ASTROM_CATDIR",     "%s",  0, ASTROM_CATDIR);
+  ScanConfig (config, "2MASS_CATDIR",      "%s",  0, TWO_MASS_CATDIR);
+  ScanConfig (config, "GSCDIR",            "%s",  0, GSCDIR);
+
   ScanConfig (config, "ASTRO_REFCAT",      "%s",  0, REFCAT);
   ScanConfig (config, "CATDIR",            "%s",  0, CATDIR);
Index: trunk/Ohana/src/gastro2/src/extr2mass.c
===================================================================
--- trunk/Ohana/src/gastro2/src/extr2mass.c	(revision 8463)
+++ 	(revision )
@@ -1,183 +1,0 @@
-# include "gastro2.h"
-
-# define NDECLIST 24
-double DecList[] = {-90.0, -82.5, -75.0, -67.5, -60.0, -52.5, -45.0, -37.5, -30.0, -22.5, -15.0, -7.5, 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};
-
-typedef struct {
-  char name[256];
-  float rmin, rmax;
-  int Nstar, Nbyte, Ncbyte;
-} TwoMassAcc;
-
-int main (int argc, char **argv) {
-
-  int i, j, k, Nregions;
-  TwoMassAcc acc[49];
-  CatStats patch, *regions;
-  char line[1024], filename[256], saveline[1024], *path, *Fullpath, *Basename, *Pathname;
-  FILE *f, *fout;
-  int status, done, Nacc, Nstar, NSTAR, Nout, Nscan;
-  double *ra, *dec, *mag, DecMin, DecMax;
-
-  ConfigInit (&argc, argv);
-
-  if (argc != 5) {
-    fprintf (stderr, "USAGE: extr2mass (input) (acc) (outdir) (gsctbl)\n");
-    exit (2);
-  }
-  
-  /* load accelerator file */
-  f = fopen (argv[2], "r");
-  if (f == (FILE *) NULL) {
-    fprintf (stderr, "can't load accelerator file %s\n", argv[2]);
-    return (FALSE);
-  }
-  for (i = 0; i < 49; i++) {
-    status = fscanf (f, "%s %f %f %d %d %d", acc[i].name, &acc[i].rmin, &acc[i].rmax,
-	    &acc[i].Nstar, &acc[i].Nbyte, &acc[i].Ncbyte);
-    if (status != 6) { 
-      fprintf (stderr, "ERROR: can't read 2Mass accelerator file\n");
-      return (FALSE);
-    }
-    acc[i].rmin *= 15.0;
-    acc[i].rmax *= 15.0;
-  }
-  fclose (f);
-
-  /* find file in acc file */
-  Nacc = -1;
-  for (i = 0; (Nacc == -1) && (i < 49); i++) {
-    if (!strcmp (argv[1], acc[i].name)) Nacc = i; 
-  }
-  if (Nacc == -1) {
-    fprintf (stderr, "can't find file in acc file\n");
-    exit (1);
-  }
-
-  fprintf (stderr, "reading from %s, %d stars\n", acc[Nacc].name, acc[Nacc].Nstar);
-
-  /* load 2mass data file */
-  /*
-  sprintf (line, "gzip -cd %s > %s", acc[Nacc].name, acc[Nacc].name);
-  system (line);
-  */
-  
-  sprintf (line, "gzip -cd %s", acc[Nacc].name);
-  f = popen (line, "r");
-  if (f == (FILE *) NULL) {
-    fprintf (stderr, "ERROR: can't read 2Mass data file: %s\n", line);
-    return (FALSE);
-  }
-
-  /* all data in 2mass file are sequential in DEC.  read stars while in dec range */
-
-  /* load data in DEC blocks */
-  saveline[0] = 0;
-  for (i = 0; i < NDECLIST; i++) {
-    
-    Nstar = 0;
-    NSTAR = 1000;
-    ALLOCATE (ra, double, NSTAR);
-    ALLOCATE (dec, double, NSTAR);
-    ALLOCATE (mag, double, NSTAR);
-    
-    DecMin = DecList[i];
-    DecMax = DecList[i+1];
-
-    done = FALSE;
-    while (!done) {
-      if (saveline[0]) {
-	strcpy (line, saveline);
-	saveline[0] = 0;
-      } else {
-	if (scan_line (f, line) == EOF) { goto escape; }
-      }
-      Nscan = sscanf (line, "%lf %lf %*s %*s %*s %*s %lf", &ra[Nstar], &dec[Nstar], &mag[Nstar]);
-      if (Nscan != 3) { 
-	fprintf (stderr, "read wrong number of entries: %d\n", Nscan);
-	fprintf (stderr, "%s\n", line);
-	exit (1);
-      }
-      if (dec[Nstar] > DecMax) {
-	strcpy (saveline, line);
-	goto escape; 
-      } 
-      Nstar ++;
-      if (Nstar == NSTAR) {
-	NSTAR += 1000;
-	REALLOCATE (ra, double, NSTAR);
-	REALLOCATE (dec, double, NSTAR);
-	REALLOCATE (mag, double, NSTAR);
-      }
-      if (Nstar > acc[Nacc].Nstar) {
-	fprintf (stderr, "problem!\n %s\n", line);
-	exit (1);
-      }
-    }
-  escape:
-      
-    fprintf (stderr, "read %d stars for DEC block %f %f\n", Nstar, DecMin, DecMax);
-
-    /* now we write the Nstar objects to the appropriate files */
-    patch.RA[0] = acc[Nacc].rmin;
-    patch.RA[1] = acc[Nacc].rmax;
-    patch.DEC[0] = DecMin;
-    patch.DEC[1] = DecMax;
-    
-    regions = gregions (&patch, &Nregions);
-    
-    for (j = 0; j < Nregions; j++) {
-      /* name has complete path to gsc, strip off path - 1 */
-      Fullpath = pathname (regions[j].name);
-      Basename = filebasename (regions[j].name);
-      Pathname = filebasename (Fullpath);
-      sprintf (filename, "%s/%s/%s", argv[3], Pathname, Basename);
-
-      path = pathname (filename);
-      mkdirhier (path, S_IRWXU | S_IRWXG | S_IRWXO);
-      
-      fout = fopen (filename, "a+");
-      if (fout == (FILE *) NULL) {
-	fprintf (stderr, "can't open output file %s\n", filename);
-	exit (1);
-      }
-
-      Nout = 0;
-      for (k = 0; k < Nstar; k++) {
-	if (ra[k] < regions[j].RA[0]) continue;
-	if (ra[k] >= regions[j].RA[1]) continue;
-	if (dec[k] < regions[j].DEC[0]) continue;
-	if (dec[k] >= regions[j].DEC[1]) continue;
-	fprintf (fout, "%8.4f %8.4f %4.1f\n", ra[k], dec[k], mag[k]);
-	Nout ++;
-      }
-      if (Nout > 0) {
-	fprintf (stderr, "wrote %d stars to %s\n", Nout, filename);
-      }
-      
-      free (path);
-      free (Fullpath);
-      free (Basename);
-      free (Pathname);
-      fclose (fout);
-    }
-
-    free (ra);
-    free (dec);
-    free (mag);
-  }
-
-  fclose (f);
-  exit (0);
-}
-
-
-void area_of_region (CatStats *region) {
-  
-  double area;
-
-  area = DEG_RAD*(region[0].RA[1] - region[0].RA[0])*(sin(region[0].DEC[1]*RAD_DEG) - sin(region[0].DEC[0]*RAD_DEG));
-  region[0].Area = area;
-}
-
Index: trunk/Ohana/src/gastro2/src/gcatalog.c
===================================================================
--- trunk/Ohana/src/gastro2/src/gcatalog.c	(revision 8463)
+++ 	(revision )
@@ -1,125 +1,0 @@
-# include "gastro2.h"
-CatStats *gregions (CatStats *patch, int *nregion);
-GSCdata *gcatalog (char *filename, int *Nstars);
-
-int get2mass (CatStats *catstats, RefCatalog *Ref) {
-  
-  int i, j, k, Ns, Ngsc, Nregions; 
-  GSCdata *gsc;
-  CatStats *regions;
-
-  Ref[0].N = 0;
-  Ref[0].Area = 0;
-  ALLOCATE (Ref[0].stars, StarData, 1);
-
-  set_catalog (TWO_MASS_DIR);
-  regions = gregions (catstats, &Nregions);
-  
-  for (i = 0; i < Nregions; i++) {
-    gsc = gcatalog (regions[i].name, &Ngsc);
-
-    Ns = Ref[0].N;
-    Ref[0].N += Ngsc;
-    Ref[0].Area += regions[i].Area;
-
-    REALLOCATE (Ref[0].stars, StarData, MAX (1, Ref[0].N));
-    for (k = Ns, j = 0; j < Ngsc; k++, j++) {
-      Ref[0].stars[k].R = gsc[j].R;
-      Ref[0].stars[k].D = gsc[j].D;
-      Ref[0].stars[k].M = gsc[j].M;
-    }      
-  }
-  
-  Ref[0].R0 = catstats[0].RA[0];
-  Ref[0].R1 = catstats[0].RA[1];
-  Ref[0].D0 = catstats[0].DEC[0];
-  Ref[0].D1 = catstats[0].DEC[1];
-
-  /* calculate luminosity function of stars */
-  get_luminosity_func (Ref[0].stars, Ref[0].N, &Ref[0].lum);
-
-  if (VERBOSE) fprintf (stderr, "%d stars from 2MASS\n", Ref[0].N);
-  return (TRUE);
-}  
-
-int getgsc (CatStats *catstats, RefCatalog *Ref) {
-  
-  int i, j, k, Ns, Ngsc, Nregions; 
-  GSCdata *gsc;
-  CatStats *regions;
-
-  Ref[0].N = 0;
-  Ref[0].Area = 0;
-  ALLOCATE (Ref[0].stars, StarData, 1);
-
-  set_catalog (GSC_DIR);
-  regions = gregions (catstats, &Nregions);
-  
-  for (i = 0; i < Nregions; i++) {
-    gsc = gcatalog (regions[i].name, &Ngsc);
-
-    Ns = Ref[0].N;
-    Ref[0].N += Ngsc;
-    Ref[0].Area += regions[i].Area;
-
-    REALLOCATE (Ref[0].stars, StarData, MAX (1, Ref[0].N));
-    for (k = Ns, j = 0; j < Ngsc; k++, j++) {
-      Ref[0].stars[k].R = gsc[j].R;
-      Ref[0].stars[k].D = gsc[j].D;
-      Ref[0].stars[k].M = gsc[j].M;
-    }      
-  }
-  
-  Ref[0].R0 = catstats[0].RA[0];
-  Ref[0].R1 = catstats[0].RA[1];
-  Ref[0].D0 = catstats[0].DEC[0];
-  Ref[0].D1 = catstats[0].DEC[1];
-
-  /* calculate luminosity function of stars */
-  get_luminosity_func (Ref[0].stars, Ref[0].N, &Ref[0].lum);
-
-  if (VERBOSE) fprintf (stderr, "%d stars from HST GSC\n", Ref[0].N);
-  return (TRUE);
-}  
-
-# define BYTES_STAR 23
-# define BLOCK 1000
-GSCdata *gcatalog (char *filename, int *Nstars) {
-  
-  GSCdata *stars;
-  int i, NSTAR, nstar, Nbytes, nbytes;
-  char *buffer;
-  FILE *f;
-
-  f = fopen (filename, "r");
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: can't find catalog file %s\n", filename);
-    exit (1);
-  }
-  
-  nstar = 0;
-  NSTAR = 1000;
-  ALLOCATE (stars, GSCdata, NSTAR);
-
-  ALLOCATE (buffer, char, (BLOCK*BYTES_STAR));
-  Nbytes = BLOCK*BYTES_STAR;
-
-  while ((nbytes = fread (buffer, 1, Nbytes, f)) > 0) {
-    for (i = 0; i < nbytes / BYTES_STAR; i++) {
-      dparse (&stars[nstar].R, 1, &buffer[i*BYTES_STAR]);
-      dparse (&stars[nstar].D, 2, &buffer[i*BYTES_STAR]);
-      dparse (&stars[nstar].M, 3, &buffer[i*BYTES_STAR]);
-      nstar++;
-      if (nstar == NSTAR) {
-	NSTAR += 1000;
-	REALLOCATE (stars, GSCdata, NSTAR);
-      }
-    }
-  }
-
-  free (buffer);
-
-  *Nstars = nstar;
-  return (stars);
-}
-
Index: trunk/Ohana/src/gastro2/src/getgsc.c
===================================================================
--- trunk/Ohana/src/gastro2/src/getgsc.c	(revision 8496)
+++ trunk/Ohana/src/gastro2/src/getgsc.c	(revision 8496)
@@ -0,0 +1,95 @@
+# include "gastro2.h"
+
+GSCdata *rd_gsc (char *filename, int *Nstars);
+
+int getgsc (CatStats *catstats, RefCatalog *Ref) {
+  
+  int i, j, k, Ns, Ngsc; 
+  GSCdata *gsc;
+  SkyList *skylist;
+  SkyTable *sky;
+  SkyRegion patch;
+
+  Ref[0].N = 0;
+  Ref[0].Area = 0;
+  ALLOCATE (Ref[0].stars, StarData, 1);
+
+  patch.Rmin = catstats[0].RA[0];
+  patch.Rmax = catstats[0].RA[1];
+  patch.Dmin = catstats[0].DEC[0];
+  patch.Dmax = catstats[0].DEC[1];
+
+  /* load regions from GSC table, restrict to patch */
+  sky = SkyTableFromGSC (GSCFILE, 3, VERBOSE);
+  SkyTableSetFilenames (sky, GSCDIR, "cpt");
+  skylist = SkyListByPatch (sky, -1, &patch);
+  
+  for (i = 0; i < skylist[0].Nregions; i++) {
+    gsc = rd_gsc (skylist[0].filename[i], &Ngsc);
+
+    Ns = Ref[0].N;
+    Ref[0].N += Ngsc;
+    Ref[0].Area += area_of_skyregion (skylist[0].regions[i]);
+
+    REALLOCATE (Ref[0].stars, StarData, MAX (1, Ref[0].N));
+    for (k = Ns, j = 0; j < Ngsc; k++, j++) {
+      Ref[0].stars[k].R = gsc[j].R;
+      Ref[0].stars[k].D = gsc[j].D;
+      Ref[0].stars[k].M = gsc[j].M;
+    }      
+    free (gsc);
+  }
+  SkyTableFree (sky);
+  
+  Ref[0].R0    = catstats[0].RA[0];
+  Ref[0].R1    = catstats[0].RA[1];
+  Ref[0].D0    = catstats[0].DEC[0];
+  Ref[0].D1    = catstats[0].DEC[1];
+
+  /* calculate luminosity function of stars */
+  get_luminosity_func (Ref[0].stars, Ref[0].N, &Ref[0].lum);
+
+  if (VERBOSE) fprintf (stderr, "%d stars from HST GSC\n", Ref[0].N);
+  return (TRUE);
+}  
+
+# define BYTES_STAR 23
+# define BLOCK 1000
+GSCdata *rd_gsc (char *filename, int *Nstars) {
+  
+  GSCdata *stars;
+  int i, NSTAR, nstar, Nbytes, nbytes;
+  char *buffer;
+  FILE *f;
+
+  f = fopen (filename, "r");
+  if (f == NULL) {
+    fprintf (stderr, "ERROR: can't find catalog file %s\n", filename);
+    exit (1);
+  }
+  
+  nstar = 0;
+  NSTAR = 1000;
+  ALLOCATE (stars, GSCdata, NSTAR);
+
+  ALLOCATE (buffer, char, (BLOCK*BYTES_STAR));
+  Nbytes = BLOCK*BYTES_STAR;
+
+  while ((nbytes = fread (buffer, 1, Nbytes, f)) > 0) {
+    for (i = 0; i < nbytes / BYTES_STAR; i++) {
+      dparse (&stars[nstar].R, 1, &buffer[i*BYTES_STAR]);
+      dparse (&stars[nstar].D, 2, &buffer[i*BYTES_STAR]);
+      dparse (&stars[nstar].M, 3, &buffer[i*BYTES_STAR]);
+      nstar++;
+      if (nstar == NSTAR) {
+	NSTAR += 1000;
+	REALLOCATE (stars, GSCdata, NSTAR);
+      }
+    }
+  }
+
+  free (buffer);
+
+  *Nstars = nstar;
+  return (stars);
+}
Index: trunk/Ohana/src/gastro2/src/getptolemy.c
===================================================================
--- trunk/Ohana/src/gastro2/src/getptolemy.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/getptolemy.c	(revision 8496)
@@ -1,10 +1,13 @@
 # include "gastro2.h"
+double catalog_area (Average *average, int Naverage, SkyRegion *region);
 
 int getptolemy (CatStats *catstats, RefCatalog *Ref) {
   
-  int i, j, k, Ns, Nptolemy, Nregions; 
+  int i, j, k, Ns; 
   double FracArea;
-  GSCdata *ptolemy;
-  CatStats *regions;
+  Catalog catalog;
+  SkyList *skylist;
+  SkyTable *sky;
+  SkyRegion patch;
 
   Ref[0].N = 0;
@@ -12,30 +15,53 @@
   ALLOCATE (Ref[0].stars, StarData, 1);
 
-  regions = gregions (catstats, &Nregions);
+  patch.Rmin = catstats[0].RA[0];
+  patch.Rmax = catstats[0].RA[1];
+  patch.Dmin = catstats[0].DEC[0];
+  patch.Dmax = catstats[0].DEC[1];
+
+  /* load regions from GSC table, restrict to patch */
+  sky = SkyTableFromGSC (GSCFILE, 3, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+  skylist = SkyListByPatch (sky, -1, &patch);
   
-  for (i = 0; i < Nregions; i++) {
-    ptolemy = gptolemy (regions[i].name, &Nptolemy);
-    if (Nptolemy == 0) continue;
+  for (i = 0; i < skylist[0].Nregions; i++) {
+    // set the parameters which guide catalog open/load/create
+    catalog.filename  = skylist[0].filename[i];
+    catalog.catflags  = LOAD_AVES | LOAD_MEAS;
+    catalog.Nsecfilt  = 0;
 
-    // XXX this measurement adjusts a DVO database for 
-    // partial coverage; the correction is bogus if the
-    // sky density of the catalog is too low (<< 100 stars
-    // per field
+    // an error exit status here is a significant error
+    if (!dvo_catalog_open (&catalog, skylist[0].regions[i], VERBOSE, "w")) {
+      fprintf (stderr, "ERROR: failure to open catalog file %s\n", catalog.filename);
+      exit (2);
+    }
+    dvo_catalog_unlock (&catalog);
+
+    // Nave_disk == 0 implies an empty catalog file
+    // for only_match, skip empty catalogs
+    if (!catalog.Nave_disk) {
+      dvo_catalog_free (&catalog);
+      continue;
+    }
+
+    // this measurement adjusts a DVO database for partial coverage
+    // XXX the correction is bogus if the sky density of the catalog 
+    // is too low (<< 100 stars per field)
     FracArea = 1.0;
     if (PTOLEMY_FILL_FACTOR) {
-	FracArea = ptolemy_area (ptolemy, Nptolemy, &regions[i]);
+      FracArea = catalog_area (catalog.average, catalog.Naverage, skylist[0].regions[i]);
     } 
 
     Ns = Ref[0].N;
-    Ref[0].N += Nptolemy;
-    Ref[0].Area += regions[i].Area * FracArea;
+    Ref[0].N += catalog.Naverage;
+    Ref[0].Area += FracArea * area_of_skyregion (skylist[0].regions[i]);
 
     REALLOCATE (Ref[0].stars, StarData, MAX (1, Ref[0].N));
-    for (k = Ns, j = 0; j < Nptolemy; k++, j++) {
-      Ref[0].stars[k].R = ptolemy[j].R;
-      Ref[0].stars[k].D = ptolemy[j].D;
-      Ref[0].stars[k].M = ptolemy[j].M;
+    for (k = Ns, j = 0; j < catalog.Naverage; k++, j++) {
+      Ref[0].stars[k].R = catalog.average[j].R;
+      Ref[0].stars[k].D = catalog.average[j].D;
+      Ref[0].stars[k].M = catalog.measure[catalog.average[j].offset].M_PS;
     }      
-    free (ptolemy);
+    dvo_catalog_free (&catalog);
   }
   
@@ -52,5 +78,5 @@
 }  
 
-double ptolemy_area (GSCdata *ptolemy, int N, CatStats *patch) {
+double catalog_area (Average *average, int Naverage, SkyRegion *region) {
 
   int i, xb, yb, Nb;
@@ -58,8 +84,8 @@
   double frac, Rmin, Rmax, Dmin, Dmax, dR, dD;
 
-  Rmin = patch[0].RA[0];
-  Rmax = patch[0].RA[1];
-  Dmin = patch[0].DEC[0];
-  Dmax = patch[0].DEC[1];
+  Rmin = region[0].Rmin;
+  Rmax = region[0].Rmax;
+  Dmin = region[0].Dmin;
+  Dmax = region[0].Dmax;
   dR = Rmax - Rmin;
   dD = Dmax - Dmin;
@@ -71,7 +97,7 @@
   }
 
-  for (i = 0; i < N; i++) {
-    xb = MAX (MIN (0, 10 * (ptolemy[i].R - Rmin) / dR), 9);
-    yb = MAX (MIN (0, 10 * (ptolemy[i].D - Dmin) / dD), 9);
+  for (i = 0; i < Naverage; i++) {
+    xb = MAX (MIN (0, 10 * (average[i].R - Rmin) / dR), 9);
+    yb = MAX (MIN (0, 10 * (average[i].D - Dmin) / dD), 9);
     bin[xb][yb] ++;
   }
Index: trunk/Ohana/src/gastro2/src/getusno.c
===================================================================
--- trunk/Ohana/src/gastro2/src/getusno.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/getusno.c	(revision 8496)
@@ -15,5 +15,5 @@
   float hours[100];
   int start[100], number[100], *buffer, *buf;
-  char filename[128], c;
+  char filename[128];
   FILE *f;
   double DEC1;
@@ -49,22 +49,15 @@
     }
     if (disk < 0) {
-      fprintf (stderr, "ERROR: can't find cdrom for spd %d\n",  spd);
+      fprintf (stderr, "ERROR: can't find USNO zone for spd %d\n",  spd);
       exit (0);
     }
     
     /* load accelerator file */
-    sprintf (filename, "%s/zone%04d.acc", CDROM, spd); 
+    sprintf (filename, "%s/zone%04d.acc", USNO_A_DIR, spd); 
     fprintf (stderr, "reading from %s\n", filename);
     f = fopen (filename, "r");
     if (f == (FILE *) NULL) {
-      fprintf (stderr, "can't open file %s, is cdrom %d in drive?\n", filename, disk);
-      fprintf (stderr, "press return when ready to continue: ");
-      fscanf (stdin, "%c", &c);
-      fprintf (stderr, "trying again...\n");
-      f = fopen (filename, "r");
-      if (f == (FILE *) NULL) {
-	fprintf (stderr, "ERROR: can't open file %s, is cdrom %d in drive?\n", filename, disk);
-	exit (1);  
-      }
+      fprintf (stderr, "ERROR: can't open accelerator file %s\n", filename);
+      exit (1);  
     }
     for (i = 0; fscanf (f, "%f %d %d", &hours[i], &start[i], &number[i]) != EOF; i++);
@@ -84,5 +77,5 @@
     
     /* open data file */
-    sprintf (filename, "%s/zone%04d.cat", CDROM, spd);
+    sprintf (filename, "%s/zone%04d.cat", USNO_A_DIR, spd);
     fprintf (stderr, "reading from %s\n", filename);
     f = fopen (filename, "r");
Index: trunk/Ohana/src/gastro2/src/getusnob.c
===================================================================
--- trunk/Ohana/src/gastro2/src/getusnob.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/getusnob.c	(revision 8496)
@@ -1,4 +1,6 @@
 # include "gastro2.h"
 # define NZONE 180
+# define NBYTE   4
+# define NELEM  20
 
 int getusnob (CatStats *catstats, RefCatalog *Ref, double epoch) {
@@ -8,5 +10,5 @@
   float hours[100];
   int start[100], number[100], *buffer, *buf;
-  char filename[128], c;
+  char filename[128];
   FILE *f;
   double DEC1;
@@ -14,5 +16,5 @@
   float mB1, mB2, mR1, mR2, mB, mR;
   int iDEC0, iDEC1, iRA0, iRA1;
-  int spd, spd_start, spd_end, disk;
+  int spd, spd_start, spd_end;
   int NUSNO, Nusno, Nstars;
   StarData *stars;
@@ -42,16 +44,9 @@
     /* load accelerator file */
     sprintf (filename, "%s/%03d/b%04d.acc", USNO_B_DIR, (int)(spd/10), spd); 
-    fprintf (stderr, "reading from %s\n", filename);
+    if (VERBOSE) fprintf (stderr, "reading from %s\n", filename);
     f = fopen (filename, "r");
     if (f == (FILE *) NULL) {
-      fprintf (stderr, "can't open file %s, is cdrom %d in drive?\n", filename, disk);
-      fprintf (stderr, "press return when ready to continue: ");
-      fscanf (stdin, "%c", &c);
-      fprintf (stderr, "trying again...\n");
-      f = fopen (filename, "r");
-      if (f == (FILE *) NULL) {
-	fprintf (stderr, "ERROR: can't open file %s, is cdrom %d in drive?\n", filename, disk);
-	exit (1);  
-      }
+      fprintf (stderr, "ERROR: can't open accelerator file %s\n", filename);
+      exit (1);  
     }
     for (i = 0; fscanf (f, "%f %d %d", &hours[i], &start[i], &number[i]) != EOF; i++);
@@ -71,6 +66,6 @@
     
     /* open data file */
-    sprintf (filename, "%s/zone%04d.cat", CDROM, spd);
-    fprintf (stderr, "reading from %s\n", filename);
+    sprintf (filename, "%s/%03d/b%04d.cat", USNO_B_DIR, (int)(spd/10), spd); 
+    if (VERBOSE) fprintf (stderr, "reading from %s\n", filename);
     f = fopen (filename, "r");
     if (f == (FILE *) NULL) {
@@ -79,7 +74,7 @@
     }
 
+    /** USNO-B consists of 20 x 4byte (int) records **/
     /* advance file pointer to first slice */
-    /**** 80 is record-length for USNO-B ****/
-    offset = 80*sizeof(int)*(start[first] - 1);
+    offset = NELEM*NBYTE*(start[first] - 1);
     fseek (f, offset, SEEK_SET);
 
@@ -89,9 +84,11 @@
       Nstars += number[bin];
     }
-    Nitems = 80*Nstars/4;  /* number of integer blocks; need to use Fread for byte-swapping read */
+    Nitems = NELEM*Nstars;  /* number of integer blocks; need to use Fread for byte-swapping read */
 
     /* allocate space for stars in segment */
     ALLOCATE (buffer, int, Nitems);
-    nitems = Fread (buffer, sizeof(int), Nitems, f, "int");
+    // data has the WRONG byte order?
+    // nitems = Fread (buffer, sizeof(int), Nitems, f, "int");
+    nitems = fread (buffer, sizeof(int), Nitems, f);
     if (nitems != Nitems) {
       fprintf (stderr, "ERROR: failure reading data from file %s\n", filename);
@@ -101,5 +98,5 @@
     buf = buffer;
     /* print out data from slice within RA and DEC range */
-    for (i = 0; i < Nstars; i++, buf+=20) {
+    for (i = 0; i < Nstars; i++, buf += NELEM) {
       if (buf[0] < iRA0) continue;
       if (buf[0] > iRA1) continue;
Index: trunk/Ohana/src/gastro2/src/gfit2.c
===================================================================
--- trunk/Ohana/src/gastro2/src/gfit2.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/gfit2.c	(revision 8496)
@@ -76,5 +76,6 @@
   if (PLOTSTUFF) fprintf (stderr, "ploting resid (2)\n");
   plot_resid_init (0, (double) Target[0].header.Naxis[0]);
-  plot_resid_init (1, (double) Target[0].header.Naxis[1]);
+  // XXX test: plotting fit_apply and RD_to_XY results plot_resid_init (1, (double) Target[0].header.Naxis[1]);
+  plot_resid_init (1, (double) Target[0].header.Naxis[0]);
   if (PLOTSTUFF) plot_resid (st, sr, &Target[0].coords);
   free (idx1);
Index: trunk/Ohana/src/gastro2/src/gptolemy2.c
===================================================================
--- trunk/Ohana/src/gastro2/src/gptolemy2.c	(revision 8463)
+++ 	(revision )
@@ -1,58 +1,0 @@
-# include "gastro2.h"
-
-/* filename has path to GSC, strip off path, use filename with CATDIR path */
-
-GSCdata *gptolemy (char *fullpath, int *Nstars) {
-  
-  int i, nstar;
-  char filename[256], *fileroot, *filepath, *subdir;
-  Catalog catalog;
-  GSCdata *stars;
-
-  filepath = pathname (fullpath);
-  fileroot = filebasename (fullpath);
-  subdir = filebasename (filepath);
-  sprintf (filename, "%s/%s/%s", CATDIR, subdir, fileroot);
-
-  *Nstars = 0;
-  catalog.filename = filename;
-  switch (lock_catalog (&catalog, LCK_SOFT)) {
-    case 0:
-      fprintf (stderr, "can't lock catalog %s\n", filename);
-      return ((GSCdata *)NULL);
-    case 2:
-      fprintf (stderr, "catalog %s is empty\n", filename);
-      return ((GSCdata *)NULL);
-    case 1:
-      break;
-  }
-
-  /* CATMODE and CATFORMAT determined from catalog */
-  catalog.catflags = LOAD_AVES | LOAD_MEAS;
-  if (!load_catalog (&catalog, FALSE)) {
-    fprintf (stderr, "can't load catalog data %s\n", filename);
-    return ((GSCdata *)NULL);
-  }
-  unlock_catalog (&catalog);
-
-  nstar = 0;
-  *Nstars = catalog.Naverage;
-  if (catalog.Naverage == 0) return ((GSCdata *)NULL);
-
-  ALLOCATE (stars, GSCdata, *Nstars);
-
-  /* select all entries, use first magnitude */
-  for (i = 0; i < catalog.Naverage; i++, nstar++) {
-    stars[nstar].R = catalog.average[i].R;
-    stars[nstar].D = catalog.average[i].D;
-    stars[nstar].M = catalog.measure[catalog.average[i].offset].M_PS;
-  }
-
-  free (catalog.average);
-
-  *Nstars = nstar;
-  REALLOCATE (stars, GSCdata, *Nstars);
-  
-  return (stars);
-
-}
Index: trunk/Ohana/src/gastro2/src/greference2.c
===================================================================
--- trunk/Ohana/src/gastro2/src/greference2.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/greference2.c	(revision 8496)
@@ -29,11 +29,11 @@
   /* get stars from 2MASS for the given region -- add PHOTCODE check? */
   if (!strcasecmp (REFCAT, "2MASS")) {
-    strcpy (CATDIR, TWO_MASS_DIR);
+    strcpy (CATDIR, TWO_MASS_CATDIR);
     getptolemy (&catstats, Ref);
-    /* get2mass (&catstats, Ref); */
   }
   
   /* get stars from the DVO CATDIR for the given region */
   if (!strcasecmp (REFCAT, "PTOLEMY")) {
+    strcpy (CATDIR, ASTROM_CATDIR);
     getptolemy (&catstats, Ref);
   }
@@ -44,8 +44,17 @@
   }
 
-  Ref[0].lum.Mz = (2 + log (Ref[0].Area) / log (10.) - Ref[0].lum.Mo) / Ref[0].lum.dNdM;
-  Target[0].lum.Mz = (2 + log (Target[0].Area) / log (10.) - Target[0].lum.Mo) / Target[0].lum.dNdM;
-  Ref[0].Moff = Target[0].lum.Mz - Ref[0].lum.Mz;
-  fprintf (stderr, "mag offset: %f (Areas: %f vs %f)\n", Ref[0].Moff, Target[0].Area, Ref[0].Area);
+  {
+    double Mref, Mtar, logRho;
+
+    /* what is the offset between the two lines at the average magnitude? */
+    Mref = 0.5*(Ref[0].lum.Mmin + Ref[0].lum.Mmax);
+    logRho = Mref * Ref[0].lum.dNdM + Ref[0].lum.Mo - log10(Ref[0].Area);
+    Mtar = (logRho + log10(Ref[0].Area) - Target[0].lum.Mo) / Target[0].lum.dNdM;
+
+    Ref[0].lum.Mz = Mref;
+    Target[0].lum.Mz = Mtar;
+    Ref[0].Moff = Target[0].lum.Mz - Ref[0].lum.Mz;
+    fprintf (stderr, "mag offset: %f (Areas: %f vs %f; log(Rho): %f @ %f mags)\n", Ref[0].Moff, Target[0].Area, Ref[0].Area, logRho, Mref);
+  }
 
   if (PLOTSTUFF) plot_lumfunc (Target, Ref);
@@ -79,4 +88,9 @@
   }
 
+  catstats[0].RA[0] =  360.0;
+  catstats[0].RA[1] =    0.0;
+  catstats[0].DEC[0] = +90.0;
+  catstats[0].DEC[1] = -90.0;
+
   for (x = 0; x <= 1.0; x += 0.5) {
     for (y = 0; y <= 1.0; y += 0.5) {
@@ -98,8 +112,18 @@
   /* is a pole in the image?  if so, include it... */
   status = RD_to_XY (&X, &Y, 0.0, 90.0, &Target[0].coords);
-  if (status) catstats[0].DEC[1] = 90.0;
-
+  if (status) {
+      if (fabs(X - NX*0.5) < (NFIELD + 0.5)*NX) goto not_north;
+      if (fabs(Y - NY*0.5) < (NFIELD + 0.5)*NY) goto not_north;
+      catstats[0].DEC[1] = 90.0;
+  }
+not_north:
+  
   status = RD_to_XY (&X, &Y, 0.0, -90.0, &Target[0].coords);
-  if (status) catstats[0].DEC[0] = -90.0;
+  if (status) {
+      if (fabs(X - NX*0.5) < (NFIELD + 0.5)*NX) goto not_south;
+      if (fabs(Y - NY*0.5) < (NFIELD + 0.5)*NY) goto not_south;
+      catstats[0].DEC[0] = -90.0;
+  }
+not_south:
 
   if (VERBOSE) fprintf (stderr, "full region: %f - %f, %f - %f\n", 
Index: trunk/Ohana/src/gastro2/src/gregions2.c
===================================================================
--- trunk/Ohana/src/gastro2/src/gregions2.c	(revision 8463)
+++ 	(revision )
@@ -1,247 +1,0 @@
-# include "gastro2.h"
-# define MAX_NAME 256
-
-static int Nregion, NREGION;
-static CatStats *region;
-static char *CatDir;
-
-/* data which defines the layout of the regions */
-# define NDECBANDS 12
-double DecBand[] = {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};
-
-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, 0};
-
-int NRaBlocks [] = {48, 47, 45, 43, 40, 36, 32, 28, 21, 15, 9, 3, 0, 
-		    48, 47, 45, 43, 40, 36, 32, 28, 21, 15, 9, 3, 0};
-
-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"};
-
-/* given patch on sky with RA[0] - RA[1] & DEC[0] - DEC[1], return all that fall in range */
-CatStats *gregions (CatStats *patch, int *nregion) {
-  
-  CatStats area;
-  double dtmp;
-  char file[MAX_NAME];
-
-  init_regions ();
-
-  /* force RA[i] to be in range 0 - 360 , DEC[0] < DEC[1] */
-  while (patch[0].RA[0] > 360.0) { patch[0].RA[0] -= 360.0; }
-  while (patch[0].RA[0] < 0.0)   { patch[0].RA[0] += 360.0; }
-  while (patch[0].RA[1] > 360.0) { patch[0].RA[1] -= 360.0; }
-  while (patch[0].RA[1] < 0.0)   { patch[0].RA[1] += 360.0; }
-  if (patch[0].DEC[0] > patch[0].DEC[1]) {
-    dtmp = patch[0].DEC[0];
-    patch[0].DEC[0] = patch[0].DEC[1];
-    patch[0].DEC[1] = dtmp;
-  }
-
-  /* include the pole if dec > 86.25 is included (ADD SOUTH POLE!)  */
-  if (patch[0].DEC[1] > 86.25) {
-    area.RA[0]  =   0.00;
-    area.RA[1]  = 360.00;
-    area.DEC[0] =  86.25;
-    area.DEC[1] =  90.00;
-    sprintf (file, "n8230/pole");
-    area.name = strcreate (file);
-    add_to_regions (&area);
-    free (area.name);
-  }
-  
-  /* if RA[0] > RA[1], split in two passes */
-  if (patch[0].RA[0] > patch[0].RA[1]) {
-    area = patch[0];
-    area.RA[0]  = 0.0;
-    find_dec_bands (&area);
-
-    area = patch[0];
-    area.RA[1]  = 360.0;
-    find_dec_bands (&area);
-  } else {
-    area = patch[0];
-    find_dec_bands (&area);
-  }
-
-  *nregion = Nregion;
-  return (region);
-}
-
-/* given an area [RA[0] - RA[1], DEC[0] - DEC[1],
-   where 0.0 < RA[0] < RA[1] < 360.0 
-   and -90.0 < (DEC[0], DEC[1]) < 90.0 
-   and DEC[0] < DEC[1]
-   search through the dec bands to identify ones which overlap the area */
-
-int find_dec_bands (CatStats *area) {
-
-  int i;
-
-  /* for NORTH region (DecBand[i] < DecBand[i+1]) */
-  for (i = 0; i < NDECBANDS; i++) {
-    if ((area[0].DEC[1] > DecBand[i]) || (area[0].DEC[0] < DecBand[i+1])) {
-      load_ra_blocks (i, area);
-    }
-  }
-
-  /* for SOUTH region (DecBand[i] > DecBand[i+1]) */
-  for (i = NDECBANDS+1; i < 2*NDECBANDS; i++) {
-    if ((area[0].DEC[0] < DecBand[i]) || (area[0].DEC[1] > DecBand[i+1])) {
-      load_ra_blocks (i, area);
-    }
-  }
-  return (TRUE);
-}
-
-/* given the number of a DecBlock and a defined area, return all area names in that block */
-/* area is defined so that RA[0] < RA[1], DEC[0] < DEC[1] */
-int load_ra_blocks (int Ndec, CatStats *area) {
-
-  CatStats tregion;
-  int i, Nlines, Nskip;
-  char *buffer, file[MAX_NAME];
-  FILE *f;
-
-  /* count lines before Dec Band, and in Dec Band */
-  Nskip = 0;
-  for (i = 0; i < Ndec; i++) Nskip += NDecLines[i];
-  Nlines = NDecLines[Ndec];
-
-  ALLOCATE (buffer, char, 48*Nlines);
-  ALLOCATE (tregion.name, char, MAX_NAME);
-
-  /* get data from GSC file */ 
-  f = fopen (GSCFILE, "r");
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: can't find GSC regions file %s\n", GSCFILE);
-    exit (1);
-  }
-  fseek (f, 5*2880 + 48*Nskip, SEEK_SET);
-  fread (buffer, 48*Nlines, 1, f);
-  fclose (f);
-
-  /* find overlapping regions */
-  for (i = 0; i < Nlines; i++) {
-    parse_GSC_line (&tregion, &buffer[i*48]);
-    if (area[0].RA[0] > tregion.RA[1]) continue;
-    if (area[0].RA[1] < tregion.RA[0]) continue;
-    if (area[0].DEC[0] > tregion.DEC[1]) continue;
-    if (area[0].DEC[1] < tregion.DEC[0]) continue;
-    sprintf (file, "%s/%s", Dec2Sections[Ndec], tregion.name);
-    strcpy (tregion.name, file);
-    add_to_regions (&tregion);
-  }
-
-  free (buffer);
-  free (tregion.name);
-  return (TRUE);
-}
-
-/* parse the GSC line, placing values in 'region'. force RA[0] < RA[1], DEC[0] < DEC[1] */
-int parse_GSC_line (CatStats *tregion, char *line) {
-  
-  double v0, s, dtmp;
-  char tmp[10];
-
-  /* copy name (4 chars) */
-  bzero (tregion[0].name, 10);
-  strncpy (tregion[0].name, &line[1], 4);
-
-  /* get RA[0] */
-  bzero (tmp, 10);
-  strncpy (tmp, &line[7], 2);
-  v0 = atof (tmp);
-  
-  bzero (tmp, 10);
-  strncpy (tmp, &line[10], 2);
-  v0 += atof (tmp) / 60.0;
-  
-  bzero (tmp, 10);
-  strncpy (tmp, &line[13], 5);
-  v0 += atof (tmp) / 3600.0;
-  tregion[0].RA[0] = v0 * 15.0;
-
-  /* get RA[1] */
-  bzero (tmp, 10);
-  strncpy (tmp, &line[19], 2);
-  v0 = atof (tmp);
-  
-  bzero (tmp, 10);
-  strncpy (tmp, &line[22], 2);
-  v0 += atof (tmp) / 60.0;
-  
-  bzero (tmp, 10);
-  strncpy (tmp, &line[25], 5);
-  v0 += atof (tmp) / 3600.0;
-  tregion[0].RA[1] = v0 * 15.0;
-
-  /* this only happens at the 0,360 boundary */
-  if (tregion[0].RA[1] < tregion[0].RA[0]) tregion[0].RA[1] += 360.0;
-
-  /* get DEC[0] */
-  if (line[31] == '-') s = -1;
-  else s = +1;
-
-  bzero (tmp, 10);
-  strncpy (tmp, &line[32], 2);
-  v0 = atof (tmp);
-  
-  bzero (tmp, 10);
-  strncpy (tmp, &line[35], 2);
-  v0 += atof (tmp) / 60.0;
-  tregion[0].DEC[0] = s * v0;
-
-  /* get DEC[1] */
-  if (line[40] == '-') s = -1;
-  else s = +1;
-
-  bzero (tmp, 10);
-  strncpy (tmp, &line[41], 2);
-  v0 = atof (tmp);
-  
-  bzero (tmp, 10);
-  strncpy (tmp, &line[44], 2);
-  v0 += atof (tmp) / 60.0;
-  tregion[0].DEC[1] = s * v0;
-
-  if (tregion[0].DEC[0] > tregion[0].DEC[1]) {
-    dtmp = tregion[0].DEC[1];
-    tregion[0].DEC[1] = tregion[0].DEC[0];
-    tregion[0].DEC[0] = dtmp;
-  }
-  return (TRUE);
-}
-
-void init_regions () {
-
-  Nregion = 0;
-  NREGION = 100;
-
-  ALLOCATE (region, CatStats, NREGION);
-
-}
-
-void add_to_regions (CatStats *area) {
-
-  region[Nregion] = area[0];
-  ALLOCATE (region[Nregion].name, char, MAX_NAME);
-  sprintf (region[Nregion].name, "%s/%s.%s", CatDir, area[0].name, "cpt");
-
-  area_of_region (&region[Nregion]);
-
-  Nregion ++;
-
-  if (Nregion == NREGION) {
-    NREGION += 100;
-    REALLOCATE (region, CatStats, NREGION);
-  }
-
-}
-
-void set_catalog (char *catdir) {
-  CatDir = catdir;
-}
Index: trunk/Ohana/src/gastro2/src/lumfunc.c
===================================================================
--- trunk/Ohana/src/gastro2/src/lumfunc.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/lumfunc.c	(revision 8496)
@@ -9,5 +9,5 @@
 int get_luminosity_func (StarData *stars, int N, LumStats *lum) {
 
-  int i, j, Nb;
+  int i, j, Nb, peaki, peakn;
   double mbin[NMBIN];
   double bin[NMBIN], lbin[NMBIN], rbin[NMBIN];
@@ -28,6 +28,16 @@
   }
 
+  /* find peak bin */
+  peaki = 0;
+  peakn = mbin[0];
+  for (i = 0; i < NMBIN; i++) {
+    if (mbin[i] > peakn) {
+      peaki = i;
+      peakn = mbin[i];
+    }
+  }
+
   /* select filled bins */
-  for (Nb = i = 0; i < NMBIN; i++) {
+  for (Nb = i = 0; i < peaki; i++) {
     if (mbin[i] > 0) {
       bin[Nb]  = i * dM + MMIN;
Index: trunk/Ohana/src/gastro2/src/misc.c
===================================================================
--- trunk/Ohana/src/gastro2/src/misc.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/misc.c	(revision 8496)
@@ -35,89 +35,4 @@
 }
 
-/***** convert [-]00:00:00 to 0.0000 ****/
-int dms_to_ddd (double *Value, char *string) {
-  
-  int valid, neg, status;
-  double tmp, value;
-  char *p1, *p2, *px;
-
-  valid = FALSE; 
-  neg = FALSE;
-  stripwhite (string);
-  p1 = string;
-  px = string + strlen(string);
-
-  if (string[0] == '-') { 
-    valid = TRUE; 
-    neg = TRUE;
-    p1 = &string[1];
-  }
-  if (string[0] == '+') { 
-    valid = TRUE; 
-    neg = FALSE;
-    p1 = &string[1];
-  }
-  if (isdigit(string[0])) { 
-    valid = TRUE;
-    p1 = &string[0];
-  }
-  if (!valid) { return (FALSE); }
-
-  status = 1;
-  tmp = strtod (p1, &p2);
-  if (p2 == p1) return (FALSE); /* entry not a number: +fred */
-  value = tmp;
-  if (p2 == px) goto escape;    /* entry only number: +1.0 */ 
-  p1 = p2 + 1;
-
-  tmp = strtod (p1, &p2);
-  if (p2 == p1) goto escape;    /* entry not a number: +1:fred */
-  status = 2;
-  value += tmp / 60.0;
-  if (p2 == px) goto escape;    /* entry only number: +1:1 */
-  p1 = p2 + 1;
-
-  tmp = strtod (p1, &p2);
-  if (p2 == p1) goto escape;    /* entry not a number: +1:1:fred */
-  value += tmp / 3600.0;
-
- escape:
-  if (neg) {
-    value *= -1;
-  }
-  *Value = value;
-
-  return (status);
-}
-
-/**********/
-int str_to_radec (double *ra, double *dec, char *str1, char *str2) {
-
-  double Ra, Dec;
-
-  *ra = *dec = 0;
-  switch (dms_to_ddd (&Ra, str1)) {
-  case 0:
-    fprintf (stderr, "syntax error in RA\n");
-    return (FALSE);
-  case 1:
-    break;
-  case 2:
-    Ra = Ra * 15;
-    break;
-  }
-  switch (dms_to_ddd (&Dec, str2)) {
-  case 0:
-    fprintf (stderr, "syntax error in DEC\n");
-    return (FALSE);
-  case 1:
-  case 2:
-    break;
-  }
-  *ra = Ra;
-  *dec = Dec;
-  return (TRUE);
-}
-
 void area_of_region (CatStats *region) {
   
@@ -126,4 +41,12 @@
   area = DEG_RAD*(region[0].RA[1] - region[0].RA[0])*(sin(region[0].DEC[1]*RAD_DEG) - sin(region[0].DEC[0]*RAD_DEG));
   region[0].Area = area;
+}
+
+double area_of_skyregion (SkyRegion *region) {
+  
+  double area;
+
+  area = DEG_RAD*(region[0].Rmax - region[0].Rmin)*(sin(region[0].Dmax*RAD_DEG) - sin(region[0].Dmin*RAD_DEG));
+  return (area);
 }
 
Index: trunk/Ohana/src/gastro2/src/plots.c
===================================================================
--- trunk/Ohana/src/gastro2/src/plots.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/plots.c	(revision 8496)
@@ -359,6 +359,6 @@
     RD_to_XY (&x, &y, sr[idx2[i]].R, sr[idx2[i]].D, coords);
     
-    dx = x - st[idx1[i]].X;
-    dy = y - st[idx1[i]].Y;
+    dx = st[idx1[i]].X - x;
+    dy = st[idx1[i]].Y - y;
     
     xvect0[i] = st[idx1[i]].X;
@@ -381,6 +381,6 @@
     fit_apply (&x, &y, st[idx1[i]].X, st[idx1[i]].Y);
     
-    dx = 5.0*(x - sr[idx2[i]].P);
-    dy = 5.0*(y - sr[idx2[i]].Q);
+    dx = (x - sr[idx2[i]].P)/coords[0].cdelt1;
+    dy = (y - sr[idx2[i]].Q)/coords[0].cdelt2;
     
     xvect0[i] = st[idx1[i]].X;
Index: trunk/Ohana/src/gastro2/src/plotstuff.c
===================================================================
--- trunk/Ohana/src/gastro2/src/plotstuff.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/plotstuff.c	(revision 8496)
@@ -37,5 +37,5 @@
   status = listen (InitSocket, 1);
   
-  sprintf (temp, "kapa %s &", socket_name);
+  sprintf (temp, "kapa %s -name %d &", socket_name, N);
 # ifndef DEBUG
   system (temp);
Index: trunk/Ohana/src/gastro2/src/polyfit.c
===================================================================
--- trunk/Ohana/src/gastro2/src/polyfit.c	(revision 8463)
+++ trunk/Ohana/src/gastro2/src/polyfit.c	(revision 8496)
@@ -237,9 +237,8 @@
 int fit_adjust (Coords *coords) {
 
-  int i, j, N;
-  double a00, a10, a01, a20, a11, a02, a30, a21, a12, a03, dA;
-  double b00, b10, b01, b20, b11, b02, b30, b21, b12, b03, dB;
+  int i;
+  double a10, a01, a20, a11, a02, a30, a21, a12, a03;
+  double b10, b01, b20, b11, b02, b30, b21, b12, b03;
   double Xo, Yo, det;
-  int Np, Nv;
   double **A, **B, Fx, Fy;
     
