IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 5, 2012, 5:19:48 PM (14 years ago)
Author:
mhuber
Message:

merging latest r33407 trunk changes to meh_branches/ppstack_test

Location:
branches/meh_branches/ppstack_test
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/meh_branches/ppstack_test

  • branches/meh_branches/ppstack_test/ippToPsps/jython/scratchdb.py

    r32062 r33415  
    1919    Constructor
    2020    '''
    21     def __init__(self, logger, doc, useFull=0):
    22         super(ScratchDb, self).__init__(logger, doc, "localdatabase")
     21    def __init__(self, logger, config, dbName=None):
     22        super(ScratchDb, self).__init__(logger, config, "localdatabase", dbName)
     23
     24        self.dvoDoneTable = "dvoDone"
     25        self.dvoSkyTable = "dvoSkyTable"
     26
     27
     28    '''
     29    Destructor
     30    '''
     31    def __del__(self):
     32
     33        self.logger.debug("ScratchDb destructor")
     34
     35
     36    '''
     37    Sets whether we are using normal or pre-ingested DVO tables
     38    '''
     39    def setUseFullTables(self, useFull):
    2340
    2441        if useFull:
    25             self.dvoMetaTable = "dvoMetaFull"
     42            self.dvoImagesTable = "dvoImagesFull"
    2643            self.dvoDetectionTable = "dvoDetectionFull"
    27             self.dvoDoneTable = "dvoDone"
    2844        else:
    29             self.dvoMetaTable = "dvoMeta"
     45            self.dvoImagesTable = "dvoImages"
    3046            self.dvoDetectionTable = "dvoDetection"
    3147
    32         self.logger.debugPair("Using DVO meta table", self.dvoMetaTable)
     48        self.logger.debugPair("Using DVO images table", self.dvoImagesTable)
    3349        self.logger.debugPair("Using DVO detection table", self.dvoDetectionTable)
    3450
    3551    '''
    36     Destructor
    37     '''
    38     def __del__(self):
    39 
    40         self.logger.debug("ScratchDb destructor")
     52    Creates a stored procedure for psfLikelihood. This uses an implementation of the complimentary error function taken from Numerical Recipes in C.
     53    '''
     54    def createPsfLikelihoodFunction(self):
     55
     56        sql = "DROP FUNCTION IF EXISTS `psfLikelihood`"
     57        try:
     58            self.execute(sql)
     59        except:
     60            self.logger.errorPair("Could not drop stored procedure", "psfLikelihood")
     61            return False
     62
     63        sql = "CREATE FUNCTION `psfLikelihood`(x REAL) RETURNS REAL \
     64               DETERMINISTIC \
     65               COMMENT 'Returns the psfLikelihood using the complimentary error function with fractional error everywhere less than 1.2 x 10-7. From Numerical Recipes in C' \
     66               BEGIN \
     67               DECLARE ans REAL; \
     68               DECLARE t REAL; \
     69               DECLARE z REAL; \
     70               SET x = ABS(x) / 1.4142135623731; \
     71               SET z=ABS(x); \
     72               SET t=1.0 / (1.0 + 0.5*z); \
     73               SET ans = t * EXP(-z*z-1.26551223+t*(1.00002368+t*(.37409196+t*(.09678418+t*(-.18628806+t*(.27886807+t*(-1.13520398+t*(1.48851587+t*(-.82215223+t*.17087277))))))))); \
     74               IF x < 0.0 THEN \
     75               SET ans = 2.0 - ans; \
     76               END IF; \
     77               RETURN ans; \
     78               END"
     79
     80        try:
     81            self.execute(sql)
     82            self.logger.debugPair("Installed stored procedure", "psfLikelihood")
     83            return True
     84        except:
     85            self.logger.errorPair("Could not install stored procedure", "psfLikelihood")
     86            return False
    4187
    4288    '''
     
    56102        return surveyID
    57103
     104    '''
     105    Gets filter ID for this filter name
     106    '''
     107    def getFilterID(self, name):
     108     
     109        sql = "SELECT filterID FROM Filter WHERE filterType = '" + name + "'"
     110        try:
     111            rs = self.executeQuery(sql)
     112            rs.first()
     113            filterID = rs.getInt(1)
     114        except:
     115            self.logger.errorPair("No filter ID found for filter", name)
     116            filterID = -1
     117
     118        return filterID
     119
    58120    '''
    59121    Gets imageID from extern ID
    60122    '''
    61     def getImageIDFromExternID(self, sourceID, externID):
     123    def getImageIDFromExternID(self, externID):
    62124               
    63125        imageID = -1
    64126               
    65         sql = "SELECT imageID FROM " + self.dvoMetaTable + " WHERE sourceID = %s AND externID = %s" % (sourceID, externID)
     127        sql = "SELECT IMAGE_ID FROM " + self.dvoImagesTable + " WHERE EXTERN_ID = %s" % (externID)
    66128        try:
    67129            rs = self.executeQuery(sql)   
     
    76138    Gets DVO image flags
    77139    '''
    78     def getDvoImageFlags(self, sourceID, externID):
     140    def getDvoImageFlags(self, externID):
    79141
    80142        flags = 0
    81143
    82         sql = "SELECT flags FROM " + self.dvoMetaTable + " WHERE sourceID = %s AND externID = %s" % (sourceID, externID)
     144        sql = "SELECT FLAGS FROM " + self.dvoImagesTable + " WHERE EXTERN_ID = %s" % (externID)
    83145        try:
    84146            rs = self.executeQuery(sql) 
     
    92154    Gets photcode (aka photoCalID from dvo table)
    93155    '''
    94     def getPhotoCalID(self, sourceID, externID):
     156    def getPhotoCalID(self, externID):
    95157
    96158        photcode = -1
    97159
    98         sql = "SELECT photcode FROM " + self.dvoMetaTable + " WHERE sourceID = %s AND externID = %s" % (sourceID, externID)
     160        sql = "SELECT PHOTCODE FROM " + self.dvoImagesTable + " WHERE EXTERN_ID = %s" % (externID)
    99161        try:
    100162            rs = self.executeQuery(sql) 
     
    115177
    116178    '''
    117     Inserts a new sourceID/imageID combo into dvoMeta
     179    Inserts a new sourceID/imageID combo into dvoImages
    118180    '''
    119181    def insertNewDvoExternID(self, sourceID, externID):
    120182
    121         sql = "INSERT INTO dvoMeta ( \
    122                sourceID, \
    123                externID \
     183        sql = "INSERT INTO " + self.dvoImagesTable + " ( \
     184               SOURCE_ID, \
     185               EXTERN_ID \
    124186               ) VALUES (\
    125187               " + str(sourceID) + ", \
     
    129191
    130192    '''
    131     Updates dvoDone table with this DVO table
    132     '''
    133     def setImportedThisDvoTable(self, name):
    134 
    135         sql = "INSERT INTO dvoDone (name) VALUES ('" + name + "')"
    136         self.execute(sql)
    137        
    138     '''
    139     Have we already imported this DVO table?
    140     '''
    141     def alreadyImportedThisDvoTable(self, name):
    142 
    143         sql = "SELECT COUNT(*) FROM dvoDone WHERE name = '" + name + "'"
     193    Do we have an out-of-date version of this file?
     194    '''
     195    def haveOutOfDateVersionOfThisDvoTable(self, path):
     196
     197        fileStat = os.stat(path)
     198
     199        sql = "SELECT COUNT(*) FROM " + self.dvoDoneTable + " WHERE path = '" + path + "' AND modifiedDate != " + str(fileStat.st_mtime)
    144200
    145201        try:
     
    147203            rs.first()
    148204            if rs.getInt(1) > 0:
    149                 self.logger.errorPair("Already imported DVO tables for",  name)
     205                self.logger.debugPair("Have out-to-date version of",  path)
    150206                return True
    151207            else:
    152208                return False
    153209        except:
     210            self.logger.exception("Unable to check whether this DVO table is out-of-date")
     211
     212    '''
     213    Have we already imported this DVO table?
     214    Checks path and modified date to be sure
     215    '''
     216    def alreadyImportedThisDvoTable(self, path):
     217
     218        fileStat = os.stat(path)
     219
     220        sql = "SELECT COUNT(*) FROM " + self.dvoDoneTable + " WHERE path = '" + path + "' AND modifiedDate = " + str(fileStat.st_mtime)
     221
     222        try:
     223            rs = self.executeQuery(sql)
     224            rs.first()
     225            if rs.getInt(1) > 0:
     226                self.logger.debugPair("Already imported up-to-date version of",  path)
     227                return True
     228            else:
     229                return False
     230        except:
    154231            self.logger.exception("Unable to check whether this DVO table has been imported")
    155232
    156233
    157234    '''
     235    Updates dvoDone table with this DVO table
     236    '''
     237    def setImportedThisDvoTable(self, path, region="null"):
     238
     239        fileStat = os.stat(path)
     240
     241        # first delete any old version we have ingested
     242        sql = "DELETE FROM " + self.dvoDoneTable + " WHERE path = '" + path + "'"
     243        self.execute(sql)
     244
     245        # now insert new version with up-to-date size and date
     246        sql = "INSERT INTO " + self.dvoDoneTable + " (region, path, modifiedDate, size) VALUES ('" + region + "', '" + path + "', " + str(str(fileStat.st_mtime)) + ", " + str(str(fileStat.st_size)) + ")"
     247        self.execute(sql)
     248
     249
     250    '''
     251    Gets the id for the cpm file for the provided region
     252    '''
     253    def getDvoCpmFileIdForRegion(self, region):
     254
     255        id = -1
     256        sql = "SELECT id FROM " + self.dvoDoneTable + " WHERE region = '" + region + "' AND path LIKE '%.cpm'";
     257        try:
     258            rs = self.executeQuery(sql)
     259            rs.first()
     260            id = rs.getInt(1)
     261        except:
     262            self.logger.errorPair("Could not get file id from " + self.dvoDoneTable, "for region: " + region)
     263
     264        return id
     265
     266
     267    '''
     268    Gets the id for the provided file
     269    '''
     270    def getDvoFileId(self, path):
     271
     272        id = -1
     273        sql = "SELECT id FROM " + self.dvoDoneTable + " WHERE path = '" + path + "'"
     274        try:
     275            rs = self.executeQuery(sql)
     276            rs.first()
     277            id = rs.getInt(1)
     278        except:
     279            self.logger.errprPair("Could not get file id from " + self.dvoDoneTable + "for", path)
     280
     281        return id
     282                                                                                               
     283    '''
     284    Returns a list of DVO regions currently ingested
     285    '''
     286    def getIngestedDvoRegions(self):
     287
     288        regions = []
     289
     290        sql = "SELECT DISTINCT region FROM dvoDone WHERE region != 'null'"
     291        try:
     292            rs = self.executeQuery(sql)
     293            while (rs.next()):
     294                regions.append(rs.getString(1))
     295            rs.close()
     296        except:
     297            self.logger.errorPai("Can't query for ingested regions", sql)
     298
     299        return regions
     300
     301   
     302    '''
     303    Gets total size of DVO files imported to this database
     304    Counts only cpm and cpt files
     305    '''
     306    def getTotalSizeOfIngestedDvoFiles(self):
     307
     308        size = 0
     309        sql = "SELECT SUM(size) FROM " + self.dvoDoneTable + " WHERE path LIKE '%cpm' OR path LIKE '%cpt'"
     310        try:
     311            rs = self.executeQuery(sql) 
     312            rs.first()
     313            size = rs.getLong(1)
     314        except:
     315            self.logger.errorPair("Unable to get total ingested DVO size", sql)
     316
     317        return size
     318
     319    '''
     320    Checks whether DVO files we have ingested are form the DVO path provided
     321    '''
     322    def isCorrectDvo(self, path):
     323
     324        sql = "SELECT path FROM " + self.dvoDoneTable + " where path LIKE '%Images.dat'"
     325        try:
     326            rs = self.executeQuery(sql) 
     327            rs.first()
     328
     329            head,tail = os.path.split(rs.getString(1))
     330
     331            if head == path:
     332                self.logger.debugPair("Already ingested stuff from DVO at", path)
     333                return True
     334            else:
     335                self.logger.errorPair("DVO does not match. We have", head)
     336                return False
     337
     338        except:
     339            self.logger.errorPair("No DVO files ingested for this path", path)
     340            return False
     341
     342    '''
     343    Checks whether the astrometric solution is ok for this chip
     344    TODO the value of 50 for numAstroRef is hardcoded here, but this should be temporary anyway
     345    '''
     346    def astrometricSolutionOK(self, ota):
     347
     348        sql = "SELECT numAstroRef FROM ImageMeta_" + ota
     349
     350        try:
     351            rs = self.executeQuery(sql)
     352            rs.first()
     353            if rs.getInt(1) < 50:
     354                self.logger.debug("Bad astrometric solution for",  ota)
     355                return False
     356            else:
     357                return True
     358        except:
     359            self.logger.debug("Unable to check astrometric solution")
     360
     361        return True
     362
     363
     364    '''
    158365    Creates a table for for ID matching
    159366    '''
    160367    def createDvoTables(self):
    161 
    162         self.logger.debugPair("Creating DVO table", "dvoMeta")
    163 
    164         sql = "DROP TABLE dvoMeta"
     368   
     369        # drop and create Images table
     370        self.logger.debugPair("Creating DVO table", self.dvoImagesTable)
     371        sql = "DROP TABLE " + self.dvoImagesTable
    165372        try: self.execute(sql)
    166373        except: pass
    167374       
    168         sql = "DROP TABLE dvoDetection"
    169         try: self.execute(sql)
    170         except: pass
    171 
    172         sql = "CREATE TABLE dvoMeta ( \
    173                sourceID INT, \
    174                imageID INT, \
    175                externID INT, \
    176                flags INT, \
    177                photcode INT, \
    178                PRIMARY KEY (sourceID, imageID, externID) \
     375        sql = "CREATE TABLE " + self.dvoImagesTable + " ( \
     376               SOURCE_ID SMALLINT, \
     377               IMAGE_ID INT, \
     378               EXTERN_ID INT, \
     379               FLAGS INT, \
     380               PHOTCODE SMALLINT, \
     381               PRIMARY KEY (IMAGE_ID, EXTERN_ID) \
    179382               )"
    180383
     
    183386            self.logger.error("Unable to create DVO meta-data database table")
    184387
     388        # now detection table
     389        self.logger.debugPair("Creating DVO table", self.dvoDetectionTable)
     390        sql = "DROP TABLE " + self.dvoDetectionTable
     391        try: self.execute(sql)
     392        except: pass
     393
    185394        self.logger.debugPair("Creating DVO table", "dvoDetection")
    186395        sql = "CREATE TABLE dvoDetection ( \
    187                sourceID INT, \
    188396               imageID INT, \
    189397               ippDetectID BIGINT, \
     
    192400               objID BIGINT, \
    193401               flags INT, \
    194                PRIMARY KEY (sourceID, imageID, ippDetectID) \
     402               PRIMARY KEY (imageID, ippDetectID) \
    195403               )"
    196404
     
    201409
    202410    '''
    203     Drops and recreates tables necessary for dvoToMySQL program. Be very careful before using this...
    204     '''
    205     def resetDvoToMysqlTables(self):
    206 
    207        self.logger.infoPair("Dropping table", self.dvoMetaTable)
    208        self.dropTable(self.dvoMetaTable)
     411    Removes the provided DVO FITS files from from dvoDone and dvoDetection tables
     412    Returns a count of the number of detections deleted
     413    '''
     414    def purgeTheseDvoRegions(self, regions):
     415
     416        detectionCount = self.getRowCount(self.dvoDetectionTable)
     417        for region in regions:
     418           
     419           fileId = self.getDvoCpmFileIdForRegion(region)
     420
     421           if fileId < 0:
     422               self.logger.errorPair("Unable to get file ID to delete " + region + " from", self.dvoDoneTable)
     423               continue
     424
     425           sql = "DELETE FROM " + self.dvoDetectionTable + " WHERE fileID = " + str(fileId)
     426           try: self.execute(sql)
     427           except:
     428               self.logger.errorPair("Unable to delete from " + self.dvoDetectionTable, "for file ID: %d" % fileId)
     429               return False
     430
     431           sql = "DELETE FROM " + self.dvoDoneTable + " WHERE region = '" + region + "'"
     432           try: self.execute(sql)
     433           except:
     434               self.logger.errorPair("Unable to delete " + region + " from", self.dvoDoneTable)
     435
     436        finalCount = detectionCount - self.getRowCount(self.dvoDetectionTable)
     437
     438        # after a big delete, we should OPTIMIZE the table
     439        self.logger.infoPair("Running OPTIMIZE on ", self.dvoDetectionTable)
     440        if finalCount > 0: self.optimizeTable(self.dvoDetectionTable)
     441
     442        return finalCount
     443           
     444    '''
     445    Drops DVO stuff pertaining to detections
     446    '''
     447    def resetDvoDetectionTables(self):
     448
     449       self.logger.infoPair("Deleting detections from", self.dvoDoneTable)
     450       sql = "DELETE FROM " + self.dvoDoneTable + " WHERE path LIKE '%cpm' OR path LIKE '%cpt'"
     451       try: self.execute(sql)
     452       except:
     453           self.logger.errorPair("Unable to delete from", self.dvoDoneTable)
     454           return False
     455
    209456       self.logger.infoPair("Dropping table", self.dvoDetectionTable)
    210457       self.dropTable(self.dvoDetectionTable)
    211        self.logger.infoPair("Dropping table", self.dvoDoneTable)
    212        self.dropTable(self.dvoDoneTable)
    213 
    214        self.logger.infoPair("Creating table", self.dvoMetaTable)
    215        sql = "CREATE TABLE " + self.dvoMetaTable + " LIKE dvoMeta"
    216        try: self.execute(sql)
    217        except: self.logger.errorPair("Unable to create table", self.dvoMetaTable)
    218458
    219459       self.logger.infoPair("Creating table", self.dvoDetectionTable)
    220460       sql = "CREATE TABLE " + self.dvoDetectionTable + " LIKE dvoDetection"
    221461       try: self.execute(sql)
    222        except: self.logger.errorPair("Unable to create table", self.dvoDetectionTable)
    223 
     462       except:
     463           self.logger.errorPair("Unable to create table", self.dvoDetectionTable)
     464           return False
     465
     466       # TODO
     467       sql = "ALTER TABLE " + self.dvoDetectionTable + " ADD fileID INT NOT NULL"
     468       try: self.execute(sql)
     469       except:
     470           self.logger.errorPair("Unable to add fileID column to ", self.dvoDetectionTable)
     471           return False
     472
     473    '''
     474    Drops and recreates tables necessary for dvoToMySQL program. Be very careful before using this...
     475    '''
     476    def resetAllDvoTables(self):
     477
     478       self.logger.infoPair("Dropping table", self.dvoImagesTable)
     479       self.dropTable(self.dvoImagesTable)
     480       self.logger.infoPair("Dropping table", self.dvoSkyTable)
     481       self.dropTable(self.dvoSkyTable)
     482       self.logger.infoPair("Dropping table", self.dvoDoneTable)
     483       self.dropTable(self.dvoDoneTable)
     484
     485       # create dvoDone table
    224486       self.logger.infoPair("Creating table", self.dvoDoneTable )
    225        sql = "CREATE TABLE " + self.dvoDoneTable + " (name VARCHAR(100))"
     487       sql = "CREATE TABLE " + self.dvoDoneTable + " (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, region VARCHAR(100), path VARCHAR(1000), modifiedDate BIGINT, size BIGINT)"
    226488       try: self.execute(sql)
    227489       except: self.logger.errorPair("Unable to create table", self.dvoDoneTable)
    228490
    229 
    230 
     491       self.resetDvoDetectionTables()
     492
     493    '''
     494    Gets a list of DVO regions that overlap with the defined box
     495    '''
     496    def getDvoRegions(self, minRa, maxRa, minDec, maxDec):
     497
     498        self.logger.debug("Querying DVO SkyTable for FITS files in this region")
     499
     500        regions = []
     501        self.getDvoRegionsForThisBox(regions, minRa, maxRa, minDec, maxDec)
     502
     503        # deal with 0/360 boundary
     504        if minRa < 0: self.getDvoRegionsForThisBox(regions, minRa + 360, 361 ,minDec, maxDec)
     505        if maxRa > 360: self.getDvoRegionsForThisBox(regions, 0, maxRa - 360 ,minDec, maxDec)
     506
     507        return regions
     508
     509    '''
     510    Gets a list of DVO regions that overlap with the defined box
     511    '''
     512    def getDvoRegionsForThisBox(self, regions, minRa, maxRa, minDec, maxDec):
     513
     514        sql = "SELECT name FROM " + self.dvoSkyTable + " \
     515               WHERE NOT ((" + str(maxRa) + " <= R_MIN) OR \
     516                       (" + str(minRa) + " >= R_MAX) OR \
     517                       (" + str(maxDec) + " <= D_MIN) OR \
     518                       (" + str(minDec) + " >= D_MAX)) "
     519
     520        try:
     521            rs = self.executeQuery(sql)
     522            while (rs.next()): regions.append(rs.getString(1))
     523            rs.close()
     524        except:
     525            self.logger.exception("Can't query for DVO regions")
     526
     527
Note: See TracChangeset for help on using the changeset viewer.