Index: /branches/eam_branches/ipp-20150616/Ohana/src/addstar/src/loadgalphot_join.c
===================================================================
--- /branches/eam_branches/ipp-20150616/Ohana/src/addstar/src/loadgalphot_join.c	(revision 38510)
+++ /branches/eam_branches/ipp-20150616/Ohana/src/addstar/src/loadgalphot_join.c	(revision 38510)
@@ -0,0 +1,61 @@
+
+
+int join_IDs_inner (Vector *ID1, Vector *ID2, Vector *index1, Vector *index2) {
+  
+  off_t i, j, first_j, I, J, *N1, *N2, Nmatch, NMATCH, DMATCH;
+  opihi_int dID;
+
+  NMATCH = MAX(MAX(0.01*ID1->Nelements, 0.01*ID2->Nelements), 100);
+  DMATCH = NMATCH;
+
+  ResetVector (index1, OPIHI_INT, NMATCH);
+  ResetVector (index2, OPIHI_INT, NMATCH);
+
+  ALLOCATE (N1, off_t, ID1->Nelements);
+  ALLOCATE (N2, off_t, ID2->Nelements);
+
+  for (i = 0; i < ID1->Nelements; i++) { N1[i] = i; }
+  for (i = 0; i < ID2->Nelements; i++) { N2[i] = i; }
+
+  sort_IDs_indexonly (ID1->elements.Int, N1, ID1->Nelements);
+  sort_IDs_indexonly (ID2->elements.Int, N2, ID2->Nelements);
+
+  Nmatch = 0;
+  for (i = j = 0; (i < ID1->Nelements) && (j < ID2->Nelements);) {
+    I = N1[i];
+    J = N2[j];
+
+    dID = ID1->elements.Int[I] - ID2->elements.Int[J];
+
+    if (dID < 0) { i++; continue; }
+    if (dID > 0) { j++; continue; }
+
+    // look for all matches of list2() to list1(i)
+    // this allows for multiple values of ID1 or ID2
+    first_j = j;
+    for (j = first_j; (dID == 0) && (j < ID2->Nelements); j++) {
+      J = N2[j];
+      dID = ID1->elements.Int[I] - ID2->elements.Int[J];
+      if (dID == 0) {
+	index1->elements.Int[Nmatch] = I;
+	index2->elements.Int[Nmatch] = J;
+
+	Nmatch ++;
+	if (Nmatch >= NMATCH) {
+	  NMATCH += DMATCH;
+	  REALLOCATE (index1->elements.Int, opihi_int, NMATCH);
+	  REALLOCATE (index2->elements.Int, opihi_int, NMATCH);
+	}
+      }
+    }
+    j = first_j;
+    i++;
+  }
+  index1->Nelements = Nmatch;
+  index2->Nelements = Nmatch;
+
+  free (N1);
+  free (N2);
+
+  return (TRUE);
+}
Index: /branches/eam_branches/ipp-20150616/Ohana/src/addstar/src/loadgalphot_readstars.c
===================================================================
--- /branches/eam_branches/ipp-20150616/Ohana/src/addstar/src/loadgalphot_readstars.c	(revision 38509)
+++ /branches/eam_branches/ipp-20150616/Ohana/src/addstar/src/loadgalphot_readstars.c	(revision 38510)
@@ -2,6 +2,6 @@
 # include "loadgalphot.h"
 
