Test 1.1rc1 style runs, which unfortunately require a hack for parsing
authorDiane Trout <diane@caltech.edu>
Tue, 9 Dec 2008 01:19:23 +0000 (01:19 +0000)
committerDiane Trout <diane@caltech.edu>
Tue, 9 Dec 2008 01:19:23 +0000 (01:19 +0000)
the summary.htm     files since illumina's html is invalid.
They forgot to use &lt; when writing <=. Most web browsers will ignore
it, but ElementTree is pickier.

Also as of this commit the summary parsing code still doesn't understand
paired end runs so the paired end summary file parsing tests still fail.

htsworkflow/pipelines/summary.py
htsworkflow/pipelines/test/simulate_runfolder.py
htsworkflow/pipelines/test/test_runfolder110.py [new file with mode: 0644]
htsworkflow/pipelines/test/test_runfolder_pair.py

index 8830177f5b7a059dc4d4a877ec2ef9d7cf447a59..ad07d06b3992a07b172766213deeeb279135fb0d 100644 (file)
@@ -161,7 +161,11 @@ class Summary(object):
         The contents of the h2 tag is considered to the name
         of the table.
         """
-        tree = ElementTree.parse(pathname).getroot()
+        # tree = ElementTree.parse(pathname).getroot()
+        # hack for 1.1rc1, this should be removed when possible.
+        file_body = open(pathname).read()
+        file_body = file_body.replace('CHASTITY<=', 'CHASTITY&lt;=')
+        tree = ElementTree.fromstring(file_body)
         body = tree.find('body')
         tables = {}
         for i in range(len(body)):
index f527a7b086fcdae31ed8f068cf5c80e5cb4b7ce4..112201a281f6e46369eda926484480e2b17b5d7d 100644 (file)
@@ -825,6 +825,412 @@ def make_summary100_htm(gerald_dir):
     f.write(summary_htm)
     f.close()
 
+def make_summary_htm_110(gerald_dir):
+    summary_htm = """<!--RUN_TIME Tue Oct 28 09:45:50 2008 -->
+<!--SOFTWARE_VERSION @(#) $Id: jerboa.pl,v 1.10 2008/07/23 15:18:30 mzerara Exp $-->
+<html>
+<body>
+
+<a name="Top"><h2><title>081017_HWI-EAS229_0062_30J55AAXX Summary</title></h2></a>
+<h1>Summary Information For Experiment 081017_HWI-EAS229_0062_30J55AAXX on Machine HWI-EAS229</h1>
+<h2><br></br>Chip Summary<br></br></h2>
+<table border="1" cellpadding="5">
+<tr><td>Machine</td><td>HWI-EAS229</td></tr>
+<tr><td>Run Folder</td><td>081017_HWI-EAS229_0062_30J55AAXX</td></tr>
+<tr><td>Chip ID</td><td>unknown</td></tr>
+</table>
+<h2><br></br>Chip Results Summary<br></br></h2>
+<table border="1" cellpadding="5">
+<tr>
+<td>Clusters</td>
+<td>Clusters (PF)</td>
+<td>Yield (kbases)</td>
+</tr>
+<tr><td>162491175</td>
+<td>99622159</td>
+<td>3686019</td>
+</tr>
+</table>
+<h2><br></br>Lane Parameter Summary<br></br></h2>
+<table border="1" cellpadding="5">
+<tr>
+<td>Lane</td>
+<td>Sample ID</td>
+<td>Sample Target</td>
+<td>Sample Type</td>
+<td>Length</td>
+<td>Filter</td>
+<td>Chast. Thresh.</td>
+<td>Num Tiles</td>
+<td>Tiles</td>
+</tr>
+<tr>
+<td>1</td>
+<td>unknown</td>
+<td>mm9</td>
+<td>ELAND</td>
+<td>37</td>
+<td>'((FAILED_CHASTITY<=1))'</td>
+<td>0.6</td>
+<td>100</td>
+<td><a href="#Lane1">Lane 1</a></td>
+</tr>
+<tr>
+<td>2</td>
+<td>unknown</td>
+<td>mm9</td>
+<td>ELAND</td>
+<td>37</td>
+<td>'((FAILED_CHASTITY<=1))'</td>
+<td>0.6</td>
+<td>100</td>
+<td><a href="#Lane2">Lane 2</a></td>
+</tr>
+<tr>
+<td>3</td>
+<td>unknown</td>
+<td>mm9</td>
+<td>ELAND</td>
+<td>37</td>
+<td>'((FAILED_CHASTITY<=1))'</td>
+<td>0.6</td>
+<td>100</td>
+<td><a href="#Lane3">Lane 3</a></td>
+</tr>
+<tr>
+<td>4</td>
+<td>unknown</td>
+<td>hg18</td>
+<td>ELAND</td>
+<td>37</td>
+<td>'((FAILED_CHASTITY<=1))'</td>
+<td>0.6</td>
+<td>100</td>
+<td><a href="#Lane4">Lane 4</a></td>
+</tr>
+<tr>
+<td>5</td>
+<td>unknown</td>
+<td>hg18</td>
+<td>ELAND</td>
+<td>37</td>
+<td>'((FAILED_CHASTITY<=1))'</td>
+<td>0.6</td>
+<td>100</td>
+<td><a href="#Lane5">Lane 5</a></td>
+</tr>
+<tr>
+<td>6</td>
+<td>unknown</td>
+<td>mm9</td>
+<td>ELAND</td>
+<td>37</td>
+<td>'((FAILED_CHASTITY<=1))'</td>
+<td>0.6</td>
+<td>100</td>
+<td><a href="#Lane6">Lane 6</a></td>
+</tr>
+<tr>
+<td>7</td>
+<td>unknown</td>
+<td>mm9</td>
+<td>ELAND</td>
+<td>37</td>
+<td>'((FAILED_CHASTITY<=1))'</td>
+<td>0.6</td>
+<td>100</td>
+<td><a href="#Lane7">Lane 7</a></td>
+</tr>
+<tr>
+<td>8</td>
+<td>unknown</td>
+<td>mm9</td>
+<td>ELAND</td>
+<td>37</td>
+<td>'((FAILED_CHASTITY<=1))'</td>
+<td>0.6</td>
+<td>100</td>
+<td><a href="#Lane8">Lane 8</a></td>
+</tr>
+</table>
+<h2><br></br>Lane Results Summary<br></br></h2>
+<table border="1" cellpadding="5">
+<tr>
+<td colspan="2">Lane Info</td>
+<td colspan="8">Tile Mean +/- SD for Lane</td>
+</tr>
+<tr>
+<td>Lane </td>
+<td>Lane Yield (kbases) </td>
+<td>Clusters (raw)</td>
+<td>Clusters (PF) </td>
+<td>1st Cycle Int (PF) </td>
+<td>% intensity after 20 cycles (PF) </td>
+<td>% PF Clusters </td>
+<td>% Align (PF) </td>
+<td>Alignment Score (PF) </td>
+<td> % Error Rate (PF) </td>
+</tr>
+<tr>
+<td>1</td>
+<td>435340</td>
+<td>190220 +/- 15118</td>
+<td>117659 +/- 8144</td>
+<td>273 +/- 16</td>
+<td>80.02 +/- 2.52</td>
+<td>62.15 +/- 5.54</td>
+<td>77.18 +/- 0.22</td>
+<td>13447.28 +/- 43.35</td>
+<td>2.78 +/- 0.13</td>
+</tr>
+<tr>
+<td>2</td>
+<td>462364</td>
+<td>190560 +/- 14399</td>
+<td>124963 +/- 5687</td>
+<td>271 +/- 16</td>
+<td>75.73 +/- 2.46</td>
+<td>65.83 +/- 4.12</td>
+<td>70.06 +/- 0.39</td>
+<td>12082.95 +/- 64.81</td>
+<td>3.22 +/- 0.09</td>
+</tr>
+<tr>
+<td>3</td>
+<td>468929</td>
+<td>187597 +/- 12369</td>
+<td>126737 +/- 5549</td>
+<td>274 +/- 16</td>
+<td>72.61 +/- 2.67</td>
+<td>67.69 +/- 2.72</td>
+<td>74.03 +/- 0.22</td>
+<td>12470.18 +/- 50.02</td>
+<td>4.27 +/- 0.08</td>
+</tr>
+<tr>
+<td>4</td>
+<td>491642</td>
+<td>204142 +/- 16877</td>
+<td>132876 +/- 4023</td>
+<td>253 +/- 16</td>
+<td>80.43 +/- 3.10</td>
+<td>65.39 +/- 3.84</td>
+<td>72.95 +/- 0.15</td>
+<td>13273.80 +/- 39.75</td>
+<td>0.78 +/- 0.10</td>
+</tr>
+<tr>
+<td>5</td>
+<td>433033</td>
+<td>247308 +/- 11600</td>
+<td>117036 +/- 4489</td>
+<td>273 +/- 11</td>
+<td>68.60 +/- 2.40</td>
+<td>47.48 +/- 3.63</td>
+<td>66.91 +/- 0.54</td>
+<td>11700.08 +/- 66.33</td>
+<td>2.62 +/- 0.13</td>
+</tr>
+<tr>
+<td>6</td>
+<td>483012</td>
+<td>204298 +/- 15640</td>
+<td>130543 +/- 6972</td>
+<td>254 +/- 11</td>
+<td>81.35 +/- 1.96</td>
+<td>64.14 +/- 4.40</td>
+<td>77.28 +/- 0.11</td>
+<td>14084.01 +/- 23.09</td>
+<td>0.71 +/- 0.03</td>
+</tr>
+<tr>
+<td>7</td>
+<td>474325</td>
+<td>202707 +/- 15404</td>
+<td>128196 +/- 9745</td>
+<td>255 +/- 13</td>
+<td>79.95 +/- 2.08</td>
+<td>63.48 +/- 5.63</td>
+<td>75.78 +/- 0.18</td>
+<td>13758.74 +/- 60.86</td>
+<td>0.88 +/- 0.12</td>
+</tr>
+<tr>
+<td>8</td>
+<td>437372</td>
+<td>198075 +/- 14702</td>
+<td>118208 +/- 14798</td>
+<td>259 +/- 14</td>
+<td>81.80 +/- 2.53</td>
+<td>59.85 +/- 7.67</td>
+<td>74.55 +/- 0.36</td>
+<td>13586.07 +/- 103.97</td>
+<td>0.71 +/- 0.15</td>
+</tr>
+<tr><td colspan="13">Tile mean across chip</td></tr>
+<tr>
+<td>Av.</td>
+<td></td>
+<td>203113</td>
+<td>124527</td>
+<td>264</td>
+<td>77.56</td>
+<td>62.00</td>
+<td>73.59</td>
+<td>13050.39</td>
+<td>2.00</td>
+</tr>
+</table>
+<h2><br></br>Expanded Lane Summary<br></br></h2>
+<table border="1" cellpadding="5">
+<tr>
+
+<tr><td colspan="2">Lane Info</td>
+<td colspan="2">Phasing Info</td>
+<td colspan="2">Raw Data (tile mean)</td>
+<td colspan="7">Filtered Data (tile mean)</td></tr>
+<td>Lane </td>
+<td>Clusters (tile mean) (raw)</td>
+<td>% Phasing </td>
+<td>% Prephasing </td>
+<td>% Error Rate (raw) </td>
+<td> Equiv Perfect Clusters (raw) </td>
+<td>% retained </td>
+<td>Cycle 2-4 Av Int (PF) </td>
+<td>Cycle 2-10 Av % Loss (PF) </td>
+<td>Cycle 10-20 Av % Loss (PF) </td>
+<td>% Align (PF) </td>
+<td>% Error Rate (PF) </td>
+<td> Equiv Perfect Clusters (PF) </td>
+</tr>
+<tr>
+<td>1</td>
+<td>190220</td>
+<td>0.6800</td>
+<td>0.2800</td>
+<td>3.17</td>
+<td>107262</td>
+<td>62.15</td>
+<td>241 +/- 13</td>
+<td>0.56 +/- 0.22</td>
+<td>0.29 +/- 0.14</td>
+<td>77.18</td>
+<td>2.78</td>
+<td>86184</td>
+</tr>
+<tr>
+<td>2</td>
+<td>190560</td>
+<td>0.6800</td>
+<td>0.2800</td>
+<td>3.53</td>
+<td>98678</td>
+<td>65.83</td>
+<td>238 +/- 14</td>
+<td>0.78 +/- 0.15</td>
+<td>0.53 +/- 0.15</td>
+<td>70.06</td>
+<td>3.22</td>
+<td>83090</td>
+</tr>
+<tr>
+<td>3</td>
+<td>187597</td>
+<td>0.6800</td>
+<td>0.2800</td>
+<td>4.44</td>
+<td>104008</td>
+<td>67.69</td>
+<td>233 +/- 14</td>
+<td>0.56 +/- 0.17</td>
+<td>0.59 +/- 0.26</td>
+<td>74.03</td>
+<td>4.27</td>
+<td>89278</td>
+</tr>
+<tr>
+<td>4</td>
+<td>204142</td>
+<td>0.6800</td>
+<td>0.2800</td>
+<td>1.38</td>
+<td>115765</td>
+<td>65.39</td>
+<td>239 +/- 14</td>
+<td>1.28 +/- 0.21</td>
+<td>0.77 +/- 0.21</td>
+<td>72.95</td>
+<td>0.78</td>
+<td>93475</td>
+</tr>
+<tr>
+<td>5</td>
+<td>247308</td>
+<td>0.6800</td>
+<td>0.2800</td>
+<td>3.40</td>
+<td>103006</td>
+<td>47.48</td>
+<td>242 +/- 10</td>
+<td>1.61 +/- 0.39</td>
+<td>1.21 +/- 0.21</td>
+<td>66.91</td>
+<td>2.62</td>
+<td>73768</td>
+</tr>
+<tr>
+<td>6</td>
+<td>204298</td>
+<td>0.6800</td>
+<td>0.2800</td>
+<td>1.33</td>
+<td>122233</td>
+<td>64.14</td>
+<td>242 +/- 12</td>
+<td>1.30 +/- 0.11</td>
+<td>0.73 +/- 0.22</td>
+<td>77.28</td>
+<td>0.71</td>
+<td>97646</td>
+</tr>
+<tr>
+<td>7</td>
+<td>202707</td>
+<td>0.6800</td>
+<td>0.2800</td>
+<td>1.51</td>
+<td>117513</td>
+<td>63.48</td>
+<td>238 +/- 13</td>
+<td>1.27 +/- 0.38</td>
+<td>0.66 +/- 0.22</td>
+<td>75.78</td>
+<td>0.88</td>
+<td>93659</td>
+</tr>
+<tr>
+<td>8</td>
+<td>198075</td>
+<td>0.6800</td>
+<td>0.2800</td>
+<td>1.41</td>
+<td>111115</td>
+<td>59.85</td>
+<td>244 +/- 12</td>
+<td>1.19 +/- 0.16</td>
+<td>0.65 +/- 0.29</td>
+<td>74.55</td>
+<td>0.71</td>
+<td>85327</td>
+</tr>
+</table>
+</body>
+</html>"""
+    pathname = os.path.join(gerald_dir, 'Summary.htm')
+    f = open(pathname, 'w')
+    f.write(summary_htm)
+    f.close()
+
 def make_summary_paired_htm(gerald_dir):
     summary_htm = """<!--RUN_TIME Thu Nov 13 15:11:29 2008 -->
 <!--SOFTWARE_VERSION @(#) $Id: jerboa.pl,v 1.94 2007/12/04 09:59:07 rshaw Exp $-->
diff --git a/htsworkflow/pipelines/test/test_runfolder110.py b/htsworkflow/pipelines/test/test_runfolder110.py
new file mode 100644 (file)
index 0000000..e1f3fdd
--- /dev/null
@@ -0,0 +1,292 @@
+#!/usr/bin/env python
+
+from datetime import datetime, date
+import os
+import tempfile
+import shutil
+import unittest
+
+from htsworkflow.pipelines import firecrest
+from htsworkflow.pipelines import bustard
+from htsworkflow.pipelines import gerald
+from htsworkflow.pipelines import runfolder
+from htsworkflow.pipelines.runfolder import ElementTree
+
+from htsworkflow.pipelines.test.simulate_runfolder import *
+
+
+def make_runfolder(obj=None):
+    """
+    Make a fake runfolder, attach all the directories to obj if defined
+    """
+    # make a fake runfolder directory
+    temp_dir = tempfile.mkdtemp(prefix='tmp_runfolder_')
+
+    runfolder_dir = os.path.join(temp_dir,
+                                 '081017_HWI-EAS229_0062_30J55AAXX')
+    os.mkdir(runfolder_dir)
+
+    data_dir = os.path.join(runfolder_dir, 'Data')
+    os.mkdir(data_dir)
+
+    firecrest_dir = os.path.join(data_dir,
+                                 'C1-37_Firecrest1.9.6_20-10-2008_diane')
+    os.mkdir(firecrest_dir)
+
+    matrix_dir = os.path.join(firecrest_dir, 'Matrix')
+    os.mkdir(matrix_dir)
+    make_matrix(matrix_dir)
+
+    bustard_dir = os.path.join(firecrest_dir,
+                               'Bustard1.9.6_20-10-2008_diane')
+    os.mkdir(bustard_dir)
+    make_phasing_params(bustard_dir)
+
+    gerald_dir = os.path.join(bustard_dir,
+                              'GERALD_20-10-2008_diane')
+    os.mkdir(gerald_dir)
+    make_gerald_config(gerald_dir)
+    make_summary_htm_110(gerald_dir)
+    make_eland_multi(gerald_dir)
+
+    if obj is not None:
+        obj.temp_dir = temp_dir
+        obj.runfolder_dir = runfolder_dir
+        obj.data_dir = data_dir
+        obj.image_analysis_dir = firecrest_dir
+        obj.matrix_dir = matrix_dir
+        obj.bustard_dir = bustard_dir
+        obj.gerald_dir = gerald_dir
+
+
+class RunfolderTests(unittest.TestCase):
+    """
+    Test components of the runfolder processing code
+    which includes firecrest, bustard, and gerald
+    """
+    def setUp(self):
+        # attaches all the directories to the object passed in
+        make_runfolder(self)
+
+    def tearDown(self):
+        shutil.rmtree(self.temp_dir)
+
+    def test_firecrest(self):
+        """
+        Construct a firecrest object
+        """
+        f = firecrest.firecrest(self.image_analysis_dir)
+        self.failUnlessEqual(f.version, '1.9.6')
+        self.failUnlessEqual(f.start, 1)
+        self.failUnlessEqual(f.stop, 37)
+        self.failUnlessEqual(f.user, 'diane')
+        self.failUnlessEqual(f.date, date(2008,10,20))
+
+        xml = f.get_elements()
+        # just make sure that element tree can serialize the tree
+        xml_str = ElementTree.tostring(xml)
+
+        f2 = firecrest.Firecrest(xml=xml)
+        self.failUnlessEqual(f.version, f2.version)
+        self.failUnlessEqual(f.start,   f2.start)
+        self.failUnlessEqual(f.stop,    f2.stop)
+        self.failUnlessEqual(f.user,    f2.user)
+
+    def test_bustard(self):
+        """
+        construct a bustard object
+        """
+        b = bustard.bustard(self.bustard_dir)
+        self.failUnlessEqual(b.version, '1.9.6')
+        self.failUnlessEqual(b.date,    date(2008,10,20))
+        self.failUnlessEqual(b.user,    'diane')
+        self.failUnlessEqual(len(b.phasing), 8)
+        self.failUnlessAlmostEqual(b.phasing[8].phasing, 0.0099)
+
+        xml = b.get_elements()
+        b2 = bustard.Bustard(xml=xml)
+        self.failUnlessEqual(b.version, b2.version)
+        self.failUnlessEqual(b.date,    b2.date )
+        self.failUnlessEqual(b.user,    b2.user)
+        self.failUnlessEqual(len(b.phasing), len(b2.phasing))
+        for key in b.phasing.keys():
+            self.failUnlessEqual(b.phasing[key].lane,
+                                 b2.phasing[key].lane)
+            self.failUnlessEqual(b.phasing[key].phasing,
+                                 b2.phasing[key].phasing)
+            self.failUnlessEqual(b.phasing[key].prephasing,
+                                 b2.phasing[key].prephasing)
+
+    def test_gerald(self):
+        # need to update gerald and make tests for it
+        g = gerald.gerald(self.gerald_dir)
+
+        self.failUnlessEqual(g.version,
+            '@(#) Id: GERALD.pl,v 1.68.2.2 2007/06/13 11:08:49 km Exp')
+        self.failUnlessEqual(g.date, datetime(2008,4,19,19,8,30))
+        self.failUnlessEqual(len(g.lanes), len(g.lanes.keys()))
+        self.failUnlessEqual(len(g.lanes), len(g.lanes.items()))
+
+
+        # list of genomes, matches what was defined up in
+        # make_gerald_config.
+        # the first None is to offset the genomes list to be 1..9
+        # instead of pythons default 0..8
+        genomes = [None, '/g/dm3', '/g/equcab1', '/g/equcab1', '/g/canfam2',
+                         '/g/hg18', '/g/hg18', '/g/hg18', '/g/hg18', ]
+
+        # test lane specific parameters from gerald config file
+        for i in range(1,9):
+            cur_lane = g.lanes[str(i)]
+            self.failUnlessEqual(cur_lane.analysis, 'eland')
+            self.failUnlessEqual(cur_lane.eland_genome, genomes[i])
+            self.failUnlessEqual(cur_lane.read_length, '32')
+            self.failUnlessEqual(cur_lane.use_bases, 'Y'*32)
+
+        # I want to be able to use a simple iterator
+        for l in g.lanes.values():
+          self.failUnlessEqual(l.analysis, 'eland')
+          self.failUnlessEqual(l.read_length, '32')
+          self.failUnlessEqual(l.use_bases, 'Y'*32)
+
+        # raw cluster numbers extracted from summary file
+        # its the first +/- value in the lane results summary
+        # section
+        clusters = [None,
+                    (190220, 15118), (190560, 14399),
+                    (187597, 12369), (204142, 16877),
+                    (247308, 11600), (204298, 15640),
+                    (202707, 15404), (198075, 14702),]
+
+        for i in range(1,9):
+            summary_lane = g.summary[str(i)]
+            self.failUnlessEqual(summary_lane.cluster, clusters[i])
+            self.failUnlessEqual(summary_lane.lane, str(i))
+
+        xml = g.get_elements()
+        # just make sure that element tree can serialize the tree
+        xml_str = ElementTree.tostring(xml)
+        g2 = gerald.Gerald(xml=xml)
+
+        # do it all again after extracting from the xml file
+        self.failUnlessEqual(g.version, g2.version)
+        self.failUnlessEqual(g.date, g2.date)
+        self.failUnlessEqual(len(g.lanes.keys()), len(g2.lanes.keys()))
+        self.failUnlessEqual(len(g.lanes.items()), len(g2.lanes.items()))
+
+        # test lane specific parameters from gerald config file
+        for i in range(1,9):
+            g_lane = g.lanes[str(i)]
+            g2_lane = g2.lanes[str(i)]
+            self.failUnlessEqual(g_lane.analysis, g2_lane.analysis)
+            self.failUnlessEqual(g_lane.eland_genome, g2_lane.eland_genome)
+            self.failUnlessEqual(g_lane.read_length, g2_lane.read_length)
+            self.failUnlessEqual(g_lane.use_bases, g2_lane.use_bases)
+
+        # test (some) summary elements
+        for i in range(1,9):
+            g_summary = g.summary[str(i)]
+            g2_summary = g2.summary[str(i)]
+            self.failUnlessEqual(g_summary.cluster, g2_summary.cluster)
+            self.failUnlessEqual(g_summary.lane, g2_summary.lane)
+
+            g_eland = g.eland_results
+            g2_eland = g2.eland_results
+            for lane in g_eland.keys():
+                self.failUnlessEqual(g_eland[lane].reads,
+                                     g2_eland[lane].reads)
+                self.failUnlessEqual(len(g_eland[lane].mapped_reads),
+                                     len(g2_eland[lane].mapped_reads))
+                for k in g_eland[lane].mapped_reads.keys():
+                    self.failUnlessEqual(g_eland[lane].mapped_reads[k],
+                                         g2_eland[lane].mapped_reads[k])
+
+                self.failUnlessEqual(len(g_eland[lane].match_codes),
+                                     len(g2_eland[lane].match_codes))
+                for k in g_eland[lane].match_codes.keys():
+                    self.failUnlessEqual(g_eland[lane].match_codes[k],
+                                         g2_eland[lane].match_codes[k])
+
+
+    def test_eland(self):
+        hg_map = {'Lambda.fa': 'Lambda.fa'}
+        for i in range(1,22):
+          short_name = 'chr%d.fa' % (i,)
+          long_name = 'hg18/chr%d.fa' % (i,)
+          hg_map[short_name] = long_name
+
+        genome_maps = { '1':hg_map, '2':hg_map, '3':hg_map, '4':hg_map,
+                        '5':hg_map, '6':hg_map, '7':hg_map, '8':hg_map }
+        eland = gerald.eland(self.gerald_dir, genome_maps=genome_maps)
+
+        for i in range(1,9):
+            lane = eland[str(i)]
+            self.failUnlessEqual(lane.reads, 4)
+            self.failUnlessEqual(lane.sample_name, "s")
+            self.failUnlessEqual(lane.lane_id, unicode(i))
+            self.failUnlessEqual(len(lane.mapped_reads), 15)
+            self.failUnlessEqual(lane.mapped_reads['hg18/chr5.fa'], 4)
+            self.failUnlessEqual(lane.match_codes['U0'], 1)
+            self.failUnlessEqual(lane.match_codes['R0'], 2)
+            self.failUnlessEqual(lane.match_codes['U1'], 1)
+            self.failUnlessEqual(lane.match_codes['R1'], 9)
+            self.failUnlessEqual(lane.match_codes['U2'], 0)
+            self.failUnlessEqual(lane.match_codes['R2'], 12)
+            self.failUnlessEqual(lane.match_codes['NM'], 1)
+            self.failUnlessEqual(lane.match_codes['QC'], 0)
+
+        xml = eland.get_elements()
+        # just make sure that element tree can serialize the tree
+        xml_str = ElementTree.tostring(xml)
+        e2 = gerald.ELAND(xml=xml)
+
+        for i in range(1,9):
+            l1 = eland[str(i)]
+            l2 = e2[str(i)]
+            self.failUnlessEqual(l1.reads, l2.reads)
+            self.failUnlessEqual(l1.sample_name, l2.sample_name)
+            self.failUnlessEqual(l1.lane_id, l2.lane_id)
+            self.failUnlessEqual(len(l1.mapped_reads), len(l2.mapped_reads))
+            self.failUnlessEqual(len(l1.mapped_reads), 15)
+            for k in l1.mapped_reads.keys():
+                self.failUnlessEqual(l1.mapped_reads[k],
+                                     l2.mapped_reads[k])
+
+            self.failUnlessEqual(len(l1.match_codes), 9)
+            self.failUnlessEqual(len(l1.match_codes), len(l2.match_codes))
+            for k in l1.match_codes.keys():
+                self.failUnlessEqual(l1.match_codes[k],
+                                     l2.match_codes[k])
+
+    def test_runfolder(self):
+        runs = runfolder.get_runs(self.runfolder_dir)
+
+        # do we get the flowcell id from the filename?
+        self.failUnlessEqual(len(runs), 1)
+        name = 'run_30J55AAXX_2008-10-20.xml'
+        self.failUnlessEqual(runs[0].name, name)
+
+        # do we get the flowcell id from the FlowcellId.xml file
+        make_flowcell_id(self.runfolder_dir, '30J55AAXX')
+        runs = runfolder.get_runs(self.runfolder_dir)
+        self.failUnlessEqual(len(runs), 1)
+        name = 'run_30J55AAXX_2008-10-20.xml'
+        self.failUnlessEqual(runs[0].name, name)
+
+        r1 = runs[0]
+        xml = r1.get_elements()
+        xml_str = ElementTree.tostring(xml)
+
+        r2 = runfolder.PipelineRun(xml=xml)
+        self.failUnlessEqual(r1.name, r2.name)
+        self.failIfEqual(r2.image_analysis, None)
+        self.failIfEqual(r2.bustard, None)
+        self.failIfEqual(r2.gerald, None)
+
+
+def suite():
+    return unittest.makeSuite(RunfolderTests,'test')
+
+if __name__ == "__main__":
+    unittest.main(defaultTest="suite")
+
index e5997b7d03cbc922431c1e76e4c824e06a78750e..20dc0d7be08158a08e650aeb3cc456591ac26606 100644 (file)
@@ -6,7 +6,7 @@ import tempfile
 import shutil
 import unittest
 
-from htsworkflow.pipelines import ipar
+from htsworkflow.pipelines import firecrest
 from htsworkflow.pipelines import bustard
 from htsworkflow.pipelines import gerald
 from htsworkflow.pipelines import runfolder
@@ -29,7 +29,7 @@ def make_runfolder(obj=None):
     data_dir = os.path.join(runfolder_dir, 'Data')
     os.mkdir(data_dir)
 
-    ipar_dir = make_firecrest_dir(data_dir, "1.9.2", 1, 74)
+    ipar_dir = make_firecrest_dir(data_dir, "1.9.6", 1, 152)
 
     matrix_dir = os.path.join(ipar_dir, 'Matrix')
     os.mkdir(matrix_dir)
@@ -69,25 +69,28 @@ class RunfolderTests(unittest.TestCase):
     def tearDown(self):
         shutil.rmtree(self.temp_dir)
 
-    def test_ipar(self):
+    def test_firecrest(self):
         """
         Construct a firecrest object
         """
-        i = ipar.ipar(self.image_analysis_dir)
-        self.failUnlessEqual(i.version, '2.01.192.0')
-        self.failUnlessEqual(i.start, 1)
-        self.failUnlessEqual(i.stop, 37)
-
-        xml = i.get_elements()
+        f = firecrest.firecrest(self.image_analysis_dir)
+        self.failUnlessEqual(f.version, '1.9.6')
+        self.failUnlessEqual(f.start, 1)
+        self.failUnlessEqual(f.stop, 152)
+        self.failUnlessEqual(f.user, 'diane')
+        # As of 2008-12-8, the date was being set in 
+        # simulate_runfolder.make_firecrest_dir
+        self.failUnlessEqual(f.date, date(2008,4,12))
+
+        xml = f.get_elements()
         # just make sure that element tree can serialize the tree
         xml_str = ElementTree.tostring(xml)
 
-        i2 = ipar.IPAR(xml=xml)
-        self.failUnlessEqual(i.version, i2.version)
-        self.failUnlessEqual(i.start,   i2.start)
-        self.failUnlessEqual(i.stop,    i2.stop)
-        self.failUnlessEqual(i.date,    i2.date)
-        self.failUnlessEqual(i.file_list(), i2.file_list())
+        f2 = firecrest.Firecrest(xml=xml)
+        self.failUnlessEqual(f.version, f2.version)
+        self.failUnlessEqual(f.start,   f2.start)
+        self.failUnlessEqual(f.stop,    f2.stop)
+        self.failUnlessEqual(f.user,    f2.user)
 
     def test_bustard(self):
         """