Index: trunk/ippToPsps/config/tables.IN.vot
===================================================================
--- trunk/ippToPsps/config/tables.IN.vot	(revision 39564)
+++ trunk/ippToPsps/config/tables.IN.vot	(revision 39565)
@@ -659,5 +659,5 @@
 	  <TR><TD>DIFF_WITH_SINGLE</TD>     <TD>0x00000001</TD><TD>1         </TD><TD>Difference source matched to a single positive detection.</TD></TR>
 	  <TR><TD>DIFF_WITH_DOUBLE</TD>     <TD>0x00000002</TD><TD>2         </TD><TD>Difference source matched to positive detections in both images.</TD></TR>
-	  <TR><TD>MATCHED</TD>              <TD>0x00000004</TD><TD>4         </TD><TD>Difference source matched to positive detections in both images.</TD></TR>
+	  <TR><TD>MATCHED</TD>              <TD>0x00000004</TD><TD>4         </TD><TD>source generated based on another image (forced photometry at source location).</TD></TR>
 	  <TR><TD>ON_SPIKE</TD>             <TD>0x00000008</TD><TD>8         </TD><TD>More than 25% of (PSF-weighted) pixels land on diffraction spike.</TD></TR>
 	  <TR><TD>ON_STARCORE</TD>          <TD>0x00000010</TD><TD>16        </TD><TD>More than 25% of (PSF-weighted) pixels land on starcore.</TD></TR>
@@ -753,12 +753,12 @@
 	  <TR><TD>POOR</TD>             <TD>0x00000002</TD><TD>2              </TD><TD>Used within relphot; skip star.</TD></TR>
           <TR><TD>ICRF_QSO</TD>         <TD>0x00000004</TD><TD>4              </TD><TD>object IDed with known ICRF quasar (may have ICRF position measurement)</TD></TR>
-          <TR><TD>OTHEF_QSO</TD>        <TD>0x00000008</TD><TD>8              </TD><TD>identified as likely QSO (Hernitschek et al 2015), without ICRF reference data</TD></TR>
-          <TR><TD>TRANSIENT</TD>        <TD>0x00000010</TD><TD>16             </TD><TD>identified as a non-periodic (stationary) transient</TD></TR>
-          <TR><TD>VARIABLE</TD>         <TD>0x00000020</TD><TD>32             </TD><TD>identified as a periodic variable</TD></TR>
-          <TR><TD>RRLYRA</TD>           <TD>0x00000040</TD><TD>64             </TD><TD>identified as likely RR Lyra (Hernitschek et al 2015)</TD></TR>
-          <TR><TD>HAS_SOLSYS_DET</TD>   <TD>0x00000080</TD><TD>128            </TD><TD>identified with a known solar-system object (asteroid or other)</TD></TR>
-          <TR><TD>ALL_SOLSYS_DET</TD>   <TD>0x00000100</TD><TD>256            </TD><TD>identified with a known solar-system object (asteroid or other)</TD></TR>
-          <TR><TD>UNDEF_1</TD>          <TD>0x00000200</TD><TD>512            </TD><TD>Unused bit value.</TD></TR>
-          <TR><TD>UNDEF_2</TD>          <TD>0x00000400</TD><TD>1024           </TD><TD>Unused bit value.</TD></TR>
+          <TR><TD>HERN_QSO_P60</TD>     <TD>0x00000008</TD><TD>8              </TD><TD>identified as likely QSO (Hernitschek et al 2015), P_QSO >= 0.60</TD></TR>
+          <TR><TD>HERN_QSO_P05</TD>     <TD>0x00000010</TD><TD>16             </TD><TD>identified as possible QSO (Hernitschek et al 2015), P_QSO >= 0.05</TD></TR>
+          <TR><TD>HERN_RRL_P60</TD>     <TD>0x00000020</TD><TD>32             </TD><TD>identified as likely RR Lyra (Hernitschek et al 2015), P_RRLyra >= 0.60</TD></TR>
+          <TR><TD>HERN_RRL_P05</TD>     <TD>0x00000040</TD><TD>64             </TD><TD>identified as possible RR Lyra (Hernitschek et al 2015), P_RRLyra >= 0.05</TD></TR>
+          <TR><TD>HERN_VARIABLE</TD>    <TD>0x00000080</TD><TD>128            </TD><TD>identified as a variable based on ChiSq (Hernitschek et al 2015)</TD></TR>
+          <TR><TD>TRANSIENT</TD>        <TD>0x00000100</TD><TD>256            </TD><TD>identified as a non-periodic (stationary) transient</TD></TR>
+          <TR><TD>HAS_SOLSYS_DET</TD>   <TD>0x00000200</TD><TD>512            </TD><TD>at least one detection identified with a known solar-system object (asteroid or other).</TD></TR>
+          <TR><TD>MOST_SOLSYS_DET</TD>  <TD>0x00000400</TD><TD>1024           </TD><TD>most detections identified with a known solar-system object (asteroid or other).</TD></TR>
           <TR><TD>LARGE_PM</TD>         <TD>0x00000800</TD><TD>2048           </TD><TD>star with large proper motion</TD></TR>
           <TR><TD>RAW_AVE</TD>          <TD>0x00001000</TD><TD>4096           </TD><TD>simple weighted average position was used (no IRLS fitting)</TD></TR>
