Index: trunk/Ohana/src/relphot/Makefile
===================================================================
--- trunk/Ohana/src/relphot/Makefile	(revision 6994)
+++ trunk/Ohana/src/relphot/Makefile	(revision 7080)
@@ -26,8 +26,5 @@
 $(SRC)/liststats.$(ARCH).o	 \
 $(SRC)/load_images.$(ARCH).o	 \
-$(SRC)/name_region.$(ARCH).o	 \
-$(SRC)/find_images.$(ARCH).o	 \
-$(SRC)/find_regions.$(ARCH).o	 \
-$(SRC)/get_regions.$(ARCH).o	 \
+$(SRC)/select_images.$(ARCH).o	 \
 $(SRC)/load_catalogs.$(ARCH).o	 \
 $(SRC)/gcatalog.$(ARCH).o 	 \
@@ -44,5 +41,4 @@
 $(SRC)/image-db.$(ARCH).o \
 $(SRC)/free_catalogs.$(ARCH).o   \
-$(SRC)/check_permissions.$(ARCH).o   \
 $(SRC)/setMrelFinal.$(ARCH).o 	 \
 $(SRC)/write_coords.$(ARCH).o 	 \
@@ -51,4 +47,11 @@
 $(SRC)/SetSignals.$(ARCH).o 	 \
 $(SRC)/wcatalog.$(ARCH).o
+
+OLD = \
+$(SRC)/find_images.$(ARCH).o	 \
+$(SRC)/find_regions.$(ARCH).o	 \
+$(SRC)/get_regions.$(ARCH).o	 \
+$(SRC)/name_region.$(ARCH).o	 \
+$(SRC)/check_permissions.$(ARCH).o
 
 OBJ = $(RELPHOT)
Index: trunk/Ohana/src/relphot/doc/ChangeLog.txt
===================================================================
--- trunk/Ohana/src/relphot/doc/ChangeLog.txt	(revision 6994)
+++ trunk/Ohana/src/relphot/doc/ChangeLog.txt	(revision 7080)
@@ -1,2 +1,6 @@
+
+- relphot-1-4:
+  * converted to gfits APIs (forces libfits 1.6)
+  * added time range to time selections
 
 - relphot-1-3:
Index: trunk/Ohana/src/relphot/doc/notes.txt
===================================================================
--- trunk/Ohana/src/relphot/doc/notes.txt	(revision 6994)
+++ trunk/Ohana/src/relphot/doc/notes.txt	(revision 7080)
@@ -1,2 +1,10 @@
+
+2006.05.03
+
+  I am upgrading relphot to accept as input an arbitrary region (using
+  the standard ohana SkyRegion concept of a RA & DEC bounded patch on
+  the sky).  This modification has a few implications.  First, the
+  analysis is in fact performed on the populated SkyRegions which
+  overlap the requested area on the sky.
 
 - select different calibration options
Index: trunk/Ohana/src/relphot/include/relphot.h
===================================================================
--- trunk/Ohana/src/relphot/include/relphot.h	(revision 6994)
+++ trunk/Ohana/src/relphot/include/relphot.h	(revision 7080)
@@ -47,4 +47,6 @@
 char   CATFORMAT[16];  /* internal, elixir, loneos, panstarrs */
 char   CameraConfig[256];
+char   SKY_TABLE[256];
+int    SKY_DEPTH;  /** XXX EAM : depth of catalog tables, fix usage */
 
 double MAG_LIM;
@@ -96,4 +98,7 @@
 time_t TSTART, TSTOP;
 
+SkyRegion UserPatch;
+int UserPatchSelect;
+
 # ifdef GRID_V1
 int setGridMeasure (int meas, int cat, double X, double Y);
@@ -111,5 +116,5 @@
 int          *SelectRefMosaic     PROTO((Mosaic **refmosaic, int *Nimage));
 int           args                PROTO((int argc, char **argv));
-int           bcatalog            PROTO((Catalog *subcatalog, Catalog *catalog, GSCRegion *fullregion));
+int           bcatalog            PROTO((Catalog *subcatalog, Catalog *catalog));
 void          clean_images        PROTO(());
 void          clean_measures      PROTO((Catalog *catalog, int Ncatalog, int final));
@@ -122,5 +127,5 @@
 void          findImages          PROTO((Catalog *catalog, int Ncatalog));
 int           findMosaics         PROTO((Catalog *catalog, int Ncatalog));
-Image        *find_images         PROTO((FITS_DB *db, GSCRegion *region, int Nregion, int *Nimage, int **LineNum));
+
 void set_db (FITS_DB *in);
 int Shutdown (char *format, ...);
@@ -129,5 +134,4 @@
 int SetSignals ();
 
-GSCRegion    *find_regions        PROTO((Image *image, int Nimage, int *Nregions, GSCRegion *fullregion));
 void          freeGridBins        PROTO((int Ncatalog));
 void          freeImageBins       PROTO((int Ncatalog));
@@ -140,6 +144,4 @@
 float         getMmos             PROTO((int meas, int cat));
 float         getMrel             PROTO((Catalog *catalog, int meas, int cat));
-GSCRegion    *get_regions         PROTO((double minRa, double maxRa, double minDec, double maxDec, int *Nregions));
-void          getfullregion       PROTO((Image *image, int Nimage, GSCRegion *fullregion));
 Image        *getimage            PROTO((int N));
 Image        *getimages           PROTO((int *N));
@@ -156,11 +158,7 @@
 void          initstats           PROTO((char *mode));
 int           liststats           PROTO((double *value, double *dvalue, int N, StatType *stats));
