Index: /trunk/Ohana/src/dvomerge/src/build_links.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/build_links.c	(revision 39142)
+++ /trunk/Ohana/src/dvomerge/src/build_links.c	(revision 39143)
@@ -36,6 +36,10 @@
 
   ALLOCATE (next_meas, off_t, Nmeasure);
-  for (i = 0; i < Naverage; i++, N++) {
+  for (i = 0; i < Naverage; i++) {
+    if (!average[i].Nmeasure) continue;
+    off_t m = average[i].measureOffset;
+    myAssert (measure[m].averef == i, "not sorted");
     for (j = 0; j < average[i].Nmeasure - 1; j++, N++) {
+      myAssert (measure[m+j+1].averef == i, "not sorted");
       next_meas[N] = N + 1;
       if (N >= Nmeasure) {
@@ -52,4 +56,5 @@
       abort ();
     }
+    N++;
   }
   return (next_meas);
@@ -124,5 +129,6 @@
   }
 
-  if (m == -1) {
+  // if Nmeasure is 0, m may have been mis-set; add to the end
+  if ((average[0].Nmeasure == 0) || (m == -1)) {
     average[0].measureOffset = Nmeasure;
   } else {
@@ -138,20 +144,26 @@
 Measure *sort_measure (Average *average, off_t Naverage, Measure *measure, off_t Nmeasure, off_t *next_meas) {
 
-  off_t i, k, n, N;
+  off_t i, k, n, np, N;
   Measure *tmpmeasure;
 
   /* fix order of Measure (memory intensive, but fast) */
+  np = -1; // previous entry in case of errors
   N = 0; 
   ALLOCATE (tmpmeasure, Measure, Nmeasure);
   for (i = 0; i < Naverage; i++) {
+    if (!average[i].Nmeasure) continue;
     n = average[i].measureOffset;
     average[i].measureOffset = N;
     int myObjID = average[i].objID;
     for (k = 0; k < average[i].Nmeasure; k++, N++) {
-      if (n == -1) abort();
+      if (n == -1) {
+	fprintf (stderr, "entry after %d has a problem\n", (int) np);
+	abort();
+      }
       tmpmeasure[N] = measure[n]; 
       myAssert (measure[n].averef == i, "error in averef?");
       myAssert (measure[n].objID == myObjID, "error in objID?");
       tmpmeasure[N].averef = i;
+      np = n;
       n = next_meas[n];
     }
@@ -354,12 +366,4 @@
   Lensing *tmplensing;
 
-  /*
-  for (i = 0; i < Naverage; i++) {
-    if (average[i].Nlensing != 4) {
-      fprintf (stderr, "check %d %d %d\n", (int) i, (int) average[i].Nlensing, (int) average[i].lensingOffset);
-    }
-  }
-  */
-
   /* fix order of Lensing (memory intensive, but fast) */
   np = -1;
@@ -370,4 +374,5 @@
     n = average[i].lensingOffset;
     average[i].lensingOffset = N;
+    int myObjID = average[i].objID;
     for (k = 0; k < average[i].Nlensing; k++, N++) {
       if (n == -1) {
@@ -376,5 +381,6 @@
       }
       tmplensing[N] = lensing[n]; 
-      if (lensing[n].averef != i) abort();
+      myAssert (lensing[n].averef == i, "error in averef");
+      myAssert (lensing[n].objID == myObjID, "error in objID?");
       tmplensing[N].averef = i;
       np = n;
@@ -400,5 +406,8 @@
   for (i = 0; i < Naverage; i++) {
     if (!average[i].Nstarpar) continue;
+    off_t m = average[i].starparOffset;
+    myAssert (starpar[m].averef == i, "not sorted");
     for (j = 0; j < average[i].Nstarpar - 1; j++, N++) {
+      myAssert (starpar[m+j+1].averef == i, "not sorted");
       next_star[N] = N + 1;
       if (N >= Nstarpar) {
@@ -488,5 +497,6 @@
   }
 
-  if (m == -1) {
+  // if Nmeasure is 0, m may have been mis-set; add to the end
+  if ((average[0].Nstarpar == 0) || (m == -1)) {
     average[0].starparOffset = Nstarpar;
   } else {
@@ -505,14 +515,6 @@
   StarPar *tmpstarpar;
 
-  /*
-  for (i = 0; i < Naverage; i++) {
-    if (average[i].Nstarpar != 4) {
-      fprintf (stderr, "check %d %d %d\n", (int) i, (int) average[i].Nstarpar, (int) average[i].starparOffset);
-    }
-  }
-  */
-
   /* fix order of StarPar (memory intensive, but fast) */
-  np = -1;
+  np = -1; // previous entry in case of errors
   N = 0; 
   ALLOCATE (tmpstarpar, StarPar, Nstarpar);
@@ -521,4 +523,5 @@
     n = average[i].starparOffset;
     average[i].starparOffset = N;
+    int myObjID = average[i].objID;
     for (k = 0; k < average[i].Nstarpar; k++, N++) {
       if (n == -1) {
@@ -527,5 +530,6 @@
       }
       tmpstarpar[N] = starpar[n]; 
-      if (starpar[n].averef != i) abort();
+      myAssert (starpar[n].averef == i, "error in averef?");
+      myAssert (starpar[n].objID == myObjID, "error in objID?");
       tmpstarpar[N].averef = i;
       np = n;
@@ -660,12 +664,4 @@
   GalPhot *tmpgalphot;
 
-  /*
-  for (i = 0; i < Naverage; i++) {
-    if (average[i].Ngalphot != 4) {
-      fprintf (stderr, "check %d %d %d\n", (int) i, (int) average[i].Ngalphot, (int) average[i].galphotOffset);
-    }
-  }
-  */
-
   /* fix order of GalPhot (memory intensive, but fast) */
   np = -1;
@@ -676,4 +672,5 @@
     n = average[i].galphotOffset;
     average[i].galphotOffset = N;
+    int myObjID = average[i].objID;
     for (k = 0; k < average[i].Ngalphot; k++, N++) {
       if (n == -1) {
@@ -682,5 +679,6 @@
       }
       tmpgalphot[N] = galphot[n]; 
-      if (galphot[n].averef != i) abort();
+      myAssert (galphot[n].averef == i, "error in averef?");
+      myAssert (galphot[n].objID == myObjID, "error in objID?");
       tmpgalphot[N].averef = i;
       np = n;
