Index: branches/eam_branches/ipp-20120905/ippToPsps/config/OB/tables.vot
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/config/OB/tables.vot	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/config/OB/tables.vot	(revision 34735)
@@ -45,13 +45,4 @@
         <DESCRIPTION> Declination error</DESCRIPTION>
       </FIELD>
-      <FIELD name="cx" arraysize="1" datatype="double" unit="unknown">
-        <DESCRIPTION>Cartesian x</DESCRIPTION>
-      </FIELD>
-      <FIELD name="cy" arraysize="1" datatype="double" unit="unknown">
-        <DESCRIPTION>Cartesian y</DESCRIPTION>
-      </FIELD>
-      <FIELD name="cz" arraysize="1" datatype="double" unit="unknown">
-        <DESCRIPTION>Cartesian z</DESCRIPTION>
-      </FIELD>
       <FIELD name="lambda" arraysize="1" datatype="double" unit="degree">
         <DESCRIPTION> ecliptic longitude</DESCRIPTION>
@@ -66,10 +57,4 @@
         <DESCRIPTION> galactic latitude</DESCRIPTION>
       </FIELD>
-      <FIELD name="lsg" arraysize="1" datatype="double" unit="unknown">
-        <DESCRIPTION>supergalactic longitude</DESCRIPTION>
-      </FIELD>
-      <FIELD name="bsg" arraysize="1" datatype="double" unit="unknown">
-        <DESCRIPTION>supergalactic latitude</DESCRIPTION>
-      </FIELD>
       <FIELD name="nDetections" arraysize="1" datatype="short" unit="unknown">
         <DESCRIPTION>total number of detection measurements in all filters</DESCRIPTION>
@@ -201,8 +186,8 @@
         <DESCRIPTION> 80 pct w magnitude</DESCRIPTION>
       </FIELD>
-      <FIELD name="gStackPSFFlux" arraysize="1" datatype="float" unit="mag">
+      <FIELD name="gStackPSFMag" arraysize="1" datatype="float" unit="mag">
         <DESCRIPTION> g stack psf flux </DESCRIPTION>
       </FIELD>
-      <FIELD name="gStackPSFFluxErr" arraysize="1" datatype="double" unit="mag">
+      <FIELD name="gStackPSFMagErr" arraysize="1" datatype="double" unit="mag">
 	<DESCRIPTION> estimated error in g stack psf flux</DESCRIPTION>
       </FIELD>
@@ -216,8 +201,11 @@
         <DESCRIPTION>flags for g stack</DESCRIPTION>
       </FIELD>
-      <FIELD name="rStackPSFFlux" arraysize="1" datatype="float" unit="mag">
+      <FIELD name="gStackDetectID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>ODM detection identifier</DESCRIPTION>
+      </FIELD>
+      <FIELD name="rStackPSFMag" arraysize="1" datatype="float" unit="mag">
         <DESCRIPTION> r stack psf flux </DESCRIPTION>
       </FIELD>
-      <FIELD name="rStackPSFFluxErr" arraysize="1" datatype="double" unit="mag">
+      <FIELD name="rStackPSFMagErr" arraysize="1" datatype="double" unit="mag">
         <DESCRIPTION> estimated error in r stack psf flux</DESCRIPTION>
       </FIELD>
@@ -231,8 +219,11 @@
         <DESCRIPTION>flags for r stack</DESCRIPTION>
       </FIELD>
-      <FIELD name="iStackPSFFlux" arraysize="1" datatype="float" unit="mag">
+      <FIELD name="rStackDetectID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>ODM detection identifier</DESCRIPTION>
+      </FIELD>
+      <FIELD name="iStackPSFMag" arraysize="1" datatype="float" unit="mag">
         <DESCRIPTION> i stack psf flux </DESCRIPTION>
       </FIELD>
-      <FIELD name="iStackPSFFluxErr" arraysize="1" datatype="float" unit="mag">
+      <FIELD name="iStackPSFMagErr" arraysize="1" datatype="float" unit="mag">
         <DESCRIPTION> estimated error in i stack psf flux</DESCRIPTION>
       </FIELD>
@@ -246,8 +237,11 @@
         <DESCRIPTION>flags for i stack</DESCRIPTION>
       </FIELD>
-      <FIELD name="zStackPSFFlux" arraysize="1" datatype="float" unit="mag">
+      <FIELD name="iStackDetectID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>ODM detection identifier</DESCRIPTION>
+      </FIELD>
+      <FIELD name="zStackPSFMag" arraysize="1" datatype="float" unit="mag">
         <DESCRIPTION> z stack psf flux </DESCRIPTION>
       </FIELD>
-      <FIELD name="zStackPSFFluxErr" arraysize="1" datatype="float" unit="mag">
+      <FIELD name="zStackPSFMagErr" arraysize="1" datatype="float" unit="mag">
         <DESCRIPTION> estimated error in z stack psf flux</DESCRIPTION>
       </FIELD>
@@ -261,8 +255,11 @@
         <DESCRIPTION>flags for z stack</DESCRIPTION>
       </FIELD>
-      <FIELD name="yStackPSFFlux" arraysize="1" datatype="float" unit="unknown">
+      <FIELD name="zStackDetectID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>ODM detection identifier</DESCRIPTION>
+      </FIELD>
+      <FIELD name="yStackPSFMag" arraysize="1" datatype="float" unit="unknown">
         <DESCRIPTION>y band stack PSF flux</DESCRIPTION>
       </FIELD>
-      <FIELD name="yStackPSFFluxErr" arraysize="1" datatype="float" unit="unknown">
+      <FIELD name="yStackPSFMagErr" arraysize="1" datatype="float" unit="unknown">
         <DESCRIPTION>y band stack psf flux err</DESCRIPTION>
       </FIELD>
@@ -276,6 +273,9 @@
         <DESCRIPTION>flags for y stack</DESCRIPTION>
       </FIELD>
-      <FIELD name="extra" arraysize="1" datatype="float" unit="unknown">
-        <DESCRIPTION>currently unused</DESCRIPTION>
+      <FIELD name="yStackDetectID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>ODM detection identifier</DESCRIPTION>
+      </FIELD>
+      <FIELD name="qfPerfect" arraysize="1" datatype="float" unit="unknown">
+        <DESCRIPTION>qf perfect</DESCRIPTION>
       </FIELD>
       <FIELD name="sgSep" arraysize="1" datatype="float" unit="unknown">
Index: branches/eam_branches/ipp-20120905/ippToPsps/config/P2/tables.vot
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/config/P2/tables.vot	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/config/P2/tables.vot	(revision 34735)
@@ -404,8 +404,8 @@
         <DESCRIPTION> estimated error in y</DESCRIPTION>
       </FIELD>
-      <FIELD name="instFlux" arraysize="1" datatype="float" unit="adu/s">
+      <FIELD name="psfFlux" arraysize="1" datatype="float" unit="adu/s">
         <DESCRIPTION> PSF instrumental flux</DESCRIPTION>
       </FIELD>
-      <FIELD name="instFluxErr" arraysize="1" datatype="float" unit="adu/s">
+      <FIELD name="psfFluxErr" arraysize="1" datatype="float" unit="adu/s">
         <DESCRIPTION> estimated error in flux</DESCRIPTION>
       </FIELD>
@@ -425,6 +425,6 @@
         <DESCRIPTION>PSF likelihood</DESCRIPTION>
       </FIELD>
-      <FIELD name="psfCf" arraysize="1" datatype="float" unit="unknown">
-        <DESCRIPTION>PSF coverage factor</DESCRIPTION>
+      <FIELD name="psfQf" arraysize="1" datatype="float" unit="unknown">
+        <DESCRIPTION>PSF qf</DESCRIPTION>
       </FIELD>
       <FIELD name="momentXX" arraysize="1" datatype="float" unit="arcsec">
@@ -437,14 +437,14 @@
         <DESCRIPTION> momeny YY</DESCRIPTION>
       </FIELD>
-      <FIELD name="apMag" arraysize="1" datatype="float" unit="magnitude">
-        <DESCRIPTION> Aperture magnitude</DESCRIPTION>
-      </FIELD>
-      <FIELD name="apMagErr" arraysize="1" datatype="float" unit="magnitude">
-        <DESCRIPTION> Aperture magnitude error</DESCRIPTION>
-      </FIELD>
-      <FIELD name="kronFlux" arraysize="1" datatype="float" unit="magnitude">
+      <FIELD name="apFlux" arraysize="1" datatype="float" unit="adu/s">
+        <DESCRIPTION> Aperture Flux</DESCRIPTION>
+      </FIELD>
+      <FIELD name="apFluxErr" arraysize="1" datatype="float" unit="adu/s">
+        <DESCRIPTION> Aperture Flux error</DESCRIPTION>
+      </FIELD>
+      <FIELD name="kronFlux" arraysize="1" datatype="float" unit="adu/s">
         <DESCRIPTION> Kron flux</DESCRIPTION>
       </FIELD>
