From 96ead161dbfc27002d401bd46139ad7866421b76 Mon Sep 17 00:00:00 2001 From: Diane Trout Date: Tue, 15 May 2012 17:36:48 -0700 Subject: [PATCH] update summary.py to extract data from HiSeq runs. I also commited a much larger swath of hiseq summary files. One change is Summary and LaneResultSummary now has subclasses to handle the differences between the GA series and the HiSeq series runfolders. At this point the test code is dying trying to read the LaneParameters out of the gerald config file. --- htsworkflow/pipelines/eland.py | 4 +- htsworkflow/pipelines/gerald.py | 20 +- htsworkflow/pipelines/summary.py | 386 +++++++++++------- .../pipelines/test/simulate_runfolder.py | 33 +- .../pipelines/test/test_runfolder_rta1_12.py | 5 +- htsworkflow/pipelines/test/test_summary.py | 6 +- .../pipelines/test/testdata/1_12/Status.htm | 39 ++ .../testdata/1_12/Status_Files/ByCycle.htm | 107 +++++ .../testdata/1_12/Status_Files/ByCycle.js | 23 ++ .../1_12/Status_Files/ByCycleFrame.htm | 18 + .../testdata/1_12/Status_Files/ByLane.htm | 49 +++ .../test/testdata/1_12/Status_Files/ByLane.js | 55 +++ .../testdata/1_12/Status_Files/Charts.htm | 100 +++++ .../test/testdata/1_12/Status_Files/Charts.js | 140 +++++++ .../testdata/1_12/Status_Files/Controls.htm | 44 ++ .../testdata/1_12/Status_Files/Controls.js | 7 + .../testdata/1_12/Status_Files/Controls.xsl | 25 ++ .../test/testdata/1_12/Status_Files/Error.htm | 8 + .../1_12/Status_Files/RefreshBtn/r1.png | Bin 0 -> 602 bytes .../1_12/Status_Files/RefreshBtn/r2.png | Bin 0 -> 621 bytes .../1_12/Status_Files/RefreshBtn/r3.png | Bin 0 -> 683 bytes .../testdata/1_12/Status_Files/RunInfo.htm | 43 ++ .../testdata/1_12/Status_Files/RunInfo.xsl | 40 ++ .../testdata/1_12/Status_Files/RunName.xsl | 9 + .../testdata/1_12/Status_Files/Status.css | 230 +++++++++++ .../test/testdata/1_12/Status_Files/Status.js | 168 ++++++++ .../1_12/Status_Files/StatusError.htm | 8 + .../1_12/Status_Files/StatusUpdate.xsl | 15 + .../Status_Files/Summary.htm} | 0 .../testdata/1_12/Status_Files/Summary.js | 8 + .../testdata/1_12/Status_Files/Summary.xsl | 49 +++ .../1_12/Status_Files/TilesPerLane.xsl | 9 + .../testdata/1_12/Status_Files/illumina.png | Bin 0 -> 1384 bytes .../test/testdata/1_12/Summary-rta1_12.htm | 53 +++ .../{ => 1_12}/aligned_config_1_12.xml | 0 .../{ => 1_12}/demultiplex_1.12.4.2.xml | 0 .../demultiplexed_bustard_1.12.4.2.xml | 0 .../demultiplexed_summary_1.12.4.2.xml | 0 .../testdata/1_12/reports/Process Control.png | Bin 0 -> 28467 bytes .../test/testdata/1_12/reports/Status.xml | 25 ++ .../testdata/1_12/reports/StatusUpdate.xml | 1 + .../testdata/1_12/reports/Summary/read1.xml | 1 + .../testdata/1_12/reports/Summary/read2.xml | 1 + .../rta_basecalls_config_1.12.4.2.xml | 0 .../rta_intensities_config_1.12.4.2.xml | 0 45 files changed, 1545 insertions(+), 184 deletions(-) create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status.htm create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycle.htm create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycle.js create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycleFrame.htm create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByLane.htm create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByLane.js create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Charts.htm create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Charts.js create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.htm create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.js create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.xsl create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Error.htm create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/RefreshBtn/r1.png create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/RefreshBtn/r2.png create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/RefreshBtn/r3.png create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunInfo.htm create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunInfo.xsl create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunName.xsl create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Status.css create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Status.js create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/StatusError.htm create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/StatusUpdate.xsl rename htsworkflow/pipelines/test/testdata/{Summary-rta1_12.htm => 1_12/Status_Files/Summary.htm} (100%) create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.js create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.xsl create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/TilesPerLane.xsl create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Status_Files/illumina.png create mode 100755 htsworkflow/pipelines/test/testdata/1_12/Summary-rta1_12.htm rename htsworkflow/pipelines/test/testdata/{ => 1_12}/aligned_config_1_12.xml (100%) rename htsworkflow/pipelines/test/testdata/{ => 1_12}/demultiplex_1.12.4.2.xml (100%) rename htsworkflow/pipelines/test/testdata/{ => 1_12}/demultiplexed_bustard_1.12.4.2.xml (100%) rename htsworkflow/pipelines/test/testdata/{ => 1_12}/demultiplexed_summary_1.12.4.2.xml (100%) create mode 100755 htsworkflow/pipelines/test/testdata/1_12/reports/Process Control.png create mode 100755 htsworkflow/pipelines/test/testdata/1_12/reports/Status.xml create mode 100755 htsworkflow/pipelines/test/testdata/1_12/reports/StatusUpdate.xml create mode 100755 htsworkflow/pipelines/test/testdata/1_12/reports/Summary/read1.xml create mode 100755 htsworkflow/pipelines/test/testdata/1_12/reports/Summary/read2.xml rename htsworkflow/pipelines/test/testdata/{ => 1_12}/rta_basecalls_config_1.12.4.2.xml (100%) rename htsworkflow/pipelines/test/testdata/{ => 1_12}/rta_intensities_config_1.12.4.2.xml (100%) diff --git a/htsworkflow/pipelines/eland.py b/htsworkflow/pipelines/eland.py index c3aa327..cf6de6c 100644 --- a/htsworkflow/pipelines/eland.py +++ b/htsworkflow/pipelines/eland.py @@ -133,7 +133,7 @@ class ElandLane(ResultLane): if os.stat(self.pathname)[stat.ST_SIZE] == 0: raise RuntimeError("Eland isn't done, try again later.") - LOGGER.info("summarizing results for %s" % (self.pathname)) + LOGGER.debug("summarizing results for %s" % (self.pathname)) stream = autoopen(self.pathname, 'r') if self.eland_type == ELAND_SINGLE: @@ -582,7 +582,7 @@ def check_for_eland_file(basedir, pattern, lane_id, end): full_lane_id = "%d_%d" % ( lane_id, end ) basename = pattern % (full_lane_id,) - LOGGER.info("Eland pattern: %s" %(basename,)) + LOGGER.debug("Eland pattern: %s" %(basename,)) pathname = os.path.join(basedir, basename) if os.path.exists(pathname): LOGGER.info('found eland file in %s' % (pathname,)) diff --git a/htsworkflow/pipelines/gerald.py b/htsworkflow/pipelines/gerald.py index feb03e6..e13ac2a 100644 --- a/htsworkflow/pipelines/gerald.py +++ b/htsworkflow/pipelines/gerald.py @@ -7,7 +7,7 @@ import os import stat import time -from htsworkflow.pipelines.summary import Summary +from htsworkflow.pipelines.summary import Summary, SummaryGA, SummaryHiSeq from htsworkflow.pipelines.eland import eland, ELAND from htsworkflow.pipelines.runfolder import \ @@ -251,19 +251,21 @@ def gerald(pathname): # parse Summary.htm file summary_xml = os.path.join(g.pathname, 'Summary.xml') summary_htm = os.path.join(g.pathname, 'Summary.htm') - status_files_summary = os.path.join(g.pathname, '..', 'Data', 'Status_Files', 'Summary.htm') + report_summary = os.path.join(g.pathname, '..', 'Data', + 'reports', 'Summary', ) if os.path.exists(summary_xml): LOGGER.info("Parsing Summary.xml") - summary_pathname = summary_xml + g.summary = SummaryGA(summary_xml) + g.eland_results = eland(g.pathname, g) elif os.path.exists(summary_htm): - summary_pathname = os.path.join(g.pathname, 'Summary.htm') LOGGER.info("Parsing Summary.htm") - else: - summary_pathname = status_files_summary - LOGGER.info("Parsing %s" % (status_files_summary,)) - g.summary = Summary(summary_pathname) + g.summary = SummaryGA(summary_htm) + g.eland_results = eland(g.pathname, g) + elif os.path.isdir(report_summary): + LOGGER.info("Parsing %s" % (report_summary,)) + g.summary = SummaryHiSeq(report_summary) + # parse eland files - g.eland_results = eland(g.pathname, g) return g if __name__ == "__main__": diff --git a/htsworkflow/pipelines/summary.py b/htsworkflow/pipelines/summary.py index 8c5ab7f..6fdda43 100644 --- a/htsworkflow/pipelines/summary.py +++ b/htsworkflow/pipelines/summary.py @@ -1,6 +1,7 @@ """ Analyze the Summary.htm file produced by GERALD """ +import os import logging import re import types @@ -21,138 +22,6 @@ class Summary(object): XML_VERSION = 3 SUMMARY = 'Summary' - class LaneResultSummary(object): - """ - Parse the LaneResultSummary table out of Summary.htm - Mostly for the cluster number - """ - LANE_RESULT_SUMMARY = 'LaneResultSummary' - TAGS = { - 'LaneYield': 'lane_yield', - 'Cluster': 'cluster', # Raw - 'ClusterPF': 'cluster_pass_filter', - 'AverageFirstCycleIntensity': 'average_first_cycle_intensity', - 'PercentIntensityAfter20Cycles': 'percent_intensity_after_20_cycles', - 'PercentPassFilterClusters': 'percent_pass_filter_clusters', - 'PercentPassFilterAlign': 'percent_pass_filter_align', - 'AverageAlignmentScore': 'average_alignment_score', - 'PercentErrorRate': 'percent_error_rate' - } - # These are tags that have mean/stdev as found in the GERALD Summary.xml file - GERALD_TAGS = { - #'laneYield': 'lane_yield', #this is just a number - 'clusterCountRaw': 'cluster', # Raw - 'clusterCountPF': 'cluster_pass_filter', - 'oneSig': 'average_first_cycle_intensity', - 'signal20AsPctOf1': 'percent_intensity_after_20_cycles', - 'percentClustersPF': 'percent_pass_filter_clusters', - 'percentUniquelyAlignedPF': 'percent_pass_filter_align', - 'averageAlignScorePF': 'average_alignment_score', - 'errorPF': 'percent_error_rate' - } - - def __init__(self, html=None, xml=None): - self.lane = None - self.end = 0 - self.lane_yield = None - self.cluster = None - self.cluster_pass_filter = None - self.average_first_cycle_intensity = None - self.percent_intensity_after_20_cycles = None - self.percent_pass_filter_clusters = None - self.percent_pass_filter_align = None - self.average_alignment_score = None - self.percent_error_rate = None - - if html is not None: - self.set_elements_from_source(html) - if xml is not None: - self.set_elements(xml) - - def set_elements_from_source(self, data): - """Read from an initial summary data file. Either xml or html - """ - if not len(data) in (8,10): - raise RuntimeError("Summary.htm file format changed, len(data)=%d" % (len(data),)) - - # same in pre-0.3.0 Summary file and 0.3 summary file - self.lane = int(data[0]) - - if len(data) == 8: - parsed_data = [ parse_mean_range(x) for x in data[1:] ] - # this is the < 0.3 Pipeline version - self.cluster = parsed_data[0] - self.average_first_cycle_intensity = parsed_data[1] - self.percent_intensity_after_20_cycles = parsed_data[2] - self.percent_pass_filter_clusters = parsed_data[3] - self.percent_pass_filter_align = parsed_data[4] - self.average_alignment_score = parsed_data[5] - self.percent_error_rate = parsed_data[6] - elif len(data) == 10: - parsed_data = [ parse_mean_range(x) for x in data[2:] ] - # this is the >= 0.3 summary file - self.lane_yield = data[1] - self.cluster = parsed_data[0] - self.cluster_pass_filter = parsed_data[1] - self.average_first_cycle_intensity = parsed_data[2] - self.percent_intensity_after_20_cycles = parsed_data[3] - self.percent_pass_filter_clusters = parsed_data[4] - self.percent_pass_filter_align = parsed_data[5] - self.average_alignment_score = parsed_data[6] - self.percent_error_rate = parsed_data[7] - - def set_elements_from_gerald_xml(self, read, element): - self.lane = int(element.find('laneNumber').text) - self.end = read - lane_yield_node = element.find('laneYield') - if lane_yield_node is not None: - self.lane_yield = int(lane_yield_node.text) - else: - self.lane_yield = None - - for GeraldName, LRSName in Summary.LaneResultSummary.GERALD_TAGS.items(): - node = element.find(GeraldName) - if node is None: - LOGGER.info("Couldn't find %s" % (GeraldName)) - setattr(self, LRSName, parse_xml_mean_range(node)) - - def get_elements(self): - lane_result = etree.Element( - Summary.LaneResultSummary.LANE_RESULT_SUMMARY, - {'lane': unicode(self.lane), 'end': unicode(self.end)}) - for tag, variable_name in Summary.LaneResultSummary.TAGS.items(): - value = getattr(self, variable_name) - if value is None: - continue - # it looks like a sequence - elif type(value) in (types.TupleType, types.ListType): - element = make_mean_range_element( - lane_result, - tag, - *value - ) - else: - element = etree.SubElement(lane_result, tag) - element.text = unicode(value) - return lane_result - - def set_elements(self, tree): - if tree.tag != Summary.LaneResultSummary.LANE_RESULT_SUMMARY: - raise ValueError('Expected %s' % ( - Summary.LaneResultSummary.LANE_RESULT_SUMMARY)) - self.lane = int(tree.attrib['lane']) - # default to the first end, for the older summary files - # that are single ended - self.end = int(tree.attrib.get('end', 0)) - tags = Summary.LaneResultSummary.TAGS - for element in list(tree): - try: - variable_name = tags[element.tag] - setattr(self, variable_name, - parse_summary_element(element)) - except KeyError, e: - LOGGER.warn('Unrecognized tag %s' % (element.tag,)) - def __init__(self, filename=None, xml=None): # lane results is a list of 1 or 2 ends containing # a dictionary of all the lanes reported in this @@ -170,6 +39,41 @@ class Summary(object): def __len__(self): return len(self.lane_results) + def get_elements(self): + summary = etree.Element(Summary.SUMMARY, + {'version': unicode(Summary.XML_VERSION)}) + for end in self.lane_results: + for lane in end.values(): + summary.append(lane.get_elements()) + return summary + + def set_elements(self, tree): + if tree.tag != Summary.SUMMARY: + return ValueError("Expected %s" % (Summary.SUMMARY,)) + xml_version = int(tree.attrib.get('version', 0)) + if xml_version > Summary.XML_VERSION: + LOGGER.warn('Summary XML tree is a higher version than this class') + for element in list(tree): + lrs = LaneResultSummaryGA() + lrs.set_elements(element) + if len(self.lane_results) < (lrs.end + 1): + self.lane_results.append({}) + self.lane_results[lrs.end][lrs.lane] = lrs + + def is_paired_end(self): + return len(self.lane_results) == 2 + + def dump(self): + """ + Debugging function, report current object + """ + tree = self.get_elements() + print etree.tostring(tree) + +class SummaryGA(Summary): + def __init__(self, filename=None, xml=None): + super(SummaryGA, self).__init__(filename, xml) + def _flattened_row(self, row): """ flatten the children of a ... @@ -249,7 +153,7 @@ class Summary(object): read = int(read_tree.find('readNumber').text)-1 for element in read_tree.getchildren(): if element.tag.lower() == "lane": - lrs = Summary.LaneResultSummary() + lrs = LaneResultSummaryGA() lrs.set_elements_from_gerald_xml(read, element) self.lane_results[lrs.end][lrs.lane] = lrs # probably not useful @@ -299,41 +203,211 @@ class Summary(object): self.lane_results.append({}) for r in lane_summary: - lrs = Summary.LaneResultSummary(html=r) + lrs = LaneResultSummaryGA(html=r) lrs.end = end self.lane_results[lrs.end][lrs.lane] = lrs ###### END HTML Table Extraction ######## + +class SummaryHiSeq(Summary): + def __init__(self, filename=None, xml=None): + super(SummaryHiSeq, self).__init__(filename, xml) + + def _extract_lane_results(self, filename): + read1 = os.path.join(filename, 'read1.xml') + read2 = os.path.join(filename, 'read2.xml') + + if os.path.exists(read1): + self._extract_lane_results_for_end(read1, 0) + else: + LOGGER.warn("No read1.xml at %s." % (read1,)) + if os.path.exists(read2): + self.lane_results.append({}) + self._extract_lane_results_for_end(read2, 1) + + def _extract_lane_results_for_end(self, filename, end): + self.tree = etree.parse(filename) + root = self.tree.getroot() + for lane in root.getchildren(): + lrs = LaneResultSummaryHiSeq(data=lane) + lrs.end = end + self.lane_results[lrs.end][lrs.lane] = lrs + + +class LaneResultSummary(object): + """ + Parse the LaneResultSummary table out of Summary.htm + Mostly for the cluster number + """ + LANE_RESULT_SUMMARY = 'LaneResultSummary' + TAGS = { + 'LaneYield': 'lane_yield', + 'Cluster': 'cluster', # Raw + 'ClusterPF': 'cluster_pass_filter', + 'AverageFirstCycleIntensity': 'average_first_cycle_intensity', + 'PercentIntensityAfter20Cycles': 'percent_intensity_after_20_cycles', + 'PercentPassFilterClusters': 'percent_pass_filter_clusters', + 'PercentPassFilterAlign': 'percent_pass_filter_align', + 'AverageAlignmentScore': 'average_alignment_score', + 'PercentErrorRate': 'percent_error_rate' + } + # These are tags that have mean/stdev as found in the GERALD Summary.xml file + GERALD_TAGS = { + #'laneYield': 'lane_yield', #this is just a number + 'clusterCountRaw': 'cluster', # Raw + 'clusterCountPF': 'cluster_pass_filter', + 'oneSig': 'average_first_cycle_intensity', + 'signal20AsPctOf1': 'percent_intensity_after_20_cycles', + 'percentClustersPF': 'percent_pass_filter_clusters', + 'percentUniquelyAlignedPF': 'percent_pass_filter_align', + 'averageAlignScorePF': 'average_alignment_score', + 'errorPF': 'percent_error_rate' + } + + def __init__(self, html=None, xml=None): + self.lane = None + self.end = 0 + self.lane_yield = None + self.cluster = None + self.cluster_pass_filter = None + self.average_first_cycle_intensity = None + self.percent_intensity_after_20_cycles = None + self.percent_pass_filter_clusters = None + self.percent_pass_filter_align = None + self.average_alignment_score = None + self.percent_error_rate = None + + def get_elements(self): - summary = etree.Element(Summary.SUMMARY, - {'version': unicode(Summary.XML_VERSION)}) - for end in self.lane_results: - for lane in end.values(): - summary.append(lane.get_elements()) - return summary + lane_result = etree.Element( + LaneResultSummary.LANE_RESULT_SUMMARY, + {'lane': unicode(self.lane), 'end': unicode(self.end)}) + for tag, variable_name in LaneResultSummary.TAGS.items(): + value = getattr(self, variable_name) + if value is None: + continue + # it looks like a sequence + elif type(value) in (types.TupleType, types.ListType): + element = make_mean_range_element( + lane_result, + tag, + *value + ) + else: + element = etree.SubElement(lane_result, tag) + element.text = unicode(value) + return lane_result def set_elements(self, tree): - if tree.tag != Summary.SUMMARY: - return ValueError("Expected %s" % (Summary.SUMMARY,)) - xml_version = int(tree.attrib.get('version', 0)) - if xml_version > Summary.XML_VERSION: - LOGGER.warn('Summary XML tree is a higher version than this class') + if tree.tag != LaneResultSummary.LANE_RESULT_SUMMARY: + raise ValueError('Expected %s' % ( + LaneResultSummary.LANE_RESULT_SUMMARY)) + self.lane = int(tree.attrib['lane']) + # default to the first end, for the older summary files + # that are single ended + self.end = int(tree.attrib.get('end', 0)) + tags = LaneResultSummary.TAGS for element in list(tree): - lrs = Summary.LaneResultSummary() - lrs.set_elements(element) - if len(self.lane_results) < (lrs.end + 1): - self.lane_results.append({}) - self.lane_results[lrs.end][lrs.lane] = lrs + try: + variable_name = tags[element.tag] + setattr(self, variable_name, + parse_summary_element(element)) + except KeyError, e: + LOGGER.warn('Unrecognized tag %s' % (element.tag,)) - def is_paired_end(self): - return len(self.lane_results) == 2 - def dump(self): +class LaneResultSummaryGA(LaneResultSummary): + def __init__(self, html=None, xml=None): + super(LaneResultSummaryGA, self).__init__(html, xml) + + if html is not None: + self.set_elements_from_source(html) + if xml is not None: + self.set_elements(xml) + + def set_elements_from_gerald_xml(self, read, element): + self.lane = int(element.find('laneNumber').text) + self.end = read + lane_yield_node = element.find('laneYield') + if lane_yield_node is not None: + self.lane_yield = int(lane_yield_node.text) + else: + self.lane_yield = None + + for GeraldName, LRSName in LaneResultSummary.GERALD_TAGS.items(): + node = element.find(GeraldName) + if node is None: + LOGGER.info("Couldn't find %s" % (GeraldName)) + setattr(self, LRSName, parse_xml_mean_range(node)) + + def set_elements_from_source(self, data): + """Read from an initial summary data file. Either xml or html """ - Debugging function, report current object + if not len(data) in (8,10): + raise RuntimeError("Summary.htm file format changed, len(data)=%d" % (len(data),)) + + # same in pre-0.3.0 Summary file and 0.3 summary file + self.lane = int(data[0]) + + if len(data) == 8: + parsed_data = [ parse_mean_range(x) for x in data[1:] ] + # this is the < 0.3 Pipeline version + self.cluster = parsed_data[0] + self.average_first_cycle_intensity = parsed_data[1] + self.percent_intensity_after_20_cycles = parsed_data[2] + self.percent_pass_filter_clusters = parsed_data[3] + self.percent_pass_filter_align = parsed_data[4] + self.average_alignment_score = parsed_data[5] + self.percent_error_rate = parsed_data[6] + elif len(data) == 10: + parsed_data = [ parse_mean_range(x) for x in data[2:] ] + # this is the >= 0.3 summary file + self.lane_yield = data[1] + self.cluster = parsed_data[0] + self.cluster_pass_filter = parsed_data[1] + self.average_first_cycle_intensity = parsed_data[2] + self.percent_intensity_after_20_cycles = parsed_data[3] + self.percent_pass_filter_clusters = parsed_data[4] + self.percent_pass_filter_align = parsed_data[5] + self.average_alignment_score = parsed_data[6] + self.percent_error_rate = parsed_data[7] + + +class LaneResultSummaryHiSeq(LaneResultSummary): + def __init__(self, data=None, xml=None): + super(LaneResultSummaryHiSeq, self).__init__(data, xml) + + if data is not None: + self.set_elements_from_source(data) + if xml is not None: + self.set_elements(xml) + + def set_elements_from_source(self, element): + """Read from an initial summary data file. Either xml or html """ - tree = self.get_elements() - print etree.tostring(tree) + # same in pre-0.3.0 Summary file and 0.3 summary file + lane = element.attrib + self.lane = int(lane['key']) + #self.lane_yield = data[1] + self.cluster = (int(lane['ClustersRaw']), + float(lane['ClustersRawSD'])) + self.cluster_pass_filter = (int(lane['ClustersPF']), + float(lane['ClustersPFSD'])) + self.average_first_cycle_intensity = (int(lane['FirstCycleIntPF']), + float(lane['FirstCycleIntPFSD'])) + self.percent_intensity_after_20_cycles = ( + float(lane['PrcIntensityAfter20CyclesPF']), + float(lane['PrcIntensityAfter20CyclesPFSD'])) + self.percent_pass_filter_clusters = ( + float(lane['PrcPFClusters']), + float(lane['PrcPFClustersSD'])) + self.percent_pass_filter_align = ( + float(lane['PrcAlign']), + float(lane['PrcAlignSD'])) + self.percent_error_rate = ( + float(lane['ErrRatePhiX']), + float(lane['ErrRatePhiXSD']),) + def tonumber(v): """ diff --git a/htsworkflow/pipelines/test/simulate_runfolder.py b/htsworkflow/pipelines/test/simulate_runfolder.py index aae6078..c6b4d58 100644 --- a/htsworkflow/pipelines/test/simulate_runfolder.py +++ b/htsworkflow/pipelines/test/simulate_runfolder.py @@ -57,18 +57,20 @@ def make_bustard_config132(image_dir): def make_aligned_config_1_12(aligned_dir): """This is rouglhly equivalent to the old gerald file""" - source = os.path.join(TESTDATA_DIR, 'aligned_config_1_12.xml') + source = os.path.join(TESTDATA_DIR, '1_12', 'aligned_config_1_12.xml') destination = os.path.join(aligned_dir, 'config.xml') shutil.copy(source, destination) def make_unaligned_config_1_12(unaligned_dir): demultiplex_pairs = [ # (src, # dest), - (os.path.join(TESTDATA_DIR, 'demultiplex_1.12.4.2.xml'), + (os.path.join(TESTDATA_DIR, '1_12', 'demultiplex_1.12.4.2.xml'), os.path.join(unaligned_dir, 'DemultiplexConfig.xml')), - (os.path.join(TESTDATA_DIR, 'demultiplexed_bustard_1.12.4.2.xml'), + (os.path.join(TESTDATA_DIR, '1_12', + 'demultiplexed_bustard_1.12.4.2.xml'), os.path.join(unaligned_dir, 'DemultiplexedBustardConfig.xml')), - (os.path.join(TESTDATA_DIR, 'demultiplexed_summary_1.12.4.2.xml'), + (os.path.join(TESTDATA_DIR, '1_12', + 'demultiplexed_summary_1.12.4.2.xml'), os.path.join(unaligned_dir, 'DemultiplexedBustardSummary.xml')), ] for src, dest in demultiplex_pairs: @@ -134,7 +136,8 @@ def make_rta_intensities_1_12(data_dir, version='1.12.4.2'): if not os.path.exists(intensities_dir): os.mkdir(intensities_dir) - param_file = os.path.join(TESTDATA_DIR, 'rta_intensities_config_1.12.4.2.xml') + param_file = os.path.join(TESTDATA_DIR, '1_12', + 'rta_intensities_config_1.12.4.2.xml') shutil.copy(param_file, os.path.join(intensities_dir, 'RTAConfig.xml')) return intensities_dir @@ -175,7 +178,8 @@ def make_rta_basecalls_1_12(intensities_dir): os.mkdir(basecalls_dir) make_qseqs(basecalls_dir, basecall_info=ABXX_BASE_CALL_INFO) - param_file = os.path.join(TESTDATA_DIR, 'rta_basecalls_config_1.12.4.2.xml') + param_file = os.path.join(TESTDATA_DIR, '1_12', + 'rta_basecalls_config_1.12.4.2.xml') shutil.copy(param_file, os.path.join(basecalls_dir, 'config.xml')) return basecalls_dir @@ -357,10 +361,19 @@ def make_summary_casava1_7_xml(gerald_dir): destination = os.path.join(gerald_dir, 'Summary.xml') shutil.copy(source, destination) -def make_summary_rta1_12(status_dir): - source = os.path.join(TESTDATA_DIR, 'Summary-rta1_12.htm') - destination = os.path.join(status_dir, 'Summary.htm') - shutil.copy(source, destination) +def make_status_rta1_12(datadir): + sourcedir = os.path.join(TESTDATA_DIR, '1_12') + status_htm = os.path.join(sourcedir, 'Status.htm') + destination = os.path.join(datadir, 'Status.htm') + shutil.copy(status_htm, destination) + + status_dir = os.path.join(datadir, 'Status_Files') + status_source_dir = os.path.join(sourcedir, 'Status_Files') + shutil.copytree(status_source_dir, status_dir) + + report_source_dir = os.path.join(sourcedir, 'reports') + report_dir = os.path.join(datadir, 'reports') + shutil.copytree(report_source_dir, report_dir) def make_eland_results(gerald_dir): eland_result = """>HWI-EAS229_24_207BTAAXX:1:7:599:759 ACATAGNCACAGACATAAACATAGACATAGAC U0 1 1 3 chrUextra.fa 28189829 R D. diff --git a/htsworkflow/pipelines/test/test_runfolder_rta1_12.py b/htsworkflow/pipelines/test/test_runfolder_rta1_12.py index 70c11bf..ed225bf 100644 --- a/htsworkflow/pipelines/test/test_runfolder_rta1_12.py +++ b/htsworkflow/pipelines/test/test_runfolder_rta1_12.py @@ -33,10 +33,7 @@ def make_runfolder(obj=None): os.mkdir(data_dir) intensities_dir = make_rta_intensities_1_12(data_dir) - - status_dir = os.path.join(data_dir, 'Status_Files') - os.mkdir(status_dir) - make_summary_rta1_12(status_dir) + make_status_rta1_12(data_dir) basecalls_dir = make_rta_basecalls_1_12(intensities_dir) make_matrix_dir_rta_1_12(basecalls_dir) diff --git a/htsworkflow/pipelines/test/test_summary.py b/htsworkflow/pipelines/test/test_summary.py index ab9f962..af0e908 100644 --- a/htsworkflow/pipelines/test/test_summary.py +++ b/htsworkflow/pipelines/test/test_summary.py @@ -20,19 +20,19 @@ class SummaryTests(unittest.TestCase): def test_xml_summary_file(self): pathname = os.path.join(TESTDATA_DIR, 'Summary-casava1.7.xml') - s = summary.Summary(pathname) + s = summary.SummaryGA(pathname) self.failUnlessEqual(len(s.lane_results[0]), 8) self.failUnlessEqual(s.lane_results[0][1].cluster, (1073893, 146344)) def test_html_summary_file(self): pathname = os.path.join(TESTDATA_DIR, 'Summary-ipar130.htm') - s = summary.Summary(pathname) + s = summary.SummaryGA(pathname) self.failUnlessEqual(len(s.lane_results[0]), 8) self.failUnlessEqual(s.lane_results[0][1].cluster, (126910, 4300)) def test_hiseq_sample_summary_file(self): pathname = os.path.join(TESTDATA_DIR, 'sample_summary_1_12.htm') - s = summary.Summary(pathname) + s = summary.SummaryGA(pathname) def suite(): return unittest.makeSuite(SummaryTests,'test') diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status.htm b/htsworkflow/pipelines/test/testdata/1_12/Status.htm new file mode 100755 index 0000000..ccc9395 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status.htm @@ -0,0 +1,39 @@ + + + + + + Status + + + + + + +
Refresh  + + + +
Total:0Extracted:0Called:0Scored:0Copied:0Err.Rated:0
Loading Run Data ...
+ + +
+ Cannot display image +
+ + + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycle.htm b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycle.htm new file mode 100755 index 0000000..f652cca --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycle.htm @@ -0,0 +1,107 @@ + + + + + + + Status + + + + + + + +
Refresh  + + + +
Total:0Extracted:0Called:0Scored:0Copied:0Err.Rated:0
Loading Run Data ...
+ + + + +
+
+ + + + + +
Refresh     
+ +
+
+ + + + + +
Refresh     
+ +
+
+ + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycle.js b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycle.js new file mode 100755 index 0000000..14af70e --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycle.js @@ -0,0 +1,23 @@ + +window.onerror = function() { + parent.location = './Error.htm'; +} + +function changeFrameSrc(form) { + var imgName = null; + var base = ""; + var qc = form.QCOptDropDown.value; + if (qc == 'QScore' || qc == 'NumGT30' || qc == 'ErrRate') { + form.baseDropDown.style.display = 'none'; + } else { + form.baseDropDown.style.display = 'inline'; + base = form.baseDropDown.value.toLowerCase(); + }; + var intensityURL = "../reports/IntensityFrame.htm?"; + + imgName = "../reports/ByCycle/" + form.QCOptDropDown.value + "_" + form.lanesDropDown.value + base + ".png"; + if (window.frames[form.name + "Fr"] != null) window.frames[form.name + "Fr"].location = "./ByCycleFrame.htm?" + imgName; + if (form.imgPlot != null) form.imgPlot.src = "../reports/" + imgName; +} + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycleFrame.htm b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycleFrame.htm new file mode 100755 index 0000000..81b0419 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByCycleFrame.htm @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByLane.htm b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByLane.htm new file mode 100755 index 0000000..26e4d60 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByLane.htm @@ -0,0 +1,49 @@ + + + + + + + Status + + + + + + + +
Refresh  + + + +
Total:0Extracted:0Called:0Scored:0Copied:0Err.Rated:0
Loading Run Data ...
+ + + + +
+

