Index: /tags/ipp-pv3-20140717/Ohana/src/addstar/Makefile
===================================================================
--- /tags/ipp-pv3-20140717/Ohana/src/addstar/Makefile	(revision 37342)
+++ /tags/ipp-pv3-20140717/Ohana/src/addstar/Makefile	(revision 37343)
@@ -86,4 +86,5 @@
 $(SRC)/ReadStarsTEXT.$(ARCH).o \
 $(SRC)/ReadStarsSDSS.$(ARCH).o \
+$(SRC)/ReadXradFITS.$(ARCH).o \
 $(SRC)/FilterStars.$(ARCH).o \
 $(SRC)/ImageOptions.$(ARCH).o \
Index: /tags/ipp-pv3-20140717/Ohana/src/addstar/include/addstar.h
===================================================================
--- /tags/ipp-pv3-20140717/Ohana/src/addstar/include/addstar.h	(revision 37342)
+++ /tags/ipp-pv3-20140717/Ohana/src/addstar/include/addstar.h	(revision 37343)
@@ -35,7 +35,9 @@
   char *exthead;
   char *extdata;
+  char *extxrad;
   char *exttype;
   int extnum_head;
   int extnum_data;
+  int extnum_xrad;
 } HeaderSet;
 
@@ -146,4 +148,5 @@
 
 int     OLD_RESORT;
+int     READ_XRAD_DATA;
 
 int    PARALLEL;
@@ -248,4 +251,7 @@
 Stars     *FilterStars            PROTO((Stars *instars, Image *image, unsigned int imageID, const AddstarClientOptions *options));
 Stars     *MergeStars             PROTO((Stars *stars, unsigned int *Nstars, Stars *instars, unsigned int Ninstars));
+
+int        ReadXradFITS           PROTO((FILE *f, Header *theader, Stars *stars, unsigned int Nstars));
+
 double     scat_subpix            PROTO((double x, double y));
 void       update_coords          PROTO((Average *average, Measure *measure, off_t *next));
Index: /tags/ipp-pv3-20140717/Ohana/src/addstar/src/LoadData.c
===================================================================
--- /tags/ipp-pv3-20140717/Ohana/src/addstar/src/LoadData.c	(revision 37342)
+++ /tags/ipp-pv3-20140717/Ohana/src/addstar/src/LoadData.c	(revision 37343)
@@ -83,4 +83,19 @@
       continue;
     }
+
+    // XRAD : if we want to read the xrad table, skip to that table here:
+    if (headerSets[i].extnum_xrad != -1) {
+      int Nxrad = headerSets[i].extnum_xrad;
+      Nskip = 0;
+      for (j = 0; j < Nxrad; j++) {
+	Nskip += extsize[j];
+      }
+      fseeko (f, Nskip, SEEK_SET); 
+      
+      if (!ReadXradFITS (f, headers[Nxrad], inStars, images[0][Nvalid].nstar)) {
+	fprintf (stderr, "problem reading the radial flux data for %s\n", headerSets[i].extdata);
+      }
+    }
+
     inStars = FilterStars (inStars, &images[0][Nvalid], Nvalid, options);
     *stars = MergeStars (*stars, Nstars, inStars, images[0][Nvalid].nstar);
Index: /tags/ipp-pv3-20140717/Ohana/src/addstar/src/MatchHeaders.c
===================================================================
--- /tags/ipp-pv3-20140717/Ohana/src/addstar/src/MatchHeaders.c	(revision 37342)
+++ /tags/ipp-pv3-20140717/Ohana/src/addstar/src/MatchHeaders.c	(revision 37343)
@@ -79,13 +79,33 @@
     headerSets[Nimage].extdata     = strcreate (extname);
     headerSets[Nimage].exthead     = strcreate (exthead);
+    headerSets[Nimage].extxrad     = NULL;
     headerSets[Nimage].extnum_data = i;
     headerSets[Nimage].extnum_head = -1;
+    headerSets[Nimage].extnum_xrad = -1;
+
+    // XXX a special case for fforce xrad data
+    if (READ_XRAD_DATA) {
+      // extname is foobar.psf, convert to foobar.xrad
+      int Nchar = strlen (extname); // foobar.psf : Nchar = 10
+      ALLOCATE (headerSets[Nimage].extxrad, char, Nchar + 2); // xrad is 1 longer than psf
+      memcpy   (headerSets[Nimage].extxrad, extname, Nchar - 3); // Nchar - 3 = 7
+      memcpy  (&headerSets[Nimage].extxrad[Nchar-3], "xrad", 4); 
+      headerSets[Nimage].extxrad[Nchar + 1] = 0; // put the 0 at element 11 for foobar.xrad\0
+    }
 
     // find the matching exthead entry
     for (j = 0; j < Nheaders; j++) {
       if (!gfits_scan (headers[j], ExtnameKeyword, "%s", 1, extname)) continue;
-      if (strcmp (extname, headerSets[Nimage].exthead)) continue;
-      headerSets[Nimage].extnum_head = j;
-      break;
+      if (!strcmp (extname, headerSets[Nimage].exthead)) { 
+	headerSets[Nimage].extnum_head = j;
+	if (!READ_XRAD_DATA) break;
+      }
+      if (READ_XRAD_DATA && !strcmp (extname, headerSets[Nimage].extxrad)) { 
+	headerSets[Nimage].extnum_xrad = j;
+      }
+      if ((headerSets[Nimage].extnum_head > -1) && (headerSets[Nimage].extnum_xrad > -1)) {
+	// we can only get here if READ_XRAD_DATA is true
+	break;
+      }
     }
 
