Index: trunk/Ohana/src/dvomerge/src/IDmapIO.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/IDmapIO.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/IDmapIO.c	(revision 37046)
@@ -27,6 +27,6 @@
   gfits_create_table_header (&theader, "BINTABLE", "IMAGE_ID_MAP");
 
-  gfits_define_bintable_column (&theader, "J", "OLD_IDS", "old image IDs", NULL, 1.0, 1.0*0x8000);
-  gfits_define_bintable_column (&theader, "J", "NEW_IDS", "new image IDs", NULL, 1.0, 1.0*0x8000);
+  gfits_define_bintable_column (&theader, "J", "OLD_IDS", "old image IDs", NULL, 1.0, FT_BZERO_INT32);
+  gfits_define_bintable_column (&theader, "J", "NEW_IDS", "new image IDs", NULL, 1.0, FT_BZERO_INT32);
 
   // generate the output array that carries the data
Index: trunk/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c	(revision 37046)
@@ -140,4 +140,9 @@
     }
 
+    if (!incatalog.sorted) {
+      fprintf (stderr, "ERROR: input catalog %s is not sorted (and must be for dvomerge)\n", filename_input);
+      exit (1);
+    }
+
     dvo_update_image_IDs (IDmap, &incatalog);
 
Index: trunk/Ohana/src/dvomerge/src/dvorepair.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/dvorepair.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/dvorepair.c	(revision 37046)
@@ -2,4 +2,8 @@
 
 int main (int argc, char **argv) {
+
+  fprintf (stderr, "this program needs to be updated to load old format Measure tables (pre PV1_V5) in which dR,dD are saved, not R,D\n");
+  fprintf (stderr, "reminder: relastro can re-construct R,D from X,Y; FtableToMeasure and vice versa could just NAN those values\n");
+  exit (2);
 
   dvorepair_help(argc, argv);
Index: trunk/Ohana/src/dvomerge/src/dvorepairCPT.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/dvorepairCPT.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/dvorepairCPT.c	(revision 37046)
@@ -76,5 +76,5 @@
   }
 
-  measure = FtableToMeasure (&cpmFtable, &Nmeasure, &catformat);
+  measure = FtableToMeasure (&cpmFtable, NULL, &Nmeasure, &catformat);
   myAssert(measure, "failed to convert ftable to measure data");
 
@@ -126,5 +126,6 @@
     average[Nave].measureOffset = -1;
     average[Nave].missingOffset = -1;
-    average[Nave].refColor = NAN;
+    average[Nave].refColorBlue = NAN;
+    average[Nave].refColorRed = NAN;
 
     average[Nave].objID = measure[i].objID;
Index: trunk/Ohana/src/dvomerge/src/dvorepairDeleteImageList.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/dvorepairDeleteImageList.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/dvorepairDeleteImageList.c	(revision 37046)
@@ -250,5 +250,5 @@
 	gfits_scan(&cpmHeaderTBL, "NAXIS1", "%d", 1, &NbytesPerRow);
 
-	measure = FtableToMeasure (&cpmFtable, &Nmeasure, &catformat);
+	measure = FtableToMeasure (&cpmFtable, NULL, &Nmeasure, &catformat);
 	myAssert(measure, "failed to convert ftable to measure data");
     
@@ -288,5 +288,5 @@
 
 	// convert internal to external format 
-	if (!MeasureToFtable (&cpmFtable, measureNew, NmeasureNew, catformat)) {
+	if (!MeasureToFtable (&cpmFtable, NULL, measureNew, NmeasureNew, catformat)) {
 	  myAbort("trouble converting format");
 	}
@@ -411,5 +411,6 @@
     average[Nave].measureOffset = -1;
     average[Nave].missingOffset = -1;
-    average[Nave].refColor = NAN;
+    average[Nave].refColorBlue = NAN;
+    average[Nave].refColorRed = NAN;
 
     average[Nave].objID = measure[i].objID;
Index: trunk/Ohana/src/dvomerge/src/dvorepairFixCPT.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/dvorepairFixCPT.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/dvorepairFixCPT.c	(revision 37046)
@@ -120,5 +120,5 @@
   }
 
