Index: /branches/eam_branches/ipp-20111122/Ohana/src/opihi/cmd.astro/spex1dgas.c
===================================================================
--- /branches/eam_branches/ipp-20111122/Ohana/src/opihi/cmd.astro/spex1dgas.c	(revision 32968)
+++ /branches/eam_branches/ipp-20111122/Ohana/src/opihi/cmd.astro/spex1dgas.c	(revision 32969)
@@ -84,8 +84,4 @@
 
     if (isnan(Dtgt) || isnan(dX) || isnan(Dcur) || isnan(dF) || isnan(dPdXi)) abort();
-
-    if (i >= nCloseMax) {
-      fprintf (stderr, "Dcur,Dtgt : %f %f : dX,dF : %f : %f\n", Dcur, Dtgt, dX, dF);
-    }
     dPdX += dPdXi;
   }
@@ -106,4 +102,6 @@
   int i, j, iter;
   Vector *index1, *index2, *distance;
+  float *XoList;
+  int *IDList, *MidObj;
 
   { 
@@ -215,4 +213,5 @@
   // coordinate
   
+  // need to get pretty close to a good starting point.  start with a guess using the first entry & its extremum
   int idx1 = 0;
   int idx2 = object[idx1].index[object[idx1].Nindex-1];
@@ -245,4 +244,79 @@
   }
 
+  if (Niter >= -1) {
+    // now choose several in the middle of the range, and find the mean distance for each relative to that group
+    ALLOCATE (XoList, float, Nobject);
+    ALLOCATE (IDList, int, Nobject);
+    for (i = 0; i < Nobject; i++) {
+      XoList[i] = object[i].Xo;
+      IDList[i] = i;
+    }
+    sortfriends (XoList, IDList, Nobject);
+    float XoMid = XoList[(int)(Nobject/2)];
+
+# define NMID 5
+    ALLOCATE (MidObj, int, NMID);
+    MidObj[0] = IDList[(int)(Nobject/2) + 0];
+    MidObj[1] = IDList[(int)(Nobject/2) + 1];
+    MidObj[2] = IDList[(int)(Nobject/2) - 1];
+    MidObj[3] = IDList[(int)(Nobject/2) + 2];
+    MidObj[4] = IDList[(int)(Nobject/2) - 2];
+
+    for (i = 0; i < Nobject; i++) {
+      for (j = 0; j < NMID; j++) {
+	if (MidObj[j] == i) goto skip_object;
+      }
+      float Dmean = 0.0;
+      for (j = 0; j < NMID; j++) {
+	Dmean += object[i].Dtgt[MidObj[j]]; // desired distance between object (i) and object in middle section
+      }
+      Dmean = Dmean / NMID;
+      if (object[i].Xo < XoMid) {
+	object[i].Xo = XoMid - Dmean;
+      } else {
+	object[i].Xo = XoMid + Dmean;
+      }
+    skip_object:
+      continue;
+    }
+  }
+
+  if (Niter >= 0) {
+    float XoMean = 0.0;
+    // now choose one end of the range, and find the mean distance for each relative to THAT group
+    for (i = 0; i < Nobject; i++) {
+      XoList[i] = object[i].Xo;
+      IDList[i] = i;
+      XoMean += object[i].Xo;
+    }
+    XoMean = XoMean / Nobject;
+    sortfriends (XoList, IDList, Nobject);
+    float XoMin = XoList[0];
+
+    MidObj[0] = IDList[0];
+    MidObj[1] = IDList[1];
+    MidObj[2] = IDList[2];
+    MidObj[3] = IDList[3];
+    MidObj[4] = IDList[4];
+
+    for (i = 0; i < Nobject; i++) {
+      for (j = 0; j < NMID; j++) {
+	if (MidObj[j] == i) goto skip_object_p2;
+      }
+      float Dmean = 0.0;
+      for (j = 0; j < NMID; j++) {
+	Dmean += object[i].Dtgt[MidObj[j]]; // desired distance between object (i) and object in middle section
+      }
+      Dmean = Dmean / NMID;
+      if (object[i].Xo < XoMin) {
+	object[i].Xo = XoMin - Dmean;
+      } else {
+	object[i].Xo = XoMin + Dmean;
+      }
+    skip_object_p2:
+      continue;
+    }
+  }
+
   for (iter = 0; iter < Niter; iter ++) {
     fprintf (stderr, "iter %d\n", iter);
@@ -282,5 +356,5 @@
     }
     XoSum += object[i].Xo;
-    object[i].Yo = (dY2sum > 0.0) ? sqrt(dY2sum / Npts) : -sqrt(dY2sum / Npts);
+    object[i].Yo = (dY2sum > 0.0) ? sqrt(fabs(dY2sum / Npts)) : -sqrt(fabs(dY2sum / Npts));
   }
   float XoMean = XoSum / Nobject;
