Index: /trunk/Ohana/src/gastro2/Makefile
===================================================================
--- /trunk/Ohana/src/gastro2/Makefile	(revision 3519)
+++ /trunk/Ohana/src/gastro2/Makefile	(revision 3520)
@@ -14,5 +14,5 @@
 #  
 INCS	= 	-I$(INC) -I$(LINC) -I$(XINC)
-LIBS	= 	-L$(LLIB) -lFITS -lsocket -lnsl -lohana -lm 
+LIBS	= 	-L$(LLIB) -lohana -lFITS -lsocket -lnsl -lm 
 CFLAGS	=	-o $*.$(ARCH).o $(INCS)
 CCFLAGS	=	$(INCS) $(LIBS) 
Index: /trunk/Ohana/src/gastro2/include/gastro2.h
===================================================================
--- /trunk/Ohana/src/gastro2/include/gastro2.h	(revision 3519)
+++ /trunk/Ohana/src/gastro2/include/gastro2.h	(revision 3520)
@@ -12,4 +12,5 @@
 } StarData;
 
+# if (0)
 typedef struct {
   float X;
@@ -26,4 +27,5 @@
   char  dummy[3];
 } Stars;
+# endif
 
 typedef struct {
@@ -134,4 +136,7 @@
   double lweight, size;
 } Graphdata;
+
+StarData *rtext (FILE *f, int *nstars);
+StarData *rfits (FILE *f, int *nstars);
 
 GSCdata  *gptolemy (char *fullpath, int *Nstars);
Index: /trunk/Ohana/src/gastro2/src/gstars2.c
===================================================================
--- /trunk/Ohana/src/gastro2/src/gstars2.c	(revision 3519)
+++ /trunk/Ohana/src/gastro2/src/gstars2.c	(revision 3520)
@@ -1,5 +1,3 @@
 # include "gastro2.h"