@@ -777,8 +777,8 @@
           <TR><TD>GOOD</TD>             <TD>0x02000000</TD><TD>33554432       </TD><TD>good-quality measurement in our data (eg,PS)</TD></TR>
           <TR><TD>GOOD_ALT</TD>         <TD>0x04000000</TD><TD>67108864       </TD><TD>good-quality measurement in  external data (eg, 2MASS)</TD></TR>
-          <TR><TD>GOOD_STACK</TD>       <TD>0x08000000</TD><TD>134217728      </TD><TD>good-quality object in the stack (> 1 good stack)</TD></TR>
-          <TR><TD>BEST_STACK</TD>       <TD>0x10000000</TD><TD>268435456      </TD><TD>the primary stack measurement are the best measurements</TD></TR>
-          <TR><TD>SUSPECT_STACK</TD>    <TD>0x20000000</TD><TD>536870912      </TD><TD>suspect object in the stack (> 1 good or suspect stack, less than 2 good)</TD></TR>
-          <TR><TD>BAD_STACK</TD>        <TD>0x40000000</TD><TD>1073741824     </TD><TD>good-quality object in the stack (> 1 good stack)</TD></TR>
+          <TR><TD>GOOD_STACK</TD>       <TD>0x08000000</TD><TD>134217728      </TD><TD>good-quality object in the stack (> 1 good stack measurement)</TD></TR>
+          <TR><TD>BEST_STACK</TD>       <TD>0x10000000</TD><TD>268435456      </TD><TD>the primary stack measurements are the best measurements</TD></TR>
+          <TR><TD>SUSPECT_STACK</TD>    <TD>0x20000000</TD><TD>536870912      </TD><TD>suspect object in the stack (no more than 1 good measurement, 2 or more suspect or good stack measurement)</TD></TR>
+          <TR><TD>BAD_STACK</TD>        <TD>0x40000000</TD><TD>1073741824     </TD><TD>poor-quality stack object (no more than 1 good or suspect measurement)</TD></TR>
         </TABLEDATA>
       </DATA>
@@ -809,16 +809,16 @@
 	  <TR><TD>SECF_USE_UBERCAL</TD>  <TD>0x00000008</TD><TD>8              </TD><TD>Ubercal photometry used in average measurement.</TD></TR>
 	  <TR><TD>SECF_HAS_PS1</TD>      <TD>0x00000010</TD><TD>16             </TD><TD>PS1 photometry used in average measurement.</TD></TR>
-	  <TR><TD>SECF_HAS_STACK</TD>    <TD>0x00000020</TD><TD>32             </TD><TD>PS1 stack photometry exists.</TD></TR>
+	  <TR><TD>SECF_HAS_PS1_STACK</TD><TD>0x00000020</TD><TD>32             </TD><TD>PS1 stack photometry exists.</TD></TR>
 
 	  <TR><TD>SECF_HAS_TYCHO</TD>    <TD>0x00000040</TD><TD>64             </TD><TD>Tycho photometry used for synthetic magnitudes.</TD></TR>
 	  <TR><TD>SECF_FIX_SYNTH</TD>    <TD>0x00000080</TD><TD>128            </TD><TD>Synthetic magnitudes repaired with zeropoint map.</TD></TR>
 
