Index: trunk/Ohana/src/dvolens/Makefile
===================================================================
--- trunk/Ohana/src/dvolens/Makefile	(revision 39488)
+++ trunk/Ohana/src/dvolens/Makefile	(revision 39489)
@@ -33,4 +33,5 @@
 $(SRC)/initialize.$(ARCH).o	 \
 $(SRC)/myIndex.$(ARCH).o	 \
+$(SRC)/mySequence.$(ARCH).o	 \
 $(SRC)/update_objects.$(ARCH).o	 \
 $(SRC)/update_objects_catalog.$(ARCH).o	 \
@@ -52,4 +53,5 @@
 $(SRC)/initialize.$(ARCH).o	 \
 $(SRC)/myIndex.$(ARCH).o	 \
+$(SRC)/mySequence.$(ARCH).o	 \
 $(SRC)/update_objects.$(ARCH).o	 \
 $(SRC)/update_objects_catalog.$(ARCH).o	 \
Index: trunk/Ohana/src/dvolens/include/dvolens.h
===================================================================
--- trunk/Ohana/src/dvolens/include/dvolens.h	(revision 39488)
+++ trunk/Ohana/src/dvolens/include/dvolens.h	(revision 39489)
@@ -16,4 +16,14 @@
   int NINDEX;
 } myIndexType;
+
+// a structure to define a sequence lookup
+typedef struct {
+  int minID;
+  int maxID;
+  int *value;
+  int *sequence;
+  int Nsequence;
+  int NSEQUENCE;
+} mySequenceType;
 
 typedef enum {
@@ -87,5 +97,5 @@
 
 int FindWarpGroups (void);
-int RecoverLensingIndex (Average *average, myIndexType *measureIndex, Lensing *lensing);
+int RecoverLensingIndex (Average *average, mySequenceType *measureSeq, Lensing *lensing);
 void FreeWarpGroups (void);
 
@@ -99,2 +109,8 @@
 off_t getImageByID (off_t ID);
 
+mySequenceType *mySequenceAlloc ();
+int mySequenceFree (mySequenceType *mySequence);
+int mySequenceSetSize (mySequenceType *mySequence, int Nmax);
+int mySequenceSetValue (mySequenceType *mySequence, int value, int entry);
+int mySequenceSort (mySequenceType *mySequence);
+int mySequenceGetEntry (mySequenceType *mySequence, int value);
Index: trunk/Ohana/src/dvolens/src/WarpImageMaps.c
===================================================================
--- trunk/Ohana/src/dvolens/src/WarpImageMaps.c	(revision 39488)
+++ trunk/Ohana/src/dvolens/src/WarpImageMaps.c	(revision 39489)
@@ -204,5 +204,5 @@
 }
 