-StarData *rtext (char *filename, Header *header, int *nstars);
-StarData *rfits (char *filename, Header *header, int *nstars);
 
 void gstars (char *filename, CmpCatalog *Target) {
@@ -8,11 +6,21 @@
   char line[80];
   double det;
-  int NX, NY, FoundAstrom, extend;
+  int NX, NY, Nskip, FoundAstrom, extend;
   StarData *stars;
+  FILE *f;
 
-  if (!fits_read_header (filename, &Target[0].header)) {
-    fprintf (stderr, "ERROR: can't load image header\n");
+  /* open file for stars */
+  f = fopen (filename, "r");
+  if (f == NULL) {
+    fprintf (stderr, "ERROR: can't open file to load stars\n");
     exit (1);
   }
+  if (!fits_fread_header (f, &Target[0].header)) {
+    fprintf (stderr, "ERROR: can't read image header\n");
+    exit (1);
+  }
+  /* this line should not be needed */
+  fseek (f, Target[0].header.size, SEEK_SET); 
+
   NX = Target[0].header.Naxis[0];
   NY = Target[0].header.Naxis[1];
@@ -115,11 +123,20 @@
   Target[0].Area = fabs (NX*NY*Target[0].coords.cdelt1*Target[0].coords.cdelt2*det);
 
+  /* read from FITS table or from text table */
   extend = FALSE;
   fits_scan (&Target[0].header, "EXTEND",  "%t", 1, &extend);
   if (extend) {
-    stars = rfits (filename, &Target[0].header, &Nstars);
+    Nskip = fits_matrix_size (&Target[0].header);
+    fseek (f, Nskip, SEEK_CUR); 
+    stars = rfits (f, &Nstars);
   } else {
-    stars = rtext (filename, &Target[0].header, &Nstars);
+    /* allocate space for stars */
+    if (!fits_scan (&Target[0].header, "NSTARS", "%d", 1, &Nstars)) {
+      fprintf (stderr, "ERROR: failed to find NSTARS\n");
+      exit (1);
+    }
+    stars = rtext (f, &Nstars);
   }
+  fclose (f);
 
   stars = remove_clumps (stars, &Nstars, NX, NY);
@@ -143,17 +160,17 @@
 /* 
 
-   load cmp file FITS header 
+load cmp file FITS header 
 
-   extract needed data from header:
-   - NX, NY?
-   - coords
+extract needed data from header:
+- NX, NY?
+- coords
    
-   load stellar photometry
+load stellar photometry
 
-   sort stars by mag
+sort stars by mag
 
-   filter & limit numbers
+filter & limit numbers
 
-   find luminosity function slope, area?
+find luminosity function slope, area?
 
 */
Index: /trunk/Ohana/src/gastro2/src/rfits.c
===================================================================
--- /trunk/Ohana/src/gastro2/src/rfits.c	(revision 3519)
+++ /trunk/Ohana/src/gastro2/src/rfits.c	(revision 3520)
@@ -1,35 +1,18 @@
 # include "gastro2.h"
-int ConvertStars (Stars *data, int size, int nitems);
 
-StarData *rfits (char *filename, Header *header, int *nstars) {
+StarData *rfits (FILE *f, int *nstars) {
 
-  int i, N, Nx, Ny, Nstars;
-  FILE *f;
+  int i, N, Nstars;
   Matrix matrix;
   Header theader;
   FTable table;
-  Stars *stars;
+  SMPData  *stars;
   StarData *stardata;
-
-  /* open file for stars */
-  f = fopen (filename, "r");
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: can't open file to load stars\n");
-    exit (1);
-  }
-  fseek (f, header[0].size, SEEK_SET); 
 
   /* init & load in table data */
   table.header   = &theader;
-  if (!fits_fread_matrix (f, &matrix, header))          goto escape;
   if (!fits_fread_ftable (f, &table, "SMPFILE")) goto escape;
 
-  /* convert to internal format */
-  stars = (Stars *) table.buffer;
-  fits_scan (table.header, "NAXIS1", "%d", 1, &Nx);
-  fits_scan (table.header, "NAXIS2", "%d", 1, &Ny);
-  Nstars = Ny;
-
-  if (!ConvertStars (stars, sizeof (Stars), Nstars)) goto escape;
+  stars = fits_table_get_SMPData (&table, &Nstars);
 
   ALLOCATE (stardata, StarData, Nstars);
@@ -63,60 +46,2 @@
   exit (1);
 }
-
-# define SWAP_BYTE(X) \
-  tmp = byte[X+0]; byte[X+0] = byte[X+1]; byte[X+1] = tmp;
-# define SWAP_WORD(X) \
-  tmp = byte[X+0]; byte[X+0] = byte[X+3]; byte[X+3] = tmp; \
-  tmp = byte[X+1]; byte[X+1] = byte[X+2]; byte[X+2] = tmp;
-# define SWAP_DBLE(X) \
-  tmp = byte[X+0]; byte[X+0] = byte[X+7]; byte[X+7] = tmp; \
-  tmp = byte[X+1]; byte[X+1] = byte[X+6]; byte[X+6] = tmp; \
-  tmp = byte[X+2]; byte[X+2] = byte[X+5]; byte[X+5] = tmp; \
-  tmp = byte[X+3]; byte[X+3] = byte[X+4]; byte[X+4] = tmp;
-
-# ifdef linux
-# define BYTE_SWAP
-# endif
-
-# ifdef sid
-# define BYTE_SWAP
-# endif
-
-# ifdef dec
-# define BYTE_SWAP
-# endif
-
-# define STARS_SIZE 44
-
-int ConvertStars (Stars *data, int size, int nitems) {
-
-  int i;
-  unsigned char *byte, tmp;
-
-# ifdef BYTE_SWAP
-
-  if (size != STARS_SIZE) {
-    fprintf (stderr, "mismatch in type sizes (Stars) %d vs %d\n", size, STARS_SIZE);
-    return (FALSE);
-  }
-
-  byte = (char *) data;
-  for (i = 0; i < nitems; i++, byte += size) {
-    SWAP_WORD (0);   /* R */
-    SWAP_WORD (4);   /* Y */
-    SWAP_WORD (8);   /* M */
-    SWAP_WORD (12);  /* dM */
-    SWAP_WORD (16);  /* Mgal */
-    SWAP_WORD (20);  /* Map */
-    SWAP_WORD (24);  /* sky */
-    SWAP_WORD (28);  /* fx */
-    SWAP_WORD (32);  /* fy */
-    SWAP_WORD (36);  /* df */
-  }
-  return (TRUE);
-
-# else
-  return (TRUE);
-# endif  
-} 
-
Index: /trunk/Ohana/src/gastro2/src/rtext.c
===================================================================
--- /trunk/Ohana/src/gastro2/src/rtext.c	(revision 3519)
+++ /trunk/Ohana/src/gastro2/src/rtext.c	(revision 3520)
@@ -5,5 +5,5 @@
 # define BLOCK 1000
 
-StarData *rtext (char *filename, Header *header, int *nstars) {
+StarData *rtext (FILE *f, int *nstars) {
 
   FILE *f;
@@ -13,21 +13,7 @@
   StarData *stars;
 
-  /* allocate space for stars */
-  NSTARS = -1;
-  fits_scan (header, "NSTARS", "%d", 1, &NSTARS);
-  if (NSTARS == -1) {
-    fprintf (stderr, "ERROR: failed to find NSTARS\n");
-    exit (1);
-  }
+  NSTARS = *nstars;
   ALLOCATE (stars, StarData, MAX (NSTARS, 1));
   Nbytes = NSTARS*BYTES_STAR;
-
-  /* open file for stars */
-  f = fopen (filename, "r");
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: can't open file to load stars\n");
-    exit (1);
-  }
-  fseek (f, header[0].size, SEEK_SET); 
 
   N = Nstars = 0;
@@ -52,5 +38,4 @@
   }
   free (buffer);
-  fclose (f);
  
   if (Nstars != NSTARS) {
Index: /trunk/Ohana/src/mosastro/Makefile
===================================================================
--- /trunk/Ohana/src/mosastro/Makefile	(revision 3519)
+++ /trunk/Ohana/src/mosastro/Makefile	(revision 3520)
@@ -61,5 +61,5 @@
 $(SRC)/wfits.$(ARCH).o \
 $(SRC)/rtext.$(ARCH).o \
-$(SRC)/ConvertStars.$(ARCH).o \
+$(SRC)/ConvertMatch.$(ARCH).o \
 $(SRC)/SaveResiduals.$(ARCH).o
 
Index: /trunk/Ohana/src/mosastro/include/mosastro.h
===================================================================
--- /trunk/Ohana/src/mosastro/include/mosastro.h	(revision 3519)
+++ /trunk/Ohana/src/mosastro/include/mosastro.h	(revision 3520)
@@ -58,4 +58,5 @@
 } Gradients;
 
+# if (0)
 typedef struct {
   float X;
@@ -72,4 +73,5 @@
   char  dummy[3];
 } Stars;
+# endif
 
 typedef struct {
@@ -197,8 +199,7 @@
 int mkpolyterm (int n, int m);
 void wchip (char *filename, Chip *data);
-void wstars (char *filename, Stars *stars, int Nstars, Header *header);
-int ConvertStars (Stars *data, int size, int nitems);
+void wstars (char *filename, SMPData *stars, int Nstars, Header *header);
 int rfits (Chip *mychip);
 int rtext (Chip *mychip);
-void wfits (char *filename, Stars *stars, int Nstars, Header *header);
+void wfits (char *filename, SMPData *stars, int Nstars, Header *header);
 int ConvertMatch (MatchData *data, int size, int nitems);
Index: /trunk/Ohana/src/mosastro/src/ConvertMatch.c
===================================================================
--- /trunk/Ohana/src/mosastro/src/ConvertMatch.c	(revision 3520)
+++ /trunk/Ohana/src/mosastro/src/ConvertMatch.c	(revision 3520)
@@ -0,0 +1,70 @@
+# include "mosastro.h"
+
+# define SWAP_BYTE(X) \
+  tmp = byte[X+0]; byte[X+0] = byte[X+1]; byte[X+1] = tmp;
+# define SWAP_WORD(X) \
+  tmp = byte[X+0]; byte[X+0] = byte[X+3]; byte[X+3] = tmp; \
+  tmp = byte[X+1]; byte[X+1] = byte[X+2]; byte[X+2] = tmp;
+# define SWAP_DBLE(X) \
+  tmp = byte[X+0]; byte[X+0] = byte[X+7]; byte[X+7] = tmp; \
+  tmp = byte[X+1]; byte[X+1] = byte[X+6]; byte[X+6] = tmp; \
+  tmp = byte[X+2]; byte[X+2] = byte[X+5]; byte[X+5] = tmp; \
+  tmp = byte[X+3]; byte[X+3] = byte[X+4]; byte[X+4] = tmp;
+
+# ifdef linux
+# define BYTE_SWAP
+# endif
+
+# ifdef sid
+# define BYTE_SWAP
+# endif
+
+# ifdef dec
+# define BYTE_SWAP
+# endif
+
+# define MATCH_SIZE 104
+
+int ConvertMatch (MatchData *data, int size, int nitems) {
+
+  int i;
+  unsigned char *byte, tmp;
+
+# ifdef BYTE_SWAP
+
+  if (size != MATCH_SIZE) {
+    fprintf (stderr, "mismatch in type sizes (MatchData) %d vs %d\n", size, MATCH_SIZE);
+    return (FALSE);
+  }
+
+  byte = (char *) data;
+  for (i = 0; i < nitems; i++, byte += size) {
+    SWAP_DBLE (0);   /* R */
+    SWAP_DBLE (8);   /* D */
+    SWAP_WORD (16);  /* P */
+    SWAP_WORD (20);  /* Q */
+    SWAP_WORD (24);  /* L */
+    SWAP_WORD (28);  /* M */
+    SWAP_WORD (32);  /* X */
+    SWAP_WORD (36);  /* Y */
+
+    SWAP_DBLE (40);  /* R */
+    SWAP_DBLE (40);  /* D */
+    SWAP_WORD (56);  /* P */
+    SWAP_WORD (60);  /* Q */
+    SWAP_WORD (64);  /* L */
+    SWAP_WORD (68);  /* M */
+    SWAP_WORD (72);  /* X */
+    SWAP_WORD (76);  /* Y */
+
+    SWAP_WORD (80);  /* Mcat */
+    SWAP_WORD (84);  /* dMcat */
+    SWAP_WORD (88);  /* Minst */
+    SWAP_WORD (92);  /* dMinst */
+  }
+  return (TRUE);
+
+# else
+  return (TRUE);
+# endif  
+} 
Index: /trunk/Ohana/src/mosastro/src/mkobs.c
===================================================================
--- /trunk/Ohana/src/mosastro/src/mkobs.c	(revision 3519)
+++ /trunk/Ohana/src/mosastro/src/mkobs.c	(revision 3520)
@@ -10,5 +10,5 @@
   Coords map, coords;
   StarData *refcat;
-  Stars *stars;
+  SMPData *stars;
   Header *header;
 
@@ -73,5 +73,5 @@
       Nstars = 0;
       NSTARS = 1000;
-      ALLOCATE (stars, Stars, NSTARS);
+      ALLOCATE (stars, SMPData, NSTARS);
 
       /* find catalog stars on chip */
@@ -98,5 +98,5 @@
 	if (Nstars >= NSTARS) {
 	  NSTARS += 1000;
-	  REALLOCATE (stars, Stars, NSTARS);
+	  REALLOCATE (stars, SMPData, NSTARS);
 	}
       }
Index: /trunk/Ohana/src/mosastro/src/mkstandards.c
===================================================================
--- /trunk/Ohana/src/mosastro/src/mkstandards.c	(revision 3519)
+++ /trunk/Ohana/src/mosastro/src/mkstandards.c	(revision 3520)
@@ -12,5 +12,5 @@
   Header *header;
   Coords coords;
-  Stars *stars;
+  SMPData *stars;
 
   Random = FALSE;
@@ -50,5 +50,5 @@
     init_random ();
 
-    ALLOCATE (stars, Stars, Nstars);
+    ALLOCATE (stars, SMPData, Nstars);
     for (i = 0; i < Nstars; i++) {
       x = 2*dX*drand48();
@@ -64,5 +64,5 @@
     Nstars = 0;
     NSTARS = 1000;
-    ALLOCATE (stars, Stars, NSTARS);
+    ALLOCATE (stars, SMPData, NSTARS);
 
     for (x = 0; x < 2*dX; x += DX) {
@@ -75,5 +75,5 @@
 	if (Nstars >= NSTARS) {
 	  NSTARS += 1000;
-	  REALLOCATE (stars, Stars, NSTARS);
+	  REALLOCATE (stars, SMPData, NSTARS);
 	}
       }
Index: /trunk/Ohana/src/mosastro/src/rfits.c
===================================================================
--- /trunk/Ohana/src/mosastro/src/rfits.c	(revision 3519)
+++ /trunk/Ohana/src/mosastro/src/rfits.c	(revision 3520)
@@ -3,8 +3,8 @@
 int rfits (Chip *mychip) {
 
-  int i, Nx, Ny;
+  int i, Nx;
   FILE *f;
   FTable table;
-  Stars *stars;
+  SMPData *stars;
 
   /* open file for stars */
@@ -30,25 +30,14 @@
   }
 
-  /* convert to internal format */
-  stars = (Stars *) table.buffer;
+  stars = fits_table_get_SMPData (&table, &mychip[0].Nstars);
   fits_scan (table.header, "NAXIS1", "%d", 1, &Nx);
-  fits_scan (table.header, "NAXIS2", "%d", 1, &Ny);
-  mychip[0].Nstars = Ny;
 
   /* save raw data for output */
   mychip[0].FITS = TRUE;
   mychip[0].buffer = (char *) stars;
-  mychip[0].Nbuffer = Nx*Ny;
+  mychip[0].Nbuffer = Nx*mychip[0].Nstars;
 
-  if (Ny < 5) { 
-    fprintf (stderr, "Too few stars for reliable solution, only %d\n", Ny);
-    fits_free_matrix (&mychip[0].matrix);
-    fits_free_table (&table);
-    fclose (f);
-    return (FALSE);
-  }
-
-  if (!ConvertStars (stars, sizeof (Stars), mychip[0].Nstars)) {
-    fprintf (stderr, "conversion error\n");
+  if (mychip[0].Nstars < 5) { 
+    fprintf (stderr, "Too few stars for reliable solution, only %d\n", mychip[0].Nstars);
     fits_free_matrix (&mychip[0].matrix);
     fits_free_table (&table);
Index: /trunk/Ohana/src/mosastro/src/wfits.c
===================================================================
--- /trunk/Ohana/src/mosastro/src/wfits.c	(revision 3519)
+++ /trunk/Ohana/src/mosastro/src/wfits.c	(revision 3520)
@@ -1,5 +1,5 @@
 # include "mosastro.h"
 
-void wfits (char *filename, Stars *stars, int Nstars, Header *header) {
+void wfits (char *filename, SMPData *stars, int Nstars, Header *header) {
 
   Matrix matrix;
@@ -18,26 +18,6 @@
   fits_create_matrix (header, &matrix);
     
-  /* create bintable header */
-  fits_create_table_header (&theader, "BINTABLE", "SMPFILE");
-
-  /* define bintable layout */
-  fits_define_bintable_column (&theader, "E",    "X_PIX",      "x coord",              "pixels",                         1.0, 0.0); 
-  fits_define_bintable_column (&theader, "E",    "Y_PIX",      "y coord",              "pixels",                         1.0, 0.0); 
-  fits_define_bintable_column (&theader, "E",    "MAG_RAW",    "inst mags",            "mags",                           1.0, 0.0); 
-  fits_define_bintable_column (&theader, "E",    "MAG_ERR",    "inst mag error",       "mags",                           1.0, 0.0); 
-  fits_define_bintable_column (&theader, "E",    "MAG_GAL",    "galaxy mag",           "mags",                           1.0, 0.0); 
-  fits_define_bintable_column (&theader, "E",    "MAG_AP",     "aperture mag",         "mags",                           1.0, 0.0); 
-  fits_define_bintable_column (&theader, "E",    "LOG_SKY",    "log-10 of sky",        "mags",                           1.0, 0.0); 
-  fits_define_bintable_column (&theader, "E",    "FWHM_X",     "semi-major",           "mags",                           1.0, 0.0); 
-  fits_define_bintable_column (&theader, "E",    "FWHM_Y",     "semi-minor",           "mags",                           1.0, 0.0); 
-  fits_define_bintable_column (&theader, "E",    "THETA",      "ellipse angle",        "mags",                           1.0, 0.0); 
-  fits_define_bintable_column (&theader, "B",    "DOPHOT",     "dophot type",          "",                              1.0, 0.0);
-  fits_define_bintable_column (&theader, "3A",   "DUMMY",      "padding",              "",                              1.0, 0.0);
-
-  /* create table, add data values */
-  fits_create_table (&theader, &table);
-
-  ConvertStars (stars, sizeof (Stars), Nstars);
-  fits_add_rows (&table, (char *) stars, Nstars, sizeof (Stars));
+  table.header = &theader;
+  fits_table_set_SMPData (&table, stars, Nstars);
 
   fits_write_header  (filename, header);
Index: /trunk/Ohana/src/mosastro/src/wstars.c
===================================================================
--- /trunk/Ohana/src/mosastro/src/wstars.c	(revision 3519)
+++ /trunk/Ohana/src/mosastro/src/wstars.c	(revision 3520)
@@ -7,5 +7,5 @@
 
   if (data[0].FITS) {
-    wfits (filename, (Stars *) data[0].buffer, data[0].Nstars, &data[0].header);
+    wfits (filename, (SMPData *) data[0].buffer, data[0].Nstars, &data[0].header);
   } else {
 
@@ -22,5 +22,5 @@
 }
 
-void wstars (char *filename, Stars *stars, int Nstars, Header *header) {
+void wstars (char *filename, SMPData *stars, int Nstars, Header *header) {
   
   int i, Nchar;
