Index: /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/Makefile
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/Makefile	(revision 37489)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/Makefile	(revision 37490)
@@ -154,5 +154,6 @@
 $(SRC)/dvoutils.$(ARCH).o \
 $(SRC)/dvoutils_args.$(ARCH).o \
-$(SRC)/dvoutils_uniq_images.$(ARCH).o
+$(SRC)/dvoutils_uniq_images.$(ARCH).o \
+$(SRC)/dvoutils_load_image_index.$(ARCH).o
 
 $(DVOUTILS)  : $(INC)/dvoutils.h
Index: /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/include/dvoutils.h
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/include/dvoutils.h	(revision 37489)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/include/dvoutils.h	(revision 37490)
@@ -30,2 +30,5 @@
 int dvoutils_args (int *argc, char **argv);
 int dvoutils_uniq_images (char *filename);
+int *dvoutils_load_image_index (char *filename, int *nindex);
+
+Image *dvoutils_load_image_table (char *filename, int *nimage);
Index: /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/src/dvoutils_load_image_index.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/src/dvoutils_load_image_index.c	(revision 37490)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/src/dvoutils_load_image_index.c	(revision 37490)
@@ -0,0 +1,97 @@
+# include "dvoutils.h"
+
+// load the array of EXTERN_ID from the ImageIndex.fits tables
+int *dvoutils_load_image_index (char *filename, int *nindex) {
+
+  int Ncol;
+  off_t Nrow;
+  Header header;
+  Header theader;
+  Matrix matrix;
+  FTable ftable;
+  char type[16];
+
+  FILE *f = fopen (filename, "r");
+  if (!f) {
+    fprintf (stderr, "ERROR: cannot open image index file %s\n", filename);
+    return NULL;
+  }
+
+  /* load in PHU segment (ignore) */
+  if (!gfits_fread_header (f, &header)) {
+    if (VERBOSE) fprintf (stderr, "can't read image index header\n");
+    fclose (f);
+    return NULL;
+  }
+  if (!gfits_fread_matrix (f, &matrix, &header)) {
+    if (VERBOSE) fprintf (stderr, "can't read image index matrix\n");
+    gfits_free_header (&header);
+    fclose (f);
+    return NULL;
+  }
+
+  ftable.header = &theader;
+
+  // load data for this header 
+  if (!gfits_load_header (f, &theader)) {
+    fclose (f);
+    return NULL;
+  }
+
+  // read the fits table bytes
+  if (!gfits_fread_ftable_data (f, &ftable, FALSE)) {
+    fclose (f);
+    return (NULL);
+  }
+  fclose (f);
+
+  int *externID = gfits_get_bintable_column_data (&theader, &ftable, "EXTERN_ID", type, &Nrow, &Ncol);
+  myAssert (!strcmp(type, "int"), "wrong column type");
+
+  gfits_free_header (&header);
+  gfits_free_matrix (&matrix);
+  gfits_free_header (&theader);
+  gfits_free_table  (&ftable);
+
+  *nindex = Nrow;
+
+  return externID;
+}
+
+Image *dvoutils_load_image_table (char *filename, int *nimage) {
+
+  FITS_DB db;
+
+  gfits_db_init (&db);
+  db.lockstate = LCK_SOFT;
+  db.timeout   = 120.0;
+
+  if (!gfits_db_lock (&db, filename)) {
+    fprintf (stderr, "error opening image catalog %s (1)\n", filename);
+    exit (3);
+  }
+
+  if (db.dbstate == LCK_EMPTY) {
+    fprintf (stderr, "note: image catalog is empty\n");
+    gfits_db_free  (&db);
+    return NULL;
+  }
+
+  int status = dvo_image_load (&db, TRUE, FALSE);
+  gfits_db_close (&db);
+    
+  if (!status) {
+    fprintf (stderr, "problem loading image database table\n");
+    exit (4);
+  }
+
+  off_t Nimage;
+  Image *image = gfits_table_get_Image (&db.ftable, &Nimage, &db.swapped);
+  if (!image) {
+    fprintf (stderr, "ERROR: failed to read images\n");
+    exit (5);
+  }
+
+  *nimage = Nimage;
+  return image;
+}
Index: /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/src/dvoutils_uniq_images.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/src/dvoutils_uniq_images.c	(revision 37489)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/src/dvoutils_uniq_images.c	(revision 37490)
@@ -17,8 +17,15 @@
   }
 
-  int minID = -1;
-  int maxID = -1;
-  int *IDlist = NULL;
+  int    minID  = -1;
+  int    maxID  = -1;
+  int  *IDlist  = NULL;
+  int  *DBfound = NULL;
+  int  *DBindex = NULL;
   
+  int Ndb = 0;
+  int NDB = 100;
+  char **DBlist = NULL;
+  ALLOCATE (DBlist, char *, NDB); // list of the names of the image database tables.  
+
   char imFile[1024];
   while (scan_line_maxlen (f, imFile, 1024) != EOF) {
@@ -33,35 +40,10 @@
     }
 
-    FITS_DB db;
+    int Nimage;
+    // Image *image = dvoutils_load_image_table (imFile, &Nimage);
+    int *extern_id = dvoutils_load_image_index (imFile, &Nimage);
+    if (!extern_id) continue;
 