-Catalog      *load_catalogs       PROTO((GSCRegion *region, int Nregion, GSCRegion *fullregion));
-GSCRegion    *load_images         PROTO((FITS_DB *db, char *seed, int *nregion, GSCRegion *fullregion));
-
-void check_permissions (char *basefile);
-void lock_image_db (FITS_DB *db, char *filename);
-void unlock_image_db (FITS_DB *db);
-void create_image_db (FITS_DB *db);
+Catalog       *load_catalogs      PROTO((SkyList *skylist, int *Ncatalog));
+SkyList      *load_images         PROTO((FITS_DB *db, char *regionName, SkyRegion *region, int RegionSelect));
+Image         *select_images      PROTO((SkyList *skylist, Image *timage, int Ntimage, int **LineNumber, int *Nimage));
 
 int           main                PROTO((int argc, char **argv));
@@ -168,5 +166,4 @@
 void          matchImage          PROTO((Catalog *catalog, int meas, int cat));
 void          matchMosaics        PROTO((Catalog *catalog, int meas, int cat));
-GSCRegion    *name_region         PROTO((char *name, int *Nregions));
 double        opening_angle       PROTO((double x1, double y1, double x2, double y2, double x3, double y3));
 void          plot_chisq          PROTO((Catalog *catalog, int Ncatalog));
@@ -180,5 +177,5 @@
 void          plot_star_coords    PROTO((Catalog *catalog, int Ncatalog));
 void          plot_stars          PROTO((Catalog *catalog, int Ncatalog));
-void          reload_catalogs     PROTO((GSCRegion *region, int Nregion, GSCRegion *fullregion));
+void          reload_catalogs     PROTO((SkyList *skylist));
 int           setExclusions       PROTO((Catalog *catalog, int Ncatalog));
 void          setMcal             PROTO((Catalog *catalog, int Poor));
@@ -211,2 +208,8 @@
 void          wimages             PROTO(());
 void          write_coords        PROTO((Header *header, Coords *coords));
+
+//Image        *find_images         PROTO((FITS_DB *db, GSCRegion *region, int Nregion, int *Nimage, int **LineNum));
+//GSCRegion    *find_regions        PROTO((Image *image, int Nimage, int *Nregions, GSCRegion *fullregion));
+//GSCRegion    *get_regions         PROTO((double minRa, double maxRa, double minDec, double maxDec, int *Nregions));
+//void          getfullregion       PROTO((Image *image, int Nimage, GSCRegion *fullregion));
+//GSCRegion    *name_region         PROTO((char *name, int *Nregions));
Index: trunk/Ohana/src/relphot/src/ConfigInit.c
===================================================================
--- trunk/Ohana/src/relphot/src/ConfigInit.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/ConfigInit.c	(revision 7080)
@@ -34,4 +34,11 @@
   sprintf (ImageCat, "%s/Images.dat", CATDIR);
 
+  if (!ScanConfig (config, "SKY_DEPTH",         "%d",  0, &SKY_DEPTH)) {
+    SKY_DEPTH = 2;
+  }
+  if (!ScanConfig (config, "SKY_TABLE",         "%s",  0, SKY_TABLE)) {
+    SKY_TABLE[0] = 0;
+  }
+
   GetConfig (config, "PHOTCODE_FILE",          "%s",  0, PhotCodeFile);
   GetConfig (config, "ZERO_PT",                "%lf", 0, &ZERO_POINT);
Index: trunk/Ohana/src/relphot/src/GridOps.v1.c
===================================================================
--- trunk/Ohana/src/relphot/src/GridOps.v1.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/GridOps.v1.c	(revision 7080)
@@ -269,62 +269,62 @@
 
   /* create empty phu */
-  fits_init_header (&header);
+  gfits_init_header (&header);
   header.extend = TRUE;
-  fits_create_header (&header);
-  fits_create_matrix (&header, &matrix);
-  fits_modify (&header, "NEXTEND", "%d", 1, Nimage + 3);
-  fits_modify (&header, "FILTER", "%s", 1, photcode[0].name);
-  fits_modify (&header, "COMMENT", "%S", 1, "Mosaic Photometry Grid Analysis");
-  fits_fwrite_header (f, &header);
-  fits_fwrite_matrix (f, &matrix);
-  fits_free_matrix (&matrix);
+  gfits_create_header (&header);
+  gfits_create_matrix (&header, &matrix);
+  gfits_modify (&header, "NEXTEND", "%d", 1, Nimage + 3);
+  gfits_modify (&header, "FILTER", "%s", 1, photcode[0].name);
+  gfits_modify (&header, "COMMENT", "%S", 1, "Mosaic Photometry Grid Analysis");
+  gfits_fwrite_header (f, &header);
+  gfits_fwrite_matrix (f, &matrix);
+  gfits_free_matrix (&matrix);
 
   /* save grid mag values */
-  fits_init_header (&theader);
+  gfits_init_header (&theader);
   theader.Naxes = 2;
   theader.Naxis[0] = gridX;
   theader.Naxis[1] = gridY;
   theader.bitpix   = -32;
-  fits_create_Theader (&theader, "IMAGE");
-  fits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
-  fits_modify (&theader, "EXTNAME", "%s", 1, "MAG_OFFSET");
-  fits_create_matrix  (&theader, &matrix);
+  gfits_create_Theader (&theader, "IMAGE");
+  gfits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
+  gfits_modify (&theader, "EXTNAME", "%s", 1, "MAG_OFFSET");
+  gfits_create_matrix  (&theader, &matrix);
   for (i = 0; i < gridX; i++) {
     for (j = 0; j < gridY; j++) {
-      fits_set_matrix_value (&matrix, i, j, (double) gridM[i + j*gridX]);
+      gfits_set_matrix_value (&matrix, i, j, (double) gridM[i + j*gridX]);
     }
   }
   write_coords (&theader, &refmosaic[0].coords);
