Index: trunk/Ohana/src/relastro/src/bcatalog.c
===================================================================
--- trunk/Ohana/src/relastro/src/bcatalog.c	(revision 17211)
+++ trunk/Ohana/src/relastro/src/bcatalog.c	(revision 17212)
@@ -4,11 +4,12 @@
   
   int i, j, k, offset, found;
-  int NAVERAGE, NMEASURE, Naverage, Nmeasure, Nm;
+  int NAVERAGE, NMEASURE, Naverage, Nmeasure, Nm, Nsecfilt;
   float mag;
+  int mask;
+  PhotCode *code;
 
-  // XXX PhotNsec as a global is a bad idea; either get it from catalog
-  // or get it from:
-  // Nsecfilt = GetPhotcodeNsecfilt ();
-  // assert (catalog[0].Nsecfilt == Nsecfilt);
+  // XXX in the future, use catalog[0].Nsecfilt only?  allow catalogs to have variable Nsecfilt?
+  Nsecfilt = GetPhotcodeNsecfilt ();
+  assert (catalog[0].Nsecfilt == Nsecfilt);
 
   /* we are moving only the subset of measurements from catalog[0] to subcatalog[0] */
@@ -16,5 +17,5 @@
   NMEASURE = 1000;
   ALLOCATE (subcatalog[0].average, Average, NAVERAGE);
-  ALLOCATE (subcatalog[0].secfilt, SecFilt, NAVERAGE*PhotNsec);
+  ALLOCATE (subcatalog[0].secfilt, SecFilt, NAVERAGE*Nsecfilt);
   ALLOCATE (subcatalog[0].measure, Measure, NMEASURE);
   Nmeasure = Naverage = 0;
@@ -27,10 +28,12 @@
     subcatalog[0].average[Naverage] = catalog[0].average[i];
     subcatalog[0].average[Naverage].measureOffset = Nmeasure;