-	  <TR><TD>PHOTOM_PASS_0</TD>     <TD>0x00000100</TD><TD>256            </TD><TD>Average magnitude calculated in 0th pass.</TD></TR>
-	  <TR><TD>PHOTOM_PASS_1</TD>     <TD>0x00000200</TD><TD>512            </TD><TD>Average magnitude calculated in 1th pass.</TD></TR>
-	  <TR><TD>PHOTOM_PASS_2</TD>     <TD>0x00000400</TD><TD>1024           </TD><TD>Average magnitude calculated in 2th pass.</TD></TR>
-	  <TR><TD>PHOTOM_PASS_3</TD>     <TD>0x00000800</TD><TD>2048           </TD><TD>Average magnitude calculated in 3th pass.</TD></TR>
-	  <TR><TD>PHOTOM_PASS_4</TD>     <TD>0x00001000</TD><TD>4096           </TD><TD>Average magnitude calculated in 4th pass.</TD></TR>
-	  <TR><TD>PSPS_OBJ_EXT</TD>      <TD>0x00002000</TD><TD>8192           </TD><TD>Extended in this band (PSPS only).</TD></TR>
+	  <TR><TD>SECF_RANK_0</TD>       <TD>0x00000100</TD><TD>256            </TD><TD>Average magnitude uses only rank 0 detections.</TD></TR>
+	  <TR><TD>SECF_RANK_1</TD>       <TD>0x00000200</TD><TD>512            </TD><TD>Average magnitude uses only rank 1 detections.</TD></TR>
+	  <TR><TD>SECF_RANK_2</TD>       <TD>0x00000400</TD><TD>1024           </TD><TD>Average magnitude uses only rank 2 detections.</TD></TR>
+	  <TR><TD>SECF_RANK_3</TD>       <TD>0x00000800</TD><TD>2048           </TD><TD>Average magnitude uses only rank 3 detections.</TD></TR>
+	  <TR><TD>SECF_RANK_4</TD>       <TD>0x00001000</TD><TD>4096           </TD><TD>Average magnitude uses only rank 4 detections.</TD></TR>
 	  <TR><TD>SECF_STACK_PRIMARY</TD><TD>0x00004000</TD><TD>16384          </TD><TD>PS1 stack photometry comes from primary skycell.</TD></TR>
+	  <TR><TD>SECF_OBJ_EXT</TD>      <TD>0x01000000</TD><TD>16777216       </TD><TD>Extended in this band.</TD></TR>
         </TABLEDATA>
       </DATA>
@@ -847,7 +847,8 @@
 	  <TR><TD>QF_OBJ_GOOD</TD>         <TD>0x00000004</TD><TD>4       </TD><TD>Good-quality measurement in our data (eg,PS).</TD></TR>
 	  <TR><TD>QF_OBJ_GOOD_ALT</TD>     <TD>0x00000008</TD><TD>8       </TD><TD>Good-quality measurement in  external data (eg, 2MASS).</TD></TR>
-	  <TR><TD>QF_OBJ_GOOD_STACK</TD>   <TD>0x00000010</TD><TD>16      </TD><TD>Good-quality object in the stack (> 1 good stack).</TD></TR>
-	  <TR><TD>QF_OBJ_SUSPECT_STACK</TD><TD>0x00000020</TD><TD>32      </TD><TD>Suspect object in the stack (> 1 good or suspect stack, less tham 2 good).</TD></TR>
-	  <TR><TD>QF_OBJ_BAD_STACK</TD>    <TD>0x00000040</TD><TD>64      </TD><TD>Good-quality object in the stack (> 1 good stack).</TD></TR>
+	  <TR><TD>QF_OBJ_GOOD_STACK</TD>   <TD>0x00000010</TD><TD>16      </TD><TD>good-quality object in the stack (> 1 good stack measurement)</TD></TR>
+	  <TR><TD>QF_OBJ_BEST_STACK</TD>   <TD>0x00000020</TD><TD>32      </TD><TD>the primary stack measurements are the best measurements.</TD></TR>
+	  <TR><TD>QF_OBJ_SUSPECT_STACK</TD><TD>0x00000040</TD><TD>64      </TD><TD>suspect object in the stack (no more than 1 good measurement, 2 or more suspect or good stack measurement).</TD></TR>
+	  <TR><TD>QF_OBJ_BAD_STACK</TD>    <TD>0x00000080</TD><TD>64      </TD><TD>poor-quality stack object (no more than 1 good or suspect measurement).</TD></TR>
 	</TABLEDATA>
       </DATA>
Index: trunk/ippToPsps/jython/objectbatch.py
===================================================================
--- trunk/ippToPsps/jython/objectbatch.py	(revision 39564)
+++ trunk/ippToPsps/jython/objectbatch.py	(revision 39565)
@@ -147,7 +147,12 @@
             # find Nsecfilt (or save in the db with dvopsps)
 
