ee6fded6371c45b02c10c40d3c16df76923a52a1
[htsworkflow.git] / htsworkflow / pipelines / firecrest.py
1 """
2 Extract information about the Firecrest run
3
4 Firecrest - class holding the properties we found
5 firecrest - Firecrest factory function initalized from a directory name
6 fromxml - Firecrest factory function initalized from an xml dump from
7           the Firecrest object.
8 """
9
10 from datetime import date
11 import os
12 import re
13 import time
14
15 from htsworkflow.pipelines.runfolder import \
16    ElementTree, \
17    VERSION_RE, \
18    EUROPEAN_STRPTIME
19
20 class Firecrest(object):
21     XML_VERSION=1
22
23     # xml tag names
24     FIRECREST = 'Firecrest'
25     SOFTWARE_VERSION = 'version'
26     START = 'FirstCycle'
27     STOP = 'LastCycle'
28     DATE = 'run_time'
29     USER = 'user'
30     MATRIX = 'matrix'
31
32     def __init__(self, xml=None):
33         self.start = None
34         self.stop = None
35         self.version = None
36         self.date = date.today()
37         self.user = None
38         self.matrix = None
39
40         if xml is not None:
41             self.set_elements(xml)
42         
43     def _get_time(self):
44         return time.mktime(self.date.timetuple())
45     time = property(_get_time, doc='return run time as seconds since epoch')
46
47     def dump(self):
48         print "Starting cycle:", self.start
49         print "Ending cycle:", self.stop
50         print "Firecrest version:", self.version
51         print "Run date:", self.date
52         print "user:", self.user
53
54     def get_elements(self):
55         attribs = {'version': str(Firecrest.XML_VERSION) }
56         root = ElementTree.Element(Firecrest.FIRECREST, attrib=attribs)
57         version = ElementTree.SubElement(root, Firecrest.SOFTWARE_VERSION)
58         version.text = self.version
59         start_cycle = ElementTree.SubElement(root, Firecrest.START)
60         start_cycle.text = str(self.start)
61         stop_cycle = ElementTree.SubElement(root, Firecrest.STOP)
62         stop_cycle.text = str(self.stop)
63         run_date = ElementTree.SubElement(root, Firecrest.DATE)
64         run_date.text = str(self.time)
65         user = ElementTree.SubElement(root, Firecrest.USER)
66         user.text = self.user
67         matrix = ElementTree.SubElement(root, Firecrest.MATRIX)
68         matrix.text = self.matrix
69         return root
70
71     def set_elements(self, tree):
72         if tree.tag != Firecrest.FIRECREST:
73             raise ValueError('Expected "Firecrest" SubElements')
74         xml_version = int(tree.attrib.get('version', 0))
75         if xml_version > Firecrest.XML_VERSION:
76             logging.warn('Firecrest XML tree is a higher version than this class')
77         for element in list(tree):
78             if element.tag == Firecrest.SOFTWARE_VERSION:
79                 self.version = element.text
80             elif element.tag == Firecrest.START:
81                 self.start = int(element.text)
82             elif element.tag == Firecrest.STOP:
83                 self.stop = int(element.text)
84             elif element.tag == Firecrest.DATE:
85                 self.date = date.fromtimestamp(float(element.text))
86             elif element.tag == Firecrest.USER:
87                 self.user = element.text
88             elif element.tag == Firecrest.MATRIX:
89                 self.matrix = element.text
90             else:
91                 raise ValueError("Unrecognized tag: %s" % (element.tag,))
92
93 def firecrest(pathname):
94     """
95     Examine the directory at pathname and initalize a Firecrest object
96     """
97     f = Firecrest()
98
99     # parse firecrest directory name
100     path, name = os.path.split(pathname)
101     groups = name.split('_')
102     # grab the start/stop cycle information
103     cycle = re.match("C([0-9]+)-([0-9]+)", groups[0])
104     f.start = int(cycle.group(1))
105     f.stop = int(cycle.group(2))
106     # firecrest version
107     version = re.search(VERSION_RE, groups[1])
108     f.version = (version.group(1))
109     # datetime
110     t = time.strptime(groups[2], EUROPEAN_STRPTIME)
111     f.date = date(*t[0:3])
112     # username
113     f.user = groups[3]
114
115     # should I parse this deeper than just stashing the 
116     # contents of the matrix file?
117     matrix_pathname = os.path.join(pathname, 'Matrix', 's_matrix.txt')
118     f.matrix = open(matrix_pathname, 'r').read()
119     return f
120
121 def fromxml(tree):
122     """
123     Initialize a Firecrest object from an element tree node
124     """
125     f = Firecrest()
126     f.set_elements(tree)
127     return f