-      <FIELD name="kronFluxErr" arraysize="1" datatype="float" unit="magnitude">
+      <FIELD name="kronFluxErr" arraysize="1" datatype="float" unit="adu/s">
         <DESCRIPTION> Kron flux error</DESCRIPTION>
       </FIELD>
@@ -455,17 +455,17 @@
         <DESCRIPTION> Kron radius error</DESCRIPTION>
       </FIELD>
-      <FIELD name="crLikelihood" arraysize="1" datatype="float" unit="unknown">
-        <DESCRIPTION>Likelihood the source is a cosmic ray</DESCRIPTION>
-      </FIELD>
-      <FIELD name="extendedLikelihood" arraysize="1" datatype="float" unit="unknown">
-        <DESCRIPTION>Likelihood the source is extended</DESCRIPTION>
+      <FIELD name="psfQfPerfect" arraysize="1" datatype="float" unit="unknown">
+        <DESCRIPTION>psf QF Perfect</DESCRIPTION>
+      </FIELD>
+      <FIELD name="psfChiSq" arraysize="1" datatype="float" unit="unknown">
+        <DESCRIPTION>PSF Chi sq</DESCRIPTION>
       </FIELD>
       <FIELD name="infoFlag" arraysize="1" datatype="long" unit="unknown">
         <DESCRIPTION>flag indicating provenance information</DESCRIPTION>
       </FIELD>
-      <FIELD name="sky" arraysize="1" datatype="float" unit="adu">
+      <FIELD name="sky" arraysize="1" datatype="float" unit="adu/s/pixel">
         <DESCRIPTION> PSF sky level at source</DESCRIPTION>
       </FIELD>
-      <FIELD name="skyErr" arraysize="1" datatype="float" unit="adu">
+      <FIELD name="skyErr" arraysize="1" datatype="float" unit="adu/s/pixel">
         <DESCRIPTION> estimated error in sky</DESCRIPTION>
       </FIELD>
@@ -539,4 +539,56 @@
       </DATA>
     </TABLE>
+    <TABLE name="DetectionCalib">
+      <DESCRIPTION>VOTable description of PSPS table DetectionCalib</DESCRIPTION>
+      <PARAM arraysize="1" datatype="char" ucd="meta.bib.author" name="Author" value="PSPS"></PARAM>
+      <FIELD name="objID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>ODM object identifier index</DESCRIPTION>
+      </FIELD>
+      <FIELD name="detectID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>ODM detection identifier index</DESCRIPTION>
+      </FIELD>
+      <FIELD name="ippObjID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>IPP object number</DESCRIPTION>
+      </FIELD>
+      <FIELD name="ippDetectID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>detection ID generated by IPP</DESCRIPTION>
+      </FIELD>
+      <FIELD name="filterID" arraysize="1" datatype="unsignedByte" unit="unknown">
+        <DESCRIPTION>filter identifier</DESCRIPTION>
+      </FIELD>
+      <FIELD name="surveyID" arraysize="1" datatype="unsignedByte" unit="unknown">
+        <DESCRIPTION>survey identifier</DESCRIPTION>
+      </FIELD>
+      <FIELD name="ra" arraysize="1" datatype="double" unit="degrees">
+        <DESCRIPTION>right ascension</DESCRIPTION>
+      </FIELD>
+      <FIELD name="dec" arraysize="1" datatype="double" unit="degrees">
+        <DESCRIPTION>declination</DESCRIPTION>
+      </FIELD>
+      <FIELD name="raErr" arraysize="1" datatype="float" unit="arcsec">
+        <DESCRIPTION>right ascension error</DESCRIPTION>
+      </FIELD>
+      <FIELD name="decErr" arraysize="1" datatype="float" unit="arcsec">
+        <DESCRIPTION>declination error</DESCRIPTION>
+      </FIELD>
+      <FIELD name="zp" arraysize="1" datatype="float" unit="magnitude">
+        <DESCRIPTION>zero point offset</DESCRIPTION>
+      </FIELD>
+      <FIELD name="zpErr" arraysize="1" datatype="float" unit="magnitude">
+        <DESCRIPTION>zerop point offset error</DESCRIPTION>
+      </FIELD>
+      <FIELD name="expTime" arraysize="1" datatype="float" unit="s">
+        <DESCRIPTION>exposure time</DESCRIPTION>
+      </FIELD>
+      <FIELD name="airMass" arraysize="1" datatype="float" unit="unknown">
+        <DESCRIPTION>airmass</DESCRIPTION>
+      </FIELD>
+      <FIELD name="dataRelease" arraysize="1" datatype="unsignedByte" unit="unknown">
+        <DESCRIPTION>Data release to propagate to the object</DESCRIPTION>
+      </FIELD>
+      <DATA>
+        <TABLEDATA></TABLEDATA>
+      </DATA>
+    </TABLE>
   </RESOURCE>
 </VOTABLE>
Index: branches/eam_branches/ipp-20120905/ippToPsps/config/ST/tables.vot
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/config/ST/tables.vot	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/config/ST/tables.vot	(revision 34735)
@@ -148,7 +148,4 @@
         <DESCRIPTION>projection cell identifier</DESCRIPTION>
       </FIELD>
-      <FIELD name="obsTime" arraysize="1" datatype="double">
-        <DESCRIPTION> Time of mid observation (unit = day)</DESCRIPTION>
-      </FIELD>
       <FIELD name="xPos" arraysize="1" datatype="float">
         <DESCRIPTION>measured x on CCD from PSF fit</DESCRIPTION>
@@ -163,8 +160,8 @@
         <DESCRIPTION>estimated error in y</DESCRIPTION>
       </FIELD>
-      <FIELD name="instFlux" arraysize="1" datatype="float">
+      <FIELD name="psfFlux" arraysize="1" datatype="float">
         <DESCRIPTION>PSF instrumental flux</DESCRIPTION>
       </FIELD>
-      <FIELD name="instFluxErr" arraysize="1" datatype="float">
+      <FIELD name="psfFluxErr" arraysize="1" datatype="float">
         <DESCRIPTION>estimated error in instrumental flux</DESCRIPTION>
       </FIELD>
@@ -193,7 +190,10 @@
         <DESCRIPTION>PSF likelihood</DESCRIPTION>
       </FIELD>
-      <FIELD name="psfCf" arraysize="1" datatype="float">
-        <DESCRIPTION>PSF coverage factor</DESCRIPTION>
-      </FIELD>
+      <FIELD name="psfQf" arraysize="1" datatype="float">
+        <DESCRIPTION>PSF Q factor</DESCRIPTION>
+      </FIELD>
+       <FIELD name="psfQfPerfect" arraysize="1" datatype="float">
+        <DESCRIPTION>PSF QF Perfect</DESCRIPTION>
+      </FIELD> 
       <FIELD name="momentXX" arraysize="1" datatype="float">
         <DESCRIPTION> moment XX (unit = arcsec)</DESCRIPTION>
@@ -223,21 +223,21 @@
         <DESCRIPTION> moment RH (unit = arcsec)</DESCRIPTION>
       </FIELD>
-      <FIELD name="apMag" arraysize="1" datatype="float">
-        <DESCRIPTION> Aperture magnitude (unit = magnitude)</DESCRIPTION>
-      </FIELD>
-      <FIELD name="apMagErr" arraysize="1" datatype="float">
-        <DESCRIPTION> Aperture magnitude error (unit = magnitude)</DESCRIPTION>
+      <FIELD name="apFlux" arraysize="1" datatype="float">
+        <DESCRIPTION> Aperture flux (unit = adu/s)</DESCRIPTION>
+      </FIELD>
+      <FIELD name="apFluxErr" arraysize="1" datatype="float">
+        <DESCRIPTION> Aperture flux error (unit = adu/s)</DESCRIPTION>
       </FIELD>
       <FIELD name="kronFlux" arraysize="1" datatype="float">
-        <DESCRIPTION> Kron flux (unit = magnitude)</DESCRIPTION>
+        <DESCRIPTION> Kron flux (unit = adu/s)</DESCRIPTION>
       </FIELD>
       <FIELD name="kronFluxErr" arraysize="1" datatype="float">
-        <DESCRIPTION> Kron flux error (unit = magnitude)</DESCRIPTION>
+        <DESCRIPTION> Kron flux error (unit = adu/s)</DESCRIPTION>
       </FIELD>
       <FIELD name="kronRad" arraysize="1" datatype="float">
         <DESCRIPTION> Kron radius (unit = arcsecs)</DESCRIPTION>
       </FIELD>
-      <FIELD name="kronRadErr" arraysize="1" datatype="float">
-        <DESCRIPTION> Kron radius error (unit = arcsecs)</DESCRIPTION>
+      <FIELD name="psfChiSq" arraysize="1" datatype="float">
+        <DESCRIPTION> psf chi sq</DESCRIPTION>
       </FIELD>
       <FIELD name="infoFlag" arraysize="1" datatype="long">
@@ -293,9 +293,9 @@
         <DESCRIPTION>stack identifier</DESCRIPTION>
       </FIELD>
