Index: /branches/eam_branch_20090208/Ohana/src/addstar/Makefile
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/Makefile	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/Makefile	(revision 21444)
@@ -27,5 +27,9 @@
 mkcmf       : $(BIN)/mkcmf.$(ARCH)
 
-all: addstar addstarc addstard addstart sedstar load2mass skycells
+all: addstar sedstar load2mass skycells
+
+# I need to fix the client/server version of addstar now that I have dropped Stars
+# as an autocode type and have converted to carrying average and measure
+# all: addstar addstarc addstard addstart sedstar load2mass skycells
 
 ADDSTAR = \
@@ -48,9 +52,4 @@
 $(SRC)/find_matches_refstars.$(ARCH).o \
 $(SRC)/find_subset.$(ARCH).o \
-$(SRC)/get2mass.$(ARCH).o \
-$(SRC)/get2mass_as.$(ARCH).o \
-$(SRC)/get2mass_as_raw.$(ARCH).o \
-$(SRC)/get2mass_dr2.$(ARCH).o \
-$(SRC)/get2mass_ops.$(ARCH).o \
 $(SRC)/getgsc.$(ARCH).o \
 $(SRC)/gettycho.$(ARCH).o \
@@ -71,4 +70,5 @@
 $(SRC)/replace_match.$(ARCH).o \
 $(SRC)/resort_catalog.$(ARCH).o \
+$(SRC)/StarOps.$(ARCH).o \
 $(SRC)/ReadStarsFITS.$(ARCH).o \
 $(SRC)/ReadStarsTEXT.$(ARCH).o \
@@ -106,9 +106,4 @@
 $(SRC)/find_matches_refstars.$(ARCH).o \
 $(SRC)/find_subset.$(ARCH).o \
-$(SRC)/get2mass.$(ARCH).o \
-$(SRC)/get2mass_as.$(ARCH).o \
-$(SRC)/get2mass_as_raw.$(ARCH).o \
-$(SRC)/get2mass_dr2.$(ARCH).o \
-$(SRC)/get2mass_ops.$(ARCH).o \
 $(SRC)/getgsc.$(ARCH).o \
 $(SRC)/gettycho.$(ARCH).o \
@@ -141,9 +136,4 @@
 $(SRC)/find_matches_refstars.$(ARCH).o \
 $(SRC)/find_subset.$(ARCH).o \
-$(SRC)/get2mass.$(ARCH).o \
-$(SRC)/get2mass_as.$(ARCH).o \
-$(SRC)/get2mass_as_raw.$(ARCH).o \
-$(SRC)/get2mass_dr2.$(ARCH).o \
-$(SRC)/get2mass_ops.$(ARCH).o \
 $(SRC)/getgsc.$(ARCH).o \
 $(SRC)/getusno.$(ARCH).o \
@@ -209,4 +199,5 @@
 $(SRC)/replace_match.$(ARCH).o \
 $(SRC)/update_coords.$(ARCH).o \
+$(SRC)/StarOps.$(ARCH).o \
 $(SRC)/ConfigInit.$(ARCH).o \
 $(SRC)/Shutdown.$(ARCH).o \
@@ -252,5 +243,10 @@
 $(BIN)/mkcmf.$(ARCH)       : $(MKCMF)
 
-INSTALL = addstar addstarc addstard addstart sedstar load2mass skycells mkcmf
+INSTALL = addstar sedstar load2mass skycells mkcmf
+
+# I need to fix the client/server version of addstar now that I have dropped Stars
+# as an autocode type and have converted to carrying average and measure
+# all: addstar addstarc addstard addstart sedstar load2mass skycells
+# INSTALL = addstar addstarc addstard addstart sedstar load2mass skycells mkcmf
 
 # dependancy rules for binary code #########################
Index: /branches/eam_branch_20090208/Ohana/src/addstar/doc/notes.txt
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/doc/notes.txt	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/doc/notes.txt	(revision 21444)
@@ -1,2 +1,28 @@
+
+2009.02.11
+
+  updating DVO tables with more fields: cleaning up the conversions
+  from external formats to the DVO internal formats:  I am changing
+  the APIs to convert directly to the Measure structure, including
+  conversion functions for the compressed fields (ie, pixels carried
+  as short).
+
+  A few remaining issues:
+
+  * t_msec : I've added a field to carry the fractional seconds, but
+    nothing is yet setting this value, and the query functions do not
+    use this value.
+
+  * various fields are reported in either arcseconds or pixels (eg,
+    FWHMx, moments, error in centroid).  These are currently not very
+    consistent, and should be tightened up...
+
+    ** if we store these values in pixels, then cameras with a wide
+       range of plate scales (GPC1 << SkyProbe << AllSky) will all fit
+       in field with a small dynamic range; since we also provide the
+       plate scale (as a float), conversions are easy:
+       GPC1     : 0.26 arcsec / pixel
+       SkyProbe : 4.5 arcsec / pixel
+       AllSky   : 3600.0 arcsec / pixel 
 
 2008.10.11
Index: /branches/eam_branch_20090208/Ohana/src/addstar/include/addstar.h
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/include/addstar.h	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/include/addstar.h	(revision 21444)
@@ -28,4 +28,18 @@
     fprintf (stderr, "ERROR:  photcode %s not found in photcode table\n", NAME); \
     exit (0); }
+
+typedef struct {
+  char *exthead;
+  char *extdata;
+  char *exttype;
+  int extnum_head;
+  int extnum_data;
+} HeaderSet;
+
+typedef struct {
+  Average average;
+  Measure measure;
+  int found;
+} Stars;
 
 typedef struct {
@@ -39,12 +53,4 @@
   char *refcat;
 } DVO_DATA;
-
-typedef struct {
-  char *exthead;
-  char *extdata;
-  char *exttype;
-  int extnum_head;
-  int extnum_data;
-} HeaderSet;
 
 typedef struct sockaddr_in SockAddress;
@@ -92,4 +98,5 @@
 /* these globals modify the behavior of gstars (KEEP) */
 double 	SNLIMIT;
+int     PHOTFLAG_EXCLUDE;
 int    	ACCEPT_ASTROM;  // accept even bad astrometry solutions (NASTRO == 0)
 int    	ACCEPT_MOTION;  // accept reference proper motion measurements
@@ -137,6 +144,8 @@
 /*** addstar prototypes ***/
 
+AddstarClientOptions ConfigInit   PROTO((int *argc, char **argv));
+AddstarClientOptions args         PROTO((int argc, char **argv, AddstarClientOptions options));
+
 void       AddToCalibration       PROTO((Average *average, SecFilt *secfilt, Measure *measure, Measure *new, int *next, int Nstar));
-AddstarClientOptions ConfigInit   PROTO((int *argc, char **argv));
 void       FindCalibration        PROTO((Image *image));
 FILE      *GetDB                  PROTO((int *state));
@@ -145,27 +154,31 @@
 void       SetProtect             PROTO((int mode));
 int        SetSignals             PROTO((void));
-int        Shutdown               PROTO((char *message, ...); ) 
+int        Shutdown               PROTO((char *message, ...));
 void       TrapSignal             PROTO((int sig));
 float      airmass                PROTO((float secz_image, double ra, double dec, double st, double latitude));
+float      azimuth                PROTO((double ha, double dec, double latitude));
 void       SetAirmassQuality      PROTO((int quality));
 SkyTable  *SkyTableFromTychoIndex PROTO((char *filename, int VERBOSE));
-AddstarClientOptions args         PROTO((int argc, char **argv, AddstarClientOptions options));
 void       check_permissions      PROTO((char *basefile));
 int        dump_rawstars          PROTO((Stars *stars, int Nstars));
 int        edge_check             PROTO((double *x1, double *y1, double *x2, double *y2));
 Image     *fakeimage              PROTO((char *rootname, int *Nimage, int photcode));
+
 int        find_matches           PROTO((SkyRegion *region, Stars *stars, int Nstars, Catalog *catalog, AddstarClientOptions options));
 int        find_matches_closest   PROTO((SkyRegion *region, Stars *stars, int Nstars, Catalog *catalog, AddstarClientOptions options));
 int        find_matches_refstars  PROTO((SkyRegion *region, Stars **stars, int Nstars, Catalog *catalog, AddstarClientOptions options));
+
 Stars    **find_subset            PROTO((SkyRegion *region, Stars *stars, int Nstars, int *NSTARS));
 int        gcatalog               PROTO((Catalog *catalog));
 Stars     *get2mass               PROTO((SkyRegion *patch, int photcode, int mode, int *NSTARS));
 double     get_subpix             PROTO((double x, double y));
+
+Stars     *greference             PROTO((char *Refcat, SkyRegion *catstats, int photcode, int *nstars));
 Stars     *getgsc                 PROTO((SkyRegion *patch, int *NSTARS));
 Stars     *gettycho               PROTO((SkyRegion *catstats, int photcode, int *Nstars));
 Stars     *getusno                PROTO((SkyRegion *catstats, int photcode, int *Nstars));
 Stars     *getusnob               PROTO((SkyRegion *catstats, int photcode, int *Nstars));
-Image     *gimages                PROTO((FITS_DB *db, Image *image, Coords *mosaic, int *Npimage));
-Stars     *grefcat                PROTO((char *Refcat, SkyRegion *catstats, int photcode, int *nstars));
+
+// load text-based stars (REF only in the sense of REF photcodes)
 Stars     *grefstars              PROTO((char *file, int photcode, int *Nstars));
 
@@ -249,4 +262,9 @@
 Stars     *Convert_PS1_DEV_0	  PROTO((FTable *table, int *nstars));
 Stars     *Convert_PS1_DEV_1	  PROTO((FTable *table, int *nstars));
+Stars     *Convert_PS1_V1	  PROTO((FTable *table, int *nstars));
+
+int        InitStar               PROTO((Stars *star));
+short      ShortPixels            PROTO((float pixels));
+short      ShortDegree            PROTO((float degrees));
 
 int args_skycells (int argc, char **argv);
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/ConfigInit.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/ConfigInit.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/ConfigInit.c	(revision 21444)
@@ -39,4 +39,8 @@
   ScanConfig (config, "MIN_SN_FSTAT",           "%lf", 0, &SNLIMIT);
   ScanConfig (config, "ADDSTAR_SNLIMIT",        "%lf", 0, &SNLIMIT);
+
+  /* exclude stars with bits that match the given photFlags bits */
+  PHOTFLAG_EXCLUDE = 0;
+  ScanConfig (config, "ADDSTAR_PHOTFLAG_EXCLUDE", "%d", 0, &PHOTFLAG_EXCLUDE);
 
   MAX_CERROR = 0.5; // arcseconds
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/FilterStars.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/FilterStars.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/FilterStars.c	(revision 21444)
@@ -1,4 +1,13 @@
 # include "addstar.h"
+# define EXTERNAL_ID FALSE
 
