Add a method to return the runfolder name.
[htsworkflow.git] / htsworkflow / pipelines / gerald.py
index 7e2328ad3b7613f1886accef135e0698082f12ba..58f3081c2719a83c87c86822fed71db6be7d5235 100644 (file)
@@ -41,7 +41,10 @@ class Gerald(object):
             if len(container.getchildren()) > LANES_PER_FLOWCELL:
                 raise RuntimeError('GERALD config.xml file changed')
             lanes = [x.tag.split('_')[1] for x in container.getchildren()]
-            index = lanes.index(self._lane_id)
+            try:
+                index = lanes.index(self._lane_id)
+            except ValueError, e:
+                return None
             element = container[index]
             return element.text
         def _get_analysis(self):
@@ -88,7 +91,8 @@ class Gerald(object):
             # those consistently.
             for element in analysis:
                 sample, lane_id = element.tag.split('_')
-                self._lanes[lane_id] = Gerald.LaneParameters(self._gerald, lane_id)
+                self._lanes[int(lane_id)] = Gerald.LaneParameters(
+                                              self._gerald, lane_id)
 
         def __getitem__(self, key):
             if self._lane is None:
@@ -136,6 +140,32 @@ class Gerald(object):
         return time.mktime(self.date.timetuple())
     time = property(_get_time, doc='return run time as seconds since epoch')
 
+    def _get_experiment_root(self):
+        if self.tree is None:
+            return None
+        return self.tree.findtext('ChipWideRunParameters/EXPT_DIR_ROOT')
+
+    def _get_runfolder_name(self):
+        if self.tree is None:
+            return None
+
+        root = self._get_experiment_root()
+        if root is None:
+            root = ''
+        else:
+            root = os.path.join(root,'')
+            
+        experiment_dir = self.tree.findtext('ChipWideRunParameters/EXPT_DIR')
+        if experiment_dir is None:
+            return None
+        experiment_dir = experiment_dir.replace(root, '')
+        if len(experiment_dir) == 0:
+            return None
+
+        dirnames = experiment_dir.split(os.path.sep)
+        return dirnames[0]
+    runfolder_name = property(_get_runfolder_name)
+    
     def _get_version(self):
         if self.tree is None:
             return None
@@ -169,6 +199,7 @@ class Gerald(object):
         xml_version = int(tree.attrib.get('version', 0))
         if xml_version > Gerald.XML_VERSION:
             logging.warn('XML tree is a higher version than this class')
+        self.eland_results = ELAND()
         for element in list(tree):
             tag = element.tag.lower()
             if tag == Gerald.RUN_PARAMETERS.lower():
@@ -180,18 +211,21 @@ class Gerald(object):
             else:
                 logging.warn("Unrecognized tag %s" % (element.tag,))
 
-
 def gerald(pathname):
     g = Gerald()
-    g.pathname = pathname
-    path, name = os.path.split(pathname)
+    g.pathname = os.path.expanduser(pathname)
+    path, name = os.path.split(g.pathname)
     logging.info("Parsing gerald config.xml")
-    config_pathname = os.path.join(pathname, 'config.xml')
+    config_pathname = os.path.join(g.pathname, 'config.xml')
     g.tree = ElementTree.parse(config_pathname).getroot()
 
     # parse Summary.htm file
-    logging.info("Parsing Summary.htm")
-    summary_pathname = os.path.join(pathname, 'Summary.htm')
+    summary_pathname = os.path.join(g.pathname, 'Summary.xml')
+    if os.path.exists(summary_pathname):
+        logging.info("Parsing Summary.xml")
+    else:
+        summary_pathname = os.path.join(g.pathname, 'Summary.htm')
+        logging.info("Parsing Summary.htm")
     g.summary = Summary(summary_pathname)
     # parse eland files
     g.eland_results = eland(g.pathname, g)
@@ -201,4 +235,4 @@ if __name__ == "__main__":
   # quick test code
   import sys
   g = gerald(sys.argv[1])
-  #ElementTree.dump(g.get_elements())
\ No newline at end of file
+  #ElementTree.dump(g.get_elements())