Index: /trunk/ippToPsps/config/tables.ST.vot
===================================================================
--- /trunk/ippToPsps/config/tables.ST.vot	(revision 36735)
+++ /trunk/ippToPsps/config/tables.ST.vot	(revision 36736)
@@ -727,5 +727,5 @@
         <DESCRIPTION>PSF orientation angle</DESCRIPTION>
       </FIELD>
-      <FIELD name="zpsfCore" arraysize="1" datatype="float" unit="degrees" default="-999">
+      <FIELD name="ypsfCore" arraysize="1" datatype="float" unit="degrees" default="-999">
         <DESCRIPTION>PSF core parameter [k in (1 + kz * z^1.66)]</DESCRIPTION>
       </FIELD>
Index: /trunk/ippToPsps/jython/objectbatch.py
===================================================================
--- /trunk/ippToPsps/jython/objectbatch.py	(revision 36735)
+++ /trunk/ippToPsps/jython/objectbatch.py	(revision 36736)
@@ -91,5 +91,6 @@
 
         # dec is reserved in MySQL, so STILTS replaces if with dec_, which PSPS doesn't like. so, force it back again using ``
-        self.scratchDb.execute("ALTER TABLE Object CHANGE dec_ `dec` double")
+      #  self.scratchDb.execute("ALTER TABLE MeanObject CHANGE dec_ `dec` double")
+      #  self.scratchDb.execute("ALTER TABLE ObjectThin CHANGE dec_ `dec` double")
 
         return True