-  fits_fwrite_header (f, &theader);
-  fits_fwrite_matrix (f, &matrix);
-  fits_free_matrix (&matrix);
+  gfits_fwrite_header (f, &theader);
+  gfits_fwrite_matrix (f, &matrix);
+  gfits_free_matrix (&matrix);
 
   /* save grid Nmeas values */
-  fits_modify (&theader, "EXTNAME", "%s", 1, "NMEAS");
-  fits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
-  fits_create_matrix  (&theader, &matrix);
+  gfits_modify (&theader, "EXTNAME", "%s", 1, "NMEAS");
+  gfits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
+  gfits_create_matrix  (&theader, &matrix);
   for (i = 0; i < gridX; i++) {
     for (j = 0; j < gridY; j++) {
-      fits_set_matrix_value (&matrix, i, j, (double) gridN[i + j*gridX]);
+      gfits_set_matrix_value (&matrix, i, j, (double) gridN[i + j*gridX]);
     }
   }
   write_coords (&theader, &refmosaic[0].coords);
-  fits_fwrite_header (f, &theader);
-  fits_fwrite_matrix (f, &matrix);
-  fits_free_matrix (&matrix);
+  gfits_fwrite_header (f, &theader);
+  gfits_fwrite_matrix (f, &matrix);
+  gfits_free_matrix (&matrix);
 
   /* save grid sigma values */
-  fits_modify (&theader, "EXTNAME", "%s", 1, "SIGMA");
-  fits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
-  fits_create_matrix  (&theader, &matrix);
+  gfits_modify (&theader, "EXTNAME", "%s", 1, "SIGMA");
+  gfits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
+  gfits_create_matrix  (&theader, &matrix);
   for (i = 0; i < gridX; i++) {
     for (j = 0; j < gridY; j++) {
-      fits_set_matrix_value (&matrix, i, j, (double) gridS[i + j*gridX]);
+      gfits_set_matrix_value (&matrix, i, j, (double) gridS[i + j*gridX]);
     }
   }
   write_coords (&theader, &refmosaic[0].coords);
-  fits_fwrite_header (f, &theader);
-  fits_fwrite_matrix (f, &matrix);
-  fits_free_matrix (&matrix);
+  gfits_fwrite_header (f, &theader);
+  gfits_fwrite_matrix (f, &matrix);
+  gfits_free_matrix (&matrix);
 
   /* calculate value for each CCD pixel, write out CCD images */
@@ -343,9 +343,9 @@
     sprintf (ccdname, "ccd%s", p);
 
-    fits_modify (&theader, "EXTNAME", "%s", 1, ccdname);
-    fits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
-    fits_modify (&theader, "PHOTCODE", "%s", 1, pname);
-    fits_modify (&theader, "NX", "%d", 1, image[i].NX);
-    fits_modify (&theader, "NY", "%d", 1, image[i].NY);
+    gfits_modify (&theader, "EXTNAME", "%s", 1, ccdname);
+    gfits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
+    gfits_modify (&theader, "PHOTCODE", "%s", 1, pname);
+    gfits_modify (&theader, "NX", "%d", 1, image[i].NX);
+    gfits_modify (&theader, "NY", "%d", 1, image[i].NY);
     write_coords (&theader, &image[0].coords);
 
@@ -354,12 +354,12 @@
     theader.Naxis[0] = Nx;
     theader.Naxis[1] = Ny;
-    fits_modify (&theader, "NAXIS1", "%d", 1, Nx);
-    fits_modify (&theader, "NAXIS2", "%d", 1, Ny);
-    fits_create_matrix  (&theader, &matrix);
+    gfits_modify (&theader, "NAXIS1", "%d", 1, Nx);
+    gfits_modify (&theader, "NAXIS2", "%d", 1, Ny);
+    gfits_create_matrix  (&theader, &matrix);
 
     InterpolateGrid ((float *)matrix.buffer, Nx, Ny, &image[0].coords, &refmosaic[0].coords);
-    fits_fwrite_header (f, &theader);
-    fits_fwrite_matrix (f, &matrix);
-    fits_free_matrix (&matrix);
+    gfits_fwrite_header (f, &theader);
+    gfits_fwrite_matrix (f, &matrix);
+    gfits_free_matrix (&matrix);
   }
 }
Index: trunk/Ohana/src/relphot/src/GridOps.v2.c
===================================================================
--- trunk/Ohana/src/relphot/src/GridOps.v2.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/GridOps.v2.c	(revision 7080)
@@ -375,62 +375,62 @@
 
   /* create empty phu */
-  fits_init_header (&header);
+  gfits_init_header (&header);
   header.extend = TRUE;
-  fits_create_header (&header);
-  fits_create_matrix (&header, &matrix);
-  fits_modify (&header, "NEXTEND", "%d", 1, Nimage + 3);
-  fits_modify (&header, "FILTER", "%s", 1, photcode[0].name);
-  fits_modify (&header, "COMMENT", "%S", 1, "Mosaic Photometry Grid Analysis");
-  fits_fwrite_header (f, &header);
-  fits_fwrite_matrix (f, &matrix);
-  fits_free_matrix (&matrix);
+  gfits_create_header (&header);
+  gfits_create_matrix (&header, &matrix);
+  gfits_modify (&header, "NEXTEND", "%d", 1, Nimage + 3);
+  gfits_modify (&header, "FILTER", "%s", 1, photcode[0].name);
+  gfits_modify (&header, "COMMENT", "%S", 1, "Mosaic Photometry Grid Analysis");
+  gfits_fwrite_header (f, &header);
+  gfits_fwrite_matrix (f, &matrix);
+  gfits_free_matrix (&matrix);
 
   /* save grid mag values */
