Index: /trunk/Ohana/src/relastro/src/high_speed_objects.c
===================================================================
--- /trunk/Ohana/src/relastro/src/high_speed_objects.c	(revision 28200)
+++ /trunk/Ohana/src/relastro/src/high_speed_objects.c	(revision 28201)
@@ -9,8 +9,24 @@
 
   off_t i, j, m, J, Ni, ni, nj, Nj, *N1, Nslow, NgroupA, NgroupB;
-  int *slowMoving, *groupA, *groupB, status, foundA, foundB, Nmatch;
+  int *slowMoving, *groupA, *groupB, status, foundA, foundB, Nmatch, valid;
   double *X1, *Y1;
   double dX, dY, dR, RADIUS2;
   Coords tcoords;
+
+  int ycode, yNsec, zcode, zNsec, jcode, jNsec, USNO_R, USNO_N, Nsecfilt;
+
+  Nsecfilt = GetPhotcodeNsecfilt();
+
+  ycode = GetPhotcodeCodebyName("y");
+  yNsec = GetPhotcodeNsec(ycode);
+  
+  zcode = GetPhotcodeCodebyName("y");
+  zNsec = GetPhotcodeNsec(zcode);
+  
+  jcode = GetPhotcodeCodebyName("J");
+  jNsec = GetPhotcodeNsec(jcode);
+  
+  USNO_R = GetPhotcodeCodebyName("USNO_RED");
+  USNO_N = GetPhotcodeCodebyName("USNO_N");
 
   // high-speed between different surveys (easier case):
@@ -69,14 +85,78 @@
     // * group A : require 
 
+    // 2MASS detections:
     if (foundA && !foundB) {
-      groupA[i] = TRUE;
-      NgroupA ++;
-      continue;
-    }
-
-    if (!foundA && foundB) {
-      groupB[i] = TRUE;
-      NgroupB ++;
-      continue;
+      // average-based tests:
+      valid = TRUE;
+      valid &= !(catalog[0].average[i].flags & 0x40000);
+      valid &= (catalog[0].average[i].flags & 0x80000);
+      valid &= (catalog[0].secfilt[i*Nsecfilt + yNsec].M < 1.0);
+      valid &= (catalog[0].secfilt[i*Nsecfilt + zNsec].M < 1.0);
+      // XXX ignoring the color restriction for now
+      
+      // measure-based tests:
+      m = catalog[0].average[i].measureOffset;
+      for (j = 0; valid && (j < catalog[0].average[i].Nmeasure); j++, m++) {
+	if (catalog[0].measure[m].photcode == USNO_R) {
+	  valid &= ((catalog[0].measure[m].M > 20.0) || (catalog[0].measure[m].M < 1.0));
+	}
+	if (catalog[0].measure[m].photcode == USNO_N) {
+	  valid &= ((catalog[0].measure[m].M > 18.5) || (catalog[0].measure[m].M < 1.0));
+	}
+      }
+
+      // ((objflags & 524288) == 524288) && 
+      // ((objflags & 262144) == 0) && 
+      // (z<1.0) && 
+      // (y<1.0) && 
+      // ((yp[$i]-J)>1.25) && ((yp[$i]-J)<5.0) && 
+      // ((USNO_RED<1.0)||(USNO_RED>20.0)) && 
+      // ((USNO_N>18.0)||(USNO_N<1.0))
+
+      if (valid) {
+	groupA[i] = TRUE;
+	NgroupA ++;
+	continue;
+      }
+    }
+
+    // PS1 detections:
+    if (foundB && !foundA) {
+
+      // average-based tests:
+      valid = TRUE;
+      valid &= !(catalog[0].average[i].flags & 0x10000);
+      valid &= (catalog[0].average[i].flags & 0x20000);
+      valid &= (catalog[0].secfilt[i*Nsecfilt + jNsec].M < 1.0);
+      valid &= (catalog[0].secfilt[i*Nsecfilt + yNsec].Nused > 1);
+      valid &= (catalog[0].secfilt[i*Nsecfilt + yNsec].dM < 0.2);
+      // XXX ignoring the z-band restriction for now
+      
+      // measure-based tests:
+      m = catalog[0].average[i].measureOffset;
+      for (j = 0; valid && (j < catalog[0].average[i].Nmeasure); j++, m++) {
+	if (catalog[0].measure[m].photcode == USNO_R) {
+	  valid &= ((catalog[0].measure[m].M > 20.0) || (catalog[0].measure[m].M < 1.0));
+	}
+	if (catalog[0].measure[m].photcode == USNO_N) {
+	  valid &= ((catalog[0].measure[m].M > 18.5) || (catalog[0].measure[m].M < 1.0));
+	}
+      }
+
+      // (abs(glat)>15.0) && 
+      // ((objflags & 65536) == 0) && 
+      // ((objflags & 131072) == 131072) &&
+      // (J<1.0) && 
+      // (y:nphot>1) && 
+      // (y:err<0.2) && 
+      // ((USNO_RED>20.0)||(USNO_RED<1.0)) && 
+      // ((USNO_N>18.5)||(USNO_N<1.0)) && 
+      // ((z<1.0)||(z:nphot == 1)||((z:nphot>1)&&((z-y)>0.2)))
+
+      if (valid) {
+	groupB[i] = TRUE;
+	NgroupB ++;
+	continue;
+      }
     }
 
@@ -156,5 +236,5 @@
       Nj = N1[J];
 
-      if (0) fprintf (stderr, "match %d = %lld %lld : %f %f : %f %f : %f\n", 
+      if (1) fprintf (stderr, "match %d = %lld %lld : %f %f : %f %f : %f\n", 
 	       Nmatch, (long long) i, (long long) J,
 	       catalog[0].average[Ni].R, catalog[0].average[Ni].D,
