Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/Makefile
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/Makefile	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/Makefile	(revision 21753)
@@ -0,0 +1,185 @@
+include ../../Configure
+HOME    =       $(ROOT)/src/imregister
+
+default: all
+
+BIN	=	$(HOME)/bin
+INC	= 	$(HOME)/include
+SRC	=	$(HOME)/src
+MAN	=	$(HOME)/doc
+DESTBIN	=	$(LBIN)
+DESTLIB	=	$(LLIB)
+DESTINC	=	$(LINC)
+DESTMAN	=	$(LMAN)
+
+BASEDIR =	$(HOME)/base
+DETREND =	$(HOME)/detrend
+PHOTREG =	$(HOME)/photreg
+IMREG   =	$(HOME)/imreg
+IMPHOT  =	$(HOME)/imphot
+SPREG   =	$(HOME)/spreg
+
+INCS	= 	-I$(INC) -I$(LINC) -I$(XINC)
+LIBS	= 	-L$(LLIB) -ldvo -lFITS -lohana -lm 
+CFLAGS	=	$(INCS)
+LFLAGS	=	$(LIBS)
+
+# programs which should be installed
+INSTALL = \
+detregister  detsearch    \
+imregister   imstatreg    \
+imsort       imsearch     \
+showiminfo   convertimreg \
+imregtable   photcode	  \
+photsearch   photreg      \
+cameraconfig filtnames    \
+imphotsearch 
+
+# program under development, not installed
+DEVEL = spregister spsearch imphotmerge
+
+IMPHOTOBJ = \
+$(IMPHOT)/args.$(ARCH).o \
+$(IMPHOT)/db_load.$(ARCH).o \
+$(IMPHOT)/dumpfits.$(ARCH).o \
+$(IMPHOT)/modify.$(ARCH).o \
+$(IMPHOT)/output.$(ARCH).o \
+$(IMPHOT)/rfits.$(ARCH).o \
+$(IMPHOT)/rtext.$(ARCH).o \
+$(IMPHOT)/subset.$(ARCH).o
+
+IMOBJ  = \
+$(IMREG)/delete.$(ARCH).o \
+$(IMREG)/iminfo.$(ARCH).o \
+$(IMREG)/load_probes.$(ARCH).o  \
+$(IMREG)/match.$(ARCH).o  \
+$(IMREG)/modify.$(ARCH).o \
+$(IMREG)/newimages.$(ARCH).o \
+$(IMREG)/output.$(ARCH).o \
+$(IMREG)/unique.$(ARCH).o \
+$(IMREG)/cadc.$(ARCH).o   \
+$(IMREG)/mosaics.$(ARCH).o   \
+$(IMREG)/ConfigPID.$(ARCH).o   \
+$(IMREG)/SetSignals.$(ARCH).o   \
+$(IMREG)/rconnect.$(ARCH).o   \
+$(IMREG)/FifoOps.$(ARCH).o   \
+$(IMREG)/SockScan.$(ARCH).o   \
+$(IMREG)/submit.$(ARCH).o \
+$(IMREG)/imregclient.$(ARCH).o
+
+SPOBJ  = \
+$(SPREG)/delete.$(ARCH).o   \
+$(SPREG)/match.$(ARCH).o    \
+$(SPREG)/modify.$(ARCH).o   \
+$(SPREG)/output.$(ARCH).o   \
+$(SPREG)/unique.$(ARCH).o   \
+$(SPREG)/spinfo.$(ARCH).o   \
+$(SPREG)/showinfo.$(ARCH).o \
+$(SPREG)/ConfigInit.$(ARCH).o
+
+PHOTOBJ  = \
+$(PHOTREG)/delete.$(ARCH).o  \
+$(PHOTREG)/match.$(ARCH).o   \
+$(PHOTREG)/convert.$(ARCH).o \
+$(PHOTREG)/output.$(ARCH).o  \
+$(PHOTREG)/getImageData.$(ARCH).o
+
+DETOBJ  = \
+$(DETREND)/criteria.$(ARCH).o  \
+$(DETREND)/delete.$(ARCH).o    \
+$(DETREND)/entry.$(ARCH).o     \
+$(DETREND)/image.$(ARCH).o     \
+$(DETREND)/imdef.$(ARCH).o     \
+$(DETREND)/match.$(ARCH).o     \
+$(DETREND)/modify.$(ARCH).o    \
+$(DETREND)/mosaic.$(ARCH).o    \
+$(DETREND)/output.$(ARCH).o    \
+$(DETREND)/recipe.$(ARCH).o    \
+$(DETREND)/select.$(ARCH).o    \
+$(DETREND)/unique.$(ARCH).o    \
+$(DETREND)/altpath.$(ARCH).o   \
+$(DETREND)/db_names.$(ARCH).o   \
+$(DETREND)/usage.$(ARCH).o
+
+BASEOBJ = \
+$(BASEDIR)/ConfigCamera.$(ARCH).o \
+$(BASEDIR)/ConfigFilter.$(ARCH).o \
+$(BASEDIR)/ConfigInit.$(ARCH).o   \
+$(BASEDIR)/WriteFIFO.$(ARCH).o    \
+$(BASEDIR)/get_fwhm.$(ARCH).o     \
+$(BASEDIR)/misc.$(ARCH).o         \
+$(BASEDIR)/version.$(ARCH).o      \
+$(BASEDIR)/parse_time.$(ARCH).o   \
+$(BASEDIR)/fits_scan_nchar.$(ARCH).o \
+$(BASEDIR)/sort.$(ARCH).o
+
+all: $(INSTALL) $(DEVEL)
+
+IR = $(IMREG)/args.imregister.$(ARCH).o    $(IMOBJ)   $(BASEOBJ)
+IS = $(IMREG)/args.imsearch.$(ARCH).o      $(IMOBJ)   $(BASEOBJ)
+DR = $(DETREND)/args.detregister.$(ARCH).o $(DETOBJ)  $(BASEOBJ)
+DS = $(DETREND)/args.detsearch.$(ARCH).o   $(DETOBJ)  $(BASEOBJ)
+PS = $(PHOTREG)/args.photsearch.$(ARCH).o  $(PHOTOBJ) $(BASEOBJ)
+PR = $(PHOTREG)/args.photreg.$(ARCH).o     $(PHOTOBJ) $(BASEOBJ)
+SR = $(SPREG)/args.spregister.$(ARCH).o    $(SPOBJ)   $(BASEOBJ)
+SS = $(SPREG)/args.spsearch.$(ARCH).o      $(SPOBJ)   $(BASEOBJ)
+IP = $(IMPHOTOBJ) $(BASEOBJ)
+
+$(SR) : $(INC)/spreg.h $(INC)/imregister.h
+$(SS) : $(INC)/spreg.h $(INC)/imregister.h
+
+# special rules:
+$(BIN)/photreg.$(ARCH)      : $(SRC)/photreg.$(ARCH).o      $(PR) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/photsearch.$(ARCH)   : $(SRC)/photsearch.$(ARCH).o   $(PS) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/imsearch.$(ARCH)     : $(SRC)/imsearch.$(ARCH).o     $(IS) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/imregister.$(ARCH)   : $(SRC)/imregister.$(ARCH).o   $(IR) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/imstatreg.$(ARCH)    : $(SRC)/imstatreg.$(ARCH).o    $(IR) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/showiminfo.$(ARCH)   : $(SRC)/showiminfo.$(ARCH).o   $(IR) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/imregtable.$(ARCH)   : $(SRC)/imregtable.$(ARCH).o   $(IR) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/convertimreg.$(ARCH) : $(SRC)/convertimreg.$(ARCH).o $(IR) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/detregister.$(ARCH)  : $(SRC)/detregister.$(ARCH).o  $(DR) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/detsearch.$(ARCH)    : $(SRC)/detsearch.$(ARCH).o    $(DS) ; $(CC) $^ -o $@ $(LFLAGS)
+
+$(BIN)/imsort.$(ARCH)       : $(BIN)/imregister.$(ARCH) ; rm -f $(BIN)/imsort.$(ARCH) ; cp $(BIN)/imregister.$(ARCH) $(BIN)/imsort.$(ARCH) 
+
+$(BIN)/spsearch.$(ARCH)     : $(SRC)/spsearch.$(ARCH).o     $(SS) ; $(CC) $^ -o $@ $(LFLAGS)
+$(BIN)/spregister.$(ARCH)   : $(SRC)/spregister.$(ARCH).o   $(SR) ; $(CC) $^ -o $@ $(LFLAGS)
+
+$(BIN)/imphotsearch.$(ARCH) : $(SRC)/imphotsearch.$(ARCH).o $(IP) ; $(CC) $^ -o $@ $(LFLAGS)
+
+# dependancy rules for binary code #########################
+.PRECIOUS: %.$(ARCH).o
+.PRECIOUS: $(BIN)/%.$(ARCH)
+
+%.$(ARCH).o : %.c
+	$(CC) $(CFLAGS) -c $< -o $@
+
+$(BIN)/%.$(ARCH) : $(SRC)/%.$(ARCH).o $(BASEOBJ)
+	@if [ ! -d $(BIN) ]; then mkdir -p $(BIN); fi
+	$(CC) $^ -o $@ $(LFLAGS)
+
+$(DESTBIN)/%: $(BIN)/%.$(ARCH)
+	@if [ ! -d $(DESTBIN) ]; then mkdir -p $(DESTBIN); fi
+	rm -f $(DESTBIN)/$*
+	cp $(BIN)/$*.$(ARCH) $(DESTBIN)/$*
+
+$(INSTALL) $(DEVEL): % : $(BIN)/%.$(ARCH)
+
+%.clean :
+	rm -f $(BIN)/$*.$(ARCH)
+
+%.rebuild :
+	rm -f $(BIN)/$*.$(ARCH)
+	make $(DESTBIN)/$*
+
+%.install:
+	make $(DESTBIN)/$*
+
+# utilities #################################################
+
+install:
+	for i in $(INSTALL); do make $$i.install || exit; done
+
+clean:
+	rm -f */*.o
+	rm -f */*~
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/ConfigCamera.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/ConfigCamera.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/ConfigCamera.c	(revision 21753)
@@ -0,0 +1,71 @@
+# include "imregister.h"
+
+void ConfigCamera () { 
+
+  int i;
+  char *config, ID[64], field[128], line[128];
+
+  /* load camera config file */
+  config = LoadConfigFile (CameraConfig);
+  if (config == (char *) NULL) {
+    fprintf (stderr, "ERROR: can't find camera config file %s\n", CameraConfig);
+    exit (1);
+  }
+  
+  /* load data from config file */
+  ScanConfig (config, "NCCD", "%d", 1, &Nccd);
+  ALLOCATE (ccds, char *, Nccd);
+  ALLOCATE (ccdn, char *, Nccd);
+
+  for (i = 0; i < Nccd; i++) {
+    sprintf (field, "CCD.%d", i);
+    ScanConfig (config, field, "%s", 1, line);
+    sscanf (line, "%s", ID);
+    ccds[i] = strcreate (ID);
+  }
+
+  for (i = 0; i < Nccd; i++) {
+    sprintf (ID, "%02d", i);
+    ccdn[i] = strcreate (ID);
+  }
+}
+
+int MatchCCDNameHeader (Header *header) {
+
+  int i;
+  char ID[64];
+
+  ID[0] = 0;
+  
+  fits_scan (header, CCDnumKeyword,  "%s", 1, ID);
+  if (!ID[0]) { 
+    fprintf (stderr, "warning, ccd id not found in header\n");
+    return (-1);
+  }
+  
+  /* compare as number if ID is a complete number (ie, 00 equiv to 0, but 00b not equiv to 0b */
+  for (i = 0; i < Nccd; i++) {
+    if (strnumcmp (ccds[i], ID)) {
+      return (i);
+    }
+  }
+  
+  fprintf (stderr, "warning: ccd %s not found in camera config file\n", ID);
+  return (-1);
+}
+
+int MatchCCDName (char *ID) {
+
+  int i;
+
+  /* compare as number if ID is a complete number (ie, 00 equiv to 0, but 00b not equiv to 0b */
+  for (i = 0; i < Nccd; i++) {
+    if (strnumcmp (ccds[i], ID)) {
+      return (i);
+    }
+  }
+  
+  fprintf (stderr, "warning: ccd %s not found in camera config file\n", ID);
+  return (-1);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/ConfigFilter.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/ConfigFilter.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/ConfigFilter.c	(revision 21753)
@@ -0,0 +1,94 @@
+# include "imregister.h"
+
+void ConfigFilter () {
+
+  int i, N, code, NFILT, Nfilt, Nfield;
+  char *c, line[256], name[64];
+  FILE *f;
+
+  /* open filter list file */
+  f = fopen (FilterList, "r");
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "error reading photcodes\n");
+    exit (1);
+  }
+
+  /* allocate dataspace needed */
+  NFILT = 100;
+  Nfilt = 0;
+  ALLOCATE (filternum,  int,    NFILT);
+  ALLOCATE (filtername, char *, NFILT);
+  for (i = Nfilt; i < NFILT; i++) {
+    ALLOCATE (filtername[i], char, 64);
+  }
+
+  while (scan_line (f, line) != EOF) {
+    for (c = line; isspace (*c); c++);
+    if (*c == '#') continue;
+    Nfield = sscanf (c, "%d %s", &code, name);
+    if (Nfield != 2) { continue; }
+
+    filternum[Nfilt] = code;
+    strcpy (filtername[Nfilt], name);
+    Nfilt ++;
+
+    if (Nfilt == NFILT - 1) {
+      NFILT += 100;
+      REALLOCATE (filternum,  int,    NFILT);
+      REALLOCATE (filtername, char *, NFILT);
+      for (i = Nfilt; i < NFILT; i++) {
+	REALLOCATE (filtername[i], char, 64);
+      }
+    }
+  }
+  fclose (f);
+
+  /* make filter hash table (using first available entries) */
+  ALLOCATE (filterhash, char *, Nfilt);
+  for (i = 0; i < Nfilt; i++) {
+    filterhash[i] = (char *) NULL;
+  }
+
+  for (i = 0; i < Nfilt; i++) {
+    N = filternum[i];
+    if (filterhash[N] != (char *) NULL) continue;
+    filterhash[N] = filtername[i];
+  }
+
+  NFILTER = Nfilt;
+  /* we now have NFILTER set, and filternum & filtername arrays filled */
+
+}  
+
+/* convert filter string to fixed filter names (convert all spaces to .) */
+int MatchFilterList (char *line) {
+
+  char *p;
+  int i, blank;
+
+  /* convert spaces to . */
+  blank = FALSE;
+  p = line;
+  for (i = 0; i < strlen (line); i++, p++) {
+    *p = line[i];
+    if (whitespace(line[i])) { 
+      *p = '.';
+      if (blank) p--;
+      if (!blank) blank = TRUE;
+    } else {
+      blank = FALSE;
+    }
+  }
+  *p = 0;
+
+  /* find defined filter name */
+  for (i = 0; i < NFILTER; i++) {
+    if (!strcasecmp (line, filtername[i])) {
+      /* careful: line[80] */
+      strcpy (line, filterhash[filternum[i]]);
+      return (TRUE);
+    }
+  }      
+  fprintf (stderr, "unknown filter %s\n", line);
+  return (FALSE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/ConfigInit.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/ConfigInit.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/ConfigInit.c	(revision 21753)
@@ -0,0 +1,113 @@
+# include "imregister.h"
+
+int success;
+
+void ConfigInit (int *argc, char **argv) {
+
+  int i, NDB;
+  char *config, *file, ElixirBase[80], catdir[256];
+
+  /*** load configuration info ***/
+  file = SelectConfigFile (argc, argv, "ptolemy");
+  config = LoadConfigFile (file);
+  if (config == (char *) NULL) {
+    fprintf (stderr, "ERROR: can't find configuration file %s\n", file);
+    if (file != (char *) NULL) free (file);
+    exit (0);
+  }
+
+  success = TRUE;
+
+  WarnConfig (config, "REGISTRATION_DATABASE",       "%s", 0, ImageDB);
+  WarnConfig (config, "DETREND_DATABASE",            "%s", 0, DetrendDB);
+  WarnConfig (config, "PHOT_DATABASE",               "%s", 0, PhotDB);
+  WarnConfig (config, "TRANS_DATABASE",              "%s", 0, TransDB);
+
+  WarnConfig (config, "CATDIR",                      "%s", 0, catdir);
+  sprintf (ImPhotDB, "%s/Images.dat", catdir);
+
+  /* small text databases: filters, camera defs */ 
+  WarnConfig (config, "PHOTCODE_FILE",               "%s", 0, PhotCodeFile);
+  WarnConfig (config, "TEMPERATURE_LOG",             "%s", 0, TempLogFile);
+  WarnConfig (config, "FILTER_LIST",                 "%s", 0, FilterList);
+  WarnConfig (config, "CAMERA_CONFIG",               "%s", 0, CameraConfig);
+  WarnConfig (config, "DETREND_RECIPES",             "%s", 0, RecipeFile);
+						   
+  /* pixel scale for FWHM */ 
+  WarnConfig (config, "ASEC_PIX",                    "%lf", 0, &ARCSEC_PIXEL);
+
+  /* keyword abstractions for parse_time */	   
+  WarnConfig (config, "DATE-KEYWORD",                "%s", 0, DateKeyword);
+  WarnConfig (config, "DATE-MODE",                   "%s", 0, DateMode);
+  WarnConfig (config, "UT-KEYWORD",                  "%s", 0, UTKeyword);
+  WarnConfig (config, "MJD-KEYWORD",                 "%s", 0, MJDKeyword);
+  WarnConfig (config, "JD-KEYWORD",                  "%s", 0, JDKeyword);
+						   
+  /* keyword abstractions for iminfo */		   
+  WarnConfig (config, "EXPTIME-KEYWORD",             "%s", 0, ExptimeKeyword);
+  WarnConfig (config, "IMAGETYPE-KEYWORD",           "%s", 0, ImagetypeKeyword);
+  WarnConfig (config, "CCDNUM-KEYWORD",              "%s", 0, CCDnumKeyword);
+  WarnConfig (config, "FILTER-KEYWORD",              "%s", 0, FilterKeyword);
+  WarnConfig (config, "AIRMASS-KEYWORD",             "%s", 0, AirmassKeyword);
+  WarnConfig (config, "FOCUS-KEYWORD",               "%s", 0, FocusKeyword);
+  WarnConfig (config, "ROTATION-KEYWORD",            "%s", 0, RotationKeyword);
+  WarnConfig (config, "DETTEMP-KEYWORD",             "%s", 0, DettempKeyword);
+  WarnConfig (config, "TELDATA1-KEYWORD",            "%s", 0, Teldata1Keyword);
+  WarnConfig (config, "TELDATA2-KEYWORD",            "%s", 0, Teldata2Keyword);
+  WarnConfig (config, "TELDATA3-KEYWORD",            "%s", 0, Teldata3Keyword);
+  WarnConfig (config, "CAMERA-KEYWORD",              "%s", 0, CameraKeyword);
+
+  ScanConfig (config, "CAMERA",                      "%s", 0, Camera);
+  ScanConfig (config, "SEEING_REF_CCD",              "%s", 0, SeeingREFCCD);
+
+  /* optional values */
+  ScanConfig (config, "RA-DDD-KEYWORD",              "%s", 0, RADecDegKeyword);
+  ScanConfig (config, "DEC-DDD-KEYWORD",             "%s", 0, DECDecDegKeyword);
+  ScanConfig (config, "RA-HMS-KEYWORD",              "%s", 0, RASexigKeyword);
+  ScanConfig (config, "DEC-DMS-KEYWORD",             "%s", 0, DECSexigKeyword);
+
+  if (!RADecDegKeyword[0] & !DECDecDegKeyword[0] && !RASexigKeyword[0] && !DECSexigKeyword[0]) {
+    fprintf (stderr, "missing astrometry configuration information\n");
+    success = FALSE;
+  }
+						   
+  WarnConfig (config, "imstats",                     "%s", 0, ElixirBase);
+  sprintf (ImstatFifo, "%s.source", ElixirBase);   
+  WarnConfig (config, "ptolemy",                     "%s", 0, ElixirBase);
+  sprintf (PtolemyFifo, "%s.source", ElixirBase);
+
+  if (!ScanConfig (config, "CONNECT", "%s",  0, CONNECT)) {
+    sprintf (CONNECT, "/usr/bin/rsh");
+  }
+
+  /* load Detrend Alt Databases paths */
+  NDB = 10;
+  NDetrendAltDB = 0;
+  ALLOCATE (DetrendAltDB, char *, NDB);
+  ALLOCATE (DetrendAltDB[NDetrendAltDB], char, 256);
+  for (i = 1; ScanConfig (config, "DETREND_ALT_DB", "%s", i, DetrendAltDB[NDetrendAltDB]); i++) {
+    NDetrendAltDB ++;
+    if (NDetrendAltDB == NDB) {
+      NDB += 10;
+      REALLOCATE (DetrendAltDB, char *, NDB);
+    }
+    ALLOCATE (DetrendAltDB[NDetrendAltDB], char, 256);
+  }
+  free (DetrendAltDB[NDetrendAltDB]);
+
+  if (! success) {
+    fprintf (stderr, "ERROR: problem with elixir configuration\n");
+    exit (1);
+  }
+
+  free (config);
+  free (file);
+
+}
+
+void WarnConfig (char *config, char *key, char * mode, int N, void *var) {
+  if (!ScanConfig (config, key, mode, N, var)) {
+    fprintf (stderr, "missing config variable %s\n", key);
+    success = FALSE;
+  }
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/WriteFIFO.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/WriteFIFO.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/WriteFIFO.c	(revision 21753)
@@ -0,0 +1,23 @@
+# include "imregister.h"
+
+int WriteFIFO (char *filename, char *line) {
+
+  int state, mode;
+  FILE *f;
+
+  f = fsetlockfile (filename, 20.0, LCK_XCLD, &state);
+  if (f == NULL) {
+    fprintf (stderr, "ERROR: can't lock fifo %s\n", filename);
+    return (FALSE);
+  }
+
+  fseek (f, 0, SEEK_END);
+  fprintf (f, "%s\n", line);
+
+  mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+  chmod (filename, mode);
+  fclearlockfile (filename, f, LCK_XCLD, &state);
+
+  return (TRUE);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/convert.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/convert.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/convert.c	(revision 21753)
@@ -0,0 +1,2 @@
+# include "imregister.h"
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/fits_scan_nchar.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/fits_scan_nchar.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/fits_scan_nchar.c	(revision 21753)
@@ -0,0 +1,32 @@
+# include "imregister.h"
+
+/* scan and give a warning for missing entries */
+void warn_scan (Header *header, char *field, char *format, int N, void *var) {
+  if (!fits_scan (header, field, format, N, var)) {
+    fprintf (stderr, "WARNING: %s not found in header\n", field);
+  }
+}
+
+/* scan from header into a string of fixed length */
+int fits_scan_nchar (Header *header, int size, char *field, int N,...) {
+
+  char tmpstr[160], *outstr; 
+  va_list argp;
+  int status;
+  
+  va_start (argp, N);
+  outstr = va_arg (argp, char *);
+  va_end (argp);
+
+  status = fits_scan (header, field, "%s", N, tmpstr); 
+  strncpy (outstr, tmpstr, size - 1);
+  outstr[size-1] = 0; 
+
+  return (status);
+} 
+     
+void warn_scan_nchar (Header *header, int size, char *field, int N, void *var) {
+  if (!fits_scan_nchar (header, size, field, N, var)) {
+    fprintf (stderr, "missing %s not found in header\n", field);
+  }
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/misc.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/misc.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/misc.c	(revision 21753)
@@ -0,0 +1,133 @@
+# include "imregister.h"
+
+static double tz = 0.0;
+void set_timezone (double dt) {
+  tz = dt;
+}
+
+/* return values:
+   0 - no trange arguments
+   1 - arguments ok
+   2 - arguments bad
+*/
+int get_trange_arguments (int *argc, char **argv, unsigned long **Tstart, unsigned long **Tstop, int *ntimes) {
+
+  int Na, N, Ntimes;
+  double trange;
+  unsigned long tmp, *tstart, *tstop;
+
+  /* allocate space for returned lists */
+  Ntimes = 10;
+  ALLOCATE (tstart, unsigned long, Ntimes);
+  ALLOCATE (tstop,  unsigned long, Ntimes);
+
+  for (N = 0; ; N++) {
+
+    /* find next -trange arg */
+    Na = get_argument (*argc, argv, "-trange");
+    if (Na == 0) {
+      *ntimes = N;
+      *Tstart = tstart;
+      *Tstop  = tstop;
+      return (TRUE);
+    }
+    remove_argument (Na, argc, argv);
+    
+    /* tstart */
+    if (!str_to_time (argv[Na], &tstart[N])) { 
+      return (FALSE);
+    }
+
+    /* interpret second value */
+    remove_argument (Na, argc, argv);
+    if (str_to_dtime (argv[Na], &trange)) { 
+      if (trange < 0) {
+	tstop[N]  = tstart[N];
+	tstart[N] = tstop[N] + trange;
+      } else {
+	tstop[N]  = tstart[N] + trange;
+      }
+      remove_argument (Na, argc, argv);
+      goto goodvalue;
+    }
+    if (str_to_time (argv[Na], &tstop[N])) { 
+      if (tstart[N] > tstop[N]) {
+	tmp     = tstart[N];
+	tstart[N] = tstop[N];
+	tstop[N]  = tmp;
+      }
+      remove_argument (Na, argc, argv);
+      goto goodvalue;
+    }
+    return (FALSE); /* syntax error in 2nd value */
+
+  goodvalue:
+    if (N == Ntimes - 1) {
+      Ntimes += 10;
+      REALLOCATE (tstart, unsigned long, Ntimes);
+      REALLOCATE (tstop,  unsigned long, Ntimes);
+    }
+  }
+}
+  
+int get_filter_arguments (int *argc, char **argv, int **Filt, int *Nfilt) {
+
+  int i, N, Na, NF;
+  int *filt;
+
+  /* allocate space for returned lists */
+  NF = 10;
+  ALLOCATE (filt, int, NF);
+
+  for (N = 0; ; N++) {
+
+    /* find next -trange arg */
+    Na = get_argument (*argc, argv, "-filter");
+    if (Na == 0) {
+      *Nfilt = N;
+      *Filt = filt;
+      return (TRUE);
+    }
+    if (Na > *argc - 2) return (FALSE); /* -filter F */
+    remove_argument (Na, argc, argv);
+    
+    for (i = 0; i < strlen (argv[Na]); i++) { if (isspace (argv[Na][i])) argv[Na][i] = '.'; }
+    for (i = 0; i < NFILTER; i++) {
+      if (!strcasecmp (argv[Na], filtername[i])) {
+	filt[N] = filternum[i];
+      }
+    }
+    if (filt[N] == FILTER_NONE) return (FALSE);
+    remove_argument (Na, argc, argv);
+
+    if (N == NF - 1) {
+      NF += 10;
+      REALLOCATE (filt, int, NF);
+    }
+  }
+}
+  
+   
+/* replaces whitespace blocks with single . */
+void clean_spaces (char *line) {
+
+  char *out, *in;
+
+  if (line == NULL) return;
+
+  out = in = line;
+  while (*in) {
+    if (whitespace(*in)) { 
+      *out = '.';
+      out ++;
+      in ++;
+      while (*in && whitespace(*in)) in++;
+    } else {
+      *out = *in;
+      out ++;
+      in ++;
+    }
+  }
+  *out = 0;
+  return;
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/parse_time.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/parse_time.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/parse_time.c	(revision 21753)
@@ -0,0 +1,120 @@
+# include "imregister.h"
+
+int parse_time (Header *header) {
+
+  double jd;
+  int Ny, Nf, mode;
+  int Nsec, hour, min, sec, year, month, day;
+  char *py, *pm, *pd, *c;
+  char line[256];
+
+  /* we want to find JD or MJD to get Nsec (seconds since 01/01/1970) */
+
+  /* try JD first */
+  if (strcasecmp (JDKeyword, "NONE")) {
+    uppercase (JDKeyword);
+    warn_scan (header, JDKeyword, "%lf", 1, &jd);
+    Nsec = jd_to_sec (jd);
+    return (Nsec);
+  }
+
+  /* try MJD next */
+  if (strcasecmp (MJDKeyword, "NONE")) {
+    uppercase (MJDKeyword);
+    warn_scan (header, MJDKeyword, "%lf", 1, &jd);
+    Nsec = mjd_to_sec (jd);
+    return (Nsec);
+  }
+    
+  /* get UT and DATE */
+  uppercase (UTKeyword);
+  warn_scan (header, UTKeyword, "%s", 1, line);
+  /* remove ':' characters */
+  for (c = strchr (line, 0x3a); c != (char *) NULL; c = strchr (line, 0x3a)) { *c = ' '; }
+  sscanf (line, "%d %d %d", &hour, &min, &sec);
+
+  /* parse mode line */
+  uppercase (DateMode);
+  for (Ny = 0, c = strchr (DateMode, 'Y'); c != (char ) NULL; c = strchr (c + 1, 'Y'), Ny++);
+  if ((Ny != 2) && (Ny != 4)) {
+    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
+    exit (0);
+  }
+  py = strchr (DateMode, 'Y');
+  pm = strchr (DateMode, 'M');
+  pd = strchr (DateMode, 'D');
+  if ((py == (char *) NULL) || (pm == (char *) NULL) || (pd == (char *) NULL)) {
+    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
+    exit (0);
+  }
+  if ((py > pm) && (py < pd)) {
+    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
+    exit (0);
+  }
+  if ((py > pd) && (py < pm)) {
+    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
+    exit (0);
+  }
+  mode = 0;
+  if ((py < pm) && (pm < pd)) { mode = 1; }  /* yyyy-mm-dd */
+  if ((py < pm) && (pm > pd)) { mode = 2; }  /* yyyy-dd-mm */
+  if ((py > pm) && (pm < pd)) { mode = 3; }  /* mm-dd-yyyy */
+  if ((py > pm) && (pm > pd)) { mode = 4; }  /* dd-mm-yyyy */
+  if (!mode) {
+    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
+    exit (0);
+  }
+
+  /* parse date entry */
+  uppercase (DateKeyword);
+  warn_scan (header, DateKeyword, "%s",  1, line);
+  /* remove possible separators: ':', '/' '.', '-' */
+  for (c = strchr (line, 0x3a); c != (char *) NULL; c = strchr (line, 0x3a)) { *c = ' '; }
+  for (c = strchr (line, 0x2f); c != (char *) NULL; c = strchr (line, 0x2f)) { *c = ' '; }
+  for (c = strchr (line, 0x2e); c != (char *) NULL; c = strchr (line, 0x2e)) { *c = ' '; }
+  for (c = strchr (line, 0x2d); c != (char *) NULL; c = strchr (line, 0x2d)) { *c = ' '; }
+
+  Nf = 0;
+  switch (mode) {
+  case 1:
+    Nf = sscanf (line, "%d %d %d", &year, &month, &day);
+    break;
+  case 2:
+    Nf = sscanf (line, "%d %d %d", &year, &day, &month);
+    break;
+  case 3:
+    Nf = sscanf (line, "%d %d %d", &month, &day, &year);
+    break;
+  case 4:
+    Nf = sscanf (line, "%d %d %d", &day, &month, &year);
+    break;
+  }
+  if (Nf != 3) {
+    fprintf (stderr, "error in date entry (%s) or DATE-MODE format (%s)\n", line, DateMode);
+    exit (0);
+  }
+
+  if (year > 1000) {
+    if (Ny == 2) {
+      fprintf (stderr, "warning: mode line claims 2 digit year, but 4 digit year found\n");
+    }
+  } else {
+    if (Ny == 4) {
+      fprintf (stderr, "warning: mode line claims 4 digit year, but 2 digit year found\n");
+    }
+    if (year < 50) year += 100;
+    year += 1900;
+  }    
+
+  /* convert yy.mm.dd hh.mm.ss to Nsec since 1970 (jd = 2440587.5) */
+  /* note that in this section, tm_mon has range 1-12, unlike for gmtime () */
+  jd = day - 32075 + (int)(1461*(year + 4800 + (int)(((month)-14)/12))/4)
+    + (int)(367*((month) - 2 - (int)(((month) - 14)/12)*12)/12)
+    - (int)(3*(int)((year + 4900 + (int)(((month) - 14)/12))/100)/4) - 0.5;
+  /* jd is the julian day of the whole day only not the time */
+  Nsec = (jd - 2440587.5)*86400 + 3600.0*hour + min*60.0 + sec;
+  
+  return (Nsec);
+
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/sort.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/sort.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/sort.c	(revision 21753)
@@ -0,0 +1,151 @@
+# include <string.h>
+
+void sort (float *value, int N) {
+
+  int l,j,ir,i;
+  float temp;
+  
+  if (N < 2) return;
+  l = N >> 1;
+  ir = N - 1;
+  for (;;) {
+    if (l > 0) {
+      temp = value[--l];
+    }
+    else {
+      temp = value[ir];
+      value[ir] = value[0];
+      if (--ir == 0) {
+	value[0] = temp;
+	return;
+      }
+    }
+    i = l;
+    j = (l << 1) + 1;
+    while (j <= ir) {
+      if (j < ir && value[j] < value[j+1]) ++j;
+      if (temp < value[j]) {
+	value[i]=value[j];
+	j += (i=j) + 1;
+      }
+      else j = ir + 1;
+    }
+    value[i] = temp;
+  }
+}
+
+void dsort (double *value, int N) {
+
+  int l,j,ir,i;
+  double temp;
+  
+  if (N < 2) return;
+  l = N >> 1;
+  ir = N - 1;
+  for (;;) {
+    if (l > 0) {
+      temp = value[--l];
+    }
+    else {
+      temp = value[ir];
+      value[ir] = value[0];
+      if (--ir == 0) {
+	value[0] = temp;
+	return;
+      }
+    }
+    i = l;
+    j = (l << 1) + 1;
+    while (j <= ir) {
+      if (j < ir && value[j] < value[j+1]) ++j;
+      if (temp < value[j]) {
+	value[i]=value[j];
+	j += (i=j) + 1;
+      }
+      else j = ir + 1;
+    }
+    value[i] = temp;
+  }
+}
+
+void sortstr (char **S, int *X, int N) {
+
+  int l,j,ir,i;
+  char *tmpS;
+  int tmpX;
+  
+  if (N < 2) return;
+  l = N >> 1;
+  ir = N - 1;
+  for (;;) {
+    if (l > 0) {
+      l--;
+      tmpS = S[l];
+      tmpX = X[l];
+    } else {
+      tmpS = S[ir];
+      S[ir] = S[0];
+      tmpX = X[ir];
+      X[ir] = X[0];
+      if (--ir == 0) {
+	S[0] = tmpS;
+	X[0] = tmpX;
+	return;
+      }
+    }
+    i = l;
+    j = (l << 1) + 1;
+    while (j <= ir) {
+      if (j < ir && (strcmp(S[j], S[j+1]) < 0)) j++;
+      if (strcmp(tmpS, S[j]) < 0) {
+	S[i] = S[j];
+	X[i] = X[j];
+	j += (i=j) + 1;
+      }
+      else j = ir + 1;
+    }
+    S[i] = tmpS;
+    X[i] = tmpX;
+  }
+}
+
+void sortpair (int *X, int *Y, int N) {
+
+  int l,j,ir,i;
+  int 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;
+  }
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/base/version.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/base/version.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/base/version.c	(revision 21753)
@@ -0,0 +1,15 @@
+# include "imregister.h"
+static char *name = "$Name: not supported by cvs2svn $";
+
+void get_version (int argc, char **argv, char *version) {
+
+  if (!get_argument (argc, argv, "-version")) return;
+
+  fprintf (stderr, "%s\n", version);
+  fprintf (stderr, "%s\n", name);
+
+  fprintf (stderr, "ohana: %s\n", ohana_version());
+  fprintf (stderr, "fits:  %s\n", fits_version());
+  exit (2);
+
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/bin/.cvsignore
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/bin/.cvsignore	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/bin/.cvsignore	(revision 21753)
@@ -0,0 +1,2 @@
+*.linux *.lin64 *.sol *.sun *.sid *.hp *.irix
+*.linrh
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/altpath.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/altpath.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/altpath.c	(revision 21753)
@@ -0,0 +1,155 @@
+# include "imregister.h"
+# include "detrend.h"
+
+int SetAltpath (FITS_DB *db, DetReg *image, int Nimage, Match *match, int Nmatch) {
+  
+  int i, j, n, found, status, Nlist;
+  int *list, *current;
+  char *dBPath, infile[256], outfile[256], line[1024];
+  struct stat statbuf;
+
+  ALLOCATE (current, int, Nimage);
+  ALLOCATE (list, int, Nimage);
+  Nlist = 0;
+
+  dBPath = get_dBPath ();
+
+  /* set altpath for 'add' images */
+  if (output.Altpath == ADD) {
+    /* find images to add */
+    for (i = 0; i < Nmatch; i++) {
+      if (image[match[i].image].altpath == FALSE) {
+	list[Nlist] = match[i].image;
+	Nlist ++;
+      }
+    }
+    /* copy the masters to the altpath locations */
+    for (j = 0; j < Nlist; j++) {
+      i = list[j];
+      for (n = 0; n < NDetrendAltDB; n++) {
+	sprintf (infile, "%s/%s", dBPath, image[i].filename);
+	sprintf (outfile, "%s/%s", DetrendAltDB[n], image[i].filename);
+	status = ckpathname (outfile);
+	if (!status) {
+	  fprintf (stderr, "warning: can't make outfile directory for %s\n", outfile);
+	  continue;
+	}
+	sprintf (line, "cp %s %s", infile, outfile);
+	fprintf (stderr, "%s\n", line);
+	status = system (line);
+	if (status) {
+	  fprintf (stderr, "warning: can't make outfile directory for %s\n", outfile);
+	  continue;
+	}
+      }
+      image[i].altpath = TRUE;
+    }
+
+    /** we may later want to pull this out and put it elsewhere **/
+    fits_vtable_from_ftable (&db[0].ftable, &db[0].vtable, list, Nlist);
+    for (i = 0; i < Nmatch; i++) {
+      fits_convert_DetReg ((DetReg *) db[0].vtable.buffer[i], sizeof (DetReg), 1);
+    }
+    fits_db_update (db);
+    fits_db_close (db);
+    fits_db_free (db);
+
+    fprintf (stderr, "SUCCESS\n");
+    exit (0);
+  }
+
+  /* unset altpath for 'delete' images */
+  if (output.Altpath == DELETE) {
+    /* find images to delete */
+    for (i = 0; i < Nmatch; i++) {
+      if (image[match[i].image].altpath == TRUE) {
+	list[Nlist] = match[i].image;
+	Nlist ++;
+      }
+    }
+    /* remove the copies from the altpath locations */
+    for (j = 0; j < Nlist; j++) {
+      i = list[j];
+      image[i].altpath = FALSE;
+      for (n = 0; n < NDetrendAltDB; n++) {
+	sprintf (outfile, "%s/%s", DetrendAltDB[n], image[i].filename);
+	sprintf (line, "rm %s", outfile);
+	fprintf (stderr, "%s\n", line);
+	status = system (line);
+	if (status) {
+	  fprintf (stderr, "warning: can't delete %s\n", outfile);
+	}
+      }
+    }
+
+    /** we may later want to pull this out and put it elsewhere **/
+    fits_vtable_from_ftable (&db[0].ftable, &db[0].vtable, list, Nlist);
+    for (i = 0; i < Nmatch; i++) {
+      fits_convert_DetReg ((DetReg *) db[0].vtable.buffer[i], sizeof (DetReg), 1);
+    }
+    fits_db_update (db);
+    fits_db_close (db);
+    fits_db_free (db);
+
+    fprintf (stderr, "SUCCESS\n");
+    exit (0);
+  }
+
+  /* check for existence in altpath, set flag as appropriate */
+  if (output.Altpath == UPDATE) {
+    for (j = 0; j < Nmatch; j++) {
+      i = match[j].image;
+      list[Nlist] = i;
+      Nlist ++;
+      found = TRUE;
+      for (n = 0; found && (n < NDetrendAltDB); n++) {
+	sprintf (outfile, "%s/%s", DetrendAltDB[n], image[i].filename);
+	status = stat (outfile, &statbuf);
+	fprintf (stderr, "checking for %s, status is %d\n", outfile, status);
+	if (status == -1) found = FALSE;
+      }
+      image[i].altpath = found;
+    }
+
+    /** we may later want to pull this out and put it elsewhere **/
+    fits_vtable_from_ftable (&db[0].ftable, &db[0].vtable, list, Nlist);
+    for (i = 0; i < Nmatch; i++) {
+      fits_convert_DetReg ((DetReg *) db[0].vtable.buffer[i], sizeof (DetReg), 1);
+    }
+    fits_db_update (db);
+    fits_db_close (db);
+    fits_db_free (db);
+
+    fprintf (stderr, "SUCCESS\n");
+    exit (0);
+  }
+
+  fprintf (stderr, "unknown altpath mode: %d\n", output.Altpath);
+  return (TRUE);
+}
+
+
+int ckpathname (char *newpath) {
+  
+  int status;
+  char *path;
+  struct stat statbuf;
+  
+  path = pathname (newpath);
+  
+  status = stat (path, &statbuf);
+  if (status == -1) {
+    if (errno == ENOENT) {
+      if (mkdirhier (path, S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
+	fprintf (stderr, "ERROR: can't create path %s\n", path);
+	return (FALSE);
+      }
+    } else {
+      fprintf (stderr, "ERROR: problem with path %s\n", path);
+      return (FALSE);
+    }
+  }
+  free (path);
+  return (TRUE);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/args.detregister.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/args.detregister.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/args.detregister.c	(revision 21753)
@@ -0,0 +1,121 @@
+# include "imregister.h" 
+# include "detrend.h"
+
+/* criteria struct is global */
+int regargs (int argc, char **argv, Descriptor *descriptor) {
+
+  int N, i;
+
+  ConfigInit (&argc, argv);
+  ConfigCamera ();
+  ConfigFilter ();
+
+  output.Modify = TRUE;
+
+  /* these command line arguments will override image header info */
+  /* define time range */
+  descriptor[0].TimeSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-time"))) {
+    remove_argument (N, &argc, argv);
+    if (!str_to_time (argv[N], &descriptor[0].tstart)) { 
+      fprintf (stderr, "syntax error\n");
+      return (FALSE);
+    }
+    remove_argument (N, &argc, argv);
+    if (!str_to_time (argv[N], &descriptor[0].tstop)) { 
+      fprintf (stderr, "syntax error\n");
+      return (FALSE);
+    }
+    remove_argument (N, &argc, argv);
+    descriptor[0].TimeSelect = TRUE;
+  }
+
+  /* set optional label */
+  descriptor[0].label = strcreate ("detrend");
+  if ((N = get_argument (argc, argv, "-label"))) {
+    remove_argument (N, &argc, argv);
+    descriptor[0].label = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+ 
+  /* set optional label */
+  descriptor[0].imageID = NULL;
+  if ((N = get_argument (argc, argv, "-ID"))) {
+    remove_argument (N, &argc, argv);
+    descriptor[0].imageID = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+ 
+  /* set optional order */
+  descriptor[0].order = 0;
+  if ((N = get_argument (argc, argv, "-order"))) {
+    remove_argument (N, &argc, argv);
+    descriptor[0].order = atoi (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+ 
+  /* define image type */
+  descriptor[0].type = T_UNDEF;
+  if ((N = get_argument (argc, argv, "-type"))) {
+    remove_argument (N, &argc, argv);
+    descriptor[0].type = get_image_type (argv[N]);
+    if (descriptor[0].type == T_UNDEF) {
+      fprintf (stderr, "ERROR: invalid image type %s\n", argv[N]);
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+  }
+ 
+  /* define ccd number */
+  descriptor[0].CCDSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-ccd"))) {
+    remove_argument (N, &argc, argv);
+    descriptor[0].CCD = -1;
+    for (i = 0; (i < Nccd) && (descriptor[0].CCD == -1); i++) {
+      if (strnumcmp (ccds[i], argv[N])) {
+	descriptor[0].CCD = i;
+      }
+    }
+    if (descriptor[0].CCD == -1) {
+      fprintf (stderr, "ERROR: ccd %s choice out not found in camera config\n", argv[N]);
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    descriptor[0].CCDSelect = TRUE;
+  }
+ 
+  /* define exposure time */
+  descriptor[0].Exptime = 0.0;
+  descriptor[0].ExptimeSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-exptime"))) {
+    remove_argument (N, &argc, argv);
+    descriptor[0].Exptime = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+    descriptor[0].ExptimeSelect = TRUE;
+  }
+ 
+  /* define filter */
+  descriptor[0].filter = FILTER_NONE;
+  if ((N = get_argument (argc, argv, "-filter"))) {
+    remove_argument (N, &argc, argv);
+    for (i = 0; (i < NFILTER) && (descriptor[0].filter == FILTER_NONE); i++) {
+      if (!strcasecmp (argv[N], filtername[i])) {
+	descriptor[0].filter = filternum[i];
+      }
+    }      
+    if (descriptor[0].filter == FILTER_NONE) {
+      fprintf (stderr, "ERROR: invalid filter %s\n", argv[N]);
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+  }
+
+  /*** this program will only register SPLIT images ***/
+
+  if (argc != 2) {
+    fprintf (stderr, "USAGE: detregister (filename) [config ops] -time start stop] [-type type] [-ccd N] [-filter name]\n");
+    fprintf (stderr, "ERROR - detregister not run\n");
+    exit (1);
+  }
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/args.detsearch.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/args.detsearch.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/args.detsearch.c	(revision 21753)
@@ -0,0 +1,384 @@
+# include "imregister.h"
+# include "detrend.h"
+
+/********* decipher all of the possible command-line options ***********/
+int args (int argc, char **argv) {
+
+  int i, N;
+  int MosaicSelect, ImageSelect, bad, Recipe, Ncrit;
+  char *ImageFile, *ImageMode, *ImageExtend;
+  Criteria base, *crit;
+  int *filt;
+  unsigned long *tstart, *tstop;
+
+  if ((N = get_argument (argc, argv, "-h"))) { usage (); }
+  if ((N = get_argument (argc, argv, "--help"))) { usage (); }
+  bzero (&base, sizeof (Criteria));
+
+  /* check config & command-line args */
+  ConfigInit (&argc, argv);
+  ConfigCamera ();
+  ConfigFilter ();
+
+  ImageFile = ImageMode = ImageExtend = NULL;
+
+  /* mosaic-based selection */
+  MosaicSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-mosaic"))) {
+    remove_argument (N, &argc, argv);
+    ImageFile = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    MosaicSelect = TRUE;
+    /* check for incompatible arguments: -exptime, -filter, -time, -ccd */
+    bad = get_argument (argc, argv, "-exptime");
+    bad &= get_argument (argc, argv, "-image");
+    bad &= get_argument (argc, argv, "-filter");
+    bad &= get_argument (argc, argv, "-trange");
+    bad &= get_argument (argc, argv, "-time");
+    bad &= get_argument (argc, argv, "-ccd");
+    if (bad) { 
+      fprintf (stderr, "ERROR: syntax error: conflict with -mosaic\n");
+      exit (1);
+    }
+  }
+
+  /* image-based selection */
+  ImageSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-image"))) {
+    remove_argument (N, &argc, argv);
+    ImageFile = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    ImageExtend = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    ImageMode = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    ImageSelect = TRUE;
+    /* check for incompatible arguments: -exptime, -filter, -time, -ccd */
+    bad = get_argument (argc, argv, "-exptime");
+    bad &= get_argument (argc, argv, "-filter");
+    bad &= get_argument (argc, argv, "-trange");
+    bad &= get_argument (argc, argv, "-time");
+    bad &= get_argument (argc, argv, "-ccd");
+    if (bad) { 
+      fprintf (stderr, "ERROR: syntax error: conflict with -image\n");
+      exit (1);
+    }
+  }
+
+  /* define image type */
+  base.TypeSelect = FALSE;
+  base.Type = T_UNDEF;
+  if ((N = get_argument (argc, argv, "-type"))) {
+    remove_argument (N, &argc, argv);
+    base.Type = get_image_type (argv[N]);
+    if (base.Type == T_UNDEF) {
+      fprintf (stderr, "ERROR: invalid image type %s\n", argv[N]);
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    base.TypeSelect = TRUE;
+    if (base.Type == T_ANY) base.TypeSelect = FALSE;
+  }
+ 
+  /* image mode (mef, splt, etc) */
+  base.ModeSelect = FALSE;
+  base.Mode = M_UNDEF;
+  if ((N = get_argument (argc, argv, "-mode"))) {
+    remove_argument (N, &argc, argv);
+    base.Mode = get_image_mode (argv[N]);
+    if (base.Mode == M_UNDEF) {
+      fprintf (stderr, "ERROR: invalid image mode %s\n", argv[N]);
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    base.ModeSelect = TRUE;
+  }
+ 
+  /* define time / ranges */
+  tstart = tstop = (unsigned long *) NULL;
+  base.TimeSelect = base.tstart = base.tstop = 0;
+  if ((N = get_argument (argc, argv, "-time"))) {
+    remove_argument (N, &argc, argv);
+    bad  = get_argument (argc, argv, "-trange");
+    bad &= str_to_time (argv[N], &base.tstart);
+    if (bad) {
+      fprintf (stderr, "ERROR: syntax error in -time\n");
+      exit (1);
+    }
+    base.tstop = base.tstart;  /* no need for dtime > 0 ? */
+    remove_argument (N, &argc, argv);
+    base.TimeSelect = 1;
+  } else {
+    if (!get_trange_arguments (&argc, argv, &tstart, &tstop, &base.TimeSelect)) {
+      fprintf (stderr, "ERROR: syntax error in -trange\n");
+      exit (1);
+    }
+  }
+
+  /* define filters */
+  base.FilterSelect = FALSE;
+  if (!get_filter_arguments (&argc, argv, &filt, &base.FilterSelect)) {
+    fprintf (stderr, "ERROR: syntax error in -filter\n");
+    exit (1);
+  }
+
+  /* define ccd number */
+  base.CCDSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-ccd"))) {
+    base.CCD = -1;
+    remove_argument (N, &argc, argv);
+    for (i = 0; (i < Nccd) && (base.CCD == -1); i++) {
+      if (strnumcmp (ccds[i], argv[N])) {
+	base.CCD = i;
+      }
+    }
+    if (base.CCD == -1) {
+      fprintf (stderr, "ERROR: ccd %s choice out not found in camera config\n", argv[N]);
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    base.CCDSelect = TRUE;
+  }
+ 
+  /* define exposure time */
+  base.ExptimeSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-exptime"))) {
+    remove_argument (N, &argc, argv);
+    base.Exptime = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+    base.ExptimeSelect = TRUE;
+  }
+ 
+  /* varients on the standard selection */
+  base.EntrySelect = FALSE;
+  if ((N = get_argument (argc, argv, "-entry"))) {
+    remove_argument (N, &argc, argv);
+    base.Entry = atoi (argv[N]);
+    remove_argument (N, &argc, argv);
+    base.EntrySelect = TRUE;
+  }
+  base.MatchNumber = -1;
+  if ((N = get_argument (argc, argv, "-match"))) {
+    remove_argument (N, &argc, argv);
+    base.MatchNumber = atoi (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  base.LabelSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-label"))) {
+    remove_argument (N, &argc, argv);
+    base.Label = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    base.LabelSelect = TRUE;
+  }
+  base.NameSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-name"))) {
+    remove_argument (N, &argc, argv);
+    base.Name = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    base.NameSelect = TRUE;
+  }
+
+  /* these options affect the output mode */
+  output.Close = FALSE;
+  if ((N = get_argument (argc, argv, "-close"))) {
+    if (!base.TimeSelect && !ImageSelect && !MosaicSelect) {       
+      fprintf (stderr, "ERROR: syntax error in -close requires one of: -time -trange -image -mosaic\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    output.Close = TRUE;
+  }
+  output.TimeMode = START;
+  if ((N = get_argument (argc, argv, "-tstop"))) {
+    remove_argument (N, &argc, argv);
+    output.TimeMode = STOP;
+  }
+  if ((N = get_argument (argc, argv, "-treg"))) {
+    remove_argument (N, &argc, argv);
+    output.TimeMode = REG;
+  }
+  output.ElixirSmart = FALSE;
+  if ((N = get_argument (argc, argv, "-ve"))) {
+    remove_argument (N, &argc, argv);
+    output.ElixirSmart = TRUE;
+  }
+  output.verbose = TRUE;
+  if ((N = get_argument (argc, argv, "-quiet"))) {
+    remove_argument (N, &argc, argv);
+    output.verbose = FALSE;
+  }
+  output.table = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-fits"))) {
+    remove_argument (N, &argc, argv);
+    output.table = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  output.bintable = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-binfits"))) {
+    remove_argument (N, &argc, argv);
+    output.bintable = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  output.Criteria = FALSE;
+  if ((N = get_argument (argc, argv, "-criteria"))) {
+    output.Criteria = TRUE;
+    remove_argument (N, &argc, argv);
+  }
+  output.Chipname = FALSE;
+  if ((N = get_argument (argc, argv, "-chipname"))) {
+    output.Chipname = TRUE;
+    remove_argument (N, &argc, argv);
+  }
+
+  /* these options modify behavior */
+  output.Select = FALSE;
+  if ((N = get_argument (argc, argv, "-select"))) {
+    remove_argument (N, &argc, argv);
+    output.Select = TRUE;
+  }
+ 
+  /* these options modify behavior */
+  Recipe = FALSE;
+  if ((N = get_argument (argc, argv, "-recipe"))) {
+    remove_argument (N, &argc, argv);
+    Recipe = TRUE;
+    if (base.Type != T_UNDEF) {
+      fprintf (stderr, "-recipe and -type cannot be combined\n");
+      exit (1);
+    }
+  }
+ 
+  /* options which alter the database */
+  output.Delete = FALSE;
+  if ((N = get_argument (argc, argv, "-del"))) {
+    remove_argument (N, &argc, argv);
+    output.Delete = TRUE;
+  }
+  if ((N = get_argument (argc, argv, "-delete"))) {
+    remove_argument (N, &argc, argv);
+    output.Delete = TRUE;
+  }
+ 
+  output.Altpath = NONE;
+  if ((N = get_argument (argc, argv, "-altpath"))) {
+    if (output.Delete) {
+      fprintf (stderr, "can't combine -delete and -altpath flags\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    if (!strcasecmp (argv[N], "add")) output.Altpath = ADD;
+    if (!strcasecmp (argv[N], "delete")) output.Altpath = DELETE;
+    if (!strcasecmp (argv[N], "update")) output.Altpath = UPDATE;
+    if (!output.Altpath) { 
+      fprintf (stderr, "invalid -altpath option\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+  }
+
+  output.Modify = FALSE;
+  if ((N = get_argument (argc, argv, "-modify"))) {
+    if (output.Delete) {
+      fprintf (stderr, "can't combine -delete and -modify flags\n");
+      exit (1);
+    }
+    if (output.Altpath) {
+      fprintf (stderr, "can't combine -altpath and -modify flags\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    output.Modify = TRUE;
+    output.ModifyEntry = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    output.ModifyValue = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    if (!strcasecmp (output.ModifyEntry, "label")) goto valid_entry;
+    if (!strcasecmp (output.ModifyEntry, "order")) goto valid_entry;
+    if (!strcasecmp (output.ModifyEntry, "mode"))  goto valid_entry;
+    if (!strcasecmp (output.ModifyEntry, "tstop")) goto valid_entry;
+    if (!strcasecmp (output.ModifyEntry, "tstart")) goto valid_entry;
+    fprintf (stderr, "invalid entry for -modify %s\n", output.ModifyEntry);
+    exit (1);
+  valid_entry:
+    if (!strcasecmp (output.ModifyEntry, "tstart") || !strcasecmp (output.ModifyEntry, "tstop")) {
+      if (!str_to_time (output.ModifyValue, &output.TimeValue)) { 
+	fprintf (stderr, "ERROR: invalid time %s\n", output.ModifyValue);
+	exit (1);
+      }
+    }
+  }
+
+  /* consistency checks */
+  if ((base.Type == T_DARK) || (base.Type == T_BIAS) || (base.Type == T_MASK)) {
+    if (base.FilterSelect) {
+      fprintf (stderr, "ERROR: filter invalid with type %s\n", get_type_name(base.Type));
+      exit (1);
+    }
+  }
+  /*
+  if ((base.Type != T_DARK) && base.ExptimeSelect) {
+    fprintf (stderr, "ERROR: exptime invalid with type %s\n", get_type_name(base.Type));
+    exit (1);
+  }
+  */
+  if (output.Select && !base.TimeSelect) {
+    fprintf (stderr, "ERROR: selection missing time\n");
+    exit (1);
+  }
+
+  /* arguments have all been read */
+  if (argc != 1) {
+    fprintf (stderr, "USAGE: detsearch [config ops] [-mosaic name] [-image name Nx Mode] [-time start] [-type type] [-ccd N] [-filter name]\n");
+    exit (1);
+  }
+
+  /* set up criteria based on image, mosaic, or base (all mutually exclusive) */
+  crit = NULL;
+  if (ImageSelect)  
+    crit = ImageCriteria (base, ImageFile, ImageExtend, ImageMode, &Ncrit);
+  if (MosaicSelect) 
+    crit = MosaicCriteria (base, ImageFile, &Ncrit);
+  if (!MosaicSelect && !ImageSelect)
+    crit = ExpandBase (base, &Ncrit, tstart, tstop, filt);
+
+  if (Recipe) {
+    crit = ExpandRecipe (crit, &Ncrit);
+  }
+
+  Ncriteria = Ncrit;
+  criteria = crit;
+
+  return (TRUE);
+}
+
+Criteria *ExpandBase (Criteria base, int *ncrit, unsigned long *tstart, unsigned long *tstop, int *filt) {
+
+  Criteria *crit;
+  int i, j, Nc, Ncrit, Ntimes, Nfilt; 
+
+  /* expand multiple -filter, -trange options */
+  Nfilt  = base.FilterSelect;
+  Ntimes = base.TimeSelect;
+  if (Ntimes == 0) Ntimes = 1;
+  if (Nfilt  == 0) Nfilt  = 1;
+
+  Ncrit = Nfilt*Ntimes;
+  ALLOCATE (crit, Criteria, Ncrit);
+
+  Nc = 0;
+  for (i = 0; i < Nfilt; i++) {
+    for (j = 0; j < Ntimes; j++) {
+      crit[Nc] = base;
+      if (tstart != (unsigned long *) NULL) {
+	crit[Nc].tstart       = tstart[j];
+	crit[Nc].tstop        = tstop[j];
+      } 
+      if (base.FilterSelect) {
+	crit[Nc].Filter       = filt[i];
+      } 
+      Nc ++;
+    }
+  }
+  *ncrit = Ncrit;
+  return (crit);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/criteria.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/criteria.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/criteria.c	(revision 21753)
@@ -0,0 +1,219 @@
+# include "imregister.h"
+# include "detrend.h"
+
+Match CheckCriteria (DetReg *image) {
+
+  Match match;
+  int i, close, crit;
+
+  match.state = MATCH_NONE;
+  match.crit  = 0;
+  match.image = -1;
+
+  crit = 0;
+  close = FALSE;
+  for (i = 0; (i < Ncriteria) && (match.state == MATCH_NONE); i++) {
+
+    if (criteria[i].CCDSelect) {
+      if (image[0].mode == M_MEF) goto valid_ccd;
+      if (image[0].mode == M_MODES) goto valid_ccd;
+      if (image[0].ccd  == criteria[i].CCD) goto valid_ccd;
+      continue;
+    }
+  valid_ccd:
+
+    if (criteria[i].TypeSelect   && (image[0].type            != criteria[i].Type))   continue;
+    if (criteria[i].ModeSelect   && (image[0].mode            != criteria[i].Mode))   continue;
+    if (criteria[i].FilterSelect && (image[0].filter          != criteria[i].Filter)) continue;
+
+    if (criteria[i].EntrySelect  && (image[0].Nentry          != criteria[i].Entry))  continue;
+    if (criteria[i].LabelSelect  && (strcasecmp (image[0].label, criteria[i].Label))) continue;
+    if (criteria[i].NameSelect   && (strstr (image[0].filename, criteria[i].Name) == (char *) NULL)) continue;
+
+    /* looking for the best 'close' match: minimum |dt| */
+    if (criteria[i].TimeSelect   && (image[0].tstart           > criteria[i].tstop))  {
+      close = TRUE;
+      crit  = i;
+      continue;
+    } 
+    if (criteria[i].TimeSelect   && (image[0].tstop            < criteria[i].tstart)) {
+      close = TRUE;
+      crit  = i;
+      continue;
+    } 
+    match.crit  = i;
+    match.state = MATCH_PERFECT;
+  }
+
+  if ((match.state == MATCH_NONE) && close) {
+    match.crit  = crit;
+    match.state = MATCH_CLOSE;
+  }    
+  return (match);
+
+}
+
+/* 
+   the image only needs to match one criterion
+   close only counts for TimeSelect
+   multiple criteria can exist for Range, CCD, Filter
+*/
+
+Match *ExptimeCriteria (DetReg *image, int Nimage, Match *match, int *nmatch) {
+
+  int i, j, Nmatch, Nnew, NNEW, entry;
+  unsigned long dtime;
+  float Chi, ChiMin;
+  Match *new;
+
+  Nmatch = *nmatch;
+
+  Nnew = 0;
+  NNEW = 100;
+  ALLOCATE (new, Match, NNEW);
+
+  for (i = 0; i < Ncriteria; i++) {
+
+    /* find min Chi value */
+    ChiMin = HUGE;
+    for (j = 0; j < Nmatch; j++) {
+      if (match[j].crit != i) continue;
+      if (!criteria[i].ExptimeSelect) {
+	new[Nnew] = match[j];
+	Nnew ++;
+	if (Nnew == NNEW) {
+	  NNEW += 100;
+	  REALLOCATE (new, Match, NNEW);
+	}
+	continue;
+      }
+
+      entry = match[j].image;
+
+      dtime = 0;
+      if (criteria[i].TimeSelect) {
+	if (criteria[i].tstart > image[entry].tstop) 
+	  dtime = criteria[i].tstart - image[entry].tstop;
+	if (criteria[i].tstop < image[entry].tstart) 
+	  dtime = image[entry].tstart - criteria[i].tstop;
+      }
+      Chi = dtime / 864.0 + abs (criteria[i].Exptime - image[entry].exptime);
+      ChiMin = MIN (Chi, ChiMin);
+    }
+
+    /* select entries with Chi <= ChiMin */
+    for (j = 0; j < Nmatch; j++) {
+      if (match[j].crit != i) continue;
+      if (!criteria[i].ExptimeSelect) continue;
+      entry = match[j].image;
+      
+      dtime = 0;
+      if (criteria[i].TimeSelect) {
+	if (criteria[i].tstart > image[entry].tstop) 
+	  dtime = criteria[i].tstart - image[entry].tstop;
+	if (criteria[i].tstop < image[entry].tstart) 
+	  dtime = image[entry].tstart - criteria[i].tstop;
+      }
+      Chi = dtime / 864.0 + abs (criteria[i].Exptime - image[entry].exptime);
+      if (Chi <= ChiMin) {
+	new[Nnew] = match[j];
+	Nnew ++;
+	if (Nnew == NNEW) {
+	  NNEW += 100;
+	  REALLOCATE (new, Match, NNEW);
+	}
+      }
+    }
+  }
+
+  free (match);
+  *nmatch = Nnew;
+  return (new);
+}
+
+Match *CloseCriteria (DetReg *image, int Nimage, Match *match, int *nmatch) {
+
+  int i, j, Nmatch, Nnew, NNEW, Ngood, entry;
+  unsigned long dmin, dtime;
+  Match *new;
+
+  Nmatch = *nmatch;
+
+  Nnew = 0;
+  NNEW = 100;
+  ALLOCATE (new, Match, NNEW);
+
+  for (i = 0; i < Ncriteria; i++) {
+
+    Ngood = 0;
+
+    /* first include only perfect matches */
+    for (j = 0; j < Nmatch; j++) {
+      if (match[j].crit  != i) continue;
+      if (match[j].state != MATCH_PERFECT) continue;
+
+      Ngood ++;
+      new[Nnew] = match[j];
+      Nnew ++;
+      if (Nnew == NNEW) {
+	NNEW += 100;
+	REALLOCATE (new, Match, NNEW);
+      }	
+    } 
+
+    if (Ngood) continue;
+    if (!output.Close) continue;
+    if (!criteria[i].TimeSelect) continue;
+
+    /* find closest time */
+    dmin = 0xffffffff;
+    for (j = 0; j < Nmatch; j++) {
+      if (match[j].crit  != i) continue;
+      entry = match[j].image;
+      dtime = (image[entry].tstop < criteria[i].tstart) ?  criteria[i].tstart - image[entry].tstop : image[entry].tstart - criteria[i].tstop;
+      dmin = MIN (dmin, dtime);
+    }
+
+    /* select images with dtime == dmin */
+    for (j = 0; j < Nmatch; j++) {
+      if (match[j].crit  != i) continue;
+      entry = match[j].image;
+      dtime = (image[entry].tstop < criteria[i].tstart) ?  criteria[i].tstart - image[entry].tstop : image[entry].tstart - criteria[i].tstop;
+      if (dtime <= dmin) {
+	new[Nnew] = match[j];
+	Nnew ++;
+	if (Nnew == NNEW) {
+	  NNEW += 100;
+	  REALLOCATE (new, Match, NNEW);
+	}	
+      }
+    }
+  }
+
+  free (match);
+  *nmatch = Nnew;
+  return (new);
+}
+
+
+
+
+
+/* CheckCriteria returns two pieces of information:
+   match state (MATCH_NONE, MATCH_CLOSE, MATCH_PERFECT)
+   match entry (i)
+*/
+   
+/* match[] contains all potentially valid matches.
+   if they are darks, there will be several with similar values for detdata[i].tstop
+   we want to minimize:
+   (tzero - tstop) and abs (ExpTime - detdata[i].exptime) 
+
+   Chi = (tzero - tstop) / 864 + abs (ExpTime - detdata[i].exptime)
+
+   if (tzero - tstop) = 2 days, this term contributes 200.  
+*/
+
+
+/* CloseCriteria returns all images which are either a perfect match
+   or which are close and have the same minimum time distance */
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/db_names.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/db_names.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/db_names.c	(revision 21753)
@@ -0,0 +1,66 @@
+# include "imregister.h"
+# include "detrend.h"
+
+static char *dBFile  = NULL;
+static char *dBPath  = NULL;
+static char *dBTrash = NULL;
+
+/*** these are functions to handle the special detrend.db file/trash names ****/
+
+char *set_dBFile () {
+
+  struct stat statbuf;
+  int status;
+
+  dBPath = DetrendDB;
+
+  /* define dBFile based on config data */
+  ALLOCATE (dBFile, char, strlen (dBPath) + 15);
+  sprintf (dBFile, "%s/detrend.db", dBPath);;
+  ALLOCATE (dBTrash, char, strlen (dBPath) + 15);
+  sprintf (dBTrash, "%s/trash", dBPath);
+
+  /* check on directories */
+  status = stat (dBPath, &statbuf);
+  if (output.Modify) {
+    if (status == -1) {
+      if (mkdirhier (dBPath, S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
+	fprintf (stderr, "ERROR: can't find or create path %s\n", dBPath);
+	exit (1);
+      }
+    }
+  }
+  if (output.Delete) {
+    status = stat (dBTrash, &statbuf);
+    if (status == -1) {
+      if (mkdirhier (dBTrash, S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
+	fprintf (stderr, "ERROR: detrend dB trash not found %s\n", dBTrash);
+	exit (1);
+      }
+    }
+  }
+  return (dBFile);
+}
+
+char *get_dBPath () {
+
+  return (dBPath);
+
+}
+
+int delete_image (DetReg *item) {
+  
+  int status;
+  char line[256];
+
+  if (output.verbose) fprintf (stderr, "deleting %s\n", item[0].filename);
+  sprintf (line, "mv -f %s/%s %s", dBPath, item[0].filename, dBTrash);
+  status = system (line);
+  if (status) fprintf (stderr, "trouble moving %s to trash (%s)\n", item[0].filename, dBTrash);
+
+  if (status) 
+    return (FALSE);
+  else 
+    return (TRUE);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/delete.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/delete.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/delete.c	(revision 21753)
@@ -0,0 +1,50 @@
+# include "imregister.h"
+# include "detrend.h"
+
+void DeleteSubset (FITS_DB *db, DetReg *image, int Nimage, Match *match, int Nmatch) {
+
+  int i, j;
+  int *keep, Ndel, Nsubset;
+  DetReg *subset;
+
+  ALLOCATE (keep, int, MAX (Nimage, 1));
+  for (i = 0; i < Nimage; i++) keep[i] = TRUE;
+  fprintf (stderr, "total of %d detrend images\n", Nimage);
+
+  Ndel = 0;
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j].image;
+    if (i == -1) continue;
+    keep[i] = FALSE;
+    Ndel ++;
+    delete_image (&image[i]);
+  }
+  fprintf (stderr, "delete %d images\n", Ndel);
+  if (Ndel == 0) { 
+    fprintf (stderr, "SUCCESS\n");
+    fits_db_close (db);
+    exit (0);
+  }
+
+  /* create new data list */
+  Nsubset = Nimage - Ndel;
+  ALLOCATE (subset, DetReg, MAX (1, Nsubset));
+  fprintf (stderr, "keeping %d images\n", Nsubset);
+  for (j = i = 0; i < Nimage; i++) {
+    if (!keep[i]) continue;
+    subset[j] = image[i];
+    j ++;
+  }
+  free (keep);
+  free (image);
+
+  /** we may later want to pull this out and put it elsewhere **/
+  /** free db[0].theader, db[0].table.buffer? **/
+  fits_table_set_DetReg (&db[0].ftable, subset, Nsubset);
+  fits_db_save (db);
+  fits_db_close (db);
+  fits_db_free (db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/entry.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/entry.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/entry.c	(revision 21753)
@@ -0,0 +1,112 @@
+# include "imregister.h"
+# include "detrend.h"
+
+DetReg DefineEntry (Descriptor descriptor) {
+  
+  struct timeval now;
+  DetReg newdata;
+
+  gettimeofday (&now, (void *) NULL);
+  
+  /* now we have all of the data (except filename), set the new entry */
+  newdata.tstart    = descriptor.tstart;
+  newdata.tstop     = descriptor.tstop;
+  newdata.treg      = now.tv_sec;
+  newdata.type      = descriptor.type;
+  newdata.filter    = descriptor.filter;
+  newdata.ccd       = descriptor.CCD;
+  newdata.exptime   = descriptor.Exptime;
+  newdata.Norder    = descriptor.order;
+  newdata.mode      = descriptor.mode;
+  newdata.altpath   = FALSE;
+  bzero (newdata.dummy, 58);
+  snprintf (newdata.label, 64, "%s", descriptor.label);
+  
+  return (newdata);
+}
+
+/* we are generating a name based on type, etc.  determine valid path */
+int SaveEntry (char *input, DetReg *newdata, char *ID) {
+
+  int status;
+  int found, Ntry, filestate;
+  char path[256], fullpath[256], filename[256], rootname[256], fullname[256], line[512];
+  char *dBPath;
+  char *filter_basename;
+  struct stat statbuf;
+  FILE *f;
+
+  filter_basename = filterhash[newdata[0].filter];
+  dBPath = get_dBPath ();
+
+  if (newdata[0].type == T_FLAT) {
+    sprintf (path, "%s/%s", get_type_name(newdata[0].type), filter_basename);
+  } else {
+    sprintf (path, "%s", get_type_name(newdata[0].type));
+  }    
+  sprintf (fullpath, "%s/%s", dBPath, path);
+
+  status = stat (fullpath, &statbuf);
+  if (status == -1) {
+    if (errno == ENOENT) {
+      if (mkdirhier (fullpath, S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
+	fprintf (stderr, "ERROR: can't create path %s\n", fullpath);
+	exit (1);
+      }
+    } else {
+      fprintf (stderr, "ERROR: problem with path %s\n", fullpath);
+      exit (1);
+    }
+  }
+
+  /* base filename constructed from detrend type information */
+  switch (newdata[0].type) {
+  case T_DARK:
+  case T_BIAS:
+  case T_MASK:
+    sprintf (rootname, "%s.%s.%d.%02d", ID, get_type_name(newdata[0].type), (int)newdata[0].exptime, newdata[0].ccd);
+    break;
+  default:
+    sprintf (rootname, "%s.%s.%s.%02d", ID, get_type_name(newdata[0].type), filter_basename, newdata[0].ccd);
+  }
+
+  /* find & lock first file of the format name that does not exist */
+  found = FALSE;
+  for (Ntry = 0; !found && (Ntry < 100); Ntry++) {
+    sprintf (filename, "%s/%s.%02d.fits", path, rootname, Ntry);
+    sprintf (fullname, "%s/%s", dBPath, filename);
+    f = fsetlockfile (fullname, 2.0, LCK_XCLD, &filestate);
+    /* if there is an error, it may just mean file is locked. */
+    if (filestate == LCK_EMPTY) {
+	found = TRUE;
+	newdata[0].Nentry = Ntry;
+    } 
+  }
+  if (!found) { 
+    fprintf (stderr, "ERROR: no available target files for %s/%s?\n", path, rootname);
+    exit (1);
+  }
+  strcpy (newdata[0].filename, filename);
+    
+  if (DEBUG) {
+    fprintf (stderr, "path: %s\n", path);
+    fprintf (stderr, "fullpath: %s\n", fullpath);
+    fprintf (stderr, "filename: %s\n", filename);
+    fprintf (stderr, "dBPath: %s\n", dBPath);
+    fprintf (stderr, "line: %s\n", line);
+  }
+
+  /* copy the file to the new name, add entry to database */
+  /* we need some error checking here - complain if filename > 255 */
+  /* the copy replaces the locked file, lock remains valid */
+
+  sprintf (line, "/bin/cp -f %s %s", input, fullname);
+  status = system (line);
+  if (status) {
+    fprintf (stderr, "ERROR: failure in image copy %s to %s\n", input, fullname);
+    exit (1);
+  }
+  fclearlockfile (fullname, f, LCK_XCLD, &filestate);
+
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/imdef.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/imdef.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/imdef.c	(revision 21753)
@@ -0,0 +1,149 @@
+# include "imregister.h"
+# include "detrend.h"
+
+int DefineImage (char *filename, Descriptor *descriptor) {
+
+  int i, Extend, Nextend;
+  char line[512];
+  Header header;
+
+  /* load remaining options from the image header */
+  if (!fits_read_header (filename, &header)) {
+    fprintf (stderr, "ERROR: trouble reading image header\n");
+    exit (1);
+  }
+
+  /* first decide on image TYPE */
+  if (descriptor[0].type == T_UNDEF) {
+    if (!fits_scan (&header, ImagetypeKeyword, "%s", 1, line)) {
+      fprintf (stderr, "ERROR: failure to read %s from header\n", ImagetypeKeyword);
+      exit (1);
+    }
+    descriptor[0].type = get_image_type (line);
+    if (descriptor[0].type == T_UNDEF) {
+      fprintf (stderr, "ERROR: invalid image type %s\n", line);
+      exit (1);
+    }
+  }    
+  /* conflicts */
+  if ((descriptor[0].type == T_DARK) && (descriptor[0].filter != FILTER_NONE)) {
+    fprintf (stderr, "ERROR: dark can't have a filter\n");
+    exit (1);
+  }
+  if ((descriptor[0].type == T_BIAS) && (descriptor[0].filter != FILTER_NONE)) {
+    fprintf (stderr, "ERROR: bias can't have a filter\n");
+    exit (1);
+  }
+  if ((descriptor[0].type == T_MASK) && (descriptor[0].filter != FILTER_NONE)) {
+    fprintf (stderr, "ERROR: mask can't have a filter\n");
+    exit (1);
+  }
+
+  /* identify MODE (MEF / SPLIT)  */
+  descriptor[0].mode = M_SPLIT;
+  Extend = FALSE;
+  fits_scan (&header, "EXTEND", "%t", 1, &Extend);
+  if (Extend) {
+    descriptor[0].mode      = M_MEF;
+    descriptor[0].CCD       = Nccd;
+    descriptor[0].CCDSelect = TRUE;
+    fits_scan (&header, "NEXTEND",  "%d", 1, &Nextend);
+    if (Nextend != Nccd) { 
+      fprintf (stderr, "warning: NEXTEND != Nccd (%d, %d)\n", Nextend, Nccd);
+    }      
+  }
+
+  /* modes: a special case */
+  if (descriptor[0].type == T_MODES) {
+    descriptor[0].mode      = M_MODES;
+    descriptor[0].CCD       = Nccd;
+    descriptor[0].CCDSelect = TRUE;
+  }
+
+  /* now identify CCD number */
+  if (!descriptor[0].CCDSelect) {
+    char ID[64];
+
+    descriptor[0].CCD = -1;
+    if (!fits_scan (&header, CCDnumKeyword, "%s", 1, ID)) {
+      fprintf (stderr, "ERROR: failure to read %s from header\n", CCDnumKeyword);
+      exit (1);
+    }
+    for (i = 0; (i < Nccd) && (descriptor[0].CCD == -1); i++) {
+      if (strnumcmp (ID, ccds[i])) {
+	descriptor[0].CCD = i;
+      }
+    }
+    if (descriptor[0].CCD == -1) {
+      fprintf (stderr, "warning: ccd id not found\n");
+      descriptor[0].CCD = 0;
+    }
+    descriptor[0].CCDSelect = TRUE;
+  }
+
+  /* now get time range */
+  if (!descriptor[0].TimeSelect) {
+    if (!fits_scan (&header, "TVSTART",   "%s", 1, line)) {
+      fprintf (stderr, "ERROR: missing start time\n");
+      exit (1);
+    }
+    if (!str_to_time (line, &descriptor[0].tstart)) { 
+      fprintf (stderr, "ERROR: invalid time %s\n", line);
+      exit (1);
+    }
+    
+    if (!fits_scan (&header, "TVSTOP",   "%s", 1, line)) {
+      fprintf (stderr, "ERROR: missing stop time\n");
+      exit (1);
+    }
+    if (!str_to_time (line, &descriptor[0].tstop)) { 
+      fprintf (stderr, "ERROR: invalid time %s\n", line);
+      exit (1);
+    }
+  }
+
+  /* select the filter */
+  if (descriptor[0].type == T_DARK) goto skip_filter;
+  if (descriptor[0].type == T_BIAS) goto skip_filter;
+  if (descriptor[0].type == T_MASK) goto skip_filter;
+  if (descriptor[0].filter != FILTER_NONE) goto skip_filter;
+  if (!fits_scan (&header, FilterKeyword, "%s", 1, line)) {
+    fprintf (stderr, "ERROR: failure to read %s from header\n", FilterKeyword);
+    exit (1);
+  }
+  for (i = 0; (i < NFILTER) && (descriptor[0].filter == FILTER_NONE); i++) {
+    if (!strcasecmp (line, filtername[i])) {
+      descriptor[0].filter = filternum[i];
+    }
+  }      
+  if (descriptor[0].filter == FILTER_NONE) {
+    fprintf (stderr, "ERROR: invalid filter %s\n", line);
+    exit (1);
+  }
+skip_filter:
+
+  /* set the exposure time, if needed */
+  if (descriptor[0].ExptimeSelect && (descriptor[0].type != T_DARK)) {
+    fprintf (stderr, "exposure time is not allowed for type %s\n", get_type_name(descriptor[0].type));
+    exit (1);
+  }
+  if (!descriptor[0].ExptimeSelect && (descriptor[0].type == T_DARK)) {
+    if (!fits_scan (&header, ExptimeKeyword,  "%f", 1, &descriptor[0].Exptime)) {
+      fprintf (stderr, "ERROR: failure to read %s from header\n", ExptimeKeyword);
+      exit (1);
+    }
+  }
+
+  /* set the image ID (if not supplied) based on the camera header */
+  if (descriptor[0].imageID == NULL) {
+    if (fits_scan (&header, "CRUNID",   "%s", 1, line)) {
+      descriptor[0].imageID = strcreate (line);
+    }
+  }
+  if (descriptor[0].imageID == NULL) {
+    descriptor[0].imageID = strcreate ("test");
+  }  
+  
+  return (TRUE);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/match.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/match.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/match.c	(revision 21753)
@@ -0,0 +1,32 @@
+# include "imregister.h"
+# include "detrend.h"
+
+Match *MatchCriteria (DetReg *image, int Nimage, int *nmatch) {
+
+  int i;
+  int Nmatch, NMATCH;
+  Match result, *match;
+
+  /* find entries that matches criteria */
+  Nmatch = 0;
+  NMATCH = 100;
+  ALLOCATE (match, Match, NMATCH);
+
+  /* find set of images that matches criteria */
+  for (i = 0; i < Nimage; i++) {
+    result = CheckCriteria (&image[i]);
+    if (result.state == MATCH_NONE) continue;
+
+    result.image = i;
+    match[Nmatch] = result;
+    Nmatch ++;
+    if (Nmatch == NMATCH) {
+      NMATCH += 100;
+      REALLOCATE (match, Match, NMATCH);
+    }
+  }
+
+  *nmatch = Nmatch;
+  return (match);
+  
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/modify.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/modify.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/modify.c	(revision 21753)
@@ -0,0 +1,58 @@
+# include "imregister.h"
+# include "detrend.h"
+
+int ModifySubset (FITS_DB *db, DetReg *image, int Nimage, Match *match, int Nmatch) {
+  
+  int i, j, value;
+  int *list;
+  
+  value = M_UNDEF;
+
+  ALLOCATE (list, int, Nimage);
+  if (!strcasecmp (output.ModifyEntry, "mode")) {
+    value = get_image_mode (output.ModifyValue);
+    if (value == M_UNDEF) {
+      fprintf (stderr, "ERROR: invalid image mode %s\n", output.ModifyValue);
+      exit (1);
+    }
+  }
+  if (!strcasecmp (output.ModifyEntry, "order")) {
+    value = atoi (output.ModifyValue);
+  }
+
+  /* list matched images */
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j].image;
+    list[j] = i;
+    
+    if (!strcasecmp (output.ModifyEntry, "label")) {
+      snprintf (image[i].label, 64, "%s", output.ModifyValue);
+    }
+    if (!strcasecmp (output.ModifyEntry, "order")) {
+      image[i].Norder = value;
+    }
+    if (!strcasecmp (output.ModifyEntry, "mode")) {
+      image[i].mode   = value;
+    }
+    if (!strcasecmp (output.ModifyEntry, "tstart")) {
+      image[i].tstart = output.TimeValue;
+    }
+    if (!strcasecmp (output.ModifyEntry, "tstop")) {
+      image[i].tstop  = output.TimeValue;
+    }
+  }
+
+  /** we may later want to pull this out and put it elsewhere **/
+  fits_vtable_from_ftable (&db[0].ftable, &db[0].vtable, list, Nmatch);
+  for (i = 0; i < Nmatch; i++) {
+    fits_convert_DetReg ((DetReg *) db[0].vtable.buffer[i], sizeof (DetReg), 1);
+  }
+  fits_db_update (db);
+  fits_db_close (db);
+  fits_db_free (db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/output.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/output.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/output.c	(revision 21753)
@@ -0,0 +1,289 @@
+# include "imregister.h"
+# include "detrend.h"
+
+char *RandomPath (char *dBPath);
+extern double drand48();
+
+int OutputSubset (DetReg *image, int Nimage, Match *match, int Nmatch) {
+
+  if (output.table != (char *) NULL) {
+    DumpFitsTable (output.table, image, match, Nmatch);
+  } 
+  if (output.bintable != (char *) NULL) {
+    DumpFitsBintable (output.bintable, image, match, Nmatch);
+  } 
+  PrintSubset (image, match, Nmatch);
+  if (output.verbose) fprintf (stderr, "SUCCESS\n");
+  exit (0);
+}
+
+/* write out complete binary FITS table in format of db */
+int DumpFitsBintable (char *filename, DetReg *image, Match *match, int Nmatch) {
+
+  int i, j;
+  FILE *f;
+  Header header;
+  Matrix matrix;
+  Header theader;
+  FTable ftable;
+  DetReg *subset;
+
+  ALLOCATE (subset, DetReg, MAX (1, Nmatch));
+  for (i = 0; i < Nmatch; i++){
+    j = match[i].image;
+    memcpy (&subset[i], &image[j], sizeof (DetReg));
+  }
+
+  /* open file for output */
+  f = fopen (filename, "w");
+  if (f == NULL) {
+    fprintf (stderr, "ERROR: can't open output file %s\n", filename);
+    exit (1);
+  }
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+
+  ftable.header = &theader;
+  fits_table_set_DetReg (&ftable, subset, Nmatch);
+
+  fits_fwrite_header  (f, &header);
+  fits_fwrite_matrix  (f, &matrix);
+  fits_fwrite_Theader (f, &theader);
+  fits_fwrite_table   (f, &ftable);
+  fclose (f);
+  exit (0);
+}
+
+int DumpFitsTable (char *filename, DetReg *detdata, Match *match, int Nmatch) {
+  
+  Header header, theader;
+  Matrix matrix;
+  FTable table;
+  DetReg *newdata;
+  FILE *f;
+  char *startstr, *stopstr, *regstr, *line, key[33], ccdinfo[16];
+  char *filtstr, *typestr, *modestr, *ccdstr, *datestr, *p;
+  int i;
+  unsigned long tsecond;
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+  
+  /* create table header */
+  fits_create_table_header (&theader, "TABLE", "MASTER_DETREND");
+      
+  /* add current date/time to header */
+  str_to_time ("now", &tsecond);
+  datestr = sec_to_date (tsecond);
+  fits_modify (&header,  "DATE", "%s", 1, datestr);
+  fits_modify (&theader, "DATE", "%s", 1, datestr);
+  free (datestr);
+
+  /* define table layout */
+  fits_define_table_column (&theader, "A32",  "KEY",        "unique identifier",         "");
+  fits_define_table_column (&theader, "A20",  "START_TIME", "start time of measurement", "yyyy/mm/dd,hh:mm:ss");
+  fits_define_table_column (&theader, "A20",  "STOP_TIME",  "stop time of measurement",  "yyyy/mm/dd,hh:mm:ss");
+  fits_define_table_column (&theader, "A20",  "REG_TIME",   "time of registration",      "yyyy/mm/dd,hh:mm:ss");
+  fits_define_table_column (&theader, "F7.1", "EXPTIME",    "exposure time",             "seconds"); 
+  fits_define_table_column (&theader, "A10",  "IMAGETYP",   "detrend type",              "");
+  fits_define_table_column (&theader, "A10",  "FILTER",     "filter name",               "");
+  fits_define_table_column (&theader, "A7",   "CCDINFO",    "ccd information",                  "");
+  fits_define_table_column (&theader, "A7",   "MODE",       "data format mode",                  "");
+  fits_define_table_column (&theader, "I3",   "VERSION",    "image version number",      "");
+  fits_define_table_column (&theader, "I3",   "ORDER",      "selection order",           "");
+  fits_define_table_column (&theader, "A64",  "LABEL",      "data label",                "");
+  fits_define_table_column (&theader, "A256", "PATH",       "filename in db",            "");
+  
+  /* define TNULL, TNVAL values */
+  fits_modify (&theader, "TNULL1",  "%s", 1, "NULL");  /* KEY        */
+  fits_modify (&theader, "TNULL2",  "%s", 1, "NULL");  /* START_TIME */
+  fits_modify (&theader, "TNULL3",  "%s", 1, "NULL");  /* STOP_TIME  */
+  fits_modify (&theader, "TNULL4",  "%s", 1, "NULL");  /* REG_TIME   */
+  fits_modify (&theader, "TNULL5",  "%s", 1, "NaN");   /* EXPTIME    */
+  fits_modify (&theader, "TNULL6",  "%s", 1, "NULL");  /* IMAGETYP   */
+  fits_modify (&theader, "TNULL7",  "%s", 1, "NULL");  /* FILTER     */
+  fits_modify (&theader, "TNULL8",  "%s", 1, "NULL");  /* CCDINFO    */
+  fits_modify (&theader, "TNULL9",  "%s", 1, "NULL");  /* MODE       */
+  fits_modify (&theader, "TNULL10", "%s", 1, "-100");  /* VERSION    */
+  fits_modify (&theader, "TNULL11", "%s", 1, "-100");  /* ORDER      */
+  fits_modify (&theader, "TNULL12", "%s", 1, "NULL");  /* LABEL      */
+  fits_modify (&theader, "TNULL13", "%s", 1, "NULL");  /* PATH       */
+
+  fits_modify (&theader, "TNVAL1",  "%s", 1, "NA");    /* KEY        */
+  fits_modify (&theader, "TNVAL2",  "%s", 1, "NA");    /* START_TIME */
+  fits_modify (&theader, "TNVAL3",  "%s", 1, "NA");    /* STOP_TIME  */
+  fits_modify (&theader, "TNVAL4",  "%s", 1, "NA");    /* REG_TIME   */
+  fits_modify (&theader, "TNVAL5",  "%s", 1, "Inf");   /* EXPTIME    */
+  fits_modify (&theader, "TNVAL6",  "%s", 1, "NA");    /* IMAGETYP   */
+  fits_modify (&theader, "TNVAL7",  "%s", 1, "NA");    /* FILTER     */
+  fits_modify (&theader, "TNVAL8",  "%s", 1, "NA");    /* CCDINFO    */
+  fits_modify (&theader, "TNVAL9",  "%s", 1, "NA");    /* MODE       */
+  fits_modify (&theader, "TNVAL10", "%s", 1, "-200");  /* VERSION    */
+  fits_modify (&theader, "TNVAL11", "%s", 1, "-200");  /* ORDER      */
+  fits_modify (&theader, "TNVAL12", "%s", 1, "NA");    /* LABEL      */
+  fits_modify (&theader, "TNVAL13", "%s", 1, "NA");    /* PATH       */
+
+  /* create table, add data values */
+  fits_create_table (&theader, &table);
+  
+  /* add data to table */
+  for (i = 0; i < Nmatch; i++) {
+    newdata = &detdata[match[i].image];
+
+    /* key = 02Bk02.flat.V.00.00 */
+    p = strrchr (newdata[0].filename, '/');
+    if (p == (char *) NULL) {
+      p = newdata[0].filename;
+    } else {
+      p ++;
+    }
+    bzero (key, 33);
+    strncpy (key, p, 32);
+    if ((p = strrchr (key, '.')) != (char *) NULL) *p = 0;
+
+    startstr = sec_to_date (newdata[0].tstart);
+    stopstr  = sec_to_date (newdata[0].tstop);
+    regstr   = sec_to_date (newdata[0].treg);
+    typestr  = get_type_name(newdata[0].type);
+    modestr  = get_mode_name(newdata[0].mode);
+    filtstr  = filterhash[newdata[0].filter];
+
+    if (newdata[0].mode == M_SPLIT) {
+      ccdstr   = ccds[newdata[0].ccd];
+    } else {
+      sprintf (ccdinfo, "%-3d", newdata[0].ccd);
+      ccdstr   = ccdinfo;
+    }
+
+    line = fits_table_print (&table, key, startstr, stopstr, regstr, 
+			     newdata[0].exptime, typestr, filtstr, ccdstr, modestr,
+			     newdata[0].Nentry, newdata[0].Norder, 
+			     newdata[0].label, newdata[0].filename);
+
+    fits_add_rows (&table, line, 1, strlen(line));
+    free (line);
+    free (startstr);
+    free (stopstr);
+    free (regstr);
+  }
+
+  f = fopen (filename, "w");
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "Failure writing fits table\n");
+    return (FALSE);
+  }
+  fits_fwrite_header  (f, &header);
+  fits_fwrite_matrix  (f, &matrix);
+  fits_fwrite_Theader (f, &theader);
+  fits_fwrite_table   (f, &table);
+  fclose (f);
+  exit (0);
+}
+
+/* Select, TimeMode are global */
+int PrintSubset (DetReg *detdata, Match *match, int Nmatch) {
+  
+  char *dBPath, *Path, *typestr, *filtstr, filename[128];
+  char *timestr, *modestr, *ccdstr, ccdinfo[16], ccdformat[16];
+  int i, j, Nc;
+  struct timeval now;
+  long A;
+
+  gettimeofday (&now, NULL);
+  A = now.tv_usec + now.tv_sec;
+  srand48 (A);
+
+  Nc = strlen (ccds[0]);
+  sprintf (ccdformat, "%%%dd", Nc);
+  dBPath = get_dBPath ();
+
+  /* list matched images */
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j].image;
+    switch (output.TimeMode) {
+    case START:
+      timestr = sec_to_date (detdata[i].tstart);
+      break;
+    case STOP:
+      timestr = sec_to_date (detdata[i].tstop);
+      break;
+    case REG:
+      timestr = sec_to_date (detdata[i].treg);
+      break;
+    default:
+      if (output.verbose) fprintf (stderr, "ERROR: bad TimeMode\n");
+      exit (1);
+    }
+
+    typestr = get_type_name(detdata[i].type);
+    modestr = get_mode_name(detdata[i].mode);
+    filtstr = filterhash[MIN (MAX (detdata[i].filter, 0), NFILTER - 1)];
+
+    if ((detdata[i].mode == M_SPLIT) && (detdata[i].ccd >= -1) && (detdata[i].ccd < Nccd)) {
+      ccdstr   = ccds[detdata[i].ccd];
+    } else {
+      sprintf (ccdinfo, ccdformat, detdata[i].ccd);
+      ccdstr   = ccdinfo;
+    }
+
+    /* output mode (Select vs List) */
+    if (output.Chipname && criteria[0].CCDSelect && detdata[i].mode == M_MEF) {
+      snprintf (filename, 128, "%s[%s]", detdata[i].filename, ccds[criteria[0].CCD]);
+    } else {
+      strcpy (filename, detdata[i].filename);
+    }
+
+    if (output.Select) {
+      if (detdata[i].altpath) {
+	Path = RandomPath (dBPath);
+      } else {
+	Path = dBPath;
+      }
+      fprintf (stdout, "%s/%s\n", Path, filename);
+    } else {
+      fprintf (stdout, "%-40s = %19s %7s %6s %6s %s %2d %2d %6.1f  %20s  %1d\n", 
+	       filename, timestr, modestr, typestr, filtstr, ccdstr,
+	       detdata[i].Nentry, detdata[i].Norder, detdata[i].exptime, detdata[i].label, detdata[i].altpath);
+    }
+    free (timestr);
+  }  
+  return (TRUE);
+}
+
+char *RandomPath (char *dBPath) {
+  
+  int N;
+
+  N = (NDetrendAltDB + 0.99)*drand48();
+  if (N == NDetrendAltDB) return (dBPath);
+  return (DetrendAltDB[N]);
+}
+
+int PrintCriteria () {
+
+  int i;
+  char *start, *stop;
+
+  for (i = 0; i < Ncriteria; i++) {
+    start = sec_to_date (criteria[i].tstart);
+    stop  = sec_to_date (criteria[i].tstop);
+    
+    fprintf (stdout, "%19s %19s %7s %6s %s %6.1f\n", 
+	     start, stop, get_type_name(criteria[i].Type), filterhash[criteria[i].Filter], 
+	     ccds[criteria[i].CCD], criteria[i].Exptime);
+
+    free (start);
+    free (stop);
+  }
+
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/recipe.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/recipe.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/recipe.c	(revision 21753)
@@ -0,0 +1,113 @@
+# include "imregister.h"
+# include "detrend.h"
+
+Criteria *ExpandRecipe (Criteria *base, int *Ncrit) {
+
+  int i, N, Ns, NS;
+  Criteria *crit;
+  int Nbase;
+  
+  Nbase = *Ncrit;
+  NS = Ns = 0;
+  ALLOCATE (crit, Criteria, 1);
+
+  for (N = 0; N < Nbase; N++) {
+
+    RecipeType = LoadRecipe (filterhash[base[N].Filter], &Nrecipe);
+
+    NS += Nrecipe;
+    REALLOCATE (crit, Criteria, NS);
+    
+    for (i = 0; i < Nrecipe; i++) {
+      crit[Ns] = base[N];
+      crit[Ns].TypeSelect = TRUE;
+      crit[Ns].Type = get_image_type (RecipeType[i]);
+      if (crit[Ns].Type == T_UNDEF) { 
+	fprintf (stderr, "ERROR: invalid image type %s\n", RecipeType[i]);
+	exit (1);
+      }
+      if (!strcasecmp (RecipeType[i], "bias") ||
+	  !strcasecmp (RecipeType[i], "dark") ||
+	  !strcasecmp (RecipeType[i], "mask")) {
+	crit[Ns].FilterSelect = FALSE;
+      }
+      if (!strcasecmp (RecipeType[i], "flat") ||
+	  !strcasecmp (RecipeType[i], "scatter") ||
+	  !strcasecmp (RecipeType[i], "fringe") ||
+	  !strcasecmp (RecipeType[i], "frpts") ||
+	  !strcasecmp (RecipeType[i], "modes")) {
+	crit[Ns].FilterSelect = TRUE;
+      }
+      if (!strcasecmp (RecipeType[i], "modes")) {
+	crit[Ns].CCDSelect = FALSE;
+      }
+      /*      
+      if (!strcasecmp (RecipeType[i], "dark")) {
+      crit[Ns].ExptimeSelect = TRUE;
+      } 
+      */
+      Ns ++;
+    }
+  }
+
+  *Ncrit = Ns;
+  return (crit);
+}
+
+char **LoadRecipe (char *filter, int *nrecipe) {
+  
+  char **RecipeType;
+  int Nrecipe, NRECIPE;
+
+  int Nfield, found;
+  char *c, *p1, line[256], list[256], Filter[64];
+  FILE *f;
+  
+  /* open filter list file */
+  f = fopen (RecipeFile, "r");
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "error reading recipe %s\n", RecipeFile);
+    exit (1);
+  }
+
+  /* allocate dataspace needed */
+  NRECIPE = 10;
+  Nrecipe = 0;
+  ALLOCATE (RecipeType, char *, NRECIPE);
+
+  /* load data from file */
+  found = FALSE;
+  while (!found && (scan_line (f, line) != EOF)) {
+    for (c = line; isspace (*c); c++);
+    if (*c == '#') continue;
+    Nfield = sscanf (c, "%s %s", Filter, list);
+    if (Nfield != 2) { continue; }
+
+    if (!strcasecmp (filter, Filter)) found = TRUE;
+  }
+  fclose (f);  
+
+  if (!found) {
+    fprintf (stderr, "can't find filter %s\n", filter);
+    exit (1);
+  }
+
+  /* list contains word,word,word - parse these words to RecipeType */
+  p1 = list;
+  while ((c = strchr (p1, ',')) != (char *) NULL) {
+    *c = 0;
+    RecipeType[Nrecipe] = strcreate (p1);  
+    p1 = c + 1;
+    Nrecipe ++;
+    if (Nrecipe == NRECIPE) {
+      NRECIPE += 10;
+      REALLOCATE (RecipeType, char *, NRECIPE);
+    }
+  }
+  if (*p1) {
+    RecipeType[Nrecipe] = strcreate (p1);  
+    Nrecipe ++;
+  }    
+  *nrecipe = Nrecipe;
+  return (RecipeType);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/select.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/select.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/select.c	(revision 21753)
@@ -0,0 +1,90 @@
+# include "imregister.h"
+# include "detrend.h"
+
+Match SelectEntry (DetReg *image, int Nimage, Match *list, int Nlist, Criteria *crit) {
+
+  /* force a single selection */
+
+  /* at this point, all external criteria for the given detrend images
+     are equivalently good (ie, date range, filters, type, etc).  the 
+     selection here is based on other options: 
+     1) Norder         - user assigned value to force selection
+     2) tstart         - start valid time
+     3) Nentry         - version number
+     4) MatchNumber    - method to force selection 
+  */
+
+  int i, j, entry, order, matchnum;
+  int nmatch, Nmatch;
+  unsigned int tstart;
+  Match *match, *tmatch, answer;
+
+  Nmatch = Nlist;
+  match = list;
+
+  /* select all images with the same, maximum Norder */
+  nmatch = 0;
+  ALLOCATE (tmatch, Match, Nmatch);
+  order = image[match[0].image].Norder;
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j].image;
+    order = MAX (order, image[i].Norder);
+  }
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j].image;
+    if (order <= image[i].Norder) {
+      tmatch[nmatch] = match[j];
+      nmatch ++;
+    }
+  }
+  match = tmatch;
+  Nmatch = nmatch;
+
+  /* select all images with the same, maximum tstart */
+  nmatch = 0;
+  ALLOCATE (tmatch, Match, Nmatch);
+  tstart = image[match[0].image].tstart;
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j].image;
+    tstart = MAX (tstart, image[i].tstart);
+  }
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j].image;
+    if (tstart <= image[i].tstart) {
+      tmatch[nmatch] = match[j];
+      nmatch ++;
+    }
+  }
+  free (match);
+  match = tmatch;
+  Nmatch = nmatch;
+
+  /* select all images with the same, maximum Nentry */
+  nmatch = 0;
+  ALLOCATE (tmatch, Match, Nmatch);
+  entry = image[match[0].image].Nentry;
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j].image;
+    entry = MAX (entry, image[i].Nentry);
+  }
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j].image;
+    if (entry <= image[i].Nentry) {
+      tmatch[nmatch] = match[j];
+      nmatch ++;
+    }
+  }
+  free (match);
+  match = tmatch;
+  Nmatch = nmatch;
+
+  /* if there are multiple matches, select MatchNumber entry 
+     0-Nmatch-1 , or -1 -> -Nmatch (saturate at ends) */
+  matchnum = crit[match[0].crit].MatchNumber;
+  if (matchnum < 0) matchnum += Nmatch;
+  matchnum = MAX (0, MIN (Nmatch - 1, matchnum));
+
+  answer = match[matchnum];
+  free (match);
+  return (answer);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/unique.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/unique.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/detrend/unique.c	(revision 21753)
@@ -0,0 +1,123 @@
+# include "imregister.h"
+# include "detrend.h"
+
+/* define a list of best images which have unique properties */ 
+Match *UniqueSubset (DetReg *image, int Nimage, Match *match, int *nmatch) {
+
+  int Nsubset, Nunique, Ncrit, NCRIT;
+  int i, j, N, Nmatch, found;
+  Criteria *crit;
+  Match *subset, *unique, *local;
+
+  Nmatch = *nmatch;
+  ALLOCATE (local, Match, Nmatch);
+
+  /* create a set of complete criteria derived from the images */
+
+  Ncrit = 0;
+  NCRIT = 10;
+  ALLOCATE (crit, Criteria, NCRIT);
+  bzero (crit, (NCRIT - Ncrit)*sizeof(Criteria));
+
+  for (i = 0; i < Nmatch; i++) {
+    
+    local[i] = match[i];
+    N = match[i].image;
+    if (N == -1) continue;
+
+    found = FALSE;
+    for (j = 0; (j < Ncrit) && !found; j++) {
+      if (!cmp_crit (&crit[j], &image[N])) continue;
+      found = TRUE;
+      local[i].crit  = j;
+    }      
+    if (found) continue;
+    local[i].crit  = Ncrit;
+    set_crit (&crit[Ncrit], &image[N]);
+    Ncrit ++;
+    if (Ncrit == NCRIT) {
+      NCRIT += 10;
+      REALLOCATE (crit, Criteria, NCRIT);
+      bzero (&crit[Ncrit], (NCRIT - Ncrit)*sizeof(Criteria));
+    }
+  }
+      
+  /* we now have a set of criteria (crit, Ncrit) which describe the matched images
+     and a set of local matches (local) which link images to crit */
+
+  ALLOCATE (subset, Match, Nmatch);
+  ALLOCATE (unique, Match, Nmatch);
+
+  Nunique = 0;
+  for (i = 0; i < Ncrit; i++) {
+
+    /* extract the subset of local matches which are associated with crit[i] */
+    Nsubset= 0;
+    for (j = 0; j < Nmatch; j++) {
+      if (local[j].crit  != i) continue;
+      subset[Nsubset] = local[j];
+      Nsubset ++;
+    }
+
+    /* subset, Nsubset has a unique list of matched images */
+    unique[Nunique] = SelectEntry (image, Nimage, subset, Nsubset, crit);
+    Nunique ++;
+  }
+  free (subset);
+  free (local);
+  free (match);
+
+  match = unique;
+  *nmatch = Nunique;
+
+  return (match);
+}
+
+
+/* 
+   return list of all images that have the same value of:
+   criteria = tstart, tstop, filter, ccd, type, exptime
+*/
+
+
+int cmp_crit (Criteria *crit, DetReg *image) {
+
+  /* image and criteria need to match on:
+     tstart, tstop, filter, ccd, type, exptime
+  */
+  
+  if (crit[0].Filter  != image[0].filter ) return (FALSE);
+  if (crit[0].CCD     != image[0].ccd    ) return (FALSE);
+  if (crit[0].Type    != image[0].type   ) return (FALSE);
+  /* if (crit[0].Exptime != image[0].exptime) return (FALSE); */
+
+  if (crit[0].tstart  > image[0].tstop) return (FALSE);
+  if (crit[0].tstop   < image[0].tstart) return (FALSE);
+
+  /* we have overlapping time ranges.  set crit[0] to have the 
+     maximum of these time ranges */
+
+  crit[0].tstop  = MIN (crit[0].tstop,  image[0].tstop);
+  crit[0].tstart = MAX (crit[0].tstart, image[0].tstart);
+
+  return (TRUE);
+
+}
+
+int set_crit (Criteria *crit, DetReg *image) {
+
+  /* image and criteria need to match on:
+     tstart, tstop, filter, ccd, type, exptime
+  */
+
+  crit[0].tstart  = image[0].tstart;
+  crit[0].tstop   = image[0].tstop;  
+  crit[0].Filter  = image[0].filter; 
+  crit[0].CCD     = image[0].ccd;    
+  crit[0].Type    = image[0].type;   
+  crit[0].Exptime = image[0].exptime;
+
+  return (TRUE);
+
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/Change.log
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/Change.log	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/Change.log	(revision 21753)
@@ -0,0 +1,31 @@
+
+imregister-1-4:
+  dropped IMAGE_CATALOG from config
+  fixed imageID if not in header
+  changed mkdirhier to updated version (libohana 1.7)
+
+imregister-1-3:
+  modifications to use the new DVO load functions (libdvo-1-0)
+  minor changes to use new libohana (v1.5) / libfits (v1.4)
+
+imregister-1-2:
+  substantial changes to use autocoded tables
+  reorgainzation of db I/F code to use fits_db functions
+
+imregister-1-1:
+  I made a lot of very minor changes to cleanup the FITS database
+  interactions.  These should not have any impact on behavior.
+
+imregister-1-0:
+  I've added the newest versions of imregister to the CVS tree with the
+  base tag imregister-1-0 (should have used imregister-3-0? still
+  learning about revision control).  
+
+comment from before importing to CVS:
+  imregister-3.0 represents a completely new organization of these
+  programs, with the twin goals of making the FITS table handling more
+  cleanly encapsulated and of easing the addition of a mysql database
+  engine in place of the FITS tables.  As programs from imregister-1.0
+  are adapted to match this structure, they will be moved into the
+  imregister-3.0 directory.  
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/Compatibility
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/Compatibility	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/Compatibility	(revision 21753)
@@ -0,0 +1,58 @@
+
+transearch-1.0: 
+  v1: ok
+  v2: ok
+
+transearch-2.0: 
+  v1: not compatible, exits gracefully
+  v2: ok
+
+transreg-1.0:
+  v1: ok
+  v2: not compatible, exits gracefully
+
+transreg-1.0:
+  v1: not compatible, exits gracefully
+  v2: ok
+
+photsearch-1.0:
+  v1: ok
+  v2: ok
+
+photsearch-2.0:
+  v1: not compatible, exits gracefully
+  v2: ok
+
+photreg-1.0:
+  v1: ok
+  v2: ok [creates v1]
+
+photreg-2.0:
+  v1: not compatible, exits gracefully
+  v2: ok
+
+imsearch-1.0:
+  v1, v2: ok
+  v3: not compatible, exits gracefully
+
+imregister-1.0:
+  v1, v2: ok
+  v3: not compatible ****
+
+imregister-2.0:
+  v1, v2: ok
+  v3: not compatible, exits gracefully
+
+imsort-1.0:
+  v1, v2: ok
+  v3: not compatible ****
+
+imsort-2.0:
+  v1, v2: ok
+  v3: not compatible ***
+
+imregtable-3.0:
+  v1, v2: not compatibe, exits gracefully
+  v3: ok
+
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/autocode.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/autocode.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/autocode.txt	(revision 21753)
@@ -0,0 +1,20 @@
+
+I have been working to convert these functions to use libautocode to
+generate the table I/O APIs automatically.  A single table defines the
+layout of the table as well as the C structure.  A perl script uses a
+template to generate code to perform the byte swaping, to construct
+the table and add data or extract data from the table.
+
+I discovered that 'photreg' was mis-coded in Fread: it was not
+swapping the entry for refcode.  I have put in a 'rawshort' method to
+handle this for now, but it is fragile: it will only work on
+big-endian machines.  The tables need to be updated and the entry
+returned to short.  This can be done with the existing convert
+operations.
+
+as of 2005/03/30, I have converted the spsearch, photsearch functions,
+but I have not completely tested them.
+
+I am having some errors in the table creation: some lines are dropping
+the leading ' in the wrong place.  
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/dbtools.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/dbtools.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/dbtools.txt	(revision 21753)
@@ -0,0 +1,41 @@
+
+Elixir uses several databases to store a variety of information.
+One of these databases is the photometry database, with several
+interface tools (status, nrphot, addstar, etc).  The other databases
+are manipulated with the tools found in this directory.  In addition,
+tools used to abstract the camera description, photcodes, and filters
+are included here.
+
+imregister   : add images to the image registration database (imreg.db)
+
+imsearch     : find images in imreg.db
+
+imsort       : add images to imreg.db and pass to elixir systems
+
+imstatreg    : update stats to imreg.db (fwhm, flux, bias)
+
+detregister  : add images to the detrend database
+
+detsearch    : find images in the detrend database
+
+photreg      : add photometry datapoints to zeropoint db (phot.db)
+
+photsearch   : search phot.db
+
+transreg     : add transparency points to database (trans.db)
+
+transsearch  : search trans.db
+
+photcode     : find photcode for given image
+
+filtnames    : filter name lookups
+
+cameraconfig : get configuration information for camera
+
+As in all Elixir programs, a reference to a specific CCD in a MEF
+image can be done with (file) (ccd) MEF, where the value of 'ccd' is
+one of the valid extension names, associated in the header with the
+keyword defined by CCDNUM-KEYWORD.  In addition, searches (imsearch,
+detsearch) may be restricted to specific ccds with the -ccd flag,
+which also takes the extension name ID.
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/det.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/det.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/det.txt	(revision 21753)
@@ -0,0 +1,46 @@
+
+detregister:
+-time")) {
+-label")) {
+-ID")) {
+-order")) {
+-type")) {
+-ccd")) {
+-exptime")) {
+-filter")) {
+
+detsearch:
+--help		: ok
+-ccd		: ok
+-close		: ok
+-exptime	: ok
+-filter		: ok
+-h		: ok
+-image		: ok
+-label		: ok
+-mosaic		: ok
+-recipe		: ok
+-select		: ok
+-time		: ok
+-trange		: ok
+-treg		: ok
+-tstop		: ok
+-type		: ok
+-ve		: ok
+-quiet		: ok
+
+-match		: ?
+-entry		: ok
+
+-fits		: ok
+-binfits	: ok
+-del		: ok
+-delete		: ok
+-modify		: ok
+
+--help : clean up usage statement
+
+option behavior: 
+
+-close implies -time or -trange
+-select returns best for all detrend base selection
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/detsearch.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/detsearch.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/detsearch.txt	(revision 21753)
@@ -0,0 +1,74 @@
+
+detregister / detsearch MEF support:
+
+issue of database image format:
+
+filename			type	CCD  mode
+modes/2001A.modes.R.12.00.fits  modes   12   modes
+flat/R/02Bk06.flat.R.00.00.fits flat    00   split
+flat/R/03Ak01.flat.R.00.fits    flat    12   mef
+
+detsearch / detregister concepts:
+
+selection rules:
+
+ match all simple filters 
+
+ -image foo.fits[ccd 08] matches (split 08) or (mef NCCD)
+ 
+ if CCD is defined, return foo.fits[ext] if foo.fits is MEF
+
+simple filters:
+
+ -ccd (N)                       : match ccd
+ -time yyyy/mm/dd,HH:MM:SS      : match time
+ -trange (start) (stop)         : match time range
+ -entry (value)                 : match entry (entry == version number)
+ -label (word)                  : match this label
+ -filter (name)                 : match filter
+ -exptime (value)               : match exposure time
+
+complex rules:
+ -image (filename) (ccd) (mode) : determine filters from image
+
+ -mosaic (filename)		: determine filters from image
+
+ -recipe			: determine filters from image
+
+ -type (type)                   : match type, limit valid filters
+
+ -match (value)                 : only list the Nth matched entry ???
+
+ -close                         : allow non-perfect matches
+
+ -select                        : select 'best' match
+
+display rules:
+ -tstop                         : display end of valid time range
+ -treg                          : display time of image registration
+ -ve                            : Elixir verbose (SUCCESS / ERROR) 
+ -quiet                         : Elixir quiet (no SUCCESS / ERROR) 
+
+
+behaviour rules:
+ -modify (entry) (value)        : change entry for matched images to value
+  [possible -modify entries: label, order, tstart, tstop]
+
+ -del    : delete the matched entries
+ -delete : delete the matched entries
+
+
+-image sets:  -filter, -ccd, -time, -exptime
+-mosaic sets: -filter, -time, -exptime, (-ccds?)
+-recipe sets -type, for each type, sets -
+
+possible values for -type:  mask, bias, dark, flat, fringe, scatter, modes
+
+valid filters for type selections:
+  mask:    -ccd, -label, -entry, -time || -trange
+  bias:    -ccd, -label, -entry, -time || -trange
+  dark:    -ccd, -label, -entry, -time || -trange, -exptime
+  flat:    -ccd, -label, -entry, -time || -trange, -filter
+  fringe:  -ccd, -label, -entry, -time || -trange, -filter
+  scatter: -ccd, -label, -entry, -time || -trange, -filter
+  modes:   -ccd, -label, -entry, -time || -trange, -filter
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/imreg.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/imreg.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/imreg.txt	(revision 21753)
@@ -0,0 +1,25 @@
+
+command-line options from imregister:
+-split	     - OK
+-noreg	     - OK
+
+command-line options from imsearch:
+-type	     - ok
+-etime	     - ok
+-mode	     - ok
+-ccd	     - ok
+-filter	     - ok
+-name	     - ok
+
+-treg	     -ok
+-seq	     -ok
+-pt	     -ok
+-table	     -ok
+-bintable    -ok
+-del	     -ok
+-delete	     -ok
+-newpath     -ok
+-mef2split   -ok 
+-split2mef   -ok
+
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/imregister.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/imregister.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/imregister.txt	(revision 21753)
@@ -0,0 +1,63 @@
+
+This directory contains several routines which are related to
+maintaining a small, elixir-internal databases about the images which
+have been obtained.
+
+This database can be used to find the location on disk of the images
+which we have analysed, or to display various statistics about images,
+or to find types of images which have been obtained.  
+
+The basic program is 'imregister', which places the basic information
+about an image in the database, as determined from the header.  The
+program is invoked with: {\tt imregister (filename) [-split]}.  The
+optional flag is used to tell the program to distinguish the
+individual (SPLIT) frames of a mosaic CCD from an individual CCD which
+should be treated as an isolated image.  
+
+The second program is 'imsort', which does the same task as
+'imregister', but it also sends a trigger to the IMSTAT elixir and if
+needed to the PTOLEMY elixir.  For this program, the -split flag makes
+a difference in how these images are treated in the elixir processes.
+The basic point is that a SINGLE image /fullpath/filename.fits
+produces analysis files of the form /newpath/filename.ext while a
+SPLIT image will have the form /fullpath/word/wordNN.fits and output
+files of the form /newpath/word/wordNN.ext.  
+
+May 11, 2000
+
+I have been working to clean up some of the details of the Elixir
+system.  There are three big issues I have been attempting to address.
+First, I have wanted to create a single set of Elixirs for both MEF
+and SPLIT (and even SINGLE) images.  I also want to minimize the
+number of programs are required to know something special about our
+system, our camera, or our method of naming files.  Finally, I have
+been trying to automate the selection of the appropriate detrend data.
+These are connected problems, in many ways.
+
+Here, in order, are the programs (and scripts) needed to run the
+Elixir system for which these issues are relevant:
+
+elixir.fork:  this program is launched by the camera to introduce a
+	      new image to the system.  It must understand the
+	      difference between SPLIT and MEF, and also the naming
+	      convention.
+
+imsort:	      this program adds the image to the database and passes a
+	      trigger to the elixirs ptolemy and imstats.  imsort
+	      needs to distinguish SPLIT, MEF, and SINGLE images, and
+	      it must know the naming convention.  
+
+elixir (ptolemy): this script is now independent of the mode and
+		  naming issues
+
+elixir (imstats): this script is now independent of the mode and
+		  naming issues
+
+flatten:	  this script needs to distinguish SPLIT and MEF
+		  images (it is told the mode by the input line), but
+		  it does not know the naming convention.
+
+imstats:	  this script needs to distinguish SPLIT and MEF
+		  images (it is told the mode by the input line), but
+		  it does not know the naming convention.
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/imtable.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/imtable.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/imtable.txt	(revision 21753)
@@ -0,0 +1,22 @@
+
+Image Table: run @ 6 AM in ert
+
+- for given time period:
+
+* are all images in database? (compare archive db & elixir db)
+* have all images passed imstats?
+
+- complete images should be extracted into a table, sent to CADC
+- missing images should be registered or a warning sent on failure
+  (relink on /data/kapu/elixir/cfh12k)
+
+- nostat images should be sent to imstats
+  (launch imstats to process)
+ 
+* imsearch output format CADC: 
+
+  fits_define_table_column (&theader, "A64",   "FILE",       "filename in db",        "",                              1.0, 0.0);
+  fits_define_table_column (&theader, "F7.1",  "SKY",        "background level",     "counts / pixel",                 1.0, 0.0); 
+  fits_define_table_column (&theader, "F6.1",  "BIAS",       "bias level",           "counts / pixel",                 1.0, 0.0); 
+  fits_define_table_column (&theader, "F5.2",  "FWHM",       "image quality",        "pixels",                         1.0, 0.0); 
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/notes.2.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/notes.2.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/notes.2.txt	(revision 21753)
@@ -0,0 +1,63 @@
+
+problem:  imstatreg is too slow because of network I/O
+
+option 1: add mysql db to imstats system
+
+option 2: create client / server pair for imregister / imstatreg
+
+option 3: create buffer file for network I/O, local daemon for update
+
+1: best soln but will take a while
+2: ok option, but significant programming effort (worse than 1)
+3: easy programming, acceptable
+
+for imstatreg update, we need the only following data:
+
+obstime (unsigned int)
+ccd     (char or int)
+fwhm
+bias
+sky
+ra
+dec
+
+imstatreg -client:
+
+ read image info
+ load temp db
+ append data
+ close
+
+imstatreg -daemon:
+
+ load temp db
+ load main db
+ match images
+ update db
+ close db
+ empty temp db
+
+------------------------------------------------------
+
+detsearch needs optional alternative detrend.db paths
+
+- add column ALTPATH : true / false
+- add option -altpath :
+  - select images
+  - select ALTPATH images
+  - find subset 'add'
+  - find subset 'remove'
+  - 'remove': unlink files & unset ALTPATH
+  - 'add'   : copy files & set ALTPATH
+  
+
+if (ADD)    : all images in match are 'add', no images are 'delete'
+if (DELETE) : all images in match are 'delete', no images are 'add'
+if (UPDATE) : ??
+
+-----------------------------------------------------
+
+photreg / photsearch 
+
+- need to define the target photometry system in the output table.
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/notes.old.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/notes.old.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/notes.old.txt	(revision 21753)
@@ -0,0 +1,12 @@
+
+there are some issues with the imregister database that should get
+addressed eventually.  currently, I am loading and saving the entire
+file each time I make a change.  this seems like a bad plan.  when we
+get a few hundred nights of images in there, we will have several
+megabytes to load, change, and save each time.  two things could
+change.  first, imregister (imsort) could only add a record at the end
+of the file.  second, the imstatreg function could find the right
+image and write over the few needed bytes.
+
+should I uses mmap to do the I/O?
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/notes.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/notes.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/notes.txt	(revision 21753)
@@ -0,0 +1,101 @@
+
+imsearch & CADC distribution:
+
+i need to create raw image tables for the CADC for only those images
+which have been processed (-proc t) and for which a distribution table
+has not been created.
+
+imsearch -modify help
+imsearch -modify path /oldpath /newpath
+imsearch -modify mode [mef/split] 
+imsearch -modify dist [t/f]
+
+history:
+
+v1 : < 2002.09 
+
+ - FITS table interface had errors, incorrect TFORM values
+ - imreg db used pseudo FITS table
+
+v2 : 2002.09 
+
+ - FITS table interface repaired
+ - imreg db uses pseudo FITS table
+ - unwieldy files which contain many functions (esp detsearch /
+   imsearch)
+
+v3 : 2002.11
+
+ - FITS table interface repaired
+ - imreg db converted to read FITS tables
+ - use of vtable interface introduced
+ - db interactions abstracted to allow for SQL
+ - reorganization of files
+
+v3: functions & dependancies
+
+function             : external : globals               : structs
+
+WriteFIFO            : ohana    :		        :
+LoadCameraConfig     : ohana    : ccd data, keywords	:
+MatchCCDName         : ohana    : ccd data, keywords	:
+ConfigCamera         : ohana    : ccd data, keywords	:
+LoadFilterList       : ohana    : filt data, keywords	:
+MatchFilterList      : ohana    : filt data             :
+ConfigInit           : ohana    : keywords  
+get_fwhm	     : ohana
+load_probes	     : ohana
+parse_time	     : ohana    : keywords
+get_trange_arguments : ohana
+make_backup	     : ohana
+uppercase	     : 
+check_unixtime	     : UNUSED
+sort (various)	     : 
+
+(why aren't these in libohana?)
+dms_to_ddd
+str_to_radec
+chk_time
+str_to_time
+str_to_dtime
+sec_to_jd
+jd_to_sec
+date_to_sec
+Fseek - allow for timeout...
+
+problems:
+
+ imregister2.c: args
+ imsort2.c: args, SubmitImages
+ imstatreg2.c: args
+ photcode.c: ConfigSystem (ConfigCamera ConfigFilters)
+ photreg2.c: make_backup
+ photsearch2.c: DumpFitsTable
+ showiminfo.c: args
+ transearch2: LoadFilters, DumpFitsTable
+ transreg2: make_backup
+
+main programs:
+
+cameraconfig
+convertimreg
+filtnames
+imphotsearch
+imregister2
+imsearch2
+imsort2
+imstatreg2
+photcode
+photreg2
+photsearch2
+showiminfo
+transearch
+transreg
+
+
+dependency types:
+
+external libraries
+local library
+group 
+program-specific functions
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/photdb.dat
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/photdb.dat	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/photdb.dat	(revision 21753)
@@ -0,0 +1,349 @@
+u 2003/02/10,13:00:46  25.3434 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/10,13:27:24  25.3435 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/10,13:33:10  25.3496 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/10,13:38:47  25.3583 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/10,13:56:21  25.3455 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/24,12:36:34  25.2875 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/24,12:37:43  25.2855 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/09,13:01:29  25.3035 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/09,13:05:05  25.3034 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/09,13:06:14  25.3004 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/02/24,12:39:01  25.3197 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+g 2003/02/23,10:10:59  26.4664 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/02/23,10:11:59  26.4654 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/02/23,10:13:00  26.4604 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/02/24,12:00:51  26.4463 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/02/24,12:01:43  26.4393 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/02/24,12:02:35  26.4343 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/02/09,12:47:05  26.4692 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/02/09,12:47:48  26.4642 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/02/09,12:48:40  26.4624 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/02/23,10:17:28  25.9736 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/23,10:20:12  25.9708 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/23,10:20:55  25.9648 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/08,13:30:08  25.9878 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/08,13:30:51  25.9862 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/08,13:31:43  25.9816 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/24,12:07:20  25.9939 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/24,12:10:39  25.9897 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/24,12:09:47  25.9722 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/09,12:26:03  25.9581 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/09,12:26:55  25.9529 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/09,12:27:38  25.9617 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/12,15:18:51  26.0073 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/02/23,10:25:32  25.7384 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/23,10:28:07  25.7415 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/23,10:28:59  25.7465 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/08,13:18:37  25.7317 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/08,13:19:29  25.7307 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/08,13:20:12  25.7289 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/24,12:15:24  25.7579 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/24,12:18:51  25.7489 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/09,13:22:04  25.7434 25.7430  0.0000    3   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/09,13:23:39  25.7397 25.7430  0.0000    3   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/24,12:18:00  25.7399 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/09,13:22:56  25.7318 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/02/23,10:33:44  24.7826 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/02/23,10:36:54  24.7967 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/02/24,12:26:47  24.7562 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/02/09,13:12:43  24.7879 24.8000  0.0000    3   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/02/09,13:13:26  24.7888 24.8000  0.0000    3   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/02/24,12:23:19  24.7178 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/02/24,12:25:46  24.7117 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/02/09,13:11:51  24.7789 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+g 2003/03/24,15:07:46  26.4566 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/03/30,13:12:34  26.4501 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+i 2003/03/25,15:12:48  25.7633 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+r 2003/03/24,15:10:56  25.9917 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/03/25,15:21:27  26.0231 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+u 2003/03/22,15:11:13  25.4630 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/03/23,15:12:14  25.3056 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+z 2003/03/24,14:59:16  24.8271 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/03/30,13:20:55  24.7152 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+g 2003/04/25,09:06:28  26.4030 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/04/26,12:38:26  25.9774 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/26,13:14:35  25.9455 25.9780  0.0046    6   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/25,08:55:23  25.9287 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/27,08:44:44  25.9646 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/26,10:44:32  25.9647 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/26,13:05:05  26.0053 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/27,08:47:28  25.9676 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/26,13:06:05  25.9697 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/27,09:57:10  25.7930 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/04/25,08:58:07  25.7034 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/04/25,09:00:43  24.7533 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+u 2003/06/09,14:36:14  25.2311 25.2800  0.0071    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/05/30,14:21:41  25.2892 25.2800  0.0150    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+r 2003/06/08,14:43:35  25.9302 25.9780  0.0000    3   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/06/02,07:20:29  25.7291 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/04,06:40:27  25.7566 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/05,06:21:27  25.5921 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/06,05:58:59  25.7441 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/08,14:48:20  25.6812 25.7430  0.0000    3   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/06/02,07:23:22  24.8465 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/09,14:42:25  24.7583 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+u 2003/06/24,14:36:40  25.2756 25.2800  0.0361    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/06/29,14:36:40  25.2756 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/07/01,13:04:48  25.2674 25.2800  0.0365    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/07/05,14:51:04  25.2739 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/06/27,14:43:26  25.2580 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/06/30,14:44:00  25.1926 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+g 2003/06/23,10:19:29  26.4170 26.4600  0.0112    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/24,10:28:33  26.4245 26.4600  0.0086    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/26,11:56:32  26.4183 26.4600  0.0130    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/27,10:17:02  26.4285 26.4600  0.0113    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/29,09:53:25  26.4350 26.4600  0.0274    6   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/28,12:25:29  26.4477 26.4600  0.0251    6   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/01,09:52:16  26.4206 26.4600  0.0130    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/04,10:25:06  26.4018 26.4600  0.0143    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/05,10:25:14  26.4114 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/22,14:27:01  26.4249 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/29,14:33:38  26.4104 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/01,13:01:55  26.4169 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/24,14:39:24  26.4019 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/30,14:40:59  26.3187 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/06/22,12:56:00  25.9895 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/23,10:13:35  25.9652 25.9780  0.0047    6   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/24,10:19:55  25.9644 25.9780  0.0033    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/26,12:02:09  25.9610 25.9780  0.0073    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/27,10:19:46  25.9708 25.9780  0.0008    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/29,09:56:18  25.9528 25.9780  0.0089    6   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/28,12:28:22  25.9663 25.9780  0.0058    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/01,09:55:00  25.9672 25.9780  0.0073    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/04,10:29:42  25.9544 25.9780  0.0103    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/05,10:16:36  25.9552 25.9780  0.0067    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/05,14:48:46  25.9320 25.9780  0.0000    3   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/22,14:29:45  25.9493 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/24,14:42:17  25.9354 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/27,14:49:29  25.9371 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/29,14:45:27  25.9172 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/30,14:52:30  25.9221 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/01,13:07:49  25.9294 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/07,07:42:14  25.8036 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/06/22,12:58:53  25.7312 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/24,10:25:49  25.7261 25.7430  0.0095    4   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/26,11:59:16  25.7120 25.7430  0.0099    4   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/27,10:22:39  25.7250 25.7430  0.0103    4   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/29,09:59:02  25.7016 25.7430  0.0193    6   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/28,12:30:57  25.7047 25.7430  0.0152    6   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/04,10:33:53  25.7089 25.7430  0.0085    4   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/05,10:21:04  25.7078 25.7430  0.0080    4   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/01,09:57:53  25.7179 25.7430  0.0000    3   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/22,14:22:42  25.7170 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/24,14:45:01  25.7069 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/27,14:46:36  25.7100 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/29,14:39:33  25.6881 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/30,14:46:45  25.6658 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/06/23,10:16:27  24.8045 24.8000  0.0426    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/24,10:22:47  24.8213 24.8000  0.0363    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/27,10:25:23  24.8190 24.8000  0.0415    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/29,10:01:55  24.7694 24.8000  0.0431    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/28,12:33:41  24.7714 24.8000  0.0408    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/01,10:00:28  24.8012 24.8000  0.0394    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/04,10:31:43  24.7981 24.8000  0.0419    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/05,10:23:05  24.7617 24.8000  0.0311    4   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/24,14:33:30  24.7644 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/27,14:52:13  24.7629 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/29,14:42:34  24.7233 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/30,14:49:37  24.7408 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+g 2003/05/25,08:16:48  26.4408 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/05/25,14:02:24  26.4275 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/05/25,14:03:59  26.4430 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/05/26,14:50:55  26.4043 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/05/26,07:54:11  26.4084 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/05/25,08:18:23  26.3957 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/05/27,10:26:41  25.9994 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/27,10:27:41  25.9876 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/25,14:06:51  25.9703 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/27,14:38:23  25.9785 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/26,14:47:54  25.9553 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/25,14:08:26  25.9845 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/27,14:40:16  25.9925 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/26,07:58:30  25.9474 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/25,08:23:08  25.9621 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/27,06:04:10  25.9786 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/27,10:29:16  25.9440 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/05/27,06:06:54  25.7535 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/27,10:31:52  25.7376 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/25,14:11:19  25.7157 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/27,14:43:26  25.7314 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/26,14:45:01  25.7264 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/25,14:12:54  25.7356 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/27,14:44:52  25.7485 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/26,08:02:41  25.7276 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/25,08:27:35  25.6939 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/27,06:08:29  25.6955 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/27,10:33:27  25.6919 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/05/25,08:30:28  24.8014 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/25,14:15:38  24.7352 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/25,14:17:13  24.7520 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/25,14:39:50  24.7505 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/25,14:42:25  24.7538 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/25,14:44:52  24.7559 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/25,14:50:55  24.7465 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/26,08:08:00  24.6889 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/26,08:09:44  24.7414 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/25,08:32:03  24.7488 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+u 2003/07/22,13:40:22  25.3017 25.2800  0.0209    6   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/07/31,10:28:33  25.2284 25.2800  0.0319    7   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/01,11:32:47  25.2627 25.2800  0.0124    5   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/07/22,11:26:35  25.2747 25.2800  0.0072    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+g 2003/07/30,12:30:05  26.3704 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:31:32  26.3815 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:32:24  26.4011 26.4600  0.0175    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:33:15  26.3942 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:34:07  26.3715 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:34:59  26.3837 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:36:43  26.3226 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:38:26  26.3463 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:39:18  26.3810 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:12:46  26.4141 26.4600  0.0199    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:14:38  26.2761 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:44:18  26.4026 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:45:10  26.3946 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:46:10  26.4046 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:47:02  26.3942 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:47:54  26.4032 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:48:46  26.4307 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:49:37  26.4329 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/01,14:30:46  26.4302 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:35:51  26.3759 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:37:35  26.3472 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:13:46  26.3669 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:40:19  26.4117 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:41:19  26.4284 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:42:20  26.4288 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:43:11  26.3882 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:44:21  26.4019 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:45:21  26.4233 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:46:22  26.3867 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:47:13  26.4394 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:48:23  26.4528 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,12:49:23  26.4335 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:15:30  26.2898 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:16:22  26.2841 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:28:01  26.3029 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:32:12  26.2736 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:33:12  26.3506 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:34:22  26.3716 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:35:22  26.3566 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:36:14  26.3866 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:37:23  26.3626 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:38:23  26.3926 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:39:24  26.3606 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:40:16  26.3566 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:41:25  26.3863 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:42:25  26.3973 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:50:29  26.4281 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,14:51:21  26.4151 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/22,11:20:06  26.4140 26.4600  0.0058    6   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:36:02  26.3875 26.4600  0.0082    6   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:36:54  26.3962 26.4600  0.0061    6   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:38:47  26.3939 26.4600  0.0048    6   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:39:38  26.3879 26.4600  0.0071    6   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/01,11:24:17  26.4161 26.4600  0.0192    7   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/22,13:42:40  26.4298 26.4600  0.0089    5   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:23:57  26.3996 26.4600  0.0087    5   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:35:02  26.3865 26.4600  0.0082    5   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:37:55  26.3802 26.4600  0.0061    5   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:40:30  26.3766 26.4600  0.0064    5   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:41:22  26.3746 26.4600  0.0090    5   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:42:31  26.3733 26.4600  0.0090    5   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,10:43:23  26.3783 26.4600  0.0086    5   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/07/30,12:28:04  25.9364 25.9780  0.0140    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/01,14:28:45  25.9363 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/01,11:28:27  25.9590 25.9780  0.0195    7   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/22,11:22:16  25.9475 25.9780  0.0000    3   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/22,13:38:03  25.9685 25.9780  0.0152    5   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/31,10:30:43  25.9386 25.9780  0.0138    5   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/08/01,14:35:13  25.7086 25.7430  0.0000    3   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/01,11:30:28  25.7165 25.7430  0.0193    5   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/22,11:17:57  25.7288 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/22,13:44:49  25.7200 25.7430  0.0187    5   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/31,10:32:52  25.6899 25.7430  0.0179    5   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/08/01,14:37:06  24.7903 24.8000  0.0000    3   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/22,11:24:17  24.7831 24.8000  0.0416    7   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/22,13:46:50  24.7811 24.8000  0.0401    7   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/31,10:26:15  24.7419 24.8000  0.0384    7   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/21,06:16:07  24.8628 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+u 2003/08/21,09:56:35  25.3331 25.2800  0.0357    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/22,06:16:24  25.4472 25.2800  0.0382    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/22,09:13:32  25.3878 25.2800  0.0050    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/25,12:39:10  25.4175 25.2800  0.0310    5   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/28,10:14:35  25.3980 25.2800  0.0296    5   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/29,08:14:38  25.3912 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/29,08:15:38  25.3885 25.2800  0.0373    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/30,09:59:02  25.3895 25.2800  0.0318    5   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/31,07:15:10  25.4075 25.2800  0.0273    5   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/09/04,08:31:03  25.3510 25.2800  0.0058    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/25,05:52:39  25.3050 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/30,07:13:00  25.4598 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+g 2003/08/27,15:09:21  26.5096 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/09/03,15:00:34  26.5288 26.4600  0.0205    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/23,14:57:24  26.5457 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/30,14:25:00  26.5669 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/09/04,15:11:05  26.4714 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/28,07:13:09  26.5061 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/21,10:07:58  26.4956 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/22,06:24:46  26.5343 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/25,12:36:51  26.5242 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/28,10:18:54  26.5111 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/29,08:22:24  26.5010 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/30,09:56:44  26.5113 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/31,07:19:37  26.5286 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/09/04,08:28:53  26.4813 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/23,07:09:15  26.5158 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/25,05:50:21  26.4298 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/30,07:10:33  26.5390 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/09/03,05:49:29  26.4413 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/08/23,14:50:55  26.0223 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/30,14:27:10  26.0383 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/09/03,15:02:35  26.0080 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/09/04,15:13:14  25.9757 25.9780  0.0000    3   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/30,09:52:24  25.9954 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/21,09:59:36  25.9575 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/22,06:18:25  26.0393 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/22,09:15:50  26.0112 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/25,12:34:50  26.0245 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/29,08:17:57  25.9944 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/31,07:21:47  26.0173 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/23,07:05:13  26.0000 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/30,07:06:23  26.0434 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/09/03,05:45:10  25.9892 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/09/03,15:04:45  25.7557 25.7430  0.0000    3   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/23,14:52:56  25.7570 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/30,14:29:02  25.7823 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/09/04,15:06:20  25.7414 25.7430  0.0000    3   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/28,07:18:20  25.7614 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/22,06:20:35  25.7676 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/22,09:17:42  25.7562 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/30,09:50:24  25.7790 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/21,10:02:21  25.7279 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/25,12:41:36  25.7803 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/28,10:20:55  25.7747 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/29,08:24:25  25.7721 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/31,07:13:00  25.7795 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/09/04,08:33:30  25.7536 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/23,07:07:23  25.7556 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/30,07:08:32  25.7745 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/09/03,05:47:19  25.7456 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/08/27,15:18:00  24.7928 24.8000  0.0000    3   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/28,15:15:24  24.8363 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/09/03,15:09:21  24.8027 24.8000  0.0193    4   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/23,14:59:42  24.7762 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/30,14:33:38  24.8063 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/09/04,15:15:15  24.7638 24.8000  0.0355    5   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/28,07:21:12  24.8333 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/21,10:05:13  24.7669 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/22,09:11:13  24.7917 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/25,12:43:46  24.7967 24.8000  0.0000    3   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/28,10:22:56  24.8075 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/29,08:20:06  24.7902 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/30,09:54:25  24.8141 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/31,07:17:28  24.8038 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/09/04,08:35:31  24.7788 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/22,06:22:36  24.8321 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/23,07:03:04  24.7013 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/25,05:44:00  24.7611 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/30,07:04:13  24.8370 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/09/03,05:43:00  24.7850 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/photdb.src
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/photdb.src	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/photdb.src	(revision 21753)
@@ -0,0 +1,349 @@
+photreg -photcode i -trange 2003/02/08,13:18:37 1s -zp 25.7317 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/08,13:19:29 1s -zp 25.7307 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/08,13:20:12 1s -zp 25.7289 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/08,13:30:08 1s -zp 25.9878 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/08,13:30:51 1s -zp 25.9862 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/08,13:31:43 1s -zp 25.9816 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/09,12:26:03 1s -zp 25.9581 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/09,12:26:55 1s -zp 25.9529 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/09,12:27:38 1s -zp 25.9617 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/02/09,12:47:05 1s -zp 26.4692 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/02/09,12:47:48 1s -zp 26.4642 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/02/09,12:48:40 1s -zp 26.4624 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/09,13:01:29 1s -zp 25.3035 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/09,13:05:05 1s -zp 25.3034 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/09,13:06:14 1s -zp 25.3004 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/02/09,13:11:51 1s -zp 24.7789 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/02/09,13:12:43 1s -zp 24.7879 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/02/09,13:13:26 1s -zp 24.7888 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/09,13:22:04 1s -zp 25.7434 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/09,13:22:56 1s -zp 25.7318 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/09,13:23:39 1s -zp 25.7397 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/10,13:00:46 1s -zp 25.3434 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/10,13:27:24 1s -zp 25.3435 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/10,13:33:10 1s -zp 25.3496 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/10,13:38:47 1s -zp 25.3583 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/10,13:56:21 1s -zp 25.3455 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/12,15:18:51 1s -zp 26.0073 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/02/23,10:10:59 1s -zp 26.4664 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/02/23,10:11:59 1s -zp 26.4654 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/02/23,10:13:00 1s -zp 26.4604 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/23,10:17:28 1s -zp 25.9736 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/23,10:20:12 1s -zp 25.9708 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/23,10:20:55 1s -zp 25.9648 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/23,10:25:32 1s -zp 25.7384 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/23,10:28:07 1s -zp 25.7415 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/23,10:28:59 1s -zp 25.7465 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/02/23,10:33:44 1s -zp 24.7826 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/02/23,10:36:54 1s -zp 24.7967 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/02/24,12:00:51 1s -zp 26.4463 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/02/24,12:01:43 1s -zp 26.4393 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/02/24,12:02:35 1s -zp 26.4343 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/24,12:07:20 1s -zp 25.9939 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/24,12:09:47 1s -zp 25.9722 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/02/24,12:10:39 1s -zp 25.9897 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/24,12:15:24 1s -zp 25.7579 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/24,12:18:00 1s -zp 25.7399 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/02/24,12:18:51 1s -zp 25.7489 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/02/24,12:23:19 1s -zp 24.7178 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/02/24,12:25:46 1s -zp 24.7117 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/02/24,12:26:47 1s -zp 24.7562 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/24,12:36:34 1s -zp 25.2875 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/24,12:37:43 1s -zp 25.2855 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/02/24,12:39:01 1s -zp 25.3197 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/03/22,15:11:13 1s -zp 25.4630 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/03/23,15:12:14 1s -zp 25.3056 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/03/24,14:59:16 1s -zp 24.8271 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/03/24,15:07:46 1s -zp 26.4566 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/03/24,15:10:56 1s -zp 25.9917 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/03/25,15:12:48 1s -zp 25.7633 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/03/25,15:21:27 1s -zp 26.0231 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/03/30,13:12:34 1s -zp 26.4501 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/03/30,13:20:55 1s -zp 24.7152 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/04/25,08:55:23 1s -zp 25.9287 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/04/25,08:58:07 1s -zp 25.7034 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/04/25,09:00:43 1s -zp 24.7533 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/04/25,09:06:28 1s -zp 26.4030 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/04/26,10:44:32 1s -zp 25.9647 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/04/26,12:38:26 1s -zp 25.9774 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/04/26,13:05:05 1s -zp 26.0053 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/04/26,13:06:05 1s -zp 25.9697 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/04/26,13:14:35 1s -zp 25.9455 -dzp 0.0046 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/04/27,08:44:44 1s -zp 25.9646 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/04/27,08:47:28 1s -zp 25.9676 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/04/27,09:57:10 1s -zp 25.7930 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/05/25,08:16:48 1s -zp 26.4408 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/05/25,08:18:23 1s -zp 26.3957 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/25,08:23:08 1s -zp 25.9621 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/25,08:27:35 1s -zp 25.6939 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/25,08:30:28 1s -zp 24.8014 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/25,08:32:03 1s -zp 24.7488 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/05/25,14:02:24 1s -zp 26.4275 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/05/25,14:03:59 1s -zp 26.4430 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/25,14:06:51 1s -zp 25.9703 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/25,14:08:26 1s -zp 25.9845 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/25,14:11:19 1s -zp 25.7157 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/25,14:12:54 1s -zp 25.7356 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/25,14:15:38 1s -zp 24.7352 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/25,14:17:13 1s -zp 24.7520 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/25,14:39:50 1s -zp 24.7505 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/25,14:42:25 1s -zp 24.7538 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/25,14:44:52 1s -zp 24.7559 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/25,14:50:55 1s -zp 24.7465 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/05/26,07:54:11 1s -zp 26.4084 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/26,07:58:30 1s -zp 25.9474 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/26,08:02:41 1s -zp 25.7276 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/26,08:08:00 1s -zp 24.6889 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/05/26,08:09:44 1s -zp 24.7414 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/26,14:45:01 1s -zp 25.7264 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/26,14:47:54 1s -zp 25.9553 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/05/26,14:50:55 1s -zp 26.4043 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/27,06:04:10 1s -zp 25.9786 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/27,06:06:54 1s -zp 25.7535 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/27,06:08:29 1s -zp 25.6955 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/27,10:26:41 1s -zp 25.9994 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/27,10:27:41 1s -zp 25.9876 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/27,10:29:16 1s -zp 25.9440 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/27,10:31:52 1s -zp 25.7376 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/27,10:33:27 1s -zp 25.6919 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/27,14:38:23 1s -zp 25.9785 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/05/27,14:40:16 1s -zp 25.9925 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/27,14:43:26 1s -zp 25.7314 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/05/27,14:44:52 1s -zp 25.7485 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/05/30,14:21:41 1s -zp 25.2892 -dzp 0.0150 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/02,07:20:29 1s -zp 25.7291 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/02,07:23:22 1s -zp 24.8465 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/04,06:40:27 1s -zp 25.7566 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/05,06:21:27 1s -zp 25.5921 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/06,05:58:59 1s -zp 25.7441 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/08,14:43:35 1s -zp 25.9302 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/08,14:48:20 1s -zp 25.6812 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/06/09,14:36:14 1s -zp 25.2311 -dzp 0.0071 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/09,14:42:25 1s -zp 24.7583 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/22,12:56:00 1s -zp 25.9895 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/22,12:58:53 1s -zp 25.7312 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/22,14:22:42 1s -zp 25.7170 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/22,14:27:01 1s -zp 26.4249 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/22,14:29:45 1s -zp 25.9493 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/23,10:13:35 1s -zp 25.9652 -dzp 0.0047 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/23,10:16:27 1s -zp 24.8045 -dzp 0.0426 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/23,10:19:29 1s -zp 26.4170 -dzp 0.0112 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/24,10:19:55 1s -zp 25.9644 -dzp 0.0033 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/24,10:22:47 1s -zp 24.8213 -dzp 0.0363 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/24,10:25:49 1s -zp 25.7261 -dzp 0.0095 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/24,10:28:33 1s -zp 26.4245 -dzp 0.0086 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/24,14:33:30 1s -zp 24.7644 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/06/24,14:36:40 1s -zp 25.2756 -dzp 0.0361 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/24,14:39:24 1s -zp 26.4019 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/24,14:42:17 1s -zp 25.9354 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/24,14:45:01 1s -zp 25.7069 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/26,11:56:32 1s -zp 26.4183 -dzp 0.0130 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/26,11:59:16 1s -zp 25.7120 -dzp 0.0099 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/26,12:02:09 1s -zp 25.9610 -dzp 0.0073 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/27,10:17:02 1s -zp 26.4285 -dzp 0.0113 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/27,10:19:46 1s -zp 25.9708 -dzp 0.0008 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/27,10:22:39 1s -zp 25.7250 -dzp 0.0103 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/27,10:25:23 1s -zp 24.8190 -dzp 0.0415 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/06/27,14:43:26 1s -zp 25.2580 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/27,14:46:36 1s -zp 25.7100 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/27,14:49:29 1s -zp 25.9371 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/27,14:52:13 1s -zp 24.7629 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/28,12:25:29 1s -zp 26.4477 -dzp 0.0251 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/28,12:28:22 1s -zp 25.9663 -dzp 0.0058 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/28,12:30:57 1s -zp 25.7047 -dzp 0.0152 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/28,12:33:41 1s -zp 24.7714 -dzp 0.0408 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/29,09:53:25 1s -zp 26.4350 -dzp 0.0274 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/29,09:56:18 1s -zp 25.9528 -dzp 0.0089 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/29,09:59:02 1s -zp 25.7016 -dzp 0.0193 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/29,10:01:55 1s -zp 24.7694 -dzp 0.0431 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/29,14:33:38 1s -zp 26.4104 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/06/29,14:36:40 1s -zp 25.2756 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/29,14:39:33 1s -zp 25.6881 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/29,14:42:34 1s -zp 24.7233 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/29,14:45:27 1s -zp 25.9172 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/06/30,14:40:59 1s -zp 26.3187 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/06/30,14:44:00 1s -zp 25.1926 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/06/30,14:46:45 1s -zp 25.6658 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/06/30,14:49:37 1s -zp 24.7408 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/06/30,14:52:30 1s -zp 25.9221 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/01,09:52:16 1s -zp 26.4206 -dzp 0.0130 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/01,09:55:00 1s -zp 25.9672 -dzp 0.0073 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/07/01,09:57:53 1s -zp 25.7179 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/07/01,10:00:28 1s -zp 24.8012 -dzp 0.0394 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/01,13:01:55 1s -zp 26.4169 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/07/01,13:04:48 1s -zp 25.2674 -dzp 0.0365 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/01,13:07:49 1s -zp 25.9294 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/04,10:25:06 1s -zp 26.4018 -dzp 0.0143 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/04,10:29:42 1s -zp 25.9544 -dzp 0.0103 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/07/04,10:31:43 1s -zp 24.7981 -dzp 0.0419 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/07/04,10:33:53 1s -zp 25.7089 -dzp 0.0085 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/05,10:16:36 1s -zp 25.9552 -dzp 0.0067 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/07/05,10:21:04 1s -zp 25.7078 -dzp 0.0080 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/07/05,10:23:05 1s -zp 24.7617 -dzp 0.0311 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/05,10:25:14 1s -zp 26.4114 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/05,14:48:46 1s -zp 25.9320 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/07/05,14:51:04 1s -zp 25.2739 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/07,07:42:14 1s -zp 25.8036 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/07/21,06:16:07 1s -zp 24.8628 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/07/22,11:17:57 1s -zp 25.7288 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/22,11:20:06 1s -zp 26.4140 -dzp 0.0058 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/22,11:22:16 1s -zp 25.9475 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/07/22,11:24:17 1s -zp 24.7831 -dzp 0.0416 -Nmeas 7 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/07/22,11:26:35 1s -zp 25.2747 -dzp 0.0072 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/22,13:38:03 1s -zp 25.9685 -dzp 0.0152 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/07/22,13:40:22 1s -zp 25.3017 -dzp 0.0209 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/22,13:42:40 1s -zp 26.4298 -dzp 0.0089 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/07/22,13:44:49 1s -zp 25.7200 -dzp 0.0187 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/07/22,13:46:50 1s -zp 24.7811 -dzp 0.0401 -Nmeas 7 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/30,12:28:04 1s -zp 25.9364 -dzp 0.0140 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:30:05 1s -zp 26.3704 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:31:32 1s -zp 26.3815 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:32:24 1s -zp 26.4011 -dzp 0.0175 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:33:15 1s -zp 26.3942 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:34:07 1s -zp 26.3715 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:34:59 1s -zp 26.3837 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:35:51 1s -zp 26.3759 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:36:43 1s -zp 26.3226 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:37:35 1s -zp 26.3472 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:38:26 1s -zp 26.3463 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:39:18 1s -zp 26.3810 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:40:19 1s -zp 26.4117 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:41:19 1s -zp 26.4284 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:42:20 1s -zp 26.4288 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:43:11 1s -zp 26.3882 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:44:21 1s -zp 26.4019 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:45:21 1s -zp 26.4233 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:46:22 1s -zp 26.3867 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:47:13 1s -zp 26.4394 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:48:23 1s -zp 26.4528 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,12:49:23 1s -zp 26.4335 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:12:46 1s -zp 26.4141 -dzp 0.0199 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:13:46 1s -zp 26.3669 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:14:38 1s -zp 26.2761 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:15:30 1s -zp 26.2898 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:16:22 1s -zp 26.2841 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:28:01 1s -zp 26.3029 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:32:12 1s -zp 26.2736 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:33:12 1s -zp 26.3506 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:34:22 1s -zp 26.3716 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:35:22 1s -zp 26.3566 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:36:14 1s -zp 26.3866 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:37:23 1s -zp 26.3626 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:38:23 1s -zp 26.3926 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:39:24 1s -zp 26.3606 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:40:16 1s -zp 26.3566 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:41:25 1s -zp 26.3863 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:42:25 1s -zp 26.3973 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:44:18 1s -zp 26.4026 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:45:10 1s -zp 26.3946 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:46:10 1s -zp 26.4046 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:47:02 1s -zp 26.3942 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:47:54 1s -zp 26.4032 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:48:46 1s -zp 26.4307 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:49:37 1s -zp 26.4329 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:50:29 1s -zp 26.4281 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/30,14:51:21 1s -zp 26.4151 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:23:57 1s -zp 26.3996 -dzp 0.0087 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/07/31,10:26:15 1s -zp 24.7419 -dzp 0.0384 -Nmeas 7 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/07/31,10:28:33 1s -zp 25.2284 -dzp 0.0319 -Nmeas 7 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/07/31,10:30:43 1s -zp 25.9386 -dzp 0.0138 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/07/31,10:32:52 1s -zp 25.6899 -dzp 0.0179 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:35:02 1s -zp 26.3865 -dzp 0.0082 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:36:02 1s -zp 26.3875 -dzp 0.0082 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:36:54 1s -zp 26.3962 -dzp 0.0061 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:37:55 1s -zp 26.3802 -dzp 0.0061 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:38:47 1s -zp 26.3939 -dzp 0.0048 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:39:38 1s -zp 26.3879 -dzp 0.0071 -Nmeas 6 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:40:30 1s -zp 26.3766 -dzp 0.0064 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:41:22 1s -zp 26.3746 -dzp 0.0090 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:42:31 1s -zp 26.3733 -dzp 0.0090 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/07/31,10:43:23 1s -zp 26.3783 -dzp 0.0086 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/01,11:24:17 1s -zp 26.4161 -dzp 0.0192 -Nmeas 7 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/01,11:28:27 1s -zp 25.9590 -dzp 0.0195 -Nmeas 7 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/01,11:30:28 1s -zp 25.7165 -dzp 0.0193 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/01,11:32:47 1s -zp 25.2627 -dzp 0.0124 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/01,14:28:45 1s -zp 25.9363 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/01,14:30:46 1s -zp 26.4302 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/01,14:35:13 1s -zp 25.7086 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/01,14:37:06 1s -zp 24.7903 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/21,09:56:35 1s -zp 25.3331 -dzp 0.0357 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/21,09:59:36 1s -zp 25.9575 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/21,10:02:21 1s -zp 25.7279 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/21,10:05:13 1s -zp 24.7669 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/21,10:07:58 1s -zp 26.4956 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/22,06:16:24 1s -zp 25.4472 -dzp 0.0382 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/22,06:18:25 1s -zp 26.0393 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/22,06:20:35 1s -zp 25.7676 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/22,06:22:36 1s -zp 24.8321 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/22,06:24:46 1s -zp 26.5343 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/22,09:11:13 1s -zp 24.7917 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/22,09:13:32 1s -zp 25.3878 -dzp 0.0050 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/22,09:15:50 1s -zp 26.0112 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/22,09:17:42 1s -zp 25.7562 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/23,07:03:04 1s -zp 24.7013 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/23,07:05:13 1s -zp 26.0000 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/23,07:07:23 1s -zp 25.7556 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/23,07:09:15 1s -zp 26.5158 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/23,14:50:55 1s -zp 26.0223 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/23,14:52:56 1s -zp 25.7570 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/23,14:57:24 1s -zp 26.5457 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/23,14:59:42 1s -zp 24.7762 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/25,05:44:00 1s -zp 24.7611 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/25,05:50:21 1s -zp 26.4298 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/25,05:52:39 1s -zp 25.3050 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/25,12:34:50 1s -zp 26.0245 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/25,12:36:51 1s -zp 26.5242 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/25,12:39:10 1s -zp 25.4175 -dzp 0.0310 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/25,12:41:36 1s -zp 25.7803 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/25,12:43:46 1s -zp 24.7967 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/27,15:09:21 1s -zp 26.5096 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/27,15:18:00 1s -zp 24.7928 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/28,07:13:09 1s -zp 26.5061 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/28,07:18:20 1s -zp 25.7614 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/28,07:21:12 1s -zp 24.8333 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/28,10:14:35 1s -zp 25.3980 -dzp 0.0296 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/28,10:18:54 1s -zp 26.5111 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/28,10:20:55 1s -zp 25.7747 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/28,10:22:56 1s -zp 24.8075 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/28,15:15:24 1s -zp 24.8363 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/29,08:14:38 1s -zp 25.3912 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/29,08:15:38 1s -zp 25.3885 -dzp 0.0373 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/29,08:17:57 1s -zp 25.9944 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/29,08:20:06 1s -zp 24.7902 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/29,08:22:24 1s -zp 26.5010 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/29,08:24:25 1s -zp 25.7721 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/30,07:04:13 1s -zp 24.8370 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/30,07:06:23 1s -zp 26.0434 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/30,07:08:32 1s -zp 25.7745 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/30,07:10:33 1s -zp 26.5390 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/30,07:13:00 1s -zp 25.4598 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/30,09:50:24 1s -zp 25.7790 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/30,09:52:24 1s -zp 25.9954 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/30,09:54:25 1s -zp 24.8141 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/30,09:56:44 1s -zp 26.5113 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/30,09:59:02 1s -zp 25.3895 -dzp 0.0318 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/30,14:25:00 1s -zp 26.5669 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/30,14:27:10 1s -zp 26.0383 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/30,14:29:02 1s -zp 25.7823 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/30,14:33:38 1s -zp 24.8063 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/08/31,07:13:00 1s -zp 25.7795 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/08/31,07:15:10 1s -zp 25.4075 -dzp 0.0273 -Nmeas 5 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/08/31,07:17:28 1s -zp 24.8038 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/08/31,07:19:37 1s -zp 26.5286 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/08/31,07:21:47 1s -zp 26.0173 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/09/03,05:43:00 1s -zp 24.7850 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/09/03,05:45:10 1s -zp 25.9892 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/09/03,05:47:19 1s -zp 25.7456 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/09/03,05:49:29 1s -zp 26.4413 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/09/03,15:00:34 1s -zp 26.5288 -dzp 0.0205 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/09/03,15:02:35 1s -zp 26.0080 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/09/03,15:04:45 1s -zp 25.7557 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/09/03,15:09:21 1s -zp 24.8027 -dzp 0.0193 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/09/04,08:28:53 1s -zp 26.4813 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode u -trange 2003/09/04,08:31:03 1s -zp 25.3510 -dzp 0.0058 -Nmeas 4 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/09/04,08:33:30 1s -zp 25.7536 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/09/04,08:35:31 1s -zp 24.7788 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -photcode i -trange 2003/09/04,15:06:20 1s -zp 25.7414 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode g -trange 2003/09/04,15:11:05 1s -zp 26.4714 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode r -trange 2003/09/04,15:13:14 1s -zp 25.9757 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -photcode z -trange 2003/09/04,15:15:15 1s -zp 24.7638 -dzp 0.0355 -Nmeas 5 -Ntime 1 -label elixir
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/spdb.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/spdb.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/spdb.txt	(revision 21753)
@@ -0,0 +1,78 @@
+
+plan - use imregister / imsearch framework for spectra.db
+
+relevant database usages:
+
+use this for spectra.db ref ?
+  average.code or average.Xg
+
+
+spectra in spectra.db will have RA,DEC: join between tables using position
+
+example queries:
+
+spsearch 
+
+/* structure for Spectra Registration Database */
+typedef struct {
+  char filename[64];
+  char pathname[128];
+  char telescope[32];
+  char instrument[32];
+ 
+  char objname[64];
+
+  char mode (MEF?)
+  
+  float ra, dec;
+  float exptime;
+  float airmass;
+
+  /* spectral range representation */
+  float W0, W1, dW; 
+
+  /* spectral range start, end; average value for nm / pixel */
+
+  float sky;
+  float bias;
+  float fwhm;
+
+  float telfocus;
+  float xprobe, yprobe, zprobe;
+  float dettemp;
+  float teltemp[4];
+  float rotangle;
+
+  unsigned long int obstime;
+  unsigned long int regtime;
+} RegImage;  /* 360 bytes / image */
+
+
+outstanding questions:
+
+- convert spectral file to standard format on db insertion?
+  - uniform keywords for wavelength calibration?
+  - need header WCS
+  - single FITS file
+  - how to store discontiguous spectra? (MEF?)
+
+
+-------------------------------------------
+
+spectra examples in hand:
+
+Keck I / HiRes : 
+     - single IRAF FITS spectra
+     - BANDIDn gives def of slice (spectrum, sigma, background, raw)
+     - WATn_001 gives units (Angstroms)     
+     - wavelength = (x-CRPIX1+1) * CD1_1 + CRVAL1
+     * how do we know the orientation?
+
+Keck I / ESI : 
+     - MEF spectra (yso/keck)
+       - spload-mef converts to a single 
+
+-----
+
+database interactions vs autocode FITS tables
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/spdb2.txt
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/spdb2.txt	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/spdb2.txt	(revision 21753)
@@ -0,0 +1,58 @@
+
+metadata to extract:
+
+typedef struct {
+  char filename[64];
+  char pathname[128];
+  char instrument[32];
+  char telescope[32];
+  char objname[64];
+  char extname[64];
+
+  float ra, dec;
+  float exptime;
+  float airmass;
+
+  float W0, W1, dW;
+  int Nspec;				/* number of spectra associated with entry */
+
+  char mode;			/* PHU, MEF, EXT */
+  char state;			/* image state: raw, flx, etc */
+  char flag;			/* image status flags */
+  char junk[9];
+
+  unsigned long int obstime;
+  unsigned long int regtime;
+} Spectrum;
+
+
+FITS Keywords for metadata
+
+case 1:
+NAXIS  = 1
+NAXIS1 = Nw
+
+case 2:
+NAXIS  = 2
+NAXIS1 = Nw
+NAXIS2 = 1
+
+case 3:
+NAXIS  = 2
+NAXIS1 = 1
+NAXIS2 = Nw
+
+case 4:
+NAXIS  = 2
+NAXIS1 = Nw
+NAXIS2 = n   (flux, dflux, etc)
+
+case 5:
+NAXIS  = 3
+NAXIS1 = Nw
+NAXIS2 = 1
+NAXIS3 = n   (flux, dflux, etc)
+
+0         1         2         3         4         5         6         7         8
+012345678901234567890123456789012345678901234567890123456789012345678901234567890
+/data/elixir2/datdir/megacam/03Am02/taurus/L1551/VLT/spectra/2002.04.01
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/transdb.dat
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/transdb.dat	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/transdb.dat	(revision 21753)
@@ -0,0 +1,159 @@
+u 2003/02/24,00:00:00  25.2980 25.2800  0.0157    7   3   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+g 2003/02/23,00:00:00  26.4640 26.4600  0.0026    3   3   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/02/24,00:00:00  26.4400 26.4600  0.0049    6   3   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/02/23,00:00:00  25.9700 25.9780  0.0037    3   3   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/02/24,00:00:00  25.9850 25.9780  0.0094    5   3   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/02/23,00:00:00  25.7420 25.7430  0.0033    3   3   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/02/24,00:00:00  25.7490 25.7430  0.0073    6   3   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/02/23,00:00:00  24.7900 24.8000  0.0070    2   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/02/24,00:00:00  24.7290 24.8000  0.0197    4   3   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+u 2003/03/22,00:00:00  25.4630 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/03/23,00:00:00  25.3060 25.2800  0.0000    1   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+g 2003/03/24,00:00:00  26.4570 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/03/30,00:00:00  26.4500 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/03/24,00:00:00  25.9920 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/03/25,00:00:00  26.0230 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/03/25,00:00:00  25.7630 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/03/24,00:00:00  24.8270 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/03/30,00:00:00  24.7150 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+g 2003/04/25,00:00:00  26.4030 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/04/25,00:00:00  25.9290 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/26,00:00:00  25.9730 25.9780  0.0195   11   5   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/04/27,00:00:00  25.9080 25.9780  0.0816    5   3   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/04/25,00:00:00  25.7030 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/04/25,00:00:00  24.7530 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+u 2003/05/30,00:00:00  25.2890 25.2800  0.0000    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/06/09,00:00:00  25.2310 25.2800  0.0000    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+r 2003/06/08,00:00:00  25.9300 25.9780  0.0000    3   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/06/02,00:00:00  25.7290 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/04,00:00:00  25.7570 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/05,00:00:00  25.5920 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/06,00:00:00  25.7440 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/08,00:00:00  25.6810 25.7430  0.0000    3   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/06/02,00:00:00  24.8460 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/09,00:00:00  24.7580 24.8000  0.0000    1   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+u 2003/06/24,00:00:00  25.2760 25.2800  0.0000    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/06/27,00:00:00  25.2580 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/06/29,00:00:00  25.2760 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/06/30,00:00:00  25.1930 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/07/01,00:00:00  25.2670 25.2800  0.0000    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/07/05,00:00:00  25.2740 25.2800  0.0000    3   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+g 2003/06/22,00:00:00  26.4250 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/23,00:00:00  26.4170 26.4600  0.0000    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/24,00:00:00  26.4130 26.4600  0.0113    5   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/26,00:00:00  26.4180 26.4600  0.0000    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/27,00:00:00  26.4280 26.4600  0.0000    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/28,00:00:00  26.4480 26.4600  0.0000    6   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/29,00:00:00  26.4230 26.4600  0.0123    8   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/06/30,00:00:00  26.3190 26.4600  0.0000    1   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/01,00:00:00  26.4190 26.4600  0.0019    6   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/04,00:00:00  26.4020 26.4600  0.0000    4   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/05,00:00:00  26.4110 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/06/22,00:00:00  25.9690 25.9780  0.0201    4   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/23,00:00:00  25.9650 25.9780  0.0000    6   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/24,00:00:00  25.9500 25.9780  0.0145    6   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/26,00:00:00  25.9610 25.9780  0.0000    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/27,00:00:00  25.9540 25.9780  0.0169    6   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/28,00:00:00  25.9660 25.9780  0.0000    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/29,00:00:00  25.9350 25.9780  0.0178    8   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/06/30,00:00:00  25.9220 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/01,00:00:00  25.9480 25.9780  0.0189    6   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/04,00:00:00  25.9540 25.9780  0.0000    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/05,00:00:00  25.9440 25.9780  0.0116    7   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/07,00:00:00  25.8040 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/06/22,00:00:00  25.7240 25.7430  0.0071    4   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/24,00:00:00  25.7160 25.7430  0.0096    6   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/26,00:00:00  25.7120 25.7430  0.0000    4   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/27,00:00:00  25.7180 25.7430  0.0075    6   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/28,00:00:00  25.7050 25.7430  0.0000    6   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/29,00:00:00  25.6950 25.7430  0.0067    8   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/06/30,00:00:00  25.6660 25.7430  0.0000    2   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/01,00:00:00  25.7180 25.7430  0.0000    3   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/04,00:00:00  25.7090 25.7430  0.0000    4   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/05,00:00:00  25.7080 25.7430  0.0000    4   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/06/23,00:00:00  24.8050 24.8000  0.0000    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/24,00:00:00  24.7930 24.8000  0.0284    8   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/27,00:00:00  24.7910 24.8000  0.0280    8   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/28,00:00:00  24.7710 24.8000  0.0000    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/29,00:00:00  24.7460 24.8000  0.0231    8   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/06/30,00:00:00  24.7410 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/01,00:00:00  24.8010 24.8000  0.0000    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/04,00:00:00  24.7980 24.8000  0.0000    6   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/05,00:00:00  24.7620 24.8000  0.0000    4   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+g 2003/05/25,00:00:00  26.4270 26.4600  0.0189    5   4   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/05/26,00:00:00  26.4060 26.4600  0.0021    2   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/05/25,00:00:00  25.9720 25.9780  0.0093    4   3   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/26,00:00:00  25.9510 25.9780  0.0040    3   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/05/27,00:00:00  25.9800 25.9780  0.0178    7   6   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/05/25,00:00:00  25.7150 25.7430  0.0170    3   3   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/26,00:00:00  25.7270 25.7430  0.0006    3   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/05/27,00:00:00  25.7260 25.7430  0.0242    6   6   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/05/25,00:00:00  24.7560 24.8000  0.0183    9   8   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/05/26,00:00:00  24.7150 24.8000  0.0262    3   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+u 2003/07/22,00:00:00  25.2880 25.2800  0.0135   10   2   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/07/31,00:00:00  25.2280 25.2800  0.0000    7   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/01,00:00:00  25.2630 25.2800  0.0000    5   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+g 2003/07/22,00:00:00  26.4220 26.4600  0.0079   11   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/30,00:00:00  26.3810 26.4600  0.0431   78  47   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/07/31,00:00:00  26.3850 26.4600  0.0086   59  11   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/01,00:00:00  26.4230 26.4600  0.0070    9   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/07/22,00:00:00  25.9580 25.9780  0.0105    8   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/30,00:00:00  25.9360 25.9780  0.0000    4   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/07/31,00:00:00  25.9390 25.9780  0.0000    5   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/01,00:00:00  25.9480 25.9780  0.0113    9   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/07/22,00:00:00  25.7240 25.7430  0.0044    6   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/07/31,00:00:00  25.6900 25.7430  0.0000    5   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/01,00:00:00  25.7130 25.7430  0.0039    8   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/07/21,00:00:00  24.8630 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/22,00:00:00  24.7820 24.8000  0.0010   14   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/07/31,00:00:00  24.7420 24.8000  0.0000    7   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/01,00:00:00  24.7900 24.8000  0.0000    3   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+u 2003/08/21,00:00:00  25.3330 25.2800  0.0000    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/22,00:00:00  25.4170 25.2800  0.0297    8   2   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/25,00:00:00  25.3610 25.2800  0.0563    6   2   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/28,00:00:00  25.3980 25.2800  0.0000    5   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/29,00:00:00  25.3900 25.2800  0.0013    7   2   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/30,00:00:00  25.4250 25.2800  0.0351    6   2   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/08/31,00:00:00  25.4070 25.2800  0.0000    5   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+u 2003/09/04,00:00:00  25.3510 25.2800  0.0000    4   1   0.2410 -0.3500  unknown  u_SDSS g_SDSS elixir
+g 2003/08/21,00:00:00  26.4960 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/22,00:00:00  26.5340 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/23,00:00:00  26.5310 26.4600  0.0150    2   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/25,00:00:00  26.4770 26.4600  0.0472    3   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/27,00:00:00  26.5100 26.4600  0.0000    3   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/28,00:00:00  26.5090 26.4600  0.0025    4   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/29,00:00:00  26.5010 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/30,00:00:00  26.5390 26.4600  0.0227    5   3   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/08/31,00:00:00  26.5290 26.4600  0.0000    2   1   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/09/03,00:00:00  26.4850 26.4600  0.0437    5   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+g 2003/09/04,00:00:00  26.4760 26.4600  0.0049    4   2   0.1480 -0.1500  unknown  g_SDSS r_SDSS elixir
+r 2003/08/21,00:00:00  25.9570 25.9780  0.0000    2   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/22,00:00:00  26.0250 25.9780  0.0141    2   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/23,00:00:00  26.0110 25.9780  0.0112    2   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/25,00:00:00  26.0240 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/29,00:00:00  25.9940 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/30,00:00:00  26.0260 25.9780  0.0215    3   3   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/08/31,00:00:00  26.0170 25.9780  0.0000    1   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/09/03,00:00:00  25.9990 25.9780  0.0094    2   2   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+r 2003/09/04,00:00:00  25.9760 25.9780  0.0000    3   1   0.0000 -0.1000  unknown  g_SDSS r_SDSS elixir
+i 2003/08/21,00:00:00  25.7280 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/22,00:00:00  25.7620 25.7430  0.0057    4   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/23,00:00:00  25.7560 25.7430  0.0007    2   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/25,00:00:00  25.7800 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/28,00:00:00  25.7680 25.7430  0.0067    2   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/29,00:00:00  25.7720 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/30,00:00:00  25.7790 25.7430  0.0032    4   3   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/08/31,00:00:00  25.7790 25.7430  0.0000    1   1   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/09/03,00:00:00  25.7510 25.7430  0.0050    4   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+i 2003/09/04,00:00:00  25.7470 25.7430  0.0061    4   2   0.0830 -0.0400  unknown  r_SDSS i_SDSS elixir
+z 2003/08/21,00:00:00  24.7670 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/22,00:00:00  24.8120 24.8000  0.0202    3   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/23,00:00:00  24.7390 24.8000  0.0374    2   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/25,00:00:00  24.7790 24.8000  0.0178    4   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/27,00:00:00  24.7930 24.8000  0.0000    3   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/28,00:00:00  24.8260 24.8000  0.0129    5   3   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/29,00:00:00  24.7900 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/30,00:00:00  24.8190 24.8000  0.0130    4   3   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/08/31,00:00:00  24.8040 24.8000  0.0000    2   1   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/09/03,00:00:00  24.7940 24.8000  0.0089    5   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
+z 2003/09/04,00:00:00  24.7710 24.8000  0.0075    7   2   0.0500 -0.0300  unknown  g_SDSS z_SDSS elixir
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/transdb.src
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/transdb.src	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/doc/transdb.src	(revision 21753)
@@ -0,0 +1,159 @@
+photreg -trans -photcode z -trange 2003/02/23,00:00:00 1s -zp 24.7900 -dzp 0.0070 -Nmeas 2 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/02/23,00:00:00 1s -zp 25.7420 -dzp 0.0033 -Nmeas 3 -Ntime 3 -label elixir
+photreg -trans -photcode r -trange 2003/02/23,00:00:00 1s -zp 25.9700 -dzp 0.0037 -Nmeas 3 -Ntime 3 -label elixir
+photreg -trans -photcode g -trange 2003/02/23,00:00:00 1s -zp 26.4640 -dzp 0.0026 -Nmeas 3 -Ntime 3 -label elixir
+photreg -trans -photcode z -trange 2003/02/24,00:00:00 1s -zp 24.7290 -dzp 0.0197 -Nmeas 4 -Ntime 3 -label elixir
+photreg -trans -photcode u -trange 2003/02/24,00:00:00 1s -zp 25.2980 -dzp 0.0157 -Nmeas 7 -Ntime 3 -label elixir
+photreg -trans -photcode i -trange 2003/02/24,00:00:00 1s -zp 25.7490 -dzp 0.0073 -Nmeas 6 -Ntime 3 -label elixir
+photreg -trans -photcode r -trange 2003/02/24,00:00:00 1s -zp 25.9850 -dzp 0.0094 -Nmeas 5 -Ntime 3 -label elixir
+photreg -trans -photcode g -trange 2003/02/24,00:00:00 1s -zp 26.4400 -dzp 0.0049 -Nmeas 6 -Ntime 3 -label elixir
+photreg -trans -photcode u -trange 2003/03/22,00:00:00 1s -zp 25.4630 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/03/23,00:00:00 1s -zp 25.3060 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/03/24,00:00:00 1s -zp 24.8270 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/03/24,00:00:00 1s -zp 25.9920 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/03/24,00:00:00 1s -zp 26.4570 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/03/25,00:00:00 1s -zp 25.7630 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/03/25,00:00:00 1s -zp 26.0230 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/03/30,00:00:00 1s -zp 24.7150 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/03/30,00:00:00 1s -zp 26.4500 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/04/25,00:00:00 1s -zp 24.7530 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/04/25,00:00:00 1s -zp 25.7030 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/04/25,00:00:00 1s -zp 25.9290 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/04/25,00:00:00 1s -zp 26.4030 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/04/26,00:00:00 1s -zp 25.9730 -dzp 0.0195 -Nmeas 11 -Ntime 5 -label elixir
+photreg -trans -photcode r -trange 2003/04/27,00:00:00 1s -zp 25.9080 -dzp 0.0816 -Nmeas 5 -Ntime 3 -label elixir
+photreg -trans -photcode z -trange 2003/05/25,00:00:00 1s -zp 24.7560 -dzp 0.0183 -Nmeas 9 -Ntime 8 -label elixir
+photreg -trans -photcode i -trange 2003/05/25,00:00:00 1s -zp 25.7150 -dzp 0.0170 -Nmeas 3 -Ntime 3 -label elixir
+photreg -trans -photcode r -trange 2003/05/25,00:00:00 1s -zp 25.9720 -dzp 0.0093 -Nmeas 4 -Ntime 3 -label elixir
+photreg -trans -photcode g -trange 2003/05/25,00:00:00 1s -zp 26.4270 -dzp 0.0189 -Nmeas 5 -Ntime 4 -label elixir
+photreg -trans -photcode z -trange 2003/05/26,00:00:00 1s -zp 24.7150 -dzp 0.0262 -Nmeas 3 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/05/26,00:00:00 1s -zp 25.7270 -dzp 0.0006 -Nmeas 3 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/05/26,00:00:00 1s -zp 25.9510 -dzp 0.0040 -Nmeas 3 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/05/26,00:00:00 1s -zp 26.4060 -dzp 0.0021 -Nmeas 2 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/05/27,00:00:00 1s -zp 25.7260 -dzp 0.0242 -Nmeas 6 -Ntime 6 -label elixir
+photreg -trans -photcode r -trange 2003/05/27,00:00:00 1s -zp 25.9800 -dzp 0.0178 -Nmeas 7 -Ntime 6 -label elixir
+photreg -trans -photcode u -trange 2003/05/30,00:00:00 1s -zp 25.2890 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/06/02,00:00:00 1s -zp 24.8460 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/02,00:00:00 1s -zp 25.7290 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/04,00:00:00 1s -zp 25.7570 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/05,00:00:00 1s -zp 25.5920 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/06,00:00:00 1s -zp 25.7440 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/08,00:00:00 1s -zp 25.6810 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/06/08,00:00:00 1s -zp 25.9300 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/06/09,00:00:00 1s -zp 24.7580 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/06/09,00:00:00 1s -zp 25.2310 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/22,00:00:00 1s -zp 25.7240 -dzp 0.0071 -Nmeas 4 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/06/22,00:00:00 1s -zp 25.9690 -dzp 0.0201 -Nmeas 4 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/06/22,00:00:00 1s -zp 26.4250 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/06/23,00:00:00 1s -zp 24.8050 -dzp 0.0000 -Nmeas 6 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/06/23,00:00:00 1s -zp 25.9650 -dzp 0.0000 -Nmeas 6 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/06/23,00:00:00 1s -zp 26.4170 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/06/24,00:00:00 1s -zp 24.7930 -dzp 0.0284 -Nmeas 8 -Ntime 2 -label elixir
+photreg -trans -photcode u -trange 2003/06/24,00:00:00 1s -zp 25.2760 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/24,00:00:00 1s -zp 25.7160 -dzp 0.0096 -Nmeas 6 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/06/24,00:00:00 1s -zp 25.9500 -dzp 0.0145 -Nmeas 6 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/06/24,00:00:00 1s -zp 26.4130 -dzp 0.0113 -Nmeas 5 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/06/26,00:00:00 1s -zp 25.7120 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/06/26,00:00:00 1s -zp 25.9610 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/06/26,00:00:00 1s -zp 26.4180 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/06/27,00:00:00 1s -zp 24.7910 -dzp 0.0280 -Nmeas 8 -Ntime 2 -label elixir
+photreg -trans -photcode u -trange 2003/06/27,00:00:00 1s -zp 25.2580 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/27,00:00:00 1s -zp 25.7180 -dzp 0.0075 -Nmeas 6 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/06/27,00:00:00 1s -zp 25.9540 -dzp 0.0169 -Nmeas 6 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/06/27,00:00:00 1s -zp 26.4280 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/06/28,00:00:00 1s -zp 24.7710 -dzp 0.0000 -Nmeas 6 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/28,00:00:00 1s -zp 25.7050 -dzp 0.0000 -Nmeas 6 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/06/28,00:00:00 1s -zp 25.9660 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/06/28,00:00:00 1s -zp 26.4480 -dzp 0.0000 -Nmeas 6 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/06/29,00:00:00 1s -zp 24.7460 -dzp 0.0231 -Nmeas 8 -Ntime 2 -label elixir
+photreg -trans -photcode u -trange 2003/06/29,00:00:00 1s -zp 25.2760 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/29,00:00:00 1s -zp 25.6950 -dzp 0.0067 -Nmeas 8 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/06/29,00:00:00 1s -zp 25.9350 -dzp 0.0178 -Nmeas 8 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/06/29,00:00:00 1s -zp 26.4230 -dzp 0.0123 -Nmeas 8 -Ntime 2 -label elixir
+photreg -trans -photcode z -trange 2003/06/30,00:00:00 1s -zp 24.7410 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/06/30,00:00:00 1s -zp 25.1930 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/06/30,00:00:00 1s -zp 25.6660 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/06/30,00:00:00 1s -zp 25.9220 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/06/30,00:00:00 1s -zp 26.3190 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/07/01,00:00:00 1s -zp 24.8010 -dzp 0.0000 -Nmeas 6 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/07/01,00:00:00 1s -zp 25.2670 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/07/01,00:00:00 1s -zp 25.7180 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/07/01,00:00:00 1s -zp 25.9480 -dzp 0.0189 -Nmeas 6 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/07/01,00:00:00 1s -zp 26.4190 -dzp 0.0019 -Nmeas 6 -Ntime 2 -label elixir
+photreg -trans -photcode z -trange 2003/07/04,00:00:00 1s -zp 24.7980 -dzp 0.0000 -Nmeas 6 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/07/04,00:00:00 1s -zp 25.7090 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/07/04,00:00:00 1s -zp 25.9540 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/07/04,00:00:00 1s -zp 26.4020 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/07/05,00:00:00 1s -zp 24.7620 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/07/05,00:00:00 1s -zp 25.2740 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/07/05,00:00:00 1s -zp 25.7080 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/07/05,00:00:00 1s -zp 25.9440 -dzp 0.0116 -Nmeas 7 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/07/05,00:00:00 1s -zp 26.4110 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/07/07,00:00:00 1s -zp 25.8040 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/07/21,00:00:00 1s -zp 24.8630 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/07/22,00:00:00 1s -zp 24.7820 -dzp 0.0010 -Nmeas 14 -Ntime 2 -label elixir
+photreg -trans -photcode u -trange 2003/07/22,00:00:00 1s -zp 25.2880 -dzp 0.0135 -Nmeas 10 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/07/22,00:00:00 1s -zp 25.7240 -dzp 0.0044 -Nmeas 6 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/07/22,00:00:00 1s -zp 25.9580 -dzp 0.0105 -Nmeas 8 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/07/22,00:00:00 1s -zp 26.4220 -dzp 0.0079 -Nmeas 11 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/07/30,00:00:00 1s -zp 25.9360 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/07/30,00:00:00 1s -zp 26.3810 -dzp 0.0431 -Nmeas 78 -Ntime 47 -label elixir
+photreg -trans -photcode z -trange 2003/07/31,00:00:00 1s -zp 24.7420 -dzp 0.0000 -Nmeas 7 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/07/31,00:00:00 1s -zp 25.2280 -dzp 0.0000 -Nmeas 7 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/07/31,00:00:00 1s -zp 25.6900 -dzp 0.0000 -Nmeas 5 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/07/31,00:00:00 1s -zp 25.9390 -dzp 0.0000 -Nmeas 5 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/07/31,00:00:00 1s -zp 26.3850 -dzp 0.0086 -Nmeas 59 -Ntime 11 -label elixir
+photreg -trans -photcode z -trange 2003/08/01,00:00:00 1s -zp 24.7900 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/08/01,00:00:00 1s -zp 25.2630 -dzp 0.0000 -Nmeas 5 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/08/01,00:00:00 1s -zp 25.7130 -dzp 0.0039 -Nmeas 8 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/08/01,00:00:00 1s -zp 25.9480 -dzp 0.0113 -Nmeas 9 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/08/01,00:00:00 1s -zp 26.4230 -dzp 0.0070 -Nmeas 9 -Ntime 2 -label elixir
+photreg -trans -photcode z -trange 2003/08/21,00:00:00 1s -zp 24.7670 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/08/21,00:00:00 1s -zp 25.3330 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/08/21,00:00:00 1s -zp 25.7280 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/08/21,00:00:00 1s -zp 25.9570 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/08/21,00:00:00 1s -zp 26.4960 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/08/22,00:00:00 1s -zp 24.8120 -dzp 0.0202 -Nmeas 3 -Ntime 2 -label elixir
+photreg -trans -photcode u -trange 2003/08/22,00:00:00 1s -zp 25.4170 -dzp 0.0297 -Nmeas 8 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/08/22,00:00:00 1s -zp 25.7620 -dzp 0.0057 -Nmeas 4 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/08/22,00:00:00 1s -zp 26.0250 -dzp 0.0141 -Nmeas 2 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/08/22,00:00:00 1s -zp 26.5340 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/08/23,00:00:00 1s -zp 24.7390 -dzp 0.0374 -Nmeas 2 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/08/23,00:00:00 1s -zp 25.7560 -dzp 0.0007 -Nmeas 2 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/08/23,00:00:00 1s -zp 26.0110 -dzp 0.0112 -Nmeas 2 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/08/23,00:00:00 1s -zp 26.5310 -dzp 0.0150 -Nmeas 2 -Ntime 2 -label elixir
+photreg -trans -photcode z -trange 2003/08/25,00:00:00 1s -zp 24.7790 -dzp 0.0178 -Nmeas 4 -Ntime 2 -label elixir
+photreg -trans -photcode u -trange 2003/08/25,00:00:00 1s -zp 25.3610 -dzp 0.0563 -Nmeas 6 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/08/25,00:00:00 1s -zp 25.7800 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/08/25,00:00:00 1s -zp 26.0240 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/08/25,00:00:00 1s -zp 26.4770 -dzp 0.0472 -Nmeas 3 -Ntime 2 -label elixir
+photreg -trans -photcode z -trange 2003/08/27,00:00:00 1s -zp 24.7930 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/08/27,00:00:00 1s -zp 26.5100 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/08/28,00:00:00 1s -zp 24.8260 -dzp 0.0129 -Nmeas 5 -Ntime 3 -label elixir
+photreg -trans -photcode u -trange 2003/08/28,00:00:00 1s -zp 25.3980 -dzp 0.0000 -Nmeas 5 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/08/28,00:00:00 1s -zp 25.7680 -dzp 0.0067 -Nmeas 2 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/08/28,00:00:00 1s -zp 26.5090 -dzp 0.0025 -Nmeas 4 -Ntime 2 -label elixir
+photreg -trans -photcode z -trange 2003/08/29,00:00:00 1s -zp 24.7900 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/08/29,00:00:00 1s -zp 25.3900 -dzp 0.0013 -Nmeas 7 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/08/29,00:00:00 1s -zp 25.7720 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/08/29,00:00:00 1s -zp 25.9940 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/08/29,00:00:00 1s -zp 26.5010 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/08/30,00:00:00 1s -zp 24.8190 -dzp 0.0130 -Nmeas 4 -Ntime 3 -label elixir
+photreg -trans -photcode u -trange 2003/08/30,00:00:00 1s -zp 25.4250 -dzp 0.0351 -Nmeas 6 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/08/30,00:00:00 1s -zp 25.7790 -dzp 0.0032 -Nmeas 4 -Ntime 3 -label elixir
+photreg -trans -photcode r -trange 2003/08/30,00:00:00 1s -zp 26.0260 -dzp 0.0215 -Nmeas 3 -Ntime 3 -label elixir
+photreg -trans -photcode g -trange 2003/08/30,00:00:00 1s -zp 26.5390 -dzp 0.0227 -Nmeas 5 -Ntime 3 -label elixir
+photreg -trans -photcode z -trange 2003/08/31,00:00:00 1s -zp 24.8040 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode u -trange 2003/08/31,00:00:00 1s -zp 25.4070 -dzp 0.0000 -Nmeas 5 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/08/31,00:00:00 1s -zp 25.7790 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode r -trange 2003/08/31,00:00:00 1s -zp 26.0170 -dzp 0.0000 -Nmeas 1 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/08/31,00:00:00 1s -zp 26.5290 -dzp 0.0000 -Nmeas 2 -Ntime 1 -label elixir
+photreg -trans -photcode z -trange 2003/09/03,00:00:00 1s -zp 24.7940 -dzp 0.0089 -Nmeas 5 -Ntime 2 -label elixir
+photreg -trans -photcode i -trange 2003/09/03,00:00:00 1s -zp 25.7510 -dzp 0.0050 -Nmeas 4 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/09/03,00:00:00 1s -zp 25.9990 -dzp 0.0094 -Nmeas 2 -Ntime 2 -label elixir
+photreg -trans -photcode g -trange 2003/09/03,00:00:00 1s -zp 26.4850 -dzp 0.0437 -Nmeas 5 -Ntime 2 -label elixir
+photreg -trans -photcode z -trange 2003/09/04,00:00:00 1s -zp 24.7710 -dzp 0.0075 -Nmeas 7 -Ntime 2 -label elixir
+photreg -trans -photcode u -trange 2003/09/04,00:00:00 1s -zp 25.3510 -dzp 0.0000 -Nmeas 4 -Ntime 1 -label elixir
+photreg -trans -photcode i -trange 2003/09/04,00:00:00 1s -zp 25.7470 -dzp 0.0061 -Nmeas 4 -Ntime 2 -label elixir
+photreg -trans -photcode r -trange 2003/09/04,00:00:00 1s -zp 25.9760 -dzp 0.0000 -Nmeas 3 -Ntime 1 -label elixir
+photreg -trans -photcode g -trange 2003/09/04,00:00:00 1s -zp 26.4760 -dzp 0.0049 -Nmeas 4 -Ntime 2 -label elixir
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/ConfigInit.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/ConfigInit.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/ConfigInit.c	(revision 21753)
@@ -0,0 +1,109 @@
+# include "imregister.h"
+# include "imphot.h"
+
+int success;
+
+void ConfigInitImphot (int *argc, char **argv) {
+
+  int i, NDB;
+  char *config, *file, ElixirBase[80], catdir[256];
+
+  /*** load configuration info ***/
+  file = SelectConfigFile (argc, argv, "ptolemy");
+  config = LoadConfigFile (file);
+  if (config == (char *) NULL) {
+    fprintf (stderr, "ERROR: can't find configuration file %s\n", file);
+    if (file != (char *) NULL) free (file);
+    exit (0);
+  }
+
+  success = TRUE;
+
+  WarnConfig (config, "CATDIR",                      "%s", 0, catdir);
+  sprintf (ImPhotDB, "%s/Images.dat", catdir);
+
+  /* small text databases: filters, camera defs */ 
+  WarnConfig (config, "PHOTCODE_FILE",               "%s", 0, PhotCodeFile);
+  WarnConfig (config, "TEMPERATURE_LOG",             "%s", 0, TempLogFile);
+  WarnConfig (config, "FILTER_LIST",                 "%s", 0, FilterList);
+  WarnConfig (config, "CAMERA_CONFIG",               "%s", 0, CameraConfig);
+  WarnConfig (config, "DETREND_RECIPES",             "%s", 0, RecipeFile);
+						   
+  /* pixel scale for FWHM */ 
+  WarnConfig (config, "ASEC_PIX",                    "%lf", 0, &ARCSEC_PIXEL);
+
+  /* keyword abstractions for parse_time */	   
+  WarnConfig (config, "DATE-KEYWORD",                "%s", 0, DateKeyword);
+  WarnConfig (config, "DATE-MODE",                   "%s", 0, DateMode);
+  WarnConfig (config, "UT-KEYWORD",                  "%s", 0, UTKeyword);
+  WarnConfig (config, "MJD-KEYWORD",                 "%s", 0, MJDKeyword);
+  WarnConfig (config, "JD-KEYWORD",                  "%s", 0, JDKeyword);
+						   
+  /* keyword abstractions for iminfo */		   
+  WarnConfig (config, "EXPTIME-KEYWORD",             "%s", 0, ExptimeKeyword);
+  WarnConfig (config, "IMAGETYPE-KEYWORD",           "%s", 0, ImagetypeKeyword);
+  WarnConfig (config, "CCDNUM-KEYWORD",              "%s", 0, CCDnumKeyword);
+  WarnConfig (config, "FILTER-KEYWORD",              "%s", 0, FilterKeyword);
+  WarnConfig (config, "AIRMASS-KEYWORD",             "%s", 0, AirmassKeyword);
+  WarnConfig (config, "FOCUS-KEYWORD",               "%s", 0, FocusKeyword);
+  WarnConfig (config, "ROTATION-KEYWORD",            "%s", 0, RotationKeyword);
+  WarnConfig (config, "DETTEMP-KEYWORD",             "%s", 0, DettempKeyword);
+  WarnConfig (config, "TELDATA1-KEYWORD",            "%s", 0, Teldata1Keyword);
+  WarnConfig (config, "TELDATA2-KEYWORD",            "%s", 0, Teldata2Keyword);
+  WarnConfig (config, "TELDATA3-KEYWORD",            "%s", 0, Teldata3Keyword);
+  WarnConfig (config, "CAMERA-KEYWORD",              "%s", 0, CameraKeyword);
+
+  ScanConfig (config, "CAMERA",                      "%s", 0, Camera);
+  ScanConfig (config, "SEEING_REF_CCD",              "%s", 0, SeeingREFCCD);
+
+  /* optional values */
+  ScanConfig (config, "RA-DDD-KEYWORD",              "%s", 0, RADecDegKeyword);
+  ScanConfig (config, "DEC-DDD-KEYWORD",             "%s", 0, DECDecDegKeyword);
+  ScanConfig (config, "RA-HMS-KEYWORD",              "%s", 0, RASexigKeyword);
+  ScanConfig (config, "DEC-DMS-KEYWORD",             "%s", 0, DECSexigKeyword);
+
+  if (!RADecDegKeyword[0] & !DECDecDegKeyword[0] && !RASexigKeyword[0] && !DECSexigKeyword[0]) {
+    fprintf (stderr, "missing astrometry configuration information\n");
+    success = FALSE;
+  }
+						   
+  WarnConfig (config, "imstats",                     "%s", 0, ElixirBase);
+  sprintf (ImstatFifo, "%s.source", ElixirBase);   
+  WarnConfig (config, "ptolemy",                     "%s", 0, ElixirBase);
+  sprintf (PtolemyFifo, "%s.source", ElixirBase);
+
+  if (!ScanConfig (config, "CONNECT", "%s",  0, CONNECT)) {
+    sprintf (CONNECT, "/usr/bin/rsh");
+  }
+
+  /* load Detrend Alt Databases paths */
+  NDB = 10;
+  NDetrendAltDB = 0;
+  ALLOCATE (DetrendAltDB, char *, NDB);
+  ALLOCATE (DetrendAltDB[NDetrendAltDB], char, 256);
+  for (i = 1; ScanConfig (config, "DETREND_ALT_DB", "%s", i, DetrendAltDB[NDetrendAltDB]); i++) {
+    NDetrendAltDB ++;
+    if (NDetrendAltDB == NDB) {
+      NDB += 10;
+      REALLOCATE (DetrendAltDB, char *, NDB);
+    }
+    ALLOCATE (DetrendAltDB[NDetrendAltDB], char, 256);
+  }
+  free (DetrendAltDB[NDetrendAltDB]);
+
+  if (! success) {
+    fprintf (stderr, "ERROR: problem with elixir configuration\n");
+    exit (1);
+  }
+
+  free (config);
+  free (file);
+
+}
+
+void WarnConfig (char *config, char *key, char * mode, int N, void *var) {
+  if (!ScanConfig (config, key, mode, N, var)) {
+    fprintf (stderr, "missing config variable %s\n", key);
+    success = FALSE;
+  }
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/args.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/args.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/args.c	(revision 21753)
@@ -0,0 +1,98 @@
+# include "imregister.h" 
+# include "imphot.h"
+
+/* criteria struct is global */
+int args (int argc, char **argv) {
+
+  int N;
+
+  ConfigInit (&argc, argv); /* load elixir config data */
+
+  /* load photcode data */
+  if (!LoadPhotcodes (PhotCodeFile)) {
+    fprintf (stderr, "error loading photcodes from %s\n", PhotCodeFile);
+    exit (1);
+  }
+
+  /* interpret command-line arguments */
+  if (!get_trange_arguments (&argc, argv, &criteria.tstart, &criteria.tstop, &criteria.Ntimes)) {
+    fprintf (stderr, "ERROR: syntax error\n");
+    exit (1);
+  }
+
+  /* select by image photcode */
+  criteria.PhotcodeSelect = FALSE;
+  criteria.photcode = 0;
+  if ((N = get_argument (argc, argv, "-photcode"))) {
+    remove_argument (N, &argc, argv);
+    if (!(criteria.photcode = GetPhotcodeCodebyName (argv[N]))) {
+      fprintf (stderr, "ERROR: photcode not found in photcode table\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    criteria.PhotcodeSelect = TRUE;
+  }
+
+  /* string in image name */
+  criteria.NameSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-name"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Name = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.NameSelect = TRUE;
+  }
+
+  /* string in image name */
+  criteria.CodeSelect = FALSE;
+  criteria.Code = 0;
+  if ((N = get_argument (argc, argv, "-code"))) {
+    criteria.CodeSelect = TRUE;
+    remove_argument (N, &argc, argv);
+    criteria.Code = atoi (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  options.table = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-fits"))) {
+    remove_argument (N, &argc, argv);
+    options.table = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  options.bintable = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-binfits"))) {
+    remove_argument (N, &argc, argv);
+    options.bintable = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  /* desired action */
+  options.modify = FALSE;
+  options.ModifyValue = options.ModifyEntry = NULL;
+  if ((N = get_argument (argc, argv, "-flag"))) {
+    remove_argument (N, &argc, argv);
+    options.ModifyEntry = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    options.ModifyValue = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    options.modify = TRUE;
+  }
+
+  VERBOSE = FALSE;
+  if ((N = get_argument (argc, argv, "-v"))) {
+    remove_argument (N, &argc, argv);
+    VERBOSE = TRUE;
+  }
+
+  FORCE_READ = FALSE;
+  if ((N = get_argument (argc, argv, "-force"))) {
+    remove_argument (N, &argc, argv);
+    FORCE_READ = TRUE;
+  }
+
+  if (argc != 1) {
+    fprintf (stderr, "USAGE: imphotsearch [config ops] [-trange start stop/delta] [-photcode code] [-fits out.fits]\n");
+    exit (1);
+  }
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/db_load.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/db_load.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/db_load.c	(revision 21753)
@@ -0,0 +1,39 @@
+# include "imregister.h"
+# include "imphot.h"
+
+enum {FITS, TEXT};
+
+int db_load (FITS_DB *db) {
+
+  int Nx, Ny, Naxis;
+  int mode, status;
+
+  /* database name must be set first */
+  if (db == NULL) {
+    fprintf (stderr, "db handle is not set\n");
+    return (FALSE);
+  }
+
+  /* init & load in FITS table data - return FALSE on error */
+  if (!fits_fread_header (db[0].f, &db[0].header)) {
+    fprintf (stderr, "can't read primary header\n"); 
+    return (FALSE);
+  }
+
+  fits_scan (&db[0].header, "NAXIS",  "%d", 1, &Naxis);
+  fits_scan (&db[0].header, "NAXIS1", "%d", 1, &Nx);
+  fits_scan (&db[0].header, "NAXIS2", "%d", 1, &Ny);
+  
+  mode = FITS;
+  if ((Naxis == 2) && (Nx == 1106) && (Ny == 1024)) {
+    mode = TEXT;
+  }
+  
+  /* how do we decide if it is text or fits? must examine header */
+  if (FITS) {
+    status = rfits (db);
+  } else {
+    status = rtext (db);
+  }
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/dumpfits.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/dumpfits.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/dumpfits.c	(revision 21753)
@@ -0,0 +1,141 @@
+# include "imregister.h"
+# include "imphot.h"
+
+/* write out complete binary FITS table in format of db */
+int DumpFitsBintable (char *filename, Image *image, int *match, int Nmatch) {
+
+  int i, j;
+  FILE *f;
+  Header header;
+  Matrix matrix;
+  Header theader;
+  FTable ftable;
+  Image *subset;
+
+  ALLOCATE (subset, Image, MAX (1, Nmatch));
+  for (i = 0; i < Nmatch; i++){
+    j = match[i];
+    memcpy (&subset[i], &image[j], sizeof (Image));
+  }
+
+  /* open file for output */
+  f = fopen (filename, "w");
+  if (f == NULL) {
+    fprintf (stderr, "ERROR: can't open output file %s\n", filename);
+    exit (1);
+  }
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+
+  ftable.header = &theader;
+  fits_table_set_Image (&ftable, subset, Nmatch);
+
+  fits_fwrite_header  (f, &header);
+  fits_fwrite_matrix  (f, &matrix);
+  fits_fwrite_Theader (f, &theader);
+  fits_fwrite_table   (f, &ftable);
+  fclose (f);
+  exit (0);
+}
+
+int DumpFitsTable (char *filename, Image *image, int *match, int Nmatch) {
+  
+  Header header;
+  Matrix matrix;
+  Header theader;
+  FTable ftable;
+  Image *subset;
+  FILE *f;
+  char *startstr, *filtstr, *datestr, *line;
+  int i;
+  double zp, dzp, ra, dec, airmass, sky;
+  unsigned long tsecond;
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+  
+  /* the ASCII table is always a little harder than the binary:
+   * we need to build the data line a bit carefully 
+   */
+
+  /* create table header */
+  fits_create_table_header (&theader, "TABLE", "ZPTS");
+
+  /* add current date/time to header */
+  str_to_time ("now", &tsecond);
+  datestr = sec_to_date (tsecond);
+  fits_modify (&header,  "DATE", "%s", 1, datestr);
+  fits_modify (&theader, "DATE", "%s", 1, datestr);
+  
+  /* define table layout */
+  fits_define_table_column (&theader, "A20",   "START_TIME", "start time of measurement", "yyyy/mm/dd,hh:mm:ss");
+  fits_define_table_column (&theader, "A10",   "FILTER",     "filter and camera name",    "");
+  fits_define_table_column (&theader, "F8.4",  "ZP_OBS",     "measured zero point",       "mag");
+  fits_define_table_column (&theader, "F7.4",  "ZP_ERR",     "error on zero point",       "mag");
+  fits_define_table_column (&theader, "F11.6", "RA",         "RA (J2000)",                "dec. degrees");
+  fits_define_table_column (&theader, "F11.6", "DEC",        "DEC (J2000)",               "dec. degrees");
+  fits_define_table_column (&theader, "F7.3",  "C_AIRMASS",  "airmass coeff",             "mag per airmass"); 
+  fits_define_table_column (&theader, "F7.1",  "SKY",        "median sky flux",           "counts");
+  fits_define_table_column (&theader, "I6",    "NSTAR",      "Number of stars in image",  "stars");
+
+  /* define TNULL, TNVAL values */
+  fits_modify (&theader, "TNULL1",  "%s", 1, "NULL"); /* START_TIME */
+  fits_modify (&theader, "TNULL2",  "%s", 1, "NULL"); /* FILTER     */
+  fits_modify (&theader, "TNULL3",  "%s", 1, "NaN");  /* ZP_OBS     */
+  fits_modify (&theader, "TNULL4",  "%s", 1, "NaN");  /* ZP_ERR     */
+  fits_modify (&theader, "TNULL5",  "%s", 1, "NaN");  /* RA         */
+  fits_modify (&theader, "TNULL6",  "%s", 1, "NaN");  /* DEC        */
+  fits_modify (&theader, "TNULL7",  "%s", 1, "NaN");  /* C_AIRMASS  */
+  fits_modify (&theader, "TNULL8",  "%s", 1, "NaN");  /* SKY        */
+  fits_modify (&theader, "TNULL9",  "%s", 1,  "-1");  /* NSTAR      */
+
+  fits_modify (&theader, "TNVAL1",  "%s", 1, "NA");   /* START_TIME */
+  fits_modify (&theader, "TNVAL2",  "%s", 1, "NA");   /* FILTER     */
+  fits_modify (&theader, "TNVAL3",  "%s", 1, "Inf");  /* ZP_OBS     */
+  fits_modify (&theader, "TNVAL4",  "%s", 1, "Inf");  /* ZP_ERR     */
+  fits_modify (&theader, "TNVAL5",  "%s", 1, "Inf");  /* RA         */
+  fits_modify (&theader, "TNVAL6",  "%s", 1, "Inf");  /* DEC        */
+  fits_modify (&theader, "TNVAL7",  "%s", 1, "Inf");  /* C_AIRMASS  */
+  fits_modify (&theader, "TNVAL8",  "%s", 1, "Inf");  /* SKY        */
+  fits_modify (&theader, "TNVAL9",  "%s", 1,  "-2");  /* NSTAR      */
+
+  /* add data to table */
+  for (i = 0; i < Nmatch; i++) {
+    subset   = &image[match[i]];
+    startstr = sec_to_date (subset[0].tzero);
+    filtstr  = GetPhotcodeNamebyCode (subset[0].source);
+    zp       = subset[0].Mcal_PS;
+    dzp      = subset[0].dMcal_PS;
+    XY_to_RD (&ra, &dec, 0.0, 0.0, &subset[0].coords);
+    airmass  = subset[0].secz_PS;
+    sky      = subset[0].Myyyy + 0x8000;
+
+    /* we should get an error here if we don't construct this line correctly */
+    line = fits_table_print (&ftable, startstr, filtstr, zp, dzp, ra, dec, airmass, sky, subset[0].nstar);
+    fits_add_rows (&ftable, line, 1, strlen(line));
+    free (line);
+    free (startstr);
+  }
+
+  /* write data to output file */
+  f = fopen (filename, "w");
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "Failure writing fits table\n");
+    exit (1);
+  }
+  fits_fwrite_header  (f, &header);
+  fits_fwrite_matrix  (f, &matrix);
+  fits_fwrite_Theader (f, &theader);
+  fits_fwrite_table   (f, &ftable);
+  fclose (f);
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/modify.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/modify.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/modify.c	(revision 21753)
@@ -0,0 +1,39 @@
+# include "imregister.h"
+# include "imphot.h"
+
+void ModifySubset (FITS_DB *db, Image *image, int Nimage, int *match, int Nmatch) {
+
+  int i, j;
+
+  /* modify the selected entries */
+  for (j = 0; j < Nmatch; j++) {
+
+    i = match[j];
+
+    if (options.modify) {
+      if (!strcasecmp (options.ModifyEntry, "and")) {
+	image[i].code &= atoi (options.ModifyValue);
+      }
+      if (!strcasecmp (options.ModifyEntry, "or")) {
+	image[i].code |= atoi (options.ModifyValue);
+      }
+      if (!strcasecmp (options.ModifyEntry, "xor")) {
+	image[i].code ^= atoi (options.ModifyValue);
+      }
+      if (!strcasecmp (options.ModifyEntry, "=")) {
+	image[i].code = atoi (options.ModifyValue);
+      }
+    }
+  }
+
+  /** we may later want to pull this out and put it elsewhere **/
+  fits_vtable_from_ftable (&db[0].ftable, &db[0].vtable, match, Nmatch);
+  for (i = 0; i < Nmatch; i++) {
+    fits_convert_Image ((Image *) db[0].vtable.buffer[i], sizeof (Image), 1);
+  }
+  fits_db_update (db);
+  fits_db_close (db);
+  fits_db_free (db);
+
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/output.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/output.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/output.c	(revision 21753)
@@ -0,0 +1,45 @@
+# include "imregister.h"
+# include "imphot.h"
+
+int output (Image *image, int *match, int Nmatch) {
+
+  int status;
+
+  /* output the selected entries */
+  if (options.table != (char *) NULL) {
+    status = DumpFitsTable (options.table, image, match, Nmatch);
+    return (TRUE);
+  } 
+
+  /* output the selected entries */
+  if (options.bintable != (char *) NULL) {
+    status = DumpFitsBintable (options.bintable, image, match, Nmatch);
+    return (TRUE);
+  } 
+
+  PrintSubset (image, match, Nmatch);
+  return (TRUE);
+}
+
+int PrintSubset (Image *image, int *match, int Nmatch) {
+
+  int i, j;
+  char *timestr, *photstr;
+  static char PhotError[] = "unknown";
+
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j];
+      
+    /* convert UNIX time to Elixir-style date string */
+    timestr = sec_to_date (image[i].tzero);
+      
+    /* convert photcode to filter name */
+    photstr = GetPhotcodeNamebyCode (image[i].source);
+    if (photstr == (char *) NULL) photstr = PhotError;
+      
+    fprintf (stdout, "%s %s %s  %7.4f %7.4f  %7.4f %5d %02x\n", image[i].name, photstr, timestr, 
+	     image[i].Mcal_PS, image[i].dMcal_PS, image[i].secz_PS, image[i].nstar, image[i].code); 
+    free (timestr);
+  }
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/rfits.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/rfits.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/rfits.c	(revision 21753)
@@ -0,0 +1,25 @@
+# include "imregister.h"
+
+/* load the rest of the db table into memory (first extension only) */
+int rfits (FITS_DB *db) {
+
+  /* database name must be set first */
+  if (db == NULL) {
+    fprintf (stderr, "db handle is not set\n");
+    return (FALSE);
+  }
+  if (!fits_fread_matrix (db[0].f, &db[0].matrix, &db[0].header)) {
+    fprintf (stderr, "can't read primary matrix");
+    return (FALSE);
+  }
+  if (!fits_fread_header (db[0].f, &db[0].theader)) {
+    fprintf (stderr, "can't read table header");
+    return (FALSE);
+  }
+  if (!fits_fread_ftable_data (db[0].f, &db[0].ftable)) {
+    fprintf (stderr, "can't read table data");
+    return (FALSE);
+  }
+  return (TRUE);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/rtext.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/rtext.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/rtext.c	(revision 21753)
@@ -0,0 +1,54 @@
+# include "imregister.h"
+# include "imphot.h"
+
+int rtext (FITS_DB *db) {
+
+  int Nimage, size, nimage;
+  struct stat filestatus;
+  Image *image;
+
+  /* check that file size makes sense */
+  Nimage = 0;
+  fits_scan (&db[0].header, "NIMAGES", "%d", 1, &Nimage);
+  if (stat (db[0].filename, &filestatus) == -1) {
+    if (VERBOSE) fprintf (stderr, "ERROR: failed to get status of image catalog\n");
+    exit (1);
+  }
+  size = Nimage*sizeof(Image) + db[0].header.size;
+  if (size != filestatus.st_size) {
+    int Ndata;
+
+    Ndata = (filestatus.st_size - db[0].header.size) / sizeof (Image);
+    if (VERBOSE) fprintf (stderr, "ERROR: image catalog has inconsistent size\n");
+    if (VERBOSE) fprintf (stderr, "header: %d, data: %d\n", Nimage, Ndata);
+    if (!FORCE_READ) exit (1);
+    Nimage = Ndata;
+  } 
+
+  /* create a dummy set of table information */
+  /* (original table has NAXIS = 2, change to 0) */
+  fits_modify (&db[0].header, "NAXIS", "%d", 1, 0);
+  fits_create_matrix (&db[0].header, &db[0].matrix);
+  fits_table_mkheader_Image (&db[0].theader);
+  db[0].ftable.header = &db[0].theader;
+
+  /* alloc, read images */
+  ALLOCATE (image, Image, MAX (Nimage, 1));
+  nimage = fread (image, sizeof(Image), Nimage, db[0].f);
+  if (nimage != Nimage) {
+    if (VERBOSE) fprintf (stderr, "ERROR: problem loading image catalog\n");
+    exit (1);
+  } 
+  db[0].ftable.buffer = (char *) image;
+  fits_modify (&db[0].theader, "NAXIS2", "%d", 1, Nimage);
+  db[0].theader.Naxis[1] = Nimage;
+  db[0].ftable.size = fits_matrix_size (&db[0].theader);
+  
+  return (TRUE);
+}
+
+/* the old Image.dat files used a fake FITS header defining a finite data block
+   this function reads in the 
+*/
+
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/subset.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/subset.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imphot/subset.c	(revision 21753)
@@ -0,0 +1,34 @@
+# include "imregister.h"
+# include "imphot.h"
+
+int *subset (Image *image, int Nimage, int *nsubset) {
+
+  int i, j, status;
+  int Nsubset, NameSelectLength;
+  int *index;
+
+  NameSelectLength = 0;
+
+  /* allocate space for reference lists */
+  Nsubset = 0;
+  ALLOCATE (index, int, Nimage);
+  
+  if (criteria.NameSelect) {
+    NameSelectLength = strlen(criteria.Name);
+  }
+
+  for (i = 0; i < Nimage; i++) {
+    for (j = 0, status = FALSE; !status && (j < criteria.Ntimes); j++) {
+      status = (image[i].tzero >= criteria.tstart[j]) && (image[i].tzero <= criteria.tstop[j]);
+    }
+    if (!status && criteria.Ntimes) continue;
+    if (criteria.PhotcodeSelect && (image[i].source != criteria.photcode)) continue;
+    if (criteria.CodeSelect     && (image[i].code != criteria.Code)) continue;
+    if (criteria.NameSelect     && strncasecmp (image[i].name, criteria.Name, NameSelectLength)) continue;
+
+    index[Nsubset] = i;
+    Nsubset ++;
+  }
+  *nsubset = Nsubset;
+  return (index);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/ConfigPID.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/ConfigPID.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/ConfigPID.c	(revision 21753)
@@ -0,0 +1,86 @@
+# include "imregister.h"
+# include "imreg.h"
+
+static char *PIDMaster = (char *) NULL;
+
+int ConfigPID (char *pidfile) {
+
+  pid_t pid;
+  char *username, machine[256];
+  FILE *f;
+
+  ALLOCATE (username, char, 256);
+  if (!LoadPID (pidfile, &pid, username, machine)) {
+    /* no PID file, make new one */
+
+    pid = getpid ();
+
+    free (username);
+    username = getenv ("USER");
+    if (username == (char *) NULL) {
+      fprintf (stderr, "error getting username\n");
+      exit (2);
+    }
+    bzero (machine, 256);
+    if (gethostname (machine, 256)) {
+      fprintf (stderr, "error getting hostname\n");
+      exit (2);
+    }
+
+    f = fopen (pidfile, "w");
+    if (f == (FILE *) NULL) { 
+      fprintf (stderr, "can't write to PID file %s\n", pidfile);
+      exit (2);
+    }
+
+    fprintf (f, "PID:     %d\n", pid);
+    fprintf (f, "USER:    %-s\n", username);
+    fprintf (f, "MACHINE: %-s\n", machine);
+    fclose (f);
+
+    PIDMaster = pidfile;
+    return (TRUE); 
+  }
+
+  /* PID file exists, warn & exit */
+  fprintf (stderr, "elixir is apparently running:\n\n");
+  fprintf (stderr, "  machine: %s\n", machine);
+  fprintf (stderr, "  user: %s\n", username);
+  fprintf (stderr, "  PID: %d\n", pid);
+  fprintf (stderr, "  remove %s if elixir has died unexpectedly\n", pidfile);
+  Shutdown (1);
+  return (FALSE); 
+}
+
+void RemovePID () {
+  
+  if (PIDMaster == (char *) NULL) 
+    return;
+  
+  if (unlink (PIDMaster)) {
+    fprintf (stderr, "error deleting PID File %s\n", PIDMaster);
+  }   
+}
+
+int LoadPID (char *file, pid_t *pid, char *username, char *machine) {
+
+  FILE *f;
+
+  f = fopen (file, "r");
+  if (f == (FILE *) NULL) { 
+    return (FALSE);
+  }
+
+  fscanf (f, "%*s %d", pid);
+  fscanf (f, "%*s %s", username);
+  fscanf (f, "%*s %s", machine);
+  fclose (f);
+
+  return (TRUE);
+}
+
+int Shutdown (int status) {
+
+  RemovePID ();
+  exit (status);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/FifoOps.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/FifoOps.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/FifoOps.c	(revision 21753)
@@ -0,0 +1,97 @@
+# include "imregister.h"
+# include "imreg.h"
+
+int InitFifo (Fifo *fifo, int Nalloc, int Nextra) {
+
+  if (Nextra >= Nalloc) {
+    fprintf (stderr, "absurd fifo definition\n");
+    return (FALSE);
+  }
+
+  fifo[0].Nalloc = Nalloc;
+  fifo[0].Nextra = Nextra;
+  fifo[0].Nmaxread = Nalloc - Nextra;
+  fifo[0].Nlast = 0;
+  fifo[0].Nbuffer = 0;
+
+  ALLOCATE (fifo[0].buffer, char, fifo[0].Nalloc);
+
+  return (TRUE);
+
+}
+
+int FlushFifo (Fifo *fifo) {
+
+  fifo[0].Nlast = 0;
+  fifo[0].Nbuffer = 0;
+
+  return (TRUE);
+
+}
+
+/* after a shift, we can always read 
+   fifo[0].Nmaxread 
+   bytes into 
+   &fifo[0].buffer[Nbuffer] 
+   which is the byte after then end of existing data */
+
+int ShiftFifo (Fifo *fifo) {
+
+  int Nextra, Nshift;
+
+  Nextra = fifo[0].Nextra;
+  Nshift = fifo[0].Nbuffer - fifo[0].Nextra;
+  if (Nshift <= 0) return (TRUE);
+
+  memcpy (fifo[0].buffer, &fifo[0].buffer[Nshift], Nextra);
+  fifo[0].Nbuffer = Nextra;
+  fifo[0].Nlast = Nextra;
+
+  return (TRUE);
+}
+
+/* like a standard read, ReadtoFifo returns Nbytes read,
+   -1 for sock busy, or 0 for sock closed */
+
+int ReadtoFifo (Fifo *fifo, int sock) {
+
+  int Nread;
+  int Nbuffer, Nmaxread;
+
+  if (sock == 0) {
+    fprintf (stderr, "error with socket?\n");
+    return (0);
+  }
+
+  fifo[0].Nlast = fifo[0].Nbuffer;
+
+  Nbuffer = fifo[0].Nbuffer;
+  Nmaxread = fifo[0].Nmaxread;
+  Nread = read (sock, &fifo[0].buffer[Nbuffer], Nmaxread);
+
+  if (Nread > 0) fifo[0].Nbuffer += Nread;
+
+  if (Nread == -1) {
+    /* check for possible errors.  anything other than EAGAIN
+       is bad and should indicate the connection is down */
+    switch (errno) {
+    case EAGAIN:
+    case EIO:
+      Nread = -1;
+      break;
+    default:
+      fprintf (stderr, "read error: %d\n", errno);
+      Nread = 0;
+      break;
+    }
+  }
+
+  return (Nread);
+}
+
+void FreeFifo (Fifo *fifo) {
+
+  if (fifo[0].buffer != (char *) NULL) {
+    free (fifo[0].buffer);
+  }
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/SetSignals.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/SetSignals.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/SetSignals.c	(revision 21753)
@@ -0,0 +1,172 @@
+# include "imregister.h"
+# include "imreg.h"
+
+void SIG_DIE (int sig) {
+  fprintf (stderr, "trapped signal %d, exiting\n", sig);
+  Shutdown (1);
+}
+
+void SIG_PIPE (int sig) {
+  fprintf (stderr, "pipe signal: %d\n", sig);
+}
+
+void SetSignals () {
+
+  /* use default settings */
+  signal (SIGKILL,   SIG_DFL);    
+  signal (SIGCONT,   SIG_DFL);    
+  signal (SIGSTOP,   SIG_DFL);    
+  signal (SIGCHLD,   SIG_DFL);
+
+  /* exit on these signals */
+  signal (SIGILL,    SIG_DIE);     
+  signal (SIGABRT,   SIG_DIE);    
+  signal (SIGFPE,    SIG_DIE);     
+  signal (SIGSEGV,   SIG_DIE);    
+  signal (SIGTERM,   SIG_DIE);    
+  signal (SIGBUS,    SIG_DIE);     
+  signal (SIGTRAP,   SIG_DIE);    
+  signal (SIGXCPU,   SIG_DIE);    
+  signal (SIGXFSZ,   SIG_DIE);    
+  signal (SIGIOT,    SIG_DIE);     
+  signal (SIGPWR,    SIG_DIE);     
+  signal (SIGINT,    SIG_DIE);
+
+  signal (SIGPIPE,   SIG_PIPE);    
+
+  /* ignore these signals */
+  signal (SIGHUP,    SIG_IGN);
+  signal (SIGQUIT,   SIG_IGN);
+  signal (SIGALRM,   SIG_IGN);    
+  signal (SIGUSR1,   SIG_IGN);    
+  signal (SIGUSR2,   SIG_IGN);    
+  signal (SIGTSTP,   SIG_IGN);    
+  signal (SIGTTIN,   SIG_IGN);    
+  signal (SIGTTOU,   SIG_IGN);    
+  signal (SIGPOLL,   SIG_IGN);    
+  signal (SIGPROF,   SIG_IGN);    
+  signal (SIGURG,    SIG_IGN);     
+  signal (SIGVTALRM, SIG_IGN);  
+  signal (SIGIO,     SIG_IGN);      
+  signal (SIGWINCH,  SIG_IGN);   
+
+  /* signals which are not always defined */
+# ifdef SIGUNUSED
+  signal (SIGUNUSED, SIG_DFL);  
+# endif
+# ifdef SIGSYS
+  signal (SIGSYS,    SIG_DIE);     
+# endif
+# ifdef SIGEMT
+ signal (SIGEMT,    SIG_DIE); 
+# endif
+# ifdef SIGSTKFLT
+  signal (SIGSTKFLT, SIG_DIE);  
+# endif
+# ifdef SIGINFO
+ signal (SIGINFO,   SIG_DIE); 
+# endif
+# ifdef SIGCLD
+  signal (SIGCLD,    SIG_DFL);     
+# endif
+# ifdef SIGLOST
+  signal (SIGLOST,   SIG_IGN); 
+# endif
+# ifdef SIGUNUSED
+  signal (SIGUNUSED,   SIG_IGN); 
+# endif
+
+}
+
+void KillProcess (char *pidfile) {
+  
+  pid_t pid;
+  char username[256], machine[256];
+  char line[512];
+  int i, wsock, rsock;
+  struct stat filestat;
+
+  if (!LoadPID (pidfile, &pid, username, machine)) {
+    fprintf (stderr, "imstatreg is not running\n");
+    exit (0);
+  }
+
+  /* send signal to remote machine */
+  if (!rconnect (machine, CONNECT, &rsock, &wsock)) {
+    fprintf (stderr, "can't make connection to machine %s to kill process %d\n", machine, pid);
+    exit (1);
+  }
+  sprintf (line, "kill -TERM %d\n", pid);
+  write (wsock, line, strlen (line));
+
+  for (i = 0; i < 300; i++) {
+    if (stat (pidfile, &filestat) == -1) exit (0);
+    usleep (100000);
+  }
+  fprintf (stderr, "imstatreg is still running\n");
+  exit (2);
+}
+
+void StatusProcess (char *pidfile) {
+  
+  pid_t pid;
+  char username[256], machine[256];
+
+  if (!LoadPID (pidfile, &pid, username, machine)) {
+    fprintf (stderr, "imstatreg is not running\n");
+    exit (2);
+  }
+
+  /* PID file exists, warn & exit */
+  fprintf (stderr, "imstatreg is apparently running:\n\n");
+  fprintf (stderr, "  machine: %s\n", machine);
+  fprintf (stderr, "  user: %s\n", username);
+  fprintf (stderr, "  PID: %d\n", pid);
+  fprintf (stderr, "  remove %s if imstatreg has died unexpectedly\n", pidfile);
+
+  exit (0);
+}
+
+/*
+
+  SIGHUP             1        A      Hangup detected on controlling terminal
+                                     or death of controlling process
+  SIGINT             2        A      Interrupt from keyboard
+  SIGQUIT            3        C      Quit from keyboard
+  SIGILL             4        C      Illegal Instruction
+  SIGABRT            6        C      Abort signal from abort(3)
+  SIGFPE             8        C      Floating point exception
+  SIGKILL            9       AEF     Kill signal
+  SIGSEGV           11        C      Invalid memory reference
+  SIGPIPE           13        A      Broken pipe: write to pipe with no readers
+  SIGALRM           14        A      Timer signal from alarm(2)
+  SIGTERM           15        A      Termination signal
+  SIGUSR1        30,10,16     A      User-defined signal 1
+  SIGUSR2        31,12,17     A      User-defined signal 2
+  SIGCHLD        20,17,18     B      Child stopped or terminated
+  SIGCONT        19,18,25            Continue if stopped
+  SIGSTOP        17,19,23    DEF     Stop process
+  SIGTSTP        18,20,24     D      Stop typed at tty
+  SIGTTIN        21,21,26     D      tty input for background process
+  SIGTTOU        22,22,27     D      tty output for background process
+  SIGBUS         10,7,10      C      Bus error (bad memory access)
+  SIGPOLL                     A      Pollable event (Sys V). Synonym of SIGIO
+  SIGPROF        27,27,29     A      Profiling timer expired
+  SIGSYS         12,-,12      C      Bad argument to routine (SVID)
+  SIGTRAP           5         C      Trace/breakpoint trap
+  SIGURG         16,23,21     B      Urgent condition on socket (4.2 BSD)
+  SIGVTALRM      26,26,28     A      Virtual alarm clock (4.2 BSD)
+  SIGXCPU        24,24,30     C      CPU time limit exceeded (4.2 BSD)
+  SIGXFSZ        25,25,31     C      File size limit exceeded (4.2 BSD)
+  SIGIOT            6         C      IOT trap. A synonym for SIGABRT
+  SIGEMT          7,-,7
+  SIGSTKFLT       -,16,-      A      Stack fault on coprocessor
+  SIGIO          23,29,22     A      I/O now possible (4.2 BSD)
+  SIGCLD          -,-,18             A synonym for SIGCHLD
+  SIGPWR         29,30,19     A      Power failure (System V)
+  SIGINFO         29,-,-             A synonym for SIGPWR
+  SIGLOST         -,-,-       A      File lock lost
+  SIGWINCH       28,28,20     B      Window resize signal (4.3 BSD, Sun)
+  SIGUNUSED       -,31,-      A      Unused signal (will be SIGSYS)
+*/
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/SockScan.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/SockScan.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/SockScan.c	(revision 21753)
@@ -0,0 +1,54 @@
+# include "imregister.h"
+# include "imreg.h"
+# include <errno.h>
+# define MAXTIME 10
+
+int SockScan (char *string, Fifo *fifo, int sock) {
+  
+  int i, done, status;
+
+  done = 0;
+  for (i = 0; (i < MAXTIME) && !done; i++) {
+    ShiftFifo (fifo);
+    status = ReadtoFifo (fifo, sock);
+    switch (status) {
+    case 0:
+      break;
+    case -1:
+      usleep (1000);
+      break;
+    default:
+      done = memstr (fifo[0].buffer, string, fifo[0].Nbuffer);
+      break;
+    }
+  }
+  return (status);
+}
+
+/* returns (offset to m2) + 1, or 0 if failure */ 
+int memstr (char *m1, char *m2, int n) {
+
+  int i, N;
+
+  N = strlen (m2);
+  for (i = 0; (i < n - N + 1) && memcmp (m1, m2, N); i++, m1++);
+  if (memcmp (m1, m2, N)) {
+    return (0);
+  }
+  else {
+    return (i+1);
+  }
+
+}
+ 
+/* SockScan reads from the given socket looking for the given string
+   SockScan stores data read from socket in the fifo buffer to ensure 
+   it catches the given string.  a single invocation of SockScan will 
+   wait for up to 10 msec for data to come down the pipe before giving up.
+   SockScan can only search for one string in the output stream.
+   */
+
+
+/* need a way of signalling that the socket has closed...
+   maybe change the sock entry to 0?
+*/
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/args.imregister.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/args.imregister.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/args.imregister.c	(revision 21753)
@@ -0,0 +1,109 @@
+# include "imregister.h"
+# include "imreg.h"
+
+int args (int argc, char **argv) {
+
+  int N;
+
+  ConfigInit (&argc, argv); /* load elixir config data */
+  ConfigCamera ();          /* load camera information */
+  ConfigFilter ();          /* load filter information */
+
+  SingleIsSplit = FALSE;
+  if ((N = get_argument (argc, argv, "-split"))) {
+    remove_argument (N, &argc, argv);
+    SingleIsSplit = TRUE;
+  }
+
+  NoReg = FALSE;
+  if ((N = get_argument (argc, argv, "-noreg"))) {
+    remove_argument (N, &argc, argv);
+    NoReg = TRUE;
+  }
+
+  output.verbose = FALSE;
+  if ((N = get_argument (argc, argv, "-v"))) {
+    remove_argument (N, &argc, argv);
+    output.verbose = TRUE;
+  }
+
+  NeedType = FALSE;
+  if ((N = get_argument (argc, argv, "-needtype"))) {
+    remove_argument (N, &argc, argv);
+    NeedType = TRUE;
+  }
+
+  /* all imregister programs are implicitly modifying the db */
+  output.modify = TRUE;
+  IMSORT = FALSE;
+
+  if (strstr (argv[0], "imregister") != (char *) NULL) {
+    if (argc != 2) {
+      fprintf (stderr, "ERROR: Usage: imregister (filename) [-split] [-noreg]\n");
+      exit (1);
+    }
+    return (TRUE);
+  }
+  if (strstr (argv[0], "showiminfo") != (char *) NULL) {
+    if (argc != 2) {
+      fprintf (stderr, "ERROR: Usage: showiminfo (filename) [-split] [-noreg]\n");
+      exit (1);
+    }
+    return (TRUE);
+  }
+  if (strstr (argv[0], "imsort") != (char *) NULL) {
+    if (argc != 2) {
+      fprintf (stderr, "ERROR: Usage: imsort filename(s) [-split] [-noreg]\n");
+      exit (1);
+    }
+    IMSORT = TRUE;
+    return (TRUE);
+  }
+  if (strstr (argv[0], "imstatreg") != (char *) NULL) {
+
+    char *path, *file;
+
+    CLIENT = TRUE;
+
+    /* set up name to lockfile */
+    path = pathname (ImageDB);
+    file = filebasename (ImageDB);
+    ALLOCATE (PIDFILE, char, strlen (path) + strlen (file) + 10);
+    sprintf (PIDFILE, "%s/.%s.pid", path, file);
+
+    /* create db.log and db.bfr */
+    sprintf (TempDB, "%s.bfr", ImageDB);
+    sprintf (LogFile, "%s.log", ImageDB);
+    
+    /* check for daemon mode */
+    if ((N = get_argument (argc, argv, "-daemon"))) {
+      remove_argument (N, &argc, argv);
+      CLIENT = FALSE;
+
+      /* special daemon options */
+      if (get_argument (argc, argv, "-kill"))   KillProcess (PIDFILE);
+      if (get_argument (argc, argv, "-status")) StatusProcess (PIDFILE);
+
+      LOOP_DELAY = 60;
+      if ((N = get_argument (argc, argv, "-delay"))) {
+	remove_argument (N, &argc, argv);
+	LOOP_DELAY = atof(argv[N]);
+	remove_argument (N, &argc, argv);
+      }	
+
+      if (argc != 1) {
+	fprintf (stderr, "ERROR: Usage: imstatreg -daemon [-delay N] [-status] [-kill]\n");
+	exit (1);
+      }
+      return (TRUE);
+    }
+
+    if (argc != 4) {
+      fprintf (stderr, "ERROR: Usage: imstatreg (fits) (stats) (sdat) [-split] [-noreg]\n");
+      fprintf (stderr, "       or:    imstatreg -daemon\n");
+      exit (1);
+    }
+    return (TRUE);
+  }
+  return (FALSE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/args.imsearch.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/args.imsearch.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/args.imsearch.c	(revision 21753)
@@ -0,0 +1,294 @@
+# include "imregister.h" 
+# include "imreg.h"
+
+/* criteria struct is global */
+int args (int argc, char **argv) {
+
+  double dt;
+  int N, i;
+
+  ConfigInit (&argc, argv); /* load elixir config data */
+  ConfigCamera ();          /* load camera information */
+  ConfigFilter ();          /* load filter information */
+
+  /* set timezone (set static in misc.c) */
+  if ((N = get_argument (argc, argv, "-tz"))) {
+    remove_argument (N, &argc, argv);
+    dt = atof (argv[N]);
+    set_timezone (dt);
+    remove_argument (N, &argc, argv);
+  }
+
+  /* define time range */
+  criteria.Ntimes = 0;
+  if (!get_trange_arguments (&argc, argv, &criteria.tstart, &criteria.tstop, &criteria.Ntimes)) {
+    fprintf (stderr, "ERROR: syntax error\n");
+    exit (1);
+  }
+
+  /* image type (dark, flat, bias, etc) */
+  criteria.TypeSelect = FALSE;
+  criteria.Type = T_UNDEF;
+  if ((N = get_argument (argc, argv, "-type"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Type = get_image_type (argv[N]);
+    if (criteria.Type == T_UNDEF) {
+      fprintf (stderr, "ERROR: invalid image type %s\n", argv[N]);
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    criteria.TypeSelect = TRUE;
+  }
+ 
+  /* image mode (split, mef, single) */
+  criteria.ModeSelect = FALSE;
+  criteria.Mode = M_UNDEF;
+  if ((N = get_argument (argc, argv, "-mode"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Mode = get_image_mode (argv[N]);
+    if (criteria.Mode == M_UNDEF) {
+      fprintf (stderr, "ERROR: invalid image mode %s\n", argv[N]);
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    criteria.ModeSelect = TRUE;
+  }
+
+  /* exposure time */
+  criteria.ExptimeSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-etime"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Exptime = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.ExptimeSelect = TRUE;
+  }
+ 
+  /* ccd number */
+  criteria.CCDSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-ccd"))) {
+    remove_argument (N, &argc, argv);
+    criteria.CCD = -1;
+    for (i = 0; (i < Nccd) && (criteria.CCD == -1); i++) {
+      if (strnumcmp (ccds[i], argv[N])) {
+	criteria.CCD = i;
+      }
+    }
+    if (criteria.CCD == -1) {
+      fprintf (stderr, "ERROR: ccd %s choice not found in camera config\n", argv[N]);
+      exit (1);
+    }
+
+    remove_argument (N, &argc, argv);
+    criteria.CCDSelect = TRUE;
+  }
+  /* select CCD seq number */
+  if ((N = get_argument (argc, argv, "-ccdn"))) {
+    remove_argument (N, &argc, argv);
+    criteria.CCD = atoi (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.CCDSelect = TRUE;
+  }
+ 
+  /* filter name */
+  criteria.FilterSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-filter"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Filter = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.FilterSelect = TRUE;
+    if (!strcasecmp (criteria.Filter, "X")) {
+      criteria.FilterSelect = FALSE;
+    }
+  }
+
+  /* string in image name */
+  criteria.NameSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-name"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Name = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.NameSelect = TRUE;
+  }
+
+  /* processed state */
+  criteria.ProcSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-proc"))) {
+    criteria.ProcSelect = TRUE;
+    remove_argument (N, &argc, argv);
+
+    criteria.Proc = -1;
+    if (!strcasecmp (argv[N], "t")) criteria.Proc = TRUE;
+    if (!strcasecmp (argv[N], "f")) criteria.Proc = FALSE;
+    remove_argument (N, &argc, argv);
+    if (criteria.Proc == -1) {
+      fprintf (stderr, "ERROR: -proc (t/f)\n");
+      exit (1);
+    }
+  }
+
+  criteria.DistSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-dist"))) {
+    criteria.DistSelect = TRUE;
+    remove_argument (N, &argc, argv);
+
+    criteria.Dist = -1;
+    if (!strcasecmp (argv[N], "t")) criteria.Dist = TRUE;
+    if (!strcasecmp (argv[N], "f")) criteria.Dist = FALSE;
+    remove_argument (N, &argc, argv);
+    if (criteria.Dist == -1) {
+      fprintf (stderr, "ERROR: -dist (t/f)\n");
+      exit (1);
+    }
+  }
+
+  /*** command-line options which modify the output list */
+  if ((N = get_argument (argc, argv, "-treg"))) {
+    remove_argument (N, &argc, argv);
+    SetOutputMode ("RegTimeMode");
+  }
+  if ((N = get_argument (argc, argv, "-seq"))) {
+    remove_argument (N, &argc, argv);
+    SetOutputMode ("CCDSeq");
+  }
+  if ((N = get_argument (argc, argv, "-pt"))) {
+    remove_argument (N, &argc, argv);
+    SetOutputMode ("PTstyle");
+  }
+  output.table = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-table"))) {
+    remove_argument (N, &argc, argv);
+    output.table = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  output.cadctable = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-cadctable"))) {
+    remove_argument (N, &argc, argv);
+    output.cadctable = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  output.bintable = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-bintable"))) {
+    remove_argument (N, &argc, argv);
+    output.bintable = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  /*** command-line options which modify behavior (delete, modify, newpath, mef2split split2mef */
+  output.delete = FALSE;
+  output.modify = FALSE;
+  output.modify_path = FALSE; 
+  output.modify_dist = FALSE;
+  output.mef2split = FALSE; 
+  output.split2mef = FALSE;
+  output.unique = FALSE;
+
+  if ((N = get_argument (argc, argv, "-delete"))) {
+    remove_argument (N, &argc, argv);
+    output.delete = TRUE;
+  }
+
+  if ((N = get_argument (argc, argv, "-unique"))) {
+    remove_argument (N, &argc, argv);
+    output.unique = TRUE;
+  }
+
+  if ((N = get_argument (argc, argv, "-modify"))) {
+    if (output.delete) { 
+      fprintf (stderr, "can't specify more than one modifier at a time\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    output.modify = TRUE;
+    
+    /* modify part of the path */
+    if (!strcasecmp (argv[N], "path")) {
+      output.modify_path = TRUE;
+      remove_argument (N, &argc, argv);
+      output.oldpath = strcreate (argv[N]);
+      remove_argument (N, &argc, argv);
+      output.newpath = strcreate (argv[N]);
+      remove_argument (N, &argc, argv);
+      goto valid_modify;
+    }
+
+    /* modify the image mode (MEF <-> SPLIT) */
+    if (!strcasecmp (argv[N], "mode")) {
+      remove_argument (N, &argc, argv);
+      if (!strcasecmp (argv[N], "mef")) {
+	output.mef2split = TRUE;
+	remove_argument (N, &argc, argv);
+	goto valid_modify;
+      }
+      if (!strcasecmp (argv[N], "split")) {
+	output.split2mef = TRUE;
+	remove_argument (N, &argc, argv);
+	goto valid_modify;
+      }
+    }
+
+    /* modify distributed status */
+    if (!strcasecmp (argv[N], "dist")) {
+      output.modify_dist = TRUE;
+      remove_argument (N, &argc, argv);
+      if (!strcasecmp (argv[N], "t")) {
+	output.dist = TRUE;
+	remove_argument (N, &argc, argv);
+	goto valid_modify;
+      }
+      if (!strcasecmp (argv[N], "f")) {
+	output.dist = FALSE;
+	remove_argument (N, &argc, argv);
+	goto valid_modify;
+      }
+    }
+
+    /* modify the type */
+    if (!strcasecmp (argv[N], "type")) {
+      output.modify_type = TRUE;
+      remove_argument (N, &argc, argv);
+      output.type = get_image_type (argv[N]);
+      if (output.type == T_UNDEF) {
+	fprintf (stderr, "ERROR: invalid image type %s\n", argv[N]);
+	exit (1);
+      }
+      remove_argument (N, &argc, argv);
+      goto valid_modify;
+    }
+
+    /* modify the filter */
+    if (!strcasecmp (argv[N], "filter")) {
+      output.modify_filter = TRUE;
+      remove_argument (N, &argc, argv);
+      output.filter = strcreate (argv[N]);
+      remove_argument (N, &argc, argv);
+      goto valid_modify;
+    }
+
+    if (!strcasecmp (argv[N], "help")) {
+      fprintf (stderr, "-modify option: \n");
+      fprintf (stderr, "  -modify path (oldpath) (newpath)\n"); 
+      fprintf (stderr, "  -modify mode (mef | split)\n"); 
+      fprintf (stderr, "  -modify dist (t | f)\n"); 
+      fprintf (stderr, "  -modify type (flat, etc)\n"); 
+      fprintf (stderr, "  -modify filter (name)\n\n"); 
+      fprintf (stderr, "  mode mef : convert mef to split\n");
+      fprintf (stderr, "  mode split : convert split to mef\n");
+      exit (2);
+    }
+
+    fprintf (stderr, "invalid -modify option, try -modify help\n");
+    exit (1);
+  }
+ valid_modify:
+
+  if (argc != 1) {
+    fprintf (stderr, "USAGE: imsearch [config ops] \n");
+    fprintf (stderr, "  [-type type] [-mode mode] [-trange start range] [-ccd N]\n");
+    fprintf (stderr, "  [-etime exptime] [-filter name] [-name string] [-proc t/f]\n");
+    fprintf (stderr, "  [-treg] [-seq] [-pt] [-table] [-cadctable] [-bintable]\n");
+    fprintf (stderr, "  [-delete] [-modify (options)]\n");
+    exit (1);
+  }
+
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/cadc.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/cadc.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/cadc.c	(revision 21753)
@@ -0,0 +1,303 @@
+# include "imregister.h"
+# include "imreg.h"
+
+static int REFCCD;
+
+void DumpCADCTable (char *filename, RegImage *image, int *match, int Nmatch) {
+  
+  int i, Obsid, Nobsid, Nsubset, ref;
+  char *datestr, *line, hdrname[99];
+  unsigned long tsecond;
+  Header header, theader;
+  Matrix matrix;
+  FTable table;
+  RegImage *row;
+  int *index, *entry, *obsid;
+  MosaicLayout *layout;
+  int *subset;
+  double left, right, center, outer, top, bottom;
+  double iqx, iqy, iqr, iqf, iqo;
+
+  /* set REFCCD for use in GetREFIQ */
+  REFCCD = MatchCCDName (SeeingREFCCD);
+  if (REFCCD == -1) { 
+    fprintf (stderr, "ERROR: can't get reference ccd\n");
+    exit (1);
+  }
+
+  /* assign relevant mosaic layout structure */
+  layout = (MosaicLayout *) NULL;
+  if (!strcasecmp (Camera, "CFH12K"))  layout = CreateCFH12K ();
+  if (!strcasecmp (Camera, "MegaCam")) layout = CreateMegaCam ();
+  if (!strcasecmp (Camera, "MegaNorth")) layout = CreateMegaCam ();
+  if (layout == (MosaicLayout *) NULL) {
+    fprintf (stderr, "ERROR: invalid camera for CADC Table\n");
+    exit (1);
+  }
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+  
+  /* create table header */
+  fits_create_table_header (&theader, "TABLE", "CADC_RAW_IMAGES");
+      
+  /* add current date/time to header */
+  str_to_time ("now", &tsecond);
+  datestr = sec_to_date (tsecond);
+  fits_modify (&header,  "DATE", "%s", 1, datestr);
+  fits_modify (&theader, "DATE", "%s", 1, datestr);
+
+  /* define table layout */
+  fits_define_table_column (&theader, "A99",   "FILENAME",       "filename in db",                  "");
+  fits_define_table_column (&theader, "A99",   "HDR_FILENAME",   "image header filename",           "");
+  fits_define_table_column (&theader, "I10",   "OBSID",          "image ID number",                 "");
+  fits_define_table_column (&theader, "F5.2",  "OBS_IQ_REFCCD",  "image quality on reference chip", "arcsec");
+  fits_define_table_column (&theader, "F5.2",  "OBS_IQ_CENTER",  "image quality center region",     "arcsec");
+  fits_define_table_column (&theader, "F5.2",  "OBS_IQ_R_RATIO", "IQ ratio (outer / center)",       "");
+  fits_define_table_column (&theader, "F5.2",  "OBS_IQ_X_RATIO", "IQ ratio (left / right)",         "");
+  fits_define_table_column (&theader, "F5.2",  "OBS_IQ_Y_RATIO", "IQ ratio (top / bottom)",         "");
+  fits_define_table_column (&theader, "F9.3",  "OBS_BG_VAL",     "background level",                "counts / pixel");
+
+  /* define TNULL, TNVAL values */
+  fits_modify (&theader, "TNULL1",  "%s", 1, "NULL");  /* FILENAME       */
+  fits_modify (&theader, "TNULL2",  "%s", 1, "NULL");  /* HDR_FILENAME   */
+  fits_modify (&theader, "TNULL3",  "%s", 1, "0");     /* OBSID          */
+  fits_modify (&theader, "TNULL4",  "%s", 1, "0.00");  /* OBS_IQ_REFCCD  */
+  fits_modify (&theader, "TNULL5",  "%s", 1, "0.00");  /* OBS_IQ_CENTER  */
+  fits_modify (&theader, "TNULL6",  "%s", 1, "0.00");  /* OBS_IQ_R_RATIO */
+  fits_modify (&theader, "TNULL7",  "%s", 1, "0.00");  /* OBS_IQ_X_RATIO */
+  fits_modify (&theader, "TNULL8",  "%s", 1, "0.00");  /* OBS_IQ_Y_RATIO */
+  fits_modify (&theader, "TNULL9",  "%s", 1, "0.00");  /* OBS_BG_VAL     */
+
+  fits_modify (&theader, "TNVAL1",  "%s", 1, "NA");    /* FILENAME     */
+  fits_modify (&theader, "TNVAL2",  "%s", 1, "NA");    /* HDR_FILENAME */
+  fits_modify (&theader, "TNVAL3",  "%s", 1, "-1");    /* OBSID        */
+  fits_modify (&theader, "TNVAL4",  "%s", 1, "-1.00"); /* OBS_IQ_REFCCD  */
+  fits_modify (&theader, "TNVAL5",  "%s", 1, "-1.00"); /* OBS_IQ_CENTER  */
+  fits_modify (&theader, "TNVAL6",  "%s", 1, "-1.00"); /* OBS_IQ_R_RATIO */
+  fits_modify (&theader, "TNVAL7",  "%s", 1, "-1.00"); /* OBS_IQ_X_RATIO */
+  fits_modify (&theader, "TNVAL8",  "%s", 1, "-1.00"); /* OBS_IQ_Y_RATIO */
+  fits_modify (&theader, "TNVAL9",  "%s", 1, "-1.00"); /* OBS_BG_VAL   */
+
+  /* create table, add data values */
+  fits_create_table (&theader, &table);
+  
+  /* prepare indicies to handle table data */
+  GetObsIDIndex (image, match, Nmatch, &index, &entry);
+  obsid = GetUniqueObsID (image, index, entry, Nmatch, &Nobsid);
+
+  for (i = 0; i < Nobsid; i++) {
+    ref = GetREFCCD (image, index, entry, Nmatch, obsid[i]);
+    row = &image[ref];
+    Obsid = index[obsid[i]];
+    sprintf (hdrname, "%s.hdr", row[0].filename);
+
+    subset = GetObsIDSubset (image, obsid[i], index, entry, Nmatch, &Nsubset);
+    center = MosaicIQStats (image, subset, Nsubset, &layout[0].center);
+    outer  = MosaicIQStats (image, subset, Nsubset, &layout[0].outer );
+    top    = MosaicIQStats (image, subset, Nsubset, &layout[0].top   );
+    bottom = MosaicIQStats (image, subset, Nsubset, &layout[0].bottom);
+    left   = MosaicIQStats (image, subset, Nsubset, &layout[0].left  );
+    right  = MosaicIQStats (image, subset, Nsubset, &layout[0].right );
+    free (subset);
+
+    iqx = (left   == 0) ? 0 : (right / left);
+    iqy = (bottom == 0) ? 0 : (top / bottom);
+    iqr = (center == 0) ? 0 : (outer / center);
+    iqf = center * ARCSEC_PIXEL;
+    iqo = row[0].fwhm*ARCSEC_PIXEL;
+    line = fits_table_print (&table, row[0].filename, hdrname, Obsid, iqo, iqf, iqr, iqx, iqy, row[0].sky);
+
+    fits_add_rows (&table, line, 1, strlen(line));
+    free (line);
+  }
+  free (obsid);
+  free (index);
+  free (entry);
+
+  fits_write_header  (filename, &header);
+  fits_write_matrix  (filename, &matrix);
+  fits_write_Theader (filename, &theader);
+  fits_write_table   (filename, &table);
+  exit (0);
+}
+
+int *GetObsIDSubset (RegImage *image, int start, int *index, int *entry, int Nindex, int *Nsubset) {
+
+  int i, N, NSUBSET;
+  int *subset;
+
+  /* create output index */
+  N = 0;
+  NSUBSET = 64;
+  ALLOCATE (subset, int, NSUBSET);
+
+  /* find unique sequences */
+  for (i = start; (i < Nindex) && (index[i] == index[start]); i++) {
+    subset[N] = entry[i];
+    N++;
+    if (N == NSUBSET) {
+      NSUBSET += 64;
+      REALLOCATE (subset, int, NSUBSET);
+    }
+  }
+
+  *Nsubset = N;
+  return (subset);
+}
+
+/* return an index list of unique obs id entries at start of sequence */
+int *GetUniqueObsID (RegImage *image, int *index, int *entry, int Nindex, int *Nmatch) {
+  
+  int i, j, N, NMATCH;
+  int *match;
+
+  /* create output index */
+  N = 0;
+  NMATCH = 1000;
+  ALLOCATE (match, int, NMATCH);
+
+  /* find unique sequences */
+  for (i = 0; i < Nindex; ) {
+    for (j = i + 1; (j < Nindex) && (index[i] == index[j]); j++);
+
+    /* add unique entry to output list */
+    match[N] = i;
+    N ++;
+    if (N == NMATCH) {
+      NMATCH += 1000;
+      REALLOCATE (match, int, NMATCH);
+    }
+
+    /* j always points to the next entry */
+    i = j;
+  }
+  *Nmatch = N;
+  return (match);
+}
+
+/* return seeing for ccd == REFCCD */
+int GetREFCCD (RegImage *image, int *index, int *entry, int Nindex, int start) {
+  
+  int i, N, NMATCH;
+  int *match;
+
+  /* create output index */
+  N = 0;
+  NMATCH = 1000;
+  ALLOCATE (match, int, NMATCH);
+
+  /* find unique sequences */
+  for (i = start; (i < Nindex) && (index[i] == index[start]); i++) {
+    if (image[entry[i]].ccd == REFCCD) return (entry[i]);
+  }
+  return (start);
+}
+
+void GetObsIDIndex (RegImage *image, int *match, int Nmatch, int **Index, int **Entry) {
+
+  int i;
+  int *index, *entry;
+
+  /* index = OBSID */
+  ALLOCATE (index, int, Nmatch);
+  ALLOCATE (entry, int, Nmatch);
+  for (i = 0; i < Nmatch; i++) {
+    index[i] = atoi (image[match[i]].filename);
+    if (index[i] < 400000) fprintf (stderr, "warning: derived obsid < 400000\n");
+    entry[i] = match[i];
+  }
+  sortpair (index, entry, Nmatch);
+  *Index = index;
+  *Entry = entry;
+}
+
+/* match is a list of image entries with the same obsid */
+double MosaicIQStats (RegImage *image, int *match, int Nmatch, MosaicRegion *region) {
+
+  int i, j, N, Nccd;
+  double *list, value;
+
+  Nccd = region[0].Nccd;
+  ALLOCATE (list, double, Nccd);
+
+  N = 0;
+  for (i = 0; i < Nccd; i++) {
+    for (j = 0; j < Nmatch; j++) {
+      if (image[match[j]].ccd == region[0].ccd[i]) {
+	list[N] = image[match[j]].fwhm;
+	N++;
+	break;
+      }
+    }
+  }
+
+  value = SigmaClipList (list, N);
+  free (list);
+  return (value);
+}
+
+double SigmaClipList (double *list, int N) {
+
+  int i, n;
+  double median, sigma3, m1, m2;
+
+  if (N == 0) return (0.0);
+  if (N == 1) return (list[0]);
+  
+  dsort (list, N);
+  median = list[(int)(0.5*N)];
+  
+  m1 = m2 = 0;
+  for (i = 0; i < N; i++) { m1 += list[i]; m2 += SQ(list[i]); }
+  sigma3 = 3*sqrt (m2/N - m1*m1/N/N);
+  
+  m1 = n = 0;
+  for (i = 0; i < N; i++) { 
+    if (abs(list[i] - median) > sigma3) continue;
+    m1 += list[i];
+    n ++;
+  }
+
+  m2 = m1 / n;
+  return (m2);
+}
+  
+
+/* the CADC table is special: we need to report specfic IQ stats 
+   which represent the variations in focus across the mosaic. 
+   this representation is explicitly dependent on the mosaic,
+   and does not make sense for other camera types 
+   CADC table option cannot be combined with CCD filtering options
+   CADC table forces -unique, needed to make calculation
+*/
+
+/* derived CADC parameters:
+   OBS_IQ_CENTER - sigma-clip mean value of center region
+   OBS_IQ_X      - ratio of left to right regions
+   OBS_IQ_Y      - ratio of top to bottom regions
+   OBS_IQ_R      - ratio of center to edge regions
+*/
+
+/* cfh12k:
+
+   00 01 02 03 04 05
+   06 07 08 09 10 11
+
+   center: 02,03,08,09
+   outer:  00,01,04,05,06,07,10,11
+   top;    00-05
+   bottom: 06-11
+   right:  00,01,02,06,07,08
+   left:   03,04,05,09,10,11
+
+   for each region, calculate median, sigma, reject >3sigma, calculate mean
+*/
+
+/* we are guaranteed a unique set of filename / ccd values */
+/* index = OBSID = atoi (filename) */
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/delete.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/delete.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/delete.c	(revision 21753)
@@ -0,0 +1,51 @@
+# include "imregister.h"
+# include "imreg.h"
+
+void DeleteSubset (FITS_DB *db, RegImage *image, int Nimage, int *match, int Nmatch) {
+
+  int i, j;
+  int *keep, Ndel, Nsubset;
+  RegImage *subset;
+
+  ALLOCATE (keep, int, MAX (Nimage, 1));
+  for (i = 0; i < Nimage; i++) keep[i] = TRUE;
+  fprintf (stderr, "total of %d images\n", Nimage);
+
+  Ndel = 0;
+  for (i = 0; i < Nmatch; i++) {
+    j = match[i];
+    if (j == -1) continue;
+    keep[j] = FALSE;
+    Ndel ++;
+  }
+  fprintf (stderr, "delete %d images\n", Ndel);
+  if (Ndel == 0) { 
+    fprintf (stderr, "SUCCESS\n");
+    fits_db_close (db);
+    exit (0);
+  }
+
+  /* create new data list */
+  Nsubset = Nimage - Ndel;
+  ALLOCATE (subset, RegImage, MAX (1, Nsubset));
+  fprintf (stderr, "keeping %d images\n", Nsubset);
+  for (j = i = 0; i < Nimage; i++) {
+    if (!keep[i]) continue;
+    subset[j] = image[i];
+    j++;
+  }
+
+  free (keep);
+  free (image);
+
+  /** we may later want to pull this out and put it elsewhere **/
+  /** free db[0].theader, db[0].table.buffer? **/
+  fits_table_set_RegImage (&db[0].ftable, subset, Nsubset);
+  fits_db_save (db);
+  fits_db_close (db);
+  fits_db_free (db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/iminfo.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/iminfo.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/iminfo.c	(revision 21753)
@@ -0,0 +1,165 @@
+# include "imregister.h"
+# include "imreg.h"
+
+char *getcwd_cfht ();
+
+RegImage *iminfo (char *filename) {
+
+  RegImage *image;
+  Header header;
+  int extend;
+  int Naxes, Nextend, Nseq;
+  char Imagetype[80], line[80];
+  struct timeval now;
+  char *name, *cwd, *tempname;
+  double tmp;
+
+  ALLOCATE (image, RegImage, 1);
+  bzero (image, sizeof (RegImage));
+
+  /* load in FITS header from image */
+  if (!fits_read_header (filename, &header)) {
+    fprintf (stderr, "ERROR: can't find image file %s\n", filename);
+    exit (1);
+  }
+
+  /* find the important header keyword values */
+  image[0].obstime = parse_time (&header);
+
+  gettimeofday (&now, (void *) NULL);
+  image[0].regtime = now.tv_sec;
+
+  image[0].sky = image[0].fwhm = image[0].bias = 0;
+  
+  /* default for a single CCD frame */
+  Naxes = 2; 
+  extend = FALSE;
+  image[0].mode     = M_SINGLE;
+  image[0].flag     = 0;
+  image[0].ccd      = 0;
+  image[0].seq      = 0;
+  image[0].seqtime  = 0;
+
+  /* determine data layout (SINGLE, SPLIT, MEF, CUBE, SLICE) */
+  fits_scan (&header, "EXTEND",  "%t", 1, &extend);
+  fits_scan (&header, "NAXIS",  "%d", 1, &Naxes);
+  if (extend) { /* MEF file */
+    fits_scan (&header, "NEXTEND",  "%d", 1, &Nextend);
+    image[0].mode = M_MEF;
+    image[0].ccd  = Nextend;
+  } 
+  /* need to distinguish MEF, CUBE, and MEF-CUBE */
+  if (Naxes == 3) { /* data cube */
+    fits_scan (&header, "NAXIS3",  "%d", 1, &Nseq);
+    if (image[0].mode == M_MEF) {
+      fprintf (stderr, "MEF-CUBE not ready\n");
+      exit (1);
+    }
+    image[0].mode = M_CUBE;
+    image[0].seq  = Nseq;
+    /* abstract this name somewhere ? */
+    fits_scan (&header, "SEQTIME", "%f", 1, &image[0].seqtime);
+  }
+  if (SingleIsSplit && (image[0].mode == M_SINGLE)) {
+    image[0].mode = M_SPLIT;
+    image[0].ccd  = MatchCCDNameHeader (&header);
+  }
+  /* is there a better way to id a 'split' image? */
+
+  /* extract other relevant data from header */
+  fits_scan (&header, ImagetypeKeyword,  "%s", 1, &Imagetype);
+
+  /* grab the image type : if not defined, set to 'none' */
+  image[0].type = get_image_type (Imagetype);
+  if (NeedType && (image[0].type == T_UNDEF)) {
+    fprintf (stderr, "ERROR: skipping unknown image type\n");
+    exit (1);
+  } else {
+    image[0].type = T_NONE;
+  }
+
+  /* grab interesting info from header */
+  fits_scan (&header, ExptimeKeyword,    "%f", 1, &image[0].exptime);
+  fits_scan (&header, AirmassKeyword,    "%f", 1, &image[0].airmass);
+  fits_scan (&header, FocusKeyword,      "%f", 1, &image[0].telfocus);
+  fits_scan (&header, Teldata1Keyword,   "%f", 1, &image[0].xprobe);
+  fits_scan (&header, Teldata2Keyword,   "%f", 1, &image[0].yprobe);
+  fits_scan (&header, Teldata3Keyword,   "%f", 1, &image[0].zprobe);
+  fits_scan (&header, DettempKeyword,    "%f", 1, &image[0].dettemp);
+  fits_scan (&header, RotationKeyword,   "%f", 1, &image[0].rotangle);
+
+  /* force strings to fit in available space (32 bytes) */
+  fits_scan (&header, CameraKeyword,     "%s", 1, line);
+  strncpy (image[0].instrument, line, 31);
+  image[0].instrument[31] = 0;
+
+  fits_scan (&header, FilterKeyword, "%s", 1, line);
+  MatchFilterList (line);
+  strncpy (image[0].filter, line, 31);
+  image[0].filter[31] = 0;
+
+  /* header has RA & DEC in decimal degrees */
+  if (RADecDegKeyword[0] & DECDecDegKeyword[0]) {
+    fits_scan (&header, RADecDegKeyword,  "%f", 1, &image[0].ra);
+    fits_scan (&header, DECDecDegKeyword, "%f", 1, &image[0].dec);
+  } else {
+    if (RASexigKeyword[0] & DECSexigKeyword[0]) {
+      fits_scan (&header, RASexigKeyword,  "%s", 1, line);
+      dms_to_ddd (&tmp, line);
+      image[0].ra = 15*tmp;
+      fits_scan (&header, DECSexigKeyword, "%s", 1, &line);
+      dms_to_ddd (&tmp, line);
+      image[0].dec = tmp;
+    }
+  }
+
+  /* this segment is strongly CFHT dependent.  also it is somewhat
+     poor: the file must have the probes in the right order.
+     load_probes checks the data validity, but has no gurantee that
+     the right range has been loaded */
+
+  /* to change the selected probes, change:
+     1) the probes[] entries below
+     2) the entries in the program 'gettemps' */
+
+  /* the probes have to agree with the entries in the program 'gettemps' */
+  {
+    double pvalues[4];
+    static int probes[] = {2, 36, 43, 45};
+    if (load_probes (TempLogFile, image[0].obstime, probes, pvalues, 4)) {
+	image[0].teltemp_0 = pvalues[0];
+	image[0].teltemp_1 = pvalues[1];
+	image[0].teltemp_2 = pvalues[2];
+	image[0].teltemp_3 = pvalues[3];
+    } else {
+      fprintf (stderr, "failure to get probe data\n");
+      image[0].teltemp_0 = 200.0;
+      image[0].teltemp_1 = 200.0;
+      image[0].teltemp_2 = 200.0;
+      image[0].teltemp_3 = 200.0;
+    }
+  }
+  /* this should be a call to an external function... */
+  
+  /* extract the file name and the path */
+  name = filebasename (filename);
+  strcpy (image[0].filename, name);
+  name = pathname (filename);
+  if (name[0] != '/') {
+    cwd = getcwd_cfht (NULL, 1024);
+    ALLOCATE (tempname, char, strlen (cwd) + strlen (name) + 2);
+    if (!strcmp (name, ".")) {
+      sprintf (tempname, "%s", cwd);
+    } else {
+      sprintf (tempname, "%s/%s", cwd, name);
+    }      
+    free (name);
+    free (cwd);
+    name = tempname;
+  }    
+  strcpy (image[0].pathname, name);
+
+  return (image);
+
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/imregclient.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/imregclient.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/imregclient.c	(revision 21753)
@@ -0,0 +1,93 @@
+# include "imregister.h"
+# include "imreg.h"
+
+int imregclient (char *fitsfile, char *statfile, char *datfile) {
+
+  int i, Nentry, Nslice, status, tmpint;
+  FILE *f;
+  RegImage *image;
+  FITS_DB db;
+
+  Nentry = 0;
+  image = iminfo (fitsfile);
+  
+  /* if images is MEF or SPLIT/SINGLE, load stats file */
+  /* get stats file (has sky, bias, etc) */
+  switch (image[0].mode) {
+  case M_MEF:
+  case M_SPLIT:
+    f = fopen (statfile, "r");
+    if (f == (FILE *) NULL) {
+      fprintf (stderr, "ERROR: can't open file.stats\n");
+      exit (1);
+    }
+    fscanf (f, "%f %f", &image[0].sky, &image[0].bias);
+    fclose (f);
+    image[0].fwhm = get_fwhm (datfile);
+    Nentry = 1;
+    break;
+  case M_SINGLE:
+    f = fopen (statfile, "r");
+    if (f == (FILE *) NULL) {
+      fprintf (stderr, "ERROR: can't open file.stats\n");
+      exit (1);
+    }
+    status = fscanf (f, "%d %f %f", &tmpint, &image[0].sky, &image[0].fwhm);
+    image[0].ccd = tmpint;
+    fclose (f);
+    Nentry = 1;
+    break;
+  case M_CUBE:
+    f = fopen (statfile, "r");
+    if (f == (FILE *) NULL) {
+      fprintf (stderr, "ERROR: can't open file.stats\n");
+      exit (1);
+    }
+    status = 3;
+    Nslice = image[0].seq;
+    Nentry = Nslice + 1;
+    REALLOCATE (image, RegImage, Nentry);
+    for (i = 0; i < Nentry; i++) {
+      image[i] = image[0];
+      status = fscanf (f, "%d %f %f", &tmpint, &image[i].sky, &image[i].fwhm);
+      image[i].seq = tmpint;
+      if (image[i].seq == Nslice) continue;
+      image[i].obstime += image[0].seqtime*image[i].seq;
+    }
+    fclose (f);
+    Nentry = i;
+    break;
+  }
+  if (NoReg) dump_data (image, Nentry);
+
+  db.lockstate = LCK_HARD;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  if (!fits_db_lock (&db, TempDB)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  if (db.dbstate == LCK_EMPTY) {
+    fits_db_create (&db);
+    fits_table_set_RegImage (&db.ftable, NULL, 0);
+  } else {  
+    if (!fits_db_load (&db)) {
+      fprintf (stderr, "ERROR: failure to load db\n");
+      fits_db_close (&db);
+      exit (1);
+    }
+  }
+
+  fits_convert_RegImage (image, sizeof (RegImage), Nentry);
+  fits_table_to_vtable (&db.ftable, &db.vtable, 0, 0);
+  fits_vadd_rows (&db.vtable, (char *) image, Nentry, sizeof(RegImage));
+
+  fits_db_update (&db);
+  fits_db_close (&db);
+  fits_db_free (&db);
+
+  fprintf (stderr, "SUCCESS: wrote temp image data\n");
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/match.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/match.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/match.c	(revision 21753)
@@ -0,0 +1,78 @@
+# include "imregister.h"
+# include "imreg.h"
+
+int *match_criteria (RegImage *image, int Nimage, int *Nmatch) {
+
+  int i, j, Nname;
+  int N, NMATCH;
+  int *match;
+  int reject;
+
+  /* create selection index */
+  N = 0;
+  NMATCH = 1000;
+  ALLOCATE (match, int, NMATCH);
+
+  Nname = 0;
+  if (criteria.NameSelect) Nname = strlen (criteria.Name);
+  
+  /* find entries that matches criteria */
+  for (i = 0; i < Nimage; i++) {
+    for (j = 0, reject = TRUE; reject && (j < criteria.Ntimes); j++) {
+      reject = (image[i].obstime + image[i].exptime < criteria.tstart[j]) || (image[i].obstime > criteria.tstop[j]);
+    }
+    if (criteria.Ntimes && reject) continue;
+    if (criteria.FilterSelect  && (strcasecmp (image[i].filter, criteria.Filter))) continue;
+    if (criteria.ModeSelect    && (image[i].mode != criteria.Mode)) continue;
+    if (criteria.CCDSelect     && (image[i].ccd != criteria.CCD)) continue;
+    if (criteria.TypeSelect    && (image[i].type != criteria.Type)) continue;
+    if (criteria.ExptimeSelect && (fabs (image[i].exptime - criteria.Exptime) > 5.0)) continue;
+    if (criteria.NameSelect    && (strncasecmp (image[i].filename, criteria.Name, Nname))) continue;
+    if (criteria.ProcSelect    && (criteria.Proc ^ (image[i].bias != 0.0))) continue;
+    if (criteria.DistSelect    && (criteria.Dist ^ (image[i].flag && IMREG_DIST))) continue;
+
+    match[N] = i;
+    N ++;
+    if (N == NMATCH) {
+      NMATCH += 1000;
+      REALLOCATE (match, int, NMATCH);
+    }
+  }
+  *Nmatch = N;
+  return (match);
+}
+
+int *match_images (RegImage *image, int Nimage, RegImage *subset, int Nsubset, int *Nmatch) {
+  
+  int i, j, N, Nfound;
+  int *match;
+
+  /* find matching images - very inefficient : sort by obstime, find those first? */
+  ALLOCATE (match, int, Nsubset);
+  for (j = 0; j < Nsubset; j++) {
+    match[j] = -1;
+    for (i = 0; (match[j] == -1) && (i < Nimage); i++) {
+      if (image[i].obstime > subset[j].obstime + 1) continue;
+      if (image[i].obstime < subset[j].obstime - 1) continue;
+      if (image[i].ccd != subset[j].ccd) continue;
+      match[j] = i;
+    }
+  }
+  
+  Nfound = 0;
+  for (i = 0; i < Nsubset; i++) {
+    /* set the new values for this image */
+    N = match[i];
+    if (N == -1) continue;
+    image[N].fwhm = subset[i].fwhm; 
+    image[N].bias = subset[i].bias; 
+    image[N].sky  = subset[i].sky; 
+    image[N].ra   = subset[i].ra; 
+    image[N].dec  = subset[i].dec; 
+    /* if the image is MEF, these were not correctly assigned by imsort.
+       this step uses the values from the split ccd image */
+    Nfound ++;
+  }
+  *Nmatch = Nfound;
+  return (match);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/modify.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/modify.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/modify.c	(revision 21753)
@@ -0,0 +1,98 @@
+# include "imregister.h"
+# include "imreg.h"
+
+void ModifySubset (FITS_DB *db, RegImage *image, int Nimage, int *match, int Nmatch) {
+
+  int i, j, Nold;
+  char *tmppath;
+  char *ext, *root, *path, dist;
+
+  Nold = 0;
+  tmppath = NULL;
+
+  /* create some necessary variables */
+  if (output.modify_path) { 
+    Nold = strlen (output.oldpath);
+    ALLOCATE (tmppath, char, 128);
+  }
+  if (output.modify_dist) {
+    dist = (output.dist) ? 0xff : ~IMREG_DIST;
+  }
+
+  /* modify the selected entries */
+  for (j = 0; j < Nmatch; j++) {
+
+    i = match[j];
+
+    if (output.modify_path) {
+      if (!strncmp (image[i].pathname, output.oldpath, Nold)) {
+	strcpy (tmppath, &image[i].pathname[Nold]);
+	snprintf (image[i].pathname, 128, "%s%s", output.newpath, tmppath);
+      }
+    }
+
+    if (output.mef2split) {
+      if (image[i].mode == M_MEF) {
+	root = filerootname (image[i].filename);
+	ext = fileextname (image[i].filename);
+	path = strcreate (image[i].pathname);
+
+	snprintf (image[i].pathname, 128, "%s/%s", path, root);
+	snprintf (image[i].filename, 64,  "%s%02d.%s", root, image[i].ccd, ext);
+	image[i].mode = M_SPLIT;
+	free (root);
+	free (ext);
+	free (path);
+      }
+    }
+
+    if (output.split2mef) {
+      if (image[i].mode == M_SPLIT) {
+	ext  = fileextname (image[i].filename);
+	root = filebasename (image[i].pathname);
+	path = pathname (image[i].pathname);
+
+	snprintf (image[i].pathname, 128, "%s", path);
+	snprintf (image[i].filename, 64,  "%s.%s", root, ext);
+	image[i].mode = M_MEF;
+	free (root);
+	free (ext);
+	free (path);
+      }
+    }
+
+    if (output.modify_dist) {
+      if (output.dist)  image[i].flag |=  IMREG_DIST;
+      if (!output.dist) image[i].flag &= ~IMREG_DIST;
+    }
+
+    if (output.modify_filter) {
+      strncpy (image[i].filter, output.filter, 31);
+    }
+
+    if (output.modify_type) {
+      image[i].type = output.type;
+    }
+
+  }
+
+  /** we may later want to pull this out and put it elsewhere **/
+  fits_vtable_from_ftable (&db[0].ftable, &db[0].vtable, match, Nmatch);
+  for (i = 0; i < Nmatch; i++) {
+    fits_convert_RegImage ((RegImage *) db[0].vtable.buffer[i], sizeof (RegImage), 1);
+  }
+  fits_db_update (db);
+  fits_db_close (db);
+  fits_db_free (db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+
+}
+
+
+/* 
+   MEF                      SPLIT
+   /path/filename.fits <--> /path/filename/filenameNN.fits
+*/
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/mosaics.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/mosaics.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/mosaics.c	(revision 21753)
@@ -0,0 +1,163 @@
+# include "imregister.h"
+# include "imreg.h"
+
+MosaicLayout *CreateCFH12K () {
+
+  MosaicLayout *layout;
+
+  ALLOCATE (layout, MosaicLayout, 1);
+
+  layout[0].center.Nccd = 4;
+  ALLOCATE (layout[0].center.ccd, int, layout[0].center.Nccd);
+  layout[0].center.ccd[0] = 2;
+  layout[0].center.ccd[1] = 3;
+  layout[0].center.ccd[2] = 8;
+  layout[0].center.ccd[3] = 9;
+
+  layout[0].outer.Nccd = 8;
+  ALLOCATE (layout[0].outer.ccd, int, layout[0].outer.Nccd);
+  layout[0].outer.ccd[0] = 0;
+  layout[0].outer.ccd[1] = 1;
+  layout[0].outer.ccd[2] = 4;
+  layout[0].outer.ccd[3] = 5;
+  layout[0].outer.ccd[4] = 6;
+  layout[0].outer.ccd[5] = 7;
+  layout[0].outer.ccd[6] = 10;
+  layout[0].outer.ccd[7] = 11;
+
+  layout[0].top.Nccd = 6;
+  ALLOCATE (layout[0].top.ccd, int, layout[0].top.Nccd);
+  layout[0].top.ccd[0] = 0;
+  layout[0].top.ccd[1] = 1;
+  layout[0].top.ccd[2] = 2;
+  layout[0].top.ccd[3] = 3;
+  layout[0].top.ccd[4] = 4;
+  layout[0].top.ccd[5] = 5;
+
+  layout[0].bottom.Nccd = 6;
+  ALLOCATE (layout[0].bottom.ccd, int, layout[0].bottom.Nccd);
+  layout[0].bottom.ccd[0] = 6;
+  layout[0].bottom.ccd[1] = 7;
+  layout[0].bottom.ccd[2] = 8;
+  layout[0].bottom.ccd[3] = 9;
+  layout[0].bottom.ccd[4] = 10;
+  layout[0].bottom.ccd[5] = 11;
+
+  layout[0].left.Nccd = 6;
+  ALLOCATE (layout[0].left.ccd, int, layout[0].left.Nccd);
+  layout[0].left.ccd[0] = 0;
+  layout[0].left.ccd[1] = 1;
+  layout[0].left.ccd[2] = 2;
+  layout[0].left.ccd[3] = 6;
+  layout[0].left.ccd[4] = 7;
+  layout[0].left.ccd[5] = 8;
+
+  layout[0].right.Nccd = 6;
+  ALLOCATE (layout[0].right.ccd, int, layout[0].right.Nccd);
+  layout[0].right.ccd[0] = 3;
+  layout[0].right.ccd[1] = 4;
+  layout[0].right.ccd[2] = 5;
+  layout[0].right.ccd[3] = 9;
+  layout[0].right.ccd[4] = 10;
+  layout[0].right.ccd[5] = 11;
+
+  return (layout);
+}
+
+MosaicLayout *CreateMegaCam () {
+
+  MosaicLayout *layout;
+
+  ALLOCATE (layout, MosaicLayout, 1);
+
+  layout[0].center.Nccd = 10;
+  ALLOCATE (layout[0].center.ccd, int, layout[0].center.Nccd);
+  layout[0].center.ccd[0] = 11;
+  layout[0].center.ccd[1] = 12;
+  layout[0].center.ccd[2] = 13;
+  layout[0].center.ccd[3] = 14;
+  layout[0].center.ccd[4] = 15;
+  layout[0].center.ccd[5] = 20;
+  layout[0].center.ccd[6] = 21;
+  layout[0].center.ccd[7] = 22;
+  layout[0].center.ccd[8] = 23;
+  layout[0].center.ccd[9] = 24;
+
+  layout[0].outer.Nccd = 26;
+  ALLOCATE (layout[0].outer.ccd, int, layout[0].outer.Nccd);
+  layout[0].outer.ccd[0] = 0;
+  layout[0].outer.ccd[1] = 1;
+  layout[0].outer.ccd[2] = 2;
+  layout[0].outer.ccd[3] = 3;
+  layout[0].outer.ccd[4] = 4;
+  layout[0].outer.ccd[5] = 5;
+  layout[0].outer.ccd[6] = 6;
+  layout[0].outer.ccd[7] = 7;
+  layout[0].outer.ccd[8] = 8;
+  layout[0].outer.ccd[9] = 9;
+  layout[0].outer.ccd[10] = 10;
+  layout[0].outer.ccd[11] = 16;
+  layout[0].outer.ccd[12] = 17;
+  layout[0].outer.ccd[13] = 18;
+  layout[0].outer.ccd[14] = 19;
+  layout[0].outer.ccd[15] = 25;
+  layout[0].outer.ccd[16] = 26;
+  layout[0].outer.ccd[17] = 27;
+  layout[0].outer.ccd[18] = 28;
+  layout[0].outer.ccd[19] = 29;
+  layout[0].outer.ccd[20] = 30;
+  layout[0].outer.ccd[21] = 31;
+  layout[0].outer.ccd[22] = 32;
+  layout[0].outer.ccd[23] = 33;
+  layout[0].outer.ccd[24] = 34;
+  layout[0].outer.ccd[25] = 35;
+
+  layout[0].top.Nccd = 9;
+  ALLOCATE (layout[0].top.ccd, int, layout[0].top.Nccd);
+  layout[0].top.ccd[0] = 0;
+  layout[0].top.ccd[1] = 1;
+  layout[0].top.ccd[2] = 2;
+  layout[0].top.ccd[3] = 3;
+  layout[0].top.ccd[4] = 4;
+  layout[0].top.ccd[5] = 5;
+  layout[0].top.ccd[6] = 6;
+  layout[0].top.ccd[7] = 7;
+  layout[0].top.ccd[8] = 8;
+
+  layout[0].bottom.Nccd = 9;
+  ALLOCATE (layout[0].bottom.ccd, int, layout[0].bottom.Nccd);
+  layout[0].bottom.ccd[0] = 27;
+  layout[0].bottom.ccd[1] = 28;
+  layout[0].bottom.ccd[2] = 29;
+  layout[0].bottom.ccd[3] = 30;
+  layout[0].bottom.ccd[4] = 31;
+  layout[0].bottom.ccd[5] = 32;
+  layout[0].bottom.ccd[6] = 33;
+  layout[0].bottom.ccd[7] = 34;
+  layout[0].bottom.ccd[8] = 35;
+
+  layout[0].left.Nccd = 8;
+  ALLOCATE (layout[0].left.ccd, int, layout[0].left.Nccd);
+  layout[0].left.ccd[0] = 0;
+  layout[0].left.ccd[1] = 1;
+  layout[0].left.ccd[2] = 9;
+  layout[0].left.ccd[3] = 10;
+  layout[0].left.ccd[4] = 18;
+  layout[0].left.ccd[5] = 19;
+  layout[0].left.ccd[6] = 27;
+  layout[0].left.ccd[7] = 28;
+
+  layout[0].right.Nccd = 8;
+  ALLOCATE (layout[0].right.ccd, int, layout[0].right.Nccd);
+  layout[0].right.ccd[0] = 7;
+  layout[0].right.ccd[1] = 8;
+  layout[0].right.ccd[2] = 16;
+  layout[0].right.ccd[3] = 17;
+  layout[0].right.ccd[4] = 25;
+  layout[0].right.ccd[5] = 26;
+  layout[0].right.ccd[6] = 34;
+  layout[0].right.ccd[7] = 35;
+
+  return (layout);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/newimages.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/newimages.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/newimages.c	(revision 21753)
@@ -0,0 +1,60 @@
+# include "imregister.h"
+# include "imreg.h"
+
+RegImage *newimages (RegImage *image, int *Nimage) {
+
+  int i, Nnew;
+  RegImage *regimage;
+
+  Nnew = 0;
+  regimage = NULL;
+
+  /* identify new entries based on mode */
+  switch (image[0].mode) {
+  case M_CUBE:
+    Nnew = image[0].seq + 1;
+    ALLOCATE (regimage, RegImage, Nnew);
+    regimage[0] = image[0];
+    for (i = 1; i < Nnew; i++) {
+      regimage[i] = image[0]; 
+      regimage[i].seq = i - 1;
+      regimage[i].mode = M_SLICE;
+      regimage[i].obstime += image[0].seqtime*regimage[i].seq;
+    }
+    break;
+  case M_MEF:
+    Nnew = image[0].ccd;
+    ALLOCATE (regimage, RegImage, Nnew);
+    for (i = 0; i < Nnew; i++) {
+      regimage[i] = image[0]; 
+      regimage[i].ccd = i;
+    }
+    break;
+  case M_SPLIT:
+  case M_SINGLE:
+    Nnew = 1;
+    regimage = &image[0];
+    break;
+  }
+  *Nimage = Nnew;
+  return (regimage);
+}
+
+
+/* meaning of image fields for different data modes:
+
+   mode      ccd                    seq
+   SINGLE    0                      0
+   SPLIT     ccd seq number         0
+   MEF       Nccd                   0
+   CUBE      ccd seq number         Nseq
+   SLICE     ccd seq number         seq number
+   CUBE-MEF  Nccd                   Nseq
+   SLICE-MEF Nccd                   seq number
+
+*/
+
+/*
+ we need to consider modifying this to separately ID MEF/SPLIT/SINGLE and CUBE/SLICE 
+ for the moment, we are keeping this the same as the old style
+*/
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/output.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/output.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/output.c	(revision 21753)
@@ -0,0 +1,251 @@
+# include "imregister.h"
+# include "imreg.h"
+
+static int RegTimeMode = FALSE;
+static int CCDSeq = FALSE;
+static int PTstyle = FALSE;
+
+void SetOutputMode (char *mode) {
+
+  if (!strcmp (mode, "RegTimeMode")) {
+    RegTimeMode = TRUE;
+    return;
+  }
+  if (!strcmp (mode, "CCDSeq")) {
+    CCDSeq = TRUE;
+    return;
+  }
+  if (!strcmp (mode, "PTstyle")) {
+    PTstyle = TRUE;
+    return;
+  }
+
+}
+
+/* given a subset list, write out the selected images, if desired */
+void OutputSubset (RegImage *image, int Nimage, int *match, int Nmatch) {
+
+  if (output.table != (char *) NULL) {
+    DumpFitsTable (output.table, image, match, Nmatch);
+  } 
+
+  if (output.bintable != (char *) NULL) {
+    DumpFitsBintable (output.bintable, image, match, Nmatch);
+  } 
+
+  if (output.cadctable != (char *) NULL) {
+    DumpCADCTable (output.cadctable, image, match, Nmatch);
+  } 
+
+  PrintSubset (image, match, Nmatch);
+  if (output.verbose) fprintf (stderr, "SUCCESS\n");
+
+  exit (0);
+}
+
+/* write out complete binary FITS table in format of db */
+void DumpFitsBintable (char *filename, RegImage *image, int *match, int Nmatch) {
+
+  int i, j;
+  FILE *f;
+  Header header;
+  Matrix matrix;
+  Header theader;
+  FTable ftable;
+  RegImage *subset;
+
+  /* extract subset list to single array */
+  ALLOCATE (subset, RegImage, MAX (1, Nmatch));
+  for (i = 0; i < Nmatch; i++){
+    j = match[i];
+    memcpy (&subset[i], &image[j], sizeof (RegImage));
+  }
+
+  /* open file for output */
+  f = fopen (filename, "w");
+  if (f == NULL) {
+    fprintf (stderr, "ERROR: can't open output file %s\n", filename);
+    exit (1);
+  }
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+
+  ftable.header = &theader;
+  fits_table_set_RegImage (&ftable, subset, Nmatch);
+
+  fits_fwrite_header  (f, &header);
+  fits_fwrite_matrix  (f, &matrix);
+  fits_fwrite_Theader (f, &theader);
+  fits_fwrite_table   (f, &ftable);
+  fclose (f);
+  exit (0);
+}
+
+void DumpFitsTable (char *filename, RegImage *image, int *match, int Nmatch) {
+  
+  int i;
+  char *obsstr, *regstr, *line, dummy[64];
+  char *modestr, *typestr, *ccdstr, *datestr;
+  unsigned long tsecond;
+  Header header, theader;
+  Matrix matrix;
+  FTable table;
+  RegImage *subset;
+
+  bzero (dummy, 64);
+  memset (dummy, ' ', 63);
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+  
+  /* create table header */
+  fits_create_table_header (&theader, "TABLE", "IMAGE_DATABASE");
+      
+  /* add current date/time to header */
+  str_to_time ("now", &tsecond);
+  datestr = sec_to_date (tsecond);
+  fits_modify (&header,  "DATE", "%s", 1, datestr);
+  fits_modify (&theader, "DATE", "%s", 1, datestr);
+
+  /* define table layout */
+  fits_define_table_column (&theader, "A64",   "FILE",       "filename in db",        "");
+  fits_define_table_column (&theader, "A128",  "PATH",       "fullpath in db",        "");
+  fits_define_table_column (&theader, "A32",   "FILTER",     "filter name",           "");
+  fits_define_table_column (&theader, "A32",   "INSTRUMENT", "instrument",            "");
+  fits_define_table_column (&theader, "A6",    "CCD",        "ccd identifier",        "");
+  fits_define_table_column (&theader, "A6",    "MODE",       "mef/split/etc",         "");
+  fits_define_table_column (&theader, "A8",    "TYPE",       "object/flat/bias/etc",  "");
+  fits_define_table_column (&theader, "A25",   "JUNK",       "space for expansion",   "");
+  fits_define_table_column (&theader, "F6.1",  "EXPTIME",    "exposure time",        "seconds");
+  fits_define_table_column (&theader, "F5.3",  "AIRMASS",    "airmass",              "");
+  fits_define_table_column (&theader, "F7.1",  "SKY",        "background level",     "counts / pixel");
+  fits_define_table_column (&theader, "F6.1",  "BIAS",       "bias level",           "counts / pixel");
+  fits_define_table_column (&theader, "F5.2",  "FWHM",       "image quality",        "pixels");
+  fits_define_table_column (&theader, "F5.1",  "TELFOCUS",   "telescope focus",      "microns");
+  fits_define_table_column (&theader, "F5.1",  "XPROBE",     "bonnette probe x pos", "microns");
+  fits_define_table_column (&theader, "F5.1",  "YPROBE",     "bonnette probe y pos", "microns");
+  fits_define_table_column (&theader, "F5.1",  "ZPROBE",     "bonnette focus",       "microns");
+  fits_define_table_column (&theader, "F5.1",  "DETTEMP",    "detector temperature", "deg celcius");
+  fits_define_table_column (&theader, "F5.1",  "TELTEMP0",   "other temperature",    "deg celcius");
+  fits_define_table_column (&theader, "F5.1",  "TELTEMP1",   "other temperature",    "deg celcius");
+  fits_define_table_column (&theader, "F5.1",  "TELTEMP2",   "other temperature",    "deg celcius");
+  fits_define_table_column (&theader, "F5.1",  "TELTEMP3",   "other temperature",    "deg celcius");
+  fits_define_table_column (&theader, "F5.1",  "ROTANGLE",   "camear rotation angle", "degrees");
+  fits_define_table_column (&theader, "F10.6", "RA",         "image ra",              "degrees");
+  fits_define_table_column (&theader, "F10.6", "DEC",        "image dec",             "degrees");
+  fits_define_table_column (&theader, "A20",   "OBS_TIME",   "time of measurement",   "seconds since Jan 1, 1970 UT");
+  fits_define_table_column (&theader, "A20",   "REG_TIME",   "time of registration",  "seconds since Jan 1, 1970 UT");
+
+  /* create table, add data values */
+  fits_create_table (&theader, &table);
+  
+  /* add data to table */
+  for (i = 0; i < Nmatch; i++) {
+    subset = &image[match[i]];
+    obsstr   = sec_to_date (subset[0].obstime);
+    regstr   = sec_to_date (subset[0].regtime);
+    typestr  = get_type_name(subset[0].type);
+    modestr  = get_mode_name(subset[0].mode);
+    ccdstr   = ccds[(int)subset[0].ccd];
+
+    line = fits_table_print (&table, subset[0].pathname, subset[0].filename, 
+			     subset[0].filter, subset[0].instrument, ccdstr,
+			     modestr, typestr, dummy, 
+			     subset[0].exptime, subset[0].airmass, 
+			     subset[0].sky, subset[0].bias, subset[0].fwhm, 
+			     subset[0].telfocus, subset[0].xprobe, subset[0].yprobe, subset[0].zprobe, 
+			     subset[0].dettemp, 
+			     subset[0].teltemp_0, subset[0].teltemp_1, subset[0].teltemp_2, subset[0].teltemp_3,
+			     subset[0].rotangle, 
+			     subset[0].ra, subset[0].dec, 
+			     obsstr, regstr);
+
+    fits_add_rows (&table, line, 1, strlen(line));
+    free (line);
+    free (obsstr);
+    free (regstr);
+  }
+
+  fits_write_header  (filename, &header);
+  fits_write_matrix  (filename, &matrix);
+  fits_write_Theader (filename, &theader);
+  fits_write_table   (filename, &table);
+  exit (0);
+}
+
+/* Select, TimeMode are global */
+int PrintSubset (RegImage *image, int *match, int Nmatch) {
+  
+  char ccdstr[64];  
+  int i, j;
+  char *modestr, *typestr, *timestr, *root, *path;
+
+  /* print the selected entries */
+  for (j = 0; j < Nmatch; j++) {
+    
+    i = match[j];
+
+    modestr = get_mode_name (image[i].mode);
+    typestr = get_type_name (image[i].type);
+    timestr = RegTimeMode ? sec_to_date (image[i].regtime) : sec_to_date (image[i].obstime);
+
+    if (CCDSeq) {
+      sprintf (ccdstr, "%02d", image[i].ccd);
+    } else {
+      if ((image[i].ccd < 0) || (image[i].ccd >= Nccd)) {
+	sprintf (ccdstr, "%02d", image[i].ccd);
+      } else {
+      sprintf (ccdstr, "%s", ccds[(int)image[i].ccd]);
+      }
+    }      
+
+    if (PTstyle) {
+      root = filerootname (image[i].filename);
+
+      /* do i want ccdstr? add a dot? 654321o.ccd00.ext */
+      if (image[i].mode == M_MEF) {
+	fprintf (stdout, "%s/%s %s/%s%02d %s %s\n", image[i].pathname, image[i].filename, root, root, image[i].ccd, ccdstr, modestr);
+      }
+
+      if (image[i].mode == M_SPLIT) {
+	path = basename (image[i].pathname);
+	fprintf (stdout, "%s/%s %s/%s %s %s\n", image[i].pathname, image[i].filename, path, root, ccdstr, "SPLIT");
+      }
+
+      if ((image[i].mode == M_SINGLE) || (image[i].mode == M_CUBE)) {
+	fprintf (stdout, "%s/%s %s 0 %s\n", image[i].pathname, image[i].filename, root, modestr);
+      }
+    } else {
+      /* this is somewhat poor: I have predefined a subset of value, and I can't guarantee that 'filter' has no spaces */
+      fprintf (stdout, "%5d %6s %6s %s  ", i, typestr, modestr, ccdstr);
+      fprintf (stdout, "%s %s  ", image[i].pathname, image[i].filename);
+      fprintf (stdout, "%s %f %s %f %f %f\n", image[i].filter, image[i].exptime, 
+	       timestr, image[i].fwhm, image[i].bias, image[i].sky);
+    }
+
+    free (timestr);
+  }
+  return (TRUE);
+}
+
+int dump_data (RegImage *image, int Nimage) {
+
+  int i;
+
+  for (i = 0; i < Nimage; i++) {
+    fprintf (stdout, "%s %f %f %f %s\n", image[i].filename, image[i].fwhm, image[i].sky, image[i].bias, image[i].filter);
+  }
+
+  fprintf (stdout, "SUCCESS\n");
+  exit (0);
+
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/rconnect.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/rconnect.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/rconnect.c	(revision 21753)
@@ -0,0 +1,100 @@
+# include "imregister.h"
+# include "imreg.h"
+
+/* rconnect opens a remote shell on hostname and returns two file descriptors:
+   one for read, one for write */
+
+int rconnect (char *hostname, char *command, int *rsock, int *wsock) {
+
+  int i, rfd[2], wfd[2], status;
+  pid_t pid;
+  char buffer[0x4000];
+  char *file;
+  Fifo fifo;
+
+  InitFifo (&fifo, 0x4000, 0x1000);
+
+  status = pipe (rfd);
+  if (status < 0) {
+    perror ("pipe");
+    return (FALSE);
+  }
+  status = pipe (wfd);
+  if (status < 0) {
+    perror ("pipe");
+    return (FALSE);
+  }
+
+  file = filebasename (command);
+  pid = fork ();
+  if (!pid) { /* must be child process */
+    fprintf (stderr, "starting remote connection to %s...", hostname);
+    /* close the excess sockets */
+    close (wfd[1]);
+    close (rfd[0]);
+    dup2 (wfd[0], STDIN_FILENO);
+    dup2 (rfd[1], STDOUT_FILENO);
+    dup2 (rfd[1], STDERR_FILENO);
+    setvbuf (stdin,  (char *) NULL, _IONBF, BUFSIZ);
+    setvbuf (stdout, (char *) NULL, _IONBF, BUFSIZ);
+    setvbuf (stderr, (char *) NULL, _IONBF, BUFSIZ);
+
+    status = execl (command, file, hostname, "/bin/csh", 0); 
+    fprintf (stderr, "error starting remote shell process\n");
+    Shutdown (1);
+  }
+  *wsock = wfd[1];
+  *rsock = rfd[0];
+  close (wfd[0]);
+  close (rfd[1]);
+  
+  fcntl (*rsock, F_SETFL, O_NONBLOCK);
+  fcntl (*wsock, F_SETFL, O_NONBLOCK);
+
+  sprintf (buffer, "echo PTOLEMY STARTED\n");
+  status = write (*wsock, buffer, strlen(buffer));
+  if ((status == -1) && (errno == EPIPE)) {
+    fprintf (stderr, "socket closed unexpectedly\n");
+    close (*wsock);
+    close (*rsock);
+    return (FALSE);
+  }
+
+  /* try to get evidence connection is alive - wait upto a few seconds */
+  status = -1;
+  for (i = 0; (i < 300) && (status == -1); i++) {
+    fcntl (*rsock, F_SETFL, O_NONBLOCK);
+    status = SockScan ("PTOLEMY STARTED", &fifo, *rsock);
+    if (!(i % 30)) fprintf (stderr, ".");
+    if (status == 0) {
+      fprintf (stderr, "socket closed unexpectedly\n");
+      close (*wsock);
+      close (*rsock);
+      return (FALSE);
+    }
+  }
+  if (i == -1) {
+    fprintf (stderr, "timeout while connecting\n");
+    close (*wsock);
+    close (*rsock);
+    return (FALSE);
+  }
+  fprintf (stderr, "Connected\n");
+
+  /* the onintr command works with csh/tcsh type shells to
+     prevent trapping of SIGTERM, used to kill hung jobs.
+     for bash/sh type shells, you can use SIGQUIT instead
+     without setting onintr */
+  sprintf (buffer, "onintr\n");
+  write (*wsock, buffer, strlen(buffer));
+  if ((status == -1) && (errno == EPIPE)) {
+    fprintf (stderr, "socket closed unexpectedly\n");
+    close (*wsock);
+    close (*rsock);
+    return (FALSE);
+  }
+
+  FreeFifo (&fifo);
+  return (pid);
+
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/submit.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/submit.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/submit.c	(revision 21753)
@@ -0,0 +1,56 @@
+# include "imregister.h"
+# include "imreg.h"
+
+int SubmitImages (RegImage *image) {
+
+  int i;
+  char line[1024], *root, *path;
+
+  /* send these images to FIFOs for imstat and ptolemy */ 
+
+  if (image[0].mode == M_MEF) {
+    for (i = 0; i < image[0].ccd; i++) {
+      root = filerootname (image[0].filename);
+      if (i < Nccd) {
+	sprintf (line, "%s/%s %s/%s%s %s %s", image[0].pathname, image[0].filename, root, root, ccdn[i], ccds[i], "MEF");
+      } else {
+	sprintf (line, "%s/%s %s/%sxx none %s", image[0].pathname, image[0].filename, root, root, "MEF");
+      }
+      if (!WriteFIFO (ImstatFifo, line)) return (FALSE);
+      if (image[0].type == T_OBJECT) {
+	if (!WriteFIFO (PtolemyFifo, line)) return (FALSE);
+      }
+    }
+  } 
+
+  if (image[0].mode == M_SINGLE) {
+    root = filerootname (image[0].filename);
+    sprintf (line, "%s/%s %s %02d %s", image[0].pathname, image[0].filename, root, 0, "SINGLE");
+    if (!WriteFIFO (ImstatFifo, line)) return (FALSE);
+    if (image[0].type == T_OBJECT) {
+      if (!WriteFIFO (PtolemyFifo, line)) return (FALSE);
+    }
+  } 
+
+  if (image[0].mode == M_CUBE) {
+    root = filerootname (image[0].filename);
+    sprintf (line, "%s/%s %s %02d %s", image[0].pathname, image[0].filename, root, 0, "CUBE");
+    if (!WriteFIFO (ImstatFifo, line)) return (FALSE);
+    if (image[0].type == T_OBJECT) {
+      if (!WriteFIFO (PtolemyFifo, line)) return (FALSE);
+    }
+  } 
+
+  if (image[0].mode == M_SPLIT) {
+    path = basename (image[0].pathname);
+    root = filerootname (image[0].filename);
+    sprintf (line, "%s/%s %s/%s %02d %s", image[0].pathname, image[0].filename, path, root, image[0].ccd, "SPLIT");
+    if (!WriteFIFO (ImstatFifo, line)) return (FALSE);
+    if (image[0].type == T_OBJECT) {
+      if (!WriteFIFO (PtolemyFifo, line)) return (FALSE);
+    }
+  }    
+
+  return (TRUE);
+}
+  
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/unique.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/unique.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/imreg/unique.c	(revision 21753)
@@ -0,0 +1,64 @@
+# include "imregister.h"
+# include "imreg.h"
+
+/* input is a subset index of image list, output is a new subset */
+int *unique_entries (RegImage *image, int Nimage, int *subset, int *Nmatch) {
+
+  int i, j, k, m, Nsubset;
+  int N, NMATCH;
+  int *match, *entry;
+  char idxline[128];
+  char **index;
+
+  if (!output.unique) return (subset);
+
+  /* create output index */
+  N = 0;
+  NMATCH = 1000;
+  ALLOCATE (match, int, NMATCH);
+
+  Nsubset = *Nmatch;
+
+  /* index = filename.ccd */
+  ALLOCATE (index, char *, Nsubset);
+  ALLOCATE (entry, int, Nsubset);
+  for (i = 0; i < Nsubset; i++) {
+    sprintf (idxline, "%s.%02d", image[subset[i]].filename, image[subset[i]].ccd);
+    index[i] = strcreate (idxline);
+    entry[i] = subset[i];
+  }
+  sortstr (index, entry, Nsubset);
+
+  /* find unique sequences */
+  for (i = 0; i < Nsubset; ) {
+    for (j = i + 1; (j < Nsubset) && (!strcmp (index[i], index[j])); j++);
+
+    /* find first entry with bias != 0, else entry i */
+    m = i;
+    for (k = i; k < j; k++) {
+      if (image[entry[k]].bias != 0) {
+	m = k;
+	break;
+      }
+    }
+    
+    /* add unique entry to output list */
+    match[N] = entry[m];
+    N ++;
+    if (N == NMATCH) {
+      NMATCH += 1000;
+      REALLOCATE (match, int, NMATCH);
+    }
+
+    /* j always points to the next entry */
+    i = j;
+  }
+
+  for (i = 0; i < Nsubset; i++) free (index[i]);
+  free (index);
+  free (entry);
+  free (subset);
+
+  *Nmatch = N;
+  return (match);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/include/detrend.h
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/include/detrend.h	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/include/detrend.h	(revision 21753)
@@ -0,0 +1,111 @@
+
+typedef struct {
+  int state; /* none, close, perfect */
+  int crit;  /* which criterion? */
+  int image; /* which detrend image? */
+} Match;
+
+typedef struct {
+  int TimeSelect;    unsigned long tstart, tstop;
+  char *label; 
+  char *imageID;
+  int order;
+  int type;
+  char mode;
+  int CCDSelect;     int CCD;
+  int ExptimeSelect; float Exptime;
+  int filter;
+} Descriptor;
+
+/* MosaicSelect & ImageSelect define these values */
+typedef struct {
+  int ModeSelect;    int Mode;
+  int TypeSelect;    int Type;
+  int CCDSelect;     int CCD;
+  int FilterSelect;  int Filter;
+  int EntrySelect;   int Entry;
+  int LabelSelect;   char *Label;
+  int NameSelect;    char *Name;
+  int ExptimeSelect; float Exptime;
+  int TimeSelect;    unsigned long tstart, tstop;
+  int MatchNumber;
+} Criteria;
+
+int Ncriteria;
+Criteria *criteria;
+
+struct {
+  int Select;
+  int Delete;
+  int Modify;
+  int Altpath;
+  int ElixirSmart;
+  int TimeMode;
+  int Recipe;
+  int Close;
+  int Criteria;
+  int Chipname;
+
+  char *ModifyEntry, *ModifyValue;
+  unsigned long TimeValue;
+  
+  int verbose;
+  char *table;
+  char *bintable;
+} output;
+
+/* altpath values */
+enum {NONE, ADD, DELETE, UPDATE};
+enum {START, STOP, REG};
+enum {UNLOCK, LOCK, IGNORE};
+enum {MATCH_NONE, MATCH_CLOSE, MATCH_PERFECT};
+
+# define DEBUG 0
+
+char **RecipeType;
+int Nrecipe;
+
+int SingleIsSplit;
+int NoReg;
+
+int regargs (int argc, char **argv, Descriptor *descriptor);
+int args (int argc, char **argv);
+int DefineImage (char *filename, Descriptor *descriptor);
+DetReg DefineEntry (Descriptor descriptor);
+
+char *set_dBFile ();
+char *get_dBPath ();
+int delete_image (DetReg *image);
+
+int SaveEntry (char *input, DetReg *newdata, char *ID);
+
+char **LoadRecipe (char *filter, int *nrecipe);
+
+Match *MatchCriteria (DetReg *image, int Nimage, int *nmatch);
+Match *UniqueSubset (DetReg *image, int Nimage, Match *match, int *nmatch);
+Match *ExptimeCriteria (DetReg *image, int Nimage, Match *match, int *nmatch);
+Match *CloseCriteria (DetReg *image, int Nimage, Match *match, int *nmatch);
+
+Match CheckCriteria (DetReg *image);
+
+int OutputSubset (DetReg *image, int Nimage, Match *match, int Nmatch);
+int DumpFitsTable (char *filename, DetReg *detdata, Match *match, int Nmatch);
+int PrintSubset (DetReg *detdata, Match *match, int Nmatch);
+Match SelectEntry (DetReg *image, int Nimage, Match *list, int Nlist, Criteria *crit);
+
+int usage ();
+Criteria *MosaicCriteria (Criteria base, char *filename, int *ncrit);
+Criteria *ImageCriteria (Criteria base, char *filename, char *ImageExtend, char *ImageMode, int *ncrit);
+Criteria *ExpandBase (Criteria base, int *ncrit, unsigned long *tstart, unsigned long *tstop, int *filt);
+Criteria *ExpandRecipe (Criteria *base, int *Ncrit);
+
+int escape (int mode, char *message);
+int DumpFitsBintable (char *filename, DetReg *image, Match *match, int Nmatch);
+int cmp_crit (Criteria *crit, DetReg *image);
+int set_crit (Criteria *crit, DetReg *image);
+int ckpathname (char *newpath);
+int PrintCriteria ();
+
+int SetAltpath (FITS_DB *db, DetReg *image, int Nimage, Match *match, int Nmatch);
+int ModifySubset (FITS_DB *db, DetReg *image, int Nimage, Match *match, int Nmatch);
+void DeleteSubset (FITS_DB *db, DetReg *image, int Nimage, Match *match, int Nmatch);
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/include/imphot.h
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/include/imphot.h	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/include/imphot.h	(revision 21753)
@@ -0,0 +1,29 @@
+
+struct {
+  int PhotcodeSelect; int photcode;
+  int NameSelect;     char *Name;
+  int Ntimes;         unsigned long *tstart, *tstop;
+  int CodeSelect;     int Code;
+} criteria;
+
+struct {
+  int   modify;
+  char *ModifyValue;
+  char *ModifyEntry;
+  char *table;
+  char *bintable;
+} options;
+
+int VERBOSE;
+int FORCE_READ;
+
+int db_load (FITS_DB *db);
+int args (int argc, char **argv);
+int DumpFitsBintable (char *filename, Image *image, int *match, int Nmatch);
+int DumpFitsTable (char *filename, Image *image, int *match, int Nmatch);
+void ModifySubset (FITS_DB *db, Image *image, int Nimage, int *match, int Nmatch);
+int PrintSubset (Image *image, int *match, int Nmatch);
+int output (Image *image, int *match, int Nmatch);
+int rfits (FITS_DB *db);
+int rtext (FITS_DB *db);
+int *subset (Image *image, int Nimage, int *nsubset);
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/include/imreg.h
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/include/imreg.h	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/include/imreg.h	(revision 21753)
@@ -0,0 +1,130 @@
+# include <signal.h>
+
+typedef struct {
+  char *buffer;
+  int   Nalloc;
+  int   Nmaxread;
+  int   Nextra;
+  int   Nlast;
+  int   Nbuffer;
+} Fifo;
+
+struct {
+  int ModeSelect;    int Mode;
+  int TypeSelect;    int Type;
+  int CCDSelect;     int CCD;
+  int FilterSelect;  char *Filter;
+  int EntrySelect;   int Entry;
+  int LabelSelect;   char *Label;
+  int ExptimeSelect; float Exptime;
+  int TimeSelect;    unsigned long Time;
+  int NameSelect;    char *Name;
+  int ProcSelect;    int Proc;
+  int DistSelect;    int Dist;
+  int Ntimes;        unsigned long *tstart, *tstop;
+  int MatchNumber;
+  int Close;
+} criteria;
+
+struct {
+  int delete;
+  int modify;
+
+  int modify_path;
+  char *oldpath, *newpath;
+
+  int unique;
+  int mef2split, split2mef;
+  int modify_dist, dist;
+  int modify_filter, modify_type, type;
+  char *filter;
+
+  int HST;
+  int verbose;
+  char *table;
+  char *bintable;
+  char *cadctable;
+} output;
+
+typedef struct {
+  int *ccd;
+  int Nccd;
+  char name[64];
+} MosaicRegion;
+
+typedef struct {
+  MosaicRegion center;
+  MosaicRegion outer;
+  MosaicRegion top;
+  MosaicRegion bottom;
+  MosaicRegion left;
+  MosaicRegion right;
+} MosaicLayout;
+
+enum {UNLOCK, LOCK, IGNORE};
+
+int SingleIsSplit;
+int NeedType;
+int NoReg;
+int IMSORT;
+int CLIENT;
+char *PIDFILE;
+int LOOP_DELAY;
+
+int args (int argc, char **argv);
+
+void DeleteSubset (FITS_DB *db, RegImage *image, int Nimage, int *match, int Nmatch);
+RegImage *iminfo (char *filename);
+
+int *match_criteria (RegImage *image, int Nimage, int *Nmatch);
+int *match_images (RegImage *image, int Nimage, RegImage *subset, int Nsubset, int *Nmatch);
+
+RegImage *newimages (RegImage *image, int *Nimage);
+
+void ModifySubset (FITS_DB *db, RegImage *image, int Nimage, int *match, int Nmatch);
+void SetOutputMode (char *mode);
+void OutputSubset (RegImage *image, int Nimage, int *match, int Nmatch);
+void DumpFitsBintable (char *filename, RegImage *image, int *match, int Nmatch);
+void DumpFitsTable (char *filename, RegImage *image, int *match, int Nmatch);
+int PrintSubset (RegImage *image, int *match, int Nmatch);
+int dump_data (RegImage *image, int Nimage);
+int SubmitImages (RegImage *image);
+int load_probes (char *filename, unsigned long tzero, int *wantprobe, double *values, int Nprobe);
+int define_table (Header *header, Matrix *matrix, Header *theader, FTable *table);
+void set_timezone (double dt);
+
+void DumpCADCTable (char *filename, RegImage *image, int *match, int Nmatch);
+int *GetObsIDSubset (RegImage *image, int start, int *index, int *entry, int Nindex, int *Nsubset);
+int *GetUniqueObsID (RegImage *image, int *index, int *entry, int Nindex, int *Nmatch);
+void GetObsIDIndex (RegImage *image, int *match, int Nmatch, int **Index, int **Entry);
+double SigmaClipList (double *list, int N);
+double MosaicIQStats (RegImage *image, int *match, int Nmatch, MosaicRegion *region);
+MosaicLayout *CreateCFH12K ();
+MosaicLayout *CreateMegaCam ();
+int GetREFCCD (RegImage *image, int *index, int *entry, int Nindex, int start);
+
+int imregclient (char *fitsfile, char *statfile, char *datfile);
+void SIG_DIE (int sig);
+void SIG_PIPE (int sig);
+void SetSignals ();
+void KillProcess (char *pidfile);
+void StatusProcess (char *pidfile);
+int close_lock_db ();
+int ConfigPID (char *pidfile);
+int print_db_status (char *message);
+int escape (int mode, char *message);
+
+int LoadPID (char *file, pid_t *pid, char *username, char *machine);
+int Shutdown (int status);
+void RemovePID ();
+int rconnect (char *hostname, char *command, int *rsock, int *wsock);
+
+int InitFifo (Fifo *fifo, int Nalloc, int Nextra);
+int FlushFifo (Fifo *fifo);
+int ShiftFifo (Fifo *fifo);
+int ReadtoFifo (Fifo *fifo, int sock);
+void FreeFifo (Fifo *fifo);
+int SockScan (char *string, Fifo *fifo, int sock);
+int memstr (char *m1, char *m2, int n);
+
+int *unique_entries (RegImage *image, int Nimage, int *subset, int *Nmatch);
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/include/imregister.h
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/include/imregister.h	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/include/imregister.h	(revision 21753)
@@ -0,0 +1,100 @@
+# include <ohana.h>
+# include <dvo.h>
+# include <errno.h>
+# include <time.h>
+# include <ctype.h>
+# include <stdlib.h>
+
+/* config variables from very old versions - remove?
+char ImageTemplate[256];
+char DBServer[256];
+*/
+
+char ImstatFifo[256];
+char PtolemyFifo[256];
+
+char ImageDB[256];
+char DetrendDB[256];
+char PhotDB[256];
+char TransDB[256];
+char ImPhotDB[256];
+char TempDB[256];
+char LogFile[256];
+char CONNECT[64];
+
+int  NDetrendAltDB;
+char **DetrendAltDB;
+
+char PhotCodeFile[256];
+char TempLogFile[256];
+char FilterList[256];
+char CameraConfig[256];
+char RecipeFile[256];
+
+char DateKeyword[64];
+char DateMode[64];
+char UTKeyword[64];
+char MJDKeyword[64];
+char JDKeyword[64];
+char ExptimeKeyword[16];
+char ImagetypeKeyword[16];
+char CCDnumKeyword[16];
+char FilterKeyword[16];
+char AirmassKeyword[16];
+char FocusKeyword[16];
+char RotationKeyword[16];
+char DettempKeyword[16];
+char Teldata1Keyword[16];
+char Teldata2Keyword[16];
+char Teldata3Keyword[16];
+char RADecDegKeyword[16];
+char DECDecDegKeyword[16];
+char RASexigKeyword[16];
+char DECSexigKeyword[16];
+char CameraKeyword[16];
+char Camera[64];
+char SeeingREFCCD[64];
+double ARCSEC_PIXEL;
+
+/* global vars used by camera info */
+char **ccds, **ccdn;
+int  Nccd;
+
+/* global vars used by filter abstraction */
+# define FILTER_ANY  -1 
+# define FILTER_NONE 0
+int NFILTER;
+char **filtername;
+char **filterhash;
+int   *filternum;
+
+int get_trange_arguments (int *argc, char **argv, unsigned long **Tstart, unsigned long **Tstop, int *ntimes);
+int get_filter_arguments (int *argc, char **argv, int **Filt, int *Nfilt);
+
+int parse_time (Header *header);
+void sort (float *value, int N);
+void dsort (double *value, int N);
+void sortstr (char **S, int *X, int N);
+void sortpair (int *X, int *Y, int N);
+
+void ConfigCamera ();
+int MatchCCDNameHeader (Header *header);
+int MatchCCDName (char *ID);
+void ConfigFilter ();
+int MatchFilterList (char *line);
+void ConfigInit (int *argc, char **argv);
+void WarnConfig (char *config, char *key, char * mode, int N, void *var);
+int WriteFIFO (char *filename, char *line);
+double get_fwhm (char *filename);
+
+void get_version (int argc, char **argv, char *version);
+int set_db (char *filename);
+
+void warn_scan (Header *header, char *field, char *format, int N, void *var);
+int fits_scan_nchar (Header *header, int size, char *field, int N,...);
+void warn_scan_nchar (Header *header, int size, char *field, int N, void *var);
+
+void clean_spaces (char *line);
+
+/* where is this defined ?? */
+char *basename (char *);
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/include/mosaics.h
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/include/mosaics.h	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/include/mosaics.h	(revision 21753)
@@ -0,0 +1,63 @@
+
+MosaicLayout *CreateCFH12K () {
+
+  MosaicLayout *layout;
+
+  ALLOCATE (layout, MosaicLayout, 1);
+
+  layout[0].center.Nccd = 4;
+  ALLOCATE (layout[0].center.ccd, int, layout[0].center.Nccd);
+  layout[0].center.ccd[0] = 2;
+  layout[0].center.ccd[1] = 3;
+  layout[0].center.ccd[2] = 8;
+  layout[0].center.ccd[3] = 9;
+
+  layout[0].outer.Nccd = 8;
+  ALLOCATE (layout[0].outer.ccd, int, layout[0].outer.Nccd);
+  layout[0].outer.ccd[0] = 0;
+  layout[0].outer.ccd[1] = 1;
+  layout[0].outer.ccd[2] = 4;
+  layout[0].outer.ccd[3] = 5;
+  layout[0].outer.ccd[4] = 6;
+  layout[0].outer.ccd[5] = 7;
+  layout[0].outer.ccd[6] = 10;
+  layout[0].outer.ccd[7] = 11;
+
+  layout[0].top.Nccd = 6;
+  ALLOCATE (layout[0].top.ccd, int, layout[0].top.Nccd);
+  layout[0].top.ccd[0] = 0;
+  layout[0].top.ccd[1] = 1;
+  layout[0].top.ccd[2] = 2;
+  layout[0].top.ccd[3] = 3;
+  layout[0].top.ccd[4] = 4;
+  layout[0].top.ccd[5] = 5;
+
+  layout[0].bottom.Nccd = 6;
+  ALLOCATE (layout[0].bottom.ccd, int, layout[0].bottom.Nccd);
+  layout[0].bottom.ccd[0] = 6;
+  layout[0].bottom.ccd[1] = 7;
+  layout[0].bottom.ccd[2] = 8;
+  layout[0].bottom.ccd[3] = 9;
+  layout[0].bottom.ccd[4] = 10;
+  layout[0].bottom.ccd[5] = 11;
+
+  layout[0].left.Nccd = 6;
+  ALLOCATE (layout[0].left.ccd, int, layout[0].left.Nccd);
+  layout[0].left.ccd[0] = 0;
+  layout[0].left.ccd[1] = 1;
+  layout[0].left.ccd[2] = 2;
+  layout[0].left.ccd[3] = 6;
+  layout[0].left.ccd[4] = 7;
+  layout[0].left.ccd[5] = 8;
+
+  layout[0].right.Nccd = 6;
+  ALLOCATE (layout[0].right.ccd, int, layout[0].right.Nccd);
+  layout[0].right.ccd[0] = 3;
+  layout[0].right.ccd[1] = 4;
+  layout[0].right.ccd[2] = 5;
+  layout[0].right.ccd[3] = 9;
+  layout[0].right.ccd[4] = 10;
+  layout[0].right.ccd[5] = 11;
+
+  return (layout);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/include/photreg.h
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/include/photreg.h	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/include/photreg.h	(revision 21753)
@@ -0,0 +1,45 @@
+# include <signal.h>
+
+struct {
+  int Ntimes;         unsigned long *tstart, *tstop;
+  int PhotCodeSelect; int photcode;
+  int LabelSelect;    char *Label;
+} criteria;
+
+struct {
+  int delete;
+  int modify;
+
+  int HST;
+  int verbose;
+  int convert;
+  char *table;
+  char *bintable;
+  char *cadctable;
+
+  int equiv;
+  int offset;
+  char *db;
+  int photcodenames;
+} output;
+
+enum {UNLOCK, LOCK, IGNORE};
+
+int args (int argc, char **argv);
+int regargs (int argc, char **argv, PhotPars *);
+
+void DeleteSubset (FITS_DB *db, PhotPars *photpars, int Nphotpars, int *match, int Nmatch);
+int *match_criteria (PhotPars *photpars, int Nphotpars, int *Nmatch);
+
+void OutputSubset (PhotPars *photpars, int Nphotpars, int *match, int Nmatch);
+
+void DumpFitsBintable (char *filename, PhotPars *image, int *match, int Nmatch);
+void DumpFitsTable (char *filename, PhotPars *image, int *match, int Nmatch);
+int PrintSubset (PhotPars *image, int *match, int Nmatch);
+
+void set_timezone (double dt);
+void getImageData (char *Image, char *ImageCCD, char *ImageMode);
+int escape (int mode, char *message);
+
+PhotPars *PhotParsOld_to_PhotPars (PhotParsOld *input, int Nphotpars);
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/include/spreg.h
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/include/spreg.h	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/include/spreg.h	(revision 21753)
@@ -0,0 +1,105 @@
+# include <signal.h>
+
+enum {
+  SPMODE_UKN,				/* unknown mode */
+  SPMODE_PHU,				/* one spectrum, primary header unit */
+  SPMODE_MEF,				/* spectrum group, extensions */
+  SPMODE_EXT,				/* one of a spectrum group, extension */
+  SPMODE_N
+};
+
+enum {
+  SPSTATE_UKN,				/* unknown state */
+  SPSTATE_RAW,				/* raw image counts */
+  SPSTATE_FLT,				/* flattened image counts */
+  SPSTATE_CLN,				/* clean extraction */
+  SPSTATE_WAV,				/* wavelength calibrated */
+  SPSTATE_FLX,				/* flux calibrated (implies WAV) */
+  SPSTATE_N
+};
+
+struct {
+  int Ntimes;           unsigned long *tstart, *tstop;
+  int ModeSelect;       int Mode;
+  int StateSelect;      int State;
+  int ExptimeSelect;    float Exptime;
+  int FilenameSelect;   char *Filename;
+  int ObjectSelect;     char *Object;
+  int TelescopeSelect;  char *Telescope;
+  int InstrumentSelect; char *Instrument;
+  int MatchNumber;
+} criteria;
+
+struct {
+  int delete;
+  int modify;
+
+  int unique;
+  int modify_path;
+  char *oldpath, *newpath;
+
+  int modify_mode, mode;
+  int modify_state, state;
+
+  int HST;
+  int verbose;
+  char *table;
+  char *bintable;
+} output;
+
+typedef struct {
+  int *ccd;
+  int Nccd;
+  char name[64];
+} MosaicRegion;
+
+typedef struct {
+  MosaicRegion center;
+  MosaicRegion outer;
+  MosaicRegion top;
+  MosaicRegion bottom;
+  MosaicRegion left;
+  MosaicRegion right;
+} MosaicLayout;
+
+enum {UNLOCK, LOCK, IGNORE};
+
+int SingleIsSplit;
+int NeedType;
+int NoReg;
+int IMSORT;
+int CLIENT;
+char *PIDFILE;
+int LOOP_DELAY;
+int DUMP;
+
+char SpectrumDB[64];
+char ObjectKeyword[64];
+char TelescopeKeyword[64];
+
+
+int args (int argc, char **argv);
+int *match_criteria (Spectrum *spectrum, int Nspectrum, int *Nmatch);
+int *unique_entries (Spectrum *spectrum, int Nspectrum, int *subset, int *Nmatch);
+
+void ModifySubset (FITS_DB *db, Spectrum *spectrum, int Nspectrum, int *match, int Nmatch);
+void DeleteSubset (FITS_DB *db, Spectrum *spectrum, int Nspectrum, int *match, int Nmatch);
+void OutputSubset (Spectrum *spectrum, int Nspectrum, int *match, int Nmatch);
+
+void SetOutputMode (char *mode);
+void DumpFitsBintable (char *filename, Spectrum *spectrum, int *match, int Nmatch);
+void DumpFitsTable (char *filename, Spectrum *spectrum, int *match, int Nmatch);
+int PrintSubset (Spectrum *spectrum, int *match, int Nmatch);
+int dump_data (Spectrum *spectrum, int Nspectrum);
+
+Spectrum *spinfo (char *filename);
+int *match_spectrums (Spectrum *subset, int Nsubset, int *Nmatch);
+int SubmitSpectrums (Spectrum *spectrum);
+void set_timezone (double dt);
+
+void showinfo (Spectrum *spec);
+int escape (int mode, char *message);
+int set_spectra (Spectrum *new, int Nnew);
+Spectrum *get_spectra (int *N);
+
+void ConfigInitSpec (int *argc, char **argv);
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/args.photreg.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/args.photreg.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/args.photreg.c	(revision 21753)
@@ -0,0 +1,143 @@
+# include "imregister.h"
+# include "photreg.h"
+
+void usage ();
+
+int regargs (int argc, char **argv, PhotPars *newdata) {
+
+  int *list, Nlist;
+  int N, Ntimes;
+  unsigned long *tstart, *tstop;
+  PhotCode *photcode, *depcode;
+
+  ConfigInit (&argc, argv);
+
+  photcode = NULL;
+  output.modify = TRUE;
+  bzero (newdata, sizeof(PhotPars));
+
+  if (get_argument (argc, argv, "-h")) usage ();
+  if (get_argument (argc, argv, "--help")) usage ();
+
+  /* load photcode data */
+  if (!LoadPhotcodes (PhotCodeFile)) {
+    fprintf (stderr, "error loading photcodes from %s\n", PhotCodeFile);
+    exit (1);
+  }
+
+  /* set the required database */
+  output.db = strcreate ("phot");
+  if ((N = get_argument (argc, argv, "-trans"))) {
+    remove_argument (N, &argc, argv);
+    output.db = strcreate ("trans");
+  }
+
+  /*** optional fields ***/
+  strcpy (newdata[0].label, "elixir");
+  if ((N = get_argument (argc, argv, "-label"))) {
+    remove_argument (N, &argc, argv);
+    strcpy (newdata[0].label, argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  newdata[0].Nmeas = 1;
+  if ((N = get_argument (argc, argv, "-Nmeas"))) {
+    remove_argument (N, &argc, argv);
+    newdata[0].Nmeas = atoi (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  newdata[0].Ntime = 1;
+  if ((N = get_argument (argc, argv, "-Ntime"))) {
+    remove_argument (N, &argc, argv);
+    newdata[0].Ntime = atoi (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  output.offset = FALSE;
+  if ((N = get_argument (argc, argv, "-offset"))) {
+    remove_argument (N, &argc, argv);
+    output.offset = TRUE;
+  }
+
+  /**** required arguments ****/
+  if (!get_trange_arguments (&argc, argv, &tstart, &tstop, &Ntimes)) usage ();
+  if (Ntimes != 1) usage ();
+  newdata[0].tstart = tstart[0];
+  newdata[0].tstop = tstop[0];
+
+  if (!get_argument (argc, argv, "-zp")) goto required;
+  if (!get_argument (argc, argv, "-dzp")) goto required;
+  if (!get_argument (argc, argv, "-photcode")) goto required;
+
+  /* observed zero point */
+  if ((N = get_argument (argc, argv, "-zp"))) {
+    remove_argument (N, &argc, argv);
+    newdata[0].ZP = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+  } 
+
+  /* error on observed zero point */
+  if ((N = get_argument (argc, argv, "-dzp"))) {
+    remove_argument (N, &argc, argv);
+    newdata[0].dZP = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  /* photcode system */
+  if ((N = get_argument (argc, argv, "-photcode"))) {
+    remove_argument (N, &argc, argv);
+    if ((photcode = GetPhotcodebyName (argv[N])) == NULL) {
+      fprintf (stderr, "ERROR: photcode not found in photcode table\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+  }
+
+  /* remainding newdata values can be set once photcode is known 
+     be careful about consistency for offset definition:
+     dM == ZPi - ZPo  (ZPo = nominal zero point, ZPi = specific observed zero point)
+     ie, clouds = -dM (ZPi < ZPo)
+  */
+  
+  /* find first (!) dep photcode which is equivalent to this code */
+  list = GetPhotcodeEquivList (photcode[0].code, &Nlist);
+  depcode = GetPhotcodebyCode (list[0]);
+
+  newdata[0].photcode = photcode[0].code;
+  newdata[0].refcode  = photcode[0].equiv;
+  newdata[0].X        = photcode[0].X[0];
+  newdata[0].c1       = photcode[0].c1;
+  newdata[0].c2       = photcode[0].c2;
+  
+  newdata[0].K        = depcode[0].K;
+  newdata[0].ZPo      = 0.001*photcode[0].C + 0.001*depcode[0].C;
+  if (output.offset) newdata[0].ZP += newdata[0].ZPo;
+  return (TRUE);
+
+required:
+  fprintf (stderr, "missing required fields\n");
+  usage ();
+  return (FALSE);
+}
+
+/* differences between phot.db & trans.db:
+
+   Ntime : photreg = 1 : transreg = N
+   dBFile: phot.db     : trans.db
+   ASCII EXTNAME: IMAGE_ZPTS : SUMMARY_ZPTS
+   BINARY EXTNAME: ZERO_POINTS_3.0 : TRANS_POINTS_3.0
+   
+   photreg -photcode B -zp 26.1 -dzp 0.02 -date 2003/1/1,10:00:00 -Nmeas 5 -Ntime 1 -db trans
+   photreg -photcode B -zp 26.1 -dzp 0.02 -date 2003/1/1,10:00:00 -Nmeas 5 -Ntime 1 -db trans
+
+   photsearch -db trans
+   photsearch -db phot
+   
+*/
+
+void usage () {  
+  fprintf (stderr, "USAGE: photreg (-zp zp) (-dzp dzp) (-trange start range|end) (-photcode code)\n");
+  fprintf (stderr, "       [-label label] [-offset] [-Nmeas N] [-Ntime N] [-db trans]\n");
+  exit (1);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/args.photsearch.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/args.photsearch.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/args.photsearch.c	(revision 21753)
@@ -0,0 +1,132 @@
+# include "imregister.h"
+# include "photreg.h"
+
+int args (int argc, char **argv) {
+
+  int N, equiv;
+
+  ConfigInit (&argc, argv);
+  ConfigCamera ();
+  ConfigFilter ();
+
+  /* load photcode data */
+  if (!LoadPhotcodes (PhotCodeFile)) {
+    fprintf (stderr, "error loading photcodes from %s\n", PhotCodeFile);
+    exit (1);
+  }
+
+  criteria.Ntimes = 0;
+  if (!get_trange_arguments (&argc, argv, &criteria.tstart, &criteria.tstop, &criteria.Ntimes)) {
+    fprintf (stderr, "ERROR: syntax error\n");
+    exit (1);
+  }
+
+  criteria.PhotCodeSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-photcode"))) {
+    remove_argument (N, &argc, argv);
+    if ((criteria.photcode = GetPhotcodeCodebyName (argv[N])) == 0) {
+      fprintf (stderr, "ERROR: photcode not found in table\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    criteria.PhotCodeSelect = TRUE;
+  }
+
+  criteria.LabelSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-label"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Label = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.LabelSelect = TRUE;
+  }
+
+  output.delete = FALSE;
+  if ((N = get_argument (argc, argv, "-delete"))) {
+    remove_argument (N, &argc, argv);
+    output.delete = TRUE;
+  }
+
+  output.equiv = FALSE;
+  if ((N = get_argument (argc, argv, "-equiv"))) {
+    remove_argument (N, &argc, argv);
+    output.equiv = TRUE;
+  }
+
+  output.offset = FALSE;
+  if ((N = get_argument (argc, argv, "-offset"))) {
+    remove_argument (N, &argc, argv);
+    output.offset = TRUE;
+  }
+
+  output.table = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-table"))) {
+    remove_argument (N, &argc, argv);
+    output.table = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  output.bintable = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-bintable"))) {
+    remove_argument (N, &argc, argv);
+    output.bintable = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  output.verbose = FALSE;
+  if ((N = get_argument (argc, argv, "-v"))) {
+    remove_argument (N, &argc, argv);
+    output.verbose = TRUE;
+  }
+
+  output.photcodenames = TRUE;
+  if ((N = get_argument (argc, argv, "-photcodes"))) {
+    remove_argument (N, &argc, argv);
+    output.photcodenames = FALSE;
+  }
+
+  output.convert = FALSE;
+  if ((N = get_argument (argc, argv, "-convert"))) {
+    remove_argument (N, &argc, argv);
+    output.convert = TRUE;
+    if (output.delete || output.modify) {
+      fprintf (stderr, "can't change old format table\n");
+      exit (1);
+    }
+  }
+
+  if ((N = get_argument (argc, argv, "-image"))) {
+    remove_argument (N, &argc, argv);
+    if (argc < N + 3) {
+      fprintf (stderr, "missing arguments to -image\n");
+      exit (1);
+    }
+    getImageData (argv[N], argv[N+1], argv[N+2]);
+    remove_argument (N, &argc, argv);
+    remove_argument (N, &argc, argv);
+    remove_argument (N, &argc, argv);
+  }
+
+  output.db = strcreate ("phot");
+  if ((N = get_argument (argc, argv, "-trans"))) {
+    remove_argument (N, &argc, argv);
+    output.db = strcreate ("trans");
+  }
+
+  if (argc != 1) {
+    fprintf (stderr, "USAGE: photsearch [config ops] [-v] [-version]\n");
+    fprintf (stderr, "       [-trange start stop/range] [-photcode code]\n");
+    fprintf (stderr, "       [-label label] [-delete]\n");
+    fprintf (stderr, "       [-table table.fits] [-bintable bintable.fits]\n");
+    exit (1);
+  }
+ 
+  /* set up photcode information */
+  if (criteria.PhotCodeSelect && output.equiv) {
+    if (!(equiv = GetPhotcodeEquivCodebyCode (criteria.photcode))) {
+      fprintf (stderr, "ERROR: photcode not found in photcode table\n");
+      exit (1);
+    }
+    criteria.photcode = equiv;
+  }
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/convert.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/convert.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/convert.c	(revision 21753)
@@ -0,0 +1,27 @@
+# include "imregister.h"
+# include "photreg.h"
+
+PhotPars *PhotParsOld_to_PhotPars (PhotParsOld *input, int Nphotpars) {
+
+  int i;
+  PhotPars *output;
+
+  ALLOCATE (output, PhotPars, Nphotpars);
+
+  for (i = 0; i < Nphotpars; i++) {
+    output[i].ZP       = input[i].ZP;
+    output[i].ZPo      = input[i].ZPo;
+    output[i].dZP      = input[i].dZP;
+    output[i].K        = input[i].K;
+    output[i].X        = input[i].X;
+    output[i].tstart   = input[i].tstart;
+    output[i].tstop    = input[i].tstop;
+    output[i].c1       = input[i].c1;
+    output[i].c2       = input[i].c2;
+    output[i].photcode = input[i].photcode;
+    strcpy (output[i].label, input[i].label);
+    output[i].Nmeas = 0;
+    output[i].Ntime = 0;
+  }
+  return (output);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/delete.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/delete.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/delete.c	(revision 21753)
@@ -0,0 +1,47 @@
+# include "imregister.h"
+# include "photreg.h"
+
+void DeleteSubset (FITS_DB *db, PhotPars *photdata, int Nphotdata, int *match, int Nmatch) {
+
+  int i, j;
+  int *keep, Ndel, Nsubset;
+  PhotPars *subset;
+
+  ALLOCATE (keep, int, MAX (Nphotdata, 1));
+  for (i = 0; i < Nphotdata; i++) keep[i] = TRUE;
+  fprintf (stderr, "total of %d photdata\n", Nphotdata);
+
+  Ndel = 0;
+  for (i = 0; i < Nmatch; i++) {
+    j = match[i];
+    if (j == -1) continue;
+    keep[j] = FALSE;
+    Ndel ++;
+  }
+  fprintf (stderr, "delete %d photdata\n", Ndel);
+
+  if (Ndel == 0) { 
+    fprintf (stderr, "SUCCESS\n");
+    fits_db_close (db);
+    fits_db_free (db);
+    exit (0);
+  }
+
+  /* create new data list */
+  Nsubset = Nphotdata - Ndel;
+  ALLOCATE (subset, PhotPars, MAX (1, Nsubset));
+  fprintf (stderr, "keeping %d photdata\n", Nsubset);
+  for (j = i = 0; i < Nphotdata; i++) {
+    if (!keep[i]) continue;
+    subset[j] = photdata[i];
+    j++;
+  }
+
+  fits_table_set_PhotPars (&db[0].ftable, subset, Nsubset);
+  fits_db_save (db);
+  fits_db_close (db);
+  fits_db_free (db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/getImageData.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/getImageData.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/getImageData.c	(revision 21753)
@@ -0,0 +1,69 @@
+# include "imregister.h"
+# include "photreg.h"
+
+void getImageData (char *Image, char *ImageCCD, char *ImageMode) {
+
+  Header header;
+  char detector[64], filter[64], photcode[64];
+  int i, ccd, Nfilter;
+  
+  /* extract time & photcode from header */
+
+  /* load options from the image header */
+  if (!fits_read_header (Image, &header)) {
+    if (output.verbose) fprintf (stderr, "ERR: trouble reading image header\n");
+    exit (1);
+  }
+
+  /* get time from image header */
+  ALLOCATE (criteria.tstart, unsigned long, 1);
+  ALLOCATE (criteria.tstart, unsigned long, 1);
+  criteria.tstart[0] = parse_time (&header);
+  criteria.tstop[0] = criteria.tstart[0] + 1;
+  criteria.Ntimes = 1;
+
+  /** determine photcode from header **/
+  /* get camera */
+  fits_scan (&header, CameraKeyword, "%s", 1, detector);
+  for (i = 0; i < strlen(detector); i++) { detector[i] = toupper (detector[i]); }
+  for (i = 0; i < strlen(detector); i++) { if (isspace (detector[i])) detector[i] = '.'; }
+    
+  /* get filter */
+  Nfilter = FILTER_NONE;
+  fits_scan (&header, FilterKeyword,   "%s", 1, filter);
+  for (i = 0; i < strlen (filter); i++) { if (isspace (filter[i])) filter[i] = '.'; }
+  for (i = 0; (i < NFILTER) && (Nfilter == FILTER_NONE); i++) {
+    if (!strcasecmp (filter, filtername[i])) {
+      Nfilter = filternum[i];
+    }
+  }      
+  if (Nfilter == FILTER_NONE) {
+    fprintf (stderr, "ERR: invalid filter %s\n", filter);
+    exit (1);
+  }
+  strcpy (filter, filtername[Nfilter]);
+
+  /* get ccd number */
+  if (!strcasecmp (ImageCCD, "phu")) {
+    ccd = 0;
+  } else {
+   if (!strcasecmp (ImageMode, "mef")) {
+     ccd = MatchCCDName (ImageCCD);
+   } else {
+     ccd = -1;
+     fits_scan (&header, CCDnumKeyword,  "%d", 1, &ccd);
+   }  
+   if (ccd == -1) {
+     fprintf (stderr, "ERR: invalid ccd %s %s\n", ImageCCD, ImageMode);
+     exit (1);
+   }
+  }
+
+  sprintf (photcode, "%s.%s.%02d", detector, filter, ccd);
+  if (!(criteria.photcode = GetPhotcodeCodebyName (photcode))) {
+    fprintf (stderr, "ERR: photcode not found table\n");
+    exit (1);
+  }
+  criteria.PhotCodeSelect = TRUE;
+  return;
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/match.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/match.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/match.c	(revision 21753)
@@ -0,0 +1,34 @@
+# include "imregister.h"
+# include "photreg.h"
+
+int *match_criteria (PhotPars *photdata, int Nphotdata, int *Nmatch) {
+
+  int i, j;
+  int N, NMATCH;
+  int *match;
+  int reject;
+
+  /* create selection index */
+  N = 0;
+  NMATCH = 1000;
+  ALLOCATE (match, int, NMATCH);
+
+  /* find entries that matches criteria */
+  for (i = 0; i < Nphotdata; i++) {
+    for (j = 0, reject = TRUE; reject && (j < criteria.Ntimes); j++) {
+      reject = (photdata[i].tstop < criteria.tstart[j]) || (photdata[i].tstart > criteria.tstop[j]);
+    }
+    if (criteria.Ntimes && reject) continue;
+    if (criteria.PhotCodeSelect && (photdata[i].photcode != criteria.photcode)) continue;
+    if (criteria.LabelSelect && strcmp (photdata[i].label, criteria.Label)) continue;
+
+    match[N] = i;
+    N ++;
+    if (N == NMATCH) {
+      NMATCH += 1000;
+      REALLOCATE (match, int, NMATCH);
+    }
+  }
+  *Nmatch = N;
+  return (match);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/output.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/output.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/photreg/output.c	(revision 21753)
@@ -0,0 +1,240 @@
+# include "imregister.h"
+# include "photreg.h"
+
+static char PhotError[] = "unknown";
+static char PhotNA[] = "unknown";
+
+/* given a subset list, write out the selected images, if desired */
+void OutputSubset (PhotPars *photdata, int Nphotdata, int *match, int Nmatch) {
+
+  if (output.table != (char *) NULL) {
+    DumpFitsTable (output.table, photdata, match, Nmatch);
+  } 
+
+  if (output.bintable != (char *) NULL) {
+    DumpFitsBintable (output.bintable, photdata, match, Nmatch);
+  } 
+
+  PrintSubset (photdata, match, Nmatch);
+  if (output.verbose) fprintf (stderr, "SUCCESS\n");
+
+  exit (0);
+}
+
+/* write out complete binary FITS table in format of db */
+void DumpFitsBintable (char *filename, PhotPars *photdata, int *match, int Nmatch) {
+
+  int i, j;
+  FILE *f;
+  Header header;
+  Matrix matrix;
+  Header theader;
+  FTable ftable;
+  PhotPars *subset;
+
+  /* extract subset of input data */
+  ALLOCATE (subset, PhotPars, MAX (1, Nmatch));
+  for (i = 0; i < Nmatch; i++){
+    j = match[i];
+    memcpy (&subset[i], &photdata[j], sizeof (PhotPars));
+  }
+
+  /* open file for output */
+  f = fopen (filename, "w");
+  if (f == NULL) {
+    fprintf (stderr, "ERROR: can't open output file %s\n", filename);
+    exit (1);
+  }
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+
+  ftable.header = &theader;
+  fits_table_set_PhotPars (&ftable, subset, Nmatch);
+
+  /* EXTNAME is set to ZERO_POINTS_3.0 by default */
+  if (!strcmp (output.db, "trans")) {
+    fits_modify (&theader, "EXTNAME", "%s", 1, "TRANS_POINTS_3.0");
+  }
+
+  fits_write_header  (filename, &header);
+  fits_write_matrix  (filename, &matrix);
+  fits_write_Theader (filename, &theader);
+  fits_write_table   (filename, &ftable);
+  fclose (f);
+  exit (0);
+}
+
+/** add ASCII table to autocode? **/
+void DumpFitsTable (char *filename, PhotPars *photdata, int *index, int Nkeep) {
+  
+  Header header, theader;
+  Matrix matrix;
+  FTable table;
+  PhotPars *newdata;
+  FILE *f;
+  char *startstr, *stopstr, *datestr, *line;
+  char *c1, *c2, *code, *photsys, *extname;
+  int i;
+  unsigned long tsecond;
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+  
+  /* create table header */
+  if (!strcmp (output.db, "phot")) {
+    extname = strcreate ("IMAGE_ZPTS");
+  } else {
+    extname = strcreate ("SUMMARY_ZPTS");
+  }
+  fits_create_table_header (&theader, "TABLE", extname);
+    
+  /* add current date/time to header */
+  str_to_time ("now", &tsecond);
+  datestr = sec_to_date ((unsigned int) tsecond);
+  fits_modify (&header,  "DATE", "%s", 1, datestr);
+  fits_modify (&theader, "DATE", "%s", 1, datestr);
+  free (datestr);
+     
+  /* define table layout */
+  fits_define_table_column (&theader, "F8.4", "ZP_OBS",       "measured zero point",       "mag");
+  fits_define_table_column (&theader, "F8.4", "ZP_REF",       "nominal zero point",        "mag");
+  fits_define_table_column (&theader, "F7.4", "ZP_ERR",       "error on zero point",       "mag");
+  fits_define_table_column (&theader, "F7.3", "C_AIRMASS",    "airmass coeff",             "mag per airmass"); 
+  fits_define_table_column (&theader, "F6.3", "C_COLOR",      "color coeff",               "mag per mag");
+  fits_define_table_column (&theader, "A20",  "START_TIME",   "start time of measurement", "yyyy/mm/dd,hh:mm:ss");
+  fits_define_table_column (&theader, "A20",  "STOP_TIME",    "stop time of measurement",  "yyyy/mm/dd,hh:mm:ss");
+  fits_define_table_column (&theader, "A12",  "C1_NAME",      "filter 1 for color",        "");
+  fits_define_table_column (&theader, "A12",  "C2_NAME",      "filter 2 for color",        "");
+  fits_define_table_column (&theader, "I6",   "NSTARS",       "number of stars used",      "");
+  fits_define_table_column (&theader, "I6",   "NTIMES",       "number of unique images",   "");
+  fits_define_table_column (&theader, "A12",  "INT_PHOT_SYS", "internal photom system",    "");
+  fits_define_table_column (&theader, "A12",  "REF_PHOT_SYS", "reference photom system",   "");
+  fits_define_table_column (&theader, "A70",  "LABEL",        "data label",                "");
+  
+  /* define TNULL, TNVAL values */
+  fits_modify (&theader, "TNULL1",  "%s", 1, "NaN");   /* ZP_OBS     */
+  fits_modify (&theader, "TNULL2",  "%s", 1, "NaN");   /* ZP_REF     */
+  fits_modify (&theader, "TNULL3",  "%s", 1, "NaN");   /* ZP_ERR     */
+  fits_modify (&theader, "TNULL4",  "%s", 1, "NaN");   /* C_AIRMASS  */
+  fits_modify (&theader, "TNULL5",  "%s", 1, "NaN");   /* C_COLOR    */
+  fits_modify (&theader, "TNULL6",  "%s", 1, "NULL");  /* START_TIME */
+  fits_modify (&theader, "TNULL7",  "%s", 1, "NULL");  /* STOP_TIME  */
+  fits_modify (&theader, "TNULL8",  "%s", 1, "NULL");  /* C1_NAME    */
+  fits_modify (&theader, "TNULL9",  "%s", 1, "NULL");  /* C2_NAME    */
+  fits_modify (&theader, "TNULL10", "%s", 1, "NULL");  /* NSTARS     */
+  fits_modify (&theader, "TNULL11", "%s", 1, "NULL");  /* NTIMES     */
+  fits_modify (&theader, "TNULL12", "%s", 1, "NULL");  /* INT_PHOT_SYS */
+  fits_modify (&theader, "TNULL13", "%s", 1, "NULL");  /* REF_PHOT_SYS */
+  fits_modify (&theader, "TNULL14", "%s", 1, "NULL");  /* LABEL      */
+
+  fits_modify (&theader, "TNVAL1",  "%s", 1, "Inf");   /* ZP_OBS       */
+  fits_modify (&theader, "TNVAL2",  "%s", 1, "Inf");   /* ZP_REF       */
+  fits_modify (&theader, "TNVAL3",  "%s", 1, "Inf");   /* ZP_ERR       */
+  fits_modify (&theader, "TNVAL4",  "%s", 1, "Inf");   /* C_AIRMASS    */
+  fits_modify (&theader, "TNVAL5",  "%s", 1, "Inf");   /* C_COLOR      */
+  fits_modify (&theader, "TNVAL6",  "%s", 1, "NA");    /* START_TIME   */
+  fits_modify (&theader, "TNVAL7",  "%s", 1, "NA");    /* STOP_TIME    */
+  fits_modify (&theader, "TNVAL8",  "%s", 1, "NA");    /* C1_NAME      */
+  fits_modify (&theader, "TNVAL9",  "%s", 1, "NA");    /* C2_NAME      */
+  fits_modify (&theader, "TNVAL10", "%s", 1, "NA");    /* NSTARS       */
+  fits_modify (&theader, "TNVAL11", "%s", 1, "NA");    /* NTIMES       */
+  fits_modify (&theader, "TNVAL12", "%s", 1, "NA");    /* INT_PHOT_SYS */
+  fits_modify (&theader, "TNVAL13", "%s", 1, "NA");    /* REF_PHOT_SYS */
+  fits_modify (&theader, "TNVAL14", "%s", 1, "NA");    /* LABEL        */
+
+  /* create table, add data values */
+  fits_create_table (&theader, &table);
+  
+  /* add data to table */
+  for (i = 0; i < Nkeep; i++) {
+    newdata = &photdata[index[i]];
+    startstr = sec_to_date (newdata[0].tstart);
+    stopstr = sec_to_date (newdata[0].tstop);
+    code    = GetPhotcodeNamebyCode (newdata[0].photcode);
+    photsys = GetPhotcodeNamebyCode (newdata[0].refcode);
+    c1      = GetPhotcodeNamebyCode (newdata[0].c1);
+    c2      = GetPhotcodeNamebyCode (newdata[0].c2);
+    if (code    == (char *) NULL) code    = PhotNA;
+    if (photsys == (char *) NULL) photsys = PhotNA;
+    if (c1      == (char *) NULL) c1      = PhotNA;
+    if (c2      == (char *) NULL) c2      = PhotNA;
+
+    line = fits_table_print (&table, newdata[0].ZP, newdata[0].ZPo, newdata[0].dZP, 
+	      newdata[0].K, newdata[0].X, startstr, stopstr,
+	      c1, c2, newdata[0].Nmeas, newdata[0].Ntime, code, photsys, newdata[0].label);
+    if (!fits_add_rows (&table, line, 1, strlen(line))) {
+      fprintf (stderr, "error writing dataline");
+      exit (1);
+    }
+
+    free (line);
+    free (startstr);
+    free (stopstr);
+  }
+ 
+  f = fopen (filename, "w");
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "Failure writing fits table\n");
+    exit (1);
+  }
+  fits_fwrite_header  (f, &header);
+  fits_fwrite_matrix  (f, &matrix);
+  fits_fwrite_Theader (f, &theader);
+  fits_fwrite_table   (f, &table);
+  fclose (f);
+  exit (0);
+}
+
+/* Select, TimeMode are global */
+int PrintSubset (PhotPars *photdata, int *match, int Nmatch) {
+  
+  int i, j;
+  char *photstr, *timestr, *c1, *c2, *refcode;
+  
+  /* print the selected entries */
+  for (j = 0; j < Nmatch; j++) {
+    
+    i = match[j];
+    
+    /* convert UNIX time to Elixir-style date string */
+    timestr = sec_to_date (photdata[i].tstart);
+    
+    if (output.photcodenames) {
+      /* convert photcode to filter name */
+      photstr = GetPhotcodeNamebyCode (photdata[i].photcode);
+      refcode = GetPhotcodeNamebyCode (photdata[i].refcode);
+      c1      = GetPhotcodeNamebyCode (photdata[i].c1);
+      c2      = GetPhotcodeNamebyCode (photdata[i].c2);
+
+      if (photstr == NULL) photstr = PhotError;
+      if (refcode == NULL) refcode = PhotError;
+      if (c1      == NULL) c1      = PhotError;
+      if (c2      == NULL) c2      = PhotError;
+      
+      fprintf (stdout, "%s %s  %7.4f %7.4f %7.4f  %3d %3d  %7.4f %7.4f  %s  %s %s %s\n", 
+	       photstr, timestr, photdata[i].ZP, photdata[i].ZPo, photdata[i].dZP, photdata[i].Nmeas, photdata[i].Ntime, 
+	       photdata[i].X, photdata[i].K, refcode, c1, c2, photdata[i].label); 
+    } else {
+      fprintf (stdout, "%4d %s  %7.4f %7.4f %7.4f  %3d %3d  %7.4f %7.4f  %4d %4d %4d  %s\n", 
+	       photdata[i].photcode, timestr, photdata[i].ZP, photdata[i].ZPo, photdata[i].dZP, photdata[i].Nmeas, 
+	       photdata[i].Ntime, photdata[i].X, photdata[i].K, 
+	       photdata[i].refcode, photdata[i].c1, photdata[i].c2, photdata[i].label); 
+    }
+      
+    free (timestr);
+  }
+  return (TRUE);
+}
+
+/**** the pre-autocode implementation of this program failed to byte-swap refcode!
+      any tables from before the new implementation have to be treated carefully
+****/
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/ConfigInit.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/ConfigInit.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/ConfigInit.c	(revision 21753)
@@ -0,0 +1,55 @@
+# include "imregister.h"
+# include "spreg.h"
+
+int success;
+
+void ConfigInitSpec (int *argc, char **argv) {
+
+  char *config, *file;
+
+  /*** load configuration info ***/
+  file = SelectConfigFile (argc, argv, "ptolemy");
+  config = LoadConfigFile (file);
+  if (config == (char *) NULL) {
+    fprintf (stderr, "ERROR: can't find configuration file %s\n", file);
+    if (file != (char *) NULL) free (file);
+    exit (0);
+  }
+
+  success = TRUE;
+
+  WarnConfig (config, "SPECTRUM_DATABASE",       "%s", 0, SpectrumDB);
+
+  /* keyword abstractions for parse_time */	   
+  WarnConfig (config, "DATE-KEYWORD",                "%s", 0, DateKeyword);
+  WarnConfig (config, "DATE-MODE",                   "%s", 0, DateMode);
+  WarnConfig (config, "UT-KEYWORD",                  "%s", 0, UTKeyword);
+  WarnConfig (config, "MJD-KEYWORD",                 "%s", 0, MJDKeyword);
+  WarnConfig (config, "JD-KEYWORD",                  "%s", 0, JDKeyword);
+						   
+  /* keyword abstractions for spinfo */		   
+  WarnConfig (config, "EXPTIME-KEYWORD",             "%s", 0, ExptimeKeyword);
+  WarnConfig (config, "AIRMASS-KEYWORD",             "%s", 0, AirmassKeyword);
+  WarnConfig (config, "CAMERA-KEYWORD",              "%s", 0, CameraKeyword);
+  WarnConfig (config, "OBJECT-KEYWORD",              "%s", 0, ObjectKeyword);
+  WarnConfig (config, "TELESCOPE-KEYWORD",           "%s", 0, TelescopeKeyword);
+
+  /* semi-optional values */
+  ScanConfig (config, "RA-DDD-KEYWORD",              "%s", 0, RADecDegKeyword);
+  ScanConfig (config, "DEC-DDD-KEYWORD",             "%s", 0, DECDecDegKeyword);
+  ScanConfig (config, "RA-HMS-KEYWORD",              "%s", 0, RASexigKeyword);
+  ScanConfig (config, "DEC-DMS-KEYWORD",             "%s", 0, DECSexigKeyword);
+  if (!RADecDegKeyword[0] & !DECDecDegKeyword[0] && !RASexigKeyword[0] && !DECSexigKeyword[0]) {
+    fprintf (stderr, "missing astrometry configuration information\n");
+    success = FALSE;
+  }
+
+  if (! success) {
+    fprintf (stderr, "ERROR: problem with elixir configuration\n");
+    exit (1);
+  }
+
+  free (config);
+  free (file);
+
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/args.spregister.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/args.spregister.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/args.spregister.c	(revision 21753)
@@ -0,0 +1,43 @@
+# include "imregister.h"
+# include "spreg.h"
+
+int args (int argc, char **argv) {
+
+  int N;
+
+  ConfigInitSpec (&argc, argv); /* load elixir config data */
+
+  NoReg = FALSE;
+  if ((N = get_argument (argc, argv, "-noreg"))) {
+    remove_argument (N, &argc, argv);
+    NoReg = TRUE;
+  }
+
+  DUMP = FALSE;
+  if ((N = get_argument (argc, argv, "-dump"))) {
+    remove_argument (N, &argc, argv);
+    DUMP = TRUE;
+  }
+
+  output.verbose = FALSE;
+  if ((N = get_argument (argc, argv, "-v"))) {
+    remove_argument (N, &argc, argv);
+    output.verbose = TRUE;
+  }
+
+  NeedType = FALSE;
+  if ((N = get_argument (argc, argv, "-needtype"))) {
+    remove_argument (N, &argc, argv);
+    NeedType = TRUE;
+  }
+
+  /* all imregister programs are implicitly modifying the db */
+  output.modify = TRUE;
+  IMSORT = FALSE;
+
+  if (argc != 2) {
+    fprintf (stderr, "ERROR: Usage: spregister (filename) [-noreg]\n");
+    exit (1);
+  }
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/args.spsearch.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/args.spsearch.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/args.spsearch.c	(revision 21753)
@@ -0,0 +1,176 @@
+# include "imregister.h" 
+# include "spreg.h"
+
+/* criteria struct is global */
+int args (int argc, char **argv) {
+
+  double dt;
+  int N;
+
+  ConfigInitSpec (&argc, argv); /* load elixir config data */
+
+  /* set timezone (set static in misc.c) */
+  if ((N = get_argument (argc, argv, "-tz"))) {
+    remove_argument (N, &argc, argv);
+    dt = atof (argv[N]);
+    set_timezone (dt);
+    remove_argument (N, &argc, argv);
+  }
+
+  /* define time range */
+  criteria.Ntimes = 0;
+  if (!get_trange_arguments (&argc, argv, &criteria.tstart, &criteria.tstop, &criteria.Ntimes)) {
+    fprintf (stderr, "ERROR: syntax error\n");
+    exit (1);
+  }
+
+  /* exposure time */
+  criteria.ExptimeSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-etime"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Exptime = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.ExptimeSelect = TRUE;
+  }
+ 
+  /* image type (dark, flat, bias, etc) */
+  criteria.StateSelect = FALSE;
+
+ 
+  /* image mode (split, mef, single) */
+  criteria.ModeSelect = FALSE;
+  /*
+  criteria.Mode = M_UNDEF;
+  if ((N = get_argument (argc, argv, "-mode"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Mode = get_image_mode (argv[N]);
+    if (criteria.Mode == M_UNDEF) {
+      fprintf (stderr, "ERROR: invalid image mode %s\n", argv[N]);
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    criteria.ModeSelect = TRUE;
+  }
+  */
+
+  /* string in image name */
+  criteria.FilenameSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-filename"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Filename = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.FilenameSelect = TRUE;
+  }
+
+  /* string in image name */
+  criteria.ObjectSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-object"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Object = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.ObjectSelect = TRUE;
+  }
+
+  /* string in image name */
+  criteria.TelescopeSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-tel"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Telescope = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.TelescopeSelect = TRUE;
+  }
+
+  /* string in image name */
+  criteria.InstrumentSelect = FALSE;
+  if ((N = get_argument (argc, argv, "-inst"))) {
+    remove_argument (N, &argc, argv);
+    criteria.Instrument = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    criteria.InstrumentSelect = TRUE;
+  }
+
+  /*** command-line options which modify the output list */
+  if ((N = get_argument (argc, argv, "-treg"))) {
+    remove_argument (N, &argc, argv);
+    SetOutputMode ("RegTimeMode");
+  }
+  output.table = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-table"))) {
+    remove_argument (N, &argc, argv);
+    output.table = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  output.bintable = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-bintable"))) {
+    remove_argument (N, &argc, argv);
+    output.bintable = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  /*** command-line options which modify behavior (delete, modify, newpath, mef2split split2mef */
+  output.delete = FALSE;
+  output.modify = FALSE;
+  output.modify_path = FALSE; 
+  output.unique = FALSE;
+
+  if ((N = get_argument (argc, argv, "-delete"))) {
+    remove_argument (N, &argc, argv);
+    output.delete = TRUE;
+  }
+
+  if ((N = get_argument (argc, argv, "-unique"))) {
+    remove_argument (N, &argc, argv);
+    output.unique = TRUE;
+  }
+
+  if ((N = get_argument (argc, argv, "-modify"))) {
+    if (output.delete) { 
+      fprintf (stderr, "can't specify more than one modifier at a time\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    output.modify = TRUE;
+    
+    /* modify part of the path */
+    if (!strcasecmp (argv[N], "path")) {
+      output.modify_path = TRUE;
+      remove_argument (N, &argc, argv);
+      output.oldpath = strcreate (argv[N]);
+      remove_argument (N, &argc, argv);
+      output.newpath = strcreate (argv[N]);
+      remove_argument (N, &argc, argv);
+      goto valid_modify;
+    }
+
+    /* modify distributed status */
+    if (!strcasecmp (argv[N], "mode")) {
+      output.modify_mode = TRUE;
+      remove_argument (N, &argc, argv);
+      output.mode = atoi(argv[N]);
+      remove_argument (N, &argc, argv);
+      goto valid_modify;
+    }
+
+    if (!strcasecmp (argv[N], "help")) {
+      fprintf (stderr, "-modify option: \n");
+      fprintf (stderr, "  -modify path (oldpath) (newpath)\n"); 
+      fprintf (stderr, "  -modify mode (mef | split)\n"); 
+      exit (2);
+    }
+
+    fprintf (stderr, "invalid -modify option, try -modify help\n");
+    exit (1);
+  }
+ valid_modify:
+
+  if (argc != 1) {
+    fprintf (stderr, "USAGE: imsearch [config ops] \n");
+    fprintf (stderr, "  [-type type] [-mode mode] [-trange start range] [-ccd N]\n");
+    fprintf (stderr, "  [-etime exptime] [-filter name] [-name string] [-proc t/f]\n");
+    fprintf (stderr, "  [-treg] [-seq] [-pt] [-table] [-cadctable] [-bintable]\n");
+    fprintf (stderr, "  [-delete] [-modify (options)]\n");
+    exit (1);
+  }
+
+  return (TRUE);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/delete.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/delete.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/delete.c	(revision 21753)
@@ -0,0 +1,48 @@
+# include "imregister.h"
+# include "spreg.h"
+
+void DeleteSubset (FITS_DB *db, Spectrum *spectrum, int Nspectrum, int *match, int Nmatch) {
+
+  int i, j;
+  int *keep, Nbad, Nsubset;
+  Spectrum *subset;
+
+  ALLOCATE (keep, int, MAX (Nspectrum, 1));
+  for (i = 0; i < Nspectrum; i++) keep[i] = TRUE;
+  fprintf (stderr, "total of %d spectra\n", Nspectrum);
+
+  Nbad = 0;
+  for (i = 0; i < Nmatch; i++) {
+    j = match[i];
+    if (j == -1) continue;
+    keep[j] = FALSE;
+    Nbad ++;
+  }
+  fprintf (stderr, "delete %d spectra\n", Nbad);
+  if (Nbad == 0) { 
+    fprintf (stderr, "SUCCESS\n");
+    fits_db_close (db);
+    exit (0);
+  }
+
+  Nsubset = Nspectrum - Nbad;
+  ALLOCATE (subset, Spectrum, MAX (1, Nsubset));
+  fprintf (stderr, "keeping %d spectra\n", Nsubset);
+  for (j = i = 0; i < Nspectrum; i++) {
+    if (!keep[i]) continue;
+    subset[j] = spectrum[i];
+    j++;
+  }
+  free (keep);
+  free (spectrum);
+
+  /** we may later want to pull this out and put it elsewhere **/
+  /** free db[0].theader, db[0].table.buffer? **/
+  fits_table_set_Spectrum (&db[0].ftable, subset, Nsubset);
+  fits_db_save (db);
+  fits_db_close (db);
+  fits_db_free (db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/match.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/match.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/match.c	(revision 21753)
@@ -0,0 +1,87 @@
+# include "imregister.h"
+# include "spreg.h"
+
+int *match_criteria (Spectrum *spectrum, int Nspectrum, int *Nmatch) {
+
+  int i, j;
+  int N, NMATCH;
+  int *match;
+  int reject;
+  int Nfilename, Nobject, Ntelescope, Ninstrument;
+
+  /* create selection index */
+  N = 0;
+  NMATCH = 1000;
+  ALLOCATE (match, int, NMATCH);
+
+  Nfilename = Nobject = Ntelescope = Ninstrument = 0;
+
+  if (criteria.FilenameSelect)   Nfilename   = strlen (criteria.Filename);
+  if (criteria.ObjectSelect)     Nobject     = strlen (criteria.Object);
+  if (criteria.TelescopeSelect)  Ntelescope  = strlen (criteria.Telescope);
+  if (criteria.InstrumentSelect) Ninstrument = strlen (criteria.Instrument);
+
+  /* find entries that matches criteria */
+  for (i = 0; i < Nspectrum; i++) {
+    for (j = 0, reject = TRUE; reject && (j < criteria.Ntimes); j++) {
+      reject = (spectrum[i].obstime + spectrum[i].exptime < criteria.tstart[j]) || (spectrum[i].obstime > criteria.tstop[j]);
+    }
+    if (criteria.Ntimes && reject) continue;
+    if (criteria.ModeSelect    && (spectrum[i].mode  != criteria.Mode)) continue;
+    if (criteria.StateSelect   && (spectrum[i].state != criteria.State)) continue;
+
+    if (criteria.ExptimeSelect && (fabs (spectrum[i].exptime - criteria.Exptime) > 5.0)) continue;
+
+    if (criteria.FilenameSelect   && (strncasecmp (spectrum[i].filename, criteria.Filename, Nfilename))) continue;
+    if (criteria.ObjectSelect     && (strncasecmp (spectrum[i].objname, criteria.Object, Nobject))) continue;
+    if (criteria.TelescopeSelect  && (strncasecmp (spectrum[i].telescope, criteria.Telescope, Ntelescope))) continue;
+    if (criteria.InstrumentSelect && (strncasecmp (spectrum[i].instrument, criteria.Instrument, Ninstrument))) continue;
+
+    match[N] = i;
+    N ++;
+    if (N == NMATCH) {
+      NMATCH += 1000;
+      REALLOCATE (match, int, NMATCH);
+    }
+  }
+  *Nmatch = N;
+  return (match);
+}
+
+# if (0)
+
+int *match_spectra (Spectrum *subset, int Nsubset, int *Nmatch) {
+  
+  int i, j, N, Nspectrum, Nfound;
+  int *match;
+  Spectrum *spectrum;
+
+  spectrum = get_spectra (&Nspectrum);
+
+  /* find matching spectra - very inefficient : sort by obstime, find those first? */
+  ALLOCATE (match, int, Nsubset);
+  for (j = 0; j < Nsubset; j++) {
+    match[j] = -1;
+    for (i = 0; (match[j] == -1) && (i < Nspectrum); i++) {
+      if (spectrum[i].obstime > subset[j].obstime + 1) continue;
+      if (spectrum[i].obstime < subset[j].obstime - 1) continue;
+      match[j] = i;
+    }
+  }
+  
+  Nfound = 0;
+  for (i = 0; i < Nsubset; i++) {
+    /* set the new values for this spectrum */
+    N = match[i];
+    if (N == -1) continue;
+    spectrum[N].ra   = subset[i].ra; 
+    spectrum[N].dec  = subset[i].dec; 
+    /* if the spectrum is MEF, these were not correctly assigned by imsort.
+       this step uses the values from the split ccd spectrum */
+    Nfound ++;
+  }
+  *Nmatch = Nfound;
+  return (match);
+}
+
+# endif
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/modify.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/modify.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/modify.c	(revision 21753)
@@ -0,0 +1,50 @@
+# include "imregister.h"
+# include "spreg.h"
+
+void ModifySubset (FITS_DB *db, Spectrum *spectrum, int Nspectrum, int *match, int Nmatch) {
+
+  int i, j, Nold;
+  char *tmppath;
+
+  Nold = 0;
+  tmppath = NULL;
+
+  /* create some necessary variables */
+  if (output.modify_path) { 
+    Nold = strlen (output.oldpath);
+    ALLOCATE (tmppath, char, 128);
+  }
+
+  /* modify the selected entries */
+  for (j = 0; j < Nmatch; j++) {
+
+    i = match[j];
+
+    if (output.modify_path) {
+      if (!strncmp (spectrum[i].pathname, output.oldpath, Nold)) {
+	strcpy (tmppath, &spectrum[i].pathname[Nold]);
+	snprintf (spectrum[i].pathname, 128, "%s%s", output.newpath, tmppath);
+      }
+    }
+
+    if (output.modify_mode) {
+      spectrum[i].mode = output.mode;
+    }
+
+    if (output.modify_state) {
+      spectrum[i].state = output.state;
+    }
+  }
+
+  /** we may later want to pull this out and put it elsewhere **/
+  fits_vtable_from_ftable (&db[0].ftable, &db[0].vtable, match, Nmatch);
+  for (i = 0; i < Nmatch; i++) {
+    fits_convert_Spectrum ((Spectrum *) db[0].vtable.buffer[i], sizeof (Spectrum), 1);
+  }
+  fits_db_update (db);
+  fits_db_close (db);
+  fits_db_free (db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/output.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/output.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/output.c	(revision 21753)
@@ -0,0 +1,174 @@
+# include "imregister.h"
+# include "spreg.h"
+
+static int RegTimeMode = FALSE;
+
+void SetOutputMode (char *mode) {
+
+  if (!strcmp (mode, "RegTimeMode")) {
+    RegTimeMode = TRUE;
+    return;
+  }
+  return;
+}
+
+/* given a subset list, write out the selected spectra, if desired */
+void OutputSubset (Spectrum *spectrum, int Nspectra, int *match, int Nmatch) {
+
+  if (output.table != (char *) NULL) {
+    DumpFitsTable (output.table, spectrum, match, Nmatch);
+  } 
+
+  if (output.bintable != (char *) NULL) {
+    DumpFitsBintable (output.bintable, spectrum, match, Nmatch);
+  } 
+
+  PrintSubset (spectrum, match, Nmatch);
+  exit (0);
+}
+
+/* write out complete binary FITS table in format of db */
+void DumpFitsBintable (char *filename, Spectrum *spectrum, int *match, int Nmatch) {
+
+  int i, j;
+  FILE *f;
+  Header header;
+  Matrix matrix;
+  Header theader;
+  FTable ftable;
+  Spectrum *subset;
+
+  /* extract subset list to single array */
+  ALLOCATE (subset, Spectrum, MAX (1, Nmatch));
+  for (i = 0; i < Nmatch; i++){
+    j = match[i];
+    memcpy (&subset[i], &spectrum[j], sizeof (Spectrum));
+  }
+
+  /* open file for output */
+  f = fopen (filename, "w");
+  if (f == NULL) {
+    fprintf (stderr, "ERROR: can't open output file %s\n", filename);
+    exit (1);
+  }
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+
+  ftable.header = &theader;
+  fits_table_set_Spectrum (&ftable, subset, Nmatch);
+
+  fits_fwrite_header   (f, &header);
+  fits_fwrite_matrix   (f, &matrix);
+  fits_fwrite_Theader  (f, &theader);
+  fits_fwrite_table   (f, &ftable);
+  fclose (f);
+  exit (0);
+}
+
+/* write out an ASCII table */
+void DumpFitsTable (char *filename, Spectrum *spectrum, int *match, int Nmatch) {
+  
+  int i;
+  char *obsstr, *regstr, *line, *datestr;
+  unsigned long tsecond;
+  FILE *f;
+  Header header, theader;
+  Matrix matrix;
+  FTable ftable;
+  Spectrum *subset;
+
+  /* create primary header */
+  fits_init_header (&header);    
+  header.extend = TRUE;
+  fits_create_header (&header);
+  fits_create_matrix (&header, &matrix);
+  fits_print (&header, "NEXTEND", "%d", 1, 1);
+  
+  /* the ASCII table is always a little harder than the binary:
+   * we need to build the data line a bit carefully 
+   */
+
+  /* create an empty table which we will fill in by hand */
+  ftable.header = &theader;
+  fits_table_set_SpectrumASCII (&ftable, NULL, 0);
+  
+  /* add data to table */
+  for (i = 0; i < Nmatch; i++) {
+    subset = &spectrum[match[i]];
+    obsstr = sec_to_date (subset[0].obstime);
+    regstr = sec_to_date (subset[0].regtime);
+
+    /* we should get an error here if we don't construct this line correctly */
+    line = fits_table_print (&ftable, subset[0].filename, subset[0].pathname, subset[0].instrument, 
+			     subset[0].telescope, subset[0].objname, subset[0].extname, 
+			     subset[0].ra, subset[0].dec, subset[0].exptime, subset[0].airmass, 
+			     subset[0].Ws, subset[0].We, subset[0].dW, 
+			     subset[0].Nspec, obsstr, regstr,
+			     subset[0].mode, subset[0].state, subset[0].flag);
+
+    fits_add_rows (&ftable, line, 1, strlen(line));
+    free (line);
+    free (obsstr);
+    free (regstr);
+  }
+
+  /* add current date/time to header */
+  str_to_time ("now", &tsecond);
+  datestr = sec_to_date (tsecond);
+  fits_modify (&header,  "DATE", "%s", 1, datestr);
+  fits_modify (&theader, "DATE", "%s", 1, datestr);
+
+  /* open file for output */
+  f = fopen (filename, "w");
+  if (f == NULL) {
+    fprintf (stderr, "ERROR: can't open output file %s\n", filename);
+    exit (1);
+  }
+
+  fits_fwrite_header  (f, &header);
+  fits_fwrite_matrix  (f, &matrix);
+  fits_fwrite_Theader (f, &theader);
+  fits_fwrite_table   (f, &ftable);
+  fclose (f);
+
+  exit (0);
+}
+
+/* Select, TimeMode are global */
+int PrintSubset (Spectrum *spectrum, int *match, int Nmatch) {
+  
+  int i, j;
+  char *timestr;
+
+  /* print the selected entries */
+  for (j = 0; j < Nmatch; j++) {
+    i = match[j];
+    
+    timestr = RegTimeMode ? sec_to_date (spectrum[i].regtime) : sec_to_date (spectrum[i].obstime);
+
+    /* predefined subset of values */
+    fprintf (stdout, "%5d %20s %s %s %s %s ", i, timestr, spectrum[i].pathname, spectrum[i].filename, spectrum[i].objname, spectrum[i].telescope);
+    fprintf (stdout, "%5.1f %5.3f %.1f %.1f %.2f\n", spectrum[i].exptime, spectrum[i].airmass, spectrum[i].Ws, spectrum[i].We, spectrum[i].dW);
+
+    free (timestr);
+  }
+  return (TRUE);
+}
+
+int dump_data (Spectrum *spectrum, int Nspectrum) {
+
+  int i;
+
+  for (i = 0; i < Nspectrum; i++) {
+    fprintf (stdout, "%s %s %f %f %f %f\n", spectrum[i].filename, spectrum[i].objname, spectrum[i].exptime, spectrum[i].airmass, spectrum[i].Ws, spectrum[i].We);
+  }
+
+  fprintf (stdout, "SUCCESS\n");
+  exit (0);
+
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/showinfo.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/showinfo.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/showinfo.c	(revision 21753)
@@ -0,0 +1,34 @@
+# include "imregister.h"
+# include "spreg.h"
+
+void showinfo (Spectrum *spec) {
+
+  char *obstime, *regtime;
+
+  fprintf (stderr, "\n");
+  fprintf (stderr, "filename: %s\n",   spec[0].filename);
+  fprintf (stderr, "pathname: %s\n",   spec[0].pathname);
+  fprintf (stderr, "extname:  %s\n\n",   spec[0].extname);
+
+  fprintf (stderr, "instrument: %s\n\n", spec[0].instrument);
+  fprintf (stderr, "telescope: %s\n\n", spec[0].telescope);
+
+
+  fprintf (stderr, "mode: %d, state: %d, flag: %x\n\n", spec[0].mode, spec[0].state, spec[0].flag);
+
+  fprintf (stderr, "exptime: %f, airmass: %f\n", spec[0].exptime, spec[0].airmass);
+  fprintf (stderr, "ra: %f, dec: %f\n", spec[0].ra, spec[0].dec);
+  fprintf (stderr, "objname: %s\n\n", spec[0].objname);
+
+  fprintf (stderr, "Ws: %f, We: %f, dW: %f\n", spec[0].Ws, spec[0].We, spec[0].dW);
+  fprintf (stderr, "Nspec: %d\n", spec[0].Nspec);
+
+  obstime = sec_to_date (spec[0].obstime);
+  regtime = sec_to_date (spec[0].regtime);
+
+  fprintf (stderr, "obstime: %s\n", obstime);
+  fprintf (stderr, "regtime: %s\n", regtime);
+
+  exit (0);
+
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/spinfo.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/spinfo.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/spinfo.c	(revision 21753)
@@ -0,0 +1,113 @@
+# include "imregister.h"
+# include "spreg.h"
+
+Spectrum *spinfo (char *filename) {
+
+  Spectrum *spectrum;
+  Header header;
+  char line[80];
+  struct timeval now;
+  char *name, *cwd, *tempname;
+  double tmp;
+
+  ALLOCATE (spectrum, Spectrum, 1);
+  bzero (spectrum, sizeof (Spectrum));
+
+  /* load in FITS header from image */
+  if (!fits_read_header (filename, &header)) {
+    fprintf (stderr, "ERROR: can't find image file %s\n", filename);
+    exit (1);
+  }
+
+  /* get filename */
+  name = filebasename (filename);
+  snprintf (spectrum[0].filename, 32, "%s", name);
+  free (name);
+
+  /* get pathname (add cwd if not absolute) */
+  name = pathname (filename);
+  if (name[0] != '/') {
+    cwd = getcwd (NULL, 64 - strlen(name) - 2);
+    if (cwd == (char *) NULL) {
+      cwd = strcreate ("longpath");
+      /* pathname is limited to 64 chars.  if it is toolong, 
+	 we put in the word 'longpath'.  no other useful solution. */
+    }
+    ALLOCATE (tempname, char, strlen (cwd) + strlen (name) + 2);
+    if (!strcmp (name, ".")) {
+      sprintf (tempname, "%s", cwd);
+    } else {
+      sprintf (tempname, "%s/%s", cwd, name);
+    }      
+    free (name);
+    free (cwd);
+    name = tempname;
+  }    
+  snprintf (spectrum[0].pathname, 64, "%s", name);
+  free (name);
+
+  /* find the important header keyword values */
+  spectrum[0].obstime = parse_time (&header);
+
+  gettimeofday (&now, (void *) NULL);
+  spectrum[0].regtime = now.tv_sec;
+
+  warn_scan_nchar (&header, 16, ObjectKeyword,    1, spectrum[0].objname);
+  warn_scan_nchar (&header, 16, CameraKeyword,    1, spectrum[0].instrument);
+  warn_scan_nchar (&header, 16, TelescopeKeyword, 1, spectrum[0].telescope);
+
+  clean_spaces (spectrum[0].objname);
+  clean_spaces (spectrum[0].instrument);
+  clean_spaces (spectrum[0].telescope);
+
+  warn_scan (&header, ExptimeKeyword,    "%f", 1, &spectrum[0].exptime);
+  warn_scan (&header, AirmassKeyword,    "%f", 1, &spectrum[0].airmass);
+
+  /* grab coordinates from header */
+  if (RADecDegKeyword[0] & DECDecDegKeyword[0]) {
+    /* expect RA & DEC in decimal degrees */
+    warn_scan (&header, RADecDegKeyword,  "%f", 1, &spectrum[0].ra);
+    warn_scan (&header, DECDecDegKeyword, "%f", 1, &spectrum[0].dec);
+  } else {
+    if (RASexigKeyword[0] & DECSexigKeyword[0]) {
+      /* expect RA & DEC in hh:mm:ss, dd:mm:ss */
+      warn_scan (&header, RASexigKeyword,  "%s", 1, line);
+      dms_to_ddd (&tmp, line);
+      spectrum[0].ra = 15*tmp;
+      warn_scan (&header, DECSexigKeyword, "%s", 1, &line);
+      dms_to_ddd (&tmp, line);
+      spectrum[0].dec = tmp;
+    }
+  }
+
+  /* for now we will not try to determine the mode, state, or 
+     wavelength ranges from the header.  set these with -modify
+     or on the command line on insert.  later on, we can add the logic */
+  
+  spectrum[0].mode  = SPMODE_UKN;
+  spectrum[0].state = SPSTATE_UKN;
+  spectrum[0].Nspec = 1;
+  spectrum[0].flag  = 0;
+  
+  { 
+    int Nx;
+    float crpix, crval, cd11;
+
+    warn_scan (&header, "CRPIX1", "%f", 1, &crpix);
+    warn_scan (&header, "CRVAL1", "%f", 1, &crval);
+    if (!fits_scan (&header, "CDELT1", "%f", 1, &cd11))
+      warn_scan (&header, "CD1_1", "%f", 1, &cd11);
+    
+    fits_scan (&header, "NAXIS1", "%d", 1, &Nx);
+
+    spectrum[0].Ws = (1  - crpix)*cd11 + crval;
+    spectrum[0].We = (Nx - crpix)*cd11 + crval;
+    spectrum[0].dW = cd11;
+  }
+  
+  strcpy (spectrum[0].extname, "PHU");
+  
+  return (spectrum);
+
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/unique.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/unique.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/spreg/unique.c	(revision 21753)
@@ -0,0 +1,57 @@
+# include "imregister.h"
+# include "spreg.h"
+
+/* input is a subset index of spectrum list, output is a new subset */
+int *unique_entries (Spectrum *spectrum, int Nspectrum, int *subset, int *Nmatch) {
+
+  int i, j, m, Nsubset;
+  int N, NMATCH;
+  int *match, *entry;
+  char idxline[128];
+  char **index;
+
+  if (!output.unique) return (subset);
+
+  /* create output index */
+  N = 0;
+  NMATCH = 1000;
+  ALLOCATE (match, int, NMATCH);
+
+  Nsubset = *Nmatch;
+
+  /* index = filename */
+  ALLOCATE (index, char *, Nsubset);
+  ALLOCATE (entry, int, Nsubset);
+  for (i = 0; i < Nsubset; i++) {
+    sprintf (idxline, "%s", spectrum[subset[i]].filename);
+    index[i] = strcreate (idxline);
+    entry[i] = subset[i];
+  }
+  sortstr (index, entry, Nsubset);
+
+  /* find unique sequences */
+  for (i = 0; i < Nsubset; ) {
+    for (j = i + 1; (j < Nsubset) && (!strcmp (index[i], index[j])); j++);
+    m = i;
+    
+    /* add unique entry to output list */
+    match[N] = entry[m];
+    N ++;
+    if (N == NMATCH) {
+      NMATCH += 1000;
+      REALLOCATE (match, int, NMATCH);
+    }
+
+    /* j always points to the next entry */
+    i = j;
+  }
+
+  for (i = 0; i < Nsubset; i++) free (index[i]);
+  free (index);
+  free (entry);
+  free (subset);
+
+  *Nmatch = N;
+  return (match);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/cameraconfig.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/cameraconfig.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/cameraconfig.c	(revision 21753)
@@ -0,0 +1,262 @@
+# include "imregister.h"
+static char *version = "cameraconfig $Revision: 1.3 $";
+
+void usage ();
+
+int main (int argc, char **argv) {
+
+  int i, Nccd, Nx, Ny, mosaic_x, mosaic_y, N, use_biassec;
+  int dx, dy;
+  char *config, *file;
+  char CameraConfig[256];
+  char field[64], line[256], keyword[64];
+  char ID[64], *IDsel;
+  double x, y, Xo, Yo, theta;
+  int Choice, GetID, SEQ, GetN, Nsel;
+  int NCCD, AXES, CCDS, CCDN, XOFF, YOFF, XFLIP, YFLIP, XO, YO, THETA;
+  int AXIS0, AXIS1, MOSAIC_X, MOSAIC_Y, DATASEC, BIASSEC, USE_BIASSEC;
+  char datasec[64], biassec[64];
+
+  bzero (ID, 64);
+  get_version (argc, argv, version);
+
+  /*** load configuration info ***/
+  file = SelectConfigFile (&argc, argv, "ptolemy");
+  config = LoadConfigFile (file);
+  if (config == (char *) NULL) {
+    fprintf (stderr, "ERROR: can't find configuration file %s\n", file);
+    if (file != (char *) NULL) free (file);
+    exit (1);
+  }
+  if (!ScanConfig (config, "CAMERA_CONFIG", "%s", 0, CameraConfig)) {
+    fprintf (stderr, "ERROR: can't find CAMERA_CONFIG in configuration file\n");
+    exit (1);
+  }
+  free (config);
+  free (file);
+
+  /* load camera config file */
+  config = LoadConfigFile (CameraConfig);
+  if (config == (char *) NULL) {
+    fprintf (stderr, "ERROR: can't find camera config file %s\n", CameraConfig);
+    exit (1);
+  }
+
+  if (argc == 1) { 
+    fprintf (stderr, "USAGE: cameraconfig [-options]\n");
+    fprintf (stderr, "using %s for config information\n", CameraConfig);
+    exit (1);
+  }
+
+  /* command line options */
+  if ((N = get_argument (argc, argv, "-h"))) usage ();
+
+  /* command line options */
+  NCCD = FALSE;
+  if ((N = get_argument (argc, argv, "-Nccd"))) {
+    remove_argument (N, &argc, argv);
+    NCCD = TRUE;
+  }
+
+  AXES = FALSE;
+  if ((N = get_argument (argc, argv, "-axes"))) {
+    remove_argument (N, &argc, argv);
+    AXES = TRUE;
+  }
+
+  AXIS0 = FALSE;
+  if ((N = get_argument (argc, argv, "-axis0"))) {
+    remove_argument (N, &argc, argv);
+    AXIS0 = TRUE;
+  }
+
+  AXIS1 = FALSE;
+  if ((N = get_argument (argc, argv, "-axis1"))) {
+    remove_argument (N, &argc, argv);
+    AXIS1 = TRUE;
+  }
+
+  MOSAIC_X = FALSE;
+  if ((N = get_argument (argc, argv, "-mosaicx"))) {
+    remove_argument (N, &argc, argv);
+    MOSAIC_X = TRUE;
+  }
+  MOSAIC_Y = FALSE;
+  if ((N = get_argument (argc, argv, "-mosaicy"))) {
+    remove_argument (N, &argc, argv);
+    MOSAIC_Y = TRUE;
+  }
+
+  CCDS = FALSE;
+  if ((N = get_argument (argc, argv, "-ccds"))) {
+    remove_argument (N, &argc, argv);
+    CCDS = TRUE;
+  }
+
+  CCDN = FALSE;
+  if ((N = get_argument (argc, argv, "-ccdn"))) {
+    remove_argument (N, &argc, argv);
+    CCDN = TRUE;
+  }
+
+  SEQ = FALSE;
+  if ((N = get_argument (argc, argv, "-seq"))) {
+    remove_argument (N, &argc, argv);
+    SEQ = TRUE;
+  }
+
+  XOFF = FALSE;
+  if ((N = get_argument (argc, argv, "-xoff"))) {
+    remove_argument (N, &argc, argv);
+    XOFF = TRUE;
+  }
+
+  YOFF = FALSE;
+  if ((N = get_argument (argc, argv, "-yoff"))) {
+    remove_argument (N, &argc, argv);
+    YOFF = TRUE;
+  }
+
+  XO = FALSE;
+  if ((N = get_argument (argc, argv, "-Xo"))) {
+    remove_argument (N, &argc, argv);
+    XO = TRUE;
+  }
+
+  YO = FALSE;
+  if ((N = get_argument (argc, argv, "-Yo"))) {
+    remove_argument (N, &argc, argv);
+    YO = TRUE;
+  }
+
+  THETA = FALSE;
+  if ((N = get_argument (argc, argv, "-theta"))) {
+    remove_argument (N, &argc, argv);
+    THETA = TRUE;
+  }
+
+  XFLIP = FALSE;
+  if ((N = get_argument (argc, argv, "-xflip"))) {
+    remove_argument (N, &argc, argv);
+    XFLIP = TRUE;
+  }
+
+  YFLIP = FALSE;
+  if ((N = get_argument (argc, argv, "-yflip"))) {
+    remove_argument (N, &argc, argv);
+    YFLIP = TRUE;
+  }
+
+  DATASEC = FALSE;
+  if ((N = get_argument (argc, argv, "-datasec"))) {
+    remove_argument (N, &argc, argv);
+    DATASEC = TRUE;
+  }
+  BIASSEC = FALSE;
+  if ((N = get_argument (argc, argv, "-biassec"))) {
+    remove_argument (N, &argc, argv);
+    BIASSEC = TRUE;
+  }
+  USE_BIASSEC = FALSE;
+  if ((N = get_argument (argc, argv, "-usebiassec"))) {
+    remove_argument (N, &argc, argv);
+    USE_BIASSEC = TRUE;
+  }
+
+  GetID = FALSE;
+  Nsel = 0;
+  if ((N = get_argument (argc, argv, "-ID"))) {
+    GetID = TRUE;
+    remove_argument (N, &argc, argv);
+    Nsel = atoi (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  GetN = FALSE;
+  IDsel = NULL;
+  if ((N = get_argument (argc, argv, "-N"))) {
+    GetN = TRUE;
+    remove_argument (N, &argc, argv);
+    IDsel = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  if (argc != 1) { 
+    fprintf (stderr, "USAGE: cameraconfig [-options]\n");
+    exit (1);
+  }
+
+  /* load data from config file */
+  ScanConfig (config, "NCCD", "%d", 1, &Nccd);
+  ScanConfig (config, "NAXIS1", "%d", 1, &Nx);
+  ScanConfig (config, "NAXIS2", "%d", 1, &Ny);
+  ScanConfig (config, "MOSAIC_X", "%d", 1, &mosaic_x);
+  ScanConfig (config, "MOSAIC_Y", "%d", 1, &mosaic_y);
+  ScanConfig (config, "USE_BIASSEC", "%d", 1, &use_biassec);
+  
+  if (NCCD) fprintf (stdout, "%d\n", Nccd);
+  if (AXES) fprintf (stdout, "%d %d\n", Nx, Ny);
+  if (AXIS0) fprintf (stdout, "%d\n", Nx);
+  if (AXIS1) fprintf (stdout, "%d\n", Ny);
+  if (MOSAIC_X) fprintf (stdout, "%d\n", mosaic_x);
+  if (MOSAIC_Y) fprintf (stdout, "%d\n", mosaic_y);
+  if (USE_BIASSEC) fprintf (stdout, "%d\n", use_biassec);
+  
+  ScanConfig (config, "CHIPID_KEYWORD", "%s", 1, keyword);
+  
+  Choice = SEQ || CCDS || CCDN || XOFF || YOFF || XFLIP || YFLIP || DATASEC || BIASSEC || XO || YO || THETA;
+
+  for (i = 0; i < Nccd; i++) {
+    sprintf (field, "CCD.%d", i);
+    ScanConfig (config, field, "%s", 1, line);
+    sscanf (line, "%s %lf %lf %d %d %s %s %lf %lf %lf", 
+	    ID, &x, &y, &dx, &dy, datasec, biassec, &Xo, &Yo, &theta);
+
+    if (GetN  && strnumcmp (IDsel, ID)) fprintf (stdout, "%d\n", i);
+    if (GetID && (Nsel == i)) fprintf (stdout, "%s\n", ID);
+    if (SEQ)     fprintf (stdout, "%d ", i);
+    if (CCDS)    fprintf (stdout, "%s ", ID);
+    if (CCDN)    fprintf (stdout, "%02d", i);
+    if (XOFF)    fprintf (stdout, "%f ", x);
+    if (YOFF)    fprintf (stdout, "%f ", y);
+    if (XFLIP)   fprintf (stdout, "%d ", dx);
+    if (YFLIP)   fprintf (stdout, "%d ", dy);
+    if (DATASEC) fprintf (stdout, "%s ", datasec);
+    if (BIASSEC) fprintf (stdout, "%s ", biassec);
+
+    if (XO)      fprintf (stdout, "%7.1f ", Xo);
+    if (YO)      fprintf (stdout, "%7.1f ", Yo);
+    if (THETA)   fprintf (stdout, "%7.3f ", theta);
+
+    if (Choice) fprintf (stdout, "\n");
+
+  }
+
+  exit (0);
+}
+
+void usage () {
+
+  fprintf (stderr, "cameraconfig [option] : lookup camera parameters\n");
+  fprintf (stderr, "   -Nccd         : number of CCDs\n");
+  fprintf (stderr, "   -axes         : x & y dimensions\n");
+  fprintf (stderr, "   -axis0        : x dimension (CCD)\n");
+  fprintf (stderr, "   -axis1        : y dimension (CCD)\n");
+  fprintf (stderr, "   -mosaicx      : x dimension (mosaic)\n");
+  fprintf (stderr, "   -mosaicy      : y dimension (mosaic)\n");
+  fprintf (stderr, "   -usebiassec   : use header BIASSEC\n");
+
+  fprintf (stderr, "   -seq          : chip sequence number\n");
+  fprintf (stderr, "   -ccds         : chip extension ID\n");
+  fprintf (stderr, "   -xoff         : x offset in mosaic\n");
+  fprintf (stderr, "   -yoff         : y offset in mosaic\n");
+  fprintf (stderr, "   -xflip        : x flip in mosaic\n");
+  fprintf (stderr, "   -yflip        : y flip in mosaic\n");
+  fprintf (stderr, "   -datasec      : DATASEC value\n");
+  fprintf (stderr, "   -biassec      : BIASSEC value\n");
+
+  fprintf (stderr, "   -ID [N]       : return ID for seq\n");
+  fprintf (stderr, "   -N [ID]       : return seq for ID\n");
+  exit (2);
+
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/convertimreg.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/convertimreg.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/convertimreg.c	(revision 21753)
@@ -0,0 +1,60 @@
+# include "imregister.h"
+# include "imreg.h"
+static char *version = "convertimreg $Revision: 3.3 $";
+
+int main (int argc, char **argv) {
+ 
+  FILE *f;
+  Header header;
+  RegImage *pimage;
+  int i, Nimage, status, lockstate, dbstate;
+  int *match;
+  
+  get_version (argc, argv, version);
+  ConfigInit (&argc, argv);
+  ConfigCamera ();
+  ConfigFilter ();
+  
+  if (argc != 3) {
+    fprintf (stderr, "USAGE: convertregdb (input) (output)\n");
+    fprintf (stderr, "       convert old pseudo-FITS table imreg db to FITS table\n");
+    exit (1);
+  }
+  
+  /* load old-style pseudo-FITS table db */
+  lockstate = LCK_SOFT;
+
+  /* lock database (soft) */
+  f = fsetlockfile (argv[1], 300.0, lockstate, &dbstate);
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "ERROR: can't open db\n");
+    exit (1);
+  }
+  Fseek (f, 0, SEEK_SET);
+
+  /* load in database header */
+  if (!fits_load_header (f, &header)) {
+    fprintf (stderr, "ERROR: trouble reading database header\n");
+    fclearlockfile (argv[1], f, lockstate, &dbstate);
+    exit (1);
+  }
+
+  /* load existing data from database */
+  fits_scan (&header, "NIMAGES", "%d", 1, &Nimage);
+  ALLOCATE (pimage, RegImage, Nimage);
+  status = fread (pimage, sizeof(RegImage), Nimage, f);
+  if (status != Nimage) {
+    fprintf (stderr, "ERROR: header and data in dB don't match (%d vs %d)\n", Nimage, status);
+    fclearlockfile (argv[1], f, lockstate, &dbstate);
+    exit (1);
+  }
+  fclearlockfile (argv[1], f, lockstate, &dbstate);
+  fits_convert_RegImage (pimage, sizeof (RegImage), Nimage);
+
+  /* create complete subset */
+  ALLOCATE (match, int, Nimage);
+  for (i = 0; i < Nimage; i++) match[i] = i;
+
+  DumpFitsBintable (argv[2], pimage, match, Nimage);
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/detregister.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/detregister.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/detregister.c	(revision 21753)
@@ -0,0 +1,95 @@
+# include "imregister.h"
+# include "detrend.h"
+static char *version = "detregister $Revision: 3.4 $";
+
+int main (int argc, char **argv) {
+ 
+  char *dBFile;
+  DetReg newdata;
+  Descriptor descriptor;
+  FITS_DB db;
+  
+  get_version (argc, argv, version);
+  regargs (argc, argv, &descriptor);
+  DefineImage (argv[1], &descriptor);
+
+  newdata = DefineEntry (descriptor);
+  SaveEntry (argv[1], &newdata, descriptor.imageID);
+
+  db.lockstate = LCK_HARD;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  dBFile = set_dBFile ();
+  if (!fits_db_lock (&db, dBFile)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  if (db.dbstate == LCK_EMPTY) {
+    fits_db_create (&db);    
+    fits_table_set_DetReg (&db.ftable, NULL, 0);
+  } else {  
+    if (!fits_db_load (&db)) {
+      fprintf (stderr, "ERROR: failure to load db\n");
+      fits_db_close (&db);
+      exit (1);
+    }
+  }
+
+  fits_convert_DetReg (&newdata, sizeof (DetReg), 1);
+  fits_table_to_vtable (&db.ftable, &db.vtable, 0, 0);
+  fits_vadd_rows (&db.vtable, (char *) &newdata, 1, sizeof(DetReg));
+
+  fits_db_update (&db);
+  fits_db_close (&db);
+  fits_db_free (&db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+}
+
+/* detrend files created by mkdetrend have names of the following form:
+   
+   TYPE.CCD.FILTER.CRUN.NUMBER.fits 
+   
+   ie:
+   
+   bias.02.0.01Ak3.0.fits
+   
+   When they are registered, the NUMBER component needs to be
+   updated to match the next available number.
+   
+   This is a bit tricky.  We can easily identify 
+   TYPE, CCD, FILTER, and extrapolate to the NUMBER, but 
+   unambiguously identifying the CRUN is harder.  We could make it a 
+   required keyword on the command line, or insert it in the
+   image header and request it if it doesn't exist?
+
+    required fields:
+
+    tstart
+    tstop
+    type
+    ccd
+
+    filename (automatic)
+    treg (automatic)
+
+    case type 
+      flat:
+      ring:
+      scat:
+        filter is required
+      default:
+        filter is none
+
+    case type
+      dark:
+        exptime is required
+      bias:
+        exptime is 0.0
+      default:
+        exptime is NaN
+
+*/
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/detsearch.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/detsearch.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/detsearch.c	(revision 21753)
@@ -0,0 +1,91 @@
+# include "imregister.h"
+# include "detrend.h"
+static char *version = "detsearch $Revision: 3.7 $";
+
+int main (int argc, char **argv) {
+ 
+  int Nmatch, Ndetrend;
+  char *dBFile;
+  FITS_DB db;
+  Match *match;
+  DetReg *detrend;
+
+  /* args searches the argument list and generates an array of criteria */
+  get_version (argc, argv, version);
+  args (argc, argv);
+
+  if (output.Criteria) PrintCriteria ();
+	
+  db.lockstate = (output.Modify || output.Delete) ? LCK_HARD : LCK_SOFT;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  dBFile = set_dBFile ();
+  if (!fits_db_lock (&db, dBFile)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  
+  if (!fits_db_load (&db)) {
+    fprintf (stderr, "ERROR: failure to load db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+
+  if (!output.Modify && !output.Delete && !output.Altpath) fits_db_close (&db);
+  detrend = fits_table_get_DetReg (&db.ftable, &Ndetrend, &db.swapped);
+  
+  match = MatchCriteria (detrend, Ndetrend, &Nmatch);          /* match basic criteria */
+  match = ExptimeCriteria (detrend, Ndetrend, match, &Nmatch); /* reduce matches based on Exptime */
+  match = CloseCriteria (detrend, Ndetrend, match, &Nmatch);   /* reduce matches based on closeness */
+
+  if (output.Select) {
+    match = UniqueSubset (detrend, Ndetrend, match, &Nmatch);
+    if (Nmatch == 0) {
+      if (output.verbose) fprintf (stderr, "ERROR: can't find any valid detrend files (%s %s %d)\n", get_type_name(criteria[0].Type), filtername[criteria[0].Filter], criteria[0].CCD);
+      fits_db_close (&db);
+      exit (1);
+    }
+  }
+
+  if (output.Altpath) SetAltpath (&db, detrend, Ndetrend, match, Nmatch);
+  if (output.Modify) ModifySubset (&db, detrend, Ndetrend, match, Nmatch);
+  if (output.Delete) DeleteSubset (&db, detrend, Ndetrend, match, Nmatch);
+
+  OutputSubset (detrend, Ndetrend, match, Nmatch);
+  exit (0);
+}
+
+/*
+
+selection options:
+
+CCDSelect
+TypeSelect
+TimeSelect
+FilterSelect
+ExptimeSelect
+EntrySelect
+LabelSelect
+
+
+ functional modes:
+
+   1) list - list all images that apply to a restrictive set of criteria
+   
+   2) select - choose the reference image(s)
+
+   3) delete - delete a set of images
+
+   4) modify - alter fields for a set of images
+
+   
+   methods to define criteria
+
+   - command line  [-time -type -ccd -filter -exptime]
+   - image  -> define time, filter, ccd
+   - mosaic -> define time, filter, exptime
+   - recipe -> defile type list based on filter
+
+*/
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/filtnames.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/filtnames.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/filtnames.c	(revision 21753)
@@ -0,0 +1,168 @@
+# include "imregister.h"
+static char *version = "filtnames $Revision: 1.2 $";
+
+typedef struct {
+  int code, calibrated;
+  char name[64], ref[64], c1[64], c2[64];
+} FiltCode;
+
+int main (int argc, char **argv) {
+
+  int i, code, Ncode, Nmatch, Nfield, N, Select, CalibrationData;
+  int Nfiltcode, NFILTCODE;
+  char *config, *file, *target;
+  char FilterList[256];
+  char name[64], ref[64], c1[64], c2[64], line[256], *c;
+  FILE *f;
+  FiltCode *filtcode;
+
+  get_version (argc, argv, version);
+
+  /*** load configuration info ***/
+  file = SelectConfigFile (&argc, argv, "ptolemy");
+  config = LoadConfigFile (file);
+  if (config == (char *) NULL) {
+    fprintf (stderr, "ERROR: can't find configuration file %s\n", file);
+    if (file != (char *) NULL) free (file);
+    exit (0);
+  }
+  if (!ScanConfig (config, "FILTER_LIST", "%s", 0, FilterList)) {
+    fprintf (stderr, "ERROR: can't find FILTER_LIST in configuration file\n");
+    exit (1);
+  }
+  free (config);
+  free (file);
+
+  /* image type (dark, flat, bias, etc) */
+  Select = TRUE;
+  if ((N = get_argument (argc, argv, "-all"))) {
+    remove_argument (N, &argc, argv);
+    Select = FALSE;
+  }
+ 
+  /* image type (dark, flat, bias, etc) */
+  CalibrationData = FALSE;
+  if ((N = get_argument (argc, argv, "-cal"))) {
+    remove_argument (N, &argc, argv);
+    CalibrationData = TRUE;
+  }
+ 
+  if (argc != 2) { 
+    fprintf (stderr, "USAGE: filtnames (filtername)\n");
+    fprintf (stderr, "       filtnames list : list all unique filters\n");
+    fprintf (stderr, "       [-all] : list all names for given filter(s)\n");
+    fprintf (stderr, "       [-cal] : print calibration data for filter(s)\n");
+    exit (1);
+  }
+
+  target = argv[1];
+  for (i = 0; i < strlen (target); i++) { if (isspace (target[i])) target[i] = '.'; }
+
+  /* open filter list file */
+  f = fopen (FilterList, "r");
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "error reading photcodes\n");
+    exit (1);
+  }
+
+  /* load filter list & codes */
+  NFILTCODE = 100;
+  Nfiltcode = 0;
+  ALLOCATE (filtcode, FiltCode, NFILTCODE);
+
+  while (scan_line (f, line) != EOF) {
+    for (c = line; isspace (*c); c++);
+    if (*c == '#') continue;
+    if (*c == 0) continue;
+    Nfield = sscanf (c, "%d %s %s %s %*s %s", &code, name, ref, c1, c2);
+    if ((Nfield != 2) && (Nfield != 5)) {
+      fprintf (stderr, "error reading line: %s\n", c);
+      exit (1);
+    }
+
+    filtcode[Nfiltcode].code = code;
+    filtcode[Nfiltcode].calibrated = FALSE;
+    strcpy (filtcode[Nfiltcode].name, name);
+    filtcode[Nfiltcode].ref[0] = 0;
+    filtcode[Nfiltcode].c1[0] = 0;
+    filtcode[Nfiltcode].c2[0] = 0;
+    if (Nfield == 5) {
+      filtcode[Nfiltcode].calibrated = TRUE;
+      strcpy (filtcode[Nfiltcode].ref, ref);
+      strcpy (filtcode[Nfiltcode].c1, c1);
+      strcpy (filtcode[Nfiltcode].c2, c2);
+    }
+    Nfiltcode ++;
+
+    if (Nfiltcode == NFILTCODE - 1) {
+      NFILTCODE += 100;
+      REALLOCATE (filtcode, FiltCode, NFILTCODE);
+    }
+  }
+
+  /* special target: list -- list all filters */
+  if (!strcasecmp (target, "list")) {
+    
+    int *uniq, Nuniq, j, found;
+    ALLOCATE (uniq, int, Nfiltcode);
+
+    /* identify unique filter codes */
+    Nuniq = 0;
+    for (i = 0; i < Nfiltcode; i++) {
+      found = FALSE;
+      for (j = 0; !found && (j < Nuniq); j++) {
+	if (filtcode[i].code == uniq[j]) found = TRUE;
+      }
+      if (found) continue;
+      uniq[Nuniq] = filtcode[i].code;
+      Nuniq ++;
+    }
+
+    /* list the entries of the unique codes.  skip code == 0 (none) */
+    for (i = 0; i < Nuniq; i++) {
+      if (uniq[i] == 0) continue;
+      for (j = 0; j < Nfiltcode; j++) {
+	if (uniq[i] != filtcode[j].code) continue;
+	if (CalibrationData) {
+	  fprintf (stdout, "%s %d %s %s %s\n", filtcode[j].name, filtcode[j].calibrated, filtcode[j].ref, filtcode[j].c1, filtcode[j].c2);
+	} else {
+	  fprintf (stdout, "%s\n", filtcode[j].name);
+	}
+	if (Select) break;
+      }
+    }
+    exit (0);
+  }
+
+  /* find given name in filter list (case insensitive) */
+  Ncode = 0;
+  for (i = 0; i < Nfiltcode; i++) {
+    if (strcasecmp (target, filtcode[i].name)) continue;
+    Ncode = filtcode[i].code;
+    break;
+  }
+  if (!Ncode) {
+    fprintf (stderr, "no filter match found\n");
+    exit (1);
+  }
+
+  /* find first entry with this code */
+  Nmatch = 0;
+  for (i = 0; i < Nfiltcode; i++) {
+    if (Ncode != filtcode[i].code) continue;
+    if (CalibrationData) {
+      fprintf (stdout, "%s %d %s %s %s\n", filtcode[i].name, filtcode[i].calibrated, filtcode[i].ref, filtcode[i].c1, filtcode[i].c2);
+    } else {
+      fprintf (stdout, "%s\n", filtcode[i].name);
+    }
+    Nmatch ++;
+    if (Select) break;
+  }
+
+  if (!Nmatch) {
+    fprintf (stderr, "no filter code error: code mis-match\n");
+    exit (1);
+  }
+
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imphotmerge.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imphotmerge.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imphotmerge.c	(revision 21753)
@@ -0,0 +1,183 @@
+# include "imregister.h"
+
+/*** this needs to be written using dvo_image functions !!! ***/
+
+Image *LoadImageTable (FILE *f, Header *header, int *nimage);
+static char *version = "imphotcopy $Revision: 1.4 $";
+
+int main (int argc, char **argv) {
+ 
+  Header header, theader;
+  Image *image, *input;
+  FILE *f, *g;
+  int i, j, status, N;
+  char *dBFile;
+  int Nimage, Ninput, *index, Ntimes;
+  unsigned long *tstart, *tstop;
+  int VERBOSE, PHOTCODE, dbstate;
+  int PhotCodeSelect, Nin;
+  char *FitsOutput, *NameSelect;
+  int NameSelectLength;
+
+  get_version (argc, argv, version);
+  ConfigInit (&argc, argv);
+
+  /* load photcode data */
+  if (!LoadPhotcodes (PhotCodeFile)) {
+    fprintf (stderr, "error loading photcodes from %s\n", PhotCodeFile);
+    exit (1);
+  }
+
+  /* interpret command-line arguments */
+  if (!get_trange_arguments (&argc, argv, &tstart, &tstop, &Ntimes)) {
+    fprintf (stderr, "ERROR: syntax error\n");
+    exit (1);
+  }
+
+  /* select by image photcode */
+  PhotCodeSelect = FALSE;
+  PHOTCODE = 0;
+  if ((N = get_argument (argc, argv, "-photcode"))) {
+    remove_argument (N, &argc, argv);
+    if (!(PHOTCODE = GetPhotcodeCodebyName (argv[N]))) {
+      fprintf (stderr, "ERROR: photcode not found in photcode table\n");
+      exit (1);
+    }
+    remove_argument (N, &argc, argv);
+    PhotCodeSelect = TRUE;
+  }
+
+  /* string in image name */
+  NameSelect = (char *) NULL;
+  NameSelectLength = 0;
+  if ((N = get_argument (argc, argv, "-name"))) {
+    remove_argument (N, &argc, argv);
+    NameSelect = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    NameSelectLength = strlen (NameSelect);
+  }
+
+  FitsOutput = (char *) NULL;
+  if ((N = get_argument (argc, argv, "-fits"))) {
+    remove_argument (N, &argc, argv);
+    FitsOutput = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  VERBOSE = FALSE;
+  if ((N = get_argument (argc, argv, "-v"))) {
+    remove_argument (N, &argc, argv);
+    VERBOSE = TRUE;
+  }
+
+  if (argc != 3) {
+    fprintf (stderr, "USAGE: imphotmerge (input) (target) [config ops] [-trange start stop/delta] [-photcode code]\n");
+    exit (1);
+  }
+ 
+  /* load image database - still a non-FITS file */
+  dBFile = argv[2];
+
+  f = fsetlockfile (dBFile, 120.0, LCK_HARD, &dbstate);
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "ERROR: can't set lock on %s, state is %d\n", dBFile, dbstate);
+    exit (1);
+  }
+  image = LoadImageTable (f, &header, &Nimage);
+
+  /* load input table */
+  g = fopen (argv[1], "r");
+  if (g == (FILE *) NULL) {
+    fprintf (stderr, "error opening input data file\n");
+    exit (1);
+  }
+  input = LoadImageTable (g, &theader, &Ninput);
+  fclose (g);
+
+  /* allocate space for reference lists */
+  Nin = 0;
+  ALLOCATE (index, int, Ninput);
+  
+  /* these filters are applied to input NOT image */
+  for (i = 0; i < Ninput; i++) {
+    for (j = 0, status = FALSE; !status && (j < Ntimes); j++) {
+      status = (input[i].tzero >= tstart[j]) && (input[i].tzero <= tstop[j]);
+    }
+    if (!status && Ntimes) continue;
+    if (PhotCodeSelect && (input[i].source != PHOTCODE)) continue;
+    if ((NameSelect != (char *) NULL) && (strncasecmp (input[i].name, NameSelect, NameSelectLength))) continue;
+
+    index[Nin] = i;
+    Nin ++;
+  }
+
+  /* add new images to images */
+  REALLOCATE (image, Image, Nimage + Nin);
+  for (j = 0, i = Nimage; i < Nimage + Nin; i++, j++) {
+    image[i] = input[index[j]];
+  }
+  Nimage += Nin;
+  fits_modify (&header, "NIMAGES", "%d", 1, Nimage);
+
+  /* position to begining of file to write header */
+  fseek (f, 0, SEEK_SET);
+  status = Fwrite (header.buffer, 1, header.size, f, "char");
+  if (status != header.size) {
+    fprintf (stderr, "ERROR: failed writing data to image header\n");
+    exit (0);
+  }
+
+  /* position to end of file for new image data */
+  fseek (f, header.size, SEEK_SET);
+  status = Fwrite (image, sizeof(Image), Nimage, f, "image");
+  if (status != Nimage) {
+    fprintf (stderr, "ERROR: failed writing data to image catalog\n");
+    exit (0);
+  }
+
+  fclearlockfile (dBFile, f, LCK_HARD, &dbstate);
+
+  if (VERBOSE) fprintf (stderr, "SUCCESS\n");
+  exit (0);
+
+}
+
+Image *LoadImageTable (FILE *f, Header *header, int *nimage) {
+
+  int Nimage, Ndata, Nread, size;
+  struct stat filestatus;
+  Image *image;
+
+  /* read header */
+  if (!fits_fread_header (f, header)) {
+    fprintf (stderr, "ERROR: can't read image catalog\n");
+    exit (1);
+  }
+
+  /* check that file size makes sense */
+  Nimage = 0;
+  fits_scan (header, "NIMAGES", "%d", 1, &Nimage);
+  if (fstat (fileno(f), &filestatus) == -1) {
+    fprintf (stderr, "ERROR: failed to get status of image catalog\n");
+    exit (1);
+  }
+  size = Nimage*sizeof(Image) + header[0].size;
+  if (size != filestatus.st_size) {
+    Ndata = (filestatus.st_size - header[0].size) / sizeof (Image);
+    fprintf (stderr, "ERROR: image catalog has inconsistent size\n");
+    fprintf (stderr, "header: %d, data: %d\n", Nimage, Ndata);
+    Nimage = Ndata;
+  } 
+
+  /* alloc, read images */
+  ALLOCATE (image, Image, MAX (Nimage, 1));
+  Nread = Fread (image, sizeof(Image), Nimage, f, "image");
+  if (Nread != Nimage) {
+    fprintf (stderr, "ERROR: problem loading image catalog\n");
+    exit (1);
+  } 
+
+  *nimage = Nimage;
+  return (image);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imphotsearch.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imphotsearch.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imphotsearch.c	(revision 21753)
@@ -0,0 +1,44 @@
+# include "imregister.h"
+# include "imphot.h"
+
+static char *version = "imphotsearch $Revision: 1.9 $";
+
+int main (int argc, char **argv) {
+ 
+  int Nmatch, Nimage;
+  int *match;
+  Image *image;
+  FITS_DB db;
+
+  get_version (argc, argv, version);
+  args (argc, argv);
+ 
+  db.lockstate = (options.modify) ? LCK_HARD : LCK_SOFT;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  /* don't create a new image table if not available */
+  if (!fits_db_lock (&db, ImPhotDB)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  /* we use a varient of fits_db_load since the file may be in text format */
+  if (!dvo_image_load (&db, VERBOSE, FORCE_READ)) {
+    fprintf (stderr, "ERROR: failure to load db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  if (!options.modify) fits_db_close (&db);
+
+  image = fits_table_get_Image (&db.ftable, &Nimage, &db.swapped);
+
+  match = subset (image, Nimage, &Nmatch);
+  if (options.modify) ModifySubset (&db, image, Nimage, match, Nmatch);
+
+  output (image, match, Nmatch);
+
+  if (VERBOSE) fprintf (stderr, "SUCCESS\n");
+  exit (0);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imregister.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imregister.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imregister.c	(revision 21753)
@@ -0,0 +1,52 @@
+# include "imregister.h"
+# include "imreg.h"
+static char *version = "imregister $Revision: 3.7 $";
+
+int main (int argc, char **argv) {
+ 
+  int Nregimage;
+  RegImage *image, *regimage;
+  FITS_DB db;
+
+  get_version (argc, argv, version);
+  args (argc, argv);
+
+  image = iminfo (argv[1]);
+  regimage = newimages (image, &Nregimage);
+
+  if (NoReg) goto skip_reg;
+
+  db.lockstate = LCK_HARD;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  if (!fits_db_lock (&db, ImageDB)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  if (db.dbstate == LCK_EMPTY) {
+    fits_db_create (&db);
+    fits_table_set_RegImage (&db.ftable, NULL, 0);
+  } else {  
+    if (!fits_db_load (&db)) {
+      fprintf (stderr, "ERROR: failure to load db\n");
+      fits_db_close (&db);
+      exit (1);
+    }
+  }
+
+  fits_convert_RegImage (regimage, sizeof (RegImage), Nregimage);
+  fits_table_to_vtable (&db.ftable, &db.vtable, 0, 0);
+  fits_vadd_rows (&db.vtable, (char *) regimage, Nregimage, sizeof(RegImage));
+
+  fits_db_update (&db);
+  fits_db_close (&db);
+  fits_db_free (&db);
+
+skip_reg:
+  if (IMSORT) SubmitImages (image);
+  fprintf (stderr, "SUCCESS: registered %s\n", argv[1]);
+  exit (0);
+}
+
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imregtable.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imregtable.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imregtable.c	(revision 21753)
@@ -0,0 +1,68 @@
+# include "imregister.h"
+# include "imreg.h"
+static char *version = "imregtable $Revision: 3.7 $";
+
+int main (int argc, char **argv) {
+ 
+  int Nimage;
+  char *infile;
+  RegImage *image;
+  Header header;
+  Header theader;
+  Matrix matrix;
+  FTable ftable;
+  FITS_DB db;
+
+  get_version (argc, argv, version);
+  ConfigInit (&argc, argv);
+  ConfigCamera ();
+  ConfigFilter ();
+
+  if (argc != 2) {
+    fprintf (stderr, "USAGE: imregtable (table)\n");
+    exit (1);
+  }
+
+  /* load in table data */
+  infile = argv[1];
+
+  /* need to error check these */
+  ftable.header = &theader;
+  fits_read_header  (infile, &header);
+  fits_read_matrix  (infile, &matrix);
+  fits_read_ftable  (infile, &ftable, "IMAGE_DATABASE");
+
+  image = fits_table_get_RegImage (&ftable, &Nimage, NULL);
+
+  /* load database table */
+  db.lockstate = LCK_HARD;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  if (!fits_db_lock (&db, ImageDB)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  if (db.dbstate == LCK_EMPTY) {
+    fits_db_create (&db);
+    fits_table_set_RegImage (&db.ftable, NULL, 0);
+  } else {  
+    if (!fits_db_load (&db)) {
+      fprintf (stderr, "ERROR: failure to load db\n");
+      fits_db_close (&db);
+      exit (1);
+    }
+  }
+
+  fits_convert_RegImage (image, sizeof (RegImage), Nimage);
+  fits_table_to_vtable (&db.ftable, &db.vtable, 0, 0);
+  fits_vadd_rows (&db.vtable, (char *) image, Nimage, sizeof(RegImage));
+
+  fits_db_update (&db);
+  fits_db_close (&db);
+  fits_db_free (&db);
+
+  fprintf (stderr, "SUCCESS: registered %s\n", argv[1]);
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imsearch.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imsearch.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imsearch.c	(revision 21753)
@@ -0,0 +1,73 @@
+# include "imregister.h"
+# include "imreg.h"
+static char *version = "imsearch $Revision: 3.6 $";
+
+int main (int argc, char **argv) {
+ 
+  int Nmatch, Nimage, *match;
+  RegImage *image;
+  FITS_DB db;
+
+  get_version (argc, argv, version);
+  args (argc, argv);
+
+  db.lockstate = (output.modify || output.delete) ? LCK_HARD : LCK_SOFT;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  if (!fits_db_lock (&db, ImageDB)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  if (!fits_db_load (&db)) {
+    fprintf (stderr, "ERROR: failure to load db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+
+  if (!output.modify && !output.delete) fits_db_close (&db);
+
+  image = fits_table_get_RegImage (&db.ftable, &Nimage, &db.swapped);
+  
+  match = match_criteria (image, Nimage, &Nmatch);
+  match = unique_entries (image, Nimage, match, &Nmatch);
+
+  if (output.modify) ModifySubset (&db, image, Nimage, match, Nmatch);
+  if (output.delete) DeleteSubset (&db, image, Nimage, match, Nmatch);
+
+  OutputSubset (image, Nimage, match, Nmatch);
+  exit (0);
+}
+
+/* 
+
+FITS table version:
+
+   load_db - open, read in database, store as RegImage structure
+   match   - return index 'match' to matched images
+   modify  - change value of selected images
+             write out subset of rows
+   delete  - remove selected images from image structure
+             write out entire table
+   output  - write out subset in various formats
+
+   get_images returns pointer to complete image structure
+
+
+SQL version:
+
+   load_db - set up connection
+   match   - convert criteria to SQL where clause and do:
+             'select from images [where clause]'
+             images structure is filled with result from query
+   modify  - change value of subset selection (identical)
+             update selected rows
+   delete  - user where clause and do 
+             'delete from images where clause'
+   output  - (identical)
+
+   get_images returns pointer to image subset from query
+   match[i] = i
+
+*/
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imstatreg.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imstatreg.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/imstatreg.c	(revision 21753)
@@ -0,0 +1,116 @@
+# include "imregister.h"
+# include "imreg.h"
+static char *version = "imstatreg $Revision: 3.15 $";
+
+int main (int argc, char **argv) {
+ 
+  int i, child;
+  int *match, Nmatch, Nimage, Nsubset;
+  FILE *f;
+  RegImage *image, *subset;
+  FITS_DB image_db, temp_db;
+
+  get_version (argc, argv, version);
+  args (argc, argv);
+  SetSignals ();
+
+  if (CLIENT) imregclient (argv[1], argv[2], argv[3]);
+
+  /* fork in background */
+  child = fork ();
+  if (child == -1) {
+    fprintf (stderr, "error forking imstatreg -daemon \n");
+    exit (1);
+  } 
+  if (child !=  0) {
+    fprintf (stderr, "starting imstatreg, logging to %s\n", LogFile);
+    exit (0);
+  }
+
+  /* child process, check for previous process */
+  ConfigPID (PIDFILE);
+
+  /* redirect stderr, stdout to logfile */
+  f = freopen (LogFile, "a", stdout);
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "can't open log file %s, writing to stderr\n", LogFile);
+  } else {
+    /* an error here will be missed, but is unlikely since we have access in the above test */
+    f = freopen (LogFile, "a", stderr);
+  }
+
+  image_db.lockstate = LCK_HARD;
+  image_db.timeout   = 300.0;
+  fits_db_init (&image_db);
+
+  temp_db.lockstate = LCK_HARD;
+  temp_db.timeout   = 300.0;
+  fits_db_init (&temp_db);
+
+  /* start loop */
+  while (1) {
+
+    /* check / load / delete temporary database */
+    if (!fits_db_lock (&temp_db, TempDB)) {
+      fits_db_close (&temp_db);
+      fprintf (stderr, "error locking temp db (path missing? access permission?)\n");
+      exit (1);
+    }
+    if (temp_db.dbstate == LCK_EMPTY) {
+      fprintf (stderr, "temporary database empty\n");
+      fits_db_close (&temp_db);
+      goto next;
+    } 
+    if (!fits_db_load (&temp_db)) {
+      fprintf (stderr, "error reading temp db\n");
+      exit (1);
+    }
+    subset = fits_table_get_RegImage (&temp_db.ftable, &Nsubset, &temp_db.swapped);
+    fprintf (stderr, "temporary database read\n");
+
+    /* delete, unlock existing database */
+    truncate (TempDB, 0);
+    fits_db_close (&temp_db);
+    fprintf (stderr, "temporary database closed\n");
+ 
+    /* check / load main database */
+    if (!fits_db_lock (&image_db, ImageDB)) {
+      fits_db_close (&image_db);
+      fprintf (stderr, "error locking image db (path missing? access permission?)\n");
+      exit (1);
+    }
+    if (temp_db.dbstate == LCK_EMPTY) {
+      fprintf (stderr, "main database empty\n");
+      fits_db_close (&image_db);
+      fits_db_free (&temp_db);
+      goto next;
+      /* this is a type of error: we read entries from the
+	 temp db, but there were no entries to match in the main db
+	 we will just drop the temp db data */
+    }
+    image = fits_table_get_RegImage (&image_db.ftable, &Nimage, &image_db.swapped);
+    fprintf (stderr, "main database read\n");
+
+    /* match temp image with main images */
+    match = match_images (image, Nimage, subset, Nsubset, &Nmatch);
+    if (Nmatch != Nsubset) fprintf (stderr, "WARNING: some images missed\n");
+
+    /* update entries in main db */
+    fits_vtable_from_ftable (&image_db.ftable, &image_db.vtable, match, Nmatch);
+    for (i = 0; i < Nmatch; i++) {
+      fits_convert_RegImage ((RegImage *) image_db.vtable.buffer[i], sizeof (RegImage), 1);
+    }
+    fits_db_update (&image_db);
+    fits_db_close (&image_db);
+
+    fits_db_free (&image_db);
+    fits_db_free (&temp_db);
+    if (match != NULL) free (match);
+    if (image != NULL) free (image);
+      
+  next:
+    fflush (stderr);
+    fflush (stdout);
+    sleep (LOOP_DELAY);
+  }
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/photcode.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/photcode.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/photcode.c	(revision 21753)
@@ -0,0 +1,71 @@
+# include "imregister.h"
+static char *version = "photcode $Revision: 3.3 $";
+
+int main (int argc, char **argv) {
+
+  Header header;
+  char detector[80], filter[80], *ID;
+  int i, ccd, VERBOSE, N, Nfilter;
+
+  get_version (argc, argv, version);
+  ConfigInit (&argc, argv);
+  ConfigCamera ();
+  ConfigFilter ();
+
+  VERBOSE = TRUE;
+  if ((N = get_argument (argc, argv, "-quiet"))) {
+    remove_argument (N, &argc, argv);
+    VERBOSE = FALSE;
+  }
+
+  if (argc != 4) { 
+    fprintf (stderr, "USAGE: photcode (file.fits) (ccd) (mode)\n");
+    exit (1);
+  }
+
+  /* read in image header */
+  if (!fits_read_header (argv[1], &header)) {
+    if (VERBOSE) fprintf (stderr, "ERROR: can't find image file %s (1)\n", argv[1]);
+    exit (1);
+  }
+
+  fits_scan (&header, CameraKeyword, "%s", 1, detector);
+  for (i = 0; i < strlen(detector); i++) { detector[i] = toupper (detector[i]); }
+  for (i = 0; i < strlen(detector); i++) { if (isspace (detector[i])) detector[i] = '.'; }
+
+  fits_scan (&header, FilterKeyword,   "%s", 1, filter);
+  for (i = 0; i < strlen (filter); i++) { if (isspace (filter[i])) filter[i] = '.'; }
+  Nfilter = FILTER_NONE;
+  for (i = 0; (i < NFILTER) && (Nfilter == FILTER_NONE); i++) {
+    if (!strcasecmp (filter, filtername[i])) {
+      Nfilter = filternum[i];
+    }
+  }      
+  if (Nfilter == FILTER_NONE) {
+    fprintf (stderr, "ERROR: invalid filter %s\n", filter);
+    exit (1);
+  }
+  strcpy (filter, filterhash[Nfilter]);
+
+  if (!strcasecmp (argv[3], "mef")) {
+    ID = strcreate (argv[2]);
+  } else {
+    ALLOCATE (ID, char, 80);
+    fits_scan (&header, CCDnumKeyword,  "%s", 1, ID);
+  }
+  ccd = -1;
+  for (i = 0; (i < Nccd) && (ccd == -1); i++) {
+    if (strnumcmp (ccds[i], ID)) {
+      ccd = i;
+    }
+  }
+  if (ccd == -1) {
+    fprintf (stderr, "warning: ccd %d not found in camera config file\n", ccd);
+    ccd = 0;
+  }
+
+  fprintf (stdout, "%s.%s.%02d\n", detector, filter, ccd);
+
+  exit (0);
+
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/photreg.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/photreg.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/photreg.c	(revision 21753)
@@ -0,0 +1,56 @@
+# include "imregister.h"
+# include "photreg.h"
+static char *version = "photreg $Revision: 1.8 $";
+
+int main (int argc, char **argv) {
+ 
+  char *filename;
+  PhotPars newdata;
+  FITS_DB db;
+  
+  get_version (argc, argv, version);
+  regargs (argc, argv, &newdata);
+
+  db.lockstate = LCK_HARD;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  filename = PhotDB;
+  if (!strcmp (output.db, "trans")) filename = TransDB;
+
+  if (!fits_db_lock (&db, filename)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  if (db.dbstate == LCK_EMPTY) {
+    fits_db_create (&db);
+    fits_table_set_PhotPars (&db.ftable, NULL, 0);
+    /* EXTNAME is set to ZERO_POINTS_3.0 by default */
+    if (!strcmp (output.db, "trans")) {
+      fits_modify (&db.theader, "EXTNAME", "%s", 1, "TRANS_POINTS_3.0");
+    }
+  } else {  
+    if (!fits_db_load (&db)) {
+      fprintf (stderr, "ERROR: failure to load db\n");
+      fits_db_close (&db);
+      exit (1);
+    }
+  }
+
+  /** we may later want to pull this out and put it elsewhere **/
+  fits_convert_PhotPars (&newdata, sizeof (PhotPars), 1);
+  fits_table_to_vtable (&db.ftable, &db.vtable, 0, 0);
+  fits_vadd_rows (&db.vtable, (char *) &newdata, 1, sizeof(PhotPars));
+
+  fits_db_update (&db);
+  fits_db_close (&db);
+  fits_db_free (&db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+}
+
+  /* data values are set in args by matching flags */
+
+/*** stick the header, table, theader, ftable creation in a single API? ***/
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/photsearch.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/photsearch.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/photsearch.c	(revision 21753)
@@ -0,0 +1,73 @@
+# include "imregister.h"
+# include "photreg.h"
+static char *version = "photsearch $Revision: 1.8 $";
+
+int main (int argc, char **argv) {
+
+  char *filename;
+  int Nmatch, Nphotpars;
+  int *match;
+  FITS_DB db;
+  PhotPars *photpars;
+  PhotParsOld *photpars_old;
+
+  get_version (argc, argv, version);
+  args (argc, argv);
+
+  db.lockstate = (output.modify || output.delete) ? LCK_HARD : LCK_SOFT;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  if (!strcmp (output.db, "phot")) {
+    filename = PhotDB;
+  } else {
+    filename = TransDB;
+  }
+
+  if (!fits_db_lock (&db, filename)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  
+  if (!fits_db_load (&db)) {
+    fprintf (stderr, "ERROR: failure to load db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+
+  if (!output.modify && !output.delete) fits_db_close (&db);
+
+  /* add test to EXTNAME? */
+  if (output.convert) {
+    photpars_old = fits_table_get_PhotParsOld (&db.ftable, &Nphotpars, &db.swapped);
+    photpars = PhotParsOld_to_PhotPars (photpars_old, Nphotpars);
+  } else {
+    photpars = fits_table_get_PhotPars (&db.ftable, &Nphotpars, &db.swapped);
+  }
+
+  match = match_criteria (photpars, Nphotpars, &Nmatch);
+
+  if (output.delete) DeleteSubset (&db, photpars, Nphotpars, match, Nmatch);
+
+  OutputSubset (photpars, Nphotpars, match, Nmatch);
+  exit (0);
+}
+
+  /* db selection is set in args, based on -trans */
+
+/* valid EXTNAME values:
+
+   phot, !output.convert, bintable: "ZERO_POINTS_3.0"
+   phot, !output.convert, table:    "IMAGE_ZPTS"
+
+   trans, !output.convert, bintable: "TRANS_POINTS_3.0"
+   trans, !output.convert, table:    "SUMMARY_ZPTS"
+
+   phot, !output.convert, bintable: "ZERO_POINTS"
+   phot, !output.convert, table:    "IMAGE_ZPTS"
+
+   trans, !output.convert, bintable: "TRANS_POINTS"
+   trans, !output.convert, table:    "SUMMARY_ZPTS"
+
+*/
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/showiminfo.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/showiminfo.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/showiminfo.c	(revision 21753)
@@ -0,0 +1,37 @@
+# include "imregister.h"
+# include "imreg.h"
+static char *version = "showiminfo $Revision: 3.1 $";
+
+int main (int argc, char **argv) {
+ 
+  char *obstime, *regtime;
+  RegImage *image, im;
+
+  get_version (argc, argv, version);
+  args (argc, argv);
+  image = iminfo (argv[1]);
+  im = image[0];
+  
+  fprintf (stderr, "\n");
+  fprintf (stderr, "filename: %s\n",   im.filename);
+  fprintf (stderr, "pathname: %s\n",   im.pathname);
+  fprintf (stderr, "filter: %s\n",     im.filter);
+  fprintf (stderr, "instrument: %s\n\n", im.instrument);
+
+  fprintf (stderr, "ccd: %d, mode: %d, type: %d\n\n", im.ccd, im.mode, im.type);
+
+  fprintf (stderr, "exptime: %f, airmass: %f, telfocus: %f\n", im.exptime, im.airmass, im.telfocus);
+  fprintf (stderr, "xprobe: %f, yprobe: %f, zprobe: %f\n", im.xprobe, im.yprobe, im.zprobe);
+  fprintf (stderr, "dettemp: %f, temp0: %f temp1: %f, temp2: %f, temp3: %f\n\n", 
+	   im.dettemp, im.teltemp_0, im.teltemp_1, im.teltemp_2, im.teltemp_3);
+
+  fprintf (stderr, "ra: %f, dec: %f, rotangle: %f\n", im.ra, im.dec, im.rotangle);
+
+  obstime = sec_to_date (im.obstime);
+  regtime = sec_to_date (im.regtime);
+
+  fprintf (stderr, "obstime: %s\n", obstime);
+  fprintf (stderr, "regtime: %s\n", regtime);
+
+  exit (0);
+}
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/spregister.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/spregister.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/spregister.c	(revision 21753)
@@ -0,0 +1,55 @@
+# include "imregister.h"
+# include "spreg.h"
+static char *version = "spregister $Revision: 1.8 $";
+
+int main (int argc, char **argv) {
+ 
+  Spectrum *spectrum;
+  FITS_DB db;
+
+  get_version (argc, argv, version);
+  args (argc, argv);
+
+  spectrum = spinfo (argv[1]);
+
+  if (DUMP) showinfo (spectrum);
+
+  if (NoReg) exit (0);
+
+  db.lockstate = LCK_HARD;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  if (!fits_db_lock (&db, SpectrumDB)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  if (db.dbstate == LCK_EMPTY) {
+    fits_db_create (&db);
+    fits_table_set_Spectrum (&db.ftable, NULL, 0);
+  } else {  
+    if (!fits_db_load (&db)) {
+      fprintf (stderr, "ERROR: failure to load db\n");
+      fits_db_close (&db);
+      exit (1);
+    }
+  }
+
+  fits_convert_Spectrum (spectrum, sizeof (Spectrum), 1);
+  fits_table_to_vtable (&db.ftable, &db.vtable, 0, 0);
+  fits_vadd_rows (&db.vtable, (char *) spectrum, 1, sizeof(Spectrum));
+
+  fits_db_update (&db);
+  fits_db_close (&db);
+  fits_db_free (&db);
+
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
+}
+
+
+/* notes:
+   SpectrumDB set in args:ConfigInit by config variable SPECTRUM_DB
+
+*/
Index: /tags/ohana/imregister-1-4/Ohana/src/imregister/src/spsearch.c
===================================================================
--- /tags/ohana/imregister-1-4/Ohana/src/imregister/src/spsearch.c	(revision 21753)
+++ /tags/ohana/imregister-1-4/Ohana/src/imregister/src/spsearch.c	(revision 21753)
@@ -0,0 +1,41 @@
+# include "imregister.h"
+# include "spreg.h"
+static char *version = "spsearch $Revision: 1.7 $";
+
+int main (int argc, char **argv) {
+ 
+  int Nmatch, Nspectrum, *match;
+  Spectrum *spectrum;
+  FITS_DB db;
+
+  get_version (argc, argv, version);
+  args (argc, argv);
+
+  db.lockstate = (output.modify || output.delete) ? LCK_HARD : LCK_SOFT;
+  db.timeout   = 300.0;
+  fits_db_init (&db);
+
+  if (!fits_db_lock (&db, SpectrumDB)) {
+    fprintf (stderr, "ERROR: failure to lock db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+  if (!fits_db_load (&db)) {
+    fprintf (stderr, "ERROR: failure to load db\n");
+    fits_db_close (&db);
+    exit (1);
+  }
+
+  if (!output.modify && !output.delete) fits_db_close (&db);
+
+  spectrum = fits_table_get_Spectrum (&db.ftable, &Nspectrum, &db.swapped);
+  
+  match = match_criteria (spectrum, Nspectrum, &Nmatch);
+  match = unique_entries (spectrum, Nspectrum, match, &Nmatch);
+
+  if (output.modify) ModifySubset (&db, spectrum, Nspectrum, match, Nmatch);
+  if (output.delete) DeleteSubset (&db, spectrum, Nspectrum, match, Nmatch);
+
+  OutputSubset (spectrum, Nspectrum, match, Nmatch);
+  exit (0);
+}