-    for (j = 0; j < PhotNsec; j++) {
-      subcatalog[0].secfilt[PhotNsec*Naverage+j] = catalog[0].secfilt[PhotNsec*i+j];
+    for (j = 0; j < Nsecfilt; j++) {
+      subcatalog[0].secfilt[Nsecfilt*Naverage+j] = catalog[0].secfilt[Nsecfilt*i+j];
     }
 
     if (RESET) {
       // XXX reset the ra,dec coords?
+      // XXX define astrometry vs photometry average.dbFlags
+      // XXX put photometry flags in secfilt (ie, per average mag?)
       subcatalog[0].average[Naverage].code &= ~ID_STAR_FEW;
       subcatalog[0].average[Naverage].code &= ~ID_STAR_POOR;
@@ -42,11 +45,20 @@
       offset = catalog[0].average[i].measureOffset + j;
 
-      /* select measurements by photcode, if specified */
-      if (Nphotcodes > 0) {
+      /* select measurements by photcode, or equiv photcode, if specified */
+      if (NphotcodesKeep > 0) {
 	found = FALSE;
-	for (k = 0; (k < Nphotcodes) && !found; k++) {
-	  if (photcodes[k][0].code == catalog[0].measure[offset].photcode) found = TRUE;
+	for (k = 0; (k < NphotcodesKeep) && !found; k++) {
+	  if (photcodesKeep[k][0].code == catalog[0].measure[offset].photcode) found = TRUE;
+	  if (photcodesKeep[k][0].code == GetPhotcodeEquivCodebyCode(catalog[0].measure[offset].photcode)) found = TRUE;
 	}
 	if (!found) continue;
+      }
+      if (NphotcodesSkip > 0) {
+	found = FALSE;
+	for (k = 0; (k < NphotcodesSkip) && !found; k++) {
+	  if (photcodesSkip[k][0].code == catalog[0].measure[offset].photcode) found = TRUE;
+	  if (photcodesSkip[k][0].code == GetPhotcodeEquivCodebyCode(catalog[0].measure[offset].photcode)) found = TRUE;
+	}
+	if (found) continue;
       }
 
@@ -61,5 +73,13 @@
 
       /* select measurements by quality */
-      if (PhotFlagSelect && (catalog[0].measure[offset].photFlags & PhotFlagValue)) continue;
+      if (PhotFlagSelect) {
+	if (PhotFlagBad) {
+	  mask = PhotFlagBad;
+	} else {
+	  code = GetPhotcodebyCode (catalog[0].measure[offset].photcode);
+	  mask = code[0].astromBadMask;
+	}
+	if (mask & catalog[0].measure[offset].photFlags) continue;
+      }
 
       /* select measurements by measurement error */
@@ -73,13 +93,23 @@
       }
 
-      subcatalog[0].measure[Nmeasure].dbFlags &= ~ID_MEAS_SKIP;
-      subcatalog[0].measure[Nmeasure]        = catalog[0].measure[offset];
-      subcatalog[0].measure[Nmeasure].averef = Naverage;
+      // re-assess on each run of relastro if a measurement should be used
+
+      // NOCAL : this flag is used to mark measurements which must be ignored for this
+      // analysis.  an example would be time ranges or photcodes which are ignored.  NOCAL
+      // is internal only; it is not written out.
+
+      // SKIP : this flag is used to mark measurements currently ignored, but may be
+      // allowed before the analysis is complete.  for example, a star with measurements
+      // only near the edge of images will have this flag set for most of the analysis,
+      // but before the final average properties are calculated, these measurements may be
+      // allowed.
+
+      subcatalog[0].measure[Nmeasure].dbFlags &= ~ID_MEAS_SKIP_ASTROM;
+      subcatalog[0].measure[Nmeasure].dbFlags &= ~ID_MEAS_NOCAL;
+      subcatalog[0].measure[Nmeasure]          = catalog[0].measure[offset];
+      subcatalog[0].measure[Nmeasure].averef   = Naverage;
       if (RESET) { 
-	subcatalog[0].measure[Nmeasure].Mcal = 0;
-	subcatalog[0].measure[Nmeasure].dbFlags &= 0xff00;
-	subcatalog[0].measure[Nmeasure].dbFlags &= ~ID_MEAS_POOR;
+	subcatalog[0].measure[Nmeasure].dbFlags &= ~ID_MEAS_POOR_ASTROM;
 	subcatalog[0].measure[Nmeasure].dbFlags &= ~ID_MEAS_AREA;
-	subcatalog[0].measure[Nmeasure].dbFlags &= ~ID_MEAS_NOCAL;
       }
       Nmeasure ++;
@@ -95,15 +125,15 @@
       NAVERAGE += 50;
       REALLOCATE (subcatalog[0].average, Average, NAVERAGE);
-      REALLOCATE (subcatalog[0].secfilt, SecFilt, NAVERAGE*PhotNsec);
+      REALLOCATE (subcatalog[0].secfilt, SecFilt, NAVERAGE*Nsecfilt);
     }
   }
   REALLOCATE (subcatalog[0].average, Average, MAX (Naverage, 1));
   REALLOCATE (subcatalog[0].measure, Measure, MAX (Nmeasure, 1));
-  REALLOCATE (subcatalog[0].secfilt, SecFilt, PhotNsec*MAX (Naverage, 1));
+  REALLOCATE (subcatalog[0].secfilt, SecFilt, Nsecfilt*MAX (Naverage, 1));
   subcatalog[0].Naverage = Naverage;
   subcatalog[0].Nmeasure = Nmeasure;
   subcatalog[0].Nsecfilt = catalog[0].Nsecfilt;
-  subcatalog[0].Nsecf_mem = Naverage * PhotNsec;
-  assert (PhotNsec == catalog[0].Nsecfilt);
+  subcatalog[0].Nsecf_mem = Naverage * Nsecfilt;
+  assert (Nsecfilt == catalog[0].Nsecfilt);
 
   if (VERBOSE) {
