take advantage of absolute_import to simplify import statements
[htsworkflow.git] / htsworkflow / pipelines / test / test_run_xml.py
1 from __future__ import absolute_import
2
3 import os
4 from unittest import TestCase
5 from six.moves import StringIO
6
7 from .simulate_runfolder import TESTDATA_DIR
8 from htsworkflow.pipelines.runfolder import load_pipeline_run_xml
9
10 from htsworkflow.pipelines.eland import SampleKey
11
12
13 class testLoadRunXML(TestCase):
14     def _check_run_xml(self, run_xml_name, results, eland_results=8):
15         run_xml_path = os.path.join(TESTDATA_DIR, run_xml_name)
16         run = load_pipeline_run_xml(run_xml_path)
17
18         self.failUnlessEqual(run.image_analysis.start, results['cycle_start'])
19         self.failUnlessEqual(run.image_analysis.stop, results['cycle_stop'])
20
21         query = SampleKey(read=1)
22         eland_summary_by_lane = run.gerald.eland_results.find_keys(query)
23         self.failUnlessEqual(len(list(eland_summary_by_lane)), eland_results)
24
25         runfolder_name = results['runfolder_name']
26         self.failUnlessEqual(run.runfolder_name, runfolder_name)
27         self.failUnlessEqual(run.gerald.runfolder_name, runfolder_name)
28
29         for (end, lane), lane_results in results['lane_results'].items():
30             for name, test_value in lane_results.items():
31                 xml_value = getattr(run.gerald.summary[end][lane], name)
32
33                 self.failUnlessEqual(xml_value, test_value,
34                     "%s[%s][%s]: %s %s != %s" % (run_xml_name, end, lane, name, xml_value, test_value))
35
36     def testVersion0(self):
37         run_xml_name = 'run_FC12150_2007-09-27.xml'
38         results = {'runfolder_name': '070924_USI-EAS44_0022_FC12150',
39                    'cycle_start': 1,
40                    'cycle_stop': 36,
41                    'lane_results': {
42                        # end, lane
43                        (0, 1): {
44                            'average_alignment_score': (12116.63, 596.07),
45                            'average_first_cycle_intensity': (500,36),
46                            'cluster': (31261, 6010),
47                            'cluster_pass_filter': None,
48                            'percent_error_rate': (2.07, 0.38),
49                            'percent_intensity_after_20_cycles': (74.74, 3.78),
50                            'percent_pass_filter_align': None,
51                            'percent_pass_filter_clusters': (27.38, 7.31),
52                            }
53                        }
54                    }
55         self._check_run_xml(run_xml_name, results, eland_results=0)
56
57     def testVersion1(self):
58
59         run_xml_name = 'run_207B2AAXX_2008-04-12.xml'
60         results = {'runfolder_name': '080408_HWI-EAS229_0023_207B2AAXX',
61                    'cycle_start': 1,
62                    'cycle_stop': 33,
63                    'lane_results': {
64                        # end, lane
65                        }
66                    }
67         self._check_run_xml(run_xml_name, results, eland_results=8)
68
69     def testVersion2(self):
70         run_xml_name = 'run_62DJMAAXX_2011-01-09.xml'
71         results = {'runfolder_name': '101229_ILLUMINA-EC5D15_00026_62DJMAAXX',
72                    'cycle_start': 1,
73                    'cycle_stop': 152,
74                    'lane_results': {
75                        # end, lane
76                        (0, 2): {
77                            'average_alignment_score': (171.98, 1.4),
78                            'average_first_cycle_intensity': (381, 5),
79                            'cluster': (443170, 10241),
80                            'cluster_pass_filter': (362709, 8335),
81                            'percent_error_rate': (4.13, 0.14),
82                            'percent_intensity_after_20_cycles': (85.89, 3.26),
83                            'percent_pass_filter_align': (79.73, 0.23),
84                            'percent_pass_filter_clusters': (81.85, 0.8),
85                            },
86                        (0, 5): {
87                            'average_alignment_score': None,
88                            'average_first_cycle_intensity': (362, 4),
89                            'cluster': (310619, 15946),
90                            'cluster_pass_filter': (277584, 13858),
91                            'percent_error_rate': None,
92                            'percent_intensity_after_20_cycles': (90.35, 1.12),
93                            'percent_pass_filter_align': None,
94                            'percent_pass_filter_clusters': (89.37, 0.25),
95                            }
96                        }
97                    }
98         self._check_run_xml(run_xml_name, results, eland_results=8)
99
100
101 def suite():
102     from unittest import TestSuite, defaultTestLoader
103     suite = TestSuite()
104     suite.addTests(defaultTestLoader.loadTestsFromTestCase(testLoadRunXML))
105     return suite
106
107
108 if __name__ == "__main__":
109     from unittest import main
110     main(defaultTest="suite")