Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/include/dvoutils.h
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/include/dvoutils.h	(revision 38716)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/include/dvoutils.h	(revision 38717)
@@ -22,4 +22,10 @@
 } DVOUTILS_OP_TYPE;
 
+typedef struct {
+  int   *externID;
+  short *photcode;
+  int Nimages;
+} ImageData;
+
 int VERBOSE;
 int DVOUTILS_OP;
@@ -30,5 +36,6 @@
 int dvoutils_args (int *argc, char **argv);
 int dvoutils_uniq_images (char *filename);
-int *dvoutils_load_image_index (char *filename, int *nindex);
+
+ImageData *dvoutils_load_image_index (char *filename);
 
 Image *dvoutils_load_image_table (char *filename, int *nimage);
Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvoutils_load_image_index.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvoutils_load_image_index.c	(revision 38716)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvoutils_load_image_index.c	(revision 38717)
@@ -2,8 +2,8 @@
 
 // load the array of EXTERN_ID from the ImageIndex.fits tables
-int *dvoutils_load_image_index (char *filename, int *nindex) {
+ImageData *dvoutils_load_image_index (char *filename) {
 
   int Ncol;
-  off_t Nrow;
+  off_t Nrow, Nphot;
   Header header;
   Header theader;
@@ -46,6 +46,14 @@
   fclose (f);
 
-  int *externID = gfits_get_bintable_column_data (&theader, &ftable, "EXTERN_ID", type, &Nrow, &Ncol);
+  ImageData *imdata = NULL;
+  ALLOCATE (imdata, ImageData, 1);
+
+  imdata->externID = gfits_get_bintable_column_data (&theader, &ftable, "EXTERN_ID", type, &Nrow, &Ncol);
   myAssert (!strcmp(type, "int"), "wrong column type");
+
+  imdata->photcode = gfits_get_bintable_column_data (&theader, &ftable, "PHOTCODE", type, &Nphot, &Ncol);
+  myAssert (Nphot == Nrow, "photcode & extern_id mis-match");
+
+  imdata->Nimages = Nrow;
 
   gfits_free_header (&header);
@@ -54,7 +62,5 @@
   gfits_free_table  (&ftable);
 
-  *nindex = Nrow;
-
-  return externID;
+  return imdata;
 }
 
Index: /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvoutils_uniq_images.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvoutils_uniq_images.c	(revision 38716)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvoutils_uniq_images.c	(revision 38717)
@@ -40,8 +40,6 @@
     }
 
-    int Nimage;
-    // Image *image = dvoutils_load_image_table (imFile, &Nimage);
-    int *extern_id = dvoutils_load_image_index (imFile, &Nimage);
-    if (!extern_id) continue;
+    ImageData *imdata = dvoutils_load_image_index (imFile);
+    if (!imdata) continue;
 
     DBlist[Ndb] = strcreate (imFile);
@@ -57,11 +55,22 @@
 
     int i;
-    for (i = 0; i < Nimage; i++) {
-      if (!extern_id[i]) continue;
-      myMaxID = MAX(extern_id[i], myMaxID);
-      myMinID = MIN(extern_id[i], myMinID);
+    int Nbad = 0;
+    for (i = 0; i < imdata->Nimages; i++) {
+      if (!imdata->photcode[i] && imdata->externID[i]) myAbort ("invalid combo");
+
+      if (!imdata->photcode[i]) continue;
+      if (!imdata->externID[i]) {
+	Nbad ++;
+	continue;
+      }
+      myMaxID = MAX(imdata->externID[i], myMaxID);
+      myMinID = MIN(imdata->externID[i], myMinID);
     }
 
-    fprintf (stderr, "read %s, %d images, %d - %d vs %d - %d\n", imFile, (int) Nimage, myMinID, myMaxID, minID, maxID);
+    fprintf (stderr, "read %s, %d images, %d - %d vs %d - %d\n", imFile, (int) imdata->Nimages, myMinID, myMaxID, minID, maxID);
+
+    if (Nbad) {
+      fprintf (stderr, "WARNING: %d images without extern_id set\n", (int) Nbad);
+    }
 
     // if this is new, we treat it a bit differently
@@ -124,7 +133,7 @@
     }
 
-    for (i = 0; i < Nimage; i++) {
-      if (!extern_id[i]) continue;
-      int n = extern_id[i] - minID;
+    for (i = 0; i < imdata->Nimages; i++) {
+      if (!imdata->externID[i]) continue;
+      int n = imdata->externID[i] - minID;
       if (IDlist[n] == 0) {
 	DBfound[n] = Ndb;
@@ -133,5 +142,5 @@
       IDlist[n] ++;
       if (VERBOSE && (IDlist[n] > 1)) {
-	fprintf (stderr, "duplicate ext_id %d in file %s\n", extern_id[i], imFile);
+	fprintf (stderr, "duplicate ext_id %d in file %s\n", imdata->externID[i], imFile);
       }
     }
@@ -140,7 +149,7 @@
       fprintf (stderr, "------------ %s ----------\n", imFile);
 
-      for (i = 0; i < Nimage; i++) {
-	if (!extern_id[i]) continue;
-	fprintf (stderr, "%d => %d\n", extern_id[i], extern_id[i] - minID);
+      for (i = 0; i < imdata->Nimages; i++) {
+	if (!imdata->externID[i]) continue;
+	fprintf (stderr, "%d => %d\n", imdata->externID[i], imdata->externID[i] - minID);
       }
 
@@ -165,5 +174,5 @@
     int n = DBfound[i];
     myAssert (n > -1, "impossible!");
-    fprintf (stdout, "%d : %d -- in %s (%d) : %d \n", i + minID, IDlist[i], DBlist[n], DBfound[i], DBindex[i]);
+    fprintf (stdout, "primary %d : %d -- in %s (%d) : %d \n", i + minID, IDlist[i], DBlist[n], DBfound[i], DBindex[i]);
   }
 