-  fits_init_header (&theader);
+  gfits_init_header (&theader);
   theader.Naxes = 2;
   theader.Naxis[0] = gridX;
   theader.Naxis[1] = gridY;
   theader.bitpix   = -32;
-  fits_create_Theader (&theader, "IMAGE");
-  fits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
-  fits_modify (&theader, "EXTNAME", "%s", 1, "MAG_OFFSET");
-  fits_create_matrix  (&theader, &matrix);
+  gfits_create_Theader (&theader, "IMAGE");
+  gfits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
+  gfits_modify (&theader, "EXTNAME", "%s", 1, "MAG_OFFSET");
+  gfits_create_matrix  (&theader, &matrix);
   for (i = 0; i < gridX; i++) {
     for (j = 0; j < gridY; j++) {
-      fits_set_matrix_value (&matrix, i, j, (double) gridM[i + j*gridX]);
+      gfits_set_matrix_value (&matrix, i, j, (double) gridM[i + j*gridX]);
     }
   }
   write_coords (&theader, &refmosaic[0].coords);
-  fits_fwrite_header (f, &theader);
-  fits_fwrite_matrix (f, &matrix);
-  fits_free_matrix (&matrix);
+  gfits_fwrite_header (f, &theader);
+  gfits_fwrite_matrix (f, &matrix);
+  gfits_free_matrix (&matrix);
 
   /* save grid Nmeas values */
-  fits_modify (&theader, "EXTNAME", "%s", 1, "NMEAS");
-  fits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
-  fits_create_matrix  (&theader, &matrix);
+  gfits_modify (&theader, "EXTNAME", "%s", 1, "NMEAS");
+  gfits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
+  gfits_create_matrix  (&theader, &matrix);
   for (i = 0; i < gridX; i++) {
     for (j = 0; j < gridY; j++) {
-      fits_set_matrix_value (&matrix, i, j, (double) gridN[i + j*gridX]);
+      gfits_set_matrix_value (&matrix, i, j, (double) gridN[i + j*gridX]);
     }
   }
   write_coords (&theader, &refmosaic[0].coords);
-  fits_fwrite_header (f, &theader);
-  fits_fwrite_matrix (f, &matrix);
-  fits_free_matrix (&matrix);
+  gfits_fwrite_header (f, &theader);
+  gfits_fwrite_matrix (f, &matrix);
+  gfits_free_matrix (&matrix);
 
   /* save grid sigma values */
-  fits_modify (&theader, "EXTNAME", "%s", 1, "SIGMA");
-  fits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
-  fits_create_matrix  (&theader, &matrix);
+  gfits_modify (&theader, "EXTNAME", "%s", 1, "SIGMA");
+  gfits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
+  gfits_create_matrix  (&theader, &matrix);
   for (i = 0; i < gridX; i++) {
     for (j = 0; j < gridY; j++) {
-      fits_set_matrix_value (&matrix, i, j, (double) gridS[i + j*gridX]);
+      gfits_set_matrix_value (&matrix, i, j, (double) gridS[i + j*gridX]);
     }
   }
   write_coords (&theader, &refmosaic[0].coords);
-  fits_fwrite_header (f, &theader);
-  fits_fwrite_matrix (f, &matrix);
-  fits_free_matrix (&matrix);
+  gfits_fwrite_header (f, &theader);
+  gfits_fwrite_matrix (f, &matrix);
+  gfits_free_matrix (&matrix);
 
 # ifdef GRID_V1
@@ -451,9 +451,9 @@
     sprintf (ccdname, "ccd%s", p);
 
-    fits_modify (&theader, "EXTNAME", "%s", 1, ccdname);
-    fits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
-    fits_modify (&theader, "PHOTCODE", "%s", 1, pname);
-    fits_modify (&theader, "NX", "%d", 1, image[i].NX);
-    fits_modify (&theader, "NY", "%d", 1, image[i].NY);
+    gfits_modify (&theader, "EXTNAME", "%s", 1, ccdname);
+    gfits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
+    gfits_modify (&theader, "PHOTCODE", "%s", 1, pname);
+    gfits_modify (&theader, "NX", "%d", 1, image[i].NX);
+    gfits_modify (&theader, "NY", "%d", 1, image[i].NY);
     write_coords (&theader, &image[0].coords);
 
@@ -462,12 +462,12 @@
     theader.Naxis[0] = Nx;
     theader.Naxis[1] = Ny;
-    fits_modify (&theader, "NAXIS1", "%d", 1, Nx);
-    fits_modify (&theader, "NAXIS2", "%d", 1, Ny);
-    fits_create_matrix  (&theader, &matrix);
+    gfits_modify (&theader, "NAXIS1", "%d", 1, Nx);
+    gfits_modify (&theader, "NAXIS2", "%d", 1, Ny);
+    gfits_create_matrix  (&theader, &matrix);
 
     InterpolateGrid ((float *)matrix.buffer, Nx, Ny, &image[0].coords, &refmosaic[0].coords);
-    fits_fwrite_header (f, &theader);
-    fits_fwrite_matrix (f, &matrix);
-    fits_free_matrix (&matrix);
+    gfits_fwrite_header (f, &theader);
+    gfits_fwrite_matrix (f, &matrix);
+    gfits_free_matrix (&matrix);
   }
 # endif
@@ -479,14 +479,14 @@
     int ix, iy, x, y, X, Y, bin;
 
