Index: /trunk/Ohana/src/addstar/include/2mass.h
===================================================================
--- /trunk/Ohana/src/addstar/include/2mass.h	(revision 39310)
+++ /trunk/Ohana/src/addstar/include/2mass.h	(revision 39311)
@@ -19,5 +19,5 @@
 } TMStars;
 
-short TM_J, TM_H, TM_K;
+short TM_J, TM_H, TM_K, TM_B, TM_V;
 
 SkyTable *get2mass_acc (SkyRegion *patch, char *path, char *accel);
@@ -46,5 +46,5 @@
 // int       get2mass_3star (Stars *star, char *line, int Nmax);
 
-int get2mass_3star_full (Measure *measure, char *line, int Nmax);
+int get2mass_3star_full (Measure *measure, char *line, int *Nmeasure);
 char *next2MASSfield (char *line);
 int set2MASS_ph_qual (Measure *measure, char qual);
Index: /trunk/Ohana/src/addstar/include/tycho.h
===================================================================
--- /trunk/Ohana/src/addstar/include/tycho.h	(revision 39310)
+++ /trunk/Ohana/src/addstar/include/tycho.h	(revision 39311)
@@ -9,4 +9,6 @@
 } Tycho_Stars;
 
+int USE_PS1_EPOCH;
+
 AddstarClientOptions args_loadtycho (int *argc, char **argv, AddstarClientOptions options);
 
Index: /trunk/Ohana/src/addstar/src/args_loadtycho.c
===================================================================
--- /trunk/Ohana/src/addstar/src/args_loadtycho.c	(revision 39310)
+++ /trunk/Ohana/src/addstar/src/args_loadtycho.c	(revision 39311)
@@ -49,4 +49,10 @@
   }
 
+  USE_PS1_EPOCH = FALSE;
+  if ((N = get_argument (*argc, argv, "-ps1-mean-epoch"))) {
+    USE_PS1_EPOCH = TRUE;
+    remove_argument (N, argc, argv);
+  }
+
   /* extra error messages */
   VERBOSE = FALSE;
Index: /trunk/Ohana/src/addstar/src/find_matches_refstars.c
===================================================================
--- /trunk/Ohana/src/addstar/src/find_matches_refstars.c	(revision 39310)
+++ /trunk/Ohana/src/addstar/src/find_matches_refstars.c	(revision 39311)
@@ -1,3 +1,4 @@
 # include "addstar.h"
+# define DEBUG 0
 
 // see bottom of this file for differences between find_matches_refstars.c and find_matches.c
@@ -14,4 +15,6 @@
   int Nsecfilt;
 
+  if (DEBUG) ohana_memcheck(TRUE);
+
   /* photcode data -- should not have to modify secfilt / average */
   Nsecfilt = GetPhotcodeNsecfilt ();
@@ -57,4 +60,6 @@
   objID = tgtcat[0].objID;
   catID = tgtcat[0].catID;
+
+  if (DEBUG) ohana_memcheck(TRUE);
 
   /* project onto rectilinear grid with 1 arcsec pixels. the choice of ARC projection has
@@ -119,4 +124,5 @@
 
   /****************** find matched stars ********************/
+  if (DEBUG) ohana_memcheck(TRUE);
 
   for (i = j = 0; (i < Nstars) && (j < Nave); ) {
@@ -251,4 +257,5 @@
     i++;
   }
+  if (DEBUG) ohana_memcheck(TRUE);
 
   /* incorporate unmatched refcat stars */
@@ -333,4 +340,5 @@
     Nave ++;
   }
+  if (DEBUG) ohana_memcheck(TRUE);
       
   REALLOCATE (tgtcat[0].average, Average, Nave);
@@ -341,5 +349,5 @@
 
   /* note stars which have been found in this tgtcat */
