- Timestamp:
- Mar 5, 2012, 5:19:48 PM (14 years ago)
- Location:
- branches/meh_branches/ppstack_test
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
ippToPsps/jython/scratchdb.py (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/meh_branches/ppstack_test
- Property svn:mergeinfo changed
-
branches/meh_branches/ppstack_test/ippToPsps/jython/scratchdb.py
r32062 r33415 19 19 Constructor 20 20 ''' 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): 23 40 24 41 if useFull: 25 self.dvo MetaTable = "dvoMetaFull"42 self.dvoImagesTable = "dvoImagesFull" 26 43 self.dvoDetectionTable = "dvoDetectionFull" 27 self.dvoDoneTable = "dvoDone"28 44 else: 29 self.dvo MetaTable = "dvoMeta"45 self.dvoImagesTable = "dvoImages" 30 46 self.dvoDetectionTable = "dvoDetection" 31 47 32 self.logger.debugPair("Using DVO meta table", self.dvoMetaTable)48 self.logger.debugPair("Using DVO images table", self.dvoImagesTable) 33 49 self.logger.debugPair("Using DVO detection table", self.dvoDetectionTable) 34 50 35 51 ''' 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 41 87 42 88 ''' … … 56 102 return surveyID 57 103 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 58 120 ''' 59 121 Gets imageID from extern ID 60 122 ''' 61 def getImageIDFromExternID(self, sourceID,externID):123 def getImageIDFromExternID(self, externID): 62 124 63 125 imageID = -1 64 126 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) 66 128 try: 67 129 rs = self.executeQuery(sql) … … 76 138 Gets DVO image flags 77 139 ''' 78 def getDvoImageFlags(self, sourceID,externID):140 def getDvoImageFlags(self, externID): 79 141 80 142 flags = 0 81 143 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) 83 145 try: 84 146 rs = self.executeQuery(sql) … … 92 154 Gets photcode (aka photoCalID from dvo table) 93 155 ''' 94 def getPhotoCalID(self, sourceID,externID):156 def getPhotoCalID(self, externID): 95 157 96 158 photcode = -1 97 159 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) 99 161 try: 100 162 rs = self.executeQuery(sql) … … 115 177 116 178 ''' 117 Inserts a new sourceID/imageID combo into dvo Meta179 Inserts a new sourceID/imageID combo into dvoImages 118 180 ''' 119 181 def insertNewDvoExternID(self, sourceID, externID): 120 182 121 sql = "INSERT INTO dvoMeta( \122 sourceID, \123 externID \183 sql = "INSERT INTO " + self.dvoImagesTable + " ( \ 184 SOURCE_ID, \ 185 EXTERN_ID \ 124 186 ) VALUES (\ 125 187 " + str(sourceID) + ", \ … … 129 191 130 192 ''' 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) 144 200 145 201 try: … … 147 203 rs.first() 148 204 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) 150 206 return True 151 207 else: 152 208 return False 153 209 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: 154 231 self.logger.exception("Unable to check whether this DVO table has been imported") 155 232 156 233 157 234 ''' 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 ''' 158 365 Creates a table for for ID matching 159 366 ''' 160 367 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 165 372 try: self.execute(sql) 166 373 except: pass 167 374 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) \ 179 382 )" 180 383 … … 183 386 self.logger.error("Unable to create DVO meta-data database table") 184 387 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 185 394 self.logger.debugPair("Creating DVO table", "dvoDetection") 186 395 sql = "CREATE TABLE dvoDetection ( \ 187 sourceID INT, \188 396 imageID INT, \ 189 397 ippDetectID BIGINT, \ … … 192 400 objID BIGINT, \ 193 401 flags INT, \ 194 PRIMARY KEY ( sourceID,imageID, ippDetectID) \402 PRIMARY KEY (imageID, ippDetectID) \ 195 403 )" 196 404 … … 201 409 202 410 ''' 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 209 456 self.logger.infoPair("Dropping table", self.dvoDetectionTable) 210 457 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)218 458 219 459 self.logger.infoPair("Creating table", self.dvoDetectionTable) 220 460 sql = "CREATE TABLE " + self.dvoDetectionTable + " LIKE dvoDetection" 221 461 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 224 486 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)" 226 488 try: self.execute(sql) 227 489 except: self.logger.errorPair("Unable to create table", self.dvoDoneTable) 228 490 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.