+/* exclude some detections based on various filter options:
+ * *** S/N limit
+ * *** Acceptable window on detector
+ * *** bad photFlags
+ */
+
+// the imageID supplied here is the sequence **within this set**
+// this value is updated based on the image table later
 Stars *FilterStars (Stars *instars, Image *image, unsigned int imageID) {
 
@@ -19,33 +28,39 @@
   ALLOCATE (stars, Stars, image[0].nstar);
   for (N = j = 0; j < image[0].nstar; j++) {
+
     /* allow for some dynamic filtering of star list */
-    if (SNLIMIT && instars[j].dM > SNLIMIT) continue;
-    if (XMAX && (instars[j].Xccd > XMAX)) continue;
-    if (XMIN && (instars[j].Xccd < XMIN)) continue;
-    if (YMAX && (instars[j].Yccd > YMAX)) continue;
-    if (YMIN && (instars[j].Yccd < YMIN)) continue;
+    if (SNLIMIT && instars[j].measure.dM > SNLIMIT) continue;
+    if (XMAX && (instars[j].measure.Xccd > XMAX)) continue;
+    if (XMIN && (instars[j].measure.Xccd < XMIN)) continue;
+    if (YMAX && (instars[j].measure.Yccd > YMAX)) continue;
+    if (YMIN && (instars[j].measure.Yccd < YMIN)) continue;
+    if (PHOTFLAG_EXCLUDE && (instars[j].measure.photFlags & PHOTFLAG_EXCLUDE)) continue;
+
     stars[N] = instars[j];
 
-    XY_to_RD (&stars[N].R, &stars[N].D, stars[N].Xccd, stars[N].Yccd, &image[0].coords);
-    stars[N].R = ohana_normalize_angle (stars[N].R);
-    stars[N].found = -1;
-    stars[N].photcode = image[0].photcode;
+    XY_to_RD (&stars[N].average.R, &stars[N].average.D, stars[N].measure.Xccd, stars[N].measure.Yccd, &image[0].coords);
+    stars[N].average.R = ohana_normalize_angle (stars[N].average.R);
 
-    RMIN = MIN (RMIN, stars[N].R);
-    RMAX = MAX (RMAX, stars[N].R);
-    DMIN = MIN (DMIN, stars[N].D);
-    DMAX = MAX (DMAX, stars[N].D);
+    stars[N].measure.photcode = image[0].photcode;
+
+    // determine the full coverage of this set of measurements
+    RMIN = MIN (RMIN, stars[N].average.R);
+    RMAX = MAX (RMAX, stars[N].average.R);
+    DMIN = MIN (DMIN, stars[N].average.D);
+    DMAX = MAX (DMAX, stars[N].average.D);
+
     /** additional quantities to supply to Stars based on the image data **/
 
-    /* calculate accurate per-star airmass */
-    stars[N].airmass = airmass (image[0].secz, stars[N].R, stars[N].D, image[0].sidtime, image[0].latitude);
-    stars[N].Mcal    = image[0].Mcal;
-    stars[N].t       = image[0].tzero + 1e-4*stars[N].Yccd*image[0].trate;  /* trate is in 0.1 msec / row */
-    stars[N].dt      = MTIME;
+    /* calculate accurate per-star airmass and azimuth */
+    stars[N].measure.airmass = airmass (image[0].secz, stars[N].average.R, stars[N].average.D, image[0].sidtime, image[0].latitude);
+    stars[N].measure.az      = azimuth (image[0].sidtime - stars[N].average.R, stars[N].average.D, image[0].latitude);
+    stars[N].measure.Mcal    = image[0].Mcal;
+    stars[N].measure.t       = image[0].tzero + 1e-4*stars[N].measure.Yccd*image[0].trate;  /* trate is in 0.1 msec / row */
+    stars[N].measure.dt      = MTIME;
 
-    if ((stars[N].M > 25.0) && (stars[N].M < 32.0)) {
+    // watch out for any strange values:
+    if ((stars[N].measure.M > 25.0) && (stars[N].measure.M < 32.0)) {
       fprintf (stderr, "*");
     }
-
     // stars->M is either NAN or a valid inst magnitude
     // stars->dM is either NAN or a valid error
@@ -54,22 +69,33 @@
     dMx = 0.0;
     if (SUBPIX) {
-      dMs = get_subpix (stars[N].Xccd, stars[N].Yccd);
-      dMx = scat_subpix (stars[N].Xccd, stars[N].Yccd);
-      if (!isnan(stars[N].dM)) {
-	stars[N].dM = hypot (stars[N].dM, dMx);
+      dMs =  get_subpix (stars[N].measure.Xccd, stars[N].measure.Yccd);
+      dMx = scat_subpix (stars[N].measure.Xccd, stars[N].measure.Yccd);
+      if (!isnan(stars[N].measure.dM)) {
+	stars[N].measure.dM = hypot (stars[N].measure.dM, dMx);
       }
     }
 
-    if (!isnan(stars[N].M)) {
-      stars[N].M += MTIME - dMs;
+    if (!isnan(stars[N].measure.M)) {
+      stars[N].measure.M   += MTIME - dMs;
     }
-    if (!isnan(stars[N].Map)) {
-      stars[N].Map += MTIME - dMs;
+    if (!isnan(stars[N].measure.Map)) {
+      stars[N].measure.Map += MTIME - dMs;
     }
     
-    // XXX currently, this ID is internal only; 
-    // should we use the psphot / other external ID, if available?
-    stars[N].detID = N; // sequence number within image
-    stars[N].imageID = imageID; // does this need to be updated?
+    // the external ID is supplied, but do we trust it?
+    if (!EXTERNAL_ID) {
+      stars[N].measure.detID = N; // sequence number within image
+    }
+
+# if (0) 
+    if (PSPS_ID) {
+      double mjd;
+      mjd = ohana_sec_to_mjd (image[0].tzero);
+      // XXX this is clearly wrong : what does PSPS want?
+      stars[N].measure.extID = PSPS_create_detectid (mjd, imageID);
+    }
+# endif
+
+    stars[N].measure.imageID = imageID; // this value is update in UpdateImageIDs
 
     N ++;
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/GetFileMode.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/GetFileMode.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/GetFileMode.c	(revision 21444)
@@ -7,4 +7,5 @@
   int Naxis;
   int simple, extend, haveNaxis, haveCTYPE;
+  int tmp, havePHOT_VER, haveTARG_VER;
 
   gfits_scan (header, "SIMPLE", "%t", 1, &simple);
@@ -14,13 +15,9 @@
   gfits_scan (header, "EXTEND", "%t", 1, &extend);
     
-{
-    int tmp, havePHOT_VER, haveTARG_VER;
-
-    // SDSS tsObj files have a version number for the PHOTO and 
-    // TS (target selection) pipelines present as header keywords
-    havePHOT_VER = gfits_scan (header, "PHOT_VER", "%s", 1, &tmp);
-    haveTARG_VER = gfits_scan (header, "TARG_VER", "%s", 1, &tmp);
-    if (havePHOT_VER && haveTARG_VER) return SDSS_OBJ;
-}
+  // SDSS tsObj files have a version number for the PHOTO and 
+  // TS (target selection) pipelines present as header keywords
+  havePHOT_VER = gfits_scan (header, "PHOT_VER", "%s", 1, &tmp);
+  haveTARG_VER = gfits_scan (header, "TARG_VER", "%s", 1, &tmp);
+  if (havePHOT_VER && haveTARG_VER) return SDSS_OBJ;
 
   if ((Naxis == 2) || TEXTMODE || !simple) {
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/LoadData.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/LoadData.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/LoadData.c	(revision 21444)
@@ -41,4 +41,5 @@
     // I need to detect them here and load them with ReadStarsTEXT instead of calling the code
     // below.
+    // inStars = ReadStarsFITS (f, headers[Nhead], headers[Ndata], &images[0][Nvalid].nstar);
 
     // XXX use something to set the chip name? EXTNAME?
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/LoadDataPMM.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/LoadDataPMM.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/LoadDataPMM.c	(revision 21444)
@@ -82,11 +82,9 @@
 
     for (i = 0; i < Nline; i++) {
-      // fscanf (f, "%lf %lf %lf", &ra, &dec, &mag) != EOF) {
-
       dparse (&ra,  1, &buffer[i*NBYTE_ASC_TABLE]);
       dparse (&dec, 2, &buffer[i*NBYTE_ASC_TABLE]);
       dparse (&mag, 3, &buffer[i*NBYTE_ASC_TABLE]);
 
-      memset (&inStars[Ninstars], 0, sizeof(Stars));
+      InitStar (&inStars[Ninstars]);
 
       if (ra > 180) {
@@ -100,13 +98,14 @@
       maxD = MAX(maxD, dec);
 
-      inStars[Ninstars].M       = mag - ZeroPoint + ZeroPt;
-      inStars[Ninstars].R       = ra;
-      inStars[Ninstars].D       = dec;
-      inStars[Ninstars].t       = images[0][0].tzero;
-      inStars[Ninstars].dt      = images[0][0].exptime;
-      inStars[Ninstars].photcode    = code;
-      inStars[Ninstars].airmass = airmass;
-      inStars[Ninstars].az      = az;
-      inStars[Ninstars].found   = -1; // found starts at -1 == not yet found
+      inStars[Ninstars].average.R        = ra;
+      inStars[Ninstars].average.D        = dec;
+
+      inStars[Ninstars].measure.M        = mag - ZeroPoint + ZeroPt;
+      inStars[Ninstars].measure.t        = images[0][0].tzero;
+      inStars[Ninstars].measure.dt       = images[0][0].exptime;
+      inStars[Ninstars].measure.photcode = code;
+      inStars[Ninstars].measure.airmass  = airmass;
+      inStars[Ninstars].measure.az       = az;
+
       Ninstars++;
       CHECK_REALLOCATE (inStars, Stars, NINSTARS, Ninstars, 10000);
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/LoadStars.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/LoadStars.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/LoadStars.c	(revision 21444)
@@ -63,4 +63,5 @@
     }
 
+    // load PMM data if specified (these are not stored as FITS-tables)
     if (PMM_CCD_TABLE != NULL) {
       LoadDataPMM (f, file[i], images, Nimages, &stars, Nstars);
@@ -68,4 +69,5 @@
     }
 
+    // otherwise, we have FITS-table files: parse their headers to determine the contents
     headers = LoadHeaders (f, &mode, &Nheaders);
     headerSets = MatchHeaders (&extsize, &NheaderSets, mode, headers, Nheaders);
@@ -86,4 +88,5 @@
     }
 
+    // if these are SDSS data, load with SDSS-specific wrapper
     if (headerSets[0].exttype && !strcmp (headerSets[0].exttype, "SDSS_OBJ")) {
       LoadDataSDSS (f, file[i], images, Nimages, &stars, Nstars, headers, extsize, headerSets, NheaderSets);
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/MatchHeaders.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/MatchHeaders.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/MatchHeaders.c	(revision 21444)
@@ -51,4 +51,5 @@
     if (!strcmp (exttype, "PS1_DEV_0")) goto keep;
     if (!strcmp (exttype, "PS1_DEV_1")) goto keep;
+    if (!strcmp (exttype, "PS1_V1")) goto keep;
     continue;
 
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/PSPS_IDs.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/PSPS_IDs.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/PSPS_IDs.c	(revision 21444)
@@ -1,33 +1,71 @@
+# include "addstar.h"
 
-create_detectid(double tobs, int ccdid, int runid, uint64 *detectid)
-{
-   double floor();
-   double diff, t0 = 51544.5;
-   char string[19];
-   int itmp;
-   uint64 utmp;
+uint64_7 PSPS_create_detectID (double MJDobs, int imageID) {
 
-   diff = floor( 100000. * (tobs - t0) );
-   itmp = diff;
-   utmp = 1000000000*((uint64) itmp) + 10000000 * ((uint64) ccdid) +
-            ((uint64) runid);
-   *detectid = utmp;
+  // MJD has a PS lifetime range of : 3288 (2009/01/01) to 9132 (2025/01/01) (< 2^14)
+
+  static double t0 = 51544.5; // MJD @ 2000/01/01,12:00:00
+
+  uint64_t iTime;
+  uint64_t detectID;
+
+  iTime = floor(tobs - t0);
+
+  // iTime takes the upper 16 bits, imageID can take up to lower 48 bits
+  detectID = (iTime << 48) | imageID;
+
+  return detectID;
 }
 
+uint64_t PSPS_create_objID (double ra, double dec) {
 
+  static double zh = 0.0083333; // zone height = 30 arcsec
 
-create_objid(double ra, double dec, uint64 *objid)
-{
-   uint64 part1, part2, part3;
-   double zid, zresid;
-   int izone;
-   double zh = 0.0083333, floor();
+  uint64_t objID;
+  uint64_t part1, part2, part3;
 
-   zid = (dec + 90.) / zh;
-   izone = (int) floor(zid);
-   zresid = zid -  ((float) izone);
-   part1 = (uint64)( izone  * 10000000000000) ;
-   part2 = ((uint64)(ra * 1000000.)) * 10000 ;
-   part3 = (int) (zresid * 10000.0) ;
-   *objid = part1 + part2 + part3;
+  double zid, zresid;
+  int izone;
+
+  zid = (dec + 90.0) / zh; // 0 - 180*60*2 = 21600 (< 15 bits)
+  izone = (int) floor(zid);
+  zresid = zid -  ((float) izone); // 0 - 1.0 
+  part1 = (uint64_t)( izone  * 10000000000000) ;
+  part2 = ((uint64_t)(ra * 1 000 000.)) * 10000 ; // 0 - 360.0*1e6 = 3.6e8 (< 29 bits)
+  part3 = (int) (zresid * 10000.0) ; // 0 - 10000 (1 bit == 30/10000 arcsec = 0.003 arcsec) (< 14 bits)
+
+  objID = part1 + part2 + part3;
+
+  return objID;
 }
+
+uint64_t PSPS_create_objID_eam (double ra, double dec) {
+
+  static double zh = 0.0083333; // zone height = 30 arcsec
+
+  uint64_t objID;
+  uint64_t part1, part2, part3;
+
+  double zid, zresid;
+  int izone, ira;
+
+  zid = (dec + 90.0) / zh; // 0 - 180*60*2 = 21600 (< 15 bits)
+  izone = (int) floor(zid);
+  zresid = zid -  ((float) izone); // 0 - 1.0 
+
+  ira = ra * 1 000 000; // 0 - 360.0*1e6 = 3.6e8 (< 29 bits) 
+
+  part1 = (izone << 48);
+  part2 = (ira << 16);
+  part3 = (int) (zresid * 10000.0) ; // 0 - 10000 (1 bit == 30/10000 arcsec = 0.003 arcsec) (< 14 bits)
+
+  objID = part1 | part2 | part3;
+
+  return objID;
+}
+
+// part1 : 15 bits
+// part2 : 29 bits
+// part3 : 14 bits
+// 15 + 14 + 29 bits = 58 bits...
+
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/ReadStarsFITS.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/ReadStarsFITS.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/ReadStarsFITS.c	(revision 21444)
@@ -40,4 +40,7 @@
     stars = Convert_PS1_DEV_1 (&table, &Nstars);
   }
+  if (!strcmp (type, "CMF_PS1_V1")) {
+    stars = Convert_PS1_V1 (&table, &Nstars);
+  }
   if (stars == NULL) {
     fprintf (stderr, "ERROR: invalid table type %s\n", type);
@@ -62,28 +65,27 @@
   ZeroPt = GetZeroPoint();
 
-  /* XXX we need to check at least the size of the loaded table */
-  // XXX use memset to zero-out the elements before setting
-
-  ALLOCATE (stars, Stars, Nstars);
-  for (i = 0; i < Nstars; i++) {
-    stars[i].Xccd   = smpdata[i].X;
-    stars[i].Yccd   = smpdata[i].Y;
+  ALLOCATE (stars, Stars, Nstars);
+  for (i = 0; i < Nstars; i++) {
+    InitStar (&stars[i]);
+
+    stars[i].measure.Xccd      = smpdata[i].X;
+    stars[i].measure.Yccd      = smpdata[i].Y;
 
     if ((smpdata[i].M >= ZeroPt) || isnan(smpdata[i].M)) {
-      stars[i].M    = NAN;
-      stars[i].Map  = NAN;
-    } else {
-      stars[i].M    = smpdata[i].M;
-      stars[i].Map  = smpdata[i].M;
-    }
-
-    stars[i].dM     = smpdata[i].dM*0.001;
-
-    // the dophot type information get pushed into the upper 2 bytes of photFlags
-    stars[i].photFlags = (smpdata[i].dophot << 16);
-
-    stars[i].fx     = smpdata[i].fx;
-    stars[i].fy     = smpdata[i].fy;
-    stars[i].df     = smpdata[i].df;
+      stars[i].measure.M       = NAN;
+      stars[i].measure.Map     = NAN;
+    } else {
+      stars[i].measure.M       = smpdata[i].M;
+      stars[i].measure.Map     = smpdata[i].M;
+    }
+
+    stars[i].measure.dM        = smpdata[i].dM*0.001;
+
+    // the dophot type information gets pushed into the upper 2 bytes of photFlags
+    stars[i].measure.photFlags = (smpdata[i].dophot << 16);
+
+    stars[i].measure.FWx       = ShortPixels (smpdata[i].fx);
+    stars[i].measure.FWy       = ShortPixels (smpdata[i].fy);
+    stars[i].measure.theta     = ShortDegree (smpdata[i].df);
   }    
   *nstars = Nstars;
@@ -103,51 +105,29 @@
   ALLOCATE (stars, Stars, Nstars);
   for (i = 0; i < Nstars; i++) {
-    stars[i].Xccd    = ps1data[i].X;
-    stars[i].Yccd    = ps1data[i].Y;
-    stars[i].dXccd   = ps1data[i].dX;
-    stars[i].dYccd   = ps1data[i].dY;
+    InitStar (&stars[i]);
+    stars[i].measure.Xccd     = ps1data[i].X;
+    stars[i].measure.Yccd     = ps1data[i].Y;
+
+    stars[i].measure.dXccd    = ShortPixels(ps1data[i].dX);
+    stars[i].measure.dYccd    = ShortPixels(ps1data[i].dY);
+   
     if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
-      stars[i].M     = NAN;
-    } else {
-      stars[i].M     = ps1data[i].M + ZeroPt;
-    }
-    stars[i].dM      = ps1data[i].dM;
-    stars[i].Mpeak   = ps1data[i].Mpeak;
-
-    stars[i].Sky     = ps1data[i].sky;
-    stars[i].dSky    = ps1data[i].dSky;
-
-    stars[i].fx      = ps1data[i].fx;
-    stars[i].fy      = ps1data[i].fy;
-    stars[i].df      = ps1data[i].df;
-
-    stars[i].psfChisq = ps1data[i].psfChisq;
-    stars[i].psfQual  = ps1data[i].psfQual;
-
-    stars[i].detID   = ps1data[i].detID;
-
-    /* these are set elsewhere */
-    stars[i].R       = 0.0;
-    stars[i].D       = 0.0;
-    stars[i].dR      = 0.0;
-    stars[i].dD      = 0.0;
-
-    stars[i].uR      = 0.0;
-    stars[i].uD      = 0.0;
-    stars[i].duR     = 0.0;
-    stars[i].duD     = 0.0;
-
-    stars[i].P       = 0.0;
-    stars[i].dP      = 0.0;
-
-    stars[i].Mcal    = 0;
-    stars[i].t       = 0;
-    stars[i].dt      = 0;
-    stars[i].airmass = 0;
-    stars[i].photcode    = 0;
-    stars[i].found   = 0;
-
-    /* these are not used */
-    stars[i].Map     = NAN;
+      stars[i].measure.M      = NAN;
+    } else {
+      stars[i].measure.M      = ps1data[i].M + ZeroPt;
+    }
+    stars[i].measure.Map      = NAN;
+    stars[i].measure.dM       = ps1data[i].dM;
+    stars[i].measure.Sky      = ps1data[i].sky;
+    stars[i].measure.dSky     = ps1data[i].dSky;
+
+    stars[i].measure.FWx      = ShortPixels(ps1data[i].fx);
+    stars[i].measure.FWy      = ShortPixels(ps1data[i].fy);
+    stars[i].measure.theta    = ShortDegree(ps1data[i].df);
+
+    stars[i].measure.psfChisq = ps1data[i].psfChisq;
+    stars[i].measure.psfQual  = ps1data[i].psfQual;
+
+    stars[i].measure.detID    = ps1data[i].detID;
   }    
   *nstars = Nstars;
@@ -169,60 +149,97 @@
   ALLOCATE (stars, Stars, Nstars);
   for (i = 0; i < Nstars; i++) {
-    stars[i].Xccd       = ps1data[i].X;
-    stars[i].Yccd       = ps1data[i].Y;
-    stars[i].dXccd      = ps1data[i].dX;
-    stars[i].dYccd      = ps1data[i].dY;
+    InitStar (&stars[i]);
+    stars[i].measure.Xccd       = ps1data[i].X;
+    stars[i].measure.Yccd       = ps1data[i].Y;
+
+    stars[i].measure.dXccd      = ShortPixels(ps1data[i].dX);
+    stars[i].measure.dYccd      = ShortPixels(ps1data[i].dY);
+
     if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
-	stars[i].M   = NAN;
-    } else {
-	stars[i].M   = ps1data[i].M + ZeroPt;
-    }
-    stars[i].dM      = ps1data[i].dM;
-    stars[i].Mpeak   = ps1data[i].Mpeak;
-
-    stars[i].Sky     = ps1data[i].sky;
-    stars[i].dSky    = ps1data[i].dSky;
-
-    stars[i].fx      = ps1data[i].fx;
-    stars[i].fy      = ps1data[i].fy;
-    stars[i].df      = ps1data[i].df;
-
-    stars[i].psfChisq  = ps1data[i].psfChisq;
-    stars[i].psfQual   = ps1data[i].psfQual;
-    stars[i].crNsigma  = ps1data[i].crNsigma;
-    stars[i].extNsigma = ps1data[i].extNsigma;
-
-    stars[i].detID     = ps1data[i].detID;
-    stars[i].photFlags     = ps1data[i].flags;
-
-    // XXX not defined anyway
-    // stars[i].stargal   = ps1data[i].stargal;
-
-    /* these are set elsewhere */
-    stars[i].R       = 0.0;
-    stars[i].D       = 0.0;
-    stars[i].dR      = 0.0;
-    stars[i].dD      = 0.0;
-
-    stars[i].uR      = 0.0;
-    stars[i].uD      = 0.0;
-    stars[i].duR     = 0.0;
-    stars[i].duD     = 0.0;
-
-    stars[i].P       = 0.0;
-    stars[i].dP      = 0.0;
-
-    stars[i].Mcal    = 0;
-    stars[i].t       = 0;
-    stars[i].dt      = 0;
-    stars[i].airmass = 0;
-    stars[i].az      = 0;
-    stars[i].photcode    = 0;
-    stars[i].found   = 0;
-
-    /* these are not used */
-    stars[i].Map     = NAN;
-  }    
-  *nstars = Nstars;
-  return (stars);
-}
+	stars[i].measure.M      = NAN;
+    } else {
+	stars[i].measure.M      = ps1data[i].M + ZeroPt;
+    }
+    stars[i].measure.Map        = NAN;
+    stars[i].measure.dM         = ps1data[i].dM;
+    stars[i].measure.Sky        = ps1data[i].sky;
+    stars[i].measure.dSky       = ps1data[i].dSky;
+
+    stars[i].measure.FWx        = ShortPixels(ps1data[i].fx);
+    stars[i].measure.FWy        = ShortPixels(ps1data[i].fy);
+    stars[i].measure.theta      = ShortDegree(ps1data[i].df);
+
+    stars[i].measure.psfChisq  	= ps1data[i].psfChisq;
+    stars[i].measure.psfQual   	= ps1data[i].psfQual;
+    stars[i].measure.crNsigma  	= ps1data[i].crNsigma;
+    stars[i].measure.extNsigma 	= ps1data[i].extNsigma;
+
+    stars[i].measure.detID     	= ps1data[i].detID;
+    stars[i].measure.photFlags  = ps1data[i].flags;
+  }    
+  *nstars = Nstars;
+  return (stars);
+}
+
+Stars *Convert_PS1_V1 (FTable *table, int *nstars) {
+
+  int i, Nstars;
+  double ZeroPt;
+  Stars *stars;
+  CMF_PS1_V1 *ps1data;
+
+  ps1data = gfits_table_get_CMF_PS1_V1 (table, &Nstars, NULL);
+  ZeroPt = GetZeroPoint();
+
+  ALLOCATE (stars, Stars, Nstars);
+  for (i = 0; i < Nstars; i++) {
+    InitStar (&stars[i]);
+    stars[i].measure.Xccd       = ps1data[i].X;
+    stars[i].measure.Yccd       = ps1data[i].Y;
+    stars[i].measure.dXccd      = ShortPixels(ps1data[i].dX);
+    stars[i].measure.dYccd      = ShortPixels(ps1data[i].dY);
+
+    stars[i].measure.posangle   = ShortDegree(ps1data[i].posangle);
+    stars[i].measure.pltscale   = ps1data[i].pltscale;
+
+    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
+	stars[i].measure.M      = NAN;
+    } else {
+	stars[i].measure.M      = ps1data[i].M + ZeroPt;
+    }
+    stars[i].measure.dM         = ps1data[i].dM;
+    stars[i].measure.dMcal      = ps1data[i].dMcal;
+    stars[i].measure.Map        = ps1data[i].Map;
+		        
+    stars[i].measure.Sky        = ps1data[i].sky;
+    stars[i].measure.dSky       = ps1data[i].dSky;
+		        
+    stars[i].measure.psfChisq   = ps1data[i].psfChisq;
+    stars[i].measure.psfQual    = ps1data[i].psfQual;
+    stars[i].measure.psfNdof    = ps1data[i].psfNdof;
+    stars[i].measure.psfNpix    = ps1data[i].psfNpix;
+    stars[i].measure.crNsigma   = ps1data[i].crNsigma;
+    stars[i].measure.extNsigma  = ps1data[i].extNsigma;
+
+    stars[i].measure.FWx        = ShortPixels(ps1data[i].fx);
+    stars[i].measure.FWy        = ShortPixels(ps1data[i].fy);
+    stars[i].measure.theta      = ShortDegree(ps1data[i].df);
+
+    stars[i].measure.Mxx        = ShortPixels(ps1data[i].Mxx);
+    stars[i].measure.Mxy        = ShortPixels(ps1data[i].Mxy);
+    stars[i].measure.Myy        = ShortPixels(ps1data[i].Myy);
+		        
+    stars[i].measure.photFlags  = ps1data[i].flags;
+
+    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
+    stars[i].measure.detID      = ps1data[i].detID; 
+
+    // the Average fields and the following Measure fields are set in FilterStars after
+    // the image metadata is in hand:  dR, dD, Mcal, dt, airmass, az, t, imageID, extID, 
+    // averef is set in find_matches, dbFlags is zero on ingest.
+
+    // the following fields are currently not being set anywhere: t_msec
+  }    
+  *nstars = Nstars;
+  return (stars);
+}
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/ReadStarsSDSS.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/ReadStarsSDSS.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/ReadStarsSDSS.c	(revision 21444)
@@ -140,35 +140,27 @@
     for (j = 0; j < NFILTER; j++) {
       N = NFILTER*i + j;
-      stars[N].Xccd      = colc[N];
-      stars[N].Yccd      = rowc[N];
-      stars[N].dXccd     = colcErr[N];
-      stars[N].dYccd     = rowcErr[N];
-      stars[N].M         = psfCounts[N] + ZeroPt - zeropt[j];
-      stars[N].dM        = psfCountsErr[N];
-      stars[N].Map       = fiberCounts[N] + ZeroPt - zeropt[j];
-      stars[N].Mpeak     = NAN;
-      stars[N].Sky       = sky[N]; // adjust this to counts?
-      stars[N].dSky      = skyErr[N];
-      stars[N].fx        = seeing[j]; // reported in arcsec?
-      stars[N].fy        = seeing[j];
-      stars[N].df        = 0.0;
-      stars[N].psfChisq  = prob_psf[N]; // XXX not really the correct value...
-      stars[N].psfQual   = 0.0;
-      stars[N].crNsigma  = 0.0;
-      stars[N].extNsigma = 0.0;
-      stars[N].detID     = N;
-      stars[N].R         = ra[i] + dCOS(dec[i]) * offsetRa[N] / 3600.0;
-      stars[N].D         = dec[i] + offsetDec[N] / 3600.0;
-      stars[N].dR        = NAN;
-      stars[N].dD        = NAN;
-      stars[N].uR        = 0.0; // I don't trust the SDSS proper motions
-      stars[N].uD        = 0.0; // I don't trust the SDSS proper motions
-      stars[N].duR       = 0.0;
-      stars[N].duD       = 0.0;
-      stars[N].P         = 0.0;
-      stars[N].dP        = 0.0;
-      stars[N].Mcal      = 0.0;
-      stars[N].t         = tzero[j] + clockRate*rowc[N]; // time since row 0
-      stars[N].dt        = 53.907456; // is this 2048*clockRate ?
+      InitStar (&stars[N]);
+      
+      // any values not explicitly set are left at 0.0
+      stars[N].average.R         = ra[i] + dCOS(dec[i]) * offsetRa[N] / 3600.0;
+      stars[N].average.D         = dec[i] + offsetDec[N] / 3600.0;
+      stars[N].average.dR        = NAN;
+      stars[N].average.dD        = NAN;
+
+      stars[N].measure.Xccd      = colc[N];
+      stars[N].measure.Yccd      = rowc[N];
+      stars[N].measure.dXccd     = ShortPixels(colcErr[N]);
+      stars[N].measure.dYccd     = ShortPixels(rowcErr[N]);
+      stars[N].measure.M         = psfCounts[N] + ZeroPt - zeropt[j];
+      stars[N].measure.dM        = psfCountsErr[N];
+      stars[N].measure.Map       = fiberCounts[N] + ZeroPt - zeropt[j];
+      stars[N].measure.Sky       = sky[N]; // adjust this to counts?
+      stars[N].measure.dSky      = skyErr[N];
+      stars[N].measure.FWx       = ShortPixels(seeing[j]); // reported in arcsec?
+      stars[N].measure.FWy       = ShortPixels(seeing[j]);
+      stars[N].measure.psfChisq  = prob_psf[N]; // XXX not really the correct value...
+      stars[N].measure.detID     = N;
+      stars[N].measure.t         = tzero[j] + clockRate*rowc[N]; // time since row 0
+      stars[N].measure.dt        = 53.907456; // is this 2048*clockRate ?
 
       SetSDSSFlags (&stars[N], flags[N], flags2[N]);
@@ -182,13 +174,11 @@
       double Latitude = 32.7803611755; // degrees
 
-      jd = ohana_sec_to_jd (stars[N].t);
+      jd = ohana_sec_to_jd (stars[N].measure.t);
       sidtime  = 15.0*ohana_lst (jd, Longitude); // sidtime in degrees
-      altaz (&alt, &az, sidtime - stars[N].R, stars[N].D, Latitude);
-
-      stars[N].airmass   = 1.0 / dCOS(90.0 - alt);
-      stars[N].az        = az;
-
-      stars[N].photcode  = photcode[j];
-      stars[N].found     = -1;
+      altaz (&alt, &az, sidtime - stars[N].average.R, stars[N].average.D, Latitude);
+
+      stars[N].measure.airmass   = 1.0 / dCOS(90.0 - alt);
+      stars[N].measure.az        = az;
+      stars[N].measure.photcode  = photcode[j];
     }
   }    
@@ -201,9 +191,9 @@
     strcpy (images[N].coords.ctype, "RA---TAN");
     
-    images[N].coords.crval1 = stars[0].R;
-    images[N].coords.crval2 = stars[0].D;
+    images[N].coords.crval1 = stars[0].average.R;
+    images[N].coords.crval2 = stars[0].average.D;
     
-    images[N].coords.crpix1 = stars[0].Xccd;
-    images[N].coords.crpix2 = stars[0].Yccd;
+    images[N].coords.crpix1 = stars[0].measure.Xccd;
+    images[N].coords.crpix2 = stars[0].measure.Yccd;
     images[N].coords.cdelt1 = images[N].coords.cdelt2 = 0.4 / 3600.0;
 
@@ -250,5 +240,5 @@
 
     images[N].trate = clockRate * 1e-4;
-    images[N].secz = stars[0].airmass;
+    images[N].secz = stars[0].measure.airmass;
     images[N].ccdnum = camcol;
 
@@ -296,19 +286,19 @@
 
   // XXX this is wrong, need to roll left to set the correct bit 
-  if (flags1 & 0x00000002) star[0].photFlags |= 0x0001; // BRIGHT            - 1  1
-  if (flags1 & 0x00000004) star[0].photFlags |= 0x0002; // EDGE              - 1  2
-  if (flags1 & 0x00000008) star[0].photFlags |= 0x0004; // BLENDED           - 1  3
-  if (flags1 & 0x00000010) star[0].photFlags |= 0x0008; // CHILD             - 1  4
-  if (flags1 & 0x00000020) star[0].photFlags |= 0x0010; // PEAKCENTER        - 1  5
-  if (flags1 & 0x00000040) star[0].photFlags |= 0x0020; // NODEBLEND         - 1  6
-  if (flags1 & 0x00040000) star[0].photFlags |= 0x0040; // SATUR             - 1 18
-  if (flags1 & 0x00080000) star[0].photFlags |= 0x0080; // NOTCHECKED        - 1 19
-  if (flags1 & 0x10000000) star[0].photFlags |= 0x0100; // BINNED1           - 1 28
-  if (flags1 & 0x20000000) star[0].photFlags |= 0x0200; // BINNED2           - 1 29
-  if (flags1 & 0x40000000) star[0].photFlags |= 0x0400; // BINNED4           - 1 30
-  if (flags2 & 0x00000040) star[0].photFlags |= 0x0800; // LOCAL_EDGE        - 2  7
-  if (flags2 & 0x00000800) star[0].photFlags |= 0x1000; // INTERP_CENTER     - 2 12
-  if (flags2 & 0x00002000) star[0].photFlags |= 0x2000; // DEBLEND_NOPEAK    - 2 14
-  if (flags2 & 0x02000000) star[0].photFlags |= 0x4000; // NOTCHECKED_CENTER - 2 26
+  if (flags1 & 0x00000002) star[0].measure.photFlags |= 0x0001; // BRIGHT            - 1  1
+  if (flags1 & 0x00000004) star[0].measure.photFlags |= 0x0002; // EDGE              - 1  2
+  if (flags1 & 0x00000008) star[0].measure.photFlags |= 0x0004; // BLENDED           - 1  3
+  if (flags1 & 0x00000010) star[0].measure.photFlags |= 0x0008; // CHILD             - 1  4
+  if (flags1 & 0x00000020) star[0].measure.photFlags |= 0x0010; // PEAKCENTER        - 1  5
+  if (flags1 & 0x00000040) star[0].measure.photFlags |= 0x0020; // NODEBLEND         - 1  6
+  if (flags1 & 0x00040000) star[0].measure.photFlags |= 0x0040; // SATUR             - 1 18
+  if (flags1 & 0x00080000) star[0].measure.photFlags |= 0x0080; // NOTCHECKED        - 1 19
+  if (flags1 & 0x10000000) star[0].measure.photFlags |= 0x0100; // BINNED1           - 1 28
+  if (flags1 & 0x20000000) star[0].measure.photFlags |= 0x0200; // BINNED2           - 1 29
+  if (flags1 & 0x40000000) star[0].measure.photFlags |= 0x0400; // BINNED4           - 1 30
+  if (flags2 & 0x00000040) star[0].measure.photFlags |= 0x0800; // LOCAL_EDGE        - 2  7
+  if (flags2 & 0x00000800) star[0].measure.photFlags |= 0x1000; // INTERP_CENTER     - 2 12
+  if (flags2 & 0x00002000) star[0].measure.photFlags |= 0x2000; // DEBLEND_NOPEAK    - 2 14
+  if (flags2 & 0x02000000) star[0].measure.photFlags |= 0x4000; // NOTCHECKED_CENTER - 2 26
   return (TRUE);
 
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/ReadStarsTEXT.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/ReadStarsTEXT.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/ReadStarsTEXT.c	(revision 21444)
@@ -9,5 +9,5 @@
   int done, itmp;
   char *buffer, *c, *c2;
-  double tmp;
+  double tmp, fx, fy, df;
   double ZeroPt;
   Stars *stars;
@@ -66,19 +66,20 @@
     Nextra = nbytes % BYTES_STAR;
     for (j = 0; (j < Ninstar) && (N < *nstars); j++, N++) {
-      dparse (&stars[N].Xccd,  1, &buffer[j*BYTES_STAR]);
-      dparse (&stars[N].Yccd,  2, &buffer[j*BYTES_STAR]);
-      dparse (&stars[N].M,  3, &buffer[j*BYTES_STAR]);
-      if ((stars[N].M > ZeroPt) || isnan(stars[N].M)) {
-	stars[N].M = NAN;
+      InitStar (&stars[N]);
+      fparse (&stars[N].measure.Xccd,  1, &buffer[j*BYTES_STAR]);
+      fparse (&stars[N].measure.Yccd,  2, &buffer[j*BYTES_STAR]);
+      fparse (&stars[N].measure.M,  3, &buffer[j*BYTES_STAR]);
+      if ((stars[N].measure.M > ZeroPt) || isnan(stars[N].measure.M)) {
+	stars[N].measure.M = NAN;
       }
 
       /* cmp files carry dM in millimags */
       dparse (&tmp, 4, &buffer[j*BYTES_STAR]);
-      stars[N].dM = 0.001*tmp;
+      stars[N].measure.dM = 0.001*tmp;
 
       // the dophot type information get pushed into the upper 2 bytes of photFlags
       dparse (&tmp,         5, &buffer[j*BYTES_STAR]);
       itmp = tmp;
-      stars[N].photFlags = (itmp << 16);
+      stars[N].measure.photFlags = (itmp << 16);
 
       // XXX I've removed the Mgal field from the measure.d table, and am using Map
@@ -89,8 +90,12 @@
 
       // dparse (&stars[N].Mgal, 7, &buffer[j*BYTES_STAR]);
-      dparse (&stars[N].Map,  8, &buffer[j*BYTES_STAR]);
-      dparse (&stars[N].fx,   9, &buffer[j*BYTES_STAR]);
-      dparse (&stars[N].fy,  10, &buffer[j*BYTES_STAR]);
-      dparse (&stars[N].df,  11, &buffer[j*BYTES_STAR]);
+      fparse (&stars[N].measure.Map,  8, &buffer[j*BYTES_STAR]);
+      dparse (&fx,   9, &buffer[j*BYTES_STAR]);
+      dparse (&fy,  10, &buffer[j*BYTES_STAR]);
+      dparse (&df,  11, &buffer[j*BYTES_STAR]);
+
+      stars[N].measure.FWx   = ShortPixels (fx);
+      stars[N].measure.FWy   = ShortPixels (fy);
+      stars[N].measure.theta = ShortDegree (df);
     }
   }
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/SkyListForStars.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/SkyListForStars.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/SkyListForStars.c	(revision 21444)
@@ -1,3 +1,15 @@
 # include "addstar.h"
+
+void sort_stars_ra (Stars *stars, int N) {
+
+# define SWAPFUNC(A,B){ Stars tmp; tmp = stars[A]; stars[A] = stars[B]; stars[B] = tmp; }
+# define COMPARE(A,B)(stars[A].average.R < stars[B].average.R)
+
+  OHANA_SORT (N, COMPARE, SWAPFUNC);
+
+# undef SWAPFUNC
+# undef COMPARE
+
+}
 
 SkyList *SkyListForStars (SkyTable *table, int depth, Stars *stars, int Nstars) {
@@ -17,14 +29,14 @@
   sort_stars_ra (stars, Nstars); /* sort by RA */
   for (i = 0; i < Nstars; i++) {
-    if (stars[i].found) continue;
-    here = SkyRegionByPoint (table, depth, stars[i].R, stars[i].D);
-    stars[i].found = TRUE;
+    if (stars[i].found == -2) continue;
+    here = SkyRegionByPoint (table, depth, stars[i].average.R, stars[i].average.D);
+    stars[i].found = -2;
     /* search forward for all contained stars */
     for (j = i; j < Nstars; j++) {
-      if (stars[j].R >= here[0].regions[0][0].Rmax) break;
-      if (stars[j].R <  here[0].regions[0][0].Rmin) break;
-      if (stars[j].D <  here[0].regions[0][0].Dmin) continue;
-      if (stars[j].D >= here[0].regions[0][0].Dmax) continue;
-      stars[j].found = TRUE;
+      if (stars[j].average.R >= here[0].regions[0][0].Rmax) break;
+      if (stars[j].average.R <  here[0].regions[0][0].Rmin) break;
+      if (stars[j].average.D <  here[0].regions[0][0].Dmin) continue;
+      if (stars[j].average.D >= here[0].regions[0][0].Dmax) continue;
+      stars[j].found = -2;
     }
     list[0].regions[Nr] = here[0].regions[0];
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/StarOps.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/StarOps.c	(revision 21444)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/StarOps.c	(revision 21444)
@@ -0,0 +1,28 @@
+# include "addstar.h"
+
+int InitStar (Stars *star) {
+
+    memset (&star[0].average, 0, sizeof(Average));
+    memset (&star[0].measure, 0, sizeof(Measure));
+    star[0].found = -1; // found == -1 -> not yet found (use enums?)
+
+    return TRUE;
+}
+
+short ShortPixels (float pixels) {
+
+    short value;
+
+    value = 100*pixels;
+
+    return value;
+}
+
+short ShortDegree (float degrees) {
+
+    short value;
+
+    value = (0xffff/360.0)*degrees;
+
+    return value;
+}
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/UpdateImageIDs.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/UpdateImageIDs.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/UpdateImageIDs.c	(revision 21444)
@@ -43,10 +43,9 @@
 
   for (i = 0; i < Nstars; i++) {
-    stars[i].imageID += imageID;
+    stars[i].measure.imageID += imageID;
   }
 
   imageID += Nimages;
   status = gfits_modify (&db.header, "IMAGEID", "%u", 1, imageID);
- 
 
   if (isEmpty) {
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/addstar.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/addstar.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/addstar.c	(revision 21444)
@@ -135,5 +135,5 @@
 	break;
       case M_REFCAT:
-	stars = grefcat (argv[1], skylist[0].regions[i], options.photcode, &Nstars);
+	stars = greference (argv[1], skylist[0].regions[i], options.photcode, &Nstars);
       case M_REFLIST:
 	subset = find_subset (skylist[0].regions[i], stars, Nstars, &Nsubset);
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/airmass.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/airmass.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/airmass.c	(revision 21444)
@@ -1,5 +1,5 @@
 # include "addstar.h"
 
-static int AirmassQuality = FALSE;
+static int AirmassQuality = TRUE;
 
 void SetAirmassQuality (int quality) {
@@ -25,2 +25,21 @@
   return (secz);
 }
+
+// ha/dec -> az
+float azimuth (double ha, double dec, double latitude) {
+
+  double rdec, rlat, rha;
+  double sinh, cosh;
+  float az;
+
+  rdec = RAD_DEG*dec;
+  rha = RAD_DEG*ha;
+  rlat = RAD_DEG*latitude;
+
+  sinh = - cos (rdec) * sin (rha);
+  cosh =   sin (rdec) * cos (rlat) - cos (rdec) * cos (rha) * sin (rlat);
+
+  az = DEG_RAD * atan2 (sinh, cosh);
+
+  return az;
+}
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/args.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/args.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/args.c	(revision 21444)
@@ -28,4 +28,8 @@
     remove_argument (N, &argc, argv);
   }
+  if ((N = get_argument (argc, argv, "-resort"))) {
+    options.mode = M_RESORT;
+    remove_argument (N, &argc, argv);
+  }
   if ((N = get_argument (argc, argv, "-fakeimage"))) {
     options.mode = M_FAKEIMAGE;
@@ -36,8 +40,4 @@
     remove_argument (N, &argc, argv);
     FAKE_THETA = atof (argv[N]);
-    remove_argument (N, &argc, argv);
-  }
-  if ((N = get_argument (argc, argv, "-resort"))) {
-    options.mode = M_RESORT;
     remove_argument (N, &argc, argv);
   }
@@ -221,8 +221,12 @@
   /*** optional situations ***/
   /* choose high quality airmass vs low quality airmass (per-star vs per-image) */
-  QUALITY_AIRMASS = FALSE;
+  QUALITY_AIRMASS = TRUE;
   if ((N = get_argument (argc, argv, "-quality-airmass"))) {
     remove_argument (N, &argc, argv);
     QUALITY_AIRMASS = TRUE;
+  }
+  if ((N = get_argument (argc, argv, "-quick-airmass"))) {
+    remove_argument (N, &argc, argv);
+    QUALITY_AIRMASS = FALSE;
   }
   /* choose high quality airmass vs low quality airmass (per-star vs per-image) */
@@ -310,8 +314,10 @@
 
   fprintf (stderr, "USAGE: addstar (filename)\n");
+  fprintf (stderr, "USAGE: addstar -list (filename)\n");
   fprintf (stderr, "USAGE: addstar -cat (catalog)\n");
   fprintf (stderr, "USAGE: addstar -ref (filename)\n");
   fprintf (stderr, "USAGE: addstar -fakeimage (ra) (dec) (theta) (name)\n");
   fprintf (stderr, "USAGE: addstar -resort (SkyRegion)\n");
+  fprintf (stderr, "USAGE: addstar -ppm (filename)\n");
   exit (2);
 }
@@ -322,4 +328,6 @@
   fprintf (stderr, "  addstar (filename)\n");
   fprintf (stderr, "     add specified image (cmp format) to database\n\n");
+  fprintf (stderr, "  addstar -list (filename)\n");
+  fprintf (stderr, "     add list of images (cmp format) to database\n\n");
   fprintf (stderr, "  addstar -ref (filename)");
   fprintf (stderr, "     add ASCII data (ra dec mag dmag) to database\n\n");
@@ -328,4 +336,8 @@
   fprintf (stderr, "  addstar -resort (SkyRegion)");
   fprintf (stderr, "     perform measure sorting for the specified catalog\n\n");
+  fprintf (stderr, "  addstar -fakeimage (ra) (dec) (theta) (name)");
+  fprintf (stderr, "     insert a fake image in the db\n\n");
+  fprintf (stderr, "  addstar -pmm (filename)");
+  fprintf (stderr, "     insert pmm table into database\n\n");
 
   fprintf (stderr, "  optional flags:\n");
@@ -340,14 +352,25 @@
   fprintf (stderr, "  -missed               	  : skipped 'missed' entries\n");
   fprintf (stderr, "  -replace              	  : replace time/photcode measurements (no duplication)\n");
-  fprintf (stderr, "  -closest             	  : use closest-star algorith\n");
+  fprintf (stderr, "  -closest             	  : use closest-star algorith (default)\n");
+  fprintf (stderr, "  -all-matches             	  : use all-matches algorith\n");
   fprintf (stderr, "  -nosort             	  : don't re-sort the measure entries (improves speed)\n");
   fprintf (stderr, "  -update             	  : only update the new rows (forces -nosort)\n");
+  fprintf (stderr, "  -force-sort             	  : \n");
   fprintf (stderr, "  -image                	  : only insert image data\n");
   fprintf (stderr, "  -cal                  	  : perform zero-point calibration\n");
+  fprintf (stderr, "  -excal                  	  : apply supplied zero-point calibration\n");
+  fprintf (stderr, "  -incal                  	  : perform zero-point calibration\n");
+  fprintf (stderr, "  -quality-airmass            : use per-star airmass values (default)\n");
+  fprintf (stderr, "  -quick-airmass              : use per-image airmass values\n");
+  fprintf (stderr, "  -subpix             	  : apply subpixel corrections\n");
   fprintf (stderr, "  -skyprobe             	  : specify skyprobe mode\n");
+  fprintf (stderr, "  -2massquality            	  : define 2MASS quality flags to keep\n");
   fprintf (stderr, "  -accept               	  : accept bad astrometry from header\n");
   fprintf (stderr, "  -accept-astrom          	  : accept bad astrometry from header\n");
   fprintf (stderr, "  -accept-motion           	  : accept proper-motion data from reference\n");
+  fprintf (stderr, "  -accept-time           	  : use TZERO supplied in header\n");
+  fprintf (stderr, "  -no-stars                	  : skip the stars\n");
   fprintf (stderr, "  -force                	  : force read of database with inconsistent info\n");
+  fprintf (stderr, "  -textmode                	  : force textmode for file (ignore header clues)\n");
   fprintf (stderr, "  -v                    	  : verbose mode\n");
   fprintf (stderr, "  -dump (mode)          	  : output test data. Currently supported values for mode are: 'rawdata', 'cal'.\n");
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/dump.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/dump.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/dump.c	(revision 21444)
@@ -11,7 +11,7 @@
     fprintf (f, "%4d  %10.6f %10.6f  %8.2f %8.2f  %7.2f %7.2f\n", 
 	     i, 
-	     stars[i].R, stars[i].D,
-	     stars[i].Xccd, stars[i].Yccd,
-	     stars[i].M, stars[i].dM);
+	     stars[i].average.R, stars[i].average.D,
+	     stars[i].measure.Xccd, stars[i].measure.Yccd,
+	     stars[i].measure.M, stars[i].measure.dM);
   }
 
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/find_matches.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/find_matches.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/find_matches.c	(revision 21444)
@@ -62,8 +62,8 @@
   strcpy (tcoords.ctype, "RA---ARC");
 