-  measure = FtableToMeasure (&cpmFtable, &Nmeasure, &catformat);
+  measure = FtableToMeasure (&cpmFtable, NULL, &Nmeasure, &catformat);
   myAssert(measure, "failed to convert ftable to measure data");
 
@@ -127,5 +127,5 @@
 
   // convert internal to external format 
-  if (!MeasureToFtable (&cpmFtable, measure, Nmeasure, catformat)) {
+  if (!MeasureToFtable (&cpmFtable, NULL, measure, Nmeasure, catformat)) {
     myAbort("trouble converting format");
   }
Index: trunk/Ohana/src/dvomerge/src/dvorepairFixTables.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/dvorepairFixTables.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/dvorepairFixTables.c	(revision 37046)
@@ -103,5 +103,5 @@
 
       // convert internal to external format 
-      if (!MeasureToFtable (&cpmFtable, measureNew, NmeasureNew, catformat)) {
+      if (!MeasureToFtable (&cpmFtable, NULL, measureNew, NmeasureNew, catformat)) {
 	myAbort("trouble converting format");
       }
@@ -183,5 +183,5 @@
   gfits_scan(&cpmHeaderTBL, "NAXIS2", "%d", 1, &Nrows);
 
-  measure = FtableToMeasure (&cpmFtable, &Nmeasure, &catformat);
+  measure = FtableToMeasure (&cpmFtable, NULL, &Nmeasure, &catformat);
   myAssert(measure, "failed to convert ftable to measure data");
     
@@ -266,5 +266,6 @@
     average[Nave].measureOffset = -1;
     average[Nave].missingOffset = -1;
-    average[Nave].refColor = NAN;
+    average[Nave].refColorBlue = NAN;
+    average[Nave].refColorRef = NAN;
 
     average[Nave].objID = measure[i].objID;
Index: trunk/Ohana/src/dvomerge/src/dvorepairImageVsMeasure.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/dvorepairImageVsMeasure.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/dvorepairImageVsMeasure.c	(revision 37046)
@@ -128,5 +128,5 @@
       gfits_scan(&cpmHeaderTBL, "NAXIS1", "%d", 1, &NbytesPerRow);
 
-      measure = FtableToMeasure (&cpmFtable, &Nmeasure, &catformat);
+      measure = FtableToMeasure (&cpmFtable, NULL, &Nmeasure, &catformat);
       myAssert(measure, "failed to convert ftable to measure data");
     
Index: trunk/Ohana/src/dvomerge/src/dvorepairImagesVsMeasures.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/dvorepairImagesVsMeasures.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/dvorepairImagesVsMeasures.c	(revision 37046)
@@ -134,5 +134,5 @@
       gfits_scan(&cpmHeaderTBL, "NAXIS1", "%d", 1, &NbytesPerRow);
 
-      measure = FtableToMeasure (&cpmFtable, &Nmeasure, &catformat);
+      measure = FtableToMeasure (&cpmFtable, NULL, &Nmeasure, &catformat);
       myAssert(measure, "failed to convert ftable to measure data");
     
Index: trunk/Ohana/src/dvomerge/src/merge_catalogs_old.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/merge_catalogs_old.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/merge_catalogs_old.c	(revision 37046)
@@ -1,12 +1,4 @@
 # include "dvomerge.h"
 # define PSPS_ID TRUE
-
-# define MARKTIME(MSG,...) {			\
-    float dtime;				\
-    gettimeofday (&stop, (void *) NULL);	\
-    dtime = DTIME (stop, start);		\
-    fprintf (stderr, MSG, __VA_ARGS__);		\
-    gettimeofday (&start, (void *) NULL);	\
-  }
 
 # define IN_REGION(R,D) (					\
@@ -19,5 +11,5 @@
 
   off_t i, j, k, Nin, offset, J, Jmin, status, Nstars;
-  double RADIUS2, Rmin, Rin, Din;
+  double RADIUS2, Rmin;
   double *X1, *Y1, *X2, *Y2;
   double dX, dY, dR;
@@ -29,6 +21,5 @@
   Coords tcoords;
   
-  // struct timeval start, stop;
-  // gettimeofday (&start, (void *) NULL);
+  // INITTIME;
 
   NsecfiltOut = output[0].Nsecfilt;
@@ -40,5 +31,9 @@
   ALLOCATE (Y1, double, input[0].Naverage);
   ALLOCATE (N1, off_t,  input[0].Naverage);
-  ALLOCATE (input[0].found, off_t, input[0].Naverage);
+  if (!input[0].found_t) {
+    ALLOCATE (input[0].found_t, off_t, input[0].Naverage);
+  } else {
+    REALLOCATE (input[0].found_t, off_t, input[0].Naverage);
+  }
 
   /** allocate local arrays (catalog) **/
@@ -47,5 +42,9 @@
   ALLOCATE (Y2, double, NAVE);
   ALLOCATE (N2, off_t,    NAVE);
-  ALLOCATE (output[0].found, off_t, NAVE);
+  if (!output[0].found_t) {
+    ALLOCATE (output[0].found_t, off_t, NAVE);
+  } else {
+    REALLOCATE (output[0].found_t, off_t, NAVE);
+  }
   /* for secfilt j and star i, secfilt[i*Nsecfilt+j] */
 
@@ -87,10 +86,8 @@
     N1[Nstars] = i;
     Nstars ++;
-    input[0].found[i] = -1;
+    input[0].found_t[i] = -1;
   }
   if (Nstars < 1) {
     if (VERBOSE) fprintf (stderr, "skipping %s, no overlapping stars\n", output[0].filename);
-    free (output[0].found);
-    free (input[0].found);
     free (X1);
     free (Y1);
@@ -106,5 +103,5 @@
   for (i = 0; i < Nave; i++) {
     RD_to_XY (&X2[i], &Y2[i], output[0].average[i].R, output[0].average[i].D, &tcoords);
-    output[0].found[i] = -1;
+    output[0].found_t[i] = -1;
     N2[i] = i;
   }
@@ -196,5 +193,5 @@
 	int Mout = output[0].average[n].measureOffset;  
 	if (replace_match(&output[0].average[n], &output[0].measure[Mout], &input[0].average[N], &input[0].measure[offset])) {
-	  input[0].found[N] = Mout;
+	  input[0].found_t[N] = Mout;
 	  continue;
 	}
@@ -206,10 +203,11 @@
       output[0].measure[Nmeas] = input[0].measure[offset];
 
-      Rin = input[0].average[N].R - input[0].measure[offset].dR / 3600.0;
-      Din = input[0].average[N].D - input[0].measure[offset].dD / 3600.0;
-
-      /** dR,dD now represent arcsec **/
-      output[0].measure[Nmeas].dR       = 3600.0*(output[0].average[n].R - Rin);  // XXX update these based on choice of astromety
-      output[0].measure[Nmeas].dD       = 3600.0*(output[0].average[n].D - Din);  // XXX update these based on choice of astromety
+      // old code: find R,D using average_in[0], the get offset relative to average_out[0].  no longer
+      // needed since we carry around R,D
+      // Rin = input[0].average[N].R - input[0].measure[offset].dR / 3600.0;
+      // Din = input[0].average[N].D - input[0].measure[offset].dD / 3600.0;
+      // output[0].measure[Nmeas].dR = 3600.0*(output[0].average[n].R - Rin);
+      // output[0].measure[Nmeas].dD = 3600.0*(output[0].average[n].D - Din);
+
       output[0].measure[Nmeas].dbFlags  = 0;  // XXX why reset these?
       output[0].measure[Nmeas].averef   = n;
@@ -221,28 +219,29 @@
       // fprintf (stderr, "Nave : "OFF_T_FMT", Nmeas : "OFF_T_FMT", dR: %f, dD: %f, catID: %d\n",  n,  Nmeas, output[0].measure[Nmeas].dR, output[0].measure[Nmeas].dD, output[0].measure[i].catID);
 
-      // rationalize dR
-      if (output[0].measure[Nmeas].dR > +180.0*3600.0) {
+      float dRoff = dvoOffsetR(&output[0].measure[Nmeas], &output[0].average[n]);
+
+      // rationalize R
+      if (dRoff > +180.0*3600.0) {
 	// average on high end of boundary, move star up
-	Rin += 360.0;
-	output[0].measure[Nmeas].dR = 3600.0*(output[0].average[n].R - Rin);
-      }
-      if (output[0].measure[Nmeas].dR < -180.0*3600.0) {
+	output[0].measure[Nmeas].R += 360.0;
+	dRoff -= 360.0*3600.0;
+      }
+      if (dRoff < -180.0*3600.0) {
 	// average on low end of boundary, move star down
-	Rin -= 360.0;
-	output[0].measure[Nmeas].dR = 3600.0*(output[0].average[n].R - Rin);
-      }
-      if (fabs(output[0].measure[Nmeas].dR) > 10*RADIUS) {
-        // ok take declination into account and check again.
-        double cosD = cos(RAD_DEG*Din);
-        if (fabs(output[0].measure[Nmeas].dR*cosD) > 10*RADIUS) {
-
-            fprintf (stderr, "error: %10.6f,%10.6f vs %10.6f,%10.6f (%f,%f vs %f,%f)\n", 
-             output[0].average[n].R, output[0].average[n].D, Rin, Din,
-             X1[i], X2[Jmin], Y1[i], Y2[Jmin]);
-
-            // XXX abort on this? -- this is a bad failure...
+	output[0].measure[Nmeas].R -= 360.0;
+	dRoff += 360.0*3600.0;
+      }
+      if (fabs(dRoff) > 10*RADIUS) {
+        // take declination into account and check again.
+        double cosD = cos(RAD_DEG*output[0].average[n].D);
+        if (fabs(dRoff*cosD) > 10*RADIUS) {
+	  fprintf (stderr, "error: %10.6f,%10.6f vs %10.6f,%10.6f (%f,%f vs %f,%f)\n", 
+		   output[0].average[n].R, output[0].average[n].D, 
+		   output[0].measure[Nmeas].R, output[0].measure[Nmeas].D,
+		   X1[i], X2[Jmin], Y1[i], Y2[Jmin]);
+	  // XXX abort on this? -- this is a bad failure...
         }
       }
-      input[0].found[N] = Nmeas;
+      input[0].found_t[N] = Nmeas;
       output[0].average[n].Nmeasure ++;
       Nmeas ++;
@@ -273,5 +272,5 @@
     /* Nm is updated, but not written out in -update mode (for existing entries)
        Nm is recalculated in build_meas_links if loaded table is not sorted */
-    output[0].found[n] = Nmeas;
+    output[0].found_t[n] = Nmeas;
     i++;
   }
@@ -295,5 +294,5 @@
     }
 
-    if (input[0].found[N] >= 0) continue;
+    if (input[0].found_t[N] >= 0) continue;
     if (!IN_REGION (input[0].average[N].R, input[0].average[N].D)) continue;
 
@@ -348,5 +347,5 @@
 
       /* we set next[Nmeas] to -1 here, and update correctly below */
-      input[0].found[N] = Nmeas;
+      input[0].found_t[N] = Nmeas;
       next_meas[Nmeas] = -1;
       Nmeas ++;
@@ -374,8 +373,8 @@
   /* note stars which have been found in this catalog */
   for (i = 0; i < input[0].Naverage; i++) {
-    if (input[0].found[i] > -1) {
-      input[0].found[i] = -2;
+    if (input[0].found_t[i] > -1) {
+      input[0].found_t[i] = -2;
     } else {
-      input[0].found[i] = -3;
+      input[0].found_t[i] = -3;
     }
   }
@@ -390,9 +389,7 @@
   free (next_meas);
 
-  free (output[0].found);
   free (X2);
   free (Y2);
   free (N2);
-  free (input[0].found);
   free (X1);
   free (Y1);
@@ -411,5 +408,5 @@
    images have boundaries which are lines in pixels coords, but curve in RA and DEC
    
-   output[0].found[Ncat] but stars[Nstar].found
+   output[0].found_t[Ncat] but stars[Nstar].found
    
 */
Index: trunk/Ohana/src/dvomerge/src/replace_match.c
===================================================================
--- trunk/Ohana/src/dvomerge/src/replace_match.c	(revision 36833)
+++ trunk/Ohana/src/dvomerge/src/replace_match.c	(revision 37046)
@@ -7,5 +7,4 @@
   unsigned int averef;
   unsigned int catID;
-  double Rin, Din;
 
   // find the matching photcode in the object's list of measurements
@@ -18,10 +17,11 @@
     measure_out[Nout] = measure_in[0];
 
-    Rin = average_in[0].R - measure_in[0].dR / 3600.0;
-    Din = average_in[0].D - measure_in[0].dD / 3600.0;
+    // old code: find R,D using average_in[0], the get offset relative to average_out[0].  no longer
+    // needed since we carry around R,D
+    // double Rin = average_in[0].R - measure_in[0].dR / 3600.0;
+    // double Din = average_in[0].D - measure_in[0].dD / 3600.0;
+    // measure_out[Nout].dR = 3600.0*(average_out[0].R - Rin);
+    // measure_out[Nout].dD = 3600.0*(average_out[0].D - Din);
 
-    /** dR,dD now represent arcsec **/
-    measure_out[Nout].dR       = 3600.0*(average_out[0].R - Rin);
-    measure_out[Nout].dD       = 3600.0*(average_out[0].D - Din);
     measure_out[Nout].dbFlags  = 0;  // XXX why reset these?
     measure_out[Nout].averef   = averef;
@@ -29,24 +29,25 @@
     measure_out[Nout].catID    = catID;
 
+    float dRoff = dvoOffsetR(&measure_out[Nout], average_out);
+
     // rationalize dR
-    if (measure_out[Nout].dR > +180.0*3600.0) {
+    if (dRoff > +180.0*3600.0) {
       // average on high end of boundary, move star up
-      Rin += 360.0;
-      measure_out[Nout].dR = 3600.0*(average_out[0].R - Rin);
+      measure_out[Nout].R += 360.0;
+      dRoff -= 360.0*3600.0;
     }
-    if (measure_out[Nout].dR < -180.0*3600.0) {
+    if (dRoff < -180.0*3600.0) {
       // average on low end of boundary, move star down
-      Rin -= 360.0;
-      measure_out[Nout].dR = 3600.0*(average_out[0].R - Rin);
+      measure_out[Nout].R -= 360.0;
+      dRoff += 360.0*3600.0;
     }
 
     // warn on surprisingly distant detections
-    if (fabs(measure_out[Nout].dR) > 10*RADIUS) {
+    if (fabs(dRoff) > 10*RADIUS) {
       // ok take declination into account and check again.
-      double cosD = cos(RAD_DEG*Din);
-      if (fabs(measure_out[Nout].dR*cosD) > 10*RADIUS) {
-
+      double cosD = cos(RAD_DEG*average_out[0].D);
+      if (fabs(dRoff*cosD) > 10*RADIUS) {
 	fprintf (stderr, "surprisingly distant detection: %10.6f,%10.6f vs %10.6f,%10.6f\n", 
-		 average_out[0].R, average_out[0].D, Rin, Din);
+		 average_out[0].R, average_out[0].D, measure_out[Nout].R, measure_out[Nout].D);
       }
     }