-int RecoverLensingIndex (Average *average, myIndexType *measureIndex, Lensing *lensing) {
+int RecoverLensingIndex (Average *average, mySequenceType *measureSeq, Lensing *lensing) {
 
   // Although the imageID is wrong (no matching measures), the image should be one of the
@@ -240,5 +240,5 @@
     int N = warpgroup[seq].warps[i];
 
-    int Mj = myIndexGetEntry (measureIndex, image[N].imageID);
+    int Mj = mySequenceGetEntry (measureSeq, image[N].imageID);
     if (Mj < 0) continue;
 
@@ -258,9 +258,9 @@
   for (int i = 0; i < Nwarpgroup; i++) {
     free (warpgroup[i].warps);
-    // free (warpgroup[i].Rmin);
-    // free (warpgroup[i].Rmax);
-    // free (warpgroup[i].Dmin);
-    // free (warpgroup[i].Dmax);
-    // free (warpgroup[i].onBoundary);
+    free (warpgroup[i].Rmin);
+    free (warpgroup[i].Rmax);
+    free (warpgroup[i].Dmin);
+    free (warpgroup[i].Dmax);
+    free (warpgroup[i].onBoundary);
   }    
 
Index: trunk/Ohana/src/dvolens/src/myIndex.c
===================================================================
--- trunk/Ohana/src/dvolens/src/myIndex.c	(revision 39488)
+++ trunk/Ohana/src/dvolens/src/myIndex.c	(revision 39489)
@@ -18,4 +18,5 @@
 int myIndexFree (myIndexType *myIndex) {
 
+  if (!myIndex) return TRUE;
   free (myIndex->index);
   free (myIndex);
Index: trunk/Ohana/src/dvolens/src/mySequence.c
===================================================================
--- trunk/Ohana/src/dvolens/src/mySequence.c	(revision 39489)
+++ trunk/Ohana/src/dvolens/src/mySequence.c	(revision 39489)
@@ -0,0 +1,78 @@
+# include "dvolens.h"
+
+mySequenceType *mySequenceAlloc () {
+
+  mySequenceType *mySequence;
+  ALLOCATE (mySequence, mySequenceType, 1);
+  ALLOCATE (mySequence->value,    int, 1);
+  ALLOCATE (mySequence->sequence, int, 1);
+
+  // an uninit'ed index is invalid
+  mySequence->Nsequence = 0;
+  mySequence->NSEQUENCE = 1;
+
+  return mySequence;
+}
+
+int mySequenceFree (mySequenceType *mySequence) {
+
+  free (mySequence->value);
+  free (mySequence->sequence);
+  free (mySequence);
+  return TRUE;
+}
+
+// set minID and maxID externally
+int mySequenceSetSize (mySequenceType *mySequence, int Nmax) {
+
+  mySequence->Nsequence = Nmax;
+  if (mySequence->Nsequence > mySequence->NSEQUENCE) {
+    mySequence->NSEQUENCE = mySequence->Nsequence;
+    REALLOCATE (mySequence->value,    int, mySequence->NSEQUENCE);
+    REALLOCATE (mySequence->sequence, int, mySequence->NSEQUENCE);
+  }
+  return TRUE;
+}
+
+int mySequenceSetValue (mySequenceType *mySequence, int value, int entry) {
+
+  mySequence->value[entry] = value;
+  mySequence->sequence[entry] = entry;
+  return TRUE;
+}
+
+int mySequenceSort (mySequenceType *mySequence) {
+
+  isortpair (mySequence->value, mySequence->sequence, mySequence->Nsequence);
+  return TRUE;
+}
+
+// find the entry by bisection:
+int mySequenceGetEntry (mySequenceType *mySequence, int value) {
+
+  int Nlo = 0; 
+  int Nhi = mySequence->Nsequence - 1;
+
+  if (value < mySequence->value[Nlo]) return -1;
+  if (value > mySequence->value[Nhi]) return -1;
+
+  int N;
+  while (Nhi - Nlo > 4) {
+    N = 0.5*(Nlo + Nhi);
+    if (mySequence->value[N] < value) {
+      Nlo = MAX(N, 0);
+    } else {
+      Nhi = MIN(N + 1, mySequence->Nsequence - 1);
+    }
+  }
+  // mySequence->value[Nlo] <  value 
+  // mySequence->value[Nhi] >= value
+
+  for (N = Nlo; N <= Nhi; N++) {
+    if (mySequence->value[N] == value) {
+      return mySequence->sequence[N];
+    }
+  }
+  return -1;
+}
+
Index: trunk/Ohana/src/dvolens/src/select_images.c
===================================================================
--- trunk/Ohana/src/dvolens/src/select_images.c	(revision 39488)
+++ trunk/Ohana/src/dvolens/src/select_images.c	(revision 39489)
@@ -44,5 +44,5 @@
   
   // I need to ensure we get the images from any skycells in a warp
-  double dD = 2.0;
+  double dD = 4.0;
   double dR = dD / cos(RAD_DEG*DminSkyRegion);
   RminSkyRegion -= dR;
Index: trunk/Ohana/src/dvolens/src/update_objects_catalog.c
===================================================================
--- trunk/Ohana/src/dvolens/src/update_objects_catalog.c	(revision 39488)
+++ trunk/Ohana/src/dvolens/src/update_objects_catalog.c	(revision 39489)
@@ -35,5 +35,5 @@
   int Nlensobj = 0;
 
-  myIndexType *measureIndex = myIndexAlloc();
+  mySequenceType *measureSeq = mySequenceAlloc();
 
   int Nfixed = 0;
@@ -41,5 +41,4 @@
 
   INITTIME;
-
   double time1 = 0.0;
   double time2 = 0.0;
@@ -49,13 +48,4 @@
   for (i = 0; i < catalog->Naverage; i++) {
     
-    if (i % 1000 == 0) {
-      MARKTIME ("done with %d aves: %f sec (%f %f %f %f)\n", (int) i, dtime, time1, time2, time3, time4);
-      time1 = 0.0;
-      time2 = 0.0;
-      time3 = 0.0;
-      time4 = 0.0;
-      gettimeofday (&startTimer, NULL);
-    }
-
     Average *average = &catalog->average[i];
     if (average->Nlensing == 0) continue;
@@ -82,20 +72,16 @@
     // I could make an index measureSeq[imageID-imageIDmin]
     
-    myIndexInit (measureIndex);
+    TIMESTAMP (time1);
+
+    mySequenceSetSize (measureSeq, average->Nmeasure);
 
     // generate an index for these measure entries (based on Mj and imageID)
     for (Mj = 0; Mj < average->Nmeasure; Mj++) {
-      myIndexUpdateLimits (measureIndex, catalog->measure[Moff + Mj].imageID);
+      mySequenceSetValue (measureSeq, catalog->measure[Moff + Mj].imageID, Mj);
     }
 
-    TIMESTAMP (time1);
-    myIndexSetRange (measureIndex);
+    mySequenceSort (measureSeq);
+
     TIMESTAMP (time2);
-
-    for (Mj = 0; Mj < average->Nmeasure; Mj++) {
-      // if there are duplicates (multiple measures from the same image), 
-      // myIndexSetEntry will only select one
-      myIndexSetEntry (measureIndex, catalog->measure[Moff + Mj].imageID, Mj);
-    }
 
     // loop over the lensing measurements.  for each one, I need to find the corresponding measurement (make an index in lensing?)
@@ -112,5 +98,5 @@
       // XX ALT myAssert (measure->imageID == lensing->imageID, "oops, deux");
 
-      Mj = myIndexGetEntry (measureIndex, lensing->imageID);
+      Mj = mySequenceGetEntry (measureSeq, lensing->imageID);
 
       // if we are unable to find a match in the measure table, we may have the wrong 
@@ -121,6 +107,7 @@
       if (Mj < 0) {
 	if (REPAIR_LENSING_IDS) {
-	  Mj = RecoverLensingIndex (average, measureIndex, lensing);
+	  Mj = RecoverLensingIndex (average, measureSeq, lensing);
 	  if (Mj == -1) {
+	    fprintf (stderr, "failed %f %f : %d\n", average->R, average->D, lensing->imageID);
 	    Nfailed ++;
 	    continue;
@@ -331,5 +318,7 @@
   free (N7);
 
-  myIndexFree (measureIndex);
+  mySequenceFree (measureSeq);
+
+  fprintf (stderr, "done with %d aves (%f %f %f %f)\n", (int) catalog->Naverage, time1, time2, time3, time4);
 
   fprintf (stderr, "corrected %d lensing IDs, failed on %d lensing IDs\n", Nfixed, Nfailed);