-  for (i = 0; i < srccat->Nmeasure; i++) {
+  for (i = 0; i < srccat->Naverage; i++) {
     if (srccat->found_t[i] > -1) {
       srccat->found_t[i] = -2;
@@ -352,4 +360,6 @@
   tgtcat[0].Nsecfilt_mem = Nave*Nsecfilt;
   if (VERBOSE) fprintf (stderr, "Nstars, Nave, Nmeas: "OFF_T_FMT" "OFF_T_FMT" "OFF_T_FMT", ("OFF_T_FMT" matches)\n",  Nstars,  Nave,  Nmeas,  Nmatch);
+
+  if (DEBUG) ohana_memcheck(TRUE);
 
   free (X1);
Index: /trunk/Ohana/src/addstar/src/get2mass_full.c
===================================================================
--- /trunk/Ohana/src/addstar/src/get2mass_full.c	(revision 39310)
+++ /trunk/Ohana/src/addstar/src/get2mass_full.c	(revision 39311)
@@ -6,5 +6,5 @@
 // fill in the data for a JHK triplet star.  takes a pointer to the start of the line the
 // RA and DEC have already been set
-int get2mass_3star_full (Measure *measure, char *line, int Nmax) {
+int get2mass_3star_full (Measure *measure, char *line, int *Nmeasure) {
 
   char *ptr;
@@ -14,6 +14,13 @@
   if (line == NULL) Shutdown ("format error in 2mass");
 
-  ptr = line;		      // ra  (assumed to be already set)
+  ptr = line;		      // ra  (set for average, but not yet measure)
+  double R = atof(ptr);	      
+
   ptr = next2MASSfield (ptr); // dec (assumed to be already set)
+  double D = atof(ptr);
+
+  measure[2].R = measure[1].R = measure[0].R = R;
+  measure[2].D = measure[1].D = measure[0].D = D;
+
   ptr = next2MASSfield (ptr); // err_maj
   measure[0].FWx = ToShortPixels(strtod (ptr, NULL));
@@ -153,4 +160,49 @@
   measure[2].detID   = 0;
   measure[2].imageID = 0;
+
+  *Nmeasure = 3;
+
+  ptr = next2MASSfield (ptr); // a (optical source association)
+
+  // if we have Tycho data, add as a new measurement
+  if (*ptr == 'T') {
+    ptr = next2MASSfield (ptr); // dist_opt (optical source association)
+    float dR = atof(ptr) / 3600.0; // convert offset to degrees
+
+    ptr = next2MASSfield (ptr); // phi_opt (optical source association)
+    float phi = atof(ptr);
+
+    ptr = next2MASSfield (ptr); // B_opt (optical source association)
+    float B_j = atof(ptr);
+
+    ptr = next2MASSfield (ptr); // V_opt (optical source association)
+    float V_j = atof(ptr);
+
+    *Nmeasure = 5;
+
+    // inherit all info from the base measurement
+    measure[3] = measure[0];
+    measure[4] = measure[0];
+
+    float dDEC = dR * cos(RAD_DEG*phi);
+    float dRA  = dR * sin(RAD_DEG*phi) / cos(RAD_DEG*measure[3].D);
+
+    // transformations from Bj,Vj to Bt,Vt from 2mass explanatory supplement:
+    float BV_t = (B_j - V_j) / 0.85;
+    float V_t = V_j + 0.09 * BV_t;
+    float B_t = BV_t + V_t;
+
+    measure[3].R -= dRA;
+    measure[3].D -= dDEC;
+    measure[3].photcode = TM_B;
+    measure[3].M = B_t;
+    measure[3].dM = 0.1;
+
+    measure[4].R = measure[3].R;
+    measure[4].D = measure[3].D;
+    measure[4].photcode = TM_V;
+    measure[4].M = V_t;
+    measure[4].dM = 0.1;
+  }
 
   return TRUE;
Index: /trunk/Ohana/src/addstar/src/get2mass_ops.c
===================================================================
--- /trunk/Ohana/src/addstar/src/get2mass_ops.c	(revision 39310)
+++ /trunk/Ohana/src/addstar/src/get2mass_ops.c	(revision 39311)
@@ -12,4 +12,7 @@
   NAMED_PHOTCODE (TM_H, "2MASS_H");
   NAMED_PHOTCODE (TM_K, "2MASS_K");
+
+  NAMED_PHOTCODE (TM_B, "TYCHO_B_2MASS");
+  NAMED_PHOTCODE (TM_V, "TYCHO_V_2MASS");
 
   FilterSkip = TimeSkip = Qentry = 0;
Index: /trunk/Ohana/src/addstar/src/load2mass_as_rawdata.c
===================================================================
--- /trunk/Ohana/src/addstar/src/load2mass_as_rawdata.c	(revision 39310)
+++ /trunk/Ohana/src/addstar/src/load2mass_as_rawdata.c	(revision 39311)
@@ -150,18 +150,22 @@
 	}
 
+	// make sure we have enough space here for up to 5 more measurements:
+	CHECK_REALLOCATE (newcat->measure, Measure, NMEAS, Nmeas + 5, 3000);
+
+	int Nmeasure = 0; // we are adding 3 (JHK) or 5 (+ B_T, V_T) measurements
+
 	newcat->average[Nave].R = tstars[j].R;
 	newcat->average[Nave].D = tstars[j].D;
-	get2mass_3star_full (&newcat->measure[Nmeas], &buffer[offset], Nbyte - offset);
+	get2mass_3star_full (&newcat->measure[Nmeas], &buffer[offset], &Nmeasure);
 
 	tstars[j].flag = TRUE;
 
-	newcat->average[Nave].Nmeasure = 3;
+	newcat->average[Nave].Nmeasure = Nmeasure;
 	newcat->average[Nave].measureOffset = Nmeas;
 
 	Nave ++;
-	Nmeas += 3;
+	Nmeas += Nmeasure;
 
 	CHECK_REALLOCATE (newcat->average, Average, NAVE,  Nave,  1000);
-	CHECK_REALLOCATE (newcat->measure, Measure, NMEAS, Nmeas, 3000);
       }
       newcat->Naverage = Nave;
Index: /trunk/Ohana/src/addstar/src/loadtycho_ops.c
===================================================================
--- /trunk/Ohana/src/addstar/src/loadtycho_ops.c	(revision 39310)
+++ /trunk/Ohana/src/addstar/src/loadtycho_ops.c	(revision 39311)
@@ -61,59 +61,76 @@
     Dref = Dobs;
     Dps1 = Dobs;
-  } else {
-    star[0].average.dR  = atof (&line[57]) / 1000.0; // e_RAmdeg
-    star[0].average.dD  = atof (&line[61]) / 1000.0; // e_DEmdeg
+    goto got_positions;
+  } 
 
-    star[0].average.uR  = atof (&line[41]) / 1000.0; // pmRA
-    star[0].average.uD  = atof (&line[49]) / 1000.0; // pmDE
+  star[0].average.dR  = atof (&line[57]) / 1000.0; // e_RAmdeg
+  star[0].average.dD  = atof (&line[61]) / 1000.0; // e_DEmdeg
+  
+  star[0].average.uR  = atof (&line[41]) / 1000.0; // pmRA
+  star[0].average.uD  = atof (&line[49]) / 1000.0; // pmDE
+  
+  star[0].average.duR = atof (&line[65]) / 1000.0; // e_pmRA
+  star[0].average.duD = atof (&line[70]) / 1000.0; // e_pmDE
+  
+  if (line[13] == 'P') {
+    
+    double Ttycho = 0.5*(jyR + jyD) + 1990.0;
 
-    star[0].average.duR = atof (&line[65]) / 1000.0; // e_pmRA
-    star[0].average.duD = atof (&line[70]) / 1000.0; // e_pmDE
+    Rref = Robs + ((2000.0 - Ttycho)/3600.0)*star[0].average.uR*cos(RAD_DEG*Dobs);
+    Dref = Dobs + ((2000.0 - Ttycho)/3600.0)*star[0].average.uD;
+  }
 
-    Rps1 = Rref + ((2012.0 - 2000.0)/3600.0)*star[0].average.uR*cos(RAD_DEG*Dref);
-    Dps1 = Dref + ((2012.0 - 2000.0)/3600.0)*star[0].average.uD;
-
-    // use the mean (J2000) position for average or determine J2012?
+  Rps1 = Rref + ((2012.0 - 2000.0)/3600.0)*star[0].average.uR*cos(RAD_DEG*Dref);
+  Dps1 = Dref + ((2012.0 - 2000.0)/3600.0)*star[0].average.uD;
+  
+  // use the PS1 epoch for average
+  if (USE_PS1_EPOCH) {
     star[0].average.R = Rps1;
     star[0].average.D = Dps1;
-
+    star[0].average.Tmean = J2012;
+  } else {
+    star[0].average.R = Rref;
+    star[0].average.D = Dref;
     star[0].average.Tmean = J2000;
   }
 
-  float  M_B = atof (&line[110]); // BTmag
-  float dM_B = atof (&line[117]); // e_BTmag
-  float  M_V = atof (&line[123]); // VTmag
-  float dM_V = atof (&line[130]); // e_VTmag
+got_positions:
+  {
+    float  M_B = atof (&line[110]); // BTmag
+    float dM_B = atof (&line[117]); // e_BTmag
+    float  M_V = atof (&line[123]); // VTmag
+    float dM_V = atof (&line[130]); // e_VTmag
 
-  // we have NGROUP measurements (B,V) x (MeanEpoch, J2000, J2012)
-  star[0].measure[0].t   = TychoEpoch;
-  star[0].measure[1].t   = TychoEpoch;
-  star[0].measure[2].t   = J2000;
-  star[0].measure[3].t   = J2000;
-  star[0].measure[4].t   = J2012;
-  star[0].measure[5].t   = J2012;
+    // we have NGROUP measurements (B,V) x (MeanEpoch, J2000, J2012)
+    star[0].measure[0].t   = TychoEpoch;
+    star[0].measure[1].t   = TychoEpoch;
+    star[0].measure[2].t   = J2000;
+    star[0].measure[3].t   = J2000;
+    star[0].measure[4].t   = J2012;
+    star[0].measure[5].t   = J2012;
 
-  star[0].measure[0].R   = Robs;
-  star[0].measure[0].D   = Dobs;
-  star[0].measure[1].R   = Robs;
-  star[0].measure[1].D   = Dobs;
+    star[0].measure[0].R   = Robs;
+    star[0].measure[0].D   = Dobs;
+    star[0].measure[1].R   = Robs;
+    star[0].measure[1].D   = Dobs;
 
-  star[0].measure[2].R   = Rref;
-  star[0].measure[2].D   = Dref;
-  star[0].measure[3].R   = Rref;
-  star[0].measure[3].D   = Dref;
+    star[0].measure[2].R   = Rref;
+    star[0].measure[2].D   = Dref;
+    star[0].measure[3].R   = Rref;
+    star[0].measure[3].D   = Dref;
 
-  star[0].measure[4].R   = Rps1;
-  star[0].measure[4].D   = Dps1;
-  star[0].measure[5].R   = Rps1;
-  star[0].measure[5].D   = Dps1;
+    star[0].measure[4].R   = Rps1;
+    star[0].measure[4].D   = Dps1;
+    star[0].measure[5].R   = Rps1;
+    star[0].measure[5].D   = Dps1;
 
-  for (i = 0; i < NGROUP; i+=2) {
-    star[0].measure[i+0].M        =  M_B;
-    star[0].measure[i+0].dM       = dM_B;
-    star[0].measure[i+0].photcode = TYCHO_B;
-    star[0].measure[i+1].M        =  M_V;
-    star[0].measure[i+1].dM       = dM_V;
-    star[0].measure[i+1].photcode = TYCHO_V;
+    for (i = 0; i < NGROUP; i+=2) {
+      star[0].measure[i+0].M        =  M_B;
+      star[0].measure[i+0].dM       = dM_B;
+      star[0].measure[i+0].photcode = TYCHO_B;
+      star[0].measure[i+1].M        =  M_V;
+      star[0].measure[i+1].dM       = dM_V;
+      star[0].measure[i+1].photcode = TYCHO_V;
+    }
   }
   return TRUE;