@@ -107,5 +108,5 @@
     Inserts stuff for all mags
     '''
-    def insertMags(self, cpsTable):
+    def insertMeanMags(self, cpsTable):
 
         # list of all filters PSPS is interested in
@@ -129,28 +130,16 @@
 	    # 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]) + ")) \
+            sql = "UPDATE MeanObject JOIN ObjectThin using (objID) JOIN \
+                   " + cpsTable + " AS cps ON (cps.row = (ObjectThin.row* " + str(filterCount) + ")-(" + str(filterCount) + " - " + str(filter[0]) + ")) \
                    SET \
-                   n" + filter[1] + " = NCODE \
-                   ," + filter[1] + "MeanPSFMag = MAG \
-                   ," + filter[1] + "MeanPSFMagErr = MAG_ERR \
-                   ," + filter[1] + "MeanKronMag = MAG_KRON \
-                   ," + filter[1] + "MeanKronMagErr = MAG_KRON_ERR \
-                   ," + filter[1] + "StackPSFMag = STACK_PSF_MAG \
-                   ," + filter[1] + "StackPSFMagErr = STACK_PSF_MAG_ERR \
-                   ," + filter[1] + "StackKronMag = STACK_KRON_MAG \
-                   ," + filter[1] + "StackKronMagErr = STACK_KRON_MAG_ERR \
-                   ," + filter[1] + "20pct = MAG_20/1000 \
-                   ," + filter[1] + "80pct = MAG_80/1000 \
-                   ," + filter[1] + "Flags = (0x7fff & FLAGS) | ((FLAGS >> 11) & 0x2000) \
-                   ," + filter[1] + "StackDetectID = STACK_DETECT_ID"
-
-# old method for setting the Stack (PSF,Kron) Mags:
-#                  ," + 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 \
-
-            #self.logger.info(sql)
+                   ObjectThin.n" + filter[1] + " = NCODE \
+                   ,MeanObject." + filter[1] + "MeanPSFMag = MAG \
+                   ,MeanObject." + filter[1] + "MeanPSFMagErr = MAG_ERR \
+                   ,MeanObject." + filter[1] + "MeanKronMag = MAG_KRON \
+                   ,MeanObject." + filter[1] + "MeanKronMagErr = MAG_KRON_ERR \
+                   ,MeanObject." + filter[1] + "Flags = (0x7fff & FLAGS) | ((FLAGS >> 11) & 0x2000) "
+
+
+            self.logger.info(sql)
             self.scratchDb.execute(sql)
 
@@ -158,5 +147,5 @@
         for filter in filters:
             # now do a sum of n[filters], but do not include the ones with -999
-            sql = "UPDATE Object \
+            sql = "UPDATE ObjectThin join MeanObject using (objID)  \
                    SET nDetections = nDetections + n" + filter[1] + " \
                    WHERE n" + filter[1] + " != -999"
@@ -171,51 +160,14 @@
         for filter in filters:
 
-            sql = "UPDATE Object \
+            sql = "UPDATE MeanObject \
                    SET " + filter[1] + "MeanPSFMagErr = null \
                    WHERE " + filter[1] + "MeanPSFMagErr > " + str(cut)
             self.scratchDb.execute(sql)
 
-        self.logger.infoPair("Setting to NULL all x20pct =", "32.767" ) 
-        for filter in filters:
-            sql  = "UPDATE Object \
-                   SET " + filter[1] + "20pct = null \
-                   WHERE " + filter[1] + "20pct > 32.766"
-            self.scratchDb.execute(sql)
-        self.logger.infoPair("Setting to NULL all x80pct =", "32.767" )
-        for filter in filters:
-            sql  = "UPDATE Object \
-                    SET " + filter[1] + "80pct = null \
-                    WHERE " + filter[1] + "80pct > 32.766"
-            self.scratchDb.execute(sql)
-
-
-
-
-    '''
-    Inserts colors
-    '''
-    def updateColors(self):
-
-        self.logger.infoPair("Calculating", "colors")
-        sql = "UPDATE Object \
-               SET \
-               grMeanColor = (gMeanMag - rMeanMag) \
-               ,riMeanColor = (rMeanMag - iMeanMag) \
-               ,izMeanColor = (iMeanMag - zMeanMag) \
-               ,zyMeanColor = (zMeanMag - yMeanMag) \
-               ,grMeanColorErr = SQRT(POW(gMeanMagErr,2) + POW(rMeanMagErr,2)) \
-               ,riMeanColorErr = SQRT(POW(rMeanMagErr,2) + POW(iMeanMagErr,2)) \
-               ,izMeanColorErr = SQRT(POW(iMeanMagErr,2) + POW(zMeanMagErr,2)) \
-               ,zyMeanColorErr = SQRT(POW(zMeanMagErr,2) + POW(yMeanMagErr,2)) \
-                   "
-        try:
-            self.scratchDb.execute(sql)
-        except:
-            self.logger.errorPair("Couldn't calculate colors", sql)
 
     '''
     Populates the Object table
     '''
-    def populateObjectTable(self):
+    def populateObjectThinTable(self):
 
         cptTableName = self.scratchDb.getDbFriendlyTableName(self.region + ".cpt")
@@ -242,31 +194,36 @@
 
         
-        self.logger.infoPair("Populating", "Object s")
+        self.logger.infoPair("Populating", "ThinObject")
         self.logger.infoPair("Inserting objects from", "cpt file")
 
         # note `` around dec here, as this is a reserved word in MySQL
-        sql = "INSERT IGNORE INTO Object (\
+        sql = "INSERT IGNORE INTO ObjectThin (\
                objID \
+               ,gcobjID \
                ,ippObjID \
+               ,surveyID \
+               ,skyCellID \
+               ,randomID \
+               ,batchID \
+               ,dataRelease \
                ,objInfoFlag \
                ,qualityFlag \
-               ,surveyID \
-               ,ra \
-               ,`dec` \
-               ,raErr \
-               ,decErr \
+               ,raMean \
+               ,decMean \
+               ,raMeanErr \
+               ,decMeanErr \
                ,nDetections \
-               ,qfPerfect \
-               ,sgSep \
-               ,dataRelease \
-               ,Random \
-               ,batchID \
-               ) \
+                ) \
                SELECT \
                EXT_ID \
+               , -999 \
                ,CAT_ID*1000000000 + OBJ_ID \
+               ," + str(self.surveyID) + " \
+               ,-999 \
+               , RAND() \
+               , " + str(self.batchID) + "\
+               , " + str(self.skychunk.dataRelease) + "\
                ,FLAGS \
                ,FLAGS >> 24 & 0xFF \
-               ," + str(self.surveyID) + " \
                ,RA \
                ,DEC_ \
@@ -274,10 +231,5 @@
                ,DEC_ERR \
                ,0 \
-               ,PSF_QF_PERF \
-               ,STARGAL_SEP \
-               , " + str(self.skychunk.dataRelease) + "\
-               , RAND() \
-               , " + str(self.batchID) + "\
-               FROM " + cptTableName
+                FROM " + cptTableName
 
         try:
@@ -289,8 +241,8 @@
         # add row count columns so we can perform joins to get colors
         self.logger.infoPair("Adding 'row' columns to", "Object and cps tables")
-        self.scratchDb.addRowCountColumn("Object", "row")
+        self.scratchDb.addRowCountColumn("ObjectThin", "row")
         self.scratchDb.addRowCountColumn(cpsTableName, "row")
 
-        self.insertMags(cpsTableName)
+ #       self.insertMeanMags(cpsTableName)
 
 #don't do this as we removed those columns.. 
@@ -312,5 +264,9 @@
         #count out of range
 
-        sql = "SELECT count(*) FROM Object where Object.dec > " + str(decMax) + " or Object.dec < " + str(decMin) + " or Object.ra > " + str(raMax) + " or Object.ra < " + str(raMin)       
+        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)
@@ -321,5 +277,9 @@
         
  
-        sql = "DELETE FROM Object where Object.dec > " + str(decMax) + " or Object.dec < " + str(decMin) + " or Object.ra > " + str(raMax) + " or Object.ra < " + str(raMin) 
+        sql = "DELETE FROM ObjectThin where \
+              ObjectThin.decMean > " + str(decMax) + " or \
+              ObjectThin.decMean < " + str(decMin) + " or \
+              ObjectThin.raMean > " + str(raMax) + " or \
+              ObjectThin.raMean < " + str(raMin) 
         self.logger.infoPair("Deleting", str(nToDelete) + " objects outside of ra/dec range")
 
@@ -327,14 +287,14 @@
             self.scratchDb.execute(sql)
         except:
-            self.logger.errorPair("Couldn't cull outsiders from Object table", sql)
+            self.logger.errorPair("Couldn't cull outsiders from ObjectThin table", sql)
             return False
 
-        self.logger.infoPair("Dropping row column from", "Object table")
-        self.scratchDb.dropColumn("Object", "row")
+        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.dvoObjects.purgeRegion(self.region)
 
-        self.setMinMaxObjID(["Object"])
+        self.setMinMaxObjID(["ObjectThin"])
 
         return True
@@ -343,24 +303,23 @@
     Populates the ObjectCalColor table
     '''
-    def populateObjectCalColorTable(self):
-
-        self.logger.infoPair("Populating", "ObjectCalColor")
-
-        sql = "INSERT INTO ObjectCalColor ( \
+    def populateMeanObjectTable(self):
+
+        self.logger.infoPair("Populating", "MeanObject")
+
+        sql = "INSERT INTO MeanObject ( \
                objID \
-               ,ippObjID \
-               ,dataRelease \
+               ,gcobjID \
                ) \
                SELECT \
                objID \
-               ,ippObjID \
-               ,dataRelease \
-               FROM Object"
+               ,gcobjID \
+               FROM ObjectThin"
         try:
             self.scratchDb.execute(sql)
         except:
-            self.logger.errorPair("Couldn't populate ObjectCalColor table", sql)
+            self.logger.errorPair("Couldn't populate MeanObject table", sql)
             return False
 
+        self.insertMeanMags("MeanObject")
         return True
 
@@ -370,10 +329,11 @@
     def populatePspsTables(self):
 
-        if not self.populateObjectTable(): return False
+        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
-        self.logger.infoPair("Forcing uniqueness on", "objID in Object table")
-        rowCountBefore = self.scratchDb.getRowCount("Object")
+        self.logger.infoPair("Forcing uniqueness on", "objID in ObjectThin table")
+        rowCountBefore = self.scratchDb.getRowCount("ObjectThin")
 
         # XXX EAM : note that in mysql versions later than 5.1, this fails