-            # the math below depends on filterCount = Nsecfilt and MeanObject.row being 1 counting but cps being 0 counting?
-            # cps.row has a count of MeanObject.row * Nsecfilt + Nfilter 
-            #  " + cpsTable + " AS cps ON (cps.row = (MeanObject.row* " + str(filterCount) + ")-(" + str(filterCount) + " - " + str(filter[0]) + ")) \
+            # the math below depends on filterCount = Nsecfilt and
+            # both MeanObject.row and cps.row being 1 counting, and
+            # filter[0] also being 1 counting
+
+            # cps.row - 1 = (cpt.row - 1)*Nsecfilt + (filter[0] - 1)
+            # cps.row     = cpt.row * Nsecfilt - (Nsecfilt - filter[0])
+            # cps.row     = cpt.row * Nsecfilt - Nsecfilt + filter[0]
+            # [note that the sql below has parenthesis around (Nsecfilt - filter[0])
 
             sql = "UPDATE MeanObject JOIN \
@@ -169,6 +174,5 @@
                    ,MeanObject." + filter[1] + "MeanApMagStd   = MAG_AP_STDEV \
                    ,MeanObject." + filter[1] + "MeanApMagNpt   = NUSED_AP \
-                   ,MeanObject." + filter[1] + "Flags = (0x7fff & FLAGS) | ((FLAGS >> 11) & 0x2000) "
-
+                   ,MeanObject." + filter[1] + "Flags          = FLAGS "
 
             try: self.scratchDb.execute(sql)
@@ -301,5 +305,5 @@
         sqlLine.group("processingVersion",     "'" + str(self.skychunk.processingVersion) + "'")
         sqlLine.group("objInfoFlag",     "FLAGS") 
-        sqlLine.group("qualityFlag",     "FLAGS >> 24 & 0xFF")
+        sqlLine.group("qualityFlag",     "FLAGS >> 23 & 0xFF")
         sqlLine.group("raStack",         "RA_STK")
         sqlLine.group("decStack",        "DEC_STK") 
@@ -339,57 +343,64 @@
         self.updateObjectThinFromCps(cpsTableName)
 
-        # XXX EAM 20140724 : is this necessary??
-        #objects can have out of range ra dec in dvo - need to find and kill them at the end
-
-        self.logger.infoPair("Determining", "ra/dec range")
-
-        raMin = self.scratchDb.getFromdvoSkyTable("R_MIN",self.region)
-        raMax = self.scratchDb.getFromdvoSkyTable("R_MAX",self.region)
-        decMin = self.scratchDb.getFromdvoSkyTable("D_MIN",self.region)
-        decMax = self.scratchDb.getFromdvoSkyTable("D_MAX",self.region)
-
-        self.logger.infoPair("R_MIN", raMin)
-        self.logger.infoPair("R_MAX", raMax)
-        self.logger.infoPair("D_MIN", decMin)
-        self.logger.infoPair("D_MAX", decMax)
-        #count out of range
-
-        sql = "SELECT count(*) FROM ObjectThin where \
-              ObjectThin.decMean > " + str(decMax) + " \
-              or ObjectThin.decMean < " + str(decMin) + " \
-              or ObjectThin.raMean > " + str(raMax) + " \
-              or ObjectThin.raMean < " + str(raMin)       
-    
-        rs = self.scratchDb.executeQuery(sql)
-        
-        rs.first()
-        nToDelete = rs.getInt(1)
-        
-        #delete out of range
-        
- 
-        sql = "DELETE FROM ObjectThin where \
-              ObjectThin.decMean > (" + str(decMax) + " + .0033) or \
-              ObjectThin.decMean < (" + str(decMin) + " - .0033) or \
-              ObjectThin.raMean > (" + str(raMax) + " + .0033) or \
-              ObjectThin.raMean < (" + str(raMin) + " - .0033)" 
-        self.logger.infoPair("Deleting", str(nToDelete) + " objects outside of ra/dec range")
-
-        try:
-            self.scratchDb.execute(sql)
-        except:
-            self.logger.errorPair("Couldn't cull outsiders from ObjectThin table", sql)
-            raise
-
-        ##Don't do this till after MeanObject
-        ##self.dvoObjects.purgeRegion(self.region)
+        if False:
+            # this chunk of code deletes objects which are out of ra,dec range for the table.
+            # this was a problem in an early version of DVO for cases where the astrometry went insane.
+            # this causes problems for the ra = 0,360 boundary (the test below does not handle that situation)
+            # and the restrictions below are poorly defined for the regions near the pole.
+            
+            # in any case, ObjectThin needs to maintain the same order
+            # as the cpt table until MeanObjects have been created or
+            # the join to the cps table will fail
+
+            # XXX EAM 20140724 : is this necessary??
+            # objects can have out of range ra dec in dvo - need to find and kill them at the end
+
+            self.logger.infoPair("Determining", "ra/dec range")
+    
+            raMin = self.scratchDb.getFromdvoSkyTable("R_MIN",self.region)
+            raMax = self.scratchDb.getFromdvoSkyTable("R_MAX",self.region)
+            decMin = self.scratchDb.getFromdvoSkyTable("D_MIN",self.region)
+            decMax = self.scratchDb.getFromdvoSkyTable("D_MAX",self.region)
+    
+            self.logger.infoPair("R_MIN", raMin)
+            self.logger.infoPair("R_MAX", raMax)
+            self.logger.infoPair("D_MIN", decMin)
+            self.logger.infoPair("D_MAX", decMax)
+            #count out of range
+    
+            sql = "SELECT count(*) FROM ObjectThin where \
+                  ObjectThin.decMean > " + str(decMax) + " \
+                  or ObjectThin.decMean < " + str(decMin) + " \
+                  or ObjectThin.raMean > " + str(raMax) + " \
+                  or ObjectThin.raMean < " + str(raMin)       
+        
+            rs = self.scratchDb.executeQuery(sql)
+            
+            rs.first()
+            nToDelete = rs.getInt(1)
+            
+            #delete out of range
+            
+     
+            sql = "DELETE FROM ObjectThin where \
+                  ObjectThin.decMean > (" + str(decMax) + " + .0033) or \
+                  ObjectThin.decMean < (" + str(decMin) + " - .0033) or \
+                  ObjectThin.raMean > (" + str(raMax) + " + .0033) or \
+                  ObjectThin.raMean < (" + str(raMin) + " - .0033)" 
+            self.logger.infoPair("Deleting", str(nToDelete) + " objects outside of ra/dec range")
+    
+            try:
+                self.scratchDb.execute(sql)
+            except:
+                self.logger.errorPair("Couldn't cull outsiders from ObjectThin table", sql)
+                raise
+
         self.logger.infoPair("updatePspsUniqueIDs","start")
         self.updatePspsUniqueIDs()
         self.logger.infoPair("updatePspsUniqueIDs","end")