-  /* build spatial index (RA sort) */
+  /* build spatial index (RA sort) referencing input array sequence */
   Nstars = 0;
   for (i = 0; i < NstarsIn; i++) {
-    status = RD_to_XY (&X1[Nstars], &Y1[Nstars], stars[i].R, stars[i].D, &tcoords);
+    status = RD_to_XY (&X1[Nstars], &Y1[Nstars], stars[i].average.R, stars[i].average.D, &tcoords);
     if (!status) continue;
     N1[Nstars] = i;
@@ -104,5 +104,5 @@
   /** find matched stars **/
   for (i = j = 0; (i < Nstars) && (j < Nave); ) {
-        if (!finite(X1[i]) || !finite(Y1[i])) { 
+    if (!finite(X1[i]) || !finite(Y1[i])) { 
       i++; 
       continue;
@@ -147,59 +147,32 @@
 
       /** add measurements for this star **/
-      /** dR,dD now represent arcsec **/
-      catalog[0].measure[Nmeas].dR       = 3600.0*(catalog[0].average[n].R - stars[N].R);
+
+      // set the new measurements
+      catalog[0].measure[Nmeas]          = stars[N].measure;
+
+      // the following measure elements cannot be set until here:
+      catalog[0].measure[Nmeas].dR       = 3600.0*(catalog[0].average[n].R - stars[N].average.R);
+      catalog[0].measure[Nmeas].dD       = 3600.0*(catalog[0].average[n].D - stars[N].average.D);
+      catalog[0].measure[Nmeas].dbFlags  = 0;
+      catalog[0].measure[Nmeas].averef   = n; // this must be an absolute sequence number, if partial average is loaded 
+
+      // rationalize dR:
       if (catalog[0].measure[Nmeas].dR > +180.0*3600.0) {
 	  // average on high end of boundary, move star up
-	  stars[N].R += 360.0;
-	  catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N].R);
+	  stars[N].average.R += 360.0;
+	  catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N].average.R);
       }
       if (catalog[0].measure[Nmeas].dR < -180.0*3600.0) {
 	  // average on low end of boundary, move star down
-	  stars[N].R -= 360.0;
-	  catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N].R);
+	  stars[N].average.R -= 360.0;
+	  catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N].average.R);
       }
       if (fabs(catalog[0].measure[Nmeas].dR) > 10*RADIUS) {
 	  fprintf (stderr, "error: %10.6f,%10.6f vs %10.6f,%10.6f (%f,%f vs %f,%f)\n", 
 		   catalog[0].average[n].R, catalog[0].average[n].D, 
-		   stars[N].R, stars[N].D,
+		   stars[N].average.R, stars[N].average.D,
 		   X1[i], X2[J], 
 		   Y1[i], Y2[J]);
       }
-      catalog[0].measure[Nmeas].dD       = 3600.0*(catalog[0].average[n].D - stars[N].D);
-
-      catalog[0].measure[Nmeas].Xccd     = stars[N].Xccd;
-      catalog[0].measure[Nmeas].Yccd     = stars[N].Yccd;
-
-      catalog[0].measure[Nmeas].M        = stars[N].M;
-      catalog[0].measure[Nmeas].dM       = stars[N].dM;  /* error in input files stored in thousandths of mag */
-      catalog[0].measure[Nmeas].Mcal     = stars[N].Mcal;
-      catalog[0].measure[Nmeas].t        = stars[N].t;
-      catalog[0].measure[Nmeas].photcode = stars[N].photcode;
-      catalog[0].measure[Nmeas].dt       = stars[N].dt;
-      catalog[0].measure[Nmeas].airmass  = stars[N].airmass;
-
-      catalog[0].measure[Nmeas].photFlags = stars[N].photFlags;
-      catalog[0].measure[Nmeas].psfQual   = stars[N].psfQual;
-      catalog[0].measure[Nmeas].psfChisq  = stars[N].psfChisq;
-      catalog[0].measure[Nmeas].crNsigma  = stars[N].crNsigma;
-      catalog[0].measure[Nmeas].extNsigma = stars[N].extNsigma;
-      catalog[0].measure[Nmeas].Sky       = stars[N].Sky;
-      catalog[0].measure[Nmeas].dSky      = stars[N].dSky;
-
-      catalog[0].measure[Nmeas].stargal   = 0; // XXX not yet set
-
-      catalog[0].measure[Nmeas].detID     = stars[N].detID;
-      catalog[0].measure[Nmeas].imageID   = stars[N].imageID;
-
-      catalog[0].measure[Nmeas].dXccd     = stars[N].dXccd;
-      catalog[0].measure[Nmeas].dYccd     = stars[N].dYccd;
-
-      catalog[0].measure[Nmeas].Map      = stars[N].Map;
-      catalog[0].measure[Nmeas].FWx      = 100*stars[N].fx;
-      catalog[0].measure[Nmeas].FWy      = 100*stars[N].fy;
-      catalog[0].measure[Nmeas].theta    = (0xffff/360.0)*stars[N].df;
-	
-      catalog[0].measure[Nmeas].dbFlags  = 0;
-      catalog[0].measure[Nmeas].averef   = n;              /* this must be an absolute sequence number, if partial average is loaded */
 
       /* adds the measurement to the calibration if appropriate color terms are found */
@@ -266,72 +239,54 @@
     N = N1[i];
     if (stars[N].found >= 0) continue;
-    if (!IN_REGION (stars[N].R, stars[N].D)) continue;
-
-    catalog[0].average[Nave].R         	   = stars[N].R;
-    catalog[0].average[Nave].D         	   = stars[N].D;
-    catalog[0].average[Nave].Xp        	   = 0;
+    if (!IN_REGION (stars[N].average.R, stars[N].average.D)) continue;
+
+    catalog[0].average[Nave].R         	   = stars[N].average.R;
+    catalog[0].average[Nave].D         	   = stars[N].average.D;
+    catalog[0].average[Nave].dR        	   = 0;
+    catalog[0].average[Nave].dD        	   = 0;
+
     catalog[0].average[Nave].Nmeasure      = 1;
     catalog[0].average[Nave].Nmissing      = 0;
+    catalog[0].average[Nave].Nextend       = 0;
+
     catalog[0].average[Nave].measureOffset = Nmeas;
     catalog[0].average[Nave].missingOffset = -1;