@@ -386,11 +346,34 @@
             self.scratchDb.execute("set session old_alter_table=1")
             
-        self.scratchDb.execute("ALTER IGNORE TABLE Object ADD UNIQUE INDEX(objID)")
+        self.scratchDb.execute("ALTER IGNORE TABLE ObjectThin ADD UNIQUE INDEX(objID)")
         if self.scratchDb.version > 5.1:
             self.scratchDb.execute("set session old_alter_table=0")
 
+        rowCountAfter = self.scratchDb.getRowCount("ObjectThin")
+        self.logger.infoPair("Number of duplicated objIDs removed", "%d out of %d" % ((rowCountBefore - rowCountAfter), rowCountBefore))
+
+        self.logger.infoPair("Forcing uniqueness on", "objID in MeanObject table")
+        rowCountBefore = self.scratchDb.getRowCount("MeanObject")
+
+        # XXX EAM : note that in mysql versions later than 5.1, this fails
+        # unless the following is called first: 
+        # set session old_alter_table=1
+        # follow the command with 
+        # set session old_alter_table=0
+        # OF COURSE, this fails for mysql version < 5.5...
+        if self.scratchDb.version > 5.1:
+            self.scratchDb.execute("set session old_alter_table=1")
+            
+        self.scratchDb.execute("ALTER IGNORE TABLE MeanObject ADD UNIQUE INDEX(objID)")
+        if self.scratchDb.version > 5.1:
+            self.scratchDb.execute("set session old_alter_table=0")
+
+        rowCountAfter = self.scratchDb.getRowCount("MeanObject")
+        self.logger.infoPair("Number of duplicated objIDs removed", "%d out of %d" % ((rowCountBefore - rowCountAfter), rowCountBefore))
+
+
+        #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")
-        self.logger.infoPair("Number of duplicated objIDs removed", "%d out of %d" % ((rowCountBefore - rowCountAfter), rowCountBefore))
-
-        return True
-
+        #return True
+        return False
Index: /trunk/ippToPsps/jython/stackbatch.py
===================================================================
--- /trunk/ippToPsps/jython/stackbatch.py	(revision 36735)
+++ /trunk/ippToPsps/jython/stackbatch.py	(revision 36736)
@@ -305,55 +305,56 @@
     Updates aperture fluxes for StackApFkx table
     '''
-    def updateApFlxs(self, prefix, psfCondition):
+    def updateModelFitFlxs(self, prefix, psfCondition, tablename, filter):
         #properly -999 these to start with:
-
-        sql = "UPDATE StackApFlx AS a, SkyChip_xrad AS b SET \
-        "+prefix+"flxR1=-999, \
-        "+prefix+"flxR1Err=-999, \
-        "+prefix+"flxR1Std=-999, \
-        "+prefix+"flxR1Fill=-999, \
-        "+prefix+"flxR2=-999, \
-        "+prefix+"flxR2Err=-999, \
-        "+prefix+"flxR2Std=-999, \
-        "+prefix+"flxR2Fill=-999, \
-        "+prefix+"flxR3=-999, \
-        "+prefix+"flxR3Err=-999, \
-        "+prefix+"flxR3Std=-999, \
-        "+prefix+"flxR3Fill=-999, \
-        "+prefix+"flxR4=-999, \
-        "+prefix+"flxR4Err=-999, \
-        "+prefix+"flxR4Std=-999, \
-        "+prefix+"flxR4Fill=-999, \
-        "+prefix+"flxR5=-999, \
-        "+prefix+"flxR5Err=-999, \
-        "+prefix+"flxR5Std=-999, \
-        "+prefix+"flxR5Fill=-999, \
-        "+prefix+"flxR6=-999, \
-        "+prefix+"flxR6Err=-999, \
-        "+prefix+"flxR6Std=-999, \
-        "+prefix+"flxR6Fill=-999, \
-        "+prefix+"flxR7=-999, \
-        "+prefix+"flxR7Err=-999, \
-        "+prefix+"flxR7Std=-999, \
-        "+prefix+"flxR7Fill=-999, \
-        "+prefix+"flxR8=-999, \
-        "+prefix+"flxR8Err=-999, \
-        "+prefix+"flxR8Std=-999, \
-        "+prefix+"flxR8Fill=-999, \
-        "+prefix+"flxR9=-999, \
-        "+prefix+"flxR9Err=-999, \
-        "+prefix+"flxR9Std=-999, \
-        "+prefix+"flxR9Fill=-999, \
-        "+prefix+"flxR10=-999, \
-        "+prefix+"flxR10Err=-999, \
-        "+prefix+"flxR10Std=-999, \
-        "+prefix+"flxR10Fill=-999 \
-        WHERE a.ippDetectID=b.IPP_IDET "
+        f = filter
+        if tablename == 'StackModelFit':
+            sql = "UPDATE " + tablename + " AS a, "+f+"SkyChip_xrad AS b SET \
+        "+f+prefix+"flxR1=-999, \
+        "+f+prefix+"flxR1Err=-999, \
+        "+f+prefix+"flxR1Std=-999, \
+        "+f+prefix+"flxR1Fill=-999, \
+        "+f+prefix+"flxR2=-999, \
+        "+f+prefix+"flxR2Err=-999, \
+        "+f+prefix+"flxR2Std=-999, \
+        "+f+prefix+"flxR2Fill=-999, \
+        "+f+prefix+"flxR3=-999, \
+        "+f+prefix+"flxR3Err=-999, \
+        "+f+prefix+"flxR3Std=-999, \
+        "+f+prefix+"flxR3Fill=-999, \
+        "+f+prefix+"flxR4=-999, \
+        "+f+prefix+"flxR4Err=-999, \
+        "+f+prefix+"flxR4Std=-999, \
+        "+f+prefix+"flxR4Fill=-999, \
+        "+f+prefix+"flxR5=-999, \
+        "+f+prefix+"flxR5Err=-999, \
+        "+f+prefix+"flxR5Std=-999, \
+        "+f+prefix+"flxR5Fill=-999, \
+        "+f+prefix+"flxR6=-999, \
+        "+f+prefix+"flxR6Err=-999, \
+        "+f+prefix+"flxR6Std=-999, \
+        "+f+prefix+"flxR6Fill=-999, \
+        "+f+prefix+"flxR7=-999, \
+        "+f+prefix+"flxR7Err=-999, \
+        "+f+prefix+"flxR7Std=-999, \
+        "+f+prefix+"flxR7Fill=-999, \
+        "+f+prefix+"flxR8=-999, \
+        "+f+prefix+"flxR8Err=-999, \
+        "+f+prefix+"flxR8Std=-999, \
+        "+f+prefix+"flxR8Fill=-999, \
+        "+f+prefix+"flxR9=-999, \
+        "+f+prefix+"flxR9Err=-999, \
+        "+f+prefix+"flxR9Std=-999, \
+        "+f+prefix+"flxR9Fill=-999, \
+        "+f+prefix+"flxR10=-999, \
+        "+f+prefix+"flxR10Err=-999, \
+        "+f+prefix+"flxR10Std=-999, \
+        "+f+prefix+"flxR10Fill=-999 \
+        WHERE a."+f+"ippDetectID=b.IPP_IDET "
         #self.logger.infoPair("sql", sql)
-        self.scratchDb.execute(sql)
+            self.scratchDb.execute(sql)
 
 
         #we have variable numbers of these columns. find out which are in use
-        sql = "DESCRIBE SkyChip_xrad 'aper_fill_%'"
+        sql = "DESCRIBE "+f+"SkyChip_xrad 'aper_fill_%'"
         rs = self.scratchDb.executeQuery(sql)
         rs.first()
@@ -369,136 +370,49 @@
 
         numbers = []
+        min = 1
+        max = 10
+        if tablename == 'StackApFlx':
+            min = 3
+            max = 5
         for column in columns: 
             number = re.sub("APER_FILL_","",column)
-            if (int(number) >= 1 and int(number) <=10):
+            if (int(number) >= min and int(number) <=max):
                 numbers.append(number)
                 self.logger.infoPair("Aperture Numbers",number)
 
         #generate the sql to do the necessary ops on the columns    
-        sql = "UPDATE StackApFlx AS a, SkyChip_xrad AS b SET "
+        sql = "UPDATE " + tablename + " AS a, "+f+"SkyChip_xrad AS b SET "
         cnt =0
+        exptime = self.safeDictionaryAccess(self.header, 'EXPTIME')
         for number in numbers:
             if (cnt>0):
                 sql=sql+" , "
-            sql=sql+prefix+"flxR"+number+"=b.APER_FLUX_"+number +" / " + str(self.expTime) + ", "
-            sql=sql+prefix+"flxR"+number+"Err=b.APER_FLUX_ERR_"+number +" / " + str(self.expTime) + ", "
-            sql=sql+prefix+"flxR"+number+"Std=b.APER_FLUX_STDEV_"+number +" / " + str(self.expTime) + ", "
-            sql=sql+prefix+"flxR"+number+"Fill=b.APER_FILL_"+number + " "
+            sql=sql+f+prefix+"flxR"+number+"=b.APER_FLUX_"+number +" / " + str(exptime) + ", "
+            sql=sql+f+prefix+"flxR"+number+"Err=b.APER_FLUX_ERR_"+number +" / " + str(exptime) + ", "
+            sql=sql+f+prefix+"flxR"+number+"Std=b.APER_FLUX_STDEV_"+number +" / " + str(exptime) + ", "
+            sql=sql+f+prefix+"flxR"+number+"Fill=b.APER_FILL_"+number + " "
             cnt=cnt+1
             
-        sql=sql+"WHERE a.ippDetectID=b.IPP_IDET AND  "+psfCondition     
-        self.scratchDb.execute(sql)
-
-        #self.logger.infoPair("sql",sql)
-
-        #sql = "UPDATE StackApFlx AS a, SkyChip_xrad AS b SET \
-        #"+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 / " + 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 / " + 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 / " + 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 / " + 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 / " + 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 / " + 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 / " + 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 / " + 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 / " + 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
-
-        #self.scratchDb.execute(sql)
+        sql=sql+"WHERE a."+f+"ippDetectID=b.IPP_IDET AND  "+psfCondition   
+        self.logger.infoPair("sql",sql)
+        self.scratchDb.execute(sql)
+
 
     '''
     Updates parameters for a particular model in the StackModelFit table
     '''
-    def updateModelFit(self, model, ippModelType):
-
-        if model == "ser":
-            modelLong = "sersic"
-        else:
-            modelLong = model;
-
-        #does it have the EXT_COVAR in there?
-
-        sql = "DESCRIBE SkyChip_xfit 'EXT_COVAR_%'"
-        rs = self.scratchDb.executeQuery(sql)
-        rs.first()
-        hasResult = rs.next()
-        if hasResult:
-           print "EXT_COVARs exist"
-        else:
-           print "No EXT_COVARS here"
-
-        ext_covar_sql = ""
-  
-        if (hasResult):
-            ext_covar_sql = ", "+modelLong+"Covar11=b.EXT_COVAR_00_00,  \
-            "+modelLong+"Covar12=b.EXT_COVAR_00_01,  \
-            "+modelLong+"Covar13=b.EXT_COVAR_00_02,  \
-            "+modelLong+"Covar14=b.EXT_COVAR_00_03,  \
-            "+modelLong+"Covar15=b.EXT_COVAR_00_04,  \
-            "+modelLong+"Covar16=b.EXT_COVAR_00_05,  \
-            "+modelLong+"Covar17=b.EXT_COVAR_00_06,  \
-            "+modelLong+"Covar22=b.EXT_COVAR_01_01,  \
-            "+modelLong+"Covar23=b.EXT_COVAR_01_02,  \
-            "+modelLong+"Covar24=b.EXT_COVAR_01_03,  \
-            "+modelLong+"Covar25=b.EXT_COVAR_01_04,  \
-            "+modelLong+"Covar26=b.EXT_COVAR_01_05,  \
-            "+modelLong+"Covar27=b.EXT_COVAR_01_06,  \
-            "+modelLong+"Covar33=b.EXT_COVAR_02_02,  \
-            "+modelLong+"Covar34=b.EXT_COVAR_02_03,  \
-            "+modelLong+"Covar35=b.EXT_COVAR_02_04,  \
-            "+modelLong+"Covar36=b.EXT_COVAR_02_05,  \
-            "+modelLong+"Covar37=b.EXT_COVAR_02_06,  \
-            "+modelLong+"Covar44=b.EXT_COVAR_03_03,  \
-            "+modelLong+"Covar45=b.EXT_COVAR_03_04,  \
-            "+modelLong+"Covar46=b.EXT_COVAR_03_05,  \
-            "+modelLong+"Covar47=b.EXT_COVAR_03_06,  \
-            "+modelLong+"Covar55=b.EXT_COVAR_04_04,  \
-            "+modelLong+"Covar56=b.EXT_COVAR_04_05,  \
-            "+modelLong+"Covar57=b.EXT_COVAR_04_06,  \
-            "+modelLong+"Covar66=b.EXT_COVAR_05_05,  \
-            "+modelLong+"Covar67=b.EXT_COVAR_05_06,  \
-            "+modelLong+"Covar77=b.EXT_COVAR_06_06"
-       
-        
-
-
-        sql = "UPDATE StackModelFit AS a, SkyChip_xfit AS b SET \
-        "+model+"Radius=b.EXT_WIDTH_MAJ,  \
-        "+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  \
-        "+ext_covar_sql+"  \
-        WHERE a.ippDetectID=b.IPP_IDET AND b.MODEL_TYPE = '"+ippModelType+"'"
+    def updateModelFit(self, model, ippModelType, filter, exptime):
+        f = filter
+ 
+ # idk what to do about PET
+
+        sql = "UPDATE StackModelFit AS a, " + f + "SkyChip_xfit AS b SET \
+        "+f+model+"Radius=b.EXT_WIDTH_MAJ,  \
+        "+f+model+"Flux=POW(10, -0.4 * b.EXT_INST_MAG) / " + str(exptime) + " ,  \
+        "+f+model+"FluxErr=ABS(b.EXT_INST_MAG_SIG) * POW(10, -0.4 * b.EXT_INST_MAG) / " + str(exptime) + " / 1.085736, \
+        "+f+model+"Ab=b.EXT_WIDTH_MAJ/b.EXT_WIDTH_MIN, \
+        "+f+model+"Phi=b.EXT_THETA  \
+          \
+        WHERE a."+f+"ippDetectID=b.IPP_IDET AND b.MODEL_TYPE = '"+ippModelType+"'"
 
         print sql
@@ -506,18 +420,10 @@
 
         # sersic fit has an extra parameter
-        if (ippModelType == "PS_MODEL_SERSIC" and hasResult > 0):
-            sql = "UPDATE StackModelFit AS a, SkyChip_xfit AS b SET \
-            "+modelLong+"Covar18=b.EXT_COVAR_00_07,  \
-            "+modelLong+"Covar28=b.EXT_COVAR_01_07,  \
-            "+modelLong+"Covar38=b.EXT_COVAR_02_07,  \
-            "+modelLong+"Covar48=b.EXT_COVAR_03_07,  \
-            "+modelLong+"Covar58=b.EXT_COVAR_04_07,  \
-            "+modelLong+"Covar68=b.EXT_COVAR_05_07,  \
-            "+modelLong+"Covar78=b.EXT_COVAR_06_07,  \
-            "+modelLong+"Covar88=b.EXT_COVAR_07_07,   \
-            "+"serNu=b.EXT_PAR_07,   \
-            "+"serNuErr=SQRT(EXT_COVAR_07_07)  \
-            WHERE a.ippDetectID=b.IPP_IDET AND b.MODEL_TYPE = '"+ippModelType+"'"
-
+        if (ippModelType == "PS_MODEL_SERSIC"):
+            sql = "UPDATE StackModelFit AS a, "+ f+ "SkyChip_xfit AS b SET \
+            "+f+"serNu=b.EXT_PAR_07   \
+            WHERE a."+f+"ippDetectID=b.IPP_IDET AND b.MODEL_TYPE = '"+ippModelType+"'"
+#           "+f+"serNuErr=SQRT(EXT_COVAR_07_07)  \
+            self.logger.infoPair("sql",sql)
             self.scratchDb.execute(sql)
 
@@ -651,4 +557,5 @@
           skip = 0
           if (f == "g"):
+              self.logger.infoPair("gstackID = ",self.gstackID)
               if self.gstackID > 0:  
                   stackid = self.gstackID
@@ -657,4 +564,5 @@
                   skip = 1
           if (f == "r"):
+              self.logger.infoPair("rstackID = ",self.rstackID)
               if self.rstackID > 0:
                   stackid = self.rstackID
@@ -663,4 +571,5 @@
                   skip = 1
           if (f == "i"):
+              self.logger.infoPair("istackID = ",self.istackID)
               if self.istackID > 0:
                   stackid = self.istackID
@@ -669,4 +578,5 @@
                   skip = 1
           if (f == "z"):
+              self.logger.infoPair("zstackID = ",self.zstackID)
               if self.zstackID > 0:
                   stackid = self.zstackID
@@ -675,4 +585,5 @@
                   skip = 1
           if (f == "y"):
+              self.logger.infoPair("ystackID = ",self.ystackID)
               if self.ystackID > 0:
                   stackid = self.ystackID
@@ -855,75 +766,46 @@
     '''
     def populateStackApFlx(self):