+
         self.logger.infoPair("Dropping row column from", "ObjectThin table")
         self.scratchDb.dropColumn("ObjectThin", "row")
-        ##self.logger.infoPair("Purging from scratch Db", self.region + " region")
         self.logger.infoPair("Dropped row column", "objectThin")
-        ##Don't do this till after MeanObject
 
         self.setMinMaxObjID(["ObjectThin"])
@@ -415,9 +426,4 @@
         self.scratchDb.addRowCountColumn("MeanObject", "row")
 
-
-
-        
-
-        ##self.scratchDb.addRowCountColumn(cpsTableName, "row")
         self.logger.infoPair("update MeanObjects from ","cps table")
         self.updateMeanObjectFromCps(cpsTableName)
@@ -434,8 +440,14 @@
 
         if not self.populateObjectThinTable(): return False
-        #if not self.populateObjectCalColorTable(): return False
         if not self.populateMeanObjectTable(): return False
 
         # now remove the objID duplicates. We could not do this before as cpt/cps tables relate by row number
+
+        ### XXX the code below first removes duplicate objID entries
+        ### from ObjectThin, then does the same for MeanObject.  This
+        ### is a big problem: we have no guarantee that the surviving
+        ### rows are the correct matched rows.
+
+        ### force objID uniqueness on *** ObjectThin ***
         self.logger.infoPair("Forcing uniqueness on", "objID in ObjectThin table")
         rowCountBefore = self.scratchDb.getRowCount("ObjectThin")
@@ -457,4 +469,5 @@
         self.logger.infoPair("Number of duplicated objIDs removed", "%d out of %d" % ((rowCountBefore - rowCountAfter), rowCountBefore))
 
+        ### force objID uniqueness on *** MeanObject ***
         self.logger.infoPair("Forcing uniqueness on", "objID in MeanObject table")
         rowCountBefore = self.scratchDb.getRowCount("MeanObject")
@@ -476,9 +489,6 @@
         self.logger.infoPair("Number of duplicated objIDs removed", "%d out of %d" % ((rowCountBefore - rowCountAfter), rowCountBefore))
 
+        # delete the cpt, cps tables from the scratch mysql (or we will run out of space)
         self.dvoObjects.purgeRegion(self.region)
 
-        #this is abuse of something but this is how I get the object batches to crash to further investigate them
-        
-#        rowCountAfter = self.scratchDb.getRowCount("Object")
-        return True
-#        return False
+        return True