+    catalog[0].average[Nave].extendOffset  = -1;
+
+    catalog[0].average[Nave].uR        	   = 0;
+    catalog[0].average[Nave].uD        	   = 0;
+    catalog[0].average[Nave].duR       	   = 0;
+    catalog[0].average[Nave].duD       	   = 0;
+    catalog[0].average[Nave].P         	   = 0;
+    catalog[0].average[Nave].dP        	   = 0;
+
+    catalog[0].average[Nave].Xp        	   = 0;
+    catalog[0].average[Nave].ChiSq    	   = 0.0;
+    catalog[0].average[Nave].Npos    	   = 0;
+
+    catalog[0].average[Nave].objID     	   = objID;
+    catalog[0].average[Nave].catID     	   = catID;
     catalog[0].average[Nave].flags         = 0;
 
-    catalog[0].average[Nave].dR        = 0;
-    catalog[0].average[Nave].dD        = 0;
-    catalog[0].average[Nave].uR        = 0;
-    catalog[0].average[Nave].uD        = 0;
-    catalog[0].average[Nave].duR       = 0;
-    catalog[0].average[Nave].duD       = 0;
-    catalog[0].average[Nave].P         = 0;
-    catalog[0].average[Nave].dP        = 0;
-
-    catalog[0].average[Nave].objID     = objID;
-    catalog[0].average[Nave].catID     = catID;
     objID ++;
 
     for (j = 0; j < Nsecfilt; j++) {
-      catalog[0].secfilt[Nave*Nsecfilt+j].M  = NAN;
-      catalog[0].secfilt[Nave*Nsecfilt+j].dM = NAN;
-      catalog[0].secfilt[Nave*Nsecfilt+j].Xm = NAN_S_SHORT;
-    }
-
-    catalog[0].measure[Nmeas].Xccd     = stars[N].Xccd;
-    catalog[0].measure[Nmeas].Yccd     = stars[N].Yccd;
-
+      catalog[0].secfilt[Nave*Nsecfilt+j].M    	= NAN;
+      catalog[0].secfilt[Nave*Nsecfilt+j].dM   	= NAN;
+      catalog[0].secfilt[Nave*Nsecfilt+j].Xm   	= NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsecfilt+j].M_20 	= NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsecfilt+j].M_80 	= NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsecfilt+j].Ncode = 0;
+      catalog[0].secfilt[Nave*Nsecfilt+j].Nused = 0;
+    }
+
+    // supply the measurments from this detection
+    catalog[0].measure[Nmeas]           = stars[N].measure;
+
+    // the following measure elements cannot be set until here:
     catalog[0].measure[Nmeas].dR       	= 0.0;
     catalog[0].measure[Nmeas].dD       	= 0.0;
-    catalog[0].measure[Nmeas].M        	= stars[N].M;
-    catalog[0].measure[Nmeas].dM       	= stars[N].dM;
-    catalog[0].measure[Nmeas].Mcal  	= stars[N].Mcal;
-    catalog[0].measure[Nmeas].t        	= stars[N].t;
-    catalog[0].measure[Nmeas].photcode  = stars[N].photcode;
-    catalog[0].measure[Nmeas].dt    	= stars[N].dt;
-    catalog[0].measure[Nmeas].airmass   = stars[N].airmass;
-
-    catalog[0].measure[Nmeas].photFlags = stars[N].photFlags;
-    catalog[0].measure[Nmeas].psfQual   = stars[N].psfQual;
-    catalog[0].measure[Nmeas].psfChisq  = stars[N].psfChisq;
-    catalog[0].measure[Nmeas].crNsigma  = stars[N].crNsigma;
-    catalog[0].measure[Nmeas].extNsigma = stars[N].extNsigma;
-    catalog[0].measure[Nmeas].Sky       = stars[N].Sky;
-    catalog[0].measure[Nmeas].dSky      = stars[N].dSky;
-
-    catalog[0].measure[Nmeas].detID     = stars[N].detID;
-    catalog[0].measure[Nmeas].imageID   = stars[N].imageID;
-
-    catalog[0].measure[Nmeas].dXccd     = stars[N].dXccd;
-    catalog[0].measure[Nmeas].dYccd     = stars[N].dYccd;
-
-    catalog[0].measure[Nmeas].Map  	= stars[N].Map;
-    catalog[0].measure[Nmeas].FWx      	= 100*stars[N].fx;
-    catalog[0].measure[Nmeas].FWy      	= 100*stars[N].fy;
-    catalog[0].measure[Nmeas].theta    	= (0xffff/360.0)*stars[N].df;
-
-    catalog[0].measure[Nmeas].stargal   = 0; // XXX not yet set
-
     catalog[0].measure[Nmeas].dbFlags 	= 0;
-    catalog[0].measure[Nmeas].averef   	= Nave;           /* XXX EAM : must be absolute Nave if partial read */
-
-    /* XXX replace df here with theta, right? */
+    catalog[0].measure[Nmeas].averef   	= Nave; // XXX EAM : must be absolute Nave if partial read
 
     /* set the average magnitude if not already set and the photcode.equiv is not 0 */
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/find_matches_closest.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/find_matches_closest.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/find_matches_closest.c	(revision 21444)
@@ -7,6 +7,6 @@
   double *X1, *Y1, *X2, *Y2;
   double dX, dY, dR;
-  int *N1, *N2,  *next_meas, *next_miss;
-  int Nave, NAVE, Nmeas, NMEAS, Nmiss, NMISS, Nmatch;
+  int *N1, *N2,  *next_meas;
+  int Nave, NAVE, Nmeas, NMEAS, Nmatch;
   int Nsecfilt, Nsec;
   unsigned int objID, catID;
@@ -37,5 +37,4 @@
   Nmatch = 0;
   NMEAS = Nmeas = catalog[0].Nmeasure;
-  NMISS = Nmiss = catalog[0].Nmissing;
 
   // current max obj ID for this catalog
@@ -66,5 +65,5 @@
   Nstars = 0;
   for (i = 0; i < NstarsIn; i++) {
-    status = RD_to_XY (&X1[Nstars], &Y1[Nstars], stars[i].R, stars[i].D, &tcoords);
+    status = RD_to_XY (&X1[Nstars], &Y1[Nstars], stars[i].average.R, stars[i].average.D, &tcoords);
     if (!status) continue;
     N1[Nstars] = i;
@@ -92,5 +91,5 @@
   if (Nave > 1) sort_coords_index (X2, Y2, N2, Nave);
 
-  /* set up pointers for linked list of measure, missing */
+  /* set up pointers for linked list of measure */
   if (catalog[0].sorted && (catalog[0].Nmeasure == catalog[0].Nmeas_disk)) {
     // this version is only valid if we have done a full catalog load, and if the catalog
@@ -100,6 +99,4 @@
     next_meas = build_measure_links (catalog[0].average, Nave, catalog[0].measure, Nmeas);
   }    
-  next_miss = init_missing_links (catalog[0].average, Nave, catalog[0].missing, Nmiss);
-  /* missing MUST be written 'sorted', or not at all */
 
   /* choose a radius for matches */
@@ -167,62 +164,39 @@
 	
     /** add measurements for this star **/
+
+    // set the new measurements
+    catalog[0].measure[Nmeas]          = stars[N].measure;
+
     /** dR,dD now represent arcsec **/
-    catalog[0].measure[Nmeas].dR       = 3600.0*(catalog[0].average[n].R - stars[N].R);
+    catalog[0].measure[Nmeas].dR       = 3600.0*(catalog[0].average[n].R - stars[N].average.R);
+    catalog[0].measure[Nmeas].dD       = 3600.0*(catalog[0].average[n].D - stars[N].average.D);
+    catalog[0].measure[Nmeas].dbFlags  = 0;
+    catalog[0].measure[Nmeas].averef   = n;
+
+    // rationalize dR
     if (catalog[0].measure[Nmeas].dR > +180.0*3600.0) {
       // average on high end of boundary, move star up
-      stars[N].R += 360.0;
-      catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N].R);
+      stars[N].average.R += 360.0;
+      catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N].average.R);
     }
     if (catalog[0].measure[Nmeas].dR < -180.0*3600.0) {
       // average on low end of boundary, move star down
-      stars[N].R -= 360.0;
-      catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N].R);
+      stars[N].average.R -= 360.0;
+      catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N].average.R);
     }
     if (fabs(catalog[0].measure[Nmeas].dR) > 10*RADIUS) {
       fprintf (stderr, "error: %10.6f,%10.6f vs %10.6f,%10.6f (%f,%f vs %f,%f)\n", 
 	       catalog[0].average[n].R, catalog[0].average[n].D, 
-	       stars[N].R, stars[N].D,
+	       stars[N].average.R, stars[N].average.D,
 	       X1[i], X2[Jmin], 
 	       Y1[i], Y2[Jmin]);
     }
-    catalog[0].measure[Nmeas].dD       = 3600.0*(catalog[0].average[n].D - stars[N].D);
-
-    catalog[0].measure[Nmeas].Xccd     = stars[N].Xccd;
-    catalog[0].measure[Nmeas].Yccd     = stars[N].Yccd;
-
-    catalog[0].measure[Nmeas].M        = stars[N].M;
-    catalog[0].measure[Nmeas].dM       = stars[N].dM;  /* error in input files stored in thousandths of mag */
-    catalog[0].measure[Nmeas].Mcal     = stars[N].Mcal;
-    catalog[0].measure[Nmeas].t        = stars[N].t;
-    catalog[0].measure[Nmeas].photcode = stars[N].photcode;
-    catalog[0].measure[Nmeas].dt       = stars[N].dt;
-    catalog[0].measure[Nmeas].airmass  = stars[N].airmass;
-
-    catalog[0].measure[Nmeas].photFlags = stars[N].photFlags;
-    catalog[0].measure[Nmeas].psfQual   = stars[N].psfQual;
-    catalog[0].measure[Nmeas].psfChisq  = stars[N].psfChisq;
-    catalog[0].measure[Nmeas].crNsigma  = stars[N].crNsigma;
-    catalog[0].measure[Nmeas].extNsigma = stars[N].extNsigma;
-    catalog[0].measure[Nmeas].Sky       = stars[N].Sky;
-    catalog[0].measure[Nmeas].dSky      = stars[N].dSky;
-
-    catalog[0].measure[Nmeas].detID     = stars[N].detID;
-    catalog[0].measure[Nmeas].imageID   = stars[N].imageID;
-
-    catalog[0].measure[Nmeas].dXccd     = stars[N].dXccd;
-    catalog[0].measure[Nmeas].dYccd     = stars[N].dYccd;
-
-    catalog[0].measure[Nmeas].Map       = stars[N].Map;
-
-    // XXX saturate range for FWx, FWy, theta
-    // XXX convert to unsigned int for these...
-    catalog[0].measure[Nmeas].FWx      = 100*stars[N].fx;
-    catalog[0].measure[Nmeas].FWy      = 100*stars[N].fy;
-    catalog[0].measure[Nmeas].theta    = (0xffff/360.0)*stars[N].df;
-	
-    catalog[0].measure[Nmeas].stargal   = 0;
-
-    catalog[0].measure[Nmeas].dbFlags  = 0;
-    catalog[0].measure[Nmeas].averef   = n;
+
+
+    /* adds the measurement to the calibration if appropriate color terms are found */
+    /* we call this before (optionally) setting the average magnitude to avoid auto-correlations */
+    if (options.calibrate) {
+      AddToCalibration (&catalog[0].average[n], &catalog[0].secfilt[n*Nsecfilt], catalog[0].measure, &catalog[0].measure[Nmeas], next_meas, N);
+    }
 
     /* set the average magnitude if not already set and the photcode.equiv is not 0 */
@@ -232,9 +206,4 @@
 	catalog[0].secfilt[n*Nsecfilt+Nsec].M = PhotCat (&catalog[0].measure[Nmeas]);
       }
-    }
-
-    /* adds the measurement to the calibration if appropriate color terms are found */
-    if (options.calibrate) {
-      AddToCalibration (&catalog[0].average[n], &catalog[0].secfilt[n*Nsecfilt], catalog[0].measure, &catalog[0].measure[Nmeas], next_meas, N);
     }
 
@@ -268,26 +237,34 @@
     N = N1[i];
     if (stars[N].found >= 0) continue;
-    if (!IN_REGION (stars[N].R, stars[N].D)) continue;
-
-    catalog[0].average[Nave].R         	   = stars[N].R;
-    catalog[0].average[Nave].D         	   = stars[N].D;
-    catalog[0].average[Nave].Xp        	   = 0;
+    if (!IN_REGION (stars[N].average.R, stars[N].average.D)) continue;
+
+    catalog[0].average[Nave].R         	   = stars[N].average.R;
+    catalog[0].average[Nave].D         	   = stars[N].average.D;
+    catalog[0].average[Nave].dR        	   = 0;
+    catalog[0].average[Nave].dD        	   = 0;
+
     catalog[0].average[Nave].Nmeasure  	   = 1;
     catalog[0].average[Nave].Nmissing  	   = 0;
+    catalog[0].average[Nave].Nextend       = 0;
+
     catalog[0].average[Nave].measureOffset = Nmeas;
     catalog[0].average[Nave].missingOffset = -1;
+    catalog[0].average[Nave].extendOffset  = -1;
+
+    catalog[0].average[Nave].uR        	   = 0;
+    catalog[0].average[Nave].uD        	   = 0;
+    catalog[0].average[Nave].duR       	   = 0;
+    catalog[0].average[Nave].duD       	   = 0;
+    catalog[0].average[Nave].P         	   = 0;
+    catalog[0].average[Nave].dP        	   = 0;
+
+    catalog[0].average[Nave].Xp        	   = 0;
+    catalog[0].average[Nave].ChiSq    	   = 0.0;
+    catalog[0].average[Nave].Npos    	   = 0;
+
+    catalog[0].average[Nave].objID     	   = objID;
+    catalog[0].average[Nave].catID     	   = catID;
     catalog[0].average[Nave].flags         = 0;
 
-    catalog[0].average[Nave].dR        = 0;
-    catalog[0].average[Nave].dD        = 0;
-    catalog[0].average[Nave].uR        = 0;
-    catalog[0].average[Nave].uD        = 0;
-    catalog[0].average[Nave].duR       = 0;
-    catalog[0].average[Nave].duD       = 0;
-    catalog[0].average[Nave].P         = 0;
-    catalog[0].average[Nave].dP        = 0;
-
-    catalog[0].average[Nave].objID     = objID;
-    catalog[0].average[Nave].catID     = catID;
     objID ++;
 
@@ -296,40 +273,16 @@
       catalog[0].secfilt[Nave*Nsecfilt+j].dM = NAN;
       catalog[0].secfilt[Nave*Nsecfilt+j].Xm = NAN_S_SHORT;
-    }
-
-    catalog[0].measure[Nmeas].Xccd     = stars[N].Xccd;
-    catalog[0].measure[Nmeas].Yccd     = stars[N].Yccd;
-
+      catalog[0].secfilt[Nave*Nsecfilt+j].M_20 	= NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsecfilt+j].M_80 	= NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsecfilt+j].Ncode = 0;
+      catalog[0].secfilt[Nave*Nsecfilt+j].Nused = 0;
+    }
+
+    // supply the measurments from this detection
+    catalog[0].measure[Nmeas]           = stars[N].measure;
+
+    // the following measure elements cannot be set until here:
     catalog[0].measure[Nmeas].dR       = 0.0;
     catalog[0].measure[Nmeas].dD       = 0.0;
-    catalog[0].measure[Nmeas].M        = stars[N].M;
-    catalog[0].measure[Nmeas].dM       = stars[N].dM;
-    catalog[0].measure[Nmeas].Mcal     = stars[N].Mcal;
-    catalog[0].measure[Nmeas].t        = stars[N].t;
-    catalog[0].measure[Nmeas].photcode = stars[N].photcode;
-    catalog[0].measure[Nmeas].dt       = stars[N].dt;
-    catalog[0].measure[Nmeas].airmass  = stars[N].airmass;
-
-    catalog[0].measure[Nmeas].photFlags = stars[N].photFlags;
-    catalog[0].measure[Nmeas].psfQual   = stars[N].psfQual;
-    catalog[0].measure[Nmeas].psfChisq  = stars[N].psfChisq;
-    catalog[0].measure[Nmeas].crNsigma  = stars[N].crNsigma;
-    catalog[0].measure[Nmeas].extNsigma = stars[N].extNsigma;
-    catalog[0].measure[Nmeas].Sky       = stars[N].Sky;
-    catalog[0].measure[Nmeas].dSky      = stars[N].dSky;
-
-    catalog[0].measure[Nmeas].stargal   = 0;
-
-    catalog[0].measure[Nmeas].detID     = stars[N].detID;
-    catalog[0].measure[Nmeas].imageID   = stars[N].imageID;
-
-    catalog[0].measure[Nmeas].dXccd     = stars[N].dXccd;
-    catalog[0].measure[Nmeas].dYccd     = stars[N].dYccd;
-
-    catalog[0].measure[Nmeas].Map      = stars[N].Map;
-    catalog[0].measure[Nmeas].FWx      = 100*stars[N].fx;
-    catalog[0].measure[Nmeas].FWy      = 100*stars[N].fy;
-    catalog[0].measure[Nmeas].theta    = (0xffff/360.0)*stars[N].df;
-
     catalog[0].measure[Nmeas].dbFlags  = 0;
     catalog[0].measure[Nmeas].averef   = Nave;
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/find_matches_refstars.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/find_matches_refstars.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/find_matches_refstars.c	(revision 21444)
@@ -69,5 +69,5 @@
   
   for (i = 0; i < Nstars; i++) {
-    RD_to_XY (&X1[i], &Y1[i], stars[i][0].R, stars[i][0].D, &tcoords);
+    RD_to_XY (&X1[i], &Y1[i], stars[i][0].average.R, stars[i][0].average.D, &tcoords);
     N1[i] = i;
   }
@@ -134,55 +134,46 @@
       /* find last measurement of this star */
       for (k = 0; k < catalog[0].average[n].Nmeasure - 1; k++) m = next[m];
+
       /* set up references */
       next[Nmeas] = next[m];
       next[m] = Nmeas;
+
       /* last just was moved */
       if (next[Nmeas] == -1) last = Nmeas;
 	
       /** add measurements for this star **/
+
+      // set the new measurements
+      catalog[0].measure[Nmeas]          = stars[N][0].measure;
+
       /** *** dR,dD now in arcsec *** **/
-      catalog[0].measure[Nmeas].dR       = 3600.0*(catalog[0].average[n].R - stars[N][0].R);
-      catalog[0].measure[Nmeas].dD       = 3600.0*(catalog[0].average[n].D - stars[N][0].D);
-      catalog[0].measure[Nmeas].M        = stars[N][0].M;
-      catalog[0].measure[Nmeas].dM       = stars[N][0].dM;
-      catalog[0].measure[Nmeas].Mcal     = 0;
-      catalog[0].measure[Nmeas].t        = (TIMEREF == 0) ? stars[N][0].t : TIMEREF; /** careful : time_t vs e_time **/
+      catalog[0].measure[Nmeas].dR       = 3600.0*(catalog[0].average[n].R - stars[N][0].average.R);
+      catalog[0].measure[Nmeas].dD       = 3600.0*(catalog[0].average[n].D - stars[N][0].average.D);
+
+      // rationalize dR:
+      if (catalog[0].measure[Nmeas].dR > +180.0*3600.0) {
+	  // average on high end of boundary, move star up
+	  stars[N][0].average.R += 360.0;
+	  catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N][0].average.R);
+      }
+      if (catalog[0].measure[Nmeas].dR < -180.0*3600.0) {
+	  // average on low end of boundary, move star down
+	  stars[N][0].average.R -= 360.0;
+	  catalog[0].measure[Nmeas].dR = 3600.0*(catalog[0].average[n].R - stars[N][0].average.R);
+      }
+
       catalog[0].measure[Nmeas].averef   = n;
-      catalog[0].measure[Nmeas].photcode = stars[N][0].photcode;
       catalog[0].measure[Nmeas].dbFlags  = 0;
-      catalog[0].measure[Nmeas].dt       = 0xffff;
-
-      catalog[0].measure[Nmeas].Map      = NAN;
-      catalog[0].measure[Nmeas].airmass  = 0;
-      catalog[0].measure[Nmeas].FWx      = stars[N][0].fx; // XXX make sure these are zero'ed as needed
-      catalog[0].measure[Nmeas].FWy      = stars[N][0].fy; // XXX make sure these are zero'ed as needed
-      catalog[0].measure[Nmeas].theta    = stars[N][0].df; // XXX make sure these are zero'ed as needed
-	
-      catalog[0].measure[Nmeas].photFlags = stars[N][0].photFlags; // XXX make sure these are zero'ed as needed
-      catalog[0].measure[Nmeas].psfQual   = 0;
-      catalog[0].measure[Nmeas].psfChisq  = 0;
-      catalog[0].measure[Nmeas].crNsigma  = 0;
-      catalog[0].measure[Nmeas].extNsigma = 0;
-      catalog[0].measure[Nmeas].Sky       = 0;
-      catalog[0].measure[Nmeas].dSky      = 0;
-
-      catalog[0].measure[Nmeas].stargal   = 0; // XXX not yet set
-
-      catalog[0].measure[Nmeas].detID     = 0;
-      catalog[0].measure[Nmeas].imageID   = 0;
-
-      catalog[0].measure[Nmeas].dXccd     = 0;
-      catalog[0].measure[Nmeas].dYccd     = 0;
-
-      catalog[0].measure[Nmeas].Xccd     = stars[N][0].Xccd; // XXX make sure these are zero'ed as needed
-      catalog[0].measure[Nmeas].Yccd     = stars[N][0].Yccd; // XXX make sure these are zero'ed as needed
+
+      catalog[0].measure[Nmeas].t        = (TIMEREF == 0) ? stars[N][0].measure.t      : TIMEREF; /** careful : time_t vs e_time **/
+      catalog[0].measure[Nmeas].t_msec   = (TIMEREF == 0) ? stars[N][0].measure.t_msec : TIMEREF; /** careful : time_t vs e_time **/
 
       if (ACCEPT_MOTION) {
-	catalog[0].average[n].uR         = stars[N][0].uR;
-	catalog[0].average[n].uD         = stars[N][0].uD;
-	catalog[0].average[n].duR        = stars[N][0].duR;
-	catalog[0].average[n].duD        = stars[N][0].duD;
-	catalog[0].average[n].P          = stars[N][0].P;
-	catalog[0].average[n].dP         = stars[N][0].dP;
+	catalog[0].average[n].uR         = stars[N][0].average.uR;
+	catalog[0].average[n].uD         = stars[N][0].average.uD;
+	catalog[0].average[n].duR        = stars[N][0].average.duR;
+	catalog[0].average[n].duD        = stars[N][0].average.duD;
+	catalog[0].average[n].P          = stars[N][0].average.P;
+	catalog[0].average[n].dP         = stars[N][0].average.dP;
       }
 