-    fits_modify (&theader, "EXTNAME", "%s", 1, camera.ccdname[i]);
-    fits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
-    fits_modify (&theader, "NX", "%d", 1, camera.Nx);
-    fits_modify (&theader, "NY", "%d", 1, camera.Ny);
+    gfits_modify (&theader, "EXTNAME", "%s", 1, camera.ccdname[i]);
+    gfits_modify (&theader, "FILTER", "%s", 1, photcode[0].name);
+    gfits_modify (&theader, "NX", "%d", 1, camera.Nx);
+    gfits_modify (&theader, "NY", "%d", 1, camera.Ny);
       
     theader.Naxis[0] = RELPHOT_GRID_X;
     theader.Naxis[1] = RELPHOT_GRID_Y;
-    fits_modify (&theader, "NAXIS1", "%d", 1, RELPHOT_GRID_X);
-    fits_modify (&theader, "NAXIS2", "%d", 1, RELPHOT_GRID_Y);
-    fits_create_matrix  (&theader, &matrix);
+    gfits_modify (&theader, "NAXIS1", "%d", 1, RELPHOT_GRID_X);
+    gfits_modify (&theader, "NAXIS2", "%d", 1, RELPHOT_GRID_Y);
+    gfits_create_matrix  (&theader, &matrix);
 
     for (Y = 0; Y < RELPHOT_GRID_Y; Y++) {
@@ -504,10 +504,10 @@
 	      
 	bin = ix + iy*gridX;
-	fits_set_matrix_value (&matrix, X, Y, (double) gridM[bin]);
+	gfits_set_matrix_value (&matrix, X, Y, (double) gridM[bin]);
       }
     }
-    fits_fwrite_header (f, &theader);
-    fits_fwrite_matrix (f, &matrix);
-    fits_free_matrix (&matrix);
+    gfits_fwrite_header (f, &theader);
+    gfits_fwrite_matrix (f, &matrix);
+    gfits_free_matrix (&matrix);
   }
 # endif
Index: trunk/Ohana/src/relphot/src/Shutdown.c
===================================================================
--- trunk/Ohana/src/relphot/src/Shutdown.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/Shutdown.c	(revision 7080)
@@ -22,5 +22,5 @@
 
   SetProtect (TRUE);
-  fits_db_close (db);
+  gfits_db_close (db);
   fprintf (stderr, "ERROR: addstar halted\n");
   exit (1);
Index: trunk/Ohana/src/relphot/src/args.c
===================================================================
--- trunk/Ohana/src/relphot/src/args.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/args.c	(revision 7080)
@@ -1,3 +1,4 @@
 # include "relphot.h"
+void usage (void);
 
 int args (int argc, char **argv) {
@@ -33,4 +34,23 @@
   }
 
+  /* specify portion of the sky */
+  UserPatch.Rmin = 0;
+  UserPatch.Rmax = 360;
+  UserPatch.Dmin = -90;
+  UserPatch.Dmax = +90;
+  UserPatchSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-region"))) {
+    remove_argument (N, &argc, argv);
+    UserPatch.Rmin = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+    UserPatch.Rmax = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+    UserPatch.Dmin = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+    UserPatch.Dmax = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+    UserPatchSelect = TRUE;
+  }
+
   VERBOSE = FALSE;
   if ((N = get_argument (argc, argv, "-v"))) {
@@ -153,25 +173,29 @@
   }
 
-  if (argc != 3) {
-    fprintf (stderr, "ERROR: USAGE: nrphot (region) (photcode)\n");
-    fprintf (stderr, "  options: \n");
-    fprintf (stderr, "  -time (start) (stop)\n");
-    fprintf (stderr, "  -v\n");
-    fprintf (stderr, "  -plot\n");
-    fprintf (stderr, "  -plotdelay (seconds)\n");
-    fprintf (stderr, "  -statmode (mode)\n");
-    fprintf (stderr, "  -n (nloop)\n");
-    fprintf (stderr, "  -reset\n");
-    fprintf (stderr, "  -update\n");
-    fprintf (stderr, "  -params\n");
-    fprintf (stderr, "  -mosaic (mosaic)\n");
-    fprintf (stderr, "  -imfreeze\n");
-    fprintf (stderr, "  -grid\n");
-    fprintf (stderr, "  -area Xmin Xmax Ymin Ymax\n");
-    fprintf (stderr, "  -instmag min max\n");
-    fprintf (stderr, "  \n");
-    exit (2);
-  } 
-  return (TRUE);
+  if ( UserPatchSelect && (argc != 2)) usage ();
+  if (!UserPatchSelect && (argc != 3)) usage ();
+
+  return TRUE;
 }
 
+void usage () {
+  fprintf (stderr, "ERROR: USAGE: relphot (region) (photcode)\n");
+  fprintf (stderr, "       or:    relphot (photcode) -region RA RA DEC DEC\n");
+  fprintf (stderr, "  options: \n");
+  fprintf (stderr, "  -time (start) (stop)\n");
+  fprintf (stderr, "  -v\n");
+  fprintf (stderr, "  -plot\n");
+  fprintf (stderr, "  -plotdelay (seconds)\n");
+  fprintf (stderr, "  -statmode (mode)\n");
+  fprintf (stderr, "  -n (nloop)\n");
+  fprintf (stderr, "  -reset\n");
+  fprintf (stderr, "  -update\n");
+  fprintf (stderr, "  -params\n");
+  fprintf (stderr, "  -mosaic (mosaic)\n");
+  fprintf (stderr, "  -imfreeze\n");
+  fprintf (stderr, "  -grid\n");
+  fprintf (stderr, "  -area Xmin Xmax Ymin Ymax\n");
+  fprintf (stderr, "  -instmag min max\n");
+  fprintf (stderr, "  \n");
+  exit (2);
+} 
Index: trunk/Ohana/src/relphot/src/bcatalog.c
===================================================================
--- trunk/Ohana/src/relphot/src/bcatalog.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/bcatalog.c	(revision 7080)
@@ -1,5 +1,5 @@
 # include "relphot.h"
 