-      <FIELD name="isophotMag" arraysize="1" datatype="float">
-        <DESCRIPTION>isophotal magnitude</DESCRIPTION>
-      </FIELD>
-      <FIELD name="isophotMagErr" arraysize="1" datatype="float">
-        <DESCRIPTION>estimated error in isophotal magnitude</DESCRIPTION>
+      <FIELD name="isophotFlux" arraysize="1" datatype="float">
+        <DESCRIPTION>isophotal flux</DESCRIPTION>
+      </FIELD>
+      <FIELD name="isophotFluxErr" arraysize="1" datatype="float">
+        <DESCRIPTION>estimated error in isophotal flux</DESCRIPTION>
       </FIELD>
       <FIELD name="isophotMajAxis" arraysize="1" datatype="float">
@@ -332,9 +332,9 @@
         <DESCRIPTION>estimated error inPetrosian radius</DESCRIPTION>
       </FIELD>
-      <FIELD name="petMag" arraysize="1" datatype="float">
-        <DESCRIPTION>Petrosian magntiude</DESCRIPTION>
-      </FIELD>
-      <FIELD name="petMagErr" arraysize="1" datatype="float">
-        <DESCRIPTION>estimated error in petMag</DESCRIPTION>
+      <FIELD name="petFlux" arraysize="1" datatype="float">
+        <DESCRIPTION>Petrosian Flux</DESCRIPTION>
+      </FIELD>
+      <FIELD name="petFluxErr" arraysize="1" datatype="float">
+        <DESCRIPTION>estimated error in petFlux</DESCRIPTION>
       </FIELD>
       <FIELD name="petR50" arraysize="1" datatype="float">
@@ -765,8 +765,8 @@
         <DESCRIPTION>estimated error in deVaucouleurs radius</DESCRIPTION>
       </FIELD>
-      <FIELD name="deVMag" arraysize="1" datatype="float">
+      <FIELD name="deVFlux" arraysize="1" datatype="float">
         <DESCRIPTION>deVaucouleurs magntiude</DESCRIPTION>
       </FIELD>
-      <FIELD name="deVMagErr" arraysize="1" datatype="float">
+      <FIELD name="deVFluxErr" arraysize="1" datatype="float">
         <DESCRIPTION>estimated error in deV_mag</DESCRIPTION>
       </FIELD>
@@ -891,9 +891,9 @@
         <DESCRIPTION>estimated error in Exponential fit radius</DESCRIPTION>
       </FIELD>
-      <FIELD name="expMag" arraysize="1" datatype="float">
-        <DESCRIPTION>Exponential fit magntiude</DESCRIPTION>
-      </FIELD>
-      <FIELD name="expMagErr" arraysize="1" datatype="float">
-        <DESCRIPTION>estimated error in expMag</DESCRIPTION>
+      <FIELD name="expFlux" arraysize="1" datatype="float">
+        <DESCRIPTION>Exponential fit flux</DESCRIPTION>
+      </FIELD>
+      <FIELD name="expFluxErr" arraysize="1" datatype="float">
+        <DESCRIPTION>estimated error in expFlux</DESCRIPTION>
       </FIELD>
       <FIELD name="expAb" arraysize="1" datatype="float">
@@ -1017,9 +1017,9 @@
         <DESCRIPTION>estimated error in Sersic radius</DESCRIPTION>
       </FIELD>
-      <FIELD name="serMag" arraysize="1" datatype="float">
-        <DESCRIPTION>Sersic magntiude</DESCRIPTION>
-      </FIELD>
-      <FIELD name="serMagErr" arraysize="1" datatype="float">
-        <DESCRIPTION>estimated error in serMag</DESCRIPTION>
+      <FIELD name="serFlux" arraysize="1" datatype="float">
+        <DESCRIPTION>Sersic Flux</DESCRIPTION>
+      </FIELD>
+      <FIELD name="serFluxErr" arraysize="1" datatype="float">
+        <DESCRIPTION>estimated error in serFlux</DESCRIPTION>
       </FIELD>
       <FIELD name="serAb" arraysize="1" datatype="float">
@@ -1240,4 +1240,56 @@
       </DATA>
     </TABLE>
+       <TABLE name="StackDetectionCalib">
+      <DESCRIPTION>VOTable description of PSPS table StackDetectionCalib</DESCRIPTION>
+      <PARAM arraysize="1" datatype="char" ucd="meta.bib.author" name="Author" value="PSPS"></PARAM>
+      <FIELD name="objID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>ODM object identifier index</DESCRIPTION>
+      </FIELD>
+      <FIELD name="stackDetectID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>ODM detection identifier index</DESCRIPTION>
+      </FIELD>
+      <FIELD name="ippObjID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>IPP object number</DESCRIPTION>
+      </FIELD>
+      <FIELD name="ippDetectID" arraysize="1" datatype="long" unit="unknown">
+        <DESCRIPTION>detection ID generated by IPP</DESCRIPTION>
+      </FIELD>
+      <FIELD name="filterID" arraysize="1" datatype="unsignedByte" unit="unknown">
+        <DESCRIPTION>filter identifier</DESCRIPTION>
+      </FIELD>
+      <FIELD name="surveyID" arraysize="1" datatype="unsignedByte" unit="unknown">
+        <DESCRIPTION>survey identifier</DESCRIPTION>
+      </FIELD>
+      <FIELD name="ra" arraysize="1" datatype="double" unit="degrees">
+        <DESCRIPTION>right ascension</DESCRIPTION>
+      </FIELD>
+      <FIELD name="dec" arraysize="1" datatype="double" unit="degrees">
+        <DESCRIPTION>declination</DESCRIPTION>
+      </FIELD>
+      <FIELD name="raErr" arraysize="1" datatype="float" unit="arcsec">
+        <DESCRIPTION>right ascension error</DESCRIPTION>
+      </FIELD>
+      <FIELD name="decErr" arraysize="1" datatype="float" unit="arcsec">
+        <DESCRIPTION>declination error</DESCRIPTION>
+      </FIELD>
+      <FIELD name="zp" arraysize="1" datatype="float" unit="magnitude">
+        <DESCRIPTION>zero point offset</DESCRIPTION>
+      </FIELD>
+      <FIELD name="zpErr" arraysize="1" datatype="float" unit="magnitude">
+        <DESCRIPTION>zerop point offset error</DESCRIPTION>
+      </FIELD>
+      <FIELD name="expTime" arraysize="1" datatype="float" unit="s">
+        <DESCRIPTION>exposure time</DESCRIPTION>
+      </FIELD>
+      <FIELD name="airMass" arraysize="1" datatype="float" unit="unknown">
+        <DESCRIPTION>airmass</DESCRIPTION>
+      </FIELD>
+      <FIELD name="dataRelease" arraysize="1" datatype="unsignedByte" unit="unknown">
+        <DESCRIPTION>Data release to propagate to the object</DESCRIPTION>
+      </FIELD>
+      <DATA>
+        <TABLEDATA></TABLEDATA>
+      </DATA>
+    </TABLE>
   </RESOURCE>
 </VOTABLE>
Index: branches/eam_branches/ipp-20120905/ippToPsps/jython/detectionbatch.py
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/jython/detectionbatch.py	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/jython/detectionbatch.py	(revision 34735)
@@ -388,8 +388,11 @@
         # delete all detections with PSF_INST_MAG < 17.5, as decreed by Gene
         BEFORE = self.scratchDb.getRowCount(ippTableName)
-        sql = "DELETE FROM " + ippTableName + " WHERE PSF_INST_MAG < -17.5"
-        self.scratchDb.execute(sql)
+        #don't do this anymore
+        #sql = "DELETE FROM " + ippTableName + " WHERE PSF_INST_MAG < -17.5"
+        #self.scratchDb.execute(sql)
         #DELETED = BEFORE - self.scratchDb.getRowCount(ippTableName)
-        results['SATDET'] = BEFORE - self.scratchDb.getRowCount(ippTableName)
+        #results['SATDET'] = BEFORE - self.scratchDb.getRowCount(ippTableName)
+        #we aren't deletng these now
+        results['SATDET'] = 0 
         #self.logger.infoPair("Saturated detections", "%d deleted" % DELETED)
 
@@ -404,6 +407,6 @@
                ,xPosErr \
                ,yPosErr \
-               ,instFlux \
-               ,instFluxErr \
+               ,psfFlux \
+               ,psfFluxErr \
                ,peakADU \
                ,psfWidMajor \
@@ -411,11 +414,13 @@
                ,psfTheta \
                ,psfLikelihood \
-               ,psfCf \
+               ,psfQf \
                ,momentXX \
                ,momentXY \
                ,momentYY \
-               ,apMag \
+               ,apFlux \
                ,kronFlux \
                ,kronFluxErr \
+               ,psfQfPerfect \
+               ,psfChiSq \
                ,infoFlag \
                ,sky \
@@ -447,10 +452,12 @@
                ,MOMENTS_XY \
                ,MOMENTS_YY \
