Index: trunk/Ohana/src/opihi/dvo/mextract.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/mextract.c	(revision 39457)
+++ trunk/Ohana/src/opihi/dvo/mextract.c	(revision 39569)
@@ -216,4 +216,11 @@
   int needStarpar = dbFieldNeedStarpar (fields, Nfields, FALSE);
 
+  // the lensing table does not have a good index to/from the measure table.  if we need lensing
+  // parameters, we need to generate a lookup table to avoid excess iterations
+  mySequenceType *lensingSeq = NULL;
+  if (needLensing) {
+    lensingSeq = mySequenceAlloc();
+  }
+
   // grab data from all selected sky regions
   struct sigaction *old_sigaction = SetInterrupt();
@@ -249,5 +256,7 @@
 
     for (j = 0; (j < catalog.Naverage) && !interrupt; j++) {
-      m = catalog.average[j].measureOffset;
+      Average *average = &catalog.average[j];
+
+      m = average->measureOffset;
       if (m > catalog.Nmeasure) {
 	gprint (GP_ERR, "ERROR: inconsistent average->measure offset.  Unsorted database?\n");
@@ -257,5 +266,19 @@
       dbExtractMeasuresInitAve (); // reset counters for saved fields (costs very little)
 
-      for (k = 0; (k < catalog.average[j].Nmeasure); k++, m++) {
+      off_t Lj;
+      off_t Loff = average->lensingOffset;
+
+      if (needLensing) {
+	mySequenceSetSize (lensingSeq, average->Nlensing);
+	
+	// generate an index for these lensing entries (based on Lj and imageID)
+	for (Lj = 0; Lj < average->Nlensing; Lj++) {
+	  mySequenceSetValue (lensingSeq, catalog.lensing[Loff + Lj].imageID, Lj);
+	}
+	
+	mySequenceSort (lensingSeq);
+      }
+
+      for (k = 0; (k < average->Nmeasure); k++, m++) {
 	if (catalog.measure[m].averef != j) {
 	  gprint (GP_ERR, "ERROR: inconsistent measure->average link.  Unsorted database?\n");
@@ -266,11 +289,14 @@
 	dbExtractMeasuresInitMeas (); // reset counters for saved fields  (costs very little
 
-	Average *average = &catalog.average[j];
-
 	int Nstarpar = average->starparOffset;
-	StarPar *starpar = needStarpar ? &catalog.starpar[Nstarpar] : NULL;
-
-	int Nlensing = average->lensingOffset;
-	Lensing *lensing = needLensing ? &catalog.lensing[Nlensing] : NULL;
+	StarPar *starpar = needStarpar && average->Nstarpar ? &catalog.starpar[Nstarpar] : NULL;
+
+	Lensing *lensing = NULL;
+
+	// a gpc1 analysis specific choice: only look for lensing if photcode is a warp one
+	if (needLensing && average->Nlensing && (catalog.measure[m].photcode >= 12000) && (catalog.measure[m].photcode <= 12500)) {
+	  Lj = mySequenceGetEntry (lensingSeq, catalog.measure[m].imageID);
+	  if (Lj >= 0) lensing = &catalog.lensing[Loff + Lj];
+	}
 
 	int Nsec = j*Nsecfilt;