+ + Show PF only +

+ No Data +
+ +
+ + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByLane.js b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByLane.js new file mode 100755 index 0000000..db2cf17 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/ByLane.js @@ -0,0 +1,55 @@ +window.onerror = function() { + parent.location = './Error.htm'; +} + +function loadClustersByLane() { + name = name0 = '../reports/NumClusters By Lane'; + if (document.getElementById('PFOnlyBox').checked) { + name = name0 + " PF"; + try { + xmlDoc = loadXMLDoc(name + '.xml'); + } catch (e) { xmlDoc = null; }; + if (xmlDoc == null || xmlDoc.getElementsByTagName('Data') == null) { + name = name0; + alert("No data available!"); + document.getElementById('PFOnlyBox').checked = false; + } + } + document.getElementById('NumClustersImg').src = name + ".png"; + imgRefresh('NumClustersImg'); + loadNumClustersTable(name + '.xml', 'NumClustersTbl', 'Lane'); +} + +function loadNumClustersTable(xmlName, tblName, tagsName) { + tbl = document.getElementById(tblName); + xmlDoc = loadXMLDoc(xmlName); + if (xmlDoc == null) return; + xmlRows = xmlDoc.getElementsByTagName(tagsName); + if (xmlRows == null) return; + while (tbl.rows.length > 0) tbl.deleteRow(tbl.rows.length - 1); + if (xmlRows.length > 0 && xmlRows[0].attributes.length > 0) { + tbl.insertRow(0); + for (j = xmlRows[0].attributes.length - 1; j >= 1; j--) + tbl.insertRow(0); + for (i = xmlRows.length - 1; i >= 0; i--) { + for (j = xmlRows[i].attributes.length - 1; j >= 1; j--) { + tbl.rows[j].insertCell(0); + val = new Number(xmlRows[i].attributes[j].value); + if (val < 1000) strVal = val.toFixed(0); + else strVal = (val / 1000).toFixed(0) + "K"; + tbl.rows[j].cells[0].innerHTML = strVal; + } + } + for (j = xmlRows[0].attributes.length - 1; j >= 1; j--) { + tbl.rows[j].insertCell(0); + tbl.rows[j].cells[0].innerHTML = xmlRows[0].attributes[j].name.toUpperCase(); + //tbl.rows[j].insertCell(0); tbl.rows[j].insertCell(0); + } + for (i = xmlRows.length - 1; i >= 0; i--) { + tbl.rows[0].insertCell(0); + tbl.rows[j].cells[0].innerHTML = tagsName + " " + xmlRows[i].attributes[0].value; + } + tbl.rows[0].insertCell(0); //tbl.rows[0].insertCell(0); tbl.rows[0].insertCell(0); + } +} + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Charts.htm b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Charts.htm new file mode 100755 index 0000000..d0f1319 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Charts.htm @@ -0,0 +1,100 @@ + + + + + + + Status + + + + + + + +
Refresh  + + + +
Total:0Extracted:0Called:0Scored:0Copied:0Err.Rated:0
Loading Run Data ...
+ + + + + + +
+ + + + +
+ +       + No Data +
+ + + + +    + No Data +
+ + + + +    + No Data +
+
+ + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Charts.js b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Charts.js new file mode 100755 index 0000000..4e7eca7 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Charts.js @@ -0,0 +1,140 @@ +window.onerror = function() { + parent.location = './Error.htm'; +} + +var imageOnFocusId = null; +function TileMap(nTiles) { + var numLanes = 8; + var numTiles = nTiles; + var width = 200; + var height = 750; + var X0 = 18; + var Y0 = 26; + var dL = width / numLanes; + var numCols = 2; + var numRows = numTiles / numCols; + var dX = width / (numCols * numLanes); + var dY = height / numRows; + var map = document.getElementById("tileMap"); + var tileMapXML; + this.changeLayout = function(layoutNode) { + nCols = layoutNode.getAttribute("ColsPerLane"); + if (nCols > 0) numCols = nCols; + nRows = layoutNode.getAttribute("RowsPerLane"); + if (nRows > 0) numRows = nRows; + dX = width / (numCols * numLanes); + dY = height / numRows; + } + this.newToolTip = function(lane, idx) { + var area = document.createElement("area"); + area.shape = "rect"; + var col = Math.floor((idx - 1) / numRows); + var row = (idx - 1) % numRows; + if (idx - numRows <= 0) row = numRows - row - 1; + var X1 = Math.round(X0 + dX * col + (lane - 1) * dL); + var Y1 = Math.round(Y0 + dY * row); + var X2 = Math.round(X1 + dX); + var Y2 = Math.round(Y1 + dY); + area.coords = "'" + X1 + "," + Y1 + "," + X2 + "," + Y2 + "'"; + area.title = "L:" + lane + " T:" + idx; + map.appendChild(area); + } + + this.newToolTipVal = function(tile, base) { + var area = document.createElement("area"); + area.shape = "rect"; + key = tile.getAttribute("Key"); + if (base == null) base = "Val"; + val = tile.getAttribute(base); + lane = key.substring(0, 1); + idx = key.substring(2); + var col = Math.floor((idx - 1) / numRows); + var row = (idx - 1) % numRows; + if (idx - numRows <= 0) row = numRows - row - 1; + var X1 = Math.round(X0 + dX * col + (lane - 1) * dL); + var Y1 = Math.round(Y0 + dY * row); + var X2 = Math.round(X1 + dX); + var Y2 = Math.round(Y1 + dY); + area.coords = "'" + X1 + "," + Y1 + "," + X2 + "," + Y2 + "'"; + area.title = "L:" + lane + " T:" + idx + "\n" + "Val= " + val; + map.appendChild(area); + } + this.resetMap = function(image) { + if (image.id == imageOnFocusId) return; + xmlName = image.src; + xmlName = xmlName.replace("@.png", ".png"); + xmlName = xmlName.substring(0, xmlName.lastIndexOf('.')) + ".xml"; + var base = null; + if (xmlName.lastIndexOf('_a.xml') > 0) base = 'A'; + else if (xmlName.lastIndexOf('_c.xml') > 0) base = 'C'; + else if (xmlName.lastIndexOf('_g.xml') > 0) base = 'G'; + else if (xmlName.lastIndexOf('_t.xml') > 0) base = 'T'; + if (base != null) xmlName = xmlName.substring(0, xmlName.lastIndexOf('_')) + ".xml"; + try { + this.tileMapXML = loadXMLDoc(xmlName); + layout = this.tileMapXML.getElementsByTagName("Layout"); + if (layout != null && layout.length > 0) this.changeLayout(layout[0]); + tiles = this.tileMapXML.getElementsByTagName("TL"); + while (map.lastChild != null) map.removeChild(map.lastChild); + for (i = 0; i < tiles.length; i++) tileMap.newToolTipVal(tiles[i], base); + } catch (e) { this.blankMap(); } + imageOnFocusId = image.id; + } + + + this.blankMap = function() { + while (map.lastChild != null) map.removeChild(map.lastChild); + for (var l = 1; l <= numLanes; l++) { + for (var i = 1; i <= numTiles; i++) { + this.newToolTip(l, i); + } + } + } +} + +function fillCycles(CyBox, maxCy) { + for (var cy = 1; cy <= maxCy; cy++) { + var option = document.createElement('option'); + option.setAttribute('value', cy); + option.appendChild(document.createTextNode(cy)); + CyBox.appendChild(option); + } +} + +function changeImage(form) { + var qc = form.QCOptDropDown.value; + var base = ""; + var cycle = ""; + //alert(form.autoscale.id); + //return; + if (form.baseDropDown != null) { + if (qc == "ErrorRate" || qc == "NumGT30") { + form.baseDropDown.style.display = 'none'; + document.getElementById(form.autoscale.id.toString() + 'lbl').style.display = 'inline'; + } + else { + form.baseDropDown.style.display = 'inline'; + base = "_" + form.baseDropDown.value.toLowerCase(); + document.getElementById(form.autoscale.id.toString() + 'lbl').style.display = 'none'; + + } + } + if (form.cyDropDown != null) { + form.cyDropDown.disabled = false; + if (form.cyDropDown != null && !form.cyDropDown.disabled) { + cycle = "_" + form.cyDropDown.value.toLowerCase(); + qc = qc + "/"; + } + } else qc = qc + "_"; + auto = ""; + if (form.autoscale.checked) auto = "@"; + var suff = cycle + base + auto + ".png"; + form.Chart.src = "../reports/" + qc + "Chart" + suff; + form.Chart.lowsrc = form.Chart.src; + imageOnFocusId = null; +} + +function showBlank(imgId) { + document.getElementById(imgId).lowsrc = document.getElementById(imgId).src; + document.getElementById(imgId).src = "../reports/blank.png"; +} diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.htm b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.htm new file mode 100755 index 0000000..1740921 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.htm @@ -0,0 +1,44 @@ + + + + + + + Status + + + + + + + +
Refresh  + + + +
Total:0Extracted:0Called:0Scored:0Copied:0Err.Rated:0
Loading Run Data ...
+ + + +
+

No data available yet.

+ +
+ + + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.js b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.js new file mode 100755 index 0000000..10c3f78 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.js @@ -0,0 +1,7 @@ +window.onerror = function() { + parent.location = './Error.htm'; +} + +function loadControls() { + loadXSLTable('../reports/controls.xml', './controls.xsl', 'ControlsTbl'); +} \ No newline at end of file diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.xsl b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.xsl new file mode 100755 index 0000000..7fc53e7 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Controls.xsl @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + +
ControlLane 1Lane 2Lane 3Lane 4Lane 5Lane 6Lane 7Lane 8
+
+
diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Error.htm b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Error.htm new file mode 100755 index 0000000..100c67c --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Error.htm @@ -0,0 +1,8 @@ + + + +

There was a problem loading the file.

+

Please click a link below to try again

+

Status.htm

+ + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RefreshBtn/r1.png b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RefreshBtn/r1.png new file mode 100755 index 0000000000000000000000000000000000000000..a05af5a57dee9d66622f536401939e297155239c GIT binary patch literal 602 zcmV-g0;TPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy2XskIMF-gn2^JJ05LnQ!0005SNklAs=6i&xN2Zavl z(7~~zf5EY%qpM?ofs`(#bdpY;imM$8Ehh z_&(NB{@s>PiUhD7uEX}QIhgmsH}SnMFqj@>lki!B^x&i4dbxxVOm@-~d&-JpKTBfG zWEsup2GDzdl&Rdc#1oY@sTg?)EH|F&MTn4z+bS7}D0NYPsM!#HF$iBwF$ckc7fS`G z4WS|~?p*;_hcz{ES>k+^ehVXERBE@J1Vs@A?nc)LN?eu-5-VDypbaPCX(HI8H|c@j zeeLGr$&DZ*S{(vtAiFniunce!CV6)d)Laz(2{xs*+es|gnIP`!0-tv;uum`#DjgSq z5L>X2uM4S`B239~X=W2F39jUSLH;BDIBhv`-zhiHa>jnr_+UwI%K;R0Om2K=zxYA_ of+Y){H#EpC$Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy2XskIMF-gn2^JbKePWDh0005lNkl=oN|#bPg$|{YxY|L`LC`_4i;xb24uxb8(t^VsQn*8gGdQI0@#N$B zRhnL2@!pg3KKCTKIcKDm|D}BYQ+;cz$S7T2R4V1lRmpN^ZhtURO2?bHkYMTdMzC8i z?Jh+`6ysNL#4y5cInNzz&J;sjj*Np#dugyUf;O>^C=*5Oy_qziKzk_Ayto)X;Bn=q1PPN`+k@A&*H}>I|!vogec67-Zcur9hq@1it>mg z=T)eX*D~s_HK;RpWVwA=Nj#y1gnY3i2o$drXVu!(LkTF0Clp1nz?dU~?HZ%{R5m64 z!yuByk|5MtyYm2&Gg^7HMRHiPr8z;I^Vd2>s05Kw%J=LCF+2DV<68tJE|(cqkaK_~kVzQTmNOmp=yZuA>>KK8ZA>Wdm z*}qF%+;X__4X0=%g}R=!qW)mYjSuY?e}JK+LW0GeO=155g8h0gtzsDr00000NkvXX Hu0mjf8a4|g literal 0 HcmV?d00001 diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RefreshBtn/r3.png b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RefreshBtn/r3.png new file mode 100755 index 0000000000000000000000000000000000000000..bfdd95fcae75353b8c94e4169ef4c9841e402cd9 GIT binary patch literal 683 zcmV;c0#yBpP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy2XskIMF-gn2^KFD<4~#&0006ONkliM6lm{(P;y!U)MpFe%;cDi3WUYd#ic^F*9;V2Eq z2Wymq0D^nNizpfkF_XojE|v#tQG)=2d#8htMOo`w>3Y2}(vKVSA+X6Ofzlv=;EhFo zU)HOw#ZJIKradH;RG2!YeZ10uJBxW)uC$fXn{=6+WIc?C-O{r-pYJT1jXWqL#*r&| zGC58bv07`Je>K=|MBGVPDI+l8-uOF%GlHL}ag<@!);^XFcbcCW= zV3y=fiKJQDg9F@I+!V#4qP^&FC#3>JA1f50Kq-3U+zE57|Bs^I5 literal 0 HcmV?d00001 diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunInfo.htm b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunInfo.htm new file mode 100755 index 0000000..995919f --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunInfo.htm @@ -0,0 +1,43 @@ + + + + + + Status + + + + + + + +
Refresh  + + + +
Total:0Extracted:0Called:0Scored:0Copied:0Err.Rated:0
Loading Run Data ...
+ + + +
+ +
+ + + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunInfo.xsl b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunInfo.xsl new file mode 100755 index 0000000..7443e44 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunInfo.xsl @@ -0,0 +1,40 @@ + + + + + + Run Description

+ + + + + + + +

+
Software:
Run name:
Cycles:
Instrument name:
Run Started (Estimated):
Input Directory:
Output Directory:
+

+ + Configuration Settings

+ + + + + + + + + + + + +
  • Copy all run files:
  • Copy images:
  • Delete image files:
  • Delete intensity files:
  • Run info file exists:
  • Is this a paired end run:
  • Total number of reads:
  • Number of lanes:
  • Number of tiles per lane:
  • Control lane:
  • + None + + + +
    + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunName.xsl b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunName.xsl new file mode 100755 index 0000000..a054fe8 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/RunName.xsl @@ -0,0 +1,9 @@ + + + + + + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Status.css b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Status.css new file mode 100755 index 0000000..9544549 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Status.css @@ -0,0 +1,230 @@ +body +{ + margin: 0px; + font-family: Arial, Helvetica, sans-serif; + background-color: #F4F5F5; + border-top-style: solid; + border-top-color: #FF9900; + border-top-width: 10px; + padding-top: 3px; + background-image: url('../Status_Files/illumina.png'); + background-repeat: no-repeat; + background-position: top right; + color: #555; + font-weight: bold; +} + +#tabmenu +{ + font: normal 14px Arial, Helvetica, sans-serif; + list-style-type: none; + border-bottom: 1px solid #BB5500; + margin: 12px 0px 0px 0px; + padding-left: 0; + padding-right: 0; + padding-bottom: 26px; + font-weight: bold; +} + +#tabmenu li +{ + display: inline; + float: left; + height: 24px; + min-width: 80px; + text-align: center; + padding: 0; +} + +#tabmenu li a +{ + float: left; + color: #777; + text-decoration: none; + padding: 4px; + text-align: center; + background-color: #ddd; + min-width: 80px; + border: 1px solid gray; + border-bottom: none; + margin: 0px 1px 0px 1px; + +} + +#tabmenu li a.selected +{ + background-color: #F7F8f8; + color: #000; + font-size: 100%; + border: 1px solid #BB5500; + border-bottom: 2px solid #F7F8f8; + +} + +#tabmenu li a:hover +{ + color: #BB5500; + font-size :120%; + border: 1px solid #BB5500; +} +#tabmenu li a.selected:hover +{ + border-bottom: 2px solid #F7F8f8; +} + +#container +{ + border: 1px solid #BB5500; + border-top: none; + padding: 10px; + left: 0; + top: 0; + background-color: #F7F8f8; + min-width: 1100px; +} + + + +#tabmenu li a.space +{ + font-weight: normal; + font-size :100%; + color: #000; + background-color: #F5F5F5; + border: none; + text-align: right; +} + +table.DataTable +{ + border-collapse: collapse; + background-color: #e0e0e0; + border: 1px dotted #BB5500; + padding: 10px; + padding:50px; + +} + +table.DataTable td, table.DataTable th +{ + font-family: Arial, Helvetica, sans-serif; + font-size: smaller; + font-weight: bold; + font-variant: normal; + text-transform: none; + padding: 3px; + border-right: dotted 1px #BB5500; + border-left: dotted 1px #BB5500; + color: #555555; +} + +table.DataTable tr:hover td, table.DataTable tr:hover td a, table.DataTable tr:hover th a +{ + color: #BB5500; +} + +table.DataTable th +{ + padding: 5px; + border: dotted 1px #BB5500; + color: #000000; +} + +table.InfoTable +{ + margin: 20px; + border-style: none; + border-collapse: collapse; + background-color: #e0e0e0; + padding: 50px; + outline-style: solid; + outline-color: #e0e0e0; + outline-width: 10px; +} + +table.InfoTable td, table.InfoTable th +{ + border-style: none; + font-family: Arial, Helvetica, sans-serif; + font-size: smaller; + font-weight: bold; + font-variant: normal; + text-transform: none; + padding: 5px 30px 5px 20px; + color: #555555; + text-align: left; +} + +table.InfoTable tr:hover td, table.InfoTable tr:hover td a, table.InfoTable tr:hover th a +{ + color: #BB5500; +} + +table.InfoTable th +{ + color: #000000; +} + +table.StatusTable +{ + margin: 0px 0px 0px 0px; + border-collapse: collapse; + background-color: #e0e0e0; + padding: 1px; + /*outline-style: solid; + outline-color: #e0e0e0; + outline-width: 2px;*/ + border: 1px dotted #BB5500; + +} + +table.StatusTable td, table.StatusTable th +{ + border: 1px dotted #BB5500; + font-family: Arial, Helvetica, sans-serif; + font-size: small; + font-weight: bold; + font-variant: normal; + text-transform: none; + color: #555555; + text-align: left; +} +table.StatusTable th +{ + border-right: none; + padding-right: 5px; +} + +table.StatusTable td +{ + border-left: none; + padding-right: 5px; + color: #BB5500; +} + +table.StatusTable tr:hover td, table.StatusTable tr:hover td a, table.StatusTable tr:hover th a +{ + color: #ff8800; +} + +label +{ + font-size: smaller; + font-weight: normal; + color: #000000; +} + +image.Chart +{ + border: 1px solid #BB5500; + margin: 5px 0px 0px 0px; +} + +iframe +{ + margin: 5px 0px 0px 0px; + border: 1px solid #BB5500; +} + +#RunNameTD +{font-size :100%; padding-left: 20px} \ No newline at end of file diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Status.js b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Status.js new file mode 100755 index 0000000..da12baf --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Status.js @@ -0,0 +1,168 @@ +window.onerror = function() { + parent.location = "./Status_Files/StatusError.htm" +} + +//Reading XML file +var xmlhttp = false; +/* running locally on IE5.5, IE6, IE7 */; /*@cc_on +if (location.protocol == "file:") { + if (!xmlhttp) try { xmlhttp = new ActiveXObject("MSXML2.XMLHTTP"); } catch (e) { xmlhttp = false; } + if (!xmlhttp) try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { xmlhttp = false; } +} +/* IE7, Firefox, Safari, Opera... */ +if (!xmlhttp) try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp = false; } +/* IE6 */ +if (typeof ActiveXObject != "undefined") { + if (!xmlhttp) try { xmlhttp = new ActiveXObject("MSXML2.XMLHTTP"); } catch (e) { xmlhttp = false; } + if (!xmlhttp) try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { xmlhttp = false; } +} +/* IceBrowser */ +if (!xmlhttp) try { xmlhttp = createRequest(); } catch (e) { xmlhttp = false; } + +function loadXMLDoc(dname) { + var xmlDoc = null; + try { + if (!xmlhttp) return "Your browser doesn't seem to support XMLHttpRequests."; + xmlhttp.open("GET", dname, false); //make sure open appears before onreadystatechange lest IE will encounter issues beyond the first request + xmlhttp.send(null); + var parser = false; + try { + parser = new DOMParser(); + xmlDoc = parser.parseFromString(xmlhttp.responseText, "text/xml"); + } catch (e) { parser = false } + if (!parser) { + xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); + //xmlDoc = new ActiveXObject("Msxml2.DOMDocument.6.0"); + xmlDoc.async = "false"; + xmlDoc.loadXML(xmlhttp.responseText); + } + if(xmlDoc.childNodes.length == 0)xmlDoc= null; + } catch(e){}; + return xmlDoc; +} +//End of reading XML file + + +function errorPrint(err) { + document.writeln(err.description); + document.writeln("

    There was a problem loading the file.

    "); + document.writeln("

    Please click a link below to try again

    "); + document.writeln("

    Status.htm

    "); + } + +function imgRefresh(imgId) { + var s = document.getElementById(imgId).src; + if (s.indexOf('?') > 0) s = s.substring(0, s.indexOf('?')); + document.getElementById(imgId).src = s + "?" + (new Date().getMilliseconds()); +} + +function imgReload(imgId) { + document.getElementById(imgId).src = document.getElementById(imgId).lowsrc; +} + +function getNodeText(node) { + var txt = ""; + if (node.textContent != undefined) txt = node.textContent; + else if (node.text != undefined) txt = node.text; + return txt; +} + +// Cookie functions +function setCookie(name, value, expires, path, domain, secure) { + document.cookie = name + "=" + escape(value) + + ((expires) ? "; expires=" + expires.toGMTString() : "") + + ((path) ? "; path=" + path : "") + + ((domain) ? "; domain=" + domain : "") + + ((secure) ? "; secure" : ""); +} + +function getCookie(name) { + var dc = document.cookie; + var prefix = name + "="; + var begin = dc.indexOf("; " + prefix); + if (begin == -1) { + begin = dc.indexOf(prefix); + if (begin != 0) return null; + } else { + begin += 2; + } + var end = document.cookie.indexOf(";", begin); + if (end == -1) { + end = dc.length; + } + return unescape(dc.substring(begin + prefix.length, end)); +} + +function deleteCookie(name, path, domain) { + if (getCookie(name)) { + document.cookie = name + "=" + + ((path) ? "; path=" + path : "") + + ((domain) ? "; domain=" + domain : "") + + "; expires=Thu, 01-Jan-70 00:00:01 GMT"; + } +} + +function loadNumClustersTableByLane(xmlName, tblName, tagsName) { + tbl = document.getElementById(tblName); + xmlDoc = loadXMLDoc(xmlName); + if (xmlDoc == null) return; + xmlRows = xmlDoc.getElementsByTagName(tagsName); + while (tbl.rows.length > 0) tbl.deleteRow(tbl.rows.length - 1); + if (xmlRows.length > 0 && xmlRows[0].attributes.length > 0) { + for (i = 0; i < xmlRows.length; i++) { + tbl.insertRow(0); + for (j = xmlRows[i].attributes.length - 1; j >= 0; j--) { + tbl.rows[0].insertCell(0); + tbl.rows[0].cells[0].innerHTML = xmlRows[i].attributes[j].value; + } + //create column titles + tbl.insertRow(0); + } + for (j = xmlRows[0].attributes.length - 1; j >= 0; j--) { + tbl.rows[0].insertCell(0); + tbl.rows[0].cells[0].innerHTML = xmlRows[0].attributes[j].name; + } + tbl.rows[0].cells[0].innerHTML = tagsName + "#" + } +} + +function loadXSLTable(xmlName, xslName, tblName) { + tbl = document.getElementById(tblName); + xmlDoc = loadXMLDoc(xmlName); + xslDoc = loadXMLDoc(xslName); + if (xmlDoc == null || xslDoc == null) return false; + // code for IE + if (window.ActiveXObject) { + ex = xmlDoc.transformNode(xslDoc); + tbl.innerHTML = ex; + } + // code for Mozilla, Firefox, Opera, etc. + else if (document.implementation && document.implementation.createDocument) { + xsltProcessor = new XSLTProcessor(); + xsltProcessor.importStylesheet(xslDoc); + resultDocument = xsltProcessor.transformToFragment(xmlDoc, document); + if ( tbl.hasChildNodes() ) + while ( tbl.childNodes.length >= 1 ) + tbl.removeChild( tbl.firstChild ); + tbl.appendChild(resultDocument); + return true; + } +} + +function xslTransform(xmlDoc, xslDoc) { + resultDocument = null; + if (xmlDoc != null && xslDoc != null) { + // code for IE + if (window.ActiveXObject) { + ex = xmlDoc.transformNode(xslDoc); + resultDocument = ex; + } + // code for Mozilla, Firefox, Opera, etc. + else if (document.implementation && document.implementation.createDocument) { + xsltProcessor = new XSLTProcessor(); + xsltProcessor.importStylesheet(xslDoc); + resultDocument = xsltProcessor.transformToFragment(xmlDoc, document).textContent; + } + } + return resultDocument; +} diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/StatusError.htm b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/StatusError.htm new file mode 100755 index 0000000..705d39c --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/StatusError.htm @@ -0,0 +1,8 @@ + + + +

    There was a problem loading the file.

    +

    Please click a link below to try again

    +

    Status.htm

    + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/StatusUpdate.xsl b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/StatusUpdate.xsl new file mode 100755 index 0000000..9d86eb9 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/StatusUpdate.xsl @@ -0,0 +1,15 @@ + + + + + + + + + + +
    Total:Extracted:Called:Scored:Copied:
    +
    +
    diff --git a/htsworkflow/pipelines/test/testdata/Summary-rta1_12.htm b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.htm similarity index 100% rename from htsworkflow/pipelines/test/testdata/Summary-rta1_12.htm rename to htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.htm diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.js b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.js new file mode 100755 index 0000000..39b8884 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.js @@ -0,0 +1,8 @@ +window.onerror = function() { + parent.location = './Error.htm'; +} + +function loadSumTable() { + for (i = 1; i < 12; i++) + loadXSLTable('../reports/Summary/read' + i + '.xml', './Summary.xsl', 'SumTbl' + i); +} \ No newline at end of file diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.xsl b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.xsl new file mode 100755 index 0000000..8ebf359 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/Summary.xsl @@ -0,0 +1,49 @@ + + + + +

       Read # + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Lane Tiles Clu.Dens. (#/mm2)% PF Clusters Clusters PF (#/mm2) % Phas./Preph.Cycles
    Err Rated
    % Aligned % Error Rate% Error Rate
    35 cycle
    % Error Rate
    75 cycle
    % Error Rate
    100 cycle
    1st Cycle Int% Intensity
    Cycle 20
    K +/- + K +/- + K +/- + K / + + - +/- + +/- + +/- + +/- + +/- + +/- + +/- +
    + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/TilesPerLane.xsl b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/TilesPerLane.xsl new file mode 100755 index 0000000..550a4af --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/TilesPerLane.xsl @@ -0,0 +1,9 @@ + + + + + + + diff --git a/htsworkflow/pipelines/test/testdata/1_12/Status_Files/illumina.png b/htsworkflow/pipelines/test/testdata/1_12/Status_Files/illumina.png new file mode 100755 index 0000000000000000000000000000000000000000..4add57c68006aa24e57e44333b4949ece9126a71 GIT binary patch literal 1384 zcmeAS@N?(olHy`uVBq!ia0vp^X+W&Z!3-n=r}Xy&DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(ehe3dtTpz6=aiY77hwEes65fI^%&yLa!sd-vY2B~pJb_H5p~wV|Q;%$c(jCr)|#>{&-=&%1Z;R;^xp_{h;k zia`#|r+vIQHjE{hxzLzgB6KS5*K1{~u`MC>RZap%MaO zzZVMt-O5?u5n0T@AXEavjQ7&yD}Wj8sHcl#h==#v(A(3R40w1p=uY7h(@*#R@t^;$ zCzr;8M@3=ZTJ1F2)F#i2S+e2eLf?Qxe4Cw~$8L$;BFeR<;OBn7)joYS!IRgV_%-wN zjI&?6s*fc3?D!*cM%6lxadPTSF@xowQ@LkE^w_WQbq*CTj(dLH;9h0v$GlfB-}`*L zsTyM6@N?EShf^|_12Z07nR;dpi~o;Jy?YYwZB0 literal 0 HcmV?d00001 diff --git a/htsworkflow/pipelines/test/testdata/1_12/Summary-rta1_12.htm b/htsworkflow/pipelines/test/testdata/1_12/Summary-rta1_12.htm new file mode 100755 index 0000000..b11632d --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/Summary-rta1_12.htm @@ -0,0 +1,53 @@ + + + + + + + Status + + + + + + + +
    Refresh  + + + +
    Total:0Extracted:0Called:0Scored:0Copied:0Err.Rated:0
    Loading Run Data ...
    + +

    + +
    +

    No data available yet.

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + diff --git a/htsworkflow/pipelines/test/testdata/aligned_config_1_12.xml b/htsworkflow/pipelines/test/testdata/1_12/aligned_config_1_12.xml similarity index 100% rename from htsworkflow/pipelines/test/testdata/aligned_config_1_12.xml rename to htsworkflow/pipelines/test/testdata/1_12/aligned_config_1_12.xml diff --git a/htsworkflow/pipelines/test/testdata/demultiplex_1.12.4.2.xml b/htsworkflow/pipelines/test/testdata/1_12/demultiplex_1.12.4.2.xml similarity index 100% rename from htsworkflow/pipelines/test/testdata/demultiplex_1.12.4.2.xml rename to htsworkflow/pipelines/test/testdata/1_12/demultiplex_1.12.4.2.xml diff --git a/htsworkflow/pipelines/test/testdata/demultiplexed_bustard_1.12.4.2.xml b/htsworkflow/pipelines/test/testdata/1_12/demultiplexed_bustard_1.12.4.2.xml similarity index 100% rename from htsworkflow/pipelines/test/testdata/demultiplexed_bustard_1.12.4.2.xml rename to htsworkflow/pipelines/test/testdata/1_12/demultiplexed_bustard_1.12.4.2.xml diff --git a/htsworkflow/pipelines/test/testdata/demultiplexed_summary_1.12.4.2.xml b/htsworkflow/pipelines/test/testdata/1_12/demultiplexed_summary_1.12.4.2.xml similarity index 100% rename from htsworkflow/pipelines/test/testdata/demultiplexed_summary_1.12.4.2.xml rename to htsworkflow/pipelines/test/testdata/1_12/demultiplexed_summary_1.12.4.2.xml diff --git a/htsworkflow/pipelines/test/testdata/1_12/reports/Process Control.png b/htsworkflow/pipelines/test/testdata/1_12/reports/Process Control.png new file mode 100755 index 0000000000000000000000000000000000000000..24c0ecfc5093e2345f3ec4d50c70d3505948b48b GIT binary patch literal 28467 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 q!w + + + Illumina RTA 1.12.4.2 + 110815_SN787_0101_AD07K6ACXX + HWI-ST0787 + Thursday, August 18, 2011 12:33 PM + 57 + 57 + 57 + 57 + D:\Illumina\HiSeqTemp\110815_SN787_0101_AD07K6ACXX + \\NICODEMUS\volvox\110815_SN787_0101_AD07K6ACXX + + true + False + True + True + False + 2 + 8 + 48 + 0 + + \ No newline at end of file diff --git a/htsworkflow/pipelines/test/testdata/1_12/reports/StatusUpdate.xml b/htsworkflow/pipelines/test/testdata/1_12/reports/StatusUpdate.xml new file mode 100755 index 0000000..a6a0121 --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/reports/StatusUpdate.xml @@ -0,0 +1 @@ +575757575757 \ No newline at end of file diff --git a/htsworkflow/pipelines/test/testdata/1_12/reports/Summary/read1.xml b/htsworkflow/pipelines/test/testdata/1_12/reports/Summary/read1.xml new file mode 100755 index 0000000..c84b3bd --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/reports/Summary/read1.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/htsworkflow/pipelines/test/testdata/1_12/reports/Summary/read2.xml b/htsworkflow/pipelines/test/testdata/1_12/reports/Summary/read2.xml new file mode 100755 index 0000000..97b691e --- /dev/null +++ b/htsworkflow/pipelines/test/testdata/1_12/reports/Summary/read2.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/htsworkflow/pipelines/test/testdata/rta_basecalls_config_1.12.4.2.xml b/htsworkflow/pipelines/test/testdata/1_12/rta_basecalls_config_1.12.4.2.xml similarity index 100% rename from htsworkflow/pipelines/test/testdata/rta_basecalls_config_1.12.4.2.xml rename to htsworkflow/pipelines/test/testdata/1_12/rta_basecalls_config_1.12.4.2.xml diff --git a/htsworkflow/pipelines/test/testdata/rta_intensities_config_1.12.4.2.xml b/htsworkflow/pipelines/test/testdata/1_12/rta_intensities_config_1.12.4.2.xml similarity index 100% rename from htsworkflow/pipelines/test/testdata/rta_intensities_config_1.12.4.2.xml rename to htsworkflow/pipelines/test/testdata/1_12/rta_intensities_config_1.12.4.2.xml -- 2.30.2