@@ -232,85 +223,70 @@
   for (i = 0; (i < Nstars) && !options.only_match; i+=NREFSTAR_GROUP) {
     N = N1[i];
-    if (stars[N][0].found >= 0) continue;
-
-    catalog[0].average[Nave].R         	   = stars[N][0].R;
-    catalog[0].average[Nave].D         	   = stars[N][0].D;
-    catalog[0].average[Nave].Xp        	   = 0;
+    if (stars[N][0].found > -1) continue;
+
+    catalog[0].average[Nave].R         	   = stars[N][0].average.R;
+    catalog[0].average[Nave].D         	   = stars[N][0].average.D;
+
     catalog[0].average[Nave].Nmeasure      = NREFSTAR_GROUP;
     catalog[0].average[Nave].Nmissing      = 0;
+    catalog[0].average[Nave].Nextend       = 0;
+
     catalog[0].average[Nave].measureOffset = Nmeas;
     catalog[0].average[Nave].missingOffset = -1;
-    catalog[0].average[Nave].flags         = 0;
+    catalog[0].average[Nave].extendOffset  = -1;
 
     if (ACCEPT_MOTION) {
-      catalog[0].average[Nave].dR    = stars[N][0].dR;
-      catalog[0].average[Nave].dD    = stars[N][0].dD;
-      catalog[0].average[Nave].uR    = stars[N][0].uR;
-      catalog[0].average[Nave].uD    = stars[N][0].uD;
-      catalog[0].average[Nave].duR   = stars[N][0].duR;
-      catalog[0].average[Nave].duD   = stars[N][0].duD;
-      catalog[0].average[Nave].P     = stars[N][0].P;
-      catalog[0].average[Nave].dP    = stars[N][0].dP;
+      catalog[0].average[Nave].dR    	   = stars[N][0].average.dR;
+      catalog[0].average[Nave].dD    	   = stars[N][0].average.dD;
+      catalog[0].average[Nave].uR    	   = stars[N][0].average.uR;
+      catalog[0].average[Nave].uD    	   = stars[N][0].average.uD;
+      catalog[0].average[Nave].duR   	   = stars[N][0].average.duR;
+      catalog[0].average[Nave].duD   	   = stars[N][0].average.duD;
+      catalog[0].average[Nave].P     	   = stars[N][0].average.P;
+      catalog[0].average[Nave].dP    	   = stars[N][0].average.dP;
     } else {
-      catalog[0].average[Nave].dR    = 0;
-      catalog[0].average[Nave].dD    = 0;
-      catalog[0].average[Nave].uR    = 0;
-      catalog[0].average[Nave].uD    = 0;
-      catalog[0].average[Nave].duR   = 0;
-      catalog[0].average[Nave].duD   = 0;
-      catalog[0].average[Nave].P     = 0;
-      catalog[0].average[Nave].dP    = 0;
-    }
-
-    catalog[0].average[Nave].objID     = objID;
-    catalog[0].average[Nave].catID     = catID;
+      catalog[0].average[Nave].dR    	   = 0;
+      catalog[0].average[Nave].dD    	   = 0;
+      catalog[0].average[Nave].uR    	   = 0;
+      catalog[0].average[Nave].uD    	   = 0;
+      catalog[0].average[Nave].duR   	   = 0;
+      catalog[0].average[Nave].duD   	   = 0;
+      catalog[0].average[Nave].P     	   = 0;
+      catalog[0].average[Nave].dP    	   = 0;
+      catalog[0].average[Nave].Xp    	   = 0;
+    }
+
+    catalog[0].average[Nave].Xp            = 0;
+    catalog[0].average[Nave].ChiSq    	   = 0.0;
+    catalog[0].average[Nave].Npos    	   = 0;
+
+    catalog[0].average[Nave].objID     	   = objID;
+    catalog[0].average[Nave].catID     	   = catID;
+    catalog[0].average[Nave].flags     	   = 0;
+
     objID ++;
 
     for (j = 0; j < Nsecfilt; j++) {
-      catalog[0].secfilt[Nave*Nsecfilt+j].M  = NAN;
-      catalog[0].secfilt[Nave*Nsecfilt+j].dM = NAN;
-      catalog[0].secfilt[Nave*Nsecfilt+j].Xm = NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsecfilt+j].M  	= NAN;
+      catalog[0].secfilt[Nave*Nsecfilt+j].dM 	= NAN;
+      catalog[0].secfilt[Nave*Nsecfilt+j].Xm 	= NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsecfilt+j].M_20 	= NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsecfilt+j].M_80 	= NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsecfilt+j].Ncode = 0;
+      catalog[0].secfilt[Nave*Nsecfilt+j].Nused = 0;
     }
 
     for (j = 0; j < NREFSTAR_GROUP; j++) {
       N = N1[i + j];
+
+      catalog[0].measure[Nmeas]          = stars[N][0].measure;
+
       catalog[0].measure[Nmeas].dR       = 0.0;
       catalog[0].measure[Nmeas].dD       = 0.0;
-      catalog[0].measure[Nmeas].M        = stars[N][0].M;
-      catalog[0].measure[Nmeas].dM       = stars[N][0].dM;
-      catalog[0].measure[Nmeas].Mcal     = 0;
-      catalog[0].measure[Nmeas].t        = (stars[N][0].t == 0) ? TIMEREF : stars[N][0].t; /** careful : time_t vs e_time **/
+
+      catalog[0].measure[Nmeas].t        = (stars[N][0].measure.t == 0) ? TIMEREF : stars[N][0].measure.t;      /** careful : time_t vs e_time **/
+      catalog[0].measure[Nmeas].t_msec   = (stars[N][0].measure.t == 0) ?       0 : stars[N][0].measure.t_msec; /** careful : time_t vs e_time **/
+      catalog[0].measure[Nmeas].dbFlags  = 0;
       catalog[0].measure[Nmeas].averef   = Nave;
-      catalog[0].measure[Nmeas].photcode = stars[N][0].photcode;
-      catalog[0].measure[Nmeas].dbFlags  = 0;
-      catalog[0].measure[Nmeas].dt       = 0xffff;
-
-      catalog[0].measure[Nmeas].photFlags = stars[N][0].photFlags; // XXX make sure these are zero'ed as needed
-      catalog[0].measure[Nmeas].psfQual   = 0;
-      catalog[0].measure[Nmeas].psfChisq  = 0;
-      catalog[0].measure[Nmeas].crNsigma  = 0;
-      catalog[0].measure[Nmeas].extNsigma = 0;
-      catalog[0].measure[Nmeas].Sky       = 0;
-      catalog[0].measure[Nmeas].dSky      = 0;
-
-      catalog[0].measure[Nmeas].stargal   = 0; // XXX not yet set
-
-      catalog[0].measure[Nmeas].detID     = 0;
-      catalog[0].measure[Nmeas].imageID   = 0;
-
-      catalog[0].measure[Nmeas].dXccd     = 0;
-      catalog[0].measure[Nmeas].dYccd     = 0;
-
-      catalog[0].measure[Nmeas].Xccd     = stars[N][0].Xccd; // XXX make sure these are zero'ed as needed
-      catalog[0].measure[Nmeas].Yccd     = stars[N][0].Yccd; // XXX make sure these are zero'ed as needed
-
-      catalog[0].measure[Nmeas].airmass  = 0;
-      catalog[0].measure[Nmeas].Map      = NAN;
-      catalog[0].measure[Nmeas].FWx      = stars[N][0].fx; // XXX make sure these are zero'ed as needed
-      catalog[0].measure[Nmeas].FWy      = stars[N][0].fy; // XXX make sure these are zero'ed as needed
-      catalog[0].measure[Nmeas].theta    = stars[N][0].df; // XXX make sure these are zero'ed as needed
-
-      catalog[0].measure[Nmeas].Xccd     = 0.0;
-      catalog[0].measure[Nmeas].Yccd     = 0.0;
 
       stars[N][0].found = Nmeas;
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/find_subset.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/find_subset.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/find_subset.c	(revision 21444)
@@ -20,8 +20,8 @@
   /* find stars within ra,dec region */
   for (i = N = 0; i < Nstars; i++) {
-    if (stars[i].R <  RA0)  continue;
-    if (stars[i].R >= RA1)  continue;
-    if (stars[i].D <  DEC0) continue;
-    if (stars[i].D >= DEC1) continue;
+    if (stars[i].average.R <  RA0)  continue;
+    if (stars[i].average.R >= RA1)  continue;
+    if (stars[i].average.D <  DEC0) continue;
+    if (stars[i].average.D >= DEC1) continue;
 
     subset[N] = &stars[i];
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/get2mass_full.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/get2mass_full.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/get2mass_full.c	(revision 21444)
@@ -15,44 +15,44 @@
   ptr = next2MASSfield (ptr); // dec (assumed to be already set)
   ptr = next2MASSfield (ptr); // err_maj
-  star[0][0].fx = strtod (ptr, NULL);
+  star[0][0].measure.FWx = ShortPixels(strtod (ptr, NULL));
   ptr = next2MASSfield (ptr); // err_min
-  star[0][0].fy = strtod (ptr, NULL);
+  star[0][0].measure.FWy = ShortPixels(strtod (ptr, NULL));
   ptr = next2MASSfield (ptr); // err_ang
-  star[0][0].df = strtod (ptr, NULL);
-
-  star[2][0].fx = star[2][0].fx = star[0][0].fx;
-  star[2][0].fy = star[2][0].fy = star[0][0].fy;
-  star[2][0].df = star[2][0].df = star[0][0].df;
+  star[0][0].measure.theta = ShortPixels(strtod (ptr, NULL));
+
+  star[2][0].measure.FWx   = star[2][0].measure.FWx   = star[0][0].measure.FWx;
+  star[2][0].measure.FWy   = star[2][0].measure.FWy   = star[0][0].measure.FWy;
+  star[2][0].measure.theta = star[2][0].measure.theta = star[0][0].measure.theta;
 
   ptr = next2MASSfield (ptr); // designation (skip)
 
   ptr = next2MASSfield (ptr); // j_m
-  star[0][0].M  = strtod (ptr, NULL);
+  star[0][0].measure.M  = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // j_cmsig
-  star[0][0].dM = strtod (ptr, NULL);
+  star[0][0].measure.dM = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // j_msigcom
   dMfull = strtod (ptr, NULL);
-  star[0][0].dMcal = sqrt (SQ(dMfull) - SQ(star[0][0].dM));
+  star[0][0].measure.dMcal = sqrt (SQ(dMfull) - SQ(star[0][0].measure.dM));
   ptr = next2MASSfield (ptr); // j_snr (skip)
 
   ptr = next2MASSfield (ptr); // h_m
-  star[1][0].M  = strtod (ptr, NULL);
+  star[1][0].measure.M  = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // h_cmsig
-  star[1][0].dM = strtod (ptr, NULL);
+  star[1][0].measure.dM = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // h_msigcom
   dMfull = strtod (ptr, NULL);
-  star[1][0].dMcal = sqrt (SQ(dMfull) - SQ(star[1][0].dM));
+  star[1][0].measure.dMcal = sqrt (SQ(dMfull) - SQ(star[1][0].measure.dM));
   ptr = next2MASSfield (ptr); // h_snr (skip)
 
   ptr = next2MASSfield (ptr); // k_m
-  star[2][0].M  = strtod (ptr, NULL);
+  star[2][0].measure.M  = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // k_cmsig
-  star[2][0].dM = strtod (ptr, NULL);
+  star[2][0].measure.dM = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // k_msigcom
   dMfull = strtod (ptr, NULL);
-  star[2][0].dMcal = sqrt (SQ(dMfull) - SQ(star[2][0].dM));
+  star[2][0].measure.dMcal = sqrt (SQ(dMfull) - SQ(star[2][0].measure.dM));
   ptr = next2MASSfield (ptr); // k_snr (skip)
 
-  star[2][0].photFlags = star[1][0].photFlags = star[0][0].photFlags = 0;
+  star[2][0].measure.photFlags = star[1][0].measure.photFlags = star[0][0].measure.photFlags = 0;
 
   ptr = next2MASSfield (ptr); // ph_qual
@@ -99,29 +99,29 @@
 
   ptr = next2MASSfield (ptr); // x_scan
-  star[0][0].Xccd = strtod (ptr, NULL);
-  star[2][0].Xccd = star[1][0].Xccd = star[0][0].Xccd;
+  star[0][0].measure.Xccd = strtod (ptr, NULL);
+  star[2][0].measure.Xccd = star[1][0].measure.Xccd = star[0][0].measure.Xccd;
 
   ptr = next2MASSfield (ptr); // jdate (julian date)
   jd = strtod (ptr, NULL);
-  star[0][0].t = ohana_jd_to_sec (jd);
-  star[2][0].t = star[1][0].t = star[0][0].t;
+  star[0][0].measure.t = ohana_jd_to_sec (jd);
+  star[2][0].measure.t = star[1][0].measure.t = star[0][0].measure.t;
 
   ptr = next2MASSfield (ptr); // j_psfchi
-  star[0][0].psfChisq = strtod (ptr, NULL);
+  star[0][0].measure.psfChisq = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // h_psfchi
-  star[1][0].psfChisq = strtod (ptr, NULL);
+  star[1][0].measure.psfChisq = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // k_psfchi
-  star[2][0].psfChisq = strtod (ptr, NULL);
+  star[2][0].measure.psfChisq = strtod (ptr, NULL);
 
   ptr = next2MASSfield (ptr); // j_m_stdap
-  star[0][0].Map = strtod (ptr, NULL);
+  star[0][0].measure.Map = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // j_msig_stdap (skip?)
 
   ptr = next2MASSfield (ptr); // h_m_stdap
-  star[1][0].Map = strtod (ptr, NULL);
+  star[1][0].measure.Map = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // h_msig_stdap (skip?)
 
   ptr = next2MASSfield (ptr); // k_m_stdap
-  star[2][0].Map = strtod (ptr, NULL);
+  star[2][0].measure.Map = strtod (ptr, NULL);
   ptr = next2MASSfield (ptr); // k_msig_stdap (skip?)
 
@@ -140,18 +140,15 @@
   set2MASS_use_flag (star[2], ptr[0]);
 
-  star[0][0].photcode  = TM_J;
-  star[0][0].found = -1;
-  star[0][0].detID   = 0;
-  star[0][0].imageID = 0;
-
-  star[1][0].photcode  = TM_H;
-  star[1][0].found = -1;
-  star[1][0].detID   = 0;
-  star[1][0].imageID = 0;
-
-  star[2][0].photcode  = TM_K;
-  star[2][0].found = -1;
-  star[2][0].detID   = 0;
-  star[2][0].imageID = 0;
+  star[0][0].measure.photcode  = TM_J;
+  star[0][0].measure.detID   = 0;
+  star[0][0].measure.imageID = 0;
+
+  star[1][0].measure.photcode  = TM_H;
+  star[1][0].measure.detID   = 0;
+  star[1][0].measure.imageID = 0;
+
+  star[2][0].measure.photcode  = TM_K;
+  star[2][0].measure.detID   = 0;
+  star[2][0].measure.imageID = 0;
 
   return TRUE;
@@ -174,12 +171,12 @@
 
   switch (qual) {
-    case 'X': star[0].photFlags |= 0x0000; break;
-    case 'U': star[0].photFlags |= 0x0001; break;
-    case 'F': star[0].photFlags |= 0x0002; break;
-    case 'E': star[0].photFlags |= 0x0003; break;
-    case 'A': star[0].photFlags |= 0x0004; break;
-    case 'B': star[0].photFlags |= 0x0005; break;
-    case 'C': star[0].photFlags |= 0x0006; break;
-    case 'D': star[0].photFlags |= 0x0007; break;
+    case 'X': star[0].measure.photFlags |= 0x0000; break;
+    case 'U': star[0].measure.photFlags |= 0x0001; break;
+    case 'F': star[0].measure.photFlags |= 0x0002; break;
+    case 'E': star[0].measure.photFlags |= 0x0003; break;
+    case 'A': star[0].measure.photFlags |= 0x0004; break;
+    case 'B': star[0].measure.photFlags |= 0x0005; break;
+    case 'C': star[0].measure.photFlags |= 0x0006; break;
+    case 'D': star[0].measure.photFlags |= 0x0007; break;
     default: 
       fprintf (stderr, "error!\n");
@@ -192,11 +189,11 @@
 
   switch (qual) {
-    case '0': star[0].photFlags |= 0x0000; break;
-    case '1': star[0].photFlags |= 0x0010; break;
-    case '2': star[0].photFlags |= 0x0020; break;
-    case '3': star[0].photFlags |= 0x0030; break;
-    case '4': star[0].photFlags |= 0x0040; break;
-    case '6': star[0].photFlags |= 0x0050; break;
-    case '9': star[0].photFlags |= 0x0060; break;
+    case '0': star[0].measure.photFlags |= 0x0000; break;
+    case '1': star[0].measure.photFlags |= 0x0010; break;
+    case '2': star[0].measure.photFlags |= 0x0020; break;
+    case '3': star[0].measure.photFlags |= 0x0030; break;
+    case '4': star[0].measure.photFlags |= 0x0040; break;
+    case '6': star[0].measure.photFlags |= 0x0050; break;
+    case '9': star[0].measure.photFlags |= 0x0060; break;
     default: 
       fprintf (stderr, "error!\n");
@@ -209,10 +206,10 @@
 
   switch (qual) {
-    case 'p': star[0].photFlags |= 0x0000; break;
-    case 'c': star[0].photFlags |= 0x0100; break;
-    case 'd': star[0].photFlags |= 0x0200; break;
-    case 's': star[0].photFlags |= 0x0300; break;
-    case 'b': star[0].photFlags |= 0x0400; break;
-    case '0': star[0].photFlags |= 0x0500; break;
+    case 'p': star[0].measure.photFlags |= 0x0000; break;
+    case 'c': star[0].measure.photFlags |= 0x0100; break;
+    case 'd': star[0].measure.photFlags |= 0x0200; break;
+    case 's': star[0].measure.photFlags |= 0x0300; break;
+    case 'b': star[0].measure.photFlags |= 0x0400; break;
+    case '0': star[0].measure.photFlags |= 0x0500; break;
     default: 
       fprintf (stderr, "error!\n");
@@ -225,7 +222,7 @@
 
   switch (qual) {
-    case '0': star[0].photFlags &= ~0x0008; break;
-    case '1': star[0].photFlags &= ~0x0008; break;
-    default:  star[0].photFlags |=  0x0008; break;
+    case '0': star[0].measure.photFlags &= ~0x0008; break;
+    case '1': star[0].measure.photFlags &= ~0x0008; break;
+    default:  star[0].measure.photFlags |=  0x0008; break;
   }      
   return (TRUE);
@@ -235,9 +232,9 @@
 
   switch (qual) {
-    case '0': star[0].photFlags &= ~0x0080; break;
-    case '1': star[0].photFlags &= ~0x0080; break;
+    case '0': star[0].measure.photFlags &= ~0x0080; break;
+    case '1': star[0].measure.photFlags &= ~0x0080; break;
     default:  
-      star[0].photFlags |= 0x0080; 
-      star[0].extNsigma = 100.0;
+      star[0].measure.photFlags |= 0x0080; 
+      star[0].measure.extNsigma = 100.0;
       break;
   }      
@@ -248,7 +245,7 @@
 
   switch (qual) {
-    case '0': star[0].photFlags &= ~0x0800; break;
-    case '1': star[0].photFlags &= ~0x0800; break;
-    default:  star[0].photFlags |=  0x0800; break;
+    case '0': star[0].measure.photFlags &= ~0x0800; break;
+    case '1': star[0].measure.photFlags &= ~0x0800; break;
+    default:  star[0].measure.photFlags |=  0x0800; break;
   }      
   return (TRUE);
@@ -258,7 +255,7 @@
 
   switch (qual) {
-    case '0': star[0].photFlags &= ~0x1000; break;
-    case '1': star[0].photFlags &= ~0x1000; break;
-    default:  star[0].photFlags |=  0x1000; break;
+    case '0': star[0].measure.photFlags &= ~0x1000; break;
+    case '1': star[0].measure.photFlags &= ~0x1000; break;
+    default:  star[0].measure.photFlags |=  0x1000; break;
   }      
   return (TRUE);
@@ -268,6 +265,6 @@
 
   switch (qual) {
-    case '0': star[0].photFlags &= ~0x2000; break;
-    case '1': star[0].photFlags |=  0x2000; break;
+    case '0': star[0].measure.photFlags &= ~0x2000; break;
+    case '1': star[0].measure.photFlags |=  0x2000; break;
     default:  abort();
   }      
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/get2mass_ops.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/get2mass_ops.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/get2mass_ops.c	(revision 21444)
@@ -42,4 +42,6 @@
   double M, dM;
   e_time time;
+
+  InitStar (star);
 
   ptr = skipNbounds (line, '|', FilterSkip, Nmax);
@@ -57,11 +59,10 @@
   }
 
-  star[0].M        = M;
-  star[0].dM       = dM;
-  star[0].photcode = Photcode;
-  star[0].t        = time;
-  star[0].found    = -1;
-  star[0].detID    = 0;
-  star[0].imageID  = 0;
+  star[0].measure.M        = M;
+  star[0].measure.dM       = dM;
+  star[0].measure.photcode = Photcode;
+  star[0].measure.t        = time;
+  star[0].measure.detID    = 0;
+  star[0].measure.imageID  = 0;
 
   return TRUE;
@@ -107,27 +108,24 @@
   // how many bits are being used for the 2mass flags; can we just set photFlags based on them?
 
-  star[0].M         = J;
-  star[0].dM        = dJ;
-  star[0].photcode  = TM_J;
-  star[0].t         = time;
-  star[0].found     = -1;
-  star[0].detID     = 0;
-  star[0].imageID   = 0;
-
-  star[1].M         = H;
-  star[1].dM        = dH;
-  star[1].photcode  = TM_H;
-  star[1].t         = time;
-  star[1].found     = -1;
-  star[1].detID     = 0;
-  star[1].imageID   = 0;
-
-  star[2].M         = K;
-  star[2].dM        = dK;
-  star[2].photcode  = TM_K;
-  star[2].t         = time;
-  star[2].found     = -1;
-  star[2].detID     = 0;
-  star[2].imageID   = 0;
+  star[0].measure.M         = J;
+  star[0].measure.dM        = dJ;
+  star[0].measure.photcode  = TM_J;
+  star[0].measure.t         = time;
+  star[0].measure.detID     = 0;
+  star[0].measure.imageID   = 0;
+
+  star[1].measure.M         = H;
+  star[1].measure.dM        = dH;
+  star[1].measure.photcode  = TM_H;
+  star[1].measure.t         = time;
+  star[1].measure.detID     = 0;
+  star[1].measure.imageID   = 0;
+
+  star[2].measure.M         = K;
+  star[2].measure.dM        = dK;
+  star[2].measure.photcode  = TM_K;
+  star[2].measure.t         = time;
+  star[2].measure.detID     = 0;
+  star[2].measure.imageID   = 0;
 
   return TRUE;
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/getgsc.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/getgsc.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/getgsc.c	(revision 21444)
@@ -67,26 +67,20 @@
     Nline = nbytes / BYTES_STAR;
     for (i = 0; i < Nline; i++) {
+
+      InitStar (&stars[Nstars]);
+
       Nbyte = i*BYTES_STAR;
-      dparse (&stars[Nstars].R, 1, &buffer[Nbyte]);
-      dparse (&stars[Nstars].D, 2, &buffer[Nbyte]);
-      if (stars[Nstars].R < UserPatch.Rmin) continue;
-      if (stars[Nstars].R > UserPatch.Rmax) continue;
-      if (stars[Nstars].D < UserPatch.Dmin) continue;
-      if (stars[Nstars].D > UserPatch.Dmax) continue;
+      dparse (&stars[Nstars].average.R, 1, &buffer[Nbyte]);
+      dparse (&stars[Nstars].average.D, 2, &buffer[Nbyte]);
 
-      dparse (&stars[Nstars].M, 3, &buffer[Nbyte]);
-      stars[Nstars].dM 	      = NAN;
-      stars[Nstars].t  	      = 0;
-      stars[Nstars].photcode  = GSC_M;
-      stars[Nstars].found     = -1;
+      if (stars[Nstars].average.R < UserPatch.Rmin) continue;
+      if (stars[Nstars].average.R > UserPatch.Rmax) continue;
+      if (stars[Nstars].average.D < UserPatch.Dmin) continue;
+      if (stars[Nstars].average.D > UserPatch.Dmax) continue;
 
-      stars[Nstars].detID   = 0;
-      stars[Nstars].imageID = 0;
-
-      stars[Nstars].Xccd  = 0;
-      stars[Nstars].Yccd  = 0;
-      stars[Nstars].fx = 0;
-      stars[Nstars].fy = 0;
-      stars[Nstars].df = 0;
+      fparse (&stars[Nstars].measure.M, 3, &buffer[Nbyte]);
+      stars[Nstars].measure.dM 	      = NAN;
+      stars[Nstars].measure.photcode  = GSC_M;
+      stars[Nstars].measure.t  	      = 0;
 
       Nstars ++;
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/gettycho.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/gettycho.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/gettycho.c	(revision 21444)
@@ -69,54 +69,45 @@
 
       for (j = 0; j < nitems; j++) {
+
 	line = &buffer[j*NBYTE];
-	stars[Ntycho].R = atof (&line[15]);
-	stars[Ntycho].D = atof (&line[28]);
 
-	if (stars[Ntycho].R < region[0].Rmin) goto next_section;
-	if (stars[Ntycho].R > region[0].Rmax) goto next_section;
-	if (stars[Ntycho].D < region[0].Dmin) goto next_section;
-	if (stars[Ntycho].D > region[0].Dmax) goto next_section;
+	InitStar (&stars[Ntycho]);
 
-	if (stars[Ntycho].R < UserPatch.Rmin) continue;
-	if (stars[Ntycho].R > UserPatch.Rmax) continue;
-	if (stars[Ntycho].D < UserPatch.Dmin) continue;
-	if (stars[Ntycho].D > UserPatch.Dmax) continue;
+	stars[Ntycho].average.R = atof (&line[15]);
+	stars[Ntycho].average.D = atof (&line[28]);
 
-	stars[Ntycho].dR  = 1000 * atof (&line[57]);
-	stars[Ntycho].dD  = 1000 * atof (&line[64]);
+	if (stars[Ntycho].average.R < region[0].Rmin) goto next_section;
+	if (stars[Ntycho].average.R > region[0].Rmax) goto next_section;
+	if (stars[Ntycho].average.D < region[0].Dmin) goto next_section;
+	if (stars[Ntycho].average.D > region[0].Dmax) goto next_section;
+
+	if (stars[Ntycho].average.R < UserPatch.Rmin) continue;
+	if (stars[Ntycho].average.R > UserPatch.Rmax) continue;
+	if (stars[Ntycho].average.D < UserPatch.Dmin) continue;
+	if (stars[Ntycho].average.D > UserPatch.Dmax) continue;
+
+	stars[Ntycho].average.dR  = 1000 * atof (&line[57]);
+	stars[Ntycho].average.dD  = 1000 * atof (&line[64]);
 
 	/* XXX : we need to apply uR,uD to R,D to advance to 2000.0 */
-	stars[Ntycho].uR  = atof (&line[41]);
-	stars[Ntycho].uD  = atof (&line[49]);
+	stars[Ntycho].average.uR  = atof (&line[41]);
+	stars[Ntycho].average.uD  = atof (&line[49]);
 
-	stars[Ntycho].duR = atof (&line[69]);
-	stars[Ntycho].duD = atof (&line[75]);
-	
-	stars[Ntycho].P   = 0;
-	stars[Ntycho].dP  = 0;
-
-	stars[Ntycho].detID   = 0;
-	stars[Ntycho].imageID = 0;
+	stars[Ntycho].average.duR = atof (&line[69]);
+	stars[Ntycho].average.duD = atof (&line[75]);
 
 	/* Tycho uses J2000 equinox and 1991.25 epoch for coordinates */
 	/* the magnitudes have no temporal information */ 
-	stars[Ntycho].t   = TychoEpoch;
-	stars[Ntycho].found = -1;
-      
-	stars[Ntycho].Xccd  = 0;
-	stars[Ntycho].Yccd  = 0;
-	stars[Ntycho].fx = 0;
-	stars[Ntycho].fy = 0;
-	stars[Ntycho].df = 0;
+	stars[Ntycho].measure.t   = TychoEpoch;
 
 	/* one pass of addstar does either r or b */
 	if (photcode == TYCHO_B) {
-	  stars[Ntycho].M     = atof (&line[110]);
-	  stars[Ntycho].dM    = atof (&line[117]);
-	  stars[Ntycho].photcode  = TYCHO_B;
+	  stars[Ntycho].measure.M     	 = atof (&line[110]);
+	  stars[Ntycho].measure.dM    	 = atof (&line[117]);
+	  stars[Ntycho].measure.photcode = TYCHO_B;
 	} else {
-	  stars[Ntycho].M     = atof (&line[123]);
-	  stars[Ntycho].dM    = atof (&line[130]);
-	  stars[Ntycho].photcode  = TYCHO_V;
+	  stars[Ntycho].measure.M     	 = atof (&line[123]);
+	  stars[Ntycho].measure.dM    	 = atof (&line[130]);
+	  stars[Ntycho].measure.photcode = TYCHO_V;
 	}	
       
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/getusno.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/getusno.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/getusno.c	(revision 21444)
@@ -110,28 +110,18 @@
       if (buf[1] > iDEC1) continue;
 
-      memset (&stars[Nusno], 0, sizeof(Stars));
-      stars[Nusno].R     = buf[0]/360000.0;
-      stars[Nusno].D     = buf[1]/360000.0 - 90.0;
-      stars[Nusno].dM    = NAN;
-      stars[Nusno].t     = 0;
-      stars[Nusno].found = -1;
+      InitStar (&stars[Nusno]);
 
-      stars[Nusno].detID   = 0;
-      stars[Nusno].imageID = 0;
-
-      stars[Nusno].Xccd  = 0;
-      stars[Nusno].Yccd  = 0;
-      stars[Nusno].fx = 0;
-      stars[Nusno].fy = 0;
-      stars[Nusno].df = 0;
+      stars[Nusno].average.R     = buf[0]/360000.0;
+      stars[Nusno].average.D     = buf[1]/360000.0 - 90.0;
+      stars[Nusno].measure.dM    = NAN;
 
       /* one pass of addstar does either r or b */
       if (photcode == USNO_RED) {
-	stars[Nusno].photcode  = USNO_RED;
-	stars[Nusno].M     = fabs (0.1*(buf[2] - 1000*((int)(buf[2]/1000))));
+	stars[Nusno].measure.photcode = USNO_RED;
+	stars[Nusno].measure.M        = fabs (0.1*(buf[2] - 1000*((int)(buf[2]/1000))));
       } 
       if (photcode == USNO_BLUE) {	
-	stars[Nusno].photcode  = USNO_BLUE;
-	stars[Nusno].M     = fabs (0.1*((int)(buf[2] - 1000000*((int)(buf[2]/1000000))) / 1000));
+	stars[Nusno].measure.photcode = USNO_BLUE;
+	stars[Nusno].measure.M        = fabs (0.1*((int)(buf[2] - 1000000*((int)(buf[2]/1000000))) / 1000));
       }
       Nusno ++;
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/getusnob.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/getusnob.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/getusnob.c	(revision 21444)
@@ -125,37 +125,28 @@
       /* USNO coords are reported for J2000 / epoch 2000.0 */
       /* extract the basic stellar data */
-      memset (&stars[Nusno], 0, sizeof(Stars));
-      stars[Nusno].R   = buf[0]/360000.0;
-      stars[Nusno].D   = buf[1]/360000.0 - 90.0;
+      InitStar (&stars[Nusno]);
+
+      stars[Nusno].average.R   = buf[0]/360000.0;
+      stars[Nusno].average.D   = buf[1]/360000.0 - 90.0;
 
       /* XXX uR cos(D) or just uR ??? */
-      stars[Nusno].uR  = 2.0 * ((buf[2]       % 10000) - 5000);
-      stars[Nusno].uD  = 2.0 * ((buf[2]/10000 % 10000) - 5000);
+      stars[Nusno].average.uR  = 2.0 * ((buf[2]       % 10000) - 5000);
+      stars[Nusno].average.uD  = 2.0 * ((buf[2]/10000 % 10000) - 5000);
 
-      stars[Nusno].duR = (buf[3]      % 1000);
-      stars[Nusno].duD = (buf[3]/1000 % 1000);
+      stars[Nusno].average.duR = (buf[3]      % 1000);
+      stars[Nusno].average.duD = (buf[3]/1000 % 1000);
 
-      stars[Nusno].dR  = 0.001 * (buf[4]      % 1000);
-      stars[Nusno].dD  = 0.001 * (buf[4]/1000 % 1000);
+      stars[Nusno].average.dR  = 0.001 * (buf[4]      % 1000);
+      stars[Nusno].average.dD  = 0.001 * (buf[4]/1000 % 1000);
 
-      stars[Nusno].P   = 0;
-      stars[Nusno].dP  = 0;
+      stars[Nusno].average.P   = 0;
+      stars[Nusno].average.dP  = 0;
 
       /* USNO magnitude errors are reported as a fixed 0.3 mag */
-      stars[Nusno].dM    = 0.3;
-      stars[Nusno].found = -1;
-      
-      stars[Nusno].detID   = 0;
-      stars[Nusno].imageID = 0;
-
-      stars[Nusno].Xccd  = 0;
-      stars[Nusno].Yccd  = 0;
-      stars[Nusno].fx = 0;
-      stars[Nusno].fy = 0;
-      stars[Nusno].df = 0;
+      stars[Nusno].measure.dM  = 0.3;
 
       /* USNO-B uses J2000 equinox and 2000.0 epoch for coordinates */
       /* the magnitudes have no temporal information */ 
-      stars[Nusno].t     = USNOepoch;
+      stars[Nusno].measure.t   = USNOepoch;
 
       /* one pass of addstar does r, b, or n */
@@ -172,5 +163,5 @@
 	  m2 = 0;
       }
-      stars[Nusno].photcode = photcode;
+      stars[Nusno].measure.photcode = photcode;
 
       /* if two mags are available, get an average */
@@ -180,5 +171,5 @@
 	mag = (m1) ? m1 : m2;
       }
-      stars[Nusno].M = (mag == 0.0) ? 32.0 : mag;
+      stars[Nusno].measure.M = (mag == 0.0) ? 32.0 : mag;
 
       Nusno ++;
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/greference.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/greference.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/greference.c	(revision 21444)
@@ -3,5 +3,5 @@
 # define LOAD_DR2    1
 
-Stars *grefcat (char *Refcat, SkyRegion *region, int photcode, int *nstars) {
+Stars *greference (char *Refcat, SkyRegion *region, int photcode, int *nstars) {
 
   int Nstars;
@@ -36,15 +36,21 @@
   /* get stars from 2MASS for the given region */
   if (!strcasecmp (Refcat, "2MASS")) {
-    stars = get2mass (region, photcode, LOAD_ALLSKY, &Nstars);
+    // stars = get2mass (region, photcode, LOAD_ALLSKY, &Nstars);
+    fprintf (stderr, "2MASS load via addstar is deprecated: use load2mass\n");
+    exit (2);
   }
   
   /* get stars from 2MASS for the given region */
   if (!strcasecmp (Refcat, "2MASS-ALLSKY")) {
-    stars = get2mass (region, photcode, LOAD_ALLSKY, &Nstars);
+    // stars = get2mass (region, photcode, LOAD_ALLSKY, &Nstars);
+    fprintf (stderr, "2MASS load via addstar is deprecated: use load2mass\n");
+    exit (2);
   }
   
   /* get stars from 2MASS for the given region */
   if (!strcasecmp (Refcat, "2MASS-DR2")) {
-    stars = get2mass (region, photcode, LOAD_DR2, &Nstars);
+    // stars = get2mass (region, photcode, LOAD_DR2, &Nstars);
+    fprintf (stderr, "2MASS load via addstar is deprecated: use load2mass\n");
+    exit (2);
   }
   
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/grefstars.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/grefstars.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/grefstars.c	(revision 21444)
@@ -21,20 +21,15 @@
     if (line[0] == 0) continue;
     if (line[0] == '#') continue;
-    dparse (&stars[N].R,  1, line);
-    dparse (&stars[N].D,  2, line);
-    dparse (&stars[N].M,  3, line);
-    dparse (&stars[N].dM, 4, line);
-    stars[N].R = ohana_normalize_angle (stars[N].R);
-    stars[N].t = 0;
-    stars[N].photcode = photcode;
-    stars[N].found = FALSE;
-    stars[N].detID   = 0;
-    stars[N].imageID = 0;
 
-    stars[N].Xccd  = 0;
-    stars[N].Yccd  = 0;
-    stars[N].fx = 0;
-    stars[N].fy = 0;
-    stars[N].df = 0;
+    InitStar (&stars[N]);
+
+    dparse (&stars[N].average.R,  1, line);
+    dparse (&stars[N].average.D,  2, line);
+    stars[N].average.R = ohana_normalize_angle (stars[N].average.R);
+
+    fparse (&stars[N].measure.M,  3, line);
+    fparse (&stars[N].measure.dM, 4, line);
+
+    stars[N].measure.photcode = photcode;
 
     CHECK_REALLOCATE (stars, Stars, NSTARS, N+1, 100);
@@ -43,7 +38,2 @@
   return (stars);
 }
-
-/* stars.found is set here to FALSE.
-   find_match_refstars uses stars.found to identify the seq number of the
-   star which is found.  it requires an initial value of -1 XXX
-*/
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/load2mass_as_rawdata.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/load2mass_as_rawdata.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/load2mass_as_rawdata.c	(revision 21444)
@@ -140,12 +140,15 @@
 	ALLOCATE (stars[Nstars+2], Stars, 1);
 
-	stars[Nstars+0][0].R = tstars[j].R;
-	stars[Nstars+0][0].D = tstars[j].D;
-	stars[Nstars+1][0].R = tstars[j].R;
-	stars[Nstars+1][0].D = tstars[j].D;
-	stars[Nstars+2][0].R = tstars[j].R;
-	stars[Nstars+2][0].D = tstars[j].D;
+	InitStar (stars[Nstars+0]);
+	InitStar (stars[Nstars+1]);
+	InitStar (stars[Nstars+2]);
+
+	stars[Nstars+0][0].average.R = tstars[j].R;
+	stars[Nstars+0][0].average.D = tstars[j].D;
+	stars[Nstars+1][0].average.R = tstars[j].R;
+	stars[Nstars+1][0].average.D = tstars[j].D;
+	stars[Nstars+2][0].average.R = tstars[j].R;
+	stars[Nstars+2][0].average.D = tstars[j].D;
 	get2mass_3star_full (&stars[Nstars], &buffer[offset], Nbyte - offset);
-	// get2mass_star (&stars[Nstars], &buffer[offset], Nbyte - offset);
 
 	tstars[j].flag = TRUE;
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/load2mass_catalog.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/load2mass_catalog.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/load2mass_catalog.c	(revision 21444)
@@ -20,6 +20,6 @@
     // XXX for now, the output objects will have limited astrometric interpretation...
     // XXX every 3 stars represents 3 measurements and 1 average
-    catalog[0].average[Nave].R     = stars[i].R;
-    catalog[0].average[Nave].D     = stars[i].D;
+    catalog[0].average[Nave].R     = stars[i].average.R;
+    catalog[0].average[Nave].D     = stars[i].average.D;
     catalog[0].average[Nave].dR    = 0;
     catalog[0].average[Nave].dD    = 0;
@@ -40,32 +40,22 @@
 
     for (j = 0; j < Nsec; j++) {
-      catalog[0].secfilt[Nave*Nsec+j].M  = NAN;
-      catalog[0].secfilt[Nave*Nsec+j].dM = NAN;
-      catalog[0].secfilt[Nave*Nsec+j].Xm = NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsec+j].M     = NAN;
+      catalog[0].secfilt[Nave*Nsec+j].dM    = NAN;
+      catalog[0].secfilt[Nave*Nsec+j].Xm    = NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsec+j].M_20  = NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsec+j].M_80  = NAN_S_SHORT;
+      catalog[0].secfilt[Nave*Nsec+j].Ncode = 0;
+      catalog[0].secfilt[Nave*Nsec+j].Nused = 0;
     }
 
     // we now have the min chisq row. use this to supply the other filter values....
     for (j = 0; j < 3; j++) {
+      catalog[0].measure[Nmeas]           = stars[i+j].measure;
+
       catalog[0].measure[Nmeas].dR        = 0.0;
       catalog[0].measure[Nmeas].dD        = 0.0;
-      catalog[0].measure[Nmeas].Xccd      = stars[i+j].Xccd;
-      catalog[0].measure[Nmeas].Yccd      = stars[i+j].Yccd;
-      catalog[0].measure[Nmeas].dXccd     = 0.0;
-      catalog[0].measure[Nmeas].dYccd     = 0.0;
-      catalog[0].measure[Nmeas].M         = stars[i+j].M;
-      catalog[0].measure[Nmeas].dM        = stars[i+j].dM;
-      catalog[0].measure[Nmeas].Mcal      = 0;
-      catalog[0].measure[Nmeas].dMcal     = stars[i+j].dMcal;
-      catalog[0].measure[Nmeas].t         = stars[i+j].t;
-      catalog[0].measure[Nmeas].averef    = Nave;
-      catalog[0].measure[Nmeas].photcode  = stars[i+j].photcode;
-      catalog[0].measure[Nmeas].photFlags = stars[i+j].photFlags;
-      catalog[0].measure[Nmeas].dbFlags   = 0;
-      catalog[0].measure[Nmeas].dt        = 0xffff;
-					  
-      catalog[0].measure[Nmeas].airmass   = 0;
-      catalog[0].measure[Nmeas].FWx       = stars[i+j].fx;
-      catalog[0].measure[Nmeas].FWy       = stars[i+j].fy;
-      catalog[0].measure[Nmeas].theta     = stars[i+j].df;
+      catalog[0].measure[Nmeas].dt        = NAN_S_SHORT;
+
+      // XXX what about averef?
 
       catalog[0].average[Nave].Nmeasure++;
Index: /branches/eam_branch_20090208/Ohana/src/addstar/src/replace_match.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/addstar/src/replace_match.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/addstar/src/replace_match.c	(revision 21444)
@@ -7,9 +7,9 @@
   /* search for entry and replace values M, dM, R, D */
   for (i = 0; i < average[0].Nmeasure; i++) {
-    if (measure[i].photcode != star[0].photcode) continue;
-    measure[i].dR = 3600.0*(average[0].R - star[0].R);
-    measure[i].dD = 3600.0*(average[0].D - star[0].D);
-    measure[i].M  = star[0].M;
-    measure[i].dM = star[0].dM;
+    if (measure[i].photcode != star[0].measure.photcode) continue;
+    measure[i].dR = 3600.0*(average[0].R - star[0].average.R);
+    measure[i].dD = 3600.0*(average[0].D - star[0].average.D);
+    measure[i].M  = star[0].measure.M;
+    measure[i].dM = star[0].measure.dM;
     star[0].found = average[0].measureOffset + i;
     return (TRUE);
Index: /branches/eam_branch_20090208/Ohana/src/libautocode/Makefile.Targets
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/Makefile.Targets	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libautocode/Makefile.Targets	(revision 21444)
@@ -45,7 +45,8 @@
 $(ASRC)/photreg.$(ARCH).o \
 $(ASRC)/photreg-old.$(ARCH).o \
-$(ASRC)/ps1_dev_0.$(ARCH).o \
-$(ASRC)/ps1_dev_1.$(ARCH).o \
-$(ASRC)/smpdata.$(ARCH).o \
+$(ASRC)/cmf-ps1-dev-0.$(ARCH).o \
+$(ASRC)/cmf-ps1-dev-1.$(ARCH).o \
+$(ASRC)/cmf-ps1-v1.$(ARCH).o \
+$(ASRC)/cmf-smpdata.$(ARCH).o \
 $(ASRC)/getstar-ps1-dev-0.$(ARCH).o \
 $(ASRC)/getstar-ps1-dev-1.$(ARCH).o \
@@ -53,5 +54,4 @@
 $(ASRC)/spectrum.$(ARCH).o \
 $(ASRC)/spectrum-ascii.$(ARCH).o \
-$(ASRC)/Stars.$(ARCH).o \
 $(ASRC)/GSCRegion.$(ARCH).o \
 $(ASRC)/AddstarClientOptions.$(ARCH).o \
@@ -104,14 +104,18 @@
 $(AINC)/photreg.h \
 $(AINC)/photreg-old.h \
-$(AINC)/ps1_dev_0.h \
-$(AINC)/ps1_dev_1.h \
+$(AINC)/cmf-ps1-dev-0.h \
+$(AINC)/cmf-ps1-dev-1.h \
+$(AINC)/cmf-ps1-v1.h \
+$(AINC)/cmf-smpdata.h \
 $(AINC)/getstar-ps1-dev-0.h \
 $(AINC)/getstar-ps1-dev-1.h \
 $(AINC)/getstar-ps1-dev-2.h \
-$(AINC)/smpdata.h \
 $(AINC)/spectrum.h \
 $(AINC)/spectrum-ascii.h \
-$(AINC)/Stars.h \
 $(AINC)/GSCRegion.h \
 $(AINC)/AddstarClientOptions.h \
 $(AINC)/SkyRegion.h
+
+# $(ASRC)/Stars.$(ARCH).o 
+# $(AINC)/Stars.h 
+
Index: /branches/eam_branch_20090208/Ohana/src/libautocode/def/Stars.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/Stars.d	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libautocode/def/Stars.d	(revision 21444)
@@ -2,10 +2,12 @@
 EXTNAME STARS
 TYPE    BINTABLE
-SIZE    248
+SIZE    278
 
-FIELD     Xccd,             X,          double,    x coordinate on image,	     pixels
-FIELD     Yccd,             Y,          double,    y coordinate on image,	     pixels
-FIELD     dXccd,            dX,         double,    x coordinate error,	             pixels
-FIELD     dYccd,            dY,         double,    y coordinate error,  	     pixels
+* FIELD     Xccd,             X,          double,    x coordinate on image,	     pixels
+* FIELD     Yccd,             Y,          double,    y coordinate on image,	     pixels
+* FIELD     dXccd,            dX,         double,    x coordinate error,	             pixels
+* FIELD     dYccd,            dY,         double,    y coordinate error,  	     pixels
+* FIELD     posangle,         POSANGLE,   float
+* FIELD     pltscale,         PLTSCALE,   float
 FIELD     R,                R,          double,    ra coordinate on sky,	     decimal degrees
 FIELD     D,                D,          double,    dec coordinate on sky,	     decimal degrees
@@ -18,29 +20,36 @@
 FIELD     P,                PAR,        double,    parallax,			     milliarcsec
 FIELD     dP,               PAR_ERR,    double,    parallax error,		     milliarcsec
-FIELD     M,                M,          double,    instrumental mag
-FIELD     dM,               DM,         double,    error on mag
-FIELD     dMcal,            DMCAL,      double,    systematic error on mag
-FIELD     Sky,              SKY,        double,    local sky counts
-FIELD     dSky,             dSKY,       double,    local sky error counts
-FIELD     fx,               FX,         double,    object FWHM x-dir,		     pixels?
-FIELD     fy,               FY,         double,    object FWHM y-dir,		     pixels?
-FIELD     df,               DF,         double,    object position angle,	     degrees
-FIELD     Map,              MAP,        double,    alternative (aperture) magnitude
+
+* FIELD     M,                M,          double,    instrumental mag
+* FIELD     dM,               DM,         double,    error on mag
+* FIELD     dMcal,            DMCAL,      double,    systematic error on mag
+* FIELD     Sky,              SKY,        double,    local sky counts
+* FIELD     dSky,             dSKY,       double,    local sky error counts
+* FIELD     fx,               FX,         double,    object FWHM x-dir,		     pixels?
+* FIELD     fy,               FY,         double,    object FWHM y-dir,		     pixels?
+* FIELD     df,               DF,         double,    object position angle,	     degrees
+* FIELD     Mcal,             MCAL,       float,     image cal magnitude
+* FIELD     Map,              MAP,        double,    alternative (aperture) magnitude
 FIELD     Mpeak,            MPEAK,      double,    alternative (peak) magnitude
-FIELD     detID,            ID,         int,       detection identifier
-FIELD     imageID,          IMAGE_ID,   int,       image identifier
+* FIELD     detID,            ID,         int,       detection identifier
+* FIELD     imageID,          IMAGE_ID,   int,       image identifier
 FIELD     found,            FOUND,      int,       found in database catalog?
-FIELD     t,                T,          e_time,    date/time of exposure (UNIX)
-FIELD     dt,               EXPTIME,    float,     exposure time,                    2.5*log(exptime)
-FIELD     psfChisq,         PSF_CHISQ,  float
-FIELD     crNsigma,         CR_NSIGMA,  float
-FIELD     extNsigma,        EXT_NSIGMA, float
-FIELD     psfQual,          PSF_QUAL,   float
-FIELD     Mcal,             MCAL,       float,     image cal mag,	             mag
-FIELD     airmass,          AIRMASS,    float,     (airmass - 1),		     airmass
-FIELD     az,     	    AZ,         float,     azimuth
-FIELD     photcode,         CODE,       short
-FIELD     nFrames,          N_FRAMES,   short
-FIELD     photFlags,        FLAGS,      short
+* FIELD     t,                T,          e_time,    date/time of exposure (UNIX)
+* FIELD     t_msec,           T_MSEC,     short,     milliseconds of exposure
+* FIELD     dt,               EXPTIME,    float,     exposure time,                    2.5*log(exptime)
+* FIELD     psfQual,          PSF_QUAL,   float
+* FIELD     psfChisq,         PSF_CHISQ,  float
+* FIELD     psfNdof,          PSF_NDOF,   int
+* FIELD     psfNpix,          PSF_NPIX,   int
+* FIELD     crNsigma,         CR_NSIGMA,  float
+* FIELD     extNsigma,        EXT_NSIGMA, float
+* FIELD     Mxx,              MOMENTS_XX, float,     second moment
+* FIELD     Mxy,              MOMENTS_XY, float,     second moment
+* FIELD     Myy,              MOMENTS_YY, float,     second moment
+* FIELD     airmass,          AIRMASS,    float,     (airmass - 1),		     airmass
+* FIELD     az,     	    AZ,         float,     azimuth
+* FIELD     photcode,         CODE,       short
+* FIELD     nFrames,          N_FRAMES,   short
+* FIELD     photFlags,        FLAGS,      short
 FIELD     dummy,            DUMMY,      char[2]
 
@@ -56,2 +65,3 @@
 
 # XXX I'd like to merge this with Measure, but need to be careful about addstarClient -> addstarServer
+# XXX extend photFlags to match actual psphot output
Index: /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-ps1-dev-0.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-ps1-dev-0.d	(revision 21444)
+++ /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-ps1-dev-0.d	(revision 21444)
@@ -0,0 +1,24 @@
+# name of structure type
+STRUCT  PS1_DEV_0
+EXTNAME PS1_DEV_0
+TYPE    BINTABLE
+SIZE    64
+
+# elements of data structure / FITS table
+FIELD detID,    IPP_IDET,      	  unsigned int, detection ID
+FIELD X,      	X_PSF,    	  float,    x coord,              pixels
+FIELD Y,      	Y_PSF,    	  float,    y coord,              pixels
+FIELD dX,      	X_PSF_SIG,    	  float,    x coord error,        pixels
+FIELD dY,      	Y_PSF_SIG,    	  float,    y coord error,        pixels
+FIELD M,      	PSF_INST_MAG,     float,    inst mags,            mags
+FIELD dM,     	PSF_INST_MAG_SIG, float,    inst mag error,       mags
+FIELD Mpeak,    PEAK_FLUX_AS_MAG, float,    inst mag error,       mags
+FIELD sky,    	SKY,              float,    sky flux,             cnts/sec
+FIELD dSky,    	SKY_SIG,          float,    sky flux errorf       cnts/sec
+FIELD psfChisq, PSF_CHISQ,        float,    psf fit chisq
+FIELD fx,     	PSF_WIDTH_X,      float,    semi-major,           pixels
+FIELD fy,     	PSF_WIDTH_Y,      float,    semi-minor,           pixels
+FIELD df,     	PSF_THETA,        float,    ellipse angle,        degrees
+FIELD psfQual, 	PSF_QF,           float,    quality factor
+FIELD nFrames, 	N_FRAMES,         short,    images overlapping peak
+FIELD dummy,  	DUMMY,            short,    padding
Index: /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-ps1-dev-1.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-ps1-dev-1.d	(revision 21444)
+++ /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-ps1-dev-1.d	(revision 21444)
@@ -0,0 +1,26 @@
+# name of structure type
+STRUCT  PS1_DEV_1
+EXTNAME PS1_DEV_1
+TYPE    BINTABLE
+SIZE    72
+
+# elements of data structure / FITS table
+FIELD detID,     IPP_IDET,     	   unsigned int, detection ID
+FIELD X,      	 X_PSF,    	   float,    x coord,              pixels
+FIELD Y,      	 Y_PSF,    	   float,    y coord,              pixels
+FIELD dX,      	 X_PSF_SIG,    	   float,    x coord error,        pixels
+FIELD dY,      	 Y_PSF_SIG,    	   float,    y coord error,        pixels
+FIELD M,      	 PSF_INST_MAG,     float,    inst mags,            mags
+FIELD dM,     	 PSF_INST_MAG_SIG, float,    inst mag error,       mags
+FIELD Mpeak,     PEAK_FLUX_AS_MAG, float,    inst mag error,       mags
+FIELD sky,    	 SKY,              float,    sky flux,             cnts/sec
+FIELD dSky,    	 SKY_SIG,          float,    sky flux errorf       cnts/sec
+FIELD psfChisq,  PSF_CHISQ,        float,    psf fit chisq
+FIELD crNsigma,  CR_NSIGMA,        float,    Nsigma deviations from PSF to CF
+FIELD extNsigma, EXT_NSIGMA,       float,    Nsigma deviations from PSF to EXT
+FIELD fx,     	 PSF_WIDTH_X,      float,    semi-major,           pixels
+FIELD fy,     	 PSF_WIDTH_Y,      float,    semi-minor,           pixels
+FIELD df,     	 PSF_THETA,        float,    ellipse angle,        degrees
+FIELD psfQual, 	 PSF_QF,           float,    quality factor
+FIELD nFrames, 	 N_FRAMES,         short,    images overlapping peak
+FIELD flags,  	 FLAGS,            short,    padding
Index: /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-ps1-v1.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-ps1-v1.d	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-ps1-v1.d	(revision 21444)
@@ -3,24 +3,41 @@
 EXTNAME CMF_PS1_V1
 TYPE    BINTABLE
-SIZE    72
+SIZE    120
 
 # elements of data structure / FITS table
 FIELD detID,     IPP_IDET,     	   unsigned int, detection ID
-FIELD X,      	 X_PSF,    	   float,    x coord,              pixels
-FIELD Y,      	 Y_PSF,    	   float,    y coord,              pixels
-FIELD dX,      	 X_PSF_SIG,    	   float,    x coord error,        pixels
-FIELD dY,      	 Y_PSF_SIG,    	   float,    y coord error,        pixels
-FIELD M,      	 PSF_INST_MAG,     float,    inst mags,            mags
-FIELD dM,     	 PSF_INST_MAG_SIG, float,    inst mag error,       mags
-FIELD Mpeak,     PEAK_FLUX_AS_MAG, float,    inst mag error,       mags
-FIELD sky,    	 SKY,              float,    sky flux,             cnts/sec
-FIELD dSky,    	 SKY_SIG,          float,    sky flux errorf       cnts/sec
+FIELD X,      	 X_PSF,    	   float,    x coord,               pixels
+FIELD Y,      	 Y_PSF,    	   float,    y coord,               pixels
+FIELD dX,      	 X_PSF_SIG,    	   float,    x coord error,         pixels
+FIELD dY,      	 Y_PSF_SIG,    	   float,    y coord error,         pixels
+FIELD RA,      	 RA_PSF,    	   float,    PSF RA coord,          degrees
+FIELD DEC,     	 DEC_PSF,    	   float,    PSF DEC coord,         degrees
+FIELD posangle,  POSANGLE,    	   float,    Posangle at source,    degrees
+FIELD pltscale,  PLTSCALE,    	   float,    Plate Scale at source, arcsec/pixel
+FIELD M,      	 PSF_INST_MAG,     float,    inst mags,             mags
+FIELD dM,     	 PSF_INST_MAG_SIG, float,    inst mag error,        mags
+FIELD Map,       AP_MAG_STANDARD,  float,    standard aperture mag, mags
+FIELD Mpeak,     PEAK_FLUX_AS_MAG, float,    peak flux as a mag,    mags
+FIELD Mcalib,    CAL_PSF_MAG,      float,    calibrated psf mag,    mags
+FIELD dMcal,     CAL_PSF_MAG_SIG,  float,    zero point scatter,    mags
+FIELD sky,    	 SKY,              float,    sky flux,              cnts/sec
+FIELD dSky,    	 SKY_SIG,          float,    sky flux error,        cnts/sec
 FIELD psfChisq,  PSF_CHISQ,        float,    psf fit chisq
 FIELD crNsigma,  CR_NSIGMA,        float,    Nsigma deviations from PSF to CF
 FIELD extNsigma, EXT_NSIGMA,       float,    Nsigma deviations from PSF to EXT
-FIELD fx,     	 PSF_WIDTH_X,      float,    semi-major,           pixels
-FIELD fy,     	 PSF_WIDTH_Y,      float,    semi-minor,           pixels
-FIELD df,     	 PSF_THETA,        float,    ellipse angle,        degrees
+FIELD fx,     	 PSF_MAJOR,        float,    psf fit major axis,    pixels
+FIELD fy,     	 PSF_MINOR,        float,    psf fit minor axis,    pixels
+FIELD df,     	 PSF_THETA,        float,    ellipse angle,         degrees
 FIELD psfQual, 	 PSF_QF,           float,    quality factor
+FIELD psfNdof, 	 PSF_NDOF,         int,      psf degrees of freedom
+FIELD psfNpix, 	 PSF_NPIX,         int,      psf number of pixels
+FIELD Mxx,     	 MOMENTS_XX,       float,    second moment X,       pixels^2
+FIELD Mxy,     	 MOMENTS_XY,       float,    second moment Y,       pixels^2
+FIELD Myy,     	 MOMENTS_YY,       float,    second moment XY,      pixels^2
 FIELD nFrames, 	 N_FRAMES,         short,    images overlapping peak
 FIELD flags,  	 FLAGS,            short,    padding
+
+# for an object in an image, we have three triplets that tell us about the shape:
+# second moments: Mxx, Mxy, Myy 
+# model shape parameters: F_major, F_minor, F_theta
+# centroid errors: sigma_X, sigma_Y, sigma_XY
Index: /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-smpdata.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-smpdata.d	(revision 21444)
+++ /branches/eam_branch_20090208/Ohana/src/libautocode/def/cmf-smpdata.d	(revision 21444)
@@ -0,0 +1,19 @@
+# name of structure type
+STRUCT  SMPData
+EXTNAME SMPFILE
+TYPE    BINTABLE
+SIZE    44
+
+# elements of data structure / FITS table
+FIELD X,      X_PIX,      float,    x coord,              pixels
+FIELD Y,      Y_PIX,      float,    y coord,              pixels
+FIELD M,      MAG_RAW,    float,    inst mags,            mags
+FIELD dM,     MAG_ERR,    float,    inst mag error,       mags
+FIELD Mgal,   MAG_GAL,    float,    galaxy mag,           mags
+FIELD Map,    MAG_AP,     float,    aperture mag,         mags
+FIELD sky,    LOG_SKY,    float,    log-10 of sky,        cnts/sec
+FIELD fx,     FWHM_X,     float,    semi-major,           pixels
+FIELD fy,     FWHM_Y,     float,    semi-minor,           pixels
+FIELD df,     THETA,      float,    ellipse angle,        degrees
+FIELD dophot, DOPHOT,     char,     dophot type,          none
+FIELD dummy,  DUMMY,      char[3],  padding,              none
Index: /branches/eam_branch_20090208/Ohana/src/libautocode/def/measure-ps1-v1.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/measure-ps1-v1.d	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libautocode/def/measure-ps1-v1.d	(revision 21444)
@@ -2,5 +2,5 @@
 EXTNAME      DVO_MEASURE_PS1_V1
 TYPE         BINTABLE
-SIZE         139
+SIZE         146
 DESCRIPTION  DVO Detection Measurement Table 
 
@@ -10,5 +10,4 @@
 FIELD Mcal,           M_CAL,        float,          image cal mag,	          mag
 FIELD Map,            M_APER,       float,          aperture mag,		  mag
-FIELD Map_small,      M_APER_SMALL, float,          small aperture mag,		  mag
 FIELD dM,             MAG_ERR,      float,          mag error,                    mag
 FIELD dMcal,          MAG_CAL_ERR,  float,          systematic calibration error, mag
@@ -39,28 +38,28 @@
 FIELD psfQual,        PSF_QF,       float,          psf coverage/quality factor
 FIELD psfChisq,       PSF_CHISQ,    float,          psf fit chisq
+FIELD psfNdof,        PSF_NDOF,     int,            psf degrees of freedom
+FIELD psfNpix,        PSF_NPIX,     int,            psf number of pixels
 FIELD crNsigma,       CR_NSIGMA,    float,          Nsigma deviation towards CR
 FIELD extNsigma,      EXT_NSIGMA,   float,          Nsigma deviation towards EXT
 
 # model shape parameters
-FIELD FWx,            FWHM_MAJOR,   short,          object fwhm major axis,       1/100 of arcsec 
-FIELD FWy,            FWHM_MINOR,   short,          object fwhm minor axis,       1/100 of arcsec 
-FIELD theta,          PSF_THETA,    short,          angle wrt ccd X dir,          (0xffff/360) deg
+FIELD FWx,            FWHM_MAJOR,   short,          object fwhm major axis,         1/100 of pixels
+FIELD FWy,            FWHM_MINOR,   short,          object fwhm minor axis,         1/100 of pixels 
+FIELD theta,          PSF_THETA,    short,          angle wrt ccd X dir,            (0xffff/360) deg
 
 # moments
-FIELD Mxx,            MXX,          short,          second moments in pixel coords, 1/100 of arcsec 
-FIELD Mxy,            MXY,          short,          second moments in pixel coords, 1/100 of arcsec
-FIELD Myy,            MYY,          short,          second moments in pixel coords, 1/100 of arcsec
+FIELD Mxx,            MXX,          short,          second moments in pixel coords, 1/100 of pixels
+FIELD Mxy,            MXY,          short,          second moments in pixel coords, 1/100 of pixels
+FIELD Myy,            MYY,          short,          second moments in pixel coords, 1/100 of pixels
 
 # position errors
-FIELD dXccd,          X_CCD_ERR,    short,          X coord error on chip,         pixels
-FIELD dYccd,          Y_CCD_ERR,    short,          Y coord error on chip,         pixels
-FIELD dTccd,          T_CCD_ERR,    short,          position angle chip to sky,    (0xffff/360) deg
+FIELD dXccd,          X_CCD_ERR,    short,          X coord error on chip,          1/100 of pixels
+FIELD dYccd,          Y_CCD_ERR,    short,          Y coord error on chip,          1/100 of pixels
+FIELD posangle,       POSANGLE,     short,          position angle sky to chip,     (0xffff/360) deg
+FIELD pltscale,       PLTSCALE,     float,          plate scale,                    arcsec/pixel
 
 FIELD photcode,       PHOTCODE,     unsigned short, photcode
-
 FIELD dbFlags,        DB_FLAGS,     uint64_t,       flags supplied by analysis in database
 FIELD photFlags,      PHOT_FLAGS,   uint64_t,       flags supplied by photometry program
 
-FIELD stargal,        STAR_GAL,     char,           star-galaxy separator
-
 # FIELD dummy,          DUMMY,        char[6],        padding
Index: /branches/eam_branch_20090208/Ohana/src/libautocode/def/measure.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/measure.d	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libautocode/def/measure.d	(revision 21444)
@@ -2,32 +2,30 @@
 EXTNAME      DVO_MEASURE
 TYPE         BINTABLE
-SIZE         139
+SIZE         146
 DESCRIPTION  DVO Detection Measurement Table 
 
-FIELD dR,             D_RA,         float,          RA offset,                	  arcsec
-FIELD dD,             D_DEC,        float,          DEC offset,               	  arcsec
-FIELD M,              MAG,          float,          catalog mag,       	       	  mag
-FIELD Mcal,           M_CAL,        float,          image cal mag,	          mag
-FIELD Map,            M_APER,       float,          aperture mag,		  mag
-FIELD Map_small,      M_APER_SMALL, float,          small aperture mag,		  mag
-FIELD dM,             MAG_ERR,      float,          mag error,                    mag
-FIELD dMcal,          MAG_CAL_ERR,  float,          systematic calibration error, mag
-FIELD dt,             M_TIME,       float,          exposure time,                2.5*log(exptime)
-
+FIELD dR,             D_RA,         float,          RA offset,                	    arcsec
+FIELD dD,             D_DEC,        float,          DEC offset,               	    arcsec
+FIELD M,              MAG,          float,          catalog mag,       	       	    mag
+FIELD Mcal,           M_CAL,        float,          image cal mag,	            mag
+FIELD Map,            M_APER,       float,          aperture mag,		    mag
+FIELD dM,             MAG_ERR,      float,          mag error,                      mag
+FIELD dMcal,          MAG_CAL_ERR,  float,          systematic calibration error,   mag
+FIELD dt,             M_TIME,       float,          exposure time,                  2.5*log(exptime)
 
 # note that with airmass = 1.0 / cos(90 - alt), we have full alt/az representation
-FIELD airmass,        AIRMASS,      float,          (airmass - 1),		  airmass
+FIELD airmass,        AIRMASS,      float,          (airmass - 1),		    airmass
 FIELD az,             AZ,           float,          telescope azimuth
 
 # new field elements needed for Pan-STARRS:
-FIELD Xccd,           X_CCD,        float,          X coord on chip,               pixels
-FIELD Yccd,           Y_CCD,        float,          Y coord on chip,               pixels
+FIELD Xccd,           X_CCD,        float,          X coord on chip,                pixels
+FIELD Yccd,           Y_CCD,        float,          Y coord on chip,                pixels
 
 # could these be packed into fewer bits?
-FIELD Sky,            SKY_FLUX,     float,          local estimate of sky flux,    counts/sec
-FIELD dSky,           SKY_FLUX_ERR, float,          local estimate of sky flux,    counts/sec
+FIELD Sky,            SKY_FLUX,     float,          local estimate of sky flux,     counts/sec
+FIELD dSky,           SKY_FLUX_ERR, float,          local estimate of sky flux,     counts/sec
 
 FIELD t,              TIME,         int,   	    time in seconds (UNIX)
-FIELD t_msec,         TIME_MSEC,    unsigned short, time fraction of second,       milliseconds
+FIELD t_msec,         TIME_MSEC,    unsigned short, time fraction of second,        milliseconds
 FIELD averef,         AVE_REF,      unsigned int,   reference to average entry      
 
@@ -40,20 +38,24 @@
 FIELD psfQual,        PSF_QF,       float,          psf coverage/quality factor
 FIELD psfChisq,       PSF_CHISQ,    float,          psf fit chisq
+FIELD psfNdof,        PSF_NDOF,     int,            psf degrees of freedom
+FIELD psfNpix,        PSF_NPIX,     int,            psf number of pixels
 FIELD crNsigma,       CR_NSIGMA,    float,          Nsigma deviation towards CR
 FIELD extNsigma,      EXT_NSIGMA,   float,          Nsigma deviation towards EXT
 
-FIELD FWx,            FWHM_MAJOR,   short,          object fwhm major axis,       1/100 of arcsec 
-FIELD FWy,            FWHM_MINOR,   short,          object fwhm minor axis,       1/100 of arcsec 
-FIELD theta,          PSF_THETA,    short,          angle wrt ccd X dir,          (0xffff/360) deg
+# model shape parameters
+FIELD FWx,            FWHM_MAJOR,   short,          object fwhm major axis,         1/100 of pixels 
+FIELD FWy,            FWHM_MINOR,   short,          object fwhm minor axis,         1/100 of pixels 
+FIELD theta,          PSF_THETA,    short,          angle wrt ccd X dir,            (0xffff/360) deg
 
 # moments
-FIELD Mxx,            MXX,          short,          second moments in pixel coords, 1/100 of arcsec 
-FIELD Mxy,            MXY,          short,          second moments in pixel coords, 1/100 of arcsec
-FIELD Myy,            MYY,          short,          second moments in pixel coords, 1/100 of arcsec
+FIELD Mxx,            MXX,          short,          second moments in pixel coords, 1/100 of pixels^2
+FIELD Mxy,            MXY,          short,          second moments in pixel coords, 1/100 of pixels^2
+FIELD Myy,            MYY,          short,          second moments in pixel coords, 1/100 of pixels^2
 
-# convert this to error in arcsec on load?
-FIELD dXccd,          X_CCD_ERR,    short,          X coord error on chip,         pixels
-FIELD dYccd,          Y_CCD_ERR,    short,          Y coord error on chip,         pixels
-FIELD dTccd,          T_CCD_ERR,    short,          position angle chip to sky,    (0xffff/360) deg
+# convert this to error in pixels on load?
+FIELD dXccd,          X_CCD_ERR,    short,          X coord error on chip,          1/100 of pixels
+FIELD dYccd,          Y_CCD_ERR,    short,          Y coord error on chip,          1/100 of pixels
+FIELD posangle,       POSANGLE,     short,          position angle sky to chip,     (0xffff/360) deg
+FIELD pltscale,       PLTSCALE,     float,          plate scale,                    arcsec/pixel
 
 FIELD photcode,       PHOTCODE,     unsigned short, photcode
@@ -61,8 +63,7 @@
 FIELD photFlags,      PHOT_FLAGS,   uint64_t,       flags supplied by photometry program
 
-FIELD stargal,        STAR_GAL,     char,           star-galaxy separator
-
-# *** 20090206 : new fields : t_msec, extID, Mxx, Mxy, Myy, dTccd; deprecated dophot
-#                dbFlags, photFlags : uint16_t to uint64_t
+# *** 20090206 : new fields : t_msec, extID, Mxx, Mxy, Myy, posangle,
+#                psfNdof, psfNpix, Map_small; deprecated dophot.
+#                Changed dbFlags, photFlags : uint16_t to uint64_t
 
 # XXX unsigned int values are probably not being saved in the FITS file correctly: no BZERO, BSCALE
Index: anches/eam_branch_20090208/Ohana/src/libautocode/def/ps1_dev_0.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/ps1_dev_0.d	(revision 21443)
+++ 	(revision )
@@ -1,24 +1,0 @@
-# name of structure type
-STRUCT  PS1_DEV_0
-EXTNAME PS1_DEV_0
-TYPE    BINTABLE
-SIZE    64
-
-# elements of data structure / FITS table
-FIELD detID,    IPP_IDET,      	  unsigned int, detection ID
-FIELD X,      	X_PSF,    	  float,    x coord,              pixels
-FIELD Y,      	Y_PSF,    	  float,    y coord,              pixels
-FIELD dX,      	X_PSF_SIG,    	  float,    x coord error,        pixels
-FIELD dY,      	Y_PSF_SIG,    	  float,    y coord error,        pixels
-FIELD M,      	PSF_INST_MAG,     float,    inst mags,            mags
-FIELD dM,     	PSF_INST_MAG_SIG, float,    inst mag error,       mags
-FIELD Mpeak,    PEAK_FLUX_AS_MAG, float,    inst mag error,       mags
-FIELD sky,    	SKY,              float,    sky flux,             cnts/sec
-FIELD dSky,    	SKY_SIG,          float,    sky flux errorf       cnts/sec
-FIELD psfChisq, PSF_CHISQ,        float,    psf fit chisq
-FIELD fx,     	PSF_WIDTH_X,      float,    semi-major,           pixels
-FIELD fy,     	PSF_WIDTH_Y,      float,    semi-minor,           pixels
-FIELD df,     	PSF_THETA,        float,    ellipse angle,        degrees
-FIELD psfQual, 	PSF_QF,           float,    quality factor
-FIELD nFrames, 	N_FRAMES,         short,    images overlapping peak
-FIELD dummy,  	DUMMY,            short,    padding
Index: anches/eam_branch_20090208/Ohana/src/libautocode/def/ps1_dev_1.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/ps1_dev_1.d	(revision 21443)
+++ 	(revision )
@@ -1,26 +1,0 @@
-# name of structure type
-STRUCT  PS1_DEV_1
-EXTNAME PS1_DEV_1
-TYPE    BINTABLE
-SIZE    72
-
-# elements of data structure / FITS table
-FIELD detID,     IPP_IDET,     	   unsigned int, detection ID
-FIELD X,      	 X_PSF,    	   float,    x coord,              pixels
-FIELD Y,      	 Y_PSF,    	   float,    y coord,              pixels
-FIELD dX,      	 X_PSF_SIG,    	   float,    x coord error,        pixels
-FIELD dY,      	 Y_PSF_SIG,    	   float,    y coord error,        pixels
-FIELD M,      	 PSF_INST_MAG,     float,    inst mags,            mags
-FIELD dM,     	 PSF_INST_MAG_SIG, float,    inst mag error,       mags
-FIELD Mpeak,     PEAK_FLUX_AS_MAG, float,    inst mag error,       mags
-FIELD sky,    	 SKY,              float,    sky flux,             cnts/sec
-FIELD dSky,    	 SKY_SIG,          float,    sky flux errorf       cnts/sec
-FIELD psfChisq,  PSF_CHISQ,        float,    psf fit chisq
-FIELD crNsigma,  CR_NSIGMA,        float,    Nsigma deviations from PSF to CF
-FIELD extNsigma, EXT_NSIGMA,       float,    Nsigma deviations from PSF to EXT
-FIELD fx,     	 PSF_WIDTH_X,      float,    semi-major,           pixels
-FIELD fy,     	 PSF_WIDTH_Y,      float,    semi-minor,           pixels
-FIELD df,     	 PSF_THETA,        float,    ellipse angle,        degrees
-FIELD psfQual, 	 PSF_QF,           float,    quality factor
-FIELD nFrames, 	 N_FRAMES,         short,    images overlapping peak
-FIELD flags,  	 FLAGS,            short,    padding
Index: anches/eam_branch_20090208/Ohana/src/libautocode/def/smpdata.d
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libautocode/def/smpdata.d	(revision 21443)
+++ 	(revision )
@@ -1,19 +1,0 @@
-# name of structure type
-STRUCT  SMPData
-EXTNAME SMPFILE
-TYPE    BINTABLE
-SIZE    44
-
-# elements of data structure / FITS table
-FIELD X,      X_PIX,      float,    x coord,              pixels
-FIELD Y,      Y_PIX,      float,    y coord,              pixels
-FIELD M,      MAG_RAW,    float,    inst mags,            mags
-FIELD dM,     MAG_ERR,    float,    inst mag error,       mags
-FIELD Mgal,   MAG_GAL,    float,    galaxy mag,           mags
-FIELD Map,    MAG_AP,     float,    aperture mag,         mags
-FIELD sky,    LOG_SKY,    float,    log-10 of sky,        cnts/sec
-FIELD fx,     FWHM_X,     float,    semi-major,           pixels
-FIELD fy,     FWHM_Y,     float,    semi-minor,           pixels
-FIELD df,     THETA,      float,    ellipse angle,        degrees
-FIELD dophot, DOPHOT,     char,     dophot type,          none
-FIELD dummy,  DUMMY,      char[3],  padding,              none
Index: /branches/eam_branch_20090208/Ohana/src/libdvo/include/dvo.h
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libdvo/include/dvo.h	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libdvo/include/dvo.h	(revision 21444)
@@ -446,5 +446,4 @@
 void sort_image_subset (Image *image, int *subset, int N);
 void sort_coords_index (double *X, double *Y, int *S, int N);
-void sort_stars_ra (Stars *stars, int N);
 void sort_regions (SkyRegion *region, int N);
 
Index: /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_1.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_1.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_1.c	(revision 21444)
@@ -39,5 +39,4 @@
     out[i].dbFlags    = in[i].dbFlags;
     out[i].photFlags  = in[i].photFlags;
-    out[i].stargal    = in[i].stargal;
 
     // changed or added for PS1_DEV_2
@@ -52,6 +51,8 @@
     out[i].Mxy 	      = 0.0;
     out[i].Myy        = 0.0;
-    out[i].dTccd      = 0;
-    out[i].Map_small  = 0;
+    out[i].posangle   = 0;
+    out[i].pltscale   = 0;
+    out[i].psfNdof    = 0;
+    out[i].psfNpix    = 0;
   }
   return (out);
@@ -93,5 +94,4 @@
     out[i].dYccd      = in[i].dYccd;
     out[i].dbFlags    = in[i].dbFlags;
-    out[i].stargal    = in[i].stargal;
 
     // changed or added for PS1_DEV_2
Index: /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_2.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_2.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_2.c	(revision 21444)
@@ -40,5 +40,4 @@
     out[i].dYccd      = in[i].dYccd;
     out[i].dbFlags    = in[i].dbFlags;
-    out[i].stargal    = in[i].stargal;
 
     // changed or added for PS1_V1
@@ -49,6 +48,8 @@
     out[i].Mxy 	      = 0.0;
     out[i].Myy        = 0.0;
-    out[i].dTccd      = 0;
-    out[i].Map_small  = 0;
+    out[i].posangle   = 0;
+    out[i].pltscale   = 0;
+    out[i].psfNdof    = 0;
+    out[i].psfNpix    = 0;
   }
   return (out);
@@ -92,5 +93,4 @@
     out[i].dYccd      = in[i].dYccd;
     out[i].dbFlags    = in[i].dbFlags;
-    out[i].stargal    = in[i].stargal;
 
     // changed or added for PS1_V1
Index: /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_PS1_V1.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_PS1_V1.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_PS1_V1.c	(revision 21444)
@@ -16,5 +16,4 @@
     out[i].Mcal       = in[i].Mcal;
     out[i].Map        = in[i].Map;
-    out[i].Map_small  = in[i].Map_small;
     out[i].dM         = in[i].dM;
     out[i].dMcal      = in[i].dMcal;
@@ -34,4 +33,6 @@
     out[i].psfQual    = in[i].psfQual;
     out[i].psfChisq   = in[i].psfChisq;
+    out[i].psfNdof    = in[i].psfNdof;
+    out[i].psfNpix    = in[i].psfNpix;
     out[i].crNsigma   = in[i].crNsigma;
     out[i].extNsigma  = in[i].extNsigma;
@@ -44,9 +45,9 @@
     out[i].dXccd      = in[i].dXccd;
     out[i].dYccd      = in[i].dYccd;
-    out[i].dTccd      = in[i].dTccd;
+    out[i].posangle   = in[i].posangle;
+    out[i].pltscale   = in[i].pltscale;
     out[i].photcode   = in[i].photcode;
     out[i].dbFlags    = in[i].dbFlags;
     out[i].photFlags  = in[i].photFlags;
-    out[i].stargal    = in[i].stargal;
   }
   return (out);
@@ -66,5 +67,4 @@
     out[i].Mcal       = in[i].Mcal;
     out[i].Map        = in[i].Map;
-    out[i].Map_small  = in[i].Map_small;
     out[i].dM         = in[i].dM;
     out[i].dMcal      = in[i].dMcal;
@@ -84,4 +84,6 @@
     out[i].psfQual    = in[i].psfQual;
     out[i].psfChisq   = in[i].psfChisq;
+    out[i].psfNdof    = in[i].psfNdof;
+    out[i].psfNpix    = in[i].psfNpix;
     out[i].crNsigma   = in[i].crNsigma;
     out[i].extNsigma  = in[i].extNsigma;
@@ -94,9 +96,9 @@
     out[i].dXccd      = in[i].dXccd;
     out[i].dYccd      = in[i].dYccd;
-    out[i].dTccd      = in[i].dTccd;
+    out[i].posangle   = in[i].posangle;
+    out[i].pltscale   = in[i].pltscale;
     out[i].photcode   = in[i].photcode;
     out[i].dbFlags    = in[i].dbFlags;
     out[i].photFlags  = in[i].photFlags;
-    out[i].stargal    = in[i].stargal;
   }
   return (out);