-        self.logger.infoPair("getting","imageID")
-        imageID = self.scratchDb.getImageIDFromExternID(self.header['IMAGEID'])
-        self.logger.infoPair("obtained","imageID")
-
-        self.logger.infoPair("Procesing", "StackApFlx")
- 
-        sql = "INSERT INTO StackApFlx \
-               (ippDetectID ) \
-               SELECT \
-               DISTINCT IPP_IDET \
-               FROM SkyChip_xrad"
-
-        try:
-            self.scratchDb.execute(sql)
-        except: return
-
-        # TODO temporarily loading 1st convolved fluxes into unconvolved fields
-
-        #This assumes that there are 3 different fluxs, the first is unconv, and the 2nd and 3rd are convolved. If there are more than 3 fluxes it will break.   
-        # If there are more than 3 types of fluxes, we should do a count to find out how many there are and adjust this accordingly (make it more robust)
-
-        self.logger.infoPair("Adding fluxes", "un-convolved")
-        self.updateApFlxs("", "((b.table_index -1) % 3 = 0)")
-        self.logger.infoPair("Adding fluxes", "1st convolved")
-        self.updateApFlxs("c1", "((b.table_index -1) % 3 = 1)")
-        self.logger.infoPair("Adding fluxes", "2nd convolved")
-        self.updateApFlxs("c2", "((b.table_index -1) % 3 = 2)")
-
-        self.logger.infoPair("Adding", "petrosians for extended sources")
-        sql = "UPDATE StackApFlx AS a, SkyChip_xsrc AS b SET \
-        petRadius=b.PETRO_RADIUS \
-        ,petRadiusErr=b.PETRO_RADIUS_ERR \
-        ,petFlux=POW(10.0, -0.4 * b.PETRO_MAG) /" + str(self.expTime) + " \
-        ,petFluxErr=-999  \
-        ,petR50=b.PETRO_RADIUS_50 \
-        ,petR50Err=b.PETRO_RADIUS_50_ERR \
-        ,petR90=b.PETRO_RADIUS_90 \
-        ,petR90Err=b.PETRO_RADIUS_90_ERR \
-        ,petCf=b.PETRO_FILL \
-        WHERE a.ippDetectID=b.IPP_IDET"
-        self.scratchDb.execute(sql)
-
-        self.logger.infoPair("Adding", "petFluxErr for non nulls")
-        sql = "UPDATE StackApFlx as a, SkyChip_xsrc AS b SET \
-        petFluxErr=ABS(b.PETRO_MAG_ERR) * POW(10.0, (-0.4*b.PETRO_MAG)) / " + str(self.expTime) + " / 1.085736  \
-        WHERE a.ippDetectID=b.IPP_IDET \
-        AND (b.PETRO_MAG_ERR is not NULL AND b.PETRO_MAG is not NULL AND PETRO_MAG_ERR < 1000.0)"
-        # added this because when the petromagerr is crazy large (10^29 it out of ranges the flux err calc)
-        self.logger.infoPair("sql", sql)
-        self.scratchDb.execute(sql)
-
-
-
-        self.logger.infoPair("adding"," PrimaryF to stackApFlx")
-        sql = "UPDATE StackApFlx AS a, " + self.scratchDb.dvoDetectionTable + " AS b SET \
-               a.primaryF = ((b.flags & 0x10000) >> 16 ) \
-               WHERE a.ippDetectID = b.ippDetectID \
-               AND b.imageID = " + str(imageID)
-
-        print "update dvo sql: ", sql
-        # response = raw_input("update dvo...")
-        self.scratchDb.execute(sql)
-
-        
-
-        self.scratchDb.updateAllRows("StackApFlx", "surveyID", str(self.surveyID))
-        self.scratchDb.updateAllRows("StackApFlx", "dataRelease", str(self.skychunk.dataRelease))
-        self.updateStackTypeID("StackApFlx")
-        self.updateDvoIDs("StackApFlx")
+        filter = ['g','r','i','z','y']
+
+        for f in filter:
+            skip = 0 
+            if (f == 'g'):
+                if self.gstackID > 0:
+                    self.header = self.gheader
+                else:
+                    skip = 1
+            if (f == 'r'):
+                if self.rstackID > 0:
+                    self.header = self.rheader
+                else:
+                    skip = 1
+            if (f == 'i'):
+                if self.istackID > 0:
+                    self.header = self.iheader
+                else:
+                    skip = 1
+            if (f == 'z'):
+                if self.zstackID > 0:
+                    self.header = self.zheader
+                else:
+                    skip = 1
+            if (f == 'y'):
+                if self.ystackID > 0:
+                    self.header = self.yheader
+                else:
+                    skip =1 
+
+            if skip == 0:
+                self.logger.infoPair("Adding fluxes", "un-convolved")
+                self.updateModelFitFlxs("", "((b.table_index -1) % 3 = 0)", "StackApFlx", f)
+                self.logger.infoPair("Adding fluxes", "1st convolved")
+                self.updateModelFitFlxs("c1", "((b.table_index -1) % 3 = 1)","StackApFlx",f)
+                self.logger.infoPair("Adding fluxes", "2nd convolved")
+                self.updateModelFitFlxs("c2", "((b.table_index -1) % 3 = 2)","StackApFlx",f)
+
+                self.deleteDetectionsNotInStackObject("StackApFlx",f)
+
         self.scratchDb.reportAndDeleteRowsWithNULLS("StackApFlx", "objID")
