2 from datetime import date
9 from htsworkflow.pipelines.runfolder import \
14 class Phasing(object):
16 PREPHASING = 'Prephasing'
18 def __init__(self, fromfile=None, xml=None):
21 self.prephasing = None
23 if fromfile is not None:
24 self._initialize_from_file(fromfile)
26 self.set_elements(xml)
28 def _initialize_from_file(self, pathname):
29 path, name = os.path.split(pathname)
30 basename, ext = os.path.splitext(name)
31 # the last character of the param base filename should be the
33 tree = ElementTree.parse(pathname).getroot()
34 self.set_elements(tree)
35 self.lane = int(basename[-1])
37 def get_elements(self):
38 root = ElementTree.Element(Phasing.PHASING, {'lane': str(self.lane)})
39 phasing = ElementTree.SubElement(root, Phasing.PHASING)
40 phasing.text = str(self.phasing)
41 prephasing = ElementTree.SubElement(root, Phasing.PREPHASING)
42 prephasing.text = str(self.prephasing)
45 def set_elements(self, tree):
46 if tree.tag not in ('Phasing', 'Parameters'):
47 raise ValueError('exptected Phasing or Parameters')
48 lane = tree.attrib.get('lane', None)
51 for element in list(tree):
52 if element.tag == Phasing.PHASING:
53 self.phasing = float(element.text)
54 elif element.tag == Phasing.PREPHASING:
55 self.prephasing = float(element.text)
57 class Bustard(object):
62 SOFTWARE_VERSION = 'version'
65 PARAMETERS = 'Parameters'
67 def __init__(self, xml=None):
69 self.date = date.today()
75 self.set_elements(xml)
78 return time.mktime(self.date.timetuple())
79 time = property(_get_time, doc='return run time as seconds since epoch')
82 print "Bustard version:", self.version
83 print "Run date", self.date
84 print "user:", self.user
85 for lane, tree in self.phasing.items():
89 def get_elements(self):
90 root = ElementTree.Element('Bustard',
91 {'version': str(Bustard.XML_VERSION)})
92 version = ElementTree.SubElement(root, Bustard.SOFTWARE_VERSION)
93 version.text = self.version
94 run_date = ElementTree.SubElement(root, Bustard.DATE)
95 run_date.text = str(self.time)
96 user = ElementTree.SubElement(root, Bustard.USER)
98 params = ElementTree.SubElement(root, Bustard.PARAMETERS)
99 for p in self.phasing.values():
100 params.append(p.get_elements())
103 def set_elements(self, tree):
104 if tree.tag != Bustard.BUSTARD:
105 raise ValueError('Expected "Bustard" SubElements')
106 xml_version = int(tree.attrib.get('version', 0))
107 if xml_version > Bustard.XML_VERSION:
108 logging.warn('Bustard XML tree is a higher version than this class')
109 for element in list(tree):
110 if element.tag == Bustard.SOFTWARE_VERSION:
111 self.version = element.text
112 elif element.tag == Bustard.DATE:
113 self.date = date.fromtimestamp(float(element.text))
114 elif element.tag == Bustard.USER:
115 self.user = element.text
116 elif element.tag == Bustard.PARAMETERS:
117 for param in element:
118 p = Phasing(xml=param)
119 self.phasing[p.lane] = p
121 raise ValueError("Unrecognized tag: %s" % (element.tag,))
125 def bustard(pathname):
127 Construct a Bustard object from pathname
130 path, name = os.path.split(pathname)
131 groups = name.split("_")
132 version = re.search(VERSION_RE, groups[0])
133 b.version = version.group(1)
134 t = time.strptime(groups[1], EUROPEAN_STRPTIME)
135 b.date = date(*t[0:3])
137 b.pathname = pathname
138 paramfiles = glob(os.path.join(pathname, "params?.xml"))
139 for paramfile in paramfiles:
140 phasing = Phasing(paramfile)
141 assert (phasing.lane >= 1 and phasing.lane <= 8)
142 b.phasing[phasing.lane] = phasing