-    gfits_db_init (&db);
-    db.lockstate = LCK_SOFT;
-    db.timeout   = 120.0;
-
-    if (!gfits_db_lock (&db, imFile)) {
-      fprintf (stderr, "error opening image catalog %s (1)\n", imFile);
-      exit (3);
-    }
-
-    if (db.dbstate == LCK_EMPTY) {
-      fprintf (stderr, "note: image catalog is empty\n");
-      // free db
-      continue;
-    }
-
-    int status = dvo_image_load (&db, TRUE, FALSE);
-    gfits_db_close (&db);
-    
-    if (!status) {
-      fprintf (stderr, "problem loading image database table\n");
-      exit (4);
-    }
-
-    off_t Nimage;
-    Image *image = gfits_table_get_Image (&db.ftable, &Nimage, &db.swapped);
-    if (!image) {
-      fprintf (stderr, "ERROR: failed to read images\n");
-      exit (5);
-    }
+    DBlist[Ndb] = strcreate (imFile);
 
     // now loop over all of the images and accumulate the array of extern_id values (skip
@@ -76,7 +58,7 @@
     int i;
     for (i = 0; i < Nimage; i++) {
-      if (!image[i].externID) continue;
-      myMaxID = MAX(image[i].externID, myMaxID);
-      myMinID = MIN(image[i].externID, myMinID);
+      if (!extern_id[i]) continue;
+      myMaxID = MAX(extern_id[i], myMaxID);
+      myMinID = MIN(extern_id[i], myMinID);
     }
 
@@ -86,6 +68,14 @@
     if (!IDlist) {
       int Nindex = myMaxID - myMinID + 1;
-      ALLOCATE (IDlist, int, Nindex);
-      memset (IDlist, 0, Nindex*sizeof(int));
+      ALLOCATE (IDlist,  int,  Nindex); // number of times this ID is seen.  IDlist[i] corresponds to extern_id = i + minID
+      ALLOCATE (DBfound, int,  Nindex); // index of first DB in which this ID is seen (if n = DBfound[i], the correspond ID was seen in DB n
+      ALLOCATE (DBindex, int,  Nindex); // sequence of this image in the first DB for which this ID was found
+
+      for (i = 0; i < Nindex; i++) {
+	IDlist[i]  =  0;
+	DBfound[i] = -1;
+	DBindex[i] = -1;
+      }
+
       minID = myMinID;
       maxID = myMaxID;
@@ -99,7 +89,17 @@
       myAssert (oldNindex <= Nindex, "impossible!");
 
-      int *newIDlist = NULL;
-      ALLOCATE (newIDlist, int, Nindex);
-      memset (newIDlist, 0, Nindex*sizeof(int));
+      int *newIDlist  = NULL;
+      int *newDBfound = NULL;
+      int *newDBindex = NULL;
+
+      ALLOCATE (newIDlist,  int, Nindex);
+      ALLOCATE (newDBfound, int, Nindex);
+      ALLOCATE (newDBindex, int, Nindex);
+
+      for (i = 0; i < Nindex; i++) {
+	newIDlist[i]  =  0;
+	newDBfound[i] = -1;
+	newDBindex[i] = -1;
+      }
       
       // if myMinID >= minID, newMinID = minID -> offset = 0
@@ -108,8 +108,15 @@
 
       // save the old values
-      memcpy (&newIDlist[offset], IDlist, oldNindex*sizeof(int));
+      memcpy (&newIDlist [offset], IDlist,  oldNindex*sizeof(int));
+      memcpy (&newDBfound[offset], DBfound, oldNindex*sizeof(int));
+      memcpy (&newDBindex[offset], DBindex, oldNindex*sizeof(int));
 
       free (IDlist);
-      IDlist = newIDlist;
+      free (DBfound);
+      free (DBindex);
+
+      IDlist  = newIDlist;
+      DBfound = newDBfound;
+      DBindex = newDBindex;
 
       minID = newMinID;
@@ -118,6 +125,10 @@
 
     for (i = 0; i < Nimage; i++) {
-      if (!image[i].externID) continue;
-      int n = image[i].externID - minID;
+      if (!extern_id[i]) continue;
+      int n = extern_id[i] - minID;
+      if (IDlist[n] == 0) {
+	DBfound[n] = Ndb;
+	DBindex[n] = i;
+      }
       IDlist[n] ++;
     }
@@ -127,6 +138,6 @@
 
       for (i = 0; i < Nimage; i++) {
-	if (!image[i].externID) continue;
-	fprintf (stderr, "%d => %d\n", image[i].externID, image[i].externID - minID);
+	if (!extern_id[i]) continue;
+	fprintf (stderr, "%d => %d\n", extern_id[i], extern_id[i] - minID);
       }
 
@@ -138,4 +149,8 @@
       }
     }
+
+    // we are done with the db file, bump the counter
+    Ndb ++;
+    CHECK_REALLOCATE (DBlist, char *, NDB, Ndb, 100);
   }
 
@@ -147,5 +162,7 @@
   for (i = 0; i < Nindex; i++) {
     if (IDlist[i] < 2) continue;
-    fprintf (stderr, "%d : %d\n", i + minID, IDlist[i]);
+    int n = DBfound[i];
+    myAssert (n > -1, "impossible!");
+    fprintf (stderr, "%d : %d -- in %s (%d) : %d \n", i + minID, IDlist[i], DBlist[n], DBfound[i], DBindex[i]);
   }
 