Index: /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_elixir.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_elixir.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_elixir.c	(revision 21444)
@@ -33,5 +33,4 @@
     out[i].dYccd     = 0;
     out[i].az        = 0;
-    out[i].stargal   = 0;
     out[i].Sky       = 0;
     out[i].dSky      = 0;
@@ -59,6 +58,8 @@
     out[i].Mxy 	      = 0.0;
     out[i].Myy        = 0.0;
-    out[i].dTccd      = 0;
-    out[i].Map_small  = 0;
+    out[i].posangle   = 0;
+    out[i].pltscale   = 0;
+    out[i].psfNdof    = 0;
+    out[i].psfNpix    = 0;
   }
   return (out);
Index: /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_loneos.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_loneos.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_loneos.c	(revision 21444)
@@ -37,5 +37,4 @@
     out[i].dYccd     = 0;
     out[i].az        = 0;
-    out[i].stargal   = 0;
     out[i].Sky       = 0;
     out[i].dSky      = 0;
@@ -61,6 +60,8 @@
     out[i].Mxy 	      = 0.0;
     out[i].Myy        = 0.0;
-    out[i].dTccd      = 0;
-    out[i].Map_small  = 0;
+    out[i].posangle   = 0;
+    out[i].pltscale   = 0;
+    out[i].psfNdof    = 0;
+    out[i].psfNpix    = 0;
   }
   return (out);
