Index: /trunk/Ohana/src/dvomerge/Makefile
===================================================================
--- /trunk/Ohana/src/dvomerge/Makefile	(revision 38467)
+++ /trunk/Ohana/src/dvomerge/Makefile	(revision 38468)
@@ -50,4 +50,5 @@
 $(SRC)/build_links.$(ARCH).o \
 $(SRC)/replace_match.$(ARCH).o \
+$(SRC)/replace_tycho.$(ARCH).o \
 $(SRC)/merge_catalogs_new.$(ARCH).o \
 $(SRC)/merge_catalogs_old.$(ARCH).o
@@ -73,4 +74,5 @@
 $(SRC)/build_links.$(ARCH).o \
 $(SRC)/replace_match.$(ARCH).o \
+$(SRC)/replace_tycho.$(ARCH).o \
 $(SRC)/merge_catalogs_new.$(ARCH).o \
 $(SRC)/merge_catalogs_old.$(ARCH).o
Index: /trunk/Ohana/src/dvomerge/include/dvomerge.h
===================================================================
--- /trunk/Ohana/src/dvomerge/include/dvomerge.h	(revision 38467)
+++ /trunk/Ohana/src/dvomerge/include/dvomerge.h	(revision 38468)
@@ -40,4 +40,5 @@
 char  *ALTERNATE_PHOTCODE_FILE;
 int    REPLACE_BY_PHOTCODE;
+int    REPLACE_TYCHO;
 int    FORCE_MERGE;
 int    MAX_CLIENTS;
@@ -232,2 +233,5 @@
 int RepairTableCPT_V1(char *cptFilenameSrc, char *cptFilenameTgt, char *cpsFilenameSrc, char *cpsFilenameTgt, Measure *measure, off_t Nmeasure, Image *image, off_t Nimage, myIndexType *imageIDindex, char catformat);
 int *ReadDeleteListExternID(char *filename, int *nindex);
+
+void replace_tycho_init ();
+int  replace_tycho (Average *averageInp, Measure *measureInp, Average *averageOut, Measure *measureOut);
Index: /trunk/Ohana/src/dvomerge/src/args.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/args.c	(revision 38467)
+++ /trunk/Ohana/src/dvomerge/src/args.c	(revision 38468)
@@ -83,4 +83,11 @@
   if ((N = get_argument (*argc, argv, "-replace"))) {
     REPLACE_BY_PHOTCODE = TRUE;
+    remove_argument (N, argc, argv);
+  }
+
+  /* replace measurement, don't duplicate */
+  REPLACE_TYCHO = FALSE;
+  if ((N = get_argument (*argc, argv, "-replace-tycho"))) {
+    REPLACE_TYCHO = TRUE;
     remove_argument (N, argc, argv);
   }
@@ -240,4 +247,11 @@
   }
 
+  /* replace measurement, don't duplicate */
+  REPLACE_TYCHO = FALSE;
+  if ((N = get_argument (*argc, argv, "-replace-tycho"))) {
+    REPLACE_TYCHO = TRUE;
+    remove_argument (N, argc, argv);
+  }
+
   NTHREADS = 0;
   if ((N = get_argument (*argc, argv, "-threads"))) {
Index: /trunk/Ohana/src/dvomerge/src/dvomergeUpdate.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/dvomergeUpdate.c	(revision 38467)
+++ /trunk/Ohana/src/dvomerge/src/dvomergeUpdate.c	(revision 38468)
@@ -43,4 +43,6 @@
   inputPhotcodes = GetPhotcodeTable();
   NsecfiltInput = GetPhotcodeNsecfilt();
+
+  if (REPLACE_TYCHO) replace_tycho_init();
 
   // since we are merging the input db into the output db, the output defines the photcode
Index: /trunk/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c	(revision 38467)
+++ /trunk/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c	(revision 38468)
@@ -1,4 +1,5 @@
 # include "dvomerge.h"
 # define DEBUG 1
+# define MACHINE_GROUPS 1
 
 // in parallel mode, the target database may be distributed, while the input database is
@@ -9,4 +10,6 @@
 
 int dvomergeUpdate_parallel (char *input, char *output, SkyTable *outsky, IDmapType *IDmap);
+int dvomergeUpdate_parallel_group (HostTableGroup *group, char *absinput, char *absoutput, SkyTable *sky);
+int dvomergeUpdate_parallel_table (HostTable *table, char *absinput, char *absoutput);
 
 int dvomergeUpdate_catalogs (char *input, char *output, SkyTable *outsky, SkyList *inlist, int NsecfiltInput, int NsecfiltOutput, IDmapType *IDmap, int *secfiltMap) {
@@ -293,4 +296,5 @@
     if (VERIFY_CATALOG_ONLY) { snprintf (tmpline, DVO_MAX_PATH, "%s -verify-catalogs",  command); strcpy (command, tmpline); }
     if (REPLACE_BY_PHOTCODE) { snprintf (tmpline, DVO_MAX_PATH, "%s -replace",          command); strcpy (command, tmpline); }
+    if (REPLACE_TYCHO)       { snprintf (tmpline, DVO_MAX_PATH, "%s -replace-tycho",    command); strcpy (command, tmpline); }
     if (PARALLEL_INPUT)      { snprintf (tmpline, DVO_MAX_PATH, "%s -parallel-input",   command); strcpy (command, tmpline); }
     if (FORCE_MERGE)         { snprintf (tmpline, DVO_MAX_PATH, "%s -force-merge",      command); strcpy (command, tmpline); }
Index: /trunk/Ohana/src/dvomerge/src/dvorepairDeleteImagesByExternID.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/dvorepairDeleteImagesByExternID.c	(revision 38467)
+++ /trunk/Ohana/src/dvomerge/src/dvorepairDeleteImagesByExternID.c	(revision 38468)
@@ -728,5 +728,5 @@
 
     for (i = 0; i < Nrows; i++) {
-      dvo_secfilt_init (&secfilt[i]);
+      dvo_secfilt_init (&secfilt[i], SECFILT_RESET_ALL);
     }
 
Index: /trunk/Ohana/src/dvomerge/src/dvosecfilt_catalogs.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/dvosecfilt_catalogs.c	(revision 38467)
+++ /trunk/Ohana/src/dvomerge/src/dvosecfilt_catalogs.c	(revision 38468)
@@ -71,5 +71,5 @@
       }
       for (j = Nstart; j < Nsecfilt; j++) {
-	dvo_secfilt_init (&outsec[k*Nsecfilt + j]);
+	dvo_secfilt_init (&outsec[k*Nsecfilt + j], SECFILT_RESET_ALL);
       }
     }
