Package iceprod :: Package core :: Module metadata
[hide private]
[frames] | no frames]

Source Code for Module iceprod.core.metadata

  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   
29 -def job_subdir(proc):
30 return "%05d-%05d" % ((proc/1000)*1000,((proc+1000)/1000)*1000-1)
31
32 -class DIF_Plus:
33
34 - def __init__(self):
35 self.dif = DIF() 36 self.plus = Plus()
37
38 - def SetDIF(self,dif):
39 self.dif = dif
40
41 - def GetDIF(self):
42 return self.dif
43
44 - def SetPlus(self,plus):
45 self.plus = plus
46
47 - def GetPlus(self):
48 return self.plus
49
50 - def GetStoragePath(self):
51 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 path
60 61
62 - def MakeDict(self,proc):
63 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 params
85 86
87 -class DIF:
88 """ 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 } 139
140 - def __init__(self):
141 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
153 - def SetEntryId(self,entry_id):
154 self.entry_id = entry_id
155 - def GetEntryId(self):
156 return self.entry_id
157
158 - def SetEntryTitle(self,entry_title):
159 self.entry_title = entry_title
160 - def GetEntryTitle(self):
161 return self.entry_title
162
163 - def SetParameters(self,parameters):
164 self.parameters = parameters
165 - def GetParameters(self):
166 return self.parameters
167 - def GetValidParameters(self):
168 return self.valid_parameters
169
170 - def GetValidSourceNames(self):
171 return self.valid_source_names
172
173 - def GetValidSensorNames(self):
174 return self.valid_sensor_names
175 176
177 - def SetISOTopicCategory(self,iso_topic_category):
178 self.iso_topic_category = iso_topic_category
179 - def GetISOTopicCategory(self):
180 return self.iso_topic_category
181
182 - def SetDataCenter(self,datacenter):
183 self.data_center = datacenter
184 - def GetDataCenter(self):
185 return self.data_center
186
187 - def SetSummary(self,summary):
188 self.summary = summary
189 - def GetSummary(self):
190 return self.summary
191
192 - def SetMetadataName(self,metadata_name):
193 self.metadata_name = metadata_name
194 - def GetMetadataName(self):
195 return self.metadata_name
196
197 - def SetMetadataVersion(self,metadata_version):
198 self.metadata_version = metadata_version
199 - def GetMetadataVersion(self):
200 return self.metadata_version
201
202 - def SetSensorName(self,sensor_name):
203 self.sensor_name = sensor_name.split(' > ')[0]
204
205 - def GetSensorName(self):
206 return self.sensor_name
207
208 - def GetSensorNameLong(self):
209 return "%s > %s" % (self.sensor_name,self.valid_sensor_names[self.sensor_name])
210
211 - def SetSourceName(self,source_name):
212 self.source_name = source_name.split(' > ')[0]
213
214 - def GetSourceName(self):
215 return self.source_name
216
217 - def GetSourceNameLong(self):
218 return "%s > %s" % (self.source_name,self.valid_source_names[self.source_name])
219
220 - def SetDIFCreationDate(self,dif_creation_date):
221 self.dif_creation_date = dif_creation_date
222 - def GetDIFCreationDate(self):
223 return self.dif_creation_date
224
225 -class DataCenter:
226 - def __init__(self):
227 self.datacenter_name = "UWI-MAD/A3RI > Antarctic Astronomy and Astrophysics Research Institute, University of Wisconsin, Madison" 228 self.personnel = [Personnel()]
229
230 - def SetDataCenterName(self,datacenter_name):
231 self.datacenter_name = datacenter_name
232 - def GetDataCenterName(self):
233 return self.datacenter_name
234
235 - def AddPersonnel(self,personnel):
236 self.personnel.append(personnel)
237
238 - def GetPersonnel(self):
239 return self.personnel
240
241 -class Personnel:
242 - def __init__(self):
243 self.role = "Data Center Contact" 244 self.email = "datacenter@icecube.wisc.edu"
245
246 - def SetRole(self,role):
247 self.role = role
248 - def GetRole(self):
249 return self.role
250
251 - def SetEmail(self,email):
252 self.email = email
253 - def GetEmail(self):
254 return self.email
255
256 -class Plus:
257 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 ] 278
279 - def __init__(self):
280 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()
293
294 - def SetStartDatetime(self,start_datetime=None):
295 if not start_datetime: 296 self.start_datetime = time.strftime("%Y-%m-%dT%H:%M:%S") 297 else: 298 self.start_datetime = start_datetime
299
300 - def GetStartDatetime(self):
301 return self.start_datetime
302
303 - def SetEndDatetime(self,end_datetime=None):
304 if not end_datetime: 305 self.end_datetime = time.strftime("%Y-%m-%dT%H:%M:%S") 306 else: 307 self.end_datetime = end_datetime
308
309 - def GetEndDatetime(self):
310 return self.end_datetime
311
312 - def SetCategory(self,category):
313 self.category = category
314 - def GetCategory(self):
315 return self.category
316
317 - def SetSubCategory(self,category):
318 self.subcategory = category
319 - def GetSubCategory(self):
320 return self.subcategory
321
322 - def GetValidCategories(self):
323 return self.valid_categories
324
325 - def SetRunNumber(self,run_number):
326 self.run_number = run_number
327 - def GetRunNumber(self):
328 return self.run_number
329
330 - def SetSimDBKey(self,simdb_key):
331 self.simdb_key = int(simdb_key)
332 - def GetSimDBKey(self):
333 return int(self.simdb_key)
334
335 - def SetI3DBKey(self,i3db_key):
336 self.i3db_key = i3db_key
337 - def GetI3DBKey(self):
338 return self.i3db_key
339
340 - def SetSteeringFile(self,steering_file):
341 self.steering_file = steering_file
342 - def GetSteeringFile(self):
343 return self.steering_file
344
345 - def SetLogFile(self,log_file):
346 self.log_file = log_file
347 - def GetLogFile(self):
348 return self.log_file
349
350 - def SetCommandLine(self,command_line):
351 self.command_line = command_line
352 - def GetCommandLine(self):
353 return self.command_line
354
355 - def AddProject(self,project):
356 self.projects[project.GetName()]=project
357 - def GetProjects(self):
358 return self.projects.values()
359 360
361 -class MetadataWriter:
362
363 - def __init__(self,difplus,writeprojects=True):
364 """ 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)
380
381 - def AddDIFPlus(self,doc,node):
382 383 dpnode = doc.createElement( 'DIF_Plus' ) 384 node.appendChild(dpnode) 385 self.LoadDIF(doc,dpnode) 386 self.LoadPlus(doc,dpnode)
387
388 - def LoadDIF(self,doc,node):
389 """ 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)
439
440 - def LoadPlus(self,doc,node):
441 """ 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 512
513 - def LoadDataCenter(self,doc):
514 """ 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 dataCenterElement
536 537
538 - def getDOM(self):
539 return self.doc
540
541 - def write_to_file(self, fname=None):
542 """ 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)
551
552 -class MetadataParser:
553
554 - def __init__(self):
555 self.difplus = DIF_Plus()
556
557 - def GetDIFPlus(self):
558 return self.difplus
559
560 - def ParseFile(self,config_file_name,validate=0):
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.difplus
580 581
582 - def LoadDIF(self,doc):
583 """ 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 634
635 - def LoadDataCenter(self,difElement):
636 """ 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)
659
660 - def LoadPlus(self,doc):
661 """ 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 return
721 722 723 if __name__ == '__main__': 724 725 dp = DIF_Plus() 726 writer = MetadataWriter(dp) 727 writer.write_to_file() 728