Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/Makefile
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/Makefile	(revision 38650)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/Makefile	(revision 38651)
@@ -51,4 +51,5 @@
 $(SRC)/replace_match.$(ARCH).o \
 $(SRC)/replace_tycho.$(ARCH).o \
+$(SRC)/repair_catalog_by_objID.$(ARCH).o \
 $(SRC)/merge_catalogs_new.$(ARCH).o \
 $(SRC)/merge_catalogs_old.$(ARCH).o
@@ -75,4 +76,5 @@
 $(SRC)/replace_match.$(ARCH).o \
 $(SRC)/replace_tycho.$(ARCH).o \
+$(SRC)/repair_catalog_by_objID.$(ARCH).o \
 $(SRC)/merge_catalogs_new.$(ARCH).o \
 $(SRC)/merge_catalogs_old.$(ARCH).o
Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/include/dvomerge.h
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/include/dvomerge.h	(revision 38650)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/include/dvomerge.h	(revision 38651)
@@ -47,4 +47,5 @@
 
 int    MATCHED_TABLES;
+int    REPAIR_BY_OBJID;
 
 char *SINGLE_CPT;
@@ -242,2 +243,3 @@
 void replace_tycho_init ();
 int  replace_tycho (Average *averageInp, Measure *measureInp, off_t *next_meas, Average *averageOut, Measure *measureOut);
+int repair_catalog_by_objID (Catalog *catalog);
Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/args.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/args.c	(revision 38650)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/args.c	(revision 38651)
@@ -94,4 +94,10 @@
   if ((N = get_argument (*argc, argv, "-replace-tycho"))) {
     REPLACE_TYCHO = TRUE;
+    remove_argument (N, argc, argv);
+  }
+
+  REPAIR_BY_OBJID = FALSE;
+  if ((N = get_argument (*argc, argv, "-repair-by-objid"))) {
+    REPAIR_BY_OBJID = TRUE;
     remove_argument (N, argc, argv);
   }
@@ -266,4 +272,10 @@
   }
 
+  REPAIR_BY_OBJID = FALSE;
+  if ((N = get_argument (*argc, argv, "-repair-by-objid"))) {
+    REPAIR_BY_OBJID = TRUE;
+    remove_argument (N, argc, argv);
+  }
+
   NTHREADS = 0;
   if ((N = get_argument (*argc, argv, "-threads"))) {
Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c	(revision 38650)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c	(revision 38651)
@@ -193,4 +193,10 @@
 	  outcatalog.catcompress = incatalog.catcompress;
 	}
+      }
+
+      if (REPAIR_BY_OBJID) {
+	// For gpc1 / PV3, I broke some catalogs with dvomerge -replace: the last object can
+	// contaminate the first set of new measurements
+	repair_catalog_by_objID (&outcatalog);
       }
 
@@ -296,4 +302,5 @@
     if (UPDATE_CATFORMAT)    { strextend (&command, "-update-catformat %s", UPDATE_CATFORMAT); }
     if (UPDATE_CATCOMPRESS)  { strextend (&command, "-update-catcompress %s", UPDATE_CATCOMPRESS); }
+    if (REPAIR_BY_OBJID)     { strextend (&command, "-repair-by-objid"); }
 
     // add some config variables:
Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvomerge_client.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvomerge_client.c	(revision 38650)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvomerge_client.c	(revision 38651)
@@ -84,6 +84,4 @@
   // loop over the populatable output tables; check for data in input in the corresponding regions
 