Index: /trunk/Ohana/src/dvomerge/src/merge_catalogs_old.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/merge_catalogs_old.c	(revision 38467)
+++ /trunk/Ohana/src/dvomerge/src/merge_catalogs_old.c	(revision 38468)
@@ -196,6 +196,19 @@
     // 4) average properties from the input and the output db need to be properly merged.
 
+    int Nreplace = 0;
+    if (REPLACE_TYCHO) {
+      int Mout = output[0].average[n].measureOffset;  
+      int Minp =  input[0].average[N].measureOffset;
+      Nreplace = replace_tycho (&output[0].average[n], &output[0].measure[Mout], &input[0].average[N], &input[0].measure[Minp]);
+      if (Nreplace == 6) {
+	input[0].found_t[N] = Nmeas;
+	output[0].found_t[n] = Nmeas;
+	i++;
+	continue;
+      }
+    }
+
     /** add ALL measurements for this input average object **/
-    for (Nin = 0; Nin < input[0].average[N].Nmeasure; Nin ++) {
+    for (Nin = Nreplace; Nin < input[0].average[N].Nmeasure; Nin ++) {
       offset = input[0].average[N].measureOffset + Nin;
 
@@ -375,5 +388,5 @@
     for (j = 0; j < NsecfiltOut; j++) {
         int outputIndex = (Nave * NsecfiltOut) + j;
-	dvo_secfilt_init (&output[0].secfilt[outputIndex]);
+	dvo_secfilt_init (&output[0].secfilt[outputIndex], SECFILT_RESET_ALL);
     }
 
Index: /trunk/Ohana/src/dvomerge/src/replace_tycho.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/replace_tycho.c	(revision 38468)
+++ /trunk/Ohana/src/dvomerge/src/replace_tycho.c	(revision 38468)
@@ -0,0 +1,50 @@
+# include "dvomerge.h"
+
+static short TYCHO_B;
+static short TYCHO_V;
+
+void replace_tycho_init () {
+  
+  TYCHO_B = GetPhotcodeCodebyName ("TYCHO_B"); myAssert (TYCHO_B, "TYCHO_B photcode not found\n");
+  TYCHO_V = GetPhotcodeCodebyName ("TYCHO_V"); myAssert (TYCHO_V, "TYCHO_V photcode not found\n");
+}
+
+int replace_tycho (Average *averageOut, Measure *measureOut, Average *averageInp, Measure *measureInp) {
+
+  int i;
+
+  int Nindex = 0;
+  int index[6];
+
+  // find all tycho measurements
+  for (i = 0; (i < averageOut->Nmeasure) && (Nindex < 6); i++) {
+
+    int valid = FALSE;
+    valid = valid || (measureOut[i].photcode == TYCHO_B);
+    valid = valid || (measureOut[i].photcode == TYCHO_V);
+    if (!valid) continue;
+
+    index[Nindex] = i;
+    Nindex ++;
+  }
+
+  if ((Nindex != 0) && (Nindex != 6)) {
+    fprintf (stderr, "unexpected number of tycho measurements: (Nindex = %d)\n", Nindex);
+  }
+
+  for (i = 0; i < Nindex; i++) {
+    int Nm = index[i];
+
+    int averef = measureOut[Nm].averef;
+    int objID  = measureOut[Nm].objID;
+    int catID  = measureOut[Nm].catID;
+
+    measureOut[Nm] = measureInp[i];
+
+    measureOut[Nm].averef = averef;
+    measureOut[Nm].objID  = objID;
+    measureOut[Nm].catID  = catID;
+  }
+
+  return Nindex;
+}
