Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/include/relastro.h
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/include/relastro.h	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/include/relastro.h	(revision 37606)
@@ -181,4 +181,5 @@
 double MIN_ERROR;
 
+int    IMFIT_TOO_FEW; // need more than this number of stars to fit an image
 int    IMFIT_CLIP_NITER; // number of clipping iterations to perform in FitChip
 double IMFIT_CLIP_NSIGMA; // number of sigma to clip in FitChip
@@ -409,5 +410,5 @@
 void FitSimple (StarData *raw, StarData *ref, int Nmatch, Coords *coords);
 void initObjectData (Catalog *catalog, int Ncatalog);
-int UpdateObjects (Catalog *catalog, int Ncatalog);
+int UpdateObjects (Catalog *catalog, int Ncatalog, int Nloop);
 int UpdateSimple (Catalog *catalog, int Ncatalog);
 int UpdateChips (Catalog *catalog, int Ncatalog);
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/ConfigInit.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/ConfigInit.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/ConfigInit.c	(revision 37606)
@@ -25,4 +25,5 @@
   if (!ScanConfig (config, "RELASTRO_IMFIT_CLIP_NSIGMA",   "%lf", 0, &IMFIT_CLIP_NSIGMA))   IMFIT_CLIP_NSIGMA = 3.0;
   if (!ScanConfig (config, "RELASTRO_IMFIT_SYS_SIGMA_LIM", "%lf", 0, &IMFIT_SYS_SIGMA_LIM)) IMFIT_SYS_SIGMA_LIM = 0.01;
+  if (!ScanConfig (config, "RELASTRO_IMFIT_TOO_FEW",       "%d",  0, &IMFIT_TOO_FEW))       IMFIT_TOO_FEW = 5;
 
   if (!ScanConfig (config, "PM_DT_MIN",              "%lf", 0, &PM_DT_MIN))        PM_DT_MIN = 0.25;   
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/FitChip.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/FitChip.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/FitChip.c	(revision 37606)
@@ -55,4 +55,7 @@
     // residual vector field 
     // dx vs mag, dy vs mag
+    if (relastroGetVisual()) {
+      fprintf (stderr, "fitting chip %s, %d matched stars\n", image->name, Nmatch);
+    }
     relastroVisualPlotChipFit(raw, ref, dRmax, Nmatch);
 
@@ -74,5 +77,5 @@
     // XXX WATCH OUT HERE!!
     if (!CHIPMAP) order_use = MIN(order_use, 1);
-    fprintf (stderr, "using %d for %s\n", order_use, image[0].name);
+    if (VERBOSE2) fprintf (stderr, "using %d for %s\n", order_use, image[0].name);
 
     // when fitting the map, first fit a linear model (below? change Npolyterms to -1)
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/ImageOps.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/ImageOps.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/ImageOps.c	(revision 37606)
@@ -491,7 +491,6 @@
 
     int TESTPT = FALSE;
-
-    TESTPT |= CAT_ID_SRC && OBJ_ID_SRC && (measure->imageID == CAT_ID_SRC) && (measure->detID == OBJ_ID_SRC);
-    TESTPT |= CAT_ID_DST && OBJ_ID_DST && (measure->imageID == CAT_ID_DST) && (measure->detID == OBJ_ID_DST);
+    TESTPT |= CAT_ID_SRC && OBJ_ID_SRC && (measure->catID == CAT_ID_SRC) && (measure->objID == OBJ_ID_SRC);
+    TESTPT |= CAT_ID_DST && OBJ_ID_DST && (measure->catID == CAT_ID_DST) && (measure->objID == OBJ_ID_DST);
     if (TESTPT) {
       fprintf (stderr, "got test det\n");
@@ -736,4 +735,11 @@
 
     n = measure[0].averef;
+
+    int TESTPT = FALSE;
+    TESTPT |= CAT_ID_SRC && OBJ_ID_SRC && (catalog[c].average[n].catID == CAT_ID_SRC) && (catalog[c].average[n].objID == OBJ_ID_SRC);
+    TESTPT |= CAT_ID_DST && OBJ_ID_DST && (catalog[c].average[n].catID == CAT_ID_DST) && (catalog[c].average[n].objID == OBJ_ID_DST);
+    if (TESTPT) {
+      fprintf (stderr, "got test det\n");
+    }
 
     // an object with only one detection provides no information about the image calibration
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/UpdateChips.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/UpdateChips.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/UpdateChips.c	(revision 37606)
@@ -74,4 +74,10 @@
       Nskip ++;
       mode[i] = 0;
+      continue;
+    }
+    if (Nraw <= IMFIT_TOO_FEW) {
+      Nskip ++;
+      mode[i] = 0;
+      free (raw);
       continue;
     }
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/UpdateObjectOffsets.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/UpdateObjectOffsets.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/UpdateObjectOffsets.c	(revision 37606)
@@ -59,5 +59,5 @@
 
     // uses MeasureTiny values, but will also update Measure values when populated
