| 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
31
33
37
40
43
46
49
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
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
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
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
157
162
168 return self.valid_parameters
169
171 return self.valid_source_names
172
174 return self.valid_sensor_names
175
176
181
186
191
196
201
204
207
209 return "%s > %s" % (self.sensor_name,self.valid_sensor_names[self.sensor_name])
210
213
216
218 return "%s > %s" % (self.source_name,self.valid_source_names[self.source_name])
219
224
227 self.datacenter_name = "UWI-MAD/A3RI > Antarctic Astronomy and Astrophysics Research Institute, University of Wisconsin, Madison"
228 self.personnel = [Personnel()]
229
234
236 self.personnel.append(personnel)
237
240
255
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
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
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
302
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
311
316
321
323 return self.valid_categories
324
329
334
339
344
349
354
356 self.projects[project.GetName()]=project
358 return self.projects.values()
359
360
362
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
382
383 dpnode = doc.createElement( 'DIF_Plus' )
384 node.appendChild(dpnode)
385 self.LoadDIF(doc,dpnode)
386 self.LoadPlus(doc,dpnode)
387
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
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
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
539 return self.doc
540
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
553
555 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.difplus
580
581
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
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
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
| Home | Trees | Indices | Help |
|---|
| Generated by Epydoc 3.0.1 on Fri Jan 4 16:45:28 2013 | http://epydoc.sourceforge.net |