Index: trunk/Ohana/src/opihi/cmd.astro/astrom_ops.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/astrom_ops.c	(revision 39227)
+++ trunk/Ohana/src/opihi/cmd.astro/astrom_ops.c	(revision 39228)
@@ -45,9 +45,9 @@
 
   data->Npts = N;
-  ALLOCATE (data->X, double, N);
-  ALLOCATE (data->Y, double, N);
+  ALLOCATE (data->X,  double, N);
+  ALLOCATE (data->Y,  double, N);
   ALLOCATE (data->dX, double, N);
   ALLOCATE (data->dY, double, N);
-  ALLOCATE (data->t, double, N);
+  ALLOCATE (data->t,  double, N);
   ALLOCATE (data->pX, double, N);
   ALLOCATE (data->pY, double, N);
Index: trunk/Ohana/src/opihi/cmd.astro/fitplx_irls.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/fitplx_irls.c	(revision 39227)
+++ trunk/Ohana/src/opihi/cmd.astro/fitplx_irls.c	(revision 39228)
@@ -340,6 +340,5 @@
   
   // Solve OLS equation
-  if (!Plx_weighted_LS(T,pR,pD,X,Wx,Y,Wy,Npts,
-		       A,B,VERBOSE)) {
+  if (!weighted_LS_PLX(T,pR,pD,X,Wx,Y,Wy,Npts,A,B,VERBOSE)) {
     // Handle fail cases gracefully.
     return(FALSE);
@@ -386,11 +385,10 @@
     // Assign W
     for (i = 0; i < Npts; i++) {
-      Wx[i] = Plx_weight_cauchy(rx[i] / dX[i]);
-      Wy[i] = Plx_weight_cauchy(ry[i] / dY[i]);
+      Wx[i] = weight_cauchy(rx[i] / dX[i]);
+      Wy[i] = weight_cauchy(ry[i] / dY[i]);
     }
 
     // Solve
-    if (!Plx_weighted_LS(T,pD,pR,X,Wx,Y,Wy,Npts,
-			 A,B,VERBOSE)) {
+    if (!weighted_LS_PLX(T,pD,pR,X,Wx,Y,Wy,Npts,A,B,VERBOSE)) {
       // Handle fail case
       return(FALSE);
@@ -410,5 +408,5 @@
 
     // Calculate sigma_hat from distribution of residual magnitudes
-    sigma_hat = Plx_MAD(u,Npts) / 0.6745;
+    sigma_hat = MedianAbsDeviation(u,Npts) / 0.6745;
 
     // Check convergence
@@ -442,9 +440,9 @@
   lambda = 0.0;
   for (i = 0; i < Npts; i++) {
-    Wx[i] = Plx_weight_cauchy(rx[i] / dX[i]);
-    Wy[i] = Plx_weight_cauchy(ry[i] / dY[i]);
-
-    ax += Plx_dpsi_cauchy(rx[i] / dX[i]);
-    ay += Plx_dpsi_cauchy(ry[i] / dY[i]);
+    Wx[i] = weight_cauchy(rx[i] / dX[i]);
+    Wy[i] = weight_cauchy(ry[i] / dY[i]);
+
+    ax += dpsi_cauchy(rx[i] / dX[i]);
+    ay += dpsi_cauchy(ry[i] / dY[i]);
 
     bx += SQ(Wx[i]);
@@ -526,52 +524,5 @@
 }
 
-double Plx_weight_cauchy (double x) {
-  double r = x / 2.385;
-  return (1.0 / (1.0 + SQ(r)));
-}
-
-// dpsi = (d/dx) (x * weight(x))
-double Plx_dpsi_cauchy (double x) {
-  double r2 = SQ(x / 2.385);
-  return ((1.0 - r2) / (SQ(1 + r2)));
-}
-
-
-// median absolute deviation
-// MAD = median(abs(x - median(x)))
-double Plx_MAD(double *in, int N) {
-  double *x;
-  double median = 0.0;
-  int i;
-
-  ALLOCATE(x,double,N);
-  for (i = 0; i < N; i++) {
-    x[i] = in[i];
-  }
-
-  dsort(x,N);
-
-  if (N % 2) {
-    median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
-  } else {
-    median = x[(int)(0.5*N)];
-  }
-
-  for (i = 0; i < N; i++ ) {
-    x[i] = fabs(x[i] - median);
-  }
-
-  dsort(x,N);
-
-  if (N % 2) {
-    median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
-  } else {
-    median = x[(int)(0.5*N)];
-  }
-
-  return(median);
-}
-
-int Plx_weighted_LS (double *T, double *pR, double *pD, double *X, double *WX, double *Y, double *WY, int Npts,
+int weighted_LS_PLX (double *T, double *pR, double *pD, double *X, double *WX, double *Y, double *WY, int Npts,
 		     double **A, double **B, int VERBOSE) {
 
Index: trunk/Ohana/src/opihi/cmd.astro/fitpm.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/fitpm.c	(revision 39227)
+++ trunk/Ohana/src/opihi/cmd.astro/fitpm.c	(revision 39228)
@@ -1,21 +1,3 @@
 # include "astro.h"
-# define J2000 51544.5       /* Modified Julian date at standard epoch J2000 */
-
-# define ESCAPE(MSG,...) {			\
-    gprint (GP_ERR, MSG, __VA_ARGS__);		\
-    return FALSE; }
-
-typedef struct {
-  double Ro, dRo;
-  double Do, dDo;
-
-  double uR, duR;
-  double uD, duD;
-
-  double chisq;
-  int Nfit;
-} PMFit;
-
-int FitPMonly (PMFit *fit, double *X, double *dX, double *Y, double *dY, double *T, int Npts, int VERBOSE);
 
 int fitpm (int argc, char **argv) {
@@ -122,5 +104,5 @@
   }
 
-  PMFit fit;
+  PlxFit fit;
   if (!FitPMonly (&fit, X, dX, Y, dY, t, n, VERBOSE)) {
     return FALSE;
@@ -158,5 +140,5 @@
 
 /* do we want an init function which does the alloc and a clear function to free? */
-int FitPMonly (PMFit *fit, double *X, double *dX, double *Y, double *dY, double *T, int Npts, int VERBOSE) {
+int FitPMonly (PlxFit *fit, double *X, double *dX, double *Y, double *dY, double *T, int Npts, int VERBOSE) {
 
   int i;
@@ -241,4 +223,7 @@
   fit[0].duD = sqrt(A[3][3]);
   
+  fit[0].p   = 0.0;
+  fit[0].dp  = NAN;
+
   // add up the chi square for the fit
   chisq = 0.0;
Index: trunk/Ohana/src/opihi/cmd.astro/fitpm_irls.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/fitpm_irls.c	(revision 39227)
+++ trunk/Ohana/src/opihi/cmd.astro/fitpm_irls.c	(revision 39228)
@@ -1,28 +1,3 @@
 # include "astro.h"
-# define J2000 51544.5       /* Modified Julian date at standard epoch J2000 */
-
-# define ESCAPE(MSG,...) {			\
-    gprint (GP_ERR, MSG, __VA_ARGS__);		\
-    return FALSE; }
-
-typedef struct {
-  double Ro, dRo;
-  double Do, dDo;
-
-  double uR, duR;
-  double uD, duD;
-  
-  double chisq;
-  int Nfit;
-} PMFit_IRLS;
-
-int FitPMonly_IRLS (PMFit_IRLS *fit, double *X, double *dX, double *Y, double *dY, double *T, int Npts, int VERBOSE);
-int IRLS_converged (PMFit_IRLS *fit);
-int weighted_LS (double *T, double *X, double *WX, double *Y, double *WY, int Npts,
-		 double **A, double **B, int VERBOSE);
-double weight_cauchy (double x);
-double dpsi_cauchy (double x);
-double MAD(double *in, int N);
-      
 
 int fitpm_irls (int argc, char **argv) {
@@ -129,5 +104,5 @@
   }
 
-  PMFit_IRLS fit;
+  PlxFit fit;
   if (!FitPMonly_IRLS (&fit, X, dX, Y, dY, t, n, VERBOSE)) {
     return FALSE;
@@ -165,5 +140,5 @@
 
 /* do we want an init function which does the alloc and a clear function to free? */
-int FitPMonly_IRLS (PMFit_IRLS *fit, double *X, double *dX, double *Y, double *dY, double *T, int Npts, int VERBOSE) {
+int FitPMonly_IRLS (PlxFit *fit, double *X, double *dX, double *Y, double *dY, double *T, int Npts, int VERBOSE) {
 
   int i,j;
@@ -222,5 +197,5 @@
   
   // Solve OLS equation  
-  if (!weighted_LS(T,X,Wx,Y,Wy,Npts,
+  if (!weighted_LS_PM(T,X,Wx,Y,Wy,Npts,
 		   A,B,VERBOSE)) {
     // Handle fail case
@@ -267,5 +242,5 @@
 
     // Solve
-    if (!weighted_LS(T,X,Wx,Y,Wy,Npts,
+    if (!weighted_LS_PM(T,X,Wx,Y,Wy,Npts,
 		     A,B,VERBOSE)) {
       // Handle fail case
@@ -284,5 +259,5 @@
       u[i] = sqrt(SQ(rx[i] / dX[i]) + SQ(ry[i] / dY[i]));
     }
-    sigma_hat = MAD(u,Npts) / 0.6745;
+    sigma_hat = MedianAbsDeviation(u,Npts) / 0.6745;
     
     // Check convergence
@@ -389,56 +364,5 @@
 }
 
-
-double weight_cauchy (double x) {
-  double r = x / 2.385;
-  return (1.0 / (1.0 + SQ(r)));
-}
-
-// dpsi = (d/dx) (x * weight(x))
-double dpsi_cauchy (double x) {
-  double r2 = SQ(x / 2.385);
-  return ((1.0 - r2) / (SQ(1 + r2)));
-}
-
-
-// median absolute deviation
-// MAD = median(abs(x - median(x)))
-double MAD(double *in, int N) {
-  double *x;
-  double median = 0.0;
-  int i;
-  
-  ALLOCATE(x,double,N);
-  for (i = 0; i < N; i++) {
-    x[i] = in[i];
-  }
-
-  dsort(x,N);
-
-  if (N % 2) {
-    median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
-  } else {
-    median = x[(int)(0.5*N)];
-  }
-
-  for (i = 0; i < N; i++ ) {
-    x[i] = fabs(x[i] - median);
-  }
-
-  dsort(x,N);
-
-  if (N % 2) {
-    median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
-  } else {
-    median = x[(int)(0.5*N)];
-  }
-
-  return(median);
-}
-    
-  
-  
-int weighted_LS (double *T, double *X, double *WX, double *Y, double *WY, int Npts,
-		 double **A, double **B, int VERBOSE) {
+int weighted_LS_PM (double *T, double *X, double *WX, double *Y, double *WY, int Npts, double **A, double **B, int VERBOSE) {
 
   int i,j;
@@ -499,2 +423,50 @@
   return TRUE;
 }
+
+double weight_cauchy (double x) {
+  double r = x / 2.385;
+  return (1.0 / (1.0 + SQ(r)));
+}
+
+// dpsi = (d/dx) (x * weight(x))
+double dpsi_cauchy (double x) {
+  double r2 = SQ(x / 2.385);
+  return ((1.0 - r2) / (SQ(1 + r2)));
+}
+
+
+// median absolute deviation
+// MAD = median(abs(x - median(x)))
+double MedianAbsDeviation(double *in, int N) {
+  double *x;
+  double median = 0.0;
+  int i;
+  
+  ALLOCATE(x,double,N);
+  for (i = 0; i < N; i++) {
+    x[i] = in[i];
+  }
+
+  dsort(x,N);
+
+  if (N % 2) {
+    median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
+  } else {
+    median = x[(int)(0.5*N)];
+  }
+
+  for (i = 0; i < N; i++ ) {
+    x[i] = fabs(x[i] - median);
+  }
+
+  dsort(x,N);
+
+  if (N % 2) {
+    median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
+  } else {
+    median = x[(int)(0.5*N)];
+  }
+
+  return(median);
+}
+  