-    UpdateObjects (&catalog, 1);
+    UpdateObjects (&catalog, 1, 0);
 
     free_tiny_values(&catalog);
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/UpdateObjects.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/UpdateObjects.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/UpdateObjects.c	(revision 37606)
@@ -2,5 +2,5 @@
 # define PAR_TOOFEW 5
 
-int UpdateObjects_Chips (Average *average, SecFilt *secfilt, MeasureTiny *measure, Measure *measureBig, int Nsecfilt, FitStats *fitStats, int i, off_t m);
+int UpdateObjects_Chips (Average *average, SecFilt *secfilt, MeasureTiny *measure, Measure *measureBig, int Nsecfilt, FitStats *fitStats, int i, off_t m, int Nloop);
 int UpdateObjects_Stack (Average *average, SecFilt *secfilt, MeasureTiny *measure, Measure *measureBig, int Nsecfilt, FitStats *fitStats);
 
@@ -99,5 +99,5 @@
 // This function operates on both Measure and MeasureTiny.  In the big stages, this should
 // be called with just MeasureTiny set and Measure == NULL
-int UpdateObjects (Catalog *catalog, int Ncatalog) {
+int UpdateObjects (Catalog *catalog, int Ncatalog, int Nloop) {
 
   initObjectData (catalog, Ncatalog);
@@ -130,5 +130,5 @@
 
       UpdateObjects_Stack(average, secfilt, measure, measureBig, Nsecfilt, &fitStatsStack);
-      UpdateObjects_Chips(average, secfilt, measure, measureBig, Nsecfilt, &fitStatsChips, i, m);
+      UpdateObjects_Chips(average, secfilt, measure, measureBig, Nsecfilt, &fitStatsChips, i, m, Nloop);
     }
     if (VERBOSE) fprintf (stderr, "catalog %d : chips "OFF_T_FMT" ave, "OFF_T_FMT" pm, "OFF_T_FMT" par : Nskip "OFF_T_FMT", Noffset "OFF_T_FMT"\n",  i,  fitStatsChips.Nave,  fitStatsChips.Npm,  fitStatsChips.Npar,  fitStatsChips.Nskip, fitStatsChips.Noffset);
@@ -146,5 +146,5 @@
 // This function operates on both Measure and MeasureTiny.  In the big stages, this should
 // be called with just MeasureTiny set and Measure == NULL
-int UpdateObjects_Chips (Average *average, SecFilt *secfilt, MeasureTiny *measure, Measure *measureBig, int Nsecfilt, FitStats *fitStats, int i, off_t m) {
+int UpdateObjects_Chips (Average *average, SecFilt *secfilt, MeasureTiny *measure, Measure *measureBig, int Nsecfilt, FitStats *fitStats, int i, off_t m, int Nloop) {
 
   int setRefColor = areImagesMatched();
@@ -209,5 +209,5 @@
     double Di = getMeanD (&measure[k], average, secfilt);
 
-    if (USE_GALAXY_MODEL) {
+    if (USE_GALAXY_MODEL && (Nloop > 0)) {
       Ri -= measure[k].RoffGAL / 3600.0;
       Di -= measure[k].DoffGAL / 3600.0;
@@ -470,11 +470,14 @@
       break;
   }
-  if (XVERB) fprintf (stderr, "%f %f -> %f %f (%f,%f) pm=(%f %f) plx=(%f +/- %f)\n",
-		      average[0].R, 
-		      average[0].D, 
-		      fit.Ro, fit.Do, 
-		      3600*(average[0].R - fit.Ro), 
-		      3600*(average[0].D - fit.Do),
-		      fit.uR, fit.uD, fit.p, fit.dp);
+  if (XVERB) {
+    fprintf (stderr, "%f %f -> %f %f (%f,%f) pm=(%f %f) plx=(%f +/- %f)\n",
+	     average[0].R, 
+	     average[0].D, 
+	     fit.Ro, fit.Do, 
+	     3600*(average[0].R - fit.Ro), 
+	     3600*(average[0].D - fit.Do),
+	     fit.uR, fit.uD, fit.p, fit.dp);
+    fprintf (stderr, "-----\n");
+  }
 
   // make sure that the fit succeeded
@@ -510,28 +513,4 @@
   }
 
-  average[0].R  	= fit.Ro; // RA in degrees
-  average[0].D  	= fit.Do; // DEC in degrees
-  average[0].dR 	= fit.dRo; // RA scatter in arcsec
-  average[0].dD 	= fit.dDo; // DEC scatter in arcsec
-
-  average[0].uR         = fit.uR; // RA proper motion in arcsec/year
-  average[0].uD         = fit.uD; // DEC proper motion in arcsec/year
-  average[0].duR        = fit.duR; // RA proper motion error in arcsec/year
-  average[0].duD        = fit.duD; // DEC proper motion error in arcsec/year
-
-  average[0].P          = fit.p; // parallax in arcsec
-  average[0].dP         = fit.dp; // parallax error in arcsec
-
-  average[0].ChiSqAve   = fitAve.chisq;
-  average[0].ChiSqPM    = fitPM.chisq;
-  average[0].ChiSqPar   = fitPAR.chisq;
-
-  average[0].Tmean      = (Tmean * 86400 * 365.25) + T2000;
-  average[0].Trange     = (Trange * 86400 * 365.25);
-  average[0].Npos       = fit.Nfit;
-
-  // unset the NO_ASTROM bit (not(NO_ASTROM) == HAVE_ASTROM)
-  average[0].flags &= ~ID_STAR_NO_ASTROM;
-
   if (XVERB) fprintf (stderr, "%f %f -> %f %f (%f,%f) pm=(%f %f) chisq=(%f, %f, %f)\n",
 		      average[0].R,
@@ -544,4 +523,28 @@
 		      fitAve.chisq, fitPM.chisq, fitPAR.chisq);
 
+  average[0].R  	= fit.Ro; // RA in degrees
+  average[0].D  	= fit.Do; // DEC in degrees
+  average[0].dR 	= fit.dRo; // RA scatter in arcsec
+  average[0].dD 	= fit.dDo; // DEC scatter in arcsec
+
+  average[0].uR         = fit.uR; // RA proper motion in arcsec/year
+  average[0].uD         = fit.uD; // DEC proper motion in arcsec/year
+  average[0].duR        = fit.duR; // RA proper motion error in arcsec/year
+  average[0].duD        = fit.duD; // DEC proper motion error in arcsec/year
+
+  average[0].P          = fit.p; // parallax in arcsec
+  average[0].dP         = fit.dp; // parallax error in arcsec
+
+  average[0].ChiSqAve   = fitAve.chisq;
+  average[0].ChiSqPM    = fitPM.chisq;
+  average[0].ChiSqPar   = fitPAR.chisq;
+
+  average[0].Tmean      = (Tmean * 86400 * 365.25) + T2000;
+  average[0].Trange     = (Trange * 86400 * 365.25);
+  average[0].Npos       = fit.Nfit;
+
+  // unset the NO_ASTROM bit (not(NO_ASTROM) == HAVE_ASTROM)
+  average[0].flags &= ~ID_STAR_NO_ASTROM;
+
   return (TRUE);
 }
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/high_speed_objects.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/high_speed_objects.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/high_speed_objects.c	(revision 37606)
@@ -266,5 +266,5 @@
 
   populate_tiny_values (&catalogOut, DVO_TV_MEASURE);
-  UpdateObjects (&catalogOut, 1);
+  UpdateObjects (&catalogOut, 1, 0);
   free_tiny_values(&catalogOut);
 
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/hpm_objects.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/hpm_objects.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/hpm_objects.c	(revision 37606)
@@ -252,5 +252,5 @@
     // distinguishing a bad fit from a fit with 1 or 2 bad points
     FIT_MODE = FIT_PM_ONLY;
-    UpdateObjects (&testcat, 1);
+    UpdateObjects (&testcat, 1, 0);
 
     free_tiny_values(&testcat);
@@ -282,5 +282,5 @@
 
   populate_tiny_values (&catalogOut, DVO_TV_MEASURE);
-  UpdateObjects (&catalogOut, 1);
+  UpdateObjects (&catalogOut, 1, 0);
   free_tiny_values(&catalogOut);
 
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastroVisual.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastroVisual.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastroVisual.c	(revision 37606)
@@ -24,4 +24,8 @@
 /** Spawn a kapa window */
 static int initWindow(int *kapid) {
+  if (NTHREADS) {
+    fprintf (stderr, "-visual and -threads are incompatible, quitting\n");
+    exit (2);
+  }
   if (*kapid == -1) {
     *kapid = KapaOpenNamedSocket("kapa", "relastro_plots");
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastro_images.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastro_images.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastro_images.c	(revision 37606)
@@ -65,5 +65,5 @@
     case TARGET_SIMPLE:
       for (i = 0; i < NLOOP; i++) {
-	UpdateObjects (catalog, Ncatalog);
+	UpdateObjects (catalog, Ncatalog, i);
 	UpdateSimple (catalog, Ncatalog);
       }
@@ -73,6 +73,6 @@
       for (i = 0; i < NLOOP; i++) {
 	// XXX is is really possible that I do not update the measure.R,D on each loop?? 
-	UpdateObjects (catalog, Ncatalog); // calculate <R>,<D>
-	FrameCorrection (catalog, Ncatalog);
+	UpdateObjects (catalog, Ncatalog, i); // calculate <R>,<D>
+	if (i > 2) FrameCorrection (catalog, Ncatalog);
 	UpdateChips (catalog, Ncatalog);   // measure.X,Y -> R,D, fit image.coords
 	MARKTIME("update chips: %f sec\n", dtime);
@@ -84,5 +84,5 @@
     case TARGET_MOSAICS:
       for (i = 0; i < NLOOP; i++) {
-	UpdateObjects (catalog, Ncatalog);
+	UpdateObjects (catalog, Ncatalog, i);
 	UpdateMosaic (catalog, Ncatalog);
       }
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastro_objects.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastro_objects.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastro_objects.c	(revision 37606)
@@ -77,5 +77,5 @@
     populate_tiny_values(&catalog, DVO_TV_MEASURE);
 
-    UpdateObjects (&catalog, 1);
+    UpdateObjects (&catalog, 1, 0);
 
     free_tiny_values(&catalog);
Index: /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastro_parallel_images.c
===================================================================
--- /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastro_parallel_images.c	(revision 37605)
+++ /branches/eam_branches/ipp-20140904/Ohana/src/relastro/src/relastro_parallel_images.c	(revision 37606)
@@ -76,5 +76,5 @@
     case TARGET_SIMPLE:
       for (i = 0; i < NLOOP; i++) {
-	UpdateObjects (catalog, Ncatalog);
+	UpdateObjects (catalog, Ncatalog, i);
 	share_mean_pos (catalog, Ncatalog, regionHosts, i);
 	slurp_mean_pos (catalog, Ncatalog, regionHosts, i);
@@ -87,5 +87,5 @@
     case TARGET_CHIPS:
       for (i = 0; i < NLOOP; i++) {
-	UpdateObjects (catalog, Ncatalog);
+	UpdateObjects (catalog, Ncatalog, i);
 	share_mean_pos (catalog, Ncatalog, regionHosts, i);
 	slurp_mean_pos (catalog, Ncatalog, regionHosts, i);
@@ -101,5 +101,5 @@
     case TARGET_MOSAICS:
       for (i = 0; i < NLOOP; i++) {
-	UpdateObjects (catalog, Ncatalog);
+	UpdateObjects (catalog, Ncatalog, i);
 	share_mean_pos (catalog, Ncatalog, regionHosts, i);
 	slurp_mean_pos (catalog, Ncatalog, regionHosts, i);