-               ,AP_MAG \
+               ,POW(10.0, -0.4 *AP_MAG) / " + self.header['EXPTIME'] + " \
                ,KRON_FLUX / " + self.header['EXPTIME'] + " \
                ,KRON_FLUX_ERR / " + self.header['EXPTIME'] + " \
-               ,FLAGS\
-               ,SKY \
-               ,SKY_SIGMA \
+               ,PSF_QF_PERFECT \
+               ,PSF_CHISQ \
+               ,FLAGS2 << 32 | FLAGS \
+               ,SKY  / " + self.header['EXPTIME'] + " \
+               ,SKY_SIGMA  / " + self.header['EXPTIME'] + " \
                ,EXT_NSIGMA \
                , 0 \
@@ -459,19 +466,28 @@
                , " + str(self.config.dataRelease) + "\
                FROM " + ippTableName
+        # self.logger.info(sql)
         self.scratchDb.execute(sql)
 
         # now delete bad flux and bad chip positions
-        sql="DELETE FROM " + pspsTableName + " WHERE instFlux < 0.0000001" # TODO clearly a hack = 0 not allowed for instFlux
-        self.scratchDb.execute(sql)
-
+        #sql="DELETE FROM " + pspsTableName + " WHERE instFlux < 0.0000001" # TODO clearly a hack = 0 not allowed for instFlux
+        #self.scratchDb.execute(sql)
+
+        # add a instFlux = 0.0 -> 0.000001
+        sql="UPDATE " + pspsTableName + " SET psfFlux = 0.0000001 WHERE psfFlux =  0"
+        self.scratchDb.execute(sql)
+      
         # update cosmic ray and extended likelihoods
-        sql="UPDATE " + pspsTableName + " SET extendedLikelihood = 0, crLikelihood = 1.0 - psfLikelihood WHERE sgSep <= 0"
-        self.scratchDb.execute(sql)
-        sql="UPDATE " + pspsTableName + " SET crLikelihood = 0, extendedLikelihood = 1.0 - psfLikelihood WHERE sgSep > 0"
-        self.scratchDb.execute(sql)
+        #sql="UPDATE " + pspsTableName + " SET extendedLikelihood = 0, crLikelihood = 1.0 - psfLikelihood WHERE sgSep <= 0"
+        #self.scratchDb.execute(sql)
+        #sql="UPDATE " + pspsTableName + " SET crLikelihood = 0, extendedLikelihood = 1.0 - psfLikelihood WHERE sgSep > 0"
+        #self.scratchDb.execute(sql)
 
         # remove detections will NULL inst flux or NULL peak ADU
-        results['NULLINSTFLUX'] = self.scratchDb.reportAndDeleteRowsWithNULLS(pspsTableName, "instFlux")
-        results['NULLPEAKADU'] = self.scratchDb.reportAndDeleteRowsWithNULLS(pspsTableName, "peakADU")
+        # leave them in at this stage- don't delete them.
+        #results['NULLINSTFLUX'] = self.scratchDb.reportAndDeleteRowsWithNULLS(pspsTableName, "instFlux")
+        #results['NULLPEAKADU'] = self.scratchDb.reportAndDeleteRowsWithNULLS(pspsTableName, "peakADU")
+        #we don't delete thos anymore
+        results['NULLINSTFLUX'] = 0;
+        results['NULLPEAKADU'] = 0;
 
     '''
@@ -504,4 +520,49 @@
 
     '''
+    Populates the DetectionCalib table for this OTA
+    '''
+    def populateDetectionCalibTable(self, ota):
+
+        tableName = "DetectionCalib_" + ota
+        # drop then re-create table
+        self.scratchDb.dropTable(tableName)
+        sql = "CREATE TABLE " + tableName + " LIKE DetectionCalib"
+        try: self.scratchDb.execute(sql)
+        except: pass
+
+        # insert all detections into table
+        sql = "INSERT INTO " + tableName + " ( \
+               objID \
+               ,detectID \
+               ,ippObjID \
+               ,ippDetectID \
+               ,filterID \
+               ,surveyID \
+               ) \
+               SELECT \
+               objID \
+               ,detectID \
+               ,ippObjID \
+               ,ippDetectID \
+               ,filterID \
+               ,surveyID \
+               FROM Detection_" + ota
+        self.scratchDb.execute(sql)
+
+        # insert calibration information from dvoDetections into the Table
+        sql = "UPDATE " + tableName + " AS a, "  + self.scratchDb.dvoDetectionTable + " AS b \
+            SET a.ra = b.ra, \
+            a.dec = b.dec_, \
+            a.raErr = b.raErr, \
+            a.decErr = b.decErr, \
+            a.zp = b.zp, \
+            a.zpErr = b.zpErr, \
+            a.expTime = b.expTime, \
+            a.airMass = b.airMass   \
+            WHERE a.objID = b.objID AND a.detectID = b.detectID"
+        self.scratchDb.execute(sql)
+        self.scratchDb.updateAllRows(tableName, "dataRelease", str(self.config.dataRelease))
+        
+    '''
     Populates the Detection table for this OTA
     '''
@@ -587,4 +648,10 @@
             if not self.getIDsFromDVO(): return False
 
+        # dec is reserved in MySQL, so STILTS replaces if with dec_, which is not the name of 
+        # the column in PSPS
+        self.scratchDb.execute("ALTER TABLE DetectionCalib CHANGE dec_ `dec` double")
+
+
+
         return True
 
@@ -608,5 +675,5 @@
                 extension = "XY%d%d_psf" % (x, y)
                 self.scratchDb.createIndex(extension, "IPP_IDET")
-
+        self.logger.infoPair("created indexes on", "IPP tables")      
     '''
     Updates provided table with DVO IDs from DVO table
@@ -620,5 +687,5 @@
                a.detectID = b.detectID, \
                a.objID = b.objID, \
-               a.infoFlag = b.flags << 32 | a.infoFlag \
+               a.infoFlag = b.flags << 45 | a.infoFlag \
                WHERE a.ippDetectID = b.ippDetectID \
                AND b.imageID = " + str(imageID)
@@ -658,13 +725,17 @@
                     self.logger.info("| %5s |            ------------- Bad astrometric solution : rejecting ------------                    |" % ota)
                     continue
-
+               # self.logger.info("populate stuff ");
                 # populate remainder of tables
                 self.populateDetectionTable(ota, results)
-
+               # self.logger.info("successful populate ");
                 # now add DVO IDs
                 self.updateDvoIDs("Detection_" + ota, self.imageIDs[ota])
+               # self.logger.info("updated dvoids")
                 results['NULLOBJID'] = self.scratchDb.reportAndDeleteRowsWithNULLS("Detection_" + ota, "objID")
-                self.updateImageID("Detection_" + ota, x, y) 
+                #self.logger.info("deleted nulls")
+                self.updateImageID("Detection_" + ota, x, y)
+               # self.logger.info("updateImageId")
                 rowCount = self.scratchDb.getRowCount("Detection_" + ota) 
+              #  self.logger.info("got row count")
                 self.logger.info("| %5s | %13d | %13d | %13d | %13d | %13d | %13d |", 
                         ota, 
@@ -675,5 +746,4 @@
                         results['NULLOBJID'],
                         rowCount)
-
                 totalOriginal = totalOriginal + results['ORIGINALTOTAL']
                 totalSatDet = totalSatDet + results['SATDET']
@@ -682,5 +752,5 @@
                 totalNullObjID = totalNullObjID + results['NULLOBJID']
                 totalDetections = totalDetections + rowCount
-
+                #self.logger.info("updated totals")
                 # check we have something in this Detection table TODO add this to table above
                 if rowCount < 1:
@@ -692,8 +762,13 @@
                        SET nDetect = %d, photoCalID = %d" % (self.scratchDb.getRowCount("Detection_" + ota), self.scratchDb.getPhotoCalID(self.imageIDs[ota]))
                 self.scratchDb.execute(sql)
-
+                
+                #self.logger.info("updated imagedata")
                 self.populateSkinnyObjectTable(ota)
+                #self.logger.info("updated skinnyobject")
                 self.populateObjectCalColorTable(ota)
-
+                #self.logger.info("updated objectcalcolor")
+                self.populateDetectionCalibTable(ota)
+                #self.logger.info("updated detectioncalibtable")
+                
                 # add these to list of tables to export later
                 self.tablesToExport.append("ImageMeta_" + ota)
@@ -701,8 +776,9 @@
                 self.tablesToExport.append("SkinnyObject_" + ota)
                 self.tablesToExport.append("ObjectCalColor_" + ota)
+                self.tablesToExport.append("DetectionCalib_" + ota)
                 tables.append("Detection_" + ota)
            
                 otaCount = otaCount + 1
-
+                #self.logger.info("end of ota") 
         # print totals
         self.logger.info("+-------+---------------+---------------+---------------+---------------+---------------+---------------+")
@@ -757,5 +833,5 @@
        else : regex = ".*.psf"
   
