Index: /branches/eam_branches/ipp-20220316/Ohana/src/addstar/include/WISE.h
===================================================================
--- /branches/eam_branches/ipp-20220316/Ohana/src/addstar/include/WISE.h	(revision 42210)
+++ /branches/eam_branches/ipp-20220316/Ohana/src/addstar/include/WISE.h	(revision 42211)
@@ -20,4 +20,9 @@
 
 short WISE_W1, WISE_W2, WISE_W3, WISE_W4;
+
+double  RA_SYS_OFFRAW;
+double  DE_SYS_OFFSET;
+double  uRA_SYS_OFFSET;
+double  uDE_SYS_OFFSET;
 
 enum {MODE_NONE, MODE_CATWISE, MODE_ALLWISE, MODE_ALLSKY, MODE_PRELIM};
Index: /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/args_loadwise.c
===================================================================
--- /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/args_loadwise.c	(revision 42210)
+++ /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/args_loadwise.c	(revision 42211)
@@ -60,4 +60,25 @@
   }
 
+  /* accept proper-motion data from reference */
+  RA_SYS_OFFRAW = 0.0;
+  DE_SYS_OFFSET = 0.0;
+  uRA_SYS_OFFSET = 0.0;
+  uDE_SYS_OFFSET = 0.0;
+  if ((N = get_argument (*argc, argv, "-sys-astrom-offsets"))) {
+    if (*argc < N + 5) {
+      fprintf (stderr, "missing args for -sys-astrom-offsets (RA) (DEC) (uRA) (uDEC)\n");
+      exit (2);
+    }
+    remove_argument (N, argc, argv);
+    RA_SYS_OFFRAW = atof(argv[N]);
+    remove_argument (N, argc, argv);
+    DE_SYS_OFFSET = atof(argv[N]);
+    remove_argument (N, argc, argv);
+    uRA_SYS_OFFSET = atof(argv[N]);
+    remove_argument (N, argc, argv);
+    uDE_SYS_OFFSET = atof(argv[N]);
+    remove_argument (N, argc, argv);
+  }
+
   /* load the prelim data dump */
   MODE = MODE_NONE;
Index: /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/find_matches_refstars.c
===================================================================
--- /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/find_matches_refstars.c	(revision 42210)
+++ /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/find_matches_refstars.c	(revision 42211)
@@ -224,4 +224,5 @@
 	  tgtcat[0].average[n].P          = srccat->average[N].P;
 	  tgtcat[0].average[n].dP         = srccat->average[N].dP;
+	  tgtcat[0].average[n].Tmean      = srccat->average[N].Tmean;
 	}
 
@@ -305,4 +306,5 @@
       tgtcat[0].average[Nave].P     	   = srccat->average[i].P;
       tgtcat[0].average[Nave].dP    	   = srccat->average[i].dP;
+      tgtcat[0].average[Nave].Tmean    	   = srccat->average[i].Tmean;
     }
 