-# define GET_COLUMN(OUT,NAME,TYPE) \
-  TYPE *OUT = gfits_get_bintable_column_data (&header, &ftable, NAME, type, &NrowNew, &Ncol); \
+# define GET_COLUMN(VER,OUT,NAME,TYPE)					\
+  TYPE *OUT = gfits_get_bintable_column_data (&header_##VER, &ftable_##VER, NAME, type, &NrowNew, &Ncol); \
   myAssert (!strcmp(type, #TYPE), "wrong column type"); \
   if (firstCol) { Nrow = NrowNew; firstCol = FALSE; } \
@@ -26,9 +26,9 @@
   off_t NrowNew;
 
+  char type[16];
+  int firstCol;
+
+  // load in PHU for astrometry
   Header PHU;
-  Header header;
-  FTable ftable;
-  
-  // load in PHU for astrometry
   if (!gfits_fread_header (f, &PHU)) {
     if (VERBOSE) fprintf (stderr, "can't read image subset header\n");
@@ -37,45 +37,21 @@
   }
 
-  {
-    Header header_xfit;
-    FTable ftable_xfit;
-
-    if (!gfits_find_Xheader (f, &header_xfit, "SkyChip.xfit")) {
-      if (VERBOSE) fprintf (stderr, "can't read galaxy photometry header\n");
-      gfits_free_header (&header_xfit);
-      gfits_free_header (&PHU);
-      fclose (f);
-      return NULL;
-    }
-
-    ftable_xfit.header = &header_xfit;
-
-    if (!gfits_fread_ftable_data (f, &ftable_xfit, FALSE)) {
-      if (VERBOSE) fprintf (stderr, "can't read galaxy photometry data\n");
-      gfits_free_header (&header_xfit);
-      gfits_free_header (&PHU);
-      fclose (f);
-      return (NULL);
-    }
-
-    char type[16];
-    int firstCol = TRUE;
-
-    GET_COLUMN (ID_fit,        "IPP_IDET",      int);
-    GET_COLUMN (MODEL_TYPE_fit,"MODEL_TYPE",    char); NcharModel = Ncol;.
-    GET_COLUMN (EXT_WIDTH_MAJ, "EXT_WIDTH_MAJ", float);
-    GET_COLUMN (EXT_WIDTH_MIN, "EXT_WIDTH_MIN", float);
-    GET_COLUMN (EXT_THETA,     "EXT_THETA",     float);
-    GET_COLUMN (EXT_THETA_ERR, "EXT_THETA_ERR", float);
-    GET_COLUMN (INDEX,         "EXT_PAR_07",    float);
-
-    // free the memory associated with the FITS files
-    gfits_free_header (&header);
-    gfits_free_table (&ftable);
-  }
-
-  if (!gfits_find_Xheader (f, &header, "SkyChip.xgal")) {
+  // in xgal, we have numerical values to specify the model types
+  // in xfit, we have strings.  these are listed with their numerical 
+  // match in the PHU.  I need to read the list of names and set up a string hash
+
+  if (!gfits_scan (PHU, "MTNUM", "%d", 1, &ModelTypeN)) { myAbort ("fail"); }
+  for (i = 0; i < ModelTypeN; i++) {
+    snprintf (name, 64, "MTNAM%02d", i);
+    if (!gfits_scan (PHU, name, "%s", 1, ModelTypeTmp)) { myAbort ("fail"); }
+    snprintf (name, 64, "MTVAL%02d", i);
+    if (!gfits_scan (PHU, name, "%d", 1, &ModelTypeVal)) { myAbort ("fail"); }
+  }
+
+  Header header_xfit;
+  FTable ftable_xfit;
+  if (!gfits_find_Xheader (f, &header_xfit, "SkyChip.xfit")) {
     if (VERBOSE) fprintf (stderr, "can't read galaxy photometry header\n");
-    gfits_free_header (&header);
+    gfits_free_header (&header_xfit);
     gfits_free_header (&PHU);
     fclose (f);
@@ -83,9 +59,9 @@
   }
 
-  ftable.header = &header;
-
-  if (!gfits_fread_ftable_data (f, &ftable, FALSE)) {
+  ftable_xfit.header = &header_xfit;
+
+  if (!gfits_fread_ftable_data (f, &ftable_xfit, FALSE)) {
     if (VERBOSE) fprintf (stderr, "can't read galaxy photometry data\n");
-    gfits_free_header (&header);
+    gfits_free_header (&header_xfit);
     gfits_free_header (&PHU);
     fclose (f);
@@ -93,25 +69,59 @@
   }
 
-  char type[16];
-  int firstCol = TRUE;
-
-  // GET_COLUMN (ID,           "IPP_IDET",     int);
-  // GET_COLUMN (MODEL_TYPE,   "MODEL_TYPE",   int);
-  GET_COLUMN (X_FIT,        "X_FIT", 	    float);
-  GET_COLUMN (Y_FIT,        "Y_FIT", 	    float);
-  // GET_COLUMN (NPIX,         "NPIX",  	    float);
-  GET_COLUMN (GAL_FLUX,     "GAL_FLUX",     float); Nsample = Ncol;
-  GET_COLUMN (GAL_FLUX_ERR, "GAL_FLUX_ERR", float); myAssert (Ncol == Nsample, "invalid table");
-  GET_COLUMN (GAL_CHISQ,    "GAL_CHISQ",    float); myAssert (Ncol == Nsample, "invalid table");
-  GET_COLUMN (FR_MAJOR_MIN, "FR_MAJOR_MIN", float);
-  GET_COLUMN (FR_MAJOR_MAX, "FR_MAJOR_MAX", float);
-  GET_COLUMN (FR_MAJOR_DEL, "FR_MAJOR_DEL", float);
-  GET_COLUMN (FR_MINOR_MIN, "FR_MINOR_MIN", float);
-  GET_COLUMN (FR_MINOR_MAX, "FR_MINOR_MAX", float);
-  GET_COLUMN (FR_MINOR_DEL, "FR_MINOR_DEL", float);
+  firstCol = TRUE;
+  GET_COLUMN (xfit, ID_fit,         "IPP_IDET",      int);
+  GET_COLUMN (xfit, MODEL_TYPE_fit, "MODEL_TYPE",    char); NcharModel = Ncol;
+  GET_COLUMN (xfit, EXT_WIDTH_MAJ,  "EXT_WIDTH_MAJ", float);
+  GET_COLUMN (xfit, EXT_WIDTH_MIN,  "EXT_WIDTH_MIN", float);
+  GET_COLUMN (xfit, EXT_THETA,      "EXT_THETA",     float);
+  GET_COLUMN (xfit, EXT_THETA_ERR,  "EXT_THETA_ERR", float);
+  GET_COLUMN (xfit, INDEX,          "EXT_PAR_07",    float);
 
   // free the memory associated with the FITS files
-  gfits_free_header (&header);
-  gfits_free_table (&ftable);
+  gfits_free_header (&header_xfit);
+  gfits_free_table (&ftable_xfit);
+
+  Header header_xgal;
+  FTable ftable_xgal;
+  if (!gfits_find_Xheader (f, &header_xgal, "SkyChip.xgal")) {
+    if (VERBOSE) fprintf (stderr, "can't read galaxy photometry header\n");
+    gfits_free_header (&header_xgal);
+    gfits_free_header (&PHU);
+    fclose (f);
+    return NULL;
+  }
+
+  ftable_xgal.header = &header_xgal;
+
+  if (!gfits_fread_ftable_data (f, &ftable_xgal, FALSE)) {
+    if (VERBOSE) fprintf (stderr, "can't read galaxy photometry data\n");
+    gfits_free_header (&header_xgal);
+    gfits_free_header (&PHU);
+    fclose (f);
+    return (NULL);
+  }
+
+  firstCol = TRUE;
+  GET_COLUMN (xgal, ID_gal,        "IPP_IDET",     int);
+  GET_COLUMN (xgal, MODEL_TYPE_gal,"MODEL_TYPE",   int);
+  GET_COLUMN (xgal, NPIX,          "NPIX",  	   float);
+  GET_COLUMN (xgal, X_FIT,         "X_FIT", 	   float);
+  GET_COLUMN (xgal, Y_FIT,         "Y_FIT", 	   float);
+  GET_COLUMN (xgal, GAL_FLUX,      "GAL_FLUX",     float); Nsample = Ncol;
+  GET_COLUMN (xgal, GAL_FLUX_ERR,  "GAL_FLUX_ERR", float); myAssert (Ncol == Nsample, "invalid table");
+  GET_COLUMN (xgal, GAL_CHISQ,     "GAL_CHISQ",    float); myAssert (Ncol == Nsample, "invalid table");
+  GET_COLUMN (xgal, FR_MAJOR_MIN,  "FR_MAJOR_MIN", float);
+  GET_COLUMN (xgal, FR_MAJOR_MAX,  "FR_MAJOR_MAX", float);
+  GET_COLUMN (xgal, FR_MAJOR_DEL,  "FR_MAJOR_DEL", float);
+  GET_COLUMN (xgal, FR_MINOR_MIN,  "FR_MINOR_MIN", float);
+  GET_COLUMN (xgal, FR_MINOR_MAX,  "FR_MINOR_MAX", float);
+  GET_COLUMN (xgal, FR_MINOR_DEL,  "FR_MINOR_DEL", float);
+
+  // i need to match the two lists based on (ID_gal == ID_fit), (MODEL_TYPE_gal == MODEL_TYPE_fit)
+  join_IDs (ID_gal, ID_fit, index
+
+  // free the memory associated with the FITS files
+  gfits_free_header (&header_xgal);
+  gfits_free_table (&ftable_xgal);
 
   GalPhot_Stars *stars = NULL;