-       columns = "IPP_IDET X_PSF Y_PSF X_PSF_SIG Y_PSF_SIG PSF_INST_MAG PSF_INST_MAG_SIG PEAK_FLUX_AS_MAG PSF_MAJOR PSF_MINOR PSF_THETA EXT_NSIGMA PSF_QF MOMENTS_XX MOMENTS_XY MOMENTS_YY AP_MAG KRON_FLUX KRON_FLUX_ERR FLAGS SKY SKY_SIGMA EXT_NSIGMA"
+       columns = "IPP_IDET X_PSF Y_PSF X_PSF_SIG Y_PSF_SIG PSF_INST_MAG PSF_INST_MAG_SIG PEAK_FLUX_AS_MAG PSF_MAJOR PSF_MINOR PSF_THETA EXT_NSIGMA PSF_QF MOMENTS_XX MOMENTS_XY MOMENTS_YY AP_MAG KRON_FLUX KRON_FLUX_ERR FLAGS FLAGS2 SKY SKY_SIGMA EXT_NSIGMA PSF_QF_PERFECT PSF_CHISQ"
 
        return super(DetectionBatch, self).importIppTables(columns, regex)
Index: branches/eam_branches/ipp-20120905/ippToPsps/jython/dvodetections.py
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/jython/dvodetections.py	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/jython/dvodetections.py	(revision 34735)
@@ -44,5 +44,5 @@
            self.importFits(
                    cpmPath,
-                   "IMAGE_ID DET_ID OBJ_ID CAT_ID EXT_ID DB_FLAGS",
+                   "IMAGE_ID DET_ID OBJ_ID CAT_ID EXT_ID DB_FLAGS PHOTCODE AIRMASS M_TIME M_CAL MAG_CAL_ERR D_RA D_DEC PLTSCALE X_CCD_ERR Y_CCD_ERR",
                    cpmTableName)
 
@@ -50,4 +50,6 @@
            self.scratchDb.createIndex(cpmTableName, "CAT_ID")
            self.scratchDb.createIndex(cpmTableName, "OBJ_ID")
+
+           # XXX: Should we create index on PHOTCODE?
 
            # we can now report that we have imported this table
@@ -60,5 +62,5 @@
        self.importFits(
                cptPath,
-               "OBJ_ID CAT_ID EXT_ID",
+               "OBJ_ID CAT_ID EXT_ID RA DEC",
                cptTableName)
 
@@ -67,17 +69,35 @@
        self.scratchDb.createIndex(cptTableName, "OBJ_ID")
 
+       # SA10
+       # Columns needed for DetectionCalib and StackDetectionCalib
+       # zp      = photcode.K * (AIRMASS - 1) + photcode.C_LAM * 0.001 - cpm.M_CAL
+       # zpErr   = cpm.MAG_CAL_ERR
+       # airMass = cpm.AIRMASS
+       # expTime = POW(10.0, 0.4 * cpm.M_TIME)
+       # ra      = cpt.RA  - (cpm.D_RA  / 3600.0)
+       # dec     = cpt.DEC - (cpm.D_DEC / 3600.0)
+       # raErr   = cpm.X_CCD_ERR * cpm.PLTSCALE
+       # decErr  = cpm.Y_CCD_ERR * cpm.PLTSCALE
+
        self.logger.infoPair("Adding","PSPS objIDs")
-       # first try to add a column for PSPS_OBJ_ID. catch failure and continue
+       # first try to add the new columns. catch failure and continue
        try:
-           sql = "ALTER TABLE " + cpmTableName + " ADD COLUMN (PSPS_OBJ_ID BIGINT)"
+           sql = "ALTER TABLE " + cpmTableName + " ADD COLUMN (PSPS_OBJ_ID BIGINT), (ZP REAL), (RA FLOAT), (DEC FLOAT)"
            self.scratchDb.execute(sql)
        except:
            self.logger.infoPair("Already added PSPS_OBJ_ID column to", cpmTableName)
                
-       # shove PSPS objIDs from cpt table into measurement table
-       sql = "UPDATE " + cpmTableName + " AS a, " + cptTableName + " AS b \
-              SET a.PSPS_OBJ_ID = b.EXT_ID \
+       # shove PSPS objIDs from cpt table and the calibrated zero point and coordinates which are formed 
+       # by combining values from multiple tables into cpt table
+       sql = "UPDATE " + cpmTableName + " AS a, " + cptTableName + " AS b, " \
+              + self.scratchDb.dvoPhotcodesTable + " AS c \
+              SET a.PSPS_OBJ_ID = b.EXT_ID, \
+              b.ZP  = c.C_LAM * 0.001 + c.K * (b.AIRMASS - 1) - b.M_CAL, \
+              b.RA  = a.RA  - (b.D_RA  / 3600.0), \
+              b.DEC = a.DEC - (b.D_DEC / 3600.0) \
               WHERE a.CAT_ID = b.CAT_ID \
-              AND a.OBJ_ID = b.OBJ_ID"
+              AND a.OBJ_ID = b.OBJ_ID   \
+              AND b.PHOTCODE = c.CODE"
+
        self.scratchDb.execute(sql)
 
@@ -86,4 +106,5 @@
        # PSPS object IDs assigned in the corresponding cpt file. This is believed to be a chip-boundary 
        # issue within DVO. So, for now, we take the first IMAGE_ID/DET_ID detection we find, and ignore the rest
+       # XXX: Bills 2012-10031 Does this problem still exist?
        self.logger.infoPair("Merging into", self.scratchDb.dvoDetectionTable)
        sql = "INSERT IGNORE INTO " + self.scratchDb.dvoDetectionTable + " (\
@@ -94,4 +115,12 @@
               ,objID \
               ,flags \
+              ,zp   \
+              ,zpErr    \
+              ,airMass  \
+              ,expTime  \
+              ,ra   \
+              ,dec_  \
+              ,raErr    \
+              ,decErr   \
               ,fileID \
               ) SELECT \
@@ -102,6 +131,15 @@
               ,PSPS_OBJ_ID \
               ,DB_FLAGS \
+              ,ZP   \
+              ,MAG_CAL_ERR  \
+              ,AIRMASS  \
+              ,POW(10.0, 0.4 * M_TIME)  \
+              ,RA   \
+              ,DEC  \
+              ,X_CCD_ERR*PLTSCALE   \
+              ,Y_CCD_ERR*PLTSCALE   \
               , " + str(fileId) + " \
               FROM " + cpmTableName
+
        try:
            self.scratchDb.execute(sql)
Index: branches/eam_branches/ipp-20120905/ippToPsps/jython/ipptopspsdb.py
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/jython/ipptopspsdb.py	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/jython/ipptopspsdb.py	(revision 34735)
@@ -638,4 +638,6 @@
             and not self.processingNow(batchType, stageID) \
             and not self.consistentlyFailed(batchType, stageID)): 
+            
+            self.logger.infoPair("heather:","passed logic")
 
             sql = "INSERT INTO batch ( \
@@ -652,4 +654,5 @@
                        '" + self.config.datastoreProduct + "' \
                        )"
+            self.logger.infoPair("heather:","sql")
 
             self.execute(sql)
Index: branches/eam_branches/ipp-20120905/ippToPsps/jython/loader.py
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/jython/loader.py	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/jython/loader.py	(revision 34735)
@@ -123,13 +123,13 @@
 
                 self.logger.infoPair("Boxes with unprocessed data", "%d" % len(boxIds))
-    
+                self.logger.infoPair("numAttempts", str(numAttempts))
                 if len(boxIds) > 0: numAttempts = 0
 
                 for boxId in boxIds:
-          
+                    self.logger.infoPair("Check","client status")
                     if not self.checkClientStatus():
                         abort = True
                         break
-    
+                    self.logger.infoPair("client status", "ok")
                     # get box info. if boxes have changed, break and start again
                     try:
@@ -138,5 +138,5 @@
                         self.logger.infoPair("Can't get details for this box", "%d" % boxId)
                         break
-     
+                    self.logger.infoPair("client status", "ok")
                     ids = self.ippToPspsDb.getPendingIdsForThisBox(boxId, batchType)
                 
@@ -150,5 +150,5 @@
                     self.logger.infoPair(batchType + " items found in this box", "%d" % len(ids))
                     boxSizeWithBorder = boxDim['SIDE'] + (self.config.BORDER * 2)
-     
+                    self.logger.infoPair("got here", "ok")
                     useFullTables = 0
                     if batchType != "OB":
@@ -174,5 +174,5 @@
                         abort = True
                         break
-
+                    self.logger.infoPair("processed","ok")
             if abort or not self.checkClientStatus(): abort = True
             elif numAttempts > 1 and not self.waitForPollTime():  break
@@ -188,15 +188,20 @@
         # loop round IDs of all items to be processed
         self.ippToPspsDb.lockBatchTable()
+        self.logger.infoPair("heather:","lockbatchtable")
         unattemptedCount = 0
         for id in ids:
-    
+            self.logger.infoPair("heather:","in ids")
+            self.logger.infoPair("heather:id",str(id))
             batchID = self.ippToPspsDb.createNewBatch(batchType, id)
-            
+            self.logger.infoPair("heather:","creatednewbatch")
+            self.logger.infoPair("heather:batchId", str(batchID))
             if batchID < 0: 
                 unattemptedCount += 1
                 continue
-    
+            self.logger.infoPair("heather:","passed logic")
             self.ippToPspsDb.unlockTables()
+            self.logger.infoPair("heather:","unlock table")
             self.ippToPspsDb.deletePendingItem(batchType, id)
+            self.logger.infoPair("heather:","deleted pending item")
 
             # catch any raised exceptions in batch constructors
@@ -234,12 +239,14 @@
    
             # if batch fails, ignore and move on to the next one
-            except: 
+            except Exception, e: 
+                self.logger.error("EXCEPTION: " + str(e))
                 self.logger.errorPair("Problem with this %s batch (%d)" % (batchType, id), "skipping")
                 pass
 
             if not self.checkClientStatus(): return False
-    
+            self.logger.infoPair("checkclient status", "ok")
+
             self.ippToPspsDb.lockBatchTable()
-    
+            self.logger.infoPair("lockbatchtable", "ok")
             self.logger.infoSeparator()
     
Index: branches/eam_branches/ipp-20120905/ippToPsps/jython/objectbatch.py
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/jython/objectbatch.py	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/jython/objectbatch.py	(revision 34735)
@@ -114,6 +114,11 @@
         for filter in filters:
 
-            sql = "UPDATE Object \
-                   JOIN " + cpsTable + " AS cps ON (cps.row = (Object.row*" + str(filterCount) + ")-(" + str(filterCount) + " - " + str(filter[0]) + ")) \
+            filterID = self.scratchDb.getFilterID(filter[1])
+
+            # NOTE: Manipulation of FLAGS from cpsTable is to move ID_SECF_OBJ_EXT flag (0x01000000)
+	    # from bit 24 to bit 13 so that it fits into the SMALLINT Object.Flags
+
+            sql = "UPDATE Object JOIN \
+                   " + cpsTable + " AS cps ON (cps.row = (Object.row* " + str(filterCount) + ")-(" + str(filterCount) + " - " + str(filter[0]) + ")) \
                    SET \
                    n" + filter[1] + " = NCODE \
@@ -122,14 +127,26 @@
                    ," + filter[1] + "MeanKronMag = MAG_KRON \
                    ," + filter[1] + "MeanKronMagErr = MAG_KRON_ERR \
-                   ," + filter[1] + "StackPSFFlux = FLUX_PSF \
-                   ," + filter[1] + "StackPSFFluxErr = FLUX_PSF_ERR \
+                   ," + filter[1] + "StackPSFMag = -2.5 * log10(FLUX_PSF) + 8.9 \
+                   ," + filter[1] + "StackPSFMagErr = FLUX_PSF_ERR / FLUX_PSF \
                    ," + filter[1] + "StackKronMag = -2.5 * log10(FLUX_KRON) + 8.9 \
                    ," + filter[1] + "StackKronMagErr = FLUX_KRON_ERR / FLUX_KRON \
                    ," + filter[1] + "20pct = MAG_20/1000 \
                    ," + filter[1] + "80pct = MAG_80/1000 \
-                   ," + filter[1] + "Flags = FLAGS "  
-                   
+                   ," + filter[1] + "Flags = (0x7fff & FLAGS) | ((FLAGS >> 11) & 0x2000) \
+                   ," + filter[1] + "StackDetectID = STACK_DETECT_ID + " + str(filterID)
+
+            #self.logger.info(sql)
+            self.scratchDb.execute(sql)
+
+        self.logger.infoPair("Calculating nDetections from", "n[filters]")
+        for filter in filters:
+            # now do a sum of n[filters], but do not include the ones with -999
+            sql = "UPDATE Object \
+                   SET nDetections = nDetections + n" + filter[1] + " \
+                   WHERE n" + filter[1] + " != -999"
+            self.scratchDb.execute(sql)
             
-            self.scratchDb.execute(sql)
+
+
 
         # now set to null all MeanMagErr values > 0.5 (cut set by Gene, 2012-04-12)
@@ -189,5 +206,27 @@
         cpsTableName = self.scratchDb.getDbFriendlyTableName(self.region + ".cps")
 
-        self.logger.infoPair("Populating", "Object")
+        self.logger.infoPair("setting to null  > 1e-38 and < 1e-38 in", "cps FLUX_KRON_ERR")
+        sql = "UPDATE " + cpsTableName + " set FLUX_KRON_ERR = NULL where FLUX_KRON_ERR < 1e-37 AND FLUX_KRON_ERR > -1e-37 "
+      
+        try:
+            self.scratchDb.execute(sql)
+        except:
+            self.logger.errorPair("Couldn't squash out of range stuff", sql)
+            return False
+
+        self.logger.infoPair("setting to null  > 1e-38 and < 1e-38 in", "cps FLUX_KRON")
+        sql = "UPDATE " + cpsTableName + " set FLUX_KRON = NULL where FLUX_KRON < 1e-37 AND FLUX_KRON > -1e-37 "
+      
+        try:
+            self.scratchDb.execute(sql)
+        except:
+            self.logger.errorPair("Couldn't squash out of range stuff", sql)
+            return False
+
+
+
+
+        
+        self.logger.infoPair("Populating", "Object s")
         self.logger.infoPair("Inserting objects from", "cpt file")
 
@@ -204,5 +243,5 @@
                ,decErr \
                ,nDetections \
-               ,extra \
+               ,qfPerfect \
                ,sgSep \
                ,dataRelease \
Index: branches/eam_branches/ipp-20120905/ippToPsps/jython/scratchdb.py
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/jython/scratchdb.py	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/jython/scratchdb.py	(revision 34735)
@@ -68,4 +68,6 @@
                DECLARE t REAL; \
                DECLARE z REAL; \
+               DECLARE s INT; \
+               SET s= SIGN(x); \
                SET x = ABS(x) / 1.4142135623731; \
                SET z=ABS(x); \
@@ -75,4 +77,5 @@
                SET ans = 2.0 - ans; \
                END IF; \
+               SET ans = ans * s; \
                RETURN ans; \
                END"
@@ -385,4 +388,12 @@
                objID BIGINT, \
                flags INT, \
+               zp REAL, \
+               zpErr REAL, \
+               airMass REAL, \
+               expTime REAL, \
+               ra FLOAT, \
+               dec_ FLOAT, \
+               raErr REAL, \
+               decErr REAL, \
                PRIMARY KEY (imageID, ippDetectID) \
                )"
Index: branches/eam_branches/ipp-20120905/ippToPsps/jython/stackbatch.py
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/jython/stackbatch.py	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/jython/stackbatch.py	(revision 34735)
@@ -76,4 +76,8 @@
        self.projectioncell = self.skycell
 
+       # proposed new values. Need to coordinate with the SkyCell table
+       # this fits in 32 bits for 0 < tessID < 214
+       # self.skycell = str( (tessID * (10000 * 1000)) + (int(self.projectioncell) * 1000) + cellID )
+
        self.analysisVer = meta[2];
 
@@ -89,4 +93,5 @@
        self.scratchDb.dropTable("SkinnyObject")
        self.scratchDb.dropTable("ObjectCalColor")
+       self.scratchDb.dropTable("StackDetectionCalib")
 
        # delete IPP tables