Index: /tags/ipp-pv3-20140717/Ohana/src/addstar/src/ReadXradFITS.c
===================================================================
--- /tags/ipp-pv3-20140717/Ohana/src/addstar/src/ReadXradFITS.c	(revision 37343)
+++ /tags/ipp-pv3-20140717/Ohana/src/addstar/src/ReadXradFITS.c	(revision 37343)
@@ -0,0 +1,88 @@
+# include "addstar.h"
+
+// given a file with the pointer at the start of the table block and the 
+// corresponding image header, load the xrad data from the table
+int ReadXradFITS (FILE *f, Header *theader, Stars *stars, unsigned int Nstars) {
+
+  FTable table;
+  
+  // we've already read in the header
+  table.header = theader;
+  off_t Nskip = theader[0].datasize;
+  fseeko (f, Nskip, SEEK_CUR); 
+
+  /* load the table data */
+  if (!gfits_fread_ftable_data (f, &table, FALSE)) {
+    fprintf (stderr, "ERROR: can't read table header\n");
+    exit (1);
+  }
+
+  // I want to read the following columns from this table:
+  
+  off_t Nrow, NrowAlt;
+  int Ncol, NcolAlt;
+  char type[16], name[80];
+
+  strcpy (name, "APER_FLUX");
+  float *AperFlux = gfits_get_bintable_column_data (theader, &table, name, type, &Nrow, &Ncol);
+  myAssert (!strcmp(type, "float"), "wrong column type for %s\n", name);
+
+  strcpy (name, "APER_FLUX_ERR");
+  float *AperFluxErr = gfits_get_bintable_column_data (theader, &table, name, type, &NrowAlt, &NcolAlt);
+  myAssert (!strcmp(type, "float"), "wrong column type for %s\n", name); 
+  myAssert (Nrow == NrowAlt, "column mismatch?");
+  myAssert (Ncol == NcolAlt, "column mismatch?");
+
+  strcpy (name, "APER_FLUX_STDEV");
+  float *AperFluxStd = gfits_get_bintable_column_data (theader, &table, name, type, &NrowAlt, &NcolAlt);
+  myAssert (!strcmp(type, "float"), "wrong column type for %s\n", name);
+  myAssert (Nrow == NrowAlt, "column mismatch?");
+  myAssert (Ncol == NcolAlt, "column mismatch?");
+
+  strcpy (name, "APER_FILL");
+  float *AperFill = gfits_get_bintable_column_data (theader, &table, name, type, &NrowAlt, &NcolAlt);
+  myAssert (!strcmp(type, "float"), "wrong column type for %s\n", name);
+  myAssert (Nrow == NrowAlt, "column mismatch?");
+  myAssert (Ncol == NcolAlt, "column mismatch?");
+
+  strcpy (name, "IPP_IDET");
+  int *RadID = gfits_get_bintable_column_data (theader, &table, name, type, &NrowAlt, &NcolAlt);
+  myAssert (!strcmp(type, "int"), "wrong column type for %s\n", name);
+  myAssert (Nrow == NrowAlt, "column mismatch?");
+
+  if (Nrow > Nstars) {
+    myAbort("more radial measurements than stars?  seems like a bug\n");
+  }
+
+  int i;
+  int Nap = 0;
+  for (i = 0; i < Nstars; i++) {
+    if (stars[i].measure.detID < RadID[Nap]) {
+      continue; // this star does not have an aperture
+    }
+    if (stars[i].measure.detID > RadID[Nap]) {
+      myAbort("radial apertures out of order?  seems like a bug\n");
+    }
+
+    // we could allocate here, or just insist this is an error?
+    if (!stars[i].lensing) {
+      fprintf (stderr, "!");
+      ALLOCATE (stars[i].lensing, Lensing, 1);
+      dvo_lensing_init (stars[i].lensing);
+    }
+
+    stars[i].lensing-> F_ApR5 = AperFlux   [Nap*Ncol + 3];
+    stars[i].lensing->dF_ApR5 = AperFluxErr[Nap*Ncol + 3];
+    stars[i].lensing->sF_ApR5 = AperFluxStd[Nap*Ncol + 3];
+    stars[i].lensing->fF_ApR5 = AperFill   [Nap*Ncol + 3];
+
+    stars[i].lensing-> F_ApR6 = AperFlux   [Nap*Ncol + 4];
+    stars[i].lensing->dF_ApR6 = AperFluxErr[Nap*Ncol + 4];
+    stars[i].lensing->sF_ApR6 = AperFluxStd[Nap*Ncol + 4];
+    stars[i].lensing->fF_ApR6 = AperFill   [Nap*Ncol + 4];
+    Nap ++;
+  }
+
+  return TRUE;
+}
+
Index: /tags/ipp-pv3-20140717/Ohana/src/addstar/src/args.c
===================================================================
--- /tags/ipp-pv3-20140717/Ohana/src/addstar/src/args.c	(revision 37342)
+++ /tags/ipp-pv3-20140717/Ohana/src/addstar/src/args.c	(revision 37343)
@@ -75,4 +75,10 @@
     PMM_CCD_TABLE = strcreate (argv[N]);
     remove_argument (N, &argc, argv);
+  }
+
+  READ_XRAD_DATA = FALSE;
+  if ((N = get_argument (argc, argv, "-xrad"))) {
+    remove_argument (N, &argc, argv);
+    READ_XRAD_DATA = TRUE;
   }
 
