2 Extract configuration from Illumina Bustard Directory.
4 This includes the version number, run date, bustard executable parameters, and
7 from datetime import date
14 from htsworkflow.pipelines.runfolder import \
20 __docformat__ = "restructuredtext en"
22 class Phasing(object):
24 PREPHASING = 'Prephasing'
26 def __init__(self, fromfile=None, xml=None):
29 self.prephasing = None
31 if fromfile is not None:
32 self._initialize_from_file(fromfile)
34 self.set_elements(xml)
36 def _initialize_from_file(self, pathname):
37 path, name = os.path.split(pathname)
38 basename, ext = os.path.splitext(name)
39 # the last character of the param base filename should be the
41 tree = ElementTree.parse(pathname).getroot()
42 self.set_elements(tree)
43 self.lane = int(basename[-1])
45 def get_elements(self):
46 root = ElementTree.Element(Phasing.PHASING, {'lane': str(self.lane)})
47 phasing = ElementTree.SubElement(root, Phasing.PHASING)
48 phasing.text = str(self.phasing)
49 prephasing = ElementTree.SubElement(root, Phasing.PREPHASING)
50 prephasing.text = str(self.prephasing)
53 def set_elements(self, tree):
54 if tree.tag not in ('Phasing', 'Parameters'):
55 raise ValueError('exptected Phasing or Parameters')
56 lane = tree.attrib.get('lane', None)
59 for element in list(tree):
60 if element.tag == Phasing.PHASING:
61 self.phasing = float(element.text)
62 elif element.tag == Phasing.PREPHASING:
63 self.prephasing = float(element.text)
65 class Bustard(object):
70 SOFTWARE_VERSION = 'version'
73 PARAMETERS = 'Parameters'
75 def __init__(self, xml=None):
77 self.date = date.today()
83 self.set_elements(xml)
86 return time.mktime(self.date.timetuple())
87 time = property(_get_time, doc='return run time as seconds since epoch')
90 print "Bustard version:", self.version
91 print "Run date", self.date
92 print "user:", self.user
93 for lane, tree in self.phasing.items():
97 def get_elements(self):
98 root = ElementTree.Element('Bustard',
99 {'version': str(Bustard.XML_VERSION)})
100 version = ElementTree.SubElement(root, Bustard.SOFTWARE_VERSION)
101 version.text = self.version
102 run_date = ElementTree.SubElement(root, Bustard.DATE)
103 run_date.text = str(self.time)
104 user = ElementTree.SubElement(root, Bustard.USER)
105 user.text = self.user
106 params = ElementTree.SubElement(root, Bustard.PARAMETERS)
107 for p in self.phasing.values():
108 params.append(p.get_elements())
111 def set_elements(self, tree):
112 if tree.tag != Bustard.BUSTARD:
113 raise ValueError('Expected "Bustard" SubElements')
114 xml_version = int(tree.attrib.get('version', 0))
115 if xml_version > Bustard.XML_VERSION:
116 logging.warn('Bustard XML tree is a higher version than this class')
117 for element in list(tree):
118 if element.tag == Bustard.SOFTWARE_VERSION:
119 self.version = element.text
120 elif element.tag == Bustard.DATE:
121 self.date = date.fromtimestamp(float(element.text))
122 elif element.tag == Bustard.USER:
123 self.user = element.text
124 elif element.tag == Bustard.PARAMETERS:
125 for param in element:
126 p = Phasing(xml=param)
127 self.phasing[p.lane] = p
129 raise ValueError("Unrecognized tag: %s" % (element.tag,))
133 def bustard(pathname):
135 Construct a Bustard object by analyzing an Illumina Bustard directory.
138 - `pathname`: A bustard directory
141 Fully initialized Bustard object.
144 path, name = os.path.split(pathname)
145 groups = name.split("_")
146 version = re.search(VERSION_RE, groups[0])
147 b.version = version.group(1)
148 t = time.strptime(groups[1], EUROPEAN_STRPTIME)
149 b.date = date(*t[0:3])
151 b.pathname = pathname
152 paramfiles = glob(os.path.join(pathname, "params?.xml"))
153 for paramfile in paramfiles:
154 phasing = Phasing(paramfile)
155 assert (phasing.lane >= 1 and phasing.lane <= 8)
156 b.phasing[phasing.lane] = phasing
161 Reconstruct a htsworkflow.pipelines.Bustard object from an xml block