@@ -140,43 +145,43 @@
 
         sql = "UPDATE StackApFlx AS a, SkyChip_xrad AS b SET \
-        "+prefix+"flxR1=b.APER_FLUX_1, \
-        "+prefix+"flxR1Err=b.APER_FLUX_ERR_1, \
-        "+prefix+"flxR1Std=b.APER_FLUX_STDEV_1, \
+        "+prefix+"flxR1=b.APER_FLUX_1 / " + str(self.expTime) + ", \
+        "+prefix+"flxR1Err=b.APER_FLUX_ERR_1 / " + str(self.expTime) + ", \
+        "+prefix+"flxR1Std=b.APER_FLUX_STDEV_1 / " + str(self.expTime) + ", \
         "+prefix+"flxR1Fill=b.APER_FILL_1, \
-        "+prefix+"flxR2=b.APER_FLUX_2, \
-        "+prefix+"flxR2Err=b.APER_FLUX_ERR_2, \
-        "+prefix+"flxR2Std=b.APER_FLUX_STDEV_2, \
+        "+prefix+"flxR2=b.APER_FLUX_2 / " + str(self.expTime) + ", \
+        "+prefix+"flxR2Err=b.APER_FLUX_ERR_2 / " + str(self.expTime) + ", \
+        "+prefix+"flxR2Std=b.APER_FLUX_STDEV_2 / " + str(self.expTime) + ", \
         "+prefix+"flxR2Fill=b.APER_FILL_2, \
-        "+prefix+"flxR3=b.APER_FLUX_3, \
-        "+prefix+"flxR3Err=b.APER_FLUX_ERR_3, \
-        "+prefix+"flxR3Std=b.APER_FLUX_STDEV_3, \
+        "+prefix+"flxR3=b.APER_FLUX_3 / " + str(self.expTime) + ", \
+        "+prefix+"flxR3Err=b.APER_FLUX_ERR_3 / " + str(self.expTime) + ", \
+        "+prefix+"flxR3Std=b.APER_FLUX_STDEV_3 / " + str(self.expTime) + ", \
         "+prefix+"flxR3Fill=b.APER_FILL_3, \
-        "+prefix+"flxR4=b.APER_FLUX_4, \
-        "+prefix+"flxR4Err=b.APER_FLUX_ERR_4, \
-        "+prefix+"flxR4Std=b.APER_FLUX_STDEV_4, \
+        "+prefix+"flxR4=b.APER_FLUX_4 / " + str(self.expTime) + ", \
+        "+prefix+"flxR4Err=b.APER_FLUX_ERR_4 / " + str(self.expTime) + ", \
+        "+prefix+"flxR4Std=b.APER_FLUX_STDEV_4 / " + str(self.expTime) + ", \
         "+prefix+"flxR4Fill=b.APER_FILL_4, \
-        "+prefix+"flxR5=b.APER_FLUX_5, \
-        "+prefix+"flxR5Err=b.APER_FLUX_ERR_5, \
-        "+prefix+"flxR5Std=b.APER_FLUX_STDEV_5, \
+        "+prefix+"flxR5=b.APER_FLUX_5 / " + str(self.expTime) + ", \
+        "+prefix+"flxR5Err=b.APER_FLUX_ERR_5 / " + str(self.expTime) + ", \
+        "+prefix+"flxR5Std=b.APER_FLUX_STDEV_5 / " + str(self.expTime) + ", \
         "+prefix+"flxR5Fill=b.APER_FILL_5, \
-        "+prefix+"flxR6=b.APER_FLUX_6, \
-        "+prefix+"flxR6Err=b.APER_FLUX_ERR_6, \
-        "+prefix+"flxR6Std=b.APER_FLUX_STDEV_6, \
+        "+prefix+"flxR6=b.APER_FLUX_6 / " + str(self.expTime) + ", \
+        "+prefix+"flxR6Err=b.APER_FLUX_ERR_6 / " + str(self.expTime) + ", \
+        "+prefix+"flxR6Std=b.APER_FLUX_STDEV_6 / " + str(self.expTime) + ", \
         "+prefix+"flxR6Fill=b.APER_FILL_6, \
-        "+prefix+"flxR7=b.APER_FLUX_7, \
-        "+prefix+"flxR7Err=b.APER_FLUX_ERR_7, \
-        "+prefix+"flxR7Std=b.APER_FLUX_STDEV_7, \
+        "+prefix+"flxR7=b.APER_FLUX_7 / " + str(self.expTime) + ", \
+        "+prefix+"flxR7Err=b.APER_FLUX_ERR_7 / " + str(self.expTime) + ", \
+        "+prefix+"flxR7Std=b.APER_FLUX_STDEV_7 / " + str(self.expTime) + ", \
         "+prefix+"flxR7Fill=b.APER_FILL_7, \
-        "+prefix+"flxR8=b.APER_FLUX_8, \
-        "+prefix+"flxR8Err=b.APER_FLUX_ERR_8, \
-        "+prefix+"flxR8Std=b.APER_FLUX_STDEV_8, \
+        "+prefix+"flxR8=b.APER_FLUX_8 / " + str(self.expTime) + ", \
+        "+prefix+"flxR8Err=b.APER_FLUX_ERR_8 / " + str(self.expTime) + ", \
+        "+prefix+"flxR8Std=b.APER_FLUX_STDEV_8 / " + str(self.expTime) + ", \
         "+prefix+"flxR8Fill=b.APER_FILL_8, \
-        "+prefix+"flxR9=b.APER_FLUX_9, \
-        "+prefix+"flxR9Err=b.APER_FLUX_ERR_9, \
-        "+prefix+"flxR9Std=b.APER_FLUX_STDEV_9, \
+        "+prefix+"flxR9=b.APER_FLUX_9 / " + str(self.expTime) + ", \
+        "+prefix+"flxR9Err=b.APER_FLUX_ERR_9 / " + str(self.expTime) + ", \
+        "+prefix+"flxR9Std=b.APER_FLUX_STDEV_9 / " + str(self.expTime) + ", \
         "+prefix+"flxR9Fill=b.APER_FILL_9, \
-        "+prefix+"flxR10=b.APER_FLUX_10, \
-        "+prefix+"flxR10Err=b.APER_FLUX_ERR_10, \
-        "+prefix+"flxR10Std=b.APER_FLUX_STDEV_10, \
+        "+prefix+"flxR10=b.APER_FLUX_10 / " + str(self.expTime) + ", \
+        "+prefix+"flxR10Err=b.APER_FLUX_ERR_10 / " + str(self.expTime) + ", \
+        "+prefix+"flxR10Std=b.APER_FLUX_STDEV_10 / " + str(self.expTime) + ", \
         "+prefix+"flxR10Fill=b.APER_FILL_10 \
         WHERE a.ippDetectID=b.IPP_IDET AND b.PSF_FWHM "+psfCondition
@@ -196,6 +201,6 @@
         sql = "UPDATE StackModelFit AS a, SkyChip_xfit AS b SET \
         "+model+"Radius=b.EXT_WIDTH_MAJ,  \
-        "+model+"Mag=b.EXT_INST_MAG,  \
-        "+model+"MagErr=b.EXT_INST_MAG_SIG,  \
+        "+model+"Flux=POW(10, -0.4 * b.EXT_INST_MAG) / " + str(self.expTime) + " ,  \
+        "+model+"FluxErr=ABS(b.EXT_INST_MAG_SIG) * POW(10, -0.4 * b.EXT_INST_MAG) / " + str(self.expTime) + " / 1.085736, \
         "+model+"Ab=b.EXT_WIDTH_MAJ/b.EXT_WIDTH_MIN, \
         "+model+"Phi=b.EXT_THETA,  \
@@ -319,11 +324,10 @@
                ,skyCellID \
                ,projectionCellID \
-               ,obsTime \
                ,xPos \
                ,yPos \
                ,xPosErr \
                ,yPosErr \
-               ,instFlux \
-               ,instFluxErr \
+               ,psfFlux \
+               ,psfFluxErr \
                ,peakFlux \
                ,sky \
@@ -335,5 +339,6 @@
                ,psfLikelihood \
                ,infoFlag \
-               ,psfCf \
+               ,psfQf \
+               ,psfQfPerfect \
                ,momentXX \
                ,momentXY \
@@ -345,10 +350,10 @@
                ,momentR1 \
                ,momentRH \
-               ,apMag \
-               ,apMagErr \
+               ,apFlux \
+               ,apFluxErr \
                ,kronFlux \
                ,kronFluxErr \
                ,kronRad \
-               ,kronRadErr \
+               ,psfChiSq \
                ,nFrames \
                ,assocDate \
@@ -359,5 +364,4 @@
                ," + self.skycell + " \
                ," + self.projectioncell + " \
-               ," + self.header['MJD-OBS'] + " \
                ,X_PSF \
                ,Y_PSF \
@@ -367,6 +371,6 @@
                ,ABS((PSF_INST_MAG_SIG*(POW(10.0, (-0.4*PSF_INST_MAG)) / " + str(self.expTime) + ")) / 1.085736) \
                ,POW(10.0, (-0.4*PEAK_FLUX_AS_MAG)) / " + str(self.expTime) + " \
-               ,SKY \
-               ,SKY_SIGMA \
+               ,SKY / " + str(self.expTime) + " \
+               ,SKY_SIGMA / " + str(self.expTime) + " \
                ,EXT_NSIGMA \
                ,PSF_MAJOR \
@@ -374,6 +378,7 @@
                ,PSF_THETA \
                ,psfLikelihood(EXT_NSIGMA) \
-               ,FLAGS2 << 32 | FLAGS \
+               , FLAGS2 << 32 | FLAGS \
                ,PSF_QF \
+               ,PSF_QF_PERFECT \
                ,MOMENTS_XX \
                ,MOMENTS_XY \
@@ -385,10 +390,10 @@
                ,MOMENTS_R1 \
                ,MOMENTS_RH \
-               ,AP_MAG \
-               , NULL \
+               ,POW(10.0, -0.4*AP_MAG) / " + str(self.expTime) + " \
+               ,NULL \
                ,KRON_FLUX / " + str(self.expTime) + " \
                ,KRON_FLUX_ERR / " + str(self.expTime) + " \
-               , MOMENTS_R1 * 2.5 \
-               , NULL \
+               ,MOMENTS_R1 * 2.5 \
+               ,PSF_CHISQ \
                ,N_FRAMES \
                , '" + self.dateStr + "' \
