Index: trunk/Ohana/src/relastro/include/relastro.h
===================================================================
--- trunk/Ohana/src/relastro/include/relastro.h	(revision 39579)
+++ trunk/Ohana/src/relastro/include/relastro.h	(revision 39580)
@@ -317,4 +317,5 @@
 int    USE_ICRF_POLE;
 
+int    USE_IMAGE_COORDS_FOR_REPAIR;
 int    USE_ALL_IMAGES;
 
@@ -453,5 +454,5 @@
 void          initImageBins       PROTO((Catalog *catalog, int Ncatalog, int FULLINIT));
 void          initImages          PROTO((Image *input, off_t *line_number, off_t N));
-void          freeImages          PROTO(());
+void          freeImages          PROTO((char *dbImagePtr));
 void          initMosaicBins      PROTO((Catalog *catalog, int Ncatalog));
 void          initMosaicGrid      PROTO((Image *image, off_t Nimage));
Index: trunk/Ohana/src/relastro/src/ImageOps.c
===================================================================
--- trunk/Ohana/src/relastro/src/ImageOps.c	(revision 39579)
+++ trunk/Ohana/src/relastro/src/ImageOps.c	(revision 39580)
@@ -121,5 +121,5 @@
 }
 
-void freeImages () {
+void freeImages (char *dbImagePtr) {
 
   FREE (LineNumber);
@@ -134,5 +134,7 @@
 # endif
 
-  free (image);
+  // we call gfits_db_free as well as this function.  sometimes those point at the same
+  // memory location, in which case we should only do the free once.
+  if ((void *) dbImagePtr != (void *) image) free (image);
   free_astrom_table();
 }
Index: trunk/Ohana/src/relastro/src/RepairWarpMeasures.c
===================================================================
--- trunk/Ohana/src/relastro/src/RepairWarpMeasures.c	(revision 39579)
+++ trunk/Ohana/src/relastro/src/RepairWarpMeasures.c	(revision 39580)
@@ -9,5 +9,5 @@
   myAssert (!catalog->Nmeasure || catalog->measure, "programming error");
 
-  int NfixChipID = 0, NfixStackID = 0, NfixWarpID = 0, NfixWarpImageID = 0, NmissWarp = 0, NmissStack = 0, NbadWarp = 0;
+  int NfixChipID = 0, NfixStackID = 0, NfixWarpID = 0, NfixWarpImageID = 0, NmissWarp = 0, NmissStack = 0, NbadWarp = 0, NwarpNoImage = 0;
 
   int onePercent = catalog->Nmeasure / 100;
@@ -63,4 +63,20 @@
     double Rwrp = measure->R;
     double Dwrp = measure->D;
+
+    if (USE_IMAGE_COORDS_FOR_REPAIR) {
+      off_t idx = getImageByID (measure->imageID);
+      if (idx == -1) {
+	if (VERBOSE2) fprintf (stderr, "can't match detection to image?\n");
+	NwarpNoImage ++;
+	continue;
+      }
+
+      Coords *imcoords = &image[idx].coords;
+
+      XY_to_RD (&Rwrp, &Dwrp, X, Y, imcoords);
+      
+      Rwrp = ohana_normalize_angle_to_midpoint(Rwrp, 180.0);
+      Dwrp = ohana_normalize_angle_to_midpoint(Dwrp,   0.0);
+    }
 
     double Rave = average->R;
@@ -127,5 +143,5 @@
 
   fprintf (stderr, "\n");
-  fprintf (stderr, "repaired %s : warp image ID %d : ext ID chip %d stack %d warp %d : missed warp %d stack %d : bad warp: %d\n", catalog->filename, NfixWarpImageID, NfixChipID, NfixStackID, NfixWarpID, NmissWarp, NmissStack, NbadWarp);
+  fprintf (stderr, "repaired %s : warp image ID %d : ext ID chip %d stack %d warp %d : missed warp %d stack %d : bad warp: %d : warp no image: %d\n", catalog->filename, NfixWarpImageID, NfixChipID, NfixStackID, NfixWarpID, NmissWarp, NmissStack, NbadWarp, NwarpNoImage);
 
   return (TRUE);
Index: trunk/Ohana/src/relastro/src/RepairWarps.c
===================================================================
--- trunk/Ohana/src/relastro/src/RepairWarps.c	(revision 39579)
+++ trunk/Ohana/src/relastro/src/RepairWarps.c	(revision 39580)
@@ -109,8 +109,10 @@
 	       UserPatch.Rmin, UserPatch.Rmax, UserPatch.Dmin, UserPatch.Dmax);
 