-        self.deleteDetectionsNotInStackObject("StackApFlx")
+       
 
 
@@ -931,5 +813,23 @@
     Populates the StackModelFit table
     '''
-    def populateStackModelFit(self):
+    def populateStackModelFit(self, filter):
+        # for each filter
+        f =filter
+        if (filter == 'g'):
+            self.header = self.gheader
+            
+        if (filter == 'r'):
+            self.header = self.rheader
+        if (filter == 'i'):
+            self.header = self.iheader
+        if (filter == 'z'):
+            self.header = self.zheader
+        if (filter == 'y'):
+            self.header = self.yheader
+            
+
+
+
+
         self.logger.infoPair("getting","imageID")
         imageID = self.scratchDb.getImageIDFromExternID(self.header['IMAGEID'])
@@ -939,23 +839,51 @@
 
         # insert all the detections
-        sql = "INSERT INTO StackModelFit (ippDetectID) SELECT DISTINCT IPP_IDET from SkyChip_xfit"
-        try:
-            self.scratchDb.execute(sql)
-        except:
-            return
 
         # populate model parameters
         self.logger.infoPair("Adding model fit", "deVaucouleurs")
-        self.updateModelFit("deV", "PS_MODEL_DEV")
+        self.updateModelFit("deV", "PS_MODEL_DEV", filter, self.header['EXPTIME'])
         self.logger.infoPair("Adding model fit", "exponential")
-        self.updateModelFit("exp", "PS_MODEL_EXP")
+        self.updateModelFit("deV", "PS_MODEL_EXP", filter, self.header['EXPTIME'])
         self.logger.infoPair("Adding model fit", "sersic")
-        self.updateModelFit("ser", "PS_MODEL_SERSIC")
+        self.updateModelFit("deV", "PS_MODEL_SERSIC", filter, self.header['EXPTIME'])
+ 
+
+        self.logger.infoPair("Adding fluxes", "un-convolved")
+        self.updateModelFitFlxs("", "((b.table_index -1) % 3 = 0)","StackModelFit",f)
+        self.logger.infoPair("Adding fluxes", "1st convolved")
+        self.updateModelFitFlxs("c1", "((b.table_index -1) % 3 = 1)","StackModelFit",f)
+        self.logger.infoPair("Adding fluxes", "2nd convolved")
+        self.updateModelFitFlxs("c2", "((b.table_index -1) % 3 = 2)","StackModelFit",f)
+
+ 
+        self.logger.infoPair("Adding", "petrosians for extended sources")
+        sql = "UPDATE StackModelFit as a, "+f+"SkyChip_xsrc AS b SET \
+        "+f+"petRadius=b.PETRO_RADIUS \
+        ,"+f+"petRadiusErr=b.PETRO_RADIUS_ERR \
+        ,"+f+"petFlux=POW(10.0, -0.4 * b.PETRO_MAG) /" + str(self.header['EXPTIME']) + " \
+        ,"+f+"petFluxErr=-999  \
+        ,"+f+"petR50=b.PETRO_RADIUS_50 \
+        ,"+f+"petR50Err=b.PETRO_RADIUS_50_ERR \
+        ,"+f+"petR90=b.PETRO_RADIUS_90 \
+        ,"+f+"petR90Err=b.PETRO_RADIUS_90_ERR \
+        ,"+f+"petCf=b.PETRO_FILL \
+        WHERE a."+f+"ippDetectID=b.IPP_IDET"
+        self.scratchDb.execute(sql)
+
+        self.logger.infoPair("Adding", "petFluxErr for non nulls")
+        sql = "UPDATE StackModelFit as a, "+f+"SkyChip_xsrc AS b SET \
+        "+f+"petFluxErr=ABS(b.PETRO_MAG_ERR) * POW(10.0, (-0.4*b.PETRO_MAG)) / " + str(self.header['EXPTIME']) + " / 1.085736  \
+        WHERE a."+f+"ippDetectID=b.IPP_IDET \
+        AND (b.PETRO_MAG_ERR is not NULL AND b.PETRO_MAG is not NULL AND PETRO_MAG_ERR < 1000.0)"
+        # added this because when the petromagerr is crazy large (10^29 it out of ranges the flux err calc)
+        self.logger.infoPair("sql", sql)
+        self.scratchDb.execute(sql)
+
+
 
         self.scratchDb.updateAllRows("StackModelFit", "surveyID", str(self.surveyID))
-        self.scratchDb.updateFilterID("StackModelFit", self.filter)
         self.scratchDb.updateAllRows("StackModelFit", "dataRelease", str(self.skychunk.dataRelease))
 
-        self.logger.infoPair("adding"," PrimaryF to stackApFlx")
+        self.logger.infoPair("not adding"," PrimaryF to stackApFlx")
         sql = "UPDATE StackModelFit AS a, " + self.scratchDb.dvoDetectionTable + " AS b SET \
                a.primaryF = ((b.flags & 0x10000) >> 16 ) \
@@ -963,24 +891,23 @@
                AND b.imageID = " + str(imageID)
 
-        print "update dvo sql: ", sql
-        # response = raw_input("update dvo...")
-        try:
-            self.scratchDb.execute(sql)
-        except:
-            return
-
-        self.scratchDb.updateAllRows("StackModelFit", "activeFlag", "0")
+#        try:
+#            self.scratchDb.execute(sql)
+#        except:
+#            return
+
+##        self.scratchDb.updateAllRows("StackModelFit", "activeFlag", "0")
         ##self.updateStackMetaID("StackModelFit")
-        self.updateStackTypeID("StackModelFit")
-        self.updateDvoIDs("StackModelFit")
+##        self.updateStackTypeID("StackModelFit")
+        
         self.scratchDb.reportAndDeleteRowsWithNULLS("StackModelFit", "objID")
-        self.deleteDetectionsNotInStackObject("StackModelFit")
+        self.deleteDetectionsNotInStackObject("StackModelFit", f)
 
     '''
     Reports and deletes detections in this table that are not in StackObject
     '''
-    def deleteDetectionsNotInStackObject(self, table):
-
-        sql = "SELECT COUNT(*) FROM " + table + " WHERE ippDetectID NOT IN (SELECT ippDetectID FROM StackObject)"
+    def deleteDetectionsNotInStackObject(self, table, filter):
+        f= filter
+
+        sql = "SELECT COUNT(*) FROM " + table + " WHERE "+f+"ippDetectID NOT IN (SELECT "+f+"ippDetectID FROM StackObject)"
         rs = self.scratchDb.executeQuery(sql)
         rs.first()
@@ -989,5 +916,5 @@
         if nMissing < 1: return
         
-        sql = "DELETE FROM " + table + " WHERE ippDetectID NOT IN (SELECT ippDetectID FROM StackObject)"
+        sql = "DELETE FROM " + table + " WHERE "+f+"ippDetectID NOT IN (SELECT "+f+"ippDetectID FROM StackObject)"
         self.scratchDb.execute(sql)
         self.logger.infoPair("Detections not in StackObject", "%d deleted from %s" % (nMissing, table))
@@ -1028,7 +955,7 @@
 
         
-    def populateStackObjectFromDvo(self):
-
-        tableName = "StackObject"
+    def populateStackIPPDetectIDFromDvo(self, tableName, all):
+
+        #tableName = "StackObject"
         self.logger.infoPair("Processing table", tableName)
 
@@ -1039,37 +966,52 @@
             #first: do we skip this filter
             if f == 'g':
-                self.header = self.gheader
                 if self.gstackID < 0:
                     skip = 1
+                else:
+                    self.header=self.gheader
+                    stackmetaid = self.gstackID
             elif f == 'r':
-                self.header = self.rheader
                 if self.rstackID < 0:
                     skip = 1
+                else:
+                    self.header = self.rheader
+                    stackmetaid = self.rstackID
             elif f == 'i':
-                self.header = self.iheader
                 if self.istackID < 0:
                     skip = 1
+                else:
+                    self.header = self.iheader
+                    stackmetaid = self.istackID
             elif f == 'z':
-                self.header = self.zheader
                 if self.zstackID < 0:
                     skip = 1
+                else:
+                    self.header = self.zheader
+                    stackmetaid = self.zstackID
             elif f == 'y':
-                self.header = self.yheader
                 if self.ystackID < 0:
                     skip = 1
+                else:
+                    self.header = self.yheader
+                    stackmetaid = self.ystackID
             if skip == 0:        
                 imageID = self.scratchDb.getImageIDFromExternID(self.header['IMAGEID'])
                 self.logger.infoPair("obtained","imageID")
-                sql = "UPDATE " + tableName + " AS a, "  + self.scratchDb.dvoDetectionTable + " AS b \
-                      SET a." + f + "ra = b.ra, \
+                addsql = ""
+                if (all == 1):
+                    addsql = "a." + f + "ra = b.ra, \
                       a." + f + "dec = b.dec_, \
                       a." + f + "raErr = b.raErr, \
                       a." + f + "decErr = b.decErr, \
                       a." + f + "zp = b.zp, \
-                      a." + f + "expTime = b.expTime, \
-                      a." + f + "ippDetectID = b.ippDetectID, \
-                      a." + f + "stackDetectID = b.detectID   \
-                      WHERE a.objID = b.objID \
-                      AND b.imageID = " + str(imageID)
+                      a." + f + "expTime = b.expTime,"
+
+                    
+                sql = "UPDATE " + tableName + " AS a, "  + self.scratchDb.dvoDetectionTable + " AS b \
+                      SET a." + f + "ippDetectID = b.ippDetectID, \
+                      " + addsql + " \
+                      a." + f + "stackDetectID = b.detectID,   \
+                      a." + f + "stackMetaID = " + str(stackmetaid) +  " \
+                      WHERE a.objID = b.objID  AND b.imageID = " + str(imageID)
                 self.logger.infoPair('sql',sql)    
                 self.scratchDb.execute(sql)
@@ -1078,4 +1020,17 @@
         #out of the loops - give dataRelase to all        
         self.scratchDb.updateAllRows(tableName, "dataRelease", str(self.skychunk.dataRelease))
+
+
+    def deleteNULLippDetectIDs(self, tableName):
+
+        self.logger.infoPair("Deleting NULL ippdetectIDs from table", tableName)
+        sql = "DELETE FROM " + tableName + " WHERE \
+              gippDetectID is NULL AND \
+              rippDetectID is NULL AND \
+              iippDetectID is NULL AND \
+              zippDetectID is NULL AND \
+              yippDetectID is NULL "
+        self.logger.infoPair('sql',sql)    
+        self.scratchDb.execute(sql)
 
     '''