-  SetPhotcodeTable(NULL);
-  
   if (REPLACE_TYCHO) replace_tycho_init();
 
Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/repair_catalog_by_objID.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/repair_catalog_by_objID.c	(revision 38651)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/repair_catalog_by_objID.c	(revision 38651)
@@ -0,0 +1,116 @@
+# include "dvomerge.h"
+
+int repair_catalog_by_objID (Catalog *catalog) {
+
+  // first find the entries which are bad (there may be none)
+  int Nbad = 0;
+
+  Average *average = catalog->average;
+  Measure *measure = catalog->measure;
+
+  off_t i, j;
+  for (i = 0; i < catalog->Naverage; i++) {
+    off_t m = average[i].measureOffset;
+    for (j = 0; j < average[i].Nmeasure; j++) {
+      if (average[i].objID == measure[m+j].objID) continue;
+      
+      // this is a bad entry.  now we need to decide if it can be repaired
+      
+      Measure *myMeasure = &measure[m+j];
+      int iTest = myMeasure->objID;
+      myAssert (average[iTest].objID == iTest, "cannot find target source");
+      
+      double dR = 3600.0*(average[iTest].R - myMeasure->R) * cos (RAD_DEG*myMeasure->D);
+      double dD = 3600.0*(average[iTest].D - myMeasure->D);
+      double dRad = hypot (dR, dD);
+      myAssert (dRad < 2.0, "bad detection does not seem to match target source");
+      
+      char *date = ohana_sec_to_date (myMeasure->t);
+      fprintf (stderr, "bad detection found: matches averef %d, objID %d, %s : %6.3f %5d : %f, %f = %f\n", iTest, myMeasure->objID, date, myMeasure->M, myMeasure->photcode, dR, dD, dRad);
+      free (date);
+      Nbad ++;
+    }
+  }
+  if (!Nbad) return TRUE;
+
+  // we have at least one bad detection
+  // make a matched list of the measurement sequence and the objID values
+
+  off_t Nmeasure = catalog->Nmeasure;
+  ALLOCATE_PTR (seq,   off_t, Nmeasure);
+  ALLOCATE_PTR (objID, off_t, Nmeasure);
+
+  for (i = 0; i < Nmeasure; i++) {
+    seq[i]   = i;
+    objID[i] = measure[i].objID;
+  }    
+
+  // sort seq by objID
+  llsortpair (objID, seq, Nmeasure);
+
+  // create a new array of measures in objID order
+  Measure *measureNew = NULL;
+  ALLOCATE (measureNew, Measure, Nmeasure);
+  
+  for (i = 0; i < Nmeasure; i++) {
+    j = seq[i];
+    measureNew[i] = measure[j];
+  }
+
+  // reset averef and Nmeasure values for the average entries
+  off_t N = 0;
+  off_t myObjID = objID[0];
+  off_t averef = 0;
+  average[averef].measureOffset = 0;
+  for (i = 0; i < Nmeasure; i++) {
+    if (objID[i] != myObjID) {
+      // we have hit the next entry in the list
+      average[averef].Nmeasure = N;
+      N = 0;
+      myObjID = objID[i];
+      averef ++;
+      average[averef].measureOffset = i;
+    }
+    if (measureNew[i].averef != averef) {
+      fprintf (stderr, "fixing averef for measure "OFF_T_FMT" (%d -> "OFF_T_FMT")\n", i, measureNew[i].averef, averef);
+      measureNew[i].averef = averef;
+    }
+    N++;
+  }
+  average[averef].Nmeasure = N;
+
+  free (catalog->measure);
+  catalog->measure = measureNew;
+
+  int NmeasureTotal = 0;
+  int measureOffsetOK = TRUE;
+  for (i = 0; i < catalog->Naverage; i++) {
+    NmeasureTotal += catalog[0].average[i].Nmeasure;
+    if (!(NmeasureTotal <= catalog[0].Nmeasure)) {
+      fprintf (stderr, "too many measurements: %d %d %d\n", (int) i, NmeasureTotal, (int) catalog[0].Nmeasure);
+    }
+    measureOffsetOK &= (catalog[0].average[i].measureOffset < catalog[0].Nmeasure);
+    if (!(catalog[0].average[i].measureOffset < catalog[0].Nmeasure)) {
+      fprintf (stderr, "offset too large: %d %d %d\n", (int) i, catalog[0].average[i].Nmeasure, (int) catalog[0].Nmeasure);
+    }
+    measureOffsetOK &= (catalog[0].average[i].measureOffset + catalog[0].average[i].Nmeasure <= catalog[0].Nmeasure);
+    if (!(catalog[0].average[i].measureOffset + catalog[0].average[i].Nmeasure <= catalog[0].Nmeasure)) {
+      fprintf (stderr, "offset + Nmeasure too large: %d + %d > %d %d\n", (int) i, catalog[0].average[i].measureOffset, catalog[0].average[i].Nmeasure, (int) catalog[0].Nmeasure);
+    }
+  }
+
+  int status = TRUE;
+  if (!measureOffsetOK) {
+    fprintf (stderr, "ERROR: catalog %s has an invalid measureOffset\n", catalog[0].filename);
+    status = FALSE;
+  }
+
+  if (NmeasureTotal != catalog[0].Nmeasure) {
+    fprintf (stderr, "ERROR: catalog %s has an invalid Nmeasure\n", catalog[0].filename);
+    status = FALSE;
+  }
+
+  if (!status) exit (2);
+
+  return TRUE;
+}
Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/replace_tycho.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/replace_tycho.c	(revision 38650)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/replace_tycho.c	(revision 38651)
@@ -28,5 +28,5 @@
     valid = valid || (measureOut[m].photcode == TYCHO_V);
     if (valid) { 
-      index[Nindex] = i;
+      index[Nindex] = m;
       Nindex ++;
     }
