2 Provide access to information stored in the GERALD directory.
4 from datetime import datetime, date
9 from htsworkflow.pipelines.summary import Summary
10 from htsworkflow.pipelines.eland import eland
12 from htsworkflow.pipelines.runfolder import \
17 from htsworkflow.util.ethelp import indent, flatten
21 Capture meaning out of the GERALD directory
25 RUN_PARAMETERS='RunParameters'
28 class LaneParameters(object):
30 Make it easy to access elements of LaneSpecificRunParameters from python
32 def __init__(self, gerald, key):
36 def __get_attribute(self, xml_tag):
37 subtree = self._gerald.tree.find('LaneSpecificRunParameters')
38 container = subtree.find(xml_tag)
41 if len(container.getchildren()) > LANES_PER_FLOWCELL:
42 raise RuntimeError('GERALD config.xml file changed')
43 lanes = [x.tag.split('_')[1] for x in container.getchildren()]
44 index = lanes.index(self._key)
45 element = container[index]
47 def _get_analysis(self):
48 return self.__get_attribute('ANALYSIS')
49 analysis = property(_get_analysis)
51 def _get_eland_genome(self):
52 genome = self.__get_attribute('ELAND_GENOME')
53 # default to the chipwide parameters if there isn't an
54 # entry in the lane specific paramaters
56 subtree = self._gerald.tree.find('ChipWideRunParameters')
57 container = subtree.find('ELAND_GENOME')
58 genome = container.text
60 eland_genome = property(_get_eland_genome)
62 def _get_read_length(self):
63 return self.__get_attribute('READ_LENGTH')
64 read_length = property(_get_read_length)
66 def _get_use_bases(self):
67 return self.__get_attribute('USE_BASES')
68 use_bases = property(_get_use_bases)
70 class LaneSpecificRunParameters(object):
72 Provide access to LaneSpecificRunParameters
74 def __init__(self, gerald):
77 def __getitem__(self, key):
78 return Gerald.LaneParameters(self._gerald, key)
80 if self._keys is None:
81 tree = self._gerald.tree
82 analysis = tree.find('LaneSpecificRunParameters/ANALYSIS')
83 # according to the pipeline specs I think their fields
84 # are sampleName_laneID, with sampleName defaulting to s
85 # since laneIDs are constant lets just try using
87 self._keys = [ x.tag.split('_')[1] for x in analysis]
90 return [ self[x] for x in self.keys() ]
92 return zip(self.keys(), self.values())
94 return len(self.keys())
96 def __init__(self, xml=None):
100 # parse lane parameters out of the config.xml file
101 self.lanes = Gerald.LaneSpecificRunParameters(self)
104 self.eland_results = None
107 self.set_elements(xml)
110 if self.tree is None:
111 return datetime.today()
112 timestamp = self.tree.findtext('ChipWideRunParameters/TIME_STAMP')
113 epochstamp = time.mktime(time.strptime(timestamp, '%c'))
114 return datetime.fromtimestamp(epochstamp)
115 date = property(_get_date)
118 return time.mktime(self.date.timetuple())
119 time = property(_get_time, doc='return run time as seconds since epoch')
121 def _get_version(self):
122 if self.tree is None:
124 return self.tree.findtext('ChipWideRunParameters/SOFTWARE_VERSION')
125 version = property(_get_version)
129 Debugging function, report current object
131 print 'Gerald version:', self.version
132 print 'Gerald run date:', self.date
133 print 'Gerald config.xml:', self.tree
136 def get_elements(self):
137 if self.tree is None or self.summary is None:
140 gerald = ElementTree.Element(Gerald.GERALD,
141 {'version': unicode(Gerald.XML_VERSION)})
142 gerald.append(self.tree)
143 gerald.append(self.summary.get_elements())
144 if self.eland_results:
145 gerald.append(self.eland_results.get_elements())
148 def set_elements(self, tree):
149 if tree.tag != Gerald.GERALD:
150 raise ValueError('exptected GERALD')
151 xml_version = int(tree.attrib.get('version', 0))
152 if xml_version > Gerald.XML_VERSION:
153 logging.warn('XML tree is a higher version than this class')
154 for element in list(tree):
155 tag = element.tag.lower()
156 if tag == Gerald.RUN_PARAMETERS.lower():
158 elif tag == Gerald.SUMMARY.lower():
159 self.summary = Summary(xml=element)
160 elif tag == ELAND.ELAND.lower():
161 self.eland_results = ELAND(xml=element)
163 logging.warn("Unrecognized tag %s" % (element.tag,))
166 def gerald(pathname):
168 g.pathname = pathname
169 path, name = os.path.split(pathname)
170 logging.info("Parsing gerald config.xml")
171 config_pathname = os.path.join(pathname, 'config.xml')
172 g.tree = ElementTree.parse(config_pathname).getroot()
174 # parse Summary.htm file
175 logging.info("Parsing Summary.htm")
176 summary_pathname = os.path.join(pathname, 'Summary.htm')
177 g.summary = Summary(summary_pathname)
179 g.eland_results = eland(g.pathname, g)