@@ -1225,5 +1180,5 @@
         self.scratchDb.createIndex("StackObject", "objID")
         #populate from dvo the (f)ippDetectID into StackObject  
-        self.populateStackObjectFromDvo()
+        self.populateStackIPPDetectIDFromDvo("StackObject",1)
         #index the ippDetectids for the next step
         self.scratchDb.createIndex("StackObject", "gippDetectID")
@@ -1241,5 +1196,5 @@
             self.scratchDb.createIndex("StackModelFit", "objID")
         #populate from dvo the (f)ippdetectid into stackModelFit
-
+            self.populateStackIPPDetectIDFromDvo("StackModelFit",0)
         #index the ippDetectIds for the next step
             self.scratchDb.createIndex("StackModelFit", "gippDetectID")
@@ -1248,12 +1203,19 @@
             self.scratchDb.createIndex("StackModelFit", "zippDetectID")
             self.scratchDb.createIndex("StackModelFit", "yippDetectID")
+        #cull the entries that should not be (how?)        
+            self.deleteNULLippDetectIDs("StackModelFit") 
         #populate stackModelFit
-        #cull the entries that should not be (how?)
-
+            self.populateStackModelFit("g")
+            self.populateStackModelFit("r")
+            self.populateStackModelFit("i")
+            self.populateStackModelFit("z")
+            self.populateStackModelFit("y")
+
+ 
             self.logger.infoPair("populating ","StackApFlx")
             
             self.scratchDb.createIndex("StackApFlx", "objID")
         #populate from dvo the (f)ippDetectID into StackApFlx
-        
+            self.populateStackIPPDetectIDFromDvo("StackApFlx",0)
         #index the ippDetectIDs for the next step 
             self.scratchDb.createIndex("StackApFlx", "gippDetectID")
@@ -1263,4 +1225,6 @@
             self.scratchDb.createIndex("StackApFlx", "yippDetectID")
         #populate StackApFlx
+            self.deleteNULLippDetectIDs("StackApFlx") 
+            self.populateStackApFlx()
         #cull the entries that should not be (how?) 
         
@@ -1270,5 +1234,6 @@
         
         self.setMinMaxObjID(["StackObject"])
-       
+      #  self.updateStackTypeID("StackModelFit")
+
         ##if self.totalDetections < 1: 
 