-    if (VERBOSE)       	 strextend (&command, "-v");
-    if (VERBOSE2)      	 strextend (&command, "-vv");
-    if (UPDATE)        	 strextend (&command, "-update");
-    if (USE_BASIC_CHECK) strextend (&command, "-basic-image-search");
+    if (VERBOSE)       	 	     strextend (&command, "-v");
+    if (VERBOSE2)      	 	     strextend (&command, "-vv");
+    if (UPDATE)        	 	     strextend (&command, "-update");
+    if (USE_BASIC_CHECK) 	     strextend (&command, "-basic-image-search");
+    if (USE_IMAGE_COORDS_FOR_REPAIR) strextend (&command, "-use-image-coords-for-repair");
+    if (USE_ALL_IMAGES)              strextend (&command, "-use-all-images");
 
     fprintf (stderr, "command: %s\n", command);
Index: trunk/Ohana/src/relastro/src/args.c
===================================================================
--- trunk/Ohana/src/relastro/src/args.c	(revision 39579)
+++ trunk/Ohana/src/relastro/src/args.c	(revision 39580)
@@ -312,4 +312,11 @@
       exit (2);
     }
+  }
+
+  // when repairing warp detections, check the model coordinates for consistency
+  USE_IMAGE_COORDS_FOR_REPAIR = FALSE;
+  if ((N = get_argument (argc, argv, "-use-image-coords-for-repair"))) {
+    remove_argument (N, &argc, argv);
+    USE_IMAGE_COORDS_FOR_REPAIR = TRUE;
   }
 
@@ -817,4 +824,11 @@
       exit (2);
     }
+  }
+
+  // when repairing warp detections, check the model coordinates for consistency
+  USE_IMAGE_COORDS_FOR_REPAIR = FALSE;
+  if ((N = get_argument (argc, argv, "-use-image-coords-for-repair"))) {
+    remove_argument (N, &argc, argv);
+    USE_IMAGE_COORDS_FOR_REPAIR = TRUE;
   }
 
Index: trunk/Ohana/src/relastro/src/relastro.c
===================================================================
--- trunk/Ohana/src/relastro/src/relastro.c	(revision 39579)
+++ trunk/Ohana/src/relastro/src/relastro.c	(revision 39580)
@@ -50,6 +50,6 @@
 
       if (!PARALLEL) {
+	freeImages (db.ftable.buffer);
 	gfits_db_free (&db);
-	freeImages();
 	freeMosaics ();
       }	
@@ -91,6 +91,6 @@
 
       if (!PARALLEL) {
+	freeImages (db.ftable.buffer);
 	gfits_db_free (&db);
-	freeImages();
 	freeMosaics ();
       }	
Index: trunk/Ohana/src/relastro/src/relastro_client.c
===================================================================
--- trunk/Ohana/src/relastro/src/relastro_client.c	(revision 39579)
+++ trunk/Ohana/src/relastro/src/relastro_client.c	(revision 39580)
@@ -92,6 +92,6 @@
       UpdateObjectOffsets (skylist, HOST_ID, HOSTDIR);
       
+      freeImages (db.ftable.buffer);
       gfits_db_free (&db);
-      freeImages();
       freeMosaics ();
 
@@ -119,6 +119,6 @@
       RepairWarps (skylist, HOST_ID, HOSTDIR);
       
+      freeImages (db.ftable.buffer);
       gfits_db_free (&db);
-      freeImages();
       freeMosaics ();
 
Index: trunk/Ohana/src/relastro/src/relastro_images.c
===================================================================
--- trunk/Ohana/src/relastro/src/relastro_images.c	(revision 39579)
+++ trunk/Ohana/src/relastro/src/relastro_images.c	(revision 39580)
@@ -137,6 +137,6 @@
     }
     dvo_image_unlock (&db); 
+    freeImages (db.ftable.buffer);
     gfits_db_free (&db);
-    freeImages();
   }
 
@@ -166,6 +166,6 @@
     }
     dvo_image_unlock (&db); 
+    freeImages(db.ftable.buffer);
     gfits_db_free (&db);
-    freeImages();
   }
 
Index: trunk/Ohana/src/relastro/src/relastro_parallel_images.c
===================================================================
--- trunk/Ohana/src/relastro/src/relastro_parallel_images.c	(revision 39579)
+++ trunk/Ohana/src/relastro/src/relastro_parallel_images.c	(revision 39580)
@@ -197,5 +197,5 @@
   freeStarMaps();
 
-  freeImages();
+  freeImages((char *) image);
   free (image);
 
Index: trunk/Ohana/src/relastro/src/relastro_parallel_regions.c
===================================================================
--- trunk/Ohana/src/relastro/src/relastro_parallel_regions.c	(revision 39579)
+++ trunk/Ohana/src/relastro/src/relastro_parallel_regions.c	(revision 39580)
@@ -87,6 +87,6 @@
   MARKTIME ("finished relastro -parallel-regions: %f sec total\n", dtime);
   
+  freeImages(db.ftable.buffer);
   gfits_db_free (&db);
-  freeImages();
   freeMosaics ();
 