-int bcatalog (Catalog *subcatalog, Catalog *catalog, GSCRegion *fullregion) {
+int bcatalog (Catalog *subcatalog, Catalog *catalog) {
   
   int i, j, offset, ecode;
@@ -18,8 +18,11 @@
   for (i = 0; i < catalog[0].Naverage; i++) {
     if (catalog[0].average[i].Nm < 2) continue; 
+
+    /* XXX this limitation is absurd
     if (catalog[0].average[i].R < fullregion[0].RA[0]) continue;
     if (catalog[0].average[i].R > fullregion[0].RA[1]) continue;
     if (catalog[0].average[i].D < fullregion[0].DEC[0]) continue;
     if (catalog[0].average[i].D > fullregion[0].DEC[1]) continue;
+    */
 
     /* start with all stars good */
Index: trunk/Ohana/src/relphot/src/find_images.c
===================================================================
--- trunk/Ohana/src/relphot/src/find_images.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/find_images.c	(revision 7080)
@@ -27,5 +27,5 @@
   strcpy (tcoords.ctype, "RA---TAN");
 
-  timage = fits_table_get_Image (&db[0].ftable, &Ntimage, &db[0].swapped);
+  timage = gfits_table_get_Image (&db[0].ftable, &Ntimage, &db[0].swapped);
 
   nimage = 0;
Index: trunk/Ohana/src/relphot/src/initialize.c
===================================================================
--- trunk/Ohana/src/relphot/src/initialize.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/initialize.c	(revision 7080)
@@ -3,14 +3,16 @@
 void initialize (int argc, char **argv) {
 
-  /* are these set correctly? */
+  int N;
+
   ConfigInit (&argc, argv);
   args (argc, argv);
 
-  if ((photcode = GetPhotcodebyName (argv[2])) == NULL) {
-    fprintf (stderr, "ERROR: photcode %s not found in photcode table\n", argv[2]);
+  N = UserPatchSelect ? 1 : 2;
+  if ((photcode = GetPhotcodebyName (argv[N])) == NULL) {
+    fprintf (stderr, "ERROR: photcode %s not found in photcode table\n", argv[N]);
     exit (1);
   }
   if ((photcode[0].type != PHOT_PRI) && (photcode[0].type != PHOT_SEC)) {
-    fprintf (stderr, "photcode %s is not a primary or secondary filter\n", argv[2]);
+    fprintf (stderr, "photcode %s is not a primary or secondary filter\n", argv[N]);
     exit (1);
   }
Index: trunk/Ohana/src/relphot/src/load_catalogs.c
===================================================================
--- trunk/Ohana/src/relphot/src/load_catalogs.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/load_catalogs.c	(revision 7080)
@@ -1,21 +1,21 @@
 # include "relphot.h"
 
-Catalog *load_catalogs (GSCRegion *region, int Nregion, GSCRegion *fullregion) {
+Catalog *load_catalogs (SkyList *skylist, int *Ncatalog) {
 
   int i, Nstar;
-  char filename[256];
   Catalog *catalog, tcatalog;
 
   if (VERBOSE) fprintf (stderr, "loading catalog data\n");
 
-  ALLOCATE (catalog, Catalog, Nregion);
+  // 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 */
-  for (i = 0; i < Nregion; i++) {
-    sprintf (filename, "%s/%s", CATDIR, region[i].filename);
-    tcatalog.filename = filename;  /* don't free region before catalog! */
+  // we use LCK_SOFT since we assume the image is locked 
+  for (i = 0; i < skylist[0].Nregions; i++) {
+    tcatalog.filename = skylist[0].filename[i];
     switch (lock_catalog (&tcatalog, LCK_SOFT)) {
     case 0:
-      fprintf (stderr, "ERROR: can't lock file %s\n", region[i].filename);
+      fprintf (stderr, "ERROR: can't lock file %s\n", tcatalog.filename);
       exit (1);
     case 1:
@@ -31,9 +31,9 @@
       exit (1);
     }
-    bcatalog (&catalog[i], &tcatalog, fullregion);
+    bcatalog (&catalog[i], &tcatalog);
   }
 
   Nstar = 0;
-  for (i = 0; i < Nregion; i++) {
+  for (i = 0; i < skylist[0].Nregions; i++) {
     Nstar += catalog[i].Naverage;
   }
@@ -42,4 +42,6 @@
     exit (0);
   }
+
+  *Ncatalog = skylist[0].Nregions;
   return (catalog);
 }
Index: trunk/Ohana/src/relphot/src/load_images.c
===================================================================
--- trunk/Ohana/src/relphot/src/load_images.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/load_images.c	(revision 7080)
@@ -1,35 +1,37 @@
 # include "relphot.h"
 
-GSCRegion *load_images (FITS_DB *db, char *seed, int *nregion, GSCRegion *fullregion) {
+SkyList *load_images (FITS_DB *db, char *regionName, SkyRegion *region, int RegionSelect) {
 
-  GSCRegion *region;
-  int        Nregion;
-  Image     *image;
-  int       *Line;
-  int        Nimage;
+  Image     *image, *subset;
+  int        Nimage, Nsubset, Nchar;
+  int       *LineNumber;
 
-  /* read entire db table */
-  if (!dvo_image_load (db, VERBOSE, FALSE)) Shutdown ("can't read image catalog %s", db[0].filename);
+  SkyTable *sky = NULL;
+  SkyList *skylist = NULL;
 
-  region = name_region (seed, &Nregion);
+  // load the current sky table (layout of all SkyRegions) 
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, SKY_DEPTH, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+  
+  // determine the populated SkyRegions overlapping the requested area
+  if (RegionSelect) {
+    skylist = SkyListByPatch (sky, -1, region);
+  } else {
+    Nchar = strlen(regionName);
+    if (!strcmp (&regionName[Nchar-4], ".cpt")) regionName[Nchar-4] = 0;
+    skylist = SkyListByName (sky, regionName);
+  }
 
-  /* find images which supplied all measurements */
-  image = find_images (db, region, Nregion, &Nimage, &Line);
-  free (Line);
+  // convert database table to internal structure
+  image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped);
 
-  /* find all region files which touch images */
-  region = find_regions (image, Nimage, &Nregion, fullregion);
-  free (image);
+  // select the images which overlap the selected sky regions
+  subset = select_images (skylist, image, Nimage, &LineNumber, &Nsubset);
 
-  /* find images which supplied all measurements for all regions */
-  image = find_images (db, region, Nregion, &Nimage, &Line);
-  getfullregion (image, Nimage, fullregion);
+  gfits_vtable_from_ftable (&db[0].ftable, &db[0].vtable, LineNumber, Nsubset);
 
-  fits_vtable_from_ftable (&db[0].ftable, &db[0].vtable, Line, Nimage);
-
-  initImages (image, Nimage);
-  initMosaics (image, Nimage);
+  initImages (subset, Nsubset);
+  initMosaics (subset, Nsubset);
   
-  *nregion = Nregion;
-  return (region);
+  return (skylist);
 }
Index: trunk/Ohana/src/relphot/src/name_region.c
===================================================================
--- trunk/Ohana/src/relphot/src/name_region.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/name_region.c	(revision 7080)
@@ -9,13 +9,13 @@
 
   sprintf (region[0].filename, "%s/%s", CATDIR, name);
-  if (!fits_read_header (region[0].filename, &header)) {
+  if (!gfits_read_header (region[0].filename, &header)) {
     if (VERBOSE) fprintf (stderr, "catalog file not yet available: %s\n", region[0].filename);
     exit (0);
   }
-  fits_scan (&header, "RA0", "%lf", 1, &region[0].RA[0]);
-  fits_scan (&header, "RA1", "%lf", 1, &region[0].RA[1]);
-  fits_scan (&header, "DEC0", "%lf", 1, &region[0].DEC[0]);
-  fits_scan (&header, "DEC1", "%lf", 1, &region[0].DEC[1]);
-  fits_free_header (&header);
+  gfits_scan (&header, "RA0", "%lf", 1, &region[0].RA[0]);
+  gfits_scan (&header, "RA1", "%lf", 1, &region[0].RA[1]);
+  gfits_scan (&header, "DEC0", "%lf", 1, &region[0].DEC[0]);
+  gfits_scan (&header, "DEC1", "%lf", 1, &region[0].DEC[1]);
+  gfits_free_header (&header);
 
   *Nregions = 1;
Index: trunk/Ohana/src/relphot/src/reload_catalogs.c
===================================================================
--- trunk/Ohana/src/relphot/src/reload_catalogs.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/reload_catalogs.c	(revision 7080)
@@ -1,8 +1,7 @@
 # include "relphot.h"
 
-void reload_catalogs (GSCRegion *region, int Nregion, GSCRegion *fullregion) {
+void reload_catalogs (SkyList *skylist) {
 
   int i;
-  char filename[256];
   Catalog catalog;
 
@@ -10,10 +9,9 @@
 
   /* load data from each region file */
-  for (i = 0; i < Nregion; i++) {
-    sprintf (filename, "%s/%s", CATDIR, region[i].filename);
-    catalog.filename = filename;  /* don't free region before catalog! */
+  for (i = 0; i < skylist[0].Nregions; i++) {
+    catalog.filename = skylist[0].filename[i];
     switch (lock_catalog (&catalog, LCK_XCLD)) {
     case 0:
-      fprintf (stderr, "ERROR: can't lock file %s\n", region[i].filename);
+      fprintf (stderr, "ERROR: can't lock file %s\n", catalog.filename);
       exit (1);
     case 1:
Index: trunk/Ohana/src/relphot/src/relphot.c
===================================================================
--- trunk/Ohana/src/relphot/src/relphot.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/relphot.c	(revision 7080)
@@ -1,4 +1,3 @@
 # include "relphot.h"
-/** I'm not currently setting the lockfiles.  this should be fixed! **/
 
 int main (int argc, char **argv) {
@@ -6,22 +5,31 @@
   int i, status, Ncatalog;
   Catalog *catalog;
-  GSCRegion fullregion, *region;
   FITS_DB db;
+
+  SkyList *skylist = NULL;
 
   /* get configuration info, args */
   initialize (argc, argv);
 
+  /* register database handle with shutdown procedure */
   set_db (&db);
+
+  /* lock and load the image db table */
   status = dvo_image_lock (&db, ImageCat, 60.0, (UPDATE ? LCK_XCLD : LCK_SOFT));
   if (!status) Shutdown ("ERROR: failure to lock image catalog %s", db.filename);
   if (db.dbstate == LCK_EMPTY) Shutdown ("ERROR: No images in catalog %s (1)", db.filename);
+  if (!dvo_image_load (&db, VERBOSE, FALSE)) Shutdown ("can't read image catalog %s", db.filename);
 
-  /* load regions and images based on seed region */
-  // XXX EAM : load images and regions based on bounds, not name
-  region = load_images (&db, argv[1], &Ncatalog, &fullregion);
+  /* load regions and images based on specified sky patch */
+  // XXX need to mimic old-style load by passing patch name
+  // XXX need to reduce number of global variables in use.
+  // XXX this is fairly lame: argv[1] is photcode if UserPatchSelect is true
+  skylist = load_images (&db, argv[1], &UserPatch, UserPatchSelect);
+
+  /* unlock, if we can (else, unlocked below) */
   if (!UPDATE) dvo_image_unlock (&db); 
 
   /* load catalog data from region files */
-  catalog = load_catalogs (region, Ncatalog, &fullregion);
+  catalog = load_catalogs (skylist, &Ncatalog);
 
   /* match measurements with images, mosaics */
@@ -86,5 +94,5 @@
 
   /* load catalog data from region files, update Mrel include all data */
-  reload_catalogs (region, Ncatalog, &fullregion);
+  reload_catalogs (skylist);
   setMcalFinal ();
   dvo_image_update (&db, VERBOSE);
Index: trunk/Ohana/src/relphot/src/wcatalog.c
===================================================================
--- trunk/Ohana/src/relphot/src/wcatalog.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/wcatalog.c	(revision 7080)
@@ -26,4 +26,4 @@
     catalog[0].Nsecfilt = 0;
   }
-  fits_free_header (&catalog[0].header);
+  gfits_free_header (&catalog[0].header);
 }
Index: trunk/Ohana/src/relphot/src/wimages.c
===================================================================
--- trunk/Ohana/src/relphot/src/wimages.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/wimages.c	(revision 7080)
@@ -12,11 +12,11 @@
   /* adjust header */
   Nimages = 0;
-  fits_scan (&db[0].header, "NIMAGES", "%d", 1, &Nimages);
+  gfits_scan (&db[0].header, "NIMAGES", "%d", 1, &Nimages);
   Nimages ++;
-  fits_modify (&db[0].header, "NIMAGES", "%d", 1, Nimages);
+  gfits_modify (&db[0].header, "NIMAGES", "%d", 1, Nimages);
 
-  fits_table_to_vtable (&db[0].ftable, &db[0].vtable, 0, 0);
+  gfits_table_to_vtable (&db[0].ftable, &db[0].vtable, 0, 0);
   for (i = 0; i < Nimage; i++) {
-    fits_vadd_rows (&db[0].vtable, (char *) image, 1, sizeof(Image));
+    gfits_vadd_rows (&db[0].vtable, (char *) image, 1, sizeof(Image));
   }
 
Index: trunk/Ohana/src/relphot/src/write_coords.c
===================================================================
--- trunk/Ohana/src/relphot/src/write_coords.c	(revision 6994)
+++ trunk/Ohana/src/relphot/src/write_coords.c	(revision 7080)
@@ -5,25 +5,25 @@
 void write_coords (Header *header, Coords *coords) {
 
-  fits_modify (header, "CTYPE1",   "%s",  1, "RA---TAN");
-  fits_modify (header, "CTYPE2",   "%s",  1, "DEC--TAN");
+  gfits_modify (header, "CTYPE1",   "%s",  1, "RA---TAN");
+  gfits_modify (header, "CTYPE2",   "%s",  1, "DEC--TAN");
 
-  fits_modify (header, "CRVAL1",   "%lf", 1, coords[0].crval1);
-  fits_modify (header, "CRVAL2",   "%lf", 1, coords[0].crval2);  
+  gfits_modify (header, "CRVAL1",   "%lf", 1, coords[0].crval1);
+  gfits_modify (header, "CRVAL2",   "%lf", 1, coords[0].crval2);  
 
-  fits_modify (header, "CRPIX1",   "%lf", 1, coords[0].crpix1);
-  fits_modify (header, "CRPIX2",   "%lf", 1, coords[0].crpix2);
+  gfits_modify (header, "CRPIX1",   "%lf", 1, coords[0].crpix1);
+  gfits_modify (header, "CRPIX2",   "%lf", 1, coords[0].crpix2);
 
 # if (CD_COORDS)  
-  fits_modify (header, "CD1_1",    "%le", 1, coords[0].pc1_1 * coords[0].cdelt1);
-  fits_modify (header, "CD2_1",    "%le", 1, coords[0].pc2_1 * coords[0].cdelt1);
-  fits_modify (header, "CD1_2",    "%le", 1, coords[0].pc1_2 * coords[0].cdelt2);
-  fits_modify (header, "CD2_2",    "%le", 1, coords[0].pc2_2 * coords[0].cdelt2);
+  gfits_modify (header, "CD1_1",    "%le", 1, coords[0].pc1_1 * coords[0].cdelt1);
+  gfits_modify (header, "CD2_1",    "%le", 1, coords[0].pc2_1 * coords[0].cdelt1);
+  gfits_modify (header, "CD1_2",    "%le", 1, coords[0].pc1_2 * coords[0].cdelt2);
+  gfits_modify (header, "CD2_2",    "%le", 1, coords[0].pc2_2 * coords[0].cdelt2);
 # else
-  fits_modify (header, "CDELT1",   "%le", 1, coords[0].cdelt1); 
-  fits_modify (header, "CDELT2",   "%le", 1, coords[0].cdelt2);
-  fits_modify (header, "PC001001", "%le", 1, coords[0].pc1_1);
-  fits_modify (header, "PC001002", "%le", 1, coords[0].pc1_2);
-  fits_modify (header, "PC002001", "%le", 1, coords[0].pc2_1);
-  fits_modify (header, "PC002002", "%le", 1, coords[0].pc2_2);
+  gfits_modify (header, "CDELT1",   "%le", 1, coords[0].cdelt1); 
+  gfits_modify (header, "CDELT2",   "%le", 1, coords[0].cdelt2);
+  gfits_modify (header, "PC001001", "%le", 1, coords[0].pc1_1);
+  gfits_modify (header, "PC001002", "%le", 1, coords[0].pc1_2);
+  gfits_modify (header, "PC002001", "%le", 1, coords[0].pc2_1);
+  gfits_modify (header, "PC002002", "%le", 1, coords[0].pc2_2);
 # endif
 }
