Home | Trees | Indices | Help |
---|
|
1 #! /usr/bin/env python 2 # 3 """ 4 A module for representing and writting XML metadata 5 6 copyright (c) 2005 the icecube collaboration 7 8 @version: $Revision: 1.0 $ 9 @date: $Date: $ 10 @author: Juan Carlos Diaz Velez <juancarlos@icecube.wisc.edu> 11 @todo: Add metadata reader to load and update files 12 13 """ 14 15 import sys,os 16 import string 17 import re 18 import logging 19 import time 20 21 from iceprod.core import ipxml 22 from dataclasses import * 23 from os.path import expandvars 24 from os.path import join 25 logger = logging.getLogger('metadata') 26 27 28 3133 37 40 43 46 4985 8651 sensor = self.dif.GetSensorName() 52 enddate = time.strptime(self.plus.GetEndDatetime(),"%Y-%m-%dT%H:%M:%S") 53 year = enddate[0] 54 month = enddate[1] 55 day = enddate[2] 56 simkey = self.GetPlus().GetSimDBKey() 57 category = self.plus.GetCategory() 58 path = join(sensor,str(year),category,'dataset_%d' % simkey) 59 return path60 6163 pathdict = { 64 "SIMULATION":"sim", 65 "EXPERIMENTAL":"exp", 66 "ICECUBE":"IceCube", 67 } 68 params = {} 69 params['sensor'] = self.dif.GetSensorName() 70 if pathdict.has_key(params['sensor']): 71 params['sensor'] = pathdict[params['sensor']] 72 enddate = time.strptime(self.plus.GetEndDatetime(),"%Y-%m-%dT%H:%M:%S") 73 params['year'] = enddate[0] 74 params['month'] = enddate[1] 75 params['day'] = enddate[2] 76 params['simkey'] = self.GetPlus().GetSimDBKey() 77 params['dataset_id'] = self.GetPlus().GetSimDBKey() 78 params['category'] = self.plus.GetCategory() 79 params['subcategory'] = self.plus.GetSubCategory() 80 params['subdirectory'] = job_subdir(proc) 81 params['source'] = self.dif.GetSourceName() 82 if pathdict.has_key(params['source']): 83 params['source'] = pathdict[params['source']] 84 return params88 """ 89 @todo: valid parameters should be read from an external file given 90 that they could change in the future. 91 """ 92 93 valid_parameters = [ 94 95 "SPACE SCIENCE > Astrophysics > Neutrinos", 96 "SPACE SCIENCE > Astrophysics > Neutrinos > Atmospheric", 97 "SPACE SCIENCE > Astrophysics > Neutrinos > Extraterrestrial Point Source", 98 "SPACE SCIENCE > Astrophysics > Neutrinos > Gamma Ray Burst", 99 "SPACE SCIENCE > Astrophysics > Neutrinos > WIMPS", 100 "SPACE SCIENCE > Astrophysics > Neutrinos > Diffuse Source", 101 "SPACE SCIENCE > Astrophysics > Neutrinos > Extreme High Energy", 102 "SPACE SCIENCE > Astrophysics > Neutrinos > Super Nova", 103 "SPACE SCIENCE > Astrophysics > Neutrinos > Cosmic Ray Muon Component", 104 "SPACE SCIENCE > Astrophysics > Neutrinos > Tau", 105 "SPACE SCIENCE > Astrophysics > Neutrinos > Cascades", 106 "SPACE SCIENCE > Astrophysics > Neutrinos > Galactic Plane", 107 "SPACE SCIENCE > Astrophysics > Cosmic Rays", 108 "SPACE SCIENCE > Astrophysics > Cosmic Rays > Composition", 109 "SPACE SCIENCE > Astrophysics > Cosmic Rays > Air Shower", 110 "SPACE SCIENCE > Astrophysics > Cosmic Rays > Cosmic Ray Muons", 111 "SPACE SCIENCE > Astrophysics > Cosmic Rays > Moon Shadow", 112 "SPACE SCIENCE > Engineering > Sensor Characteristics", 113 "SPACE SCIENCE > Engineering > Sensor Characteristics > Photomultiplier Tubes", 114 "SPACE SCIENCE > Engineering > Sensor Characteristics > Digital Optical Modules", 115 "EARTH SCIENCE > Cryosphere > Glaciers/Ice Sheets", 116 "EARTH SCIENCE > Cryosphere > Glaciers/Ice Sheets > Hot Water Drilling", 117 "EARTH SCIENCE > Cryosphere > Glaciers/Ice Sheets > Hot Water Drilling > Hole Drilling", 118 "EARTH SCIENCE > Cryosphere > Glaciers/Ice Sheets > Hot Water Drilling > Hole Refreeze" 119 ] 120 121 valid_source_names = { 122 "SIMULATION":"Data which are numerically generated", 123 "EXPERIMENTAL":"Data with an instrumentation based source" 124 } 125 valid_sensor_names = { 126 "AMANDA-A":"Prototype Antarctic Muon and Neutrino Detector Array", 127 "AMANDA":"Antarctic Muon and Neutrino Detector Array", 128 "SPASE-1":"South Pole Air Shower Experiment 1", 129 "SPASE-2":"South Pole Air Shower Experiment 2", 130 "VULCAN":"South Pole Air-Cherenkov Telescope", 131 "RICE":"Radio Ice Cherenkov Experiment", 132 "GASP":"Gamma Astronomy-South Pole", 133 "ICECUBE":"IceCube", 134 "ICETOP":"IceTop", 135 "EHWD":"Enhanced Hot Water Drill", 136 "SPTR":"South Pole TDRSS Relay", 137 "RPSC-MET":"Raytheon Polar Services Corporation Meteorology" 138 } 139224141 self.entry_id = "TBD" 142 self.entry_title = None 143 self.parameters = None 144 self.iso_topic_category = "geoscientificinformation" 145 self.data_center = DataCenter() 146 self.summary = None 147 self.metadata_name = "[CEOS IDN DIF]" 148 self.metadata_version = "9.4" 149 self.sensor_name = "ICECUBE" 150 self.source_name = "SIMULATION" 151 self.dif_creation_date = time.strftime("%Y-%m-%d")152 157 162168 return self.valid_parameters169171 return self.valid_source_names172174 return self.valid_sensor_names175 176 181 186 191 196 201 204 207209 return "%s > %s" % (self.sensor_name,self.valid_sensor_names[self.sensor_name])210 213 216218 return "%s > %s" % (self.source_name,self.valid_source_names[self.source_name])219240 255227 self.datacenter_name = "UWI-MAD/A3RI > Antarctic Astronomy and Astrophysics Research Institute, University of Wisconsin, Madison" 228 self.personnel = [Personnel()]229 234236 self.personnel.append(personnel)237257 258 valid_categories = [ 259 "unclassified", 260 "generated", 261 "propagated", 262 "unbiased", 263 "filtered", 264 "calibration", 265 "monitoring", 266 "webcam", 267 "hole", 268 "TestDAQ", 269 "FAT", 270 "log", 271 "upmu", 272 "minbias", 273 "cascades", 274 "high-energy", 275 "wimp", 276 "GRB" 277 ] 278359 360280 self.start_datetime = None 281 self.end_datetime = None 282 self.category = None 283 self.subcategory = None 284 self.run_number = None 285 self.simdb_key = 0 286 self.i3db_key = None 287 self.steering_file = None 288 self.log_file = None 289 self.command_line = None 290 self.projects = {} 291 self.SetEndDatetime() 292 self.SetStartDatetime()293295 if not start_datetime: 296 self.start_datetime = time.strftime("%Y-%m-%dT%H:%M:%S") 297 else: 298 self.start_datetime = start_datetime299 302304 if not end_datetime: 305 self.end_datetime = time.strftime("%Y-%m-%dT%H:%M:%S") 306 else: 307 self.end_datetime = end_datetime308 311 316 321323 return self.valid_categories324 329 334 339 344 349 354356 self.projects[project.GetName()]=project358 return self.projects.values()362540364 """ 365 Initialize and build DOM tree 366 from Metadata object 367 """ 368 369 self.writeprojects = writeprojects 370 self.difplus = difplus 371 dom = ipxml.getDOMImplementation() 372 doctype = dom.createDocumentType("DIF_Plus", None, None) 373 self.doc = dom.createDocument(ipxml.EMPTY_NAMESPACE, "DIF_Plus", doctype) 374 375 config = self.doc.documentElement 376 config.setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance') 377 config.setAttribute('xsi:noNamespaceSchemaLocation','IceCubeDIFPlus.xsd') 378 self.LoadDIF(self.doc,config) 379 self.LoadPlus(self.doc,config)380382 383 dpnode = doc.createElement( 'DIF_Plus' ) 384 node.appendChild(dpnode) 385 self.LoadDIF(doc,dpnode) 386 self.LoadPlus(doc,dpnode)387389 """ 390 Read DIF parameters from Metaproject tree 391 and generate the entries in DOM tree. 392 """ 393 394 dif = self.difplus.GetDIF() 395 difElement = doc.createElement( 'DIF' ) 396 entryIdElement = doc.createElement( 'Entry_ID') 397 difElement.appendChild(entryIdElement) 398 entryIdElement.appendChild(doc.createTextNode(dif.GetEntryId())) 399 400 entryTitleElement = doc.createElement( 'Entry_Title') 401 difElement.appendChild(entryTitleElement) 402 entryTitleElement.appendChild(doc.createTextNode(dif.GetEntryTitle())) 403 404 parametersElement = doc.createElement( 'Parameters') 405 difElement.appendChild(parametersElement) 406 parametersElement.appendChild(doc.createTextNode(dif.GetParameters())) 407 408 ISOTopicCatElement = doc.createElement( 'ISO_Topic_Category') 409 ISOTopicCatElement.appendChild(doc.createTextNode(dif.GetISOTopicCategory())) 410 difElement.appendChild(ISOTopicCatElement) 411 412 difElement.appendChild(self.LoadDataCenter(doc)) 413 414 summaryElement = doc.createElement( 'Summary') 415 summaryElement.appendChild(doc.createTextNode(dif.GetSummary())) 416 difElement.appendChild(summaryElement) 417 418 metadataNameElement = doc.createElement( 'Metadata_Name') 419 metadataNameElement.appendChild(doc.createTextNode(dif.GetMetadataName())) 420 difElement.appendChild(metadataNameElement) 421 422 metadataVersionElement = doc.createElement( 'Metadata_Version') 423 metadataVersionElement.appendChild(doc.createTextNode(dif.GetMetadataVersion())) 424 difElement.appendChild(metadataVersionElement) 425 426 sensorNameElement = doc.createElement( 'Sensor_Name') 427 sensorNameElement.appendChild(doc.createTextNode(dif.GetSensorNameLong())) 428 difElement.appendChild(sensorNameElement) 429 430 sourceNameElement = doc.createElement( 'Source_Name') 431 sourceNameElement.appendChild(doc.createTextNode(dif.GetSourceNameLong())) 432 difElement.appendChild(sourceNameElement) 433 434 difCreationDateElement = doc.createElement( 'DIF_Creation_Date') 435 difCreationDateElement.appendChild(doc.createTextNode(str(dif.GetDIFCreationDate()))) 436 difElement.appendChild(difCreationDateElement) 437 438 node.appendChild(difElement)439441 """ 442 Read Plus parameters from DIF_Plus tree 443 and generate the entries in DOM tree. 444 """ 445 plus = self.difplus.GetPlus() 446 447 plusElement= doc.createElement( 'Plus') 448 449 startDateTimeElement = doc.createElement( 'Start_DateTime') 450 startDateTimeElement.appendChild(doc.createTextNode(str(plus.GetStartDatetime()))) 451 plusElement.appendChild(startDateTimeElement) 452 453 endDateTimeElement = doc.createElement( 'End_DateTime') 454 endDateTimeElement.appendChild(doc.createTextNode(str(plus.GetEndDatetime()))) 455 plusElement.appendChild(endDateTimeElement) 456 457 categoryElement = doc.createElement( 'Category') 458 categoryElement.appendChild(doc.createTextNode(plus.GetCategory())) 459 plusElement.appendChild(categoryElement) 460 461 subCategoryElement = doc.createElement( 'Subcategory') 462 subCategoryElement.appendChild(doc.createTextNode(plus.GetSubCategory())) 463 plusElement.appendChild(subCategoryElement) 464 465 if plus.GetRunNumber(): 466 runNumberElement = doc.createElement( 'Run_Number') 467 runNumberElement.appendChild(doc.createTextNode(plus.GetRunNumber())) 468 plusElement.appendChild(runNumberElement) 469 470 if plus.GetI3DBKey(): 471 i3DBKeyElement = doc.createElement( 'I3Db_Key') 472 i3DBKeyElement.appendChild(doc.createTextNode(str(plus.GetI3DBKey()))) 473 plusElement.appendChild(i3DBKeyElement) 474 475 if plus.GetSimDBKey(): 476 simDBKeyElement = doc.createElement( 'SimDb_Key') 477 simDBKeyElement.appendChild(doc.createTextNode(str(plus.GetSimDBKey()))) 478 plusElement.appendChild(simDBKeyElement) 479 480 if self.writeprojects: 481 for p in plus.GetProjects(): 482 projectElement = doc.createElement('Project') 483 484 pnameElement = doc.createElement('Name') 485 pnameElement.appendChild(doc.createTextNode(p.GetName())) 486 logger.debug(p.GetName()) 487 488 pversionElement = doc.createElement('Version') 489 ver = p.GetVersion() 490 versionNode = doc.createTextNode( "%s.%s.%s" % (ver[0],ver[1],ver[2]) ) 491 pversionElement.appendChild(versionNode) 492 logger.debug(p.GetVersion()) 493 494 projectElement.appendChild(pnameElement) 495 projectElement.appendChild(pversionElement) 496 497 plusElement.appendChild(projectElement) 498 499 500 if plus.GetSteeringFile(): 501 SteeringFileElement = doc.createElement( 'Steering_File') 502 SteeringFileElement.appendChild(doc.createTextNode(plus.GetSteeringFile())) 503 plusElement.appendChild(SteeringFileElement) 504 505 if plus.GetCommandLine(): 506 commandLineElement = doc.createElement( 'Command_Line') 507 commandLineElement.appendChild(doc.createTextNode(plus.GetCommandLine())) 508 plusElement.appendChild(commandLineElement) 509 510 node.appendChild(plusElement)511 512514 """ 515 Read DataCenter parameters from DIF_Plus tree 516 and generate the entries in DOM tree. 517 """ 518 519 datacenter = self.difplus.GetDIF().GetDataCenter() 520 dataCenterElement = doc.createElement( 'Data_Center') 521 dataCenterNameElement = doc.createElement( 'Data_Center_Name') 522 dataCenterNameElement.appendChild(doc.createTextNode(datacenter.GetDataCenterName())) 523 dataCenterElement.appendChild(dataCenterNameElement) 524 525 for p in datacenter.GetPersonnel(): 526 personnelElement = doc.createElement( 'Personnel') 527 roleElement = doc.createElement( 'Role') 528 roleElement.appendChild(doc.createTextNode(p.GetRole())) 529 emailElement = doc.createElement( 'Email') 530 emailElement.appendChild(doc.createTextNode(p.GetEmail())) 531 personnelElement.appendChild(roleElement) 532 personnelElement.appendChild(emailElement) 533 dataCenterElement.appendChild(personnelElement) 534 535 return dataCenterElement536 537 539 return self.doc542 """ 543 Write DOM tree as human readable xml to a file 544 """ 545 if fname: 546 file_object = open(fname, "w") 547 ipxml.PrettyPrint(self.doc, file_object) 548 file_object.close() 549 else: 550 ipxml.PrettyPrint(self.doc)551553580 581555 self.difplus = DIF_Plus()556 559 561 562 # get the DOM tree 563 doc = None 564 try: # try to validate. Will fail with older configurations 565 566 # open xml file for reading 567 ipxmlin = open(config_file_name, 'r') 568 logger.debug("opened %s" % config_file_name) 569 doc = ipxml.Parse(xmlin, validate=validate) 570 ipxmlin.close() 571 572 except Exception, xe: 573 logger.error("%s : %s" (sys.exc_type, xe) ) 574 return 575 576 self.LoadDIF(doc) 577 self.LoadPlus(doc) 578 579 return self.difplus583 """ 584 Read DIF parameters from Metaproject tree 585 and generate the entries in DOM tree. 586 """ 587 dif = self.difplus.GetDIF() 588 589 difElement = doc.getElementsByTagName('DIF') 590 difElement = difElement[0] 591 592 entryIdElement = difElement.getElementsByTagName('Entry_ID') 593 entryIdElement = entryIdElement[0] 594 dif.SetEntryId(entryIdElement.firstChild.data) 595 596 entryTitleElement = difElement.getElementsByTagName('Entry_Title') 597 entryTitleElement = entryTitleElement[0] 598 dif.SetEntryTitle(entryTitleElement.firstChild.data) 599 600 parametersElement = difElement.getElementsByTagName('Parameters') 601 parametersElement = parametersElement[0] 602 dif.SetParameters(parametersElement.firstChild.data) 603 604 ISOTopicCatElement = difElement.getElementsByTagName('ISO_Topic_Category') 605 ISOTopicCatElement = ISOTopicCatElement[0] 606 dif.SetISOTopicCategory(ISOTopicCatElement.firstChild.data) 607 608 self.LoadDataCenter(difElement) 609 610 summaryElement = difElement.getElementsByTagName('Summary') 611 summaryElement = summaryElement[0] 612 dif.SetSummary(summaryElement.firstChild.data) 613 614 metadataNameElement = difElement.getElementsByTagName('Metadata_Name') 615 metadataNameElement = metadataNameElement[0] 616 dif.SetMetadataName( metadataNameElement.firstChild.data ) 617 618 metadataVersionElement = difElement.getElementsByTagName('Metadata_Version') 619 metadataVersionElement = metadataVersionElement[0] 620 dif.SetMetadataVersion( metadataVersionElement.firstChild.data ) 621 622 sensorNameElement = difElement.getElementsByTagName('Sensor_Name') 623 sensorNameElement = sensorNameElement[0] 624 dif.SetSensorName(sensorNameElement.firstChild.data) 625 626 sourceNameElement = difElement.getElementsByTagName('Source_Name') 627 sourceNameElement = sourceNameElement[0] 628 dif.SetSourceName(sourceNameElement.firstChild.data) 629 630 difCreationDateElement = difElement.getElementsByTagName('DIF_Creation_Date') 631 difCreationDateElement = difCreationDateElement[0] 632 dif.SetDIFCreationDate(difCreationDateElement.firstChild.data)633 634636 """ 637 Read DataCenter parameters from DIF_Plus tree 638 and generate the entries in DOM tree. 639 """ 640 641 datacenter = self.difplus.GetDIF().GetDataCenter() 642 643 dataCenterElement = difElement.getElementsByTagName('Data_Center') 644 dataCenterElement = dataCenterElement[0] 645 646 dataCenterNameElement = dataCenterElement.getElementsByTagName('Data_Center_Name') 647 dataCenterNameElement = dataCenterNameElement[0] 648 datacenter.SetDataCenterName(dataCenterNameElement.firstChild.data) 649 650 for p in dataCenterElement.getElementsByTagName('Personnel'): 651 personnel = Personnel() 652 roleElement = p.getElementsByTagName('Role') 653 roleElement = roleElement[0] 654 emailElement = p.getElementsByTagName('Email') 655 emailElement = emailElement[0] 656 personnel.SetRole(roleElement.firstChild.data) 657 personnel.SetEmail(emailElement.firstChild.data) 658 datacenter.AddPersonnel(personnel)659661 """ 662 Read Plus parameters from DIF_Plus tree 663 and generate the entries in DOM tree. 664 """ 665 plus = self.difplus.GetPlus() 666 667 plusElement = doc.getElementsByTagName('Plus') 668 plusElement = plusElement[0] 669 670 startDateTimeElement = plusElement.getElementsByTagName('Start_DateTime') 671 startDateTimeElement = startDateTimeElement[0] 672 plus.SetStartDatetime(startDateTimeElement.firstChild.data) 673 674 endDateTimeElement = plusElement.getElementsByTagName('End_DateTime') 675 endDateTimeElement = endDateTimeElement[0] 676 plus.SetEndDatetime(endDateTimeElement.firstChild.data) 677 678 categoryElement = plusElement.getElementsByTagName('Category') 679 categoryElement = categoryElement[0] 680 plus.SetCategory(categoryElement.firstChild.data) 681 682 subCategoryElement = plusElement.getElementsByTagName('Subcategory') 683 subCategoryElement = subCategoryElement[0] 684 plus.SetSubCategory(subCategoryElement.firstChild.data) 685 686 runNumberElement = plusElement.getElementsByTagName('Run_Number') 687 if runNumberElement: 688 plus.SetRunNumber(runNumberElement[0].firstChild.data) 689 690 simDBKeyElement = plusElement.getElementsByTagName('SimDb_Key') 691 if simDBKeyElement: 692 plus.SetSimDBKey(simDBKeyElement[0].firstChild.data) 693 694 i3DBKeyElement = plusElement.getElementsByTagName('I3Db_Key') 695 if i3DBKeyElement: 696 plus.SetI3DBKey(i3DBKeyElement[0].firstChild.data) 697 698 projectElement = plusElement.getElementsByTagName('Project') 699 for p in projectElement: 700 701 project = Project() 702 pnameElement = p.getElementsByTagName('Name') 703 project.SetName(pnameElement[0].firstChild.data) 704 705 pversionElement = p.getElementsByTagName('Version') 706 pver = pversionElement[0].firstChild.data 707 pver = tuple(map(int,pver.split("."))) 708 project.SetVersion(pver) 709 710 plus.AddProject(project) 711 712 713 steeringFileElement = plusElement.getElementsByTagName('Steering_File') 714 if steeringFileElement: 715 plus.SetSteeringFile(steeringFileElement[0].firstChild.data) 716 717 commandLineElement = plusElement.getElementsByTagName('Command_Line') 718 if commandLineElement: 719 plus.SetCommandLine(commandLineElement[0].firstChild.data) 720 return721 722 723 if __name__ == '__main__': 724 725 dp = DIF_Plus() 726 writer = MetadataWriter(dp) 727 writer.write_to_file() 728
Home | Trees | Indices | Help |
---|
Generated by Epydoc 3.0.1 on Fri Jan 4 16:45:28 2013 | http://epydoc.sourceforge.net |