Index: /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_0.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_0.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_0.c	(revision 21444)
@@ -29,5 +29,4 @@
     out[i].dXccd      = in[i].dXccd;
     out[i].dYccd      = in[i].dYccd;
-    out[i].stargal    = in[i].stargal;
     out[i].Sky        = in[i].Sky;
     out[i].dSky       = in[i].dSky;
@@ -56,6 +55,8 @@
     out[i].Mxy 	      = 0.0;
     out[i].Myy        = 0.0;
-    out[i].dTccd      = 0;
-    out[i].Map_small  = 0;
+    out[i].posangle   = 0;
+    out[i].pltscale   = 0;
+    out[i].psfNdof    = 0;
+    out[i].psfNpix    = 0;
   }
   return (out);
@@ -89,5 +90,4 @@
     out[i].dXccd      = in[i].dXccd;
     out[i].dYccd      = in[i].dYccd;
-    out[i].stargal    = in[i].stargal;
     out[i].Sky        = in[i].Sky;
     out[i].dSky       = in[i].dSky;
Index: /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_1.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_1.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_1.c	(revision 21444)
@@ -29,5 +29,4 @@
     out[i].dXccd      = in[i].dXccd;
     out[i].dYccd      = in[i].dYccd;
-    out[i].stargal    = in[i].stargal;
     out[i].Sky        = in[i].Sky;
     out[i].dSky       = in[i].dSky;
