Index: /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/src/dvorepairDeleteImagesByExternID.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/src/dvorepairDeleteImagesByExternID.c	(revision 37498)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/dvomerge/src/dvorepairDeleteImagesByExternID.c	(revision 37499)
@@ -14,4 +14,7 @@
 // * rebuild the cpt file or delete the matching entries?
 
+int SaveImageTable (Image *image, off_t Nimage, char *catdir);
+Image *DeleteSelectedImages (Image *image, off_t Nimage, int *deleteImage, myIndexType *imageIDindex, off_t *NnewImage);
+
 int dvorepairDeleteImagesByExternID (int argc, char **argv) {
 
@@ -69,8 +72,9 @@
   // set the min and max ID values for the two strucures:
   for (i = 0; i < Nimage; i++) {
+    myIndexUpdateLimits (imageIDindex,  image[i].imageID);
+
     if (!image[i].externID) continue;
     myAssert (image[i].imageID, "image must have imageID > 0");
     myIndexUpdateLimits (externIDindex, image[i].externID);
-    myIndexUpdateLimits (imageIDindex,  image[i].imageID);
   }
 
@@ -89,8 +93,8 @@
   // assign the externIDs and imageIDs to their index structures
   for (i = 0; i < Nimage; i++) {
+    myIndexSetEntry (imageIDindex,  image[i].imageID,  i);
+
     if (!image[i].externID) continue;
-
     myIndexSetEntry (externIDindex, image[i].externID, i);
-    myIndexSetEntry (imageIDindex,  image[i].imageID,  i);
   }
 
@@ -177,5 +181,5 @@
   SkyRegion UserPatch;
 
-  if (dR < dQ) {
+  if (dR < dQ + 0.1) {
     fprintf (stderr, "R,D range: %f - %f, %f - %f\n", Rmin, Rmax, Dmin, Dmax);
     nPass = 1;
@@ -219,5 +223,5 @@
     // loop over the populated input regions
     int Ncheck = 0;
-    for (i = 0; i < inlist[0].Nregions; i++) {
+    for (i = 0; FALSE && (i < inlist[0].Nregions); i++) {
       if (!inlist[0].regions[i][0].table) continue;
 
@@ -364,4 +368,9 @@
   }
 
+  off_t NnewImage;
+  Image *newImage = DeleteSelectedImages (image, Nimage, deleteImage, imageIDindex, &NnewImage);
+
+  SaveImageTable (newImage, NnewImage, catdir);
+
   myIndexFree (externIDindex);
   myIndexFree (imageIDindex);
@@ -386,4 +395,106 @@
 }
 
+Image *DeleteSelectedImages (Image *image, off_t Nimage, int *deleteImage, myIndexType *imageIDindex, off_t *NnewImage) {
+
+  // we need to remove the (WRP) images, but we also want to remove the DIS [PHU] image entries if they have
+  // had all of their children deleted
+
+  // first, generate an array of the number of children for each parent
+
+  int *Nchildren = NULL;
+  ALLOCATE (Nchildren, int, Nimage);
+  memset (Nchildren, 0, Nimage*sizeof(int));
+
+  int i;
+  for (i = 0; i < Nimage; i++) {
+    if (!image[i].parentID) continue;
+    myAssert (!strcmp(&image[i].coords.ctype[4], "-WRP"), "child with non WRP coords?");
+
+    int n = myIndexGetEntry (imageIDindex, image[i].parentID);
+    myAssert (n != -1, "invalid parentID?");
+    myAssert (n < Nimage, "invalid parentID??");
+    Nchildren[n] ++;
+  }
+
+  // now subtract the children which need to be deleted
+  for (i = 0; i < Nimage; i++) {
+    if (!deleteImage[i]) continue;
+    if (!image[i].parentID) continue; // should I warn on this?
+
+    int n = myIndexGetEntry (imageIDindex, image[i].parentID);
+    myAssert (n != -1, "invalid parentID?");
+    myAssert (n < Nimage, "invalid parentID??");
+    Nchildren[n] --;
+    myAssert (Nchildren[n] >= 0, "over deleted???");
+  }
+  
+  // now check for any parent and delete it
+  for (i = 0; i < Nimage; i++) {
+    if (strcmp(&image[i].coords.ctype[4], "-DIS")) continue;
+    myAssert (!image[i].parentID, "parent ID for DIS image??");
+    if (!Nchildren[i]) deleteImage[i] = TRUE;
+  }
+
+  fprintf (stderr, "deleting the following images:\n");
+
+  off_t Nnew = 0;
+  Image *newImage = NULL;
+  ALLOCATE (newImage, Image, Nimage);
+  for (i = 0; i < Nimage; i++) {
+    if (deleteImage[i]) { 
+      fprintf (stderr, "%s : %d : %d : %d\n", image[i].name, image[i].imageID, image[i].parentID, image[i].externID);
+      continue;
+    }
+    newImage[Nnew] = image[i];
+    Nnew ++;
+  }
+
+  REALLOCATE (newImage, Image, Nnew);
+
+  *NnewImage = Nnew;
+  return newImage;
+}
+
+int SaveImageTable (Image *image, off_t Nimage, char *catdir) {
+
+  FITS_DB db;
+
+  char ImageCatSrc[DVO_MAX_PATH];
+  char ImageCatTgt[DVO_MAX_PATH];
+
+  // we are creating a new image table (what about db ID?)
+  snprintf (ImageCatSrc, DVO_MAX_PATH, "%s/Images.dat", catdir);
+  snprintf (ImageCatTgt, DVO_MAX_PATH, "%s/Images.dat.broken", catdir);
+
+  // rename the old cpt file:
+  if (rename (ImageCatSrc, ImageCatTgt)) {
+    perror ("tried to rename file");
+    exit (2);
+  }
+
+  /* setup image table format and lock */
+  db.mode    = dvo_catalog_catmode ("SPLIT");
+  db.format  = dvo_catalog_catformat ("PS1_V5");
+  int status = dvo_image_lock (&db, ImageCatSrc, 3600.0, LCK_XCLD);  // shorter timeout?
+  if (!status) {
+    fprintf (stderr, "ERROR: failure to lock image catalog %s", db.filename);
+    exit (2);
+  }
+
+  /* load or create the image table */
+  if (db.dbstate != LCK_EMPTY) {
+    fprintf (stderr, "image table %s exists, exiting", db.filename);
+    exit (2);
+  }
+  dvo_image_create (&db, GetZeroPoint());
+
+  /* add the new image and save */
+  dvo_image_addrows (&db, image, Nimage);
+  dvo_image_update (&db, VERBOSE);
+  dvo_image_unlock (&db); /* unlock? */
+
+  return TRUE;
+}
+
 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) {
 
@@ -445,4 +556,6 @@
     myAssert (n > -1, "impossible!");
     
+    dvo_average_init (&average[Nave]);
+
     // I actually have measure->R,D, I could just use those...
     XY_to_RD (&average[Nave].R, &average[Nave].D, measure[i].Xccd, measure[i].Yccd, &image[n].coords);
@@ -454,6 +567,4 @@
     average[Nave].measureOffset = -1;
     average[Nave].missingOffset = -1;
-    average[Nave].refColorBlue = NAN;
-    average[Nave].refColorRed = NAN;
 
     average[Nave].objID = measure[i].objID;
@@ -501,5 +612,5 @@
   myAssert(cptFile, "failed to open cpt file");
 
-  // load the cpt header (use for CATID, RA,DEC range, filenames)
+  // load the cpt header (use for CATID, RA, DEC range, filenames)
   if (!gfits_fread_header (cptFile, &cptHeaderPHU)) {
     myAbort("failure to cpt header");
@@ -578,4 +689,8 @@
     ALLOCATE (secfilt, SecFilt, Nrows);
 
+    for (i = 0; i < Nrows; i++) {
+      dvo_secfilt_init (&secfilt[i]);
+    }
+
     /* convert internal to external format */
     if (!SecFiltToFtable (&cpsFtable, secfilt, Nrows, catformat)) {