Index: /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/loadwise_ops.c
===================================================================
--- /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/loadwise_ops.c	(revision 42210)
+++ /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/loadwise_ops.c	(revision 42211)
@@ -19,6 +19,9 @@
   if (MODE == MODE_CATWISE) {
       // copy the string ranges and then use strtod (not necessary?)
-      *R = strtod (&ptr[47], NULL); // safe to use strtod on the line because it is white-space separated
-      *D = strtod (&ptr[59], NULL);
+      // *R = strtod (&ptr[47], NULL); // safe to use strtod on the line because it is white-space separated
+      // *D = strtod (&ptr[59], NULL);
+      // note we use ra_pm and dec_pm which are different from ra,dec when the object is moving
+      *R = strtod (&ptr[1139], NULL); // safe to use strtod on the line because it is white-space separated
+      *D = strtod (&ptr[1151], NULL);
   } else {
       ptr = skipNbounds (ptr, '|', 1, Nmax);
Index: /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/loadwise_rawdata.c
===================================================================
--- /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/loadwise_rawdata.c	(revision 42210)
+++ /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/loadwise_rawdata.c	(revision 42211)
@@ -8,5 +8,5 @@
 /* read in chunks of ~64MB */
 # define NBYTE 0x40000000
-# define DEBUG 0
+# define DEBUG 1
 
 int loadwise_rawdata (SkyList *skytable, char *filename, AddstarClientOptions options) {
@@ -69,10 +69,12 @@
 
       if (skipHeader && (MODE == MODE_CATWISE)) {
-	if (*p == '\\') goto skip_header;
+	if (*p == 0x5C) goto skip_header; // back-slash char
 	if (*p == '|') goto skip_header;
 	skipHeader = FALSE; // once we get past the header, do not skip any more
       }
 
+      // note CATWISE uses a different mapping
       getWISE_coords (p, &tstars[Ntstars].R, &tstars[Ntstars].D, Nbyte - offset);
+
       tstars[Ntstars].offset = offset; // offset within scan
       tstars[Ntstars].flag = FALSE;
@@ -186,4 +188,13 @@
 	}
 
+	if (Nave < 10) {
+	  fprintf (stderr, "pos: %12.6f %12.6f +/- %10.5f %10.5f : %12.6f %12.6f +/- %10.5f %10.5f\n",
+		   newcat->average[Nave].R, newcat->average[Nave].D, 
+		   newcat->average[Nave].dR, newcat->average[Nave].dD, 
+		   newcat->average[Nave].uR, newcat->average[Nave].uD, 
+		   newcat->average[Nave].duR, newcat->average[Nave].duD);
+	}
+	    
+
 	tstars[j].flag = TRUE;
 
Index: /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/loadwise_star_full.c
===================================================================
--- /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/loadwise_star_full.c	(revision 42210)
+++ /branches/eam_branches/ipp-20220316/Ohana/src/addstar/src/loadwise_star_full.c	(revision 42211)
@@ -10,4 +10,6 @@
 int setCatWISE_ab_flag (Measure *measure, char qual);
 
+# define CATWISE_EPOCH 1432771200 /* MJD 57170 */
+
 // fill in the data for a CatWISE double star.  takes a pointer to the start of the line the
 // RA and DEC have already been set
@@ -24,18 +26,29 @@
   // already been extracted.
 
-  measure[0].R    = tstars->R;
-  measure[0].D    = tstars->D;
-  measure[1].R    = tstars->R;
-  measure[1].D    = tstars->D;
+  // reference epoch for CATWise:
+  average[0].Tmean = CATWISE_EPOCH;
+
+  // correct the position information for the systematic corrections
+  double RA_SYS_OFFSET = RA_SYS_OFFRAW / cos(RAD_DEG*tstars->D);
+
+  average[0].R  = tstars->R + RA_SYS_OFFSET;
+  average[0].D  = tstars->D + DE_SYS_OFFSET;
+  average[0].dR = getDoubleNAN (line, 71, 79); // sig_ra -- add 5/1000 to avoid truncation
+  average[0].dD = getDoubleNAN (line, 80, 88); // sig_dec
 
   // P.M. values go on average:
-  average[0].uR  = getDoubleNAN (line, 1194, 1203); // PMRA
-  average[0].uD  = getDoubleNAN (line, 1204, 1213); // PMDec
+  average[0].uR  = getDoubleNAN (line, 1194, 1203) + uRA_SYS_OFFSET; // PMRA
+  average[0].uD  = getDoubleNAN (line, 1204, 1213) + uDE_SYS_OFFSET; // PMDec
   average[0].duR = getDoubleNAN (line, 1214, 1222); // sigPMRA 
   average[0].duD = getDoubleNAN (line, 1223, 1231); // sigPMDec
 
+  measure[0].R     = average[0].R;
+  measure[0].D     = average[0].D;
+  measure[1].R     = average[0].R;
+  measure[1].D     = average[0].D;
+
   // I can assign dRA and dDEC to dX and dY if I can consistently set posangle and pltscale
-  measure[0].dXccd = ToShortPixels(getDoubleNAN (line, 71, 79) + 0.005); // sig_ra -- add 5/1000 to avoid truncation
-  measure[0].dYccd = ToShortPixels(getDoubleNAN (line, 80, 88) + 0.005); // sig_dec
+  measure[0].dXccd = ToShortPixels(average[0].dR + 0.005); // sig_ra -- add 5/1000 to avoid truncation
+  measure[0].dYccd = ToShortPixels(average[0].dD + 0.005); // sig_dec
   measure[0].posangle = 0.0;
   measure[0].pltscale = 1.0;