@@ -417,5 +422,5 @@
         self.updateStackTypeID("StackDetection")
         
-        self.updateDvoIDs("StackDetection")
+        self.updateDvoIDsAndFlags("StackDetection")
         
         sql = "ALTER IGNORE TABLE StackDetection ADD PRIMARY KEY (objID)"
@@ -427,6 +432,6 @@
             #if deep stack and instFlux = null and err not null
             sql = "UPDATE StackDetection AS a, SkyChip_psf AS b \
-                   SET instFlux = 2*b.PSF_INST_FLUX_SIG / " + str(self.expTime) + " \
-                   WHERE instFlux IS NULL \
+                   SET psfFlux = 2*b.PSF_INST_FLUX_SIG / " + str(self.expTime) + " \
+                   WHERE psfFlux IS NULL \
                    AND a.ippDetectID = b.IPP_IDET  \
                    AND b.PSF_INST_FLUX_SIG IS NOT NULL"
@@ -434,6 +439,6 @@
             self.scratchDb.execute(sql)
             
-        
-        self.scratchDb.reportAndDeleteRowsWithNULLS("StackDetection", "instFlux")
+        #leave null instflux in
+        #self.scratchDb.reportAndDeleteRowsWithNULLS("StackDetection", "instFlux")
         
         self.scratchDb.reportAndDeleteRowsWithNULLS("StackDetection", "objID")
@@ -474,6 +479,6 @@
         petRadius=b.PETRO_RADIUS \
         ,petRadiusErr=b.PETRO_RADIUS_ERR \
-        ,petMag=b.PETRO_MAG \
-        ,petMagErr=b.PETRO_MAG_ERR \
+        ,petFlux=POW(10.0, -0.4 * b.PETRO_MAG) /" + str(self.expTime) + " \
+        ,petFluxErr=ABS(b.PETRO_MAG_ERR) * POW(10.0, (-0.4*b.PETRO_MAG)) / " + str(self.expTime) + " / 1.085736  \
         ,petR50=b.PETRO_RADIUS_50 \
         ,petR50Err=b.PETRO_RADIUS_50_ERR \
@@ -587,4 +592,45 @@
         self.scratchDb.updateAllRows("SkinnyObject", "dataRelease", str(self.config.dataRelease))
 
+    '''    
+    Populates the StackDetectionCalib table
+    '''
+    def populateStackDetectionCalib(self):
+        self.logger.infoPair("Processing table", "StackDetectionCalib")
+        tableName = "StackDetectionCalib"
+        # insert all detections into table
+        sql = "INSERT INTO " + tableName + " ( \
+               objID \
+               ,stackDetectID \
+               ,ippObjID \
+               ,ippDetectID \
+               ,filterID \
+               ,surveyID \
+               ) \
+               SELECT \
+               objID \
+               ,stackDetectID \
+               ,ippObjID \
+               ,ippDetectID \
+               ,filterID \
+               ,surveyID \
+               FROM StackDetection"
+        self.scratchDb.execute(sql)
+        # insert calibration information from dvoDetections into the Table
+        sql = "UPDATE " + tableName + " AS a, "  + self.scratchDb.dvoDetectionTable + " AS b \
+            SET a.ra = b.ra, \
+            a.dec = b.dec_, \
+            a.raErr = b.raErr, \
+            a.decErr = b.decErr, \
+            a.zp = b.zp, \
+            a.zpErr = b.zpErr, \
+            a.expTime = b.expTime, \
+            a.airMass = b.airMass   \
+            WHERE a.stackDetectID = b.detectID"
+        self.scratchDb.execute(sql)
+        self.scratchDb.updateAllRows(tableName, "dataRelease", str(self.config.dataRelease))
+        
+    
+
+
     '''
     Populates the ObjectCalColor table
@@ -620,4 +666,8 @@
         self.scratchDb.createIndex("StackModelFit", "ippDetectID")
 
+        # dec is reserved in MySQL, so STILTS replaces if with dec_, which is not the name of 
+        # the column in PSPS
+        self.scratchDb.execute("ALTER TABLE StackDetectionCalib CHANGE dec_ `dec` double")
+
         return True
 
@@ -645,11 +695,28 @@
         sql = "UPDATE " + table + " AS a, " + self.scratchDb.dvoDetectionTable + " AS b SET \
                a.ippObjID = b.ippObjID, \
-               a.stackDetectID = 10 * b.detectID + " + str(self.filterID) + ", \
+               a.stackDetectID = b.detectID, \
                a.objID = b.objID \
                WHERE a.ippDetectID = b.ippDetectID \
                AND b.imageID = " + str(imageID)
-        
-        self.scratchDb.execute(sql)
-        
+        self.scratchDb.execute(sql)
+    
+    '''
+    Updates Flags
+    '''
+    def updateDvoIDsAndFlags(self, table):
+        self.logger.infoPair("getting","imageID")
+        imageID = self.scratchDb.getImageIDFromExternID(self.header['IMAGEID'])
+        self.logger.infoPair("obtained","imageID")
+        self.logger.debug("Updating table '" + table + "' with DVO IDs...")
+        sql = "UPDATE " + table + " AS a, " + self.scratchDb.dvoDetectionTable + " AS b SET \
+               a.ippObjID = b.ippObjID, \
+               a.stackDetectID = b.detectID, \
+               a.objID = b.objID, \
+               a.infoFlag = b.flags << 45 | a.infoFlag \
+               WHERE a.ippDetectID = b.ippDetectID \
+               AND b.imageID = " + str(imageID)
+        self.scratchDb.execute(sql)
+    
+    
     '''
     Does the processing, i.e. pulling stuff from IPP tables into PSPS tables
@@ -660,15 +727,22 @@
             if not self.getIDsFromDVO():
                 return False
-
+        #self.logger.infoPair("populating","StackMeta")    
         self.populateStackMeta()
+        #self.logger.infoPair("populating","StackDetection") 
         self.populateStackDetection()
-
+        
         if self.stackType != "NIGHTLY_STACK": 
+            #self.logger.infoPair("populating","StackModelFit") 
             self.populateStackModelFit()
+            #self.logger.infoPair("populating","StackApFlx") 
             self.populateStackApFlx()
-   
+        #self.logger.infoPair("populating","StackToImage") 
         self.populateStackToImage()
+        #self.logger.infoPair("populating","SkinnyObject") 
         self.populateSkinnyObject()
+        #self.logger.infoPair("populating","ObjectCalColor") 
         self.populateObjectCalColor()
+        #self.logger.infoPair("populating","StackDetectionCalib") 
+        self.populateStackDetectionCalib()
 
         self.setMinMaxObjID(["StackDetection"])
Index: branches/eam_branches/ipp-20120905/ippToPsps/src/Dvo.c
===================================================================
--- branches/eam_branches/ipp-20120905/ippToPsps/src/Dvo.c	(revision 34575)
+++ branches/eam_branches/ipp-20120905/ippToPsps/src/Dvo.c	(revision 34735)
@@ -90,12 +90,24 @@
             }
             else {
+                Average *ave  = &dvoDetections[i].ave;
+                Measure *meas = &dvoDetections[i].meas;
+                PhotCode *code = GetPhotcodebyCode(meas->photcode);
                 sprintf(sql, 
-                        "INSERT INTO dvoDetection (imageID, ippDetectID, detectID, ippObjID, objID, flags) VALUES (%d, %u, %lu, %lu, %lu, %u)",
+                        "INSERT INTO dvoDetection (imageID, ippDetectID, detectID, ippObjID, objID, flags, zp, zpErr, airMass, expTime, ra, dec_, raErr, decErr) VALUES (%d, %u, %lu, %lu, %lu, %u, %f, %f, %f, %f, %lf, %lf, %f %f)",
                         image->imageID,    // imageID
-                        dvoDetections[i].meas.detID,   // ippDetectID
-                        dvoDetections[i].meas.extID,   // detectID
-                        (uint64_t)dvoDetections[i].ave.catID*1000000000 + (uint64_t)dvoDetections[i].ave.objID, // ippObjID
-                        dvoDetections[i].ave.extID, // objID
-                        dvoDetections[i].meas.dbFlags); // flags
+                        meas->detID,   // ippDetectID
+                        meas->extID,   // detectID
+                        (uint64_t)ave->catID*1000000000 + (uint64_t)ave->objID, // ippObjID
+                        dvoDetections[i].ave.extID,   // objID
+                        meas->dbFlags,                // flags
+                        code->C * 0.001 + code->K * (meas->airmass - 1) - meas->Mcal,   // zp
+                        meas->dMcal,                  // zpErr
+                        meas->airmass,
+                        pow(10.0, 0.4 * meas->dt),    // expTime
+                        ave->R - meas->dR / 3600.,    // ra
+                        ave->D - meas->dR / 3600.,    // dec
+                        meas->dXccd * meas->pltscale, // estimate of raErr
+                        meas->dYccd * meas->pltscale  // estimate of decErr
+                        );
 
                 mysql_query(this->mysql, sql); 