@@ -56,6 +55,8 @@
     out[i].Mxy 	      = 0.0;
     out[i].Myy        = 0.0;
-    out[i].dTccd      = 0;
-    out[i].Map_small  = 0;
+    out[i].posangle   = 0;
+    out[i].pltscale   = 0;
+    out[i].psfNdof    = 0;
+    out[i].psfNpix    = 0;
   }
   return (out);
@@ -89,5 +90,4 @@
     out[i].dXccd      = in[i].dXccd;
     out[i].dYccd      = in[i].dYccd;
-    out[i].stargal    = in[i].stargal;
     out[i].Sky        = in[i].Sky;
     out[i].dSky       = in[i].dSky;
Index: /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvosorts.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvosorts.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/libdvo/src/dvosorts.c	(revision 21444)
@@ -46,16 +46,4 @@
 }
 
-void sort_stars_ra (Stars *stars, int N) {
-
-# define SWAPFUNC(A,B){ Stars tmp; tmp = stars[A]; stars[A] = stars[B]; stars[B] = tmp; }
-# define COMPARE(A,B)(stars[A].R < stars[B].R)
-
-  OHANA_SORT (N, COMPARE, SWAPFUNC);
-
-# undef SWAPFUNC
-# undef COMPARE
-
-}
-
 void sort_regions (SkyRegion *region, int N) {
 
@@ -70,2 +58,16 @@
 }
 
+# if (0)
+// deprecated along with Stars as an autocode type
+void sort_stars_ra (Stars *stars, int N) {
+
+# define SWAPFUNC(A,B){ Stars tmp; tmp = stars[A]; stars[A] = stars[B]; stars[B] = tmp; }
+# define COMPARE(A,B)(stars[A].R < stars[B].R)
+
+  OHANA_SORT (N, COMPARE, SWAPFUNC);
+
+# undef SWAPFUNC
+# undef COMPARE
+
+}
+# endif
Index: /branches/eam_branch_20090208/Ohana/src/opihi/dvo/dbExtractMeasures.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/opihi/dvo/dbExtractMeasures.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/opihi/dvo/dbExtractMeasures.c	(revision 21444)
@@ -405,7 +405,4 @@
       value.Flt = measure[0].extNsigma;
       break;
-    case MEAS_STARGAL: /* OK */
-      value.Flt = measure[0].stargal;
-      break;
 
       // add the star/galaxy sep -- 
Index: /branches/eam_branch_20090208/Ohana/src/opihi/dvo/dbFields.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/opihi/dvo/dbFields.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/opihi/dvo/dbFields.c	(revision 21444)
@@ -193,5 +193,4 @@
   if (!strcasecmp (fieldName, "SKY"))        ESCAPE (MEAS_SKY,     	  MAG_NONE, OPIHI_FLT);
   if (!strcasecmp (fieldName, "SKY_ERR"))    ESCAPE (MEAS_dSKY,     	  MAG_NONE, OPIHI_FLT);
-  if (!strcasecmp (fieldName, "STARGAL"))    ESCAPE (MEAS_STARGAL,     	  MAG_NONE, OPIHI_FLT);
 
   // for words that don't parse, try a photcode
Index: /branches/eam_branch_20090208/Ohana/src/opihi/dvo/gstar.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/opihi/dvo/gstar.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/opihi/dvo/gstar.c	(revision 21444)
@@ -240,5 +240,4 @@
 		gprint (GP_LOG, "%f", 0.01*catalog.measure[m].FWy);
 		gprint (GP_LOG, "%f", (360.0/(float)0xffff)*catalog.measure[m].theta);
-		gprint (GP_LOG, "%d", catalog.measure[m].stargal);
 	    }
 	    gprint (GP_LOG, "\n");
Index: /branches/eam_branch_20090208/Ohana/src/opihi/include/dvoshell.h
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/opihi/include/dvoshell.h	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/opihi/include/dvoshell.h	(revision 21444)
@@ -106,5 +106,4 @@
       MEAS_CR_NSIGMA, 
       MEAS_EXT_NSIGMA, 
-      MEAS_STARGAL, 
 };
 
Index: /branches/eam_branch_20090208/Ohana/src/relphot/src/relphot_objects.c
===================================================================
--- /branches/eam_branch_20090208/Ohana/src/relphot/src/relphot_objects.c	(revision 21443)
+++ /branches/eam_branch_20090208/Ohana/src/relphot/src/relphot_objects.c	(revision 21444)
@@ -45,6 +45,6 @@
 	for (k = 0; k < Nsecfilt; k++) {
 	  catalog.secfilt[j*Nsecfilt + k].M    	= NAN;
-	  catalog.secfilt[j*Nsecfilt + k].M_20 	= NAN;
-	  catalog.secfilt[j*Nsecfilt + k].M_80 	= NAN;
+	  catalog.secfilt[j*Nsecfilt + k].M_20 	= NAN_S_SHORT;
+	  catalog.secfilt[j*Nsecfilt + k].M_80 	= NAN_S_SHORT;
 	  catalog.secfilt[j*Nsecfilt + k].dM   	= NAN;
 	  catalog.secfilt[j*Nsecfilt + k].Xm    = NAN_S_SHORT;
