From e88233af84d50822bc6328114e112165605e32fa Mon Sep 17 00:00:00 2001 From: ashvark Date: Wed, 5 Jul 2017 15:12:07 +0200 Subject: [PATCH 01/17] Preview feature for Bam datatype --- lib/galaxy/datatypes/binary.py | 54 +++++++++++++++++++++++++++++++++- lib/galaxy/datatypes/sniff.py | 3 +- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 236d9ba3de2..684ed71e361 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -15,6 +15,7 @@ import pysam from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_MAGIC_SIZE from galaxy.datatypes import metadata +from galaxy.datatypes.tabular import Sam from galaxy.datatypes.metadata import DictParameter, ListParameter, MetadataElement, MetadataParameter from galaxy.util import FILENAME_VALID_CHARS, nice_size, sqlite, which from . import data, dataproviders @@ -220,7 +221,7 @@ Binary.register_unsniffable_binary_ext("asn1-binary") @dataproviders.decorators.has_dataproviders -class Bam( Binary ): +class Bam( Binary , Sam): """Class describing a BAM binary file""" edam_format = "format_2572" edam_data = "data_0863" @@ -236,6 +237,10 @@ class Bam( Binary ): MetadataElement( name="reference_lengths", default=[], desc="Chromosome Lengths", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value=[] ) MetadataElement( name="bam_header", default={}, desc="Dictionary of BAM Headers", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value={} ) + def __init__(self, **kwd): + """Initialize taxonomy datatype""" + super( Bam, self ).__init__( **kwd ) + def _get_samtools_version( self ): version = '0.0.0' samtools_exec = which('samtools') @@ -462,6 +467,53 @@ class Bam( Binary ): file_paths.append(dataset.metadata.bam_index.file_name) return zip(file_paths, rel_paths) + + def get_chunk(self, trans, dataset, offset=0, ck_size=None): + bamfile = pysam.AlignmentFile(dataset.file_name, "rb") + ck_size = 100 # 100 lines + ck_data="" + lineNumber=0 + if(offset == 0): + ck_data = bamfile.text + for f in bamfile.fetch(until_eof=True): + lineNumber+=1 + if (lineNumber > offset and lineNumber <= (offset + ck_size)): + bamline = f.tostring(bamfile) + # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. + # Below code will remove spaces between each tag. + bamlineModified = ('\t').join(bamline.split()[:11] + [('').join(bamline.split()[11:])]) + ck_data=ck_data +"\n" + bamlineModified + elif (lineNumber > (offset + ck_size)): + break + last_read = offset + ck_size + return dumps( { 'ck_data': util.unicodify( ck_data ), + 'offset': last_read } ) + + def display_data( self, trans, dataset, preview=False, filename=None, to_ext=None, offset=None, ck_size=None, **kwd): + preview = util.string_as_bool( preview ) + if offset is not None: + return self.get_chunk(trans, dataset, offset, ck_size) + elif to_ext or not preview: + return super( Bam, self ).display_data( trans, dataset, preview, filename, to_ext, **kwd ) + else: + column_names = 'null' + if dataset.metadata.column_names: + column_names = dataset.metadata.column_names + elif hasattr(dataset.datatype, 'column_names'): + column_names = dataset.datatype.column_names + column_types = dataset.metadata.column_types + if not column_types: + column_types = [] + column_number = dataset.metadata.columns + if column_number is None: + column_number = 'null' + return trans.fill_template( "/dataset/tabular_chunked.mako", + dataset=dataset, + chunk=self.get_chunk(trans, dataset, 0), + column_number=column_number, + column_names=column_names, + column_types=column_types ) + # ------------- Dataproviders # pipe through samtools view # ALSO: (as Sam) diff --git a/lib/galaxy/datatypes/sniff.py b/lib/galaxy/datatypes/sniff.py index b2a82e9f8bf..2c46ba8380c 100644 --- a/lib/galaxy/datatypes/sniff.py +++ b/lib/galaxy/datatypes/sniff.py @@ -28,7 +28,6 @@ from galaxy.util.checkers import ( is_bz2, is_gzip ) -from galaxy.datatypes.binary import Binary log = logging.getLogger(__name__) @@ -478,7 +477,7 @@ def handle_uploaded_dataset_file( filename, datatypes_registry, ext='auto', is_m ext = guess_ext( filename, sniff_order=datatypes_registry.sniff_order, is_multi_byte=is_multi_byte ) if check_binary( filename ): - if not Binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): + if not galaxy.datatypes.binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): raise InappropriateDatasetContentError( 'The binary uploaded file contains inappropriate content.' ) elif check_html( filename ): raise InappropriateDatasetContentError( 'The uploaded file contains inappropriate HTML content.' ) From 2005a9d685209789c95e5eb48d2a6c77d9703201 Mon Sep 17 00:00:00 2001 From: ashvark Date: Wed, 5 Jul 2017 15:17:00 +0200 Subject: [PATCH 02/17] Preview feature for Bam datatype. Final Changes --- lib/galaxy/datatypes/binary.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 684ed71e361..3e040349378 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -10,10 +10,12 @@ import struct import subprocess import tempfile import zipfile +from json import dumps import pysam from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_MAGIC_SIZE +from galaxy import util from galaxy.datatypes import metadata from galaxy.datatypes.tabular import Sam from galaxy.datatypes.metadata import DictParameter, ListParameter, MetadataElement, MetadataParameter From bb67be81cd1c2043ecd1b1eb54942cbb5b52c828 Mon Sep 17 00:00:00 2001 From: ashvark Date: Wed, 5 Jul 2017 18:59:57 +0200 Subject: [PATCH 03/17] Updated based on the changes requested --- lib/galaxy/datatypes/binary.py | 40 ++++++++++++++++------------------ 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 3e040349378..abe050e5741 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -223,7 +223,7 @@ Binary.register_unsniffable_binary_ext("asn1-binary") @dataproviders.decorators.has_dataproviders -class Bam( Binary , Sam): +class Bam( Binary, Sam ): """Class describing a BAM binary file""" edam_format = "format_2572" edam_data = "data_0863" @@ -240,7 +240,6 @@ class Bam( Binary , Sam): MetadataElement( name="bam_header", default={}, desc="Dictionary of BAM Headers", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value={} ) def __init__(self, **kwd): - """Initialize taxonomy datatype""" super( Bam, self ).__init__( **kwd ) def _get_samtools_version( self ): @@ -469,24 +468,23 @@ class Bam( Binary , Sam): file_paths.append(dataset.metadata.bam_index.file_name) return zip(file_paths, rel_paths) - def get_chunk(self, trans, dataset, offset=0, ck_size=None): - bamfile = pysam.AlignmentFile(dataset.file_name, "rb") - ck_size = 100 # 100 lines - ck_data="" - lineNumber=0 - if(offset == 0): - ck_data = bamfile.text - for f in bamfile.fetch(until_eof=True): - lineNumber+=1 - if (lineNumber > offset and lineNumber <= (offset + ck_size)): - bamline = f.tostring(bamfile) - # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. - # Below code will remove spaces between each tag. - bamlineModified = ('\t').join(bamline.split()[:11] + [('').join(bamline.split()[11:])]) - ck_data=ck_data +"\n" + bamlineModified - elif (lineNumber > (offset + ck_size)): - break + index_file = dataset.metadata.bam_index + with pysam.AlignmentFile(dataset.file_name, "rb", index_filename=index_file.file_name) as bamfile: + ck_size = 1000 # 1000 lines + ck_data = "" + line_number = 0 + if offset == 0: + ck_data = bamfile.text + for line_number, alignment, in enumerate(bamfile): + if line_number > offset and line_number <= (offset + ck_size): + bamline = alignment.tostring(bamfile) + # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. + # Below code will remove spaces between each tag. + bamline_modified = ('\t').join(bamline.split()[:11] + [('').join(bamline.split()[11:])]) + ck_data = ck_data +"\n" + bamline_modified + elif line_number > (offset + ck_size): + break last_read = offset + ck_size return dumps( { 'ck_data': util.unicodify( ck_data ), 'offset': last_read } ) @@ -498,7 +496,7 @@ class Bam( Binary , Sam): elif to_ext or not preview: return super( Bam, self ).display_data( trans, dataset, preview, filename, to_ext, **kwd ) else: - column_names = 'null' + column_names = '' if dataset.metadata.column_names: column_names = dataset.metadata.column_names elif hasattr(dataset.datatype, 'column_names'): @@ -508,7 +506,7 @@ class Bam( Binary , Sam): column_types = [] column_number = dataset.metadata.columns if column_number is None: - column_number = 'null' + column_number = 1 return trans.fill_template( "/dataset/tabular_chunked.mako", dataset=dataset, chunk=self.get_chunk(trans, dataset, 0), From 72c196f793aeb30ec00cf368e419bcdaecdbd514 Mon Sep 17 00:00:00 2001 From: ashvark Date: Thu, 6 Jul 2017 14:48:08 +0200 Subject: [PATCH 04/17] Accessing Bam file via seek() and tell() --- lib/galaxy/datatypes/binary.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index abe050e5741..c36c39cf8f3 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -468,31 +468,37 @@ class Bam( Binary, Sam ): file_paths.append(dataset.metadata.bam_index.file_name) return zip(file_paths, rel_paths) - def get_chunk(self, trans, dataset, offset=0, ck_size=None): + def get_chunk( self, trans, dataset, offset=0, ck_size=None ): index_file = dataset.metadata.bam_index - with pysam.AlignmentFile(dataset.file_name, "rb", index_filename=index_file.file_name) as bamfile: - ck_size = 1000 # 1000 lines + with pysam.AlignmentFile( dataset.file_name, "rb", index_filename=index_file.file_name ) as bamfile: + ck_size = 300 # 300 lines ck_data = "" - line_number = 0 + last_read = 0 + header_line_count = 0 if offset == 0: ck_data = bamfile.text - for line_number, alignment, in enumerate(bamfile): - if line_number > offset and line_number <= (offset + ck_size): - bamline = alignment.tostring(bamfile) + header_line_count = bamfile.text.count('\n') + else: + bamfile.seek( offset ) + for line_number, alignment in enumerate( bamfile ) : + # return only Header lines if 'header_line_count' exceeds 'ck_size' + # FIXME: Can be problematic if bam has million lines of header + if ( line_number + header_line_count ) > ck_size: + break + else: + bamline = alignment.tostring( bamfile ) # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. # Below code will remove spaces between each tag. - bamline_modified = ('\t').join(bamline.split()[:11] + [('').join(bamline.split()[11:])]) + bamline_modified = ('\t').join( bamline.split()[:11] + [ ('').join(bamline.split()[11:]) ] ) ck_data = ck_data +"\n" + bamline_modified - elif line_number > (offset + ck_size): - break - last_read = offset + ck_size + last_read = bamfile.tell() return dumps( { 'ck_data': util.unicodify( ck_data ), 'offset': last_read } ) def display_data( self, trans, dataset, preview=False, filename=None, to_ext=None, offset=None, ck_size=None, **kwd): preview = util.string_as_bool( preview ) if offset is not None: - return self.get_chunk(trans, dataset, offset, ck_size) + return self.get_chunk( trans, dataset, offset, ck_size ) elif to_ext or not preview: return super( Bam, self ).display_data( trans, dataset, preview, filename, to_ext, **kwd ) else: @@ -509,7 +515,7 @@ class Bam( Binary, Sam ): column_number = 1 return trans.fill_template( "/dataset/tabular_chunked.mako", dataset=dataset, - chunk=self.get_chunk(trans, dataset, 0), + chunk=self.get_chunk( trans, dataset, 0 ), column_number=column_number, column_names=column_names, column_types=column_types ) From c66298d62717c88cf4341ad1601176420b16f280 Mon Sep 17 00:00:00 2001 From: ashvark Date: Thu, 6 Jul 2017 15:43:56 +0200 Subject: [PATCH 05/17] travis test correction --- lib/galaxy/datatypes/binary.py | 6 +++--- lib/galaxy/datatypes/sniff.py | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index c36c39cf8f3..b6276f0ac7f 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -487,10 +487,10 @@ class Bam( Binary, Sam ): break else: bamline = alignment.tostring( bamfile ) - # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. - # Below code will remove spaces between each tag. + # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. + # Below code will remove spaces between each tag. bamline_modified = ('\t').join( bamline.split()[:11] + [ ('').join(bamline.split()[11:]) ] ) - ck_data = ck_data +"\n" + bamline_modified + ck_data = ck_data + "\n" + bamline_modified last_read = bamfile.tell() return dumps( { 'ck_data': util.unicodify( ck_data ), 'offset': last_read } ) diff --git a/lib/galaxy/datatypes/sniff.py b/lib/galaxy/datatypes/sniff.py index 2c46ba8380c..0d585a4ac80 100644 --- a/lib/galaxy/datatypes/sniff.py +++ b/lib/galaxy/datatypes/sniff.py @@ -17,6 +17,7 @@ from encodings import search_function as encodings_search_function from six import text_type from galaxy import util +from galaxy import datatypes from galaxy.util import multi_byte from galaxy.util import ( compression_utils, @@ -477,7 +478,7 @@ def handle_uploaded_dataset_file( filename, datatypes_registry, ext='auto', is_m ext = guess_ext( filename, sniff_order=datatypes_registry.sniff_order, is_multi_byte=is_multi_byte ) if check_binary( filename ): - if not galaxy.datatypes.binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): + if not datatypes.binary.Binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): raise InappropriateDatasetContentError( 'The binary uploaded file contains inappropriate content.' ) elif check_html( filename ): raise InappropriateDatasetContentError( 'The uploaded file contains inappropriate HTML content.' ) From 8c8aa8820fcc592c31693399660b87b04809b9da Mon Sep 17 00:00:00 2001 From: ashvark Date: Wed, 5 Jul 2017 15:12:07 +0200 Subject: [PATCH 06/17] Preview feature for Bam datatype --- lib/galaxy/datatypes/binary.py | 54 +++++++++++++++++++++++++++++++++- lib/galaxy/datatypes/sniff.py | 2 +- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 236d9ba3de2..684ed71e361 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -15,6 +15,7 @@ import pysam from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_MAGIC_SIZE from galaxy.datatypes import metadata +from galaxy.datatypes.tabular import Sam from galaxy.datatypes.metadata import DictParameter, ListParameter, MetadataElement, MetadataParameter from galaxy.util import FILENAME_VALID_CHARS, nice_size, sqlite, which from . import data, dataproviders @@ -220,7 +221,7 @@ Binary.register_unsniffable_binary_ext("asn1-binary") @dataproviders.decorators.has_dataproviders -class Bam( Binary ): +class Bam( Binary , Sam): """Class describing a BAM binary file""" edam_format = "format_2572" edam_data = "data_0863" @@ -236,6 +237,10 @@ class Bam( Binary ): MetadataElement( name="reference_lengths", default=[], desc="Chromosome Lengths", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value=[] ) MetadataElement( name="bam_header", default={}, desc="Dictionary of BAM Headers", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value={} ) + def __init__(self, **kwd): + """Initialize taxonomy datatype""" + super( Bam, self ).__init__( **kwd ) + def _get_samtools_version( self ): version = '0.0.0' samtools_exec = which('samtools') @@ -462,6 +467,53 @@ class Bam( Binary ): file_paths.append(dataset.metadata.bam_index.file_name) return zip(file_paths, rel_paths) + + def get_chunk(self, trans, dataset, offset=0, ck_size=None): + bamfile = pysam.AlignmentFile(dataset.file_name, "rb") + ck_size = 100 # 100 lines + ck_data="" + lineNumber=0 + if(offset == 0): + ck_data = bamfile.text + for f in bamfile.fetch(until_eof=True): + lineNumber+=1 + if (lineNumber > offset and lineNumber <= (offset + ck_size)): + bamline = f.tostring(bamfile) + # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. + # Below code will remove spaces between each tag. + bamlineModified = ('\t').join(bamline.split()[:11] + [('').join(bamline.split()[11:])]) + ck_data=ck_data +"\n" + bamlineModified + elif (lineNumber > (offset + ck_size)): + break + last_read = offset + ck_size + return dumps( { 'ck_data': util.unicodify( ck_data ), + 'offset': last_read } ) + + def display_data( self, trans, dataset, preview=False, filename=None, to_ext=None, offset=None, ck_size=None, **kwd): + preview = util.string_as_bool( preview ) + if offset is not None: + return self.get_chunk(trans, dataset, offset, ck_size) + elif to_ext or not preview: + return super( Bam, self ).display_data( trans, dataset, preview, filename, to_ext, **kwd ) + else: + column_names = 'null' + if dataset.metadata.column_names: + column_names = dataset.metadata.column_names + elif hasattr(dataset.datatype, 'column_names'): + column_names = dataset.datatype.column_names + column_types = dataset.metadata.column_types + if not column_types: + column_types = [] + column_number = dataset.metadata.columns + if column_number is None: + column_number = 'null' + return trans.fill_template( "/dataset/tabular_chunked.mako", + dataset=dataset, + chunk=self.get_chunk(trans, dataset, 0), + column_number=column_number, + column_names=column_names, + column_types=column_types ) + # ------------- Dataproviders # pipe through samtools view # ALSO: (as Sam) diff --git a/lib/galaxy/datatypes/sniff.py b/lib/galaxy/datatypes/sniff.py index 4e1aa31b223..bfa271d1ec4 100644 --- a/lib/galaxy/datatypes/sniff.py +++ b/lib/galaxy/datatypes/sniff.py @@ -487,7 +487,7 @@ def handle_uploaded_dataset_file( filename, datatypes_registry, ext='auto', is_m ext = guess_ext( filename, sniff_order=datatypes_registry.sniff_order, is_multi_byte=is_multi_byte ) if check_binary( filename ): - if not Binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): + if not galaxy.datatypes.binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): raise InappropriateDatasetContentError( 'The binary uploaded file contains inappropriate content.' ) elif check_html( filename ): raise InappropriateDatasetContentError( 'The uploaded file contains inappropriate HTML content.' ) From 3ddf819c83f881eee4b7ab19281926e1e64a58d3 Mon Sep 17 00:00:00 2001 From: ashvark Date: Wed, 5 Jul 2017 15:17:00 +0200 Subject: [PATCH 07/17] Preview feature for Bam datatype. Final Changes --- lib/galaxy/datatypes/binary.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 684ed71e361..3e040349378 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -10,10 +10,12 @@ import struct import subprocess import tempfile import zipfile +from json import dumps import pysam from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_MAGIC_SIZE +from galaxy import util from galaxy.datatypes import metadata from galaxy.datatypes.tabular import Sam from galaxy.datatypes.metadata import DictParameter, ListParameter, MetadataElement, MetadataParameter From 9a8c8b8a61b1ec09509cc9b2b7738eae5238e036 Mon Sep 17 00:00:00 2001 From: ashvark Date: Wed, 5 Jul 2017 18:59:57 +0200 Subject: [PATCH 08/17] Updated based on the changes requested --- lib/galaxy/datatypes/binary.py | 40 ++++++++++++++++------------------ 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 3e040349378..abe050e5741 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -223,7 +223,7 @@ Binary.register_unsniffable_binary_ext("asn1-binary") @dataproviders.decorators.has_dataproviders -class Bam( Binary , Sam): +class Bam( Binary, Sam ): """Class describing a BAM binary file""" edam_format = "format_2572" edam_data = "data_0863" @@ -240,7 +240,6 @@ class Bam( Binary , Sam): MetadataElement( name="bam_header", default={}, desc="Dictionary of BAM Headers", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value={} ) def __init__(self, **kwd): - """Initialize taxonomy datatype""" super( Bam, self ).__init__( **kwd ) def _get_samtools_version( self ): @@ -469,24 +468,23 @@ class Bam( Binary , Sam): file_paths.append(dataset.metadata.bam_index.file_name) return zip(file_paths, rel_paths) - def get_chunk(self, trans, dataset, offset=0, ck_size=None): - bamfile = pysam.AlignmentFile(dataset.file_name, "rb") - ck_size = 100 # 100 lines - ck_data="" - lineNumber=0 - if(offset == 0): - ck_data = bamfile.text - for f in bamfile.fetch(until_eof=True): - lineNumber+=1 - if (lineNumber > offset and lineNumber <= (offset + ck_size)): - bamline = f.tostring(bamfile) - # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. - # Below code will remove spaces between each tag. - bamlineModified = ('\t').join(bamline.split()[:11] + [('').join(bamline.split()[11:])]) - ck_data=ck_data +"\n" + bamlineModified - elif (lineNumber > (offset + ck_size)): - break + index_file = dataset.metadata.bam_index + with pysam.AlignmentFile(dataset.file_name, "rb", index_filename=index_file.file_name) as bamfile: + ck_size = 1000 # 1000 lines + ck_data = "" + line_number = 0 + if offset == 0: + ck_data = bamfile.text + for line_number, alignment, in enumerate(bamfile): + if line_number > offset and line_number <= (offset + ck_size): + bamline = alignment.tostring(bamfile) + # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. + # Below code will remove spaces between each tag. + bamline_modified = ('\t').join(bamline.split()[:11] + [('').join(bamline.split()[11:])]) + ck_data = ck_data +"\n" + bamline_modified + elif line_number > (offset + ck_size): + break last_read = offset + ck_size return dumps( { 'ck_data': util.unicodify( ck_data ), 'offset': last_read } ) @@ -498,7 +496,7 @@ class Bam( Binary , Sam): elif to_ext or not preview: return super( Bam, self ).display_data( trans, dataset, preview, filename, to_ext, **kwd ) else: - column_names = 'null' + column_names = '' if dataset.metadata.column_names: column_names = dataset.metadata.column_names elif hasattr(dataset.datatype, 'column_names'): @@ -508,7 +506,7 @@ class Bam( Binary , Sam): column_types = [] column_number = dataset.metadata.columns if column_number is None: - column_number = 'null' + column_number = 1 return trans.fill_template( "/dataset/tabular_chunked.mako", dataset=dataset, chunk=self.get_chunk(trans, dataset, 0), From 731d1db4b23e2a75335f716a9c6f6d1b30938101 Mon Sep 17 00:00:00 2001 From: ashvark Date: Thu, 6 Jul 2017 14:48:08 +0200 Subject: [PATCH 09/17] Accessing Bam file via seek() and tell() --- lib/galaxy/datatypes/binary.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index abe050e5741..c36c39cf8f3 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -468,31 +468,37 @@ class Bam( Binary, Sam ): file_paths.append(dataset.metadata.bam_index.file_name) return zip(file_paths, rel_paths) - def get_chunk(self, trans, dataset, offset=0, ck_size=None): + def get_chunk( self, trans, dataset, offset=0, ck_size=None ): index_file = dataset.metadata.bam_index - with pysam.AlignmentFile(dataset.file_name, "rb", index_filename=index_file.file_name) as bamfile: - ck_size = 1000 # 1000 lines + with pysam.AlignmentFile( dataset.file_name, "rb", index_filename=index_file.file_name ) as bamfile: + ck_size = 300 # 300 lines ck_data = "" - line_number = 0 + last_read = 0 + header_line_count = 0 if offset == 0: ck_data = bamfile.text - for line_number, alignment, in enumerate(bamfile): - if line_number > offset and line_number <= (offset + ck_size): - bamline = alignment.tostring(bamfile) + header_line_count = bamfile.text.count('\n') + else: + bamfile.seek( offset ) + for line_number, alignment in enumerate( bamfile ) : + # return only Header lines if 'header_line_count' exceeds 'ck_size' + # FIXME: Can be problematic if bam has million lines of header + if ( line_number + header_line_count ) > ck_size: + break + else: + bamline = alignment.tostring( bamfile ) # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. # Below code will remove spaces between each tag. - bamline_modified = ('\t').join(bamline.split()[:11] + [('').join(bamline.split()[11:])]) + bamline_modified = ('\t').join( bamline.split()[:11] + [ ('').join(bamline.split()[11:]) ] ) ck_data = ck_data +"\n" + bamline_modified - elif line_number > (offset + ck_size): - break - last_read = offset + ck_size + last_read = bamfile.tell() return dumps( { 'ck_data': util.unicodify( ck_data ), 'offset': last_read } ) def display_data( self, trans, dataset, preview=False, filename=None, to_ext=None, offset=None, ck_size=None, **kwd): preview = util.string_as_bool( preview ) if offset is not None: - return self.get_chunk(trans, dataset, offset, ck_size) + return self.get_chunk( trans, dataset, offset, ck_size ) elif to_ext or not preview: return super( Bam, self ).display_data( trans, dataset, preview, filename, to_ext, **kwd ) else: @@ -509,7 +515,7 @@ class Bam( Binary, Sam ): column_number = 1 return trans.fill_template( "/dataset/tabular_chunked.mako", dataset=dataset, - chunk=self.get_chunk(trans, dataset, 0), + chunk=self.get_chunk( trans, dataset, 0 ), column_number=column_number, column_names=column_names, column_types=column_types ) From dac72950db3b64291c5c202b9db15fac3525de86 Mon Sep 17 00:00:00 2001 From: ashvark Date: Thu, 6 Jul 2017 15:43:56 +0200 Subject: [PATCH 10/17] travis test correction --- lib/galaxy/datatypes/binary.py | 6 +++--- lib/galaxy/datatypes/sniff.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index c36c39cf8f3..b6276f0ac7f 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -487,10 +487,10 @@ class Bam( Binary, Sam ): break else: bamline = alignment.tostring( bamfile ) - # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. - # Below code will remove spaces between each tag. + # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. + # Below code will remove spaces between each tag. bamline_modified = ('\t').join( bamline.split()[:11] + [ ('').join(bamline.split()[11:]) ] ) - ck_data = ck_data +"\n" + bamline_modified + ck_data = ck_data + "\n" + bamline_modified last_read = bamfile.tell() return dumps( { 'ck_data': util.unicodify( ck_data ), 'offset': last_read } ) diff --git a/lib/galaxy/datatypes/sniff.py b/lib/galaxy/datatypes/sniff.py index bfa271d1ec4..08342cf876d 100644 --- a/lib/galaxy/datatypes/sniff.py +++ b/lib/galaxy/datatypes/sniff.py @@ -17,7 +17,7 @@ import zipfile from six import text_type from galaxy import util -from galaxy.datatypes.binary import Binary +from galaxy import datatypes from galaxy.util import ( compression_utils, multi_byte, @@ -487,7 +487,7 @@ def handle_uploaded_dataset_file( filename, datatypes_registry, ext='auto', is_m ext = guess_ext( filename, sniff_order=datatypes_registry.sniff_order, is_multi_byte=is_multi_byte ) if check_binary( filename ): - if not galaxy.datatypes.binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): + if not datatypes.binary.Binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): raise InappropriateDatasetContentError( 'The binary uploaded file contains inappropriate content.' ) elif check_html( filename ): raise InappropriateDatasetContentError( 'The uploaded file contains inappropriate HTML content.' ) From 253d0c2d4f435a9778a636ff3a162d0fe0717854 Mon Sep 17 00:00:00 2001 From: ashvark Date: Thu, 6 Jul 2017 18:07:19 +0200 Subject: [PATCH 11/17] reordering import statements --- lib/galaxy/datatypes/binary.py | 2 +- lib/galaxy/datatypes/sniff.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index b6276f0ac7f..6ba1a198381 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -17,8 +17,8 @@ from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_ from galaxy import util from galaxy.datatypes import metadata -from galaxy.datatypes.tabular import Sam from galaxy.datatypes.metadata import DictParameter, ListParameter, MetadataElement, MetadataParameter +from galaxy.datatypes.tabular import Sam from galaxy.util import FILENAME_VALID_CHARS, nice_size, sqlite, which from . import data, dataproviders diff --git a/lib/galaxy/datatypes/sniff.py b/lib/galaxy/datatypes/sniff.py index 08342cf876d..f20777b7c75 100644 --- a/lib/galaxy/datatypes/sniff.py +++ b/lib/galaxy/datatypes/sniff.py @@ -16,8 +16,8 @@ import zipfile from six import text_type -from galaxy import util from galaxy import datatypes +from galaxy import util from galaxy.util import ( compression_utils, multi_byte, From 3ddd05d56985360c31bd62ea78027fbfc34bb796 Mon Sep 17 00:00:00 2001 From: ashvark Date: Fri, 7 Jul 2017 13:35:17 +0200 Subject: [PATCH 12/17] Removing the SAM datatype for class Bam and resetting changes with sniff.py --- lib/galaxy/datatypes/binary.py | 9 +++++++-- lib/galaxy/datatypes/sniff.py | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 6ba1a198381..aadf8f4d603 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -18,7 +18,6 @@ from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_ from galaxy import util from galaxy.datatypes import metadata from galaxy.datatypes.metadata import DictParameter, ListParameter, MetadataElement, MetadataParameter -from galaxy.datatypes.tabular import Sam from galaxy.util import FILENAME_VALID_CHARS, nice_size, sqlite, which from . import data, dataproviders @@ -223,7 +222,7 @@ Binary.register_unsniffable_binary_ext("asn1-binary") @dataproviders.decorators.has_dataproviders -class Bam( Binary, Sam ): +class Bam( Binary ): """Class describing a BAM binary file""" edam_format = "format_2572" edam_data = "data_0863" @@ -238,9 +237,13 @@ class Bam( Binary, Sam ): MetadataElement( name="reference_names", default=[], desc="Chromosome Names", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value=[] ) MetadataElement( name="reference_lengths", default=[], desc="Chromosome Lengths", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value=[] ) MetadataElement( name="bam_header", default={}, desc="Dictionary of BAM Headers", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value={} ) + MetadataElement( name="columns", default=0, desc="Number of columns", readonly=True, visible=False, no_value=0 ) + MetadataElement( name="column_types", default=[], desc="Column types", param=metadata.ColumnTypesParameter, readonly=True, visible=False, no_value=[] ) + MetadataElement( name="column_names", default=[], desc="Column names", readonly=True, visible=False, optional=True, no_value=[] ) def __init__(self, **kwd): super( Bam, self ).__init__( **kwd ) + self.column_names = ['QNAME', 'FLAG', 'RNAME', 'POS', 'MAPQ', 'CIGAR', 'MRNM', 'MPOS', 'ISIZE', 'SEQ', 'QUAL', 'OPT' ] def _get_samtools_version( self ): version = '0.0.0' @@ -429,6 +432,8 @@ class Bam( Binary, Sam ): dataset.metadata.read_groups = [ read_group['ID'] for read_group in dataset.metadata.bam_header.get( 'RG', [] ) if 'ID' in read_group ] dataset.metadata.sort_order = dataset.metadata.bam_header.get( 'HD', {} ).get( 'SO', None ) dataset.metadata.bam_version = dataset.metadata.bam_header.get( 'HD', {} ).get( 'VN', None ) + dataset.metadata.columns = 12 + dataset.metadata.column_types = ['str', 'int', 'str', 'int', 'int', 'str', 'str', 'int', 'int', 'str', 'str', 'str'] except: # Per Dan, don't log here because doing so will cause datasets that # fail metadata to end in the error state diff --git a/lib/galaxy/datatypes/sniff.py b/lib/galaxy/datatypes/sniff.py index f20777b7c75..4e1aa31b223 100644 --- a/lib/galaxy/datatypes/sniff.py +++ b/lib/galaxy/datatypes/sniff.py @@ -16,8 +16,8 @@ import zipfile from six import text_type -from galaxy import datatypes from galaxy import util +from galaxy.datatypes.binary import Binary from galaxy.util import ( compression_utils, multi_byte, @@ -487,7 +487,7 @@ def handle_uploaded_dataset_file( filename, datatypes_registry, ext='auto', is_m ext = guess_ext( filename, sniff_order=datatypes_registry.sniff_order, is_multi_byte=is_multi_byte ) if check_binary( filename ): - if not datatypes.binary.Binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): + if not Binary.is_ext_unsniffable(ext) and not datatypes_registry.get_datatype_by_extension( ext ).sniff( filename ): raise InappropriateDatasetContentError( 'The binary uploaded file contains inappropriate content.' ) elif check_html( filename ): raise InappropriateDatasetContentError( 'The uploaded file contains inappropriate HTML content.' ) From c476090bdef84b7781458ff7445451d35e0af46b Mon Sep 17 00:00:00 2001 From: ashvark Date: Fri, 7 Jul 2017 16:20:32 +0200 Subject: [PATCH 13/17] setting default value for column_names, column_types and column Metadata --- lib/galaxy/datatypes/binary.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index aadf8f4d603..11010eb965e 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -237,13 +237,11 @@ class Bam( Binary ): MetadataElement( name="reference_names", default=[], desc="Chromosome Names", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value=[] ) MetadataElement( name="reference_lengths", default=[], desc="Chromosome Lengths", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value=[] ) MetadataElement( name="bam_header", default={}, desc="Dictionary of BAM Headers", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value={} ) - MetadataElement( name="columns", default=0, desc="Number of columns", readonly=True, visible=False, no_value=0 ) - MetadataElement( name="column_types", default=[], desc="Column types", param=metadata.ColumnTypesParameter, readonly=True, visible=False, no_value=[] ) - MetadataElement( name="column_names", default=[], desc="Column names", readonly=True, visible=False, optional=True, no_value=[] ) - - def __init__(self, **kwd): - super( Bam, self ).__init__( **kwd ) - self.column_names = ['QNAME', 'FLAG', 'RNAME', 'POS', 'MAPQ', 'CIGAR', 'MRNM', 'MPOS', 'ISIZE', 'SEQ', 'QUAL', 'OPT' ] + MetadataElement( name="columns", default=12, desc="Number of columns", readonly=True, visible=False, no_value=0 ) + MetadataElement( name="column_types", default=['str', 'int', 'str', 'int', 'int', 'str', 'str', 'int', 'int', 'str', 'str', 'str'], desc="Column types", + param=metadata.ColumnTypesParameter, readonly=True, visible=False, no_value=[] ) + MetadataElement( name="column_names", default=[ 'QNAME', 'FLAG', 'RNAME', 'POS', 'MAPQ', 'CIGAR', 'MRNM', 'MPOS', 'ISIZE', 'SEQ', 'QUAL', 'OPT' ], desc="Column names", + readonly=True, visible=False, optional=True, no_value=[] ) def _get_samtools_version( self ): version = '0.0.0' @@ -432,8 +430,6 @@ class Bam( Binary ): dataset.metadata.read_groups = [ read_group['ID'] for read_group in dataset.metadata.bam_header.get( 'RG', [] ) if 'ID' in read_group ] dataset.metadata.sort_order = dataset.metadata.bam_header.get( 'HD', {} ).get( 'SO', None ) dataset.metadata.bam_version = dataset.metadata.bam_header.get( 'HD', {} ).get( 'VN', None ) - dataset.metadata.columns = 12 - dataset.metadata.column_types = ['str', 'int', 'str', 'int', 'int', 'str', 'str', 'int', 'int', 'str', 'str', 'str'] except: # Per Dan, don't log here because doing so will cause datasets that # fail metadata to end in the error state @@ -488,6 +484,7 @@ class Bam( Binary ): for line_number, alignment in enumerate( bamfile ) : # return only Header lines if 'header_line_count' exceeds 'ck_size' # FIXME: Can be problematic if bam has million lines of header + last_read = bamfile.tell() if ( line_number + header_line_count ) > ck_size: break else: @@ -496,7 +493,6 @@ class Bam( Binary ): # Below code will remove spaces between each tag. bamline_modified = ('\t').join( bamline.split()[:11] + [ ('').join(bamline.split()[11:]) ] ) ck_data = ck_data + "\n" + bamline_modified - last_read = bamfile.tell() return dumps( { 'ck_data': util.unicodify( ck_data ), 'offset': last_read } ) @@ -507,11 +503,9 @@ class Bam( Binary ): elif to_ext or not preview: return super( Bam, self ).display_data( trans, dataset, preview, filename, to_ext, **kwd ) else: - column_names = '' - if dataset.metadata.column_names: - column_names = dataset.metadata.column_names - elif hasattr(dataset.datatype, 'column_names'): - column_names = dataset.datatype.column_names + column_names = dataset.metadata.column_names + if not column_names: + column_names = [] column_types = dataset.metadata.column_types if not column_types: column_types = [] From 8b3e492bad9257bd0f4c9ba3e78f1a88cc64bfe6 Mon Sep 17 00:00:00 2001 From: ashvark Date: Fri, 7 Jul 2017 16:47:16 +0200 Subject: [PATCH 14/17] Fix for travis test --- lib/galaxy/datatypes/binary.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 11010eb965e..a1715946693 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -238,10 +238,8 @@ class Bam( Binary ): MetadataElement( name="reference_lengths", default=[], desc="Chromosome Lengths", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value=[] ) MetadataElement( name="bam_header", default={}, desc="Dictionary of BAM Headers", param=MetadataParameter, readonly=True, visible=False, optional=True, no_value={} ) MetadataElement( name="columns", default=12, desc="Number of columns", readonly=True, visible=False, no_value=0 ) - MetadataElement( name="column_types", default=['str', 'int', 'str', 'int', 'int', 'str', 'str', 'int', 'int', 'str', 'str', 'str'], desc="Column types", - param=metadata.ColumnTypesParameter, readonly=True, visible=False, no_value=[] ) - MetadataElement( name="column_names", default=[ 'QNAME', 'FLAG', 'RNAME', 'POS', 'MAPQ', 'CIGAR', 'MRNM', 'MPOS', 'ISIZE', 'SEQ', 'QUAL', 'OPT' ], desc="Column names", - readonly=True, visible=False, optional=True, no_value=[] ) + MetadataElement( name="column_types", default=['str', 'int', 'str', 'int', 'int', 'str', 'str', 'int', 'int', 'str', 'str', 'str'], desc="Column types", param=metadata.ColumnTypesParameter, readonly=True, visible=False, no_value=[] ) + MetadataElement( name="column_names", default=[ 'QNAME', 'FLAG', 'RNAME', 'POS', 'MAPQ', 'CIGAR', 'MRNM', 'MPOS', 'ISIZE', 'SEQ', 'QUAL', 'OPT' ], desc="Column names", readonly=True, visible=False, optional=True, no_value=[] ) def _get_samtools_version( self ): version = '0.0.0' From 0cfdfbf275fda9072b521fa501ad1aaafdc87c8e Mon Sep 17 00:00:00 2001 From: ashvark Date: Fri, 7 Jul 2017 17:09:16 +0200 Subject: [PATCH 15/17] replaced last_read with offset variable --- lib/galaxy/datatypes/binary.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index a1715946693..8c941864c7b 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -472,7 +472,6 @@ class Bam( Binary ): with pysam.AlignmentFile( dataset.file_name, "rb", index_filename=index_file.file_name ) as bamfile: ck_size = 300 # 300 lines ck_data = "" - last_read = 0 header_line_count = 0 if offset == 0: ck_data = bamfile.text @@ -482,7 +481,7 @@ class Bam( Binary ): for line_number, alignment in enumerate( bamfile ) : # return only Header lines if 'header_line_count' exceeds 'ck_size' # FIXME: Can be problematic if bam has million lines of header - last_read = bamfile.tell() + offset = bamfile.tell() if ( line_number + header_line_count ) > ck_size: break else: @@ -490,9 +489,9 @@ class Bam( Binary ): # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. # Below code will remove spaces between each tag. bamline_modified = ('\t').join( bamline.split()[:11] + [ ('').join(bamline.split()[11:]) ] ) - ck_data = ck_data + "\n" + bamline_modified + ck_data = "%s\n%s" % ( ck_data, bamline_modified ) return dumps( { 'ck_data': util.unicodify( ck_data ), - 'offset': last_read } ) + 'offset': offset } ) def display_data( self, trans, dataset, preview=False, filename=None, to_ext=None, offset=None, ck_size=None, **kwd): preview = util.string_as_bool( preview ) From 90a0ab0398860cccf84a78dd293f62b44bb0bf71 Mon Sep 17 00:00:00 2001 From: ashvark Date: Mon, 10 Jul 2017 11:26:34 +0200 Subject: [PATCH 16/17] Replace '\t' to ' ' in BAM headers --- lib/galaxy/datatypes/binary.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 8c941864c7b..0a0bbbf3229 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -474,7 +474,7 @@ class Bam( Binary ): ck_data = "" header_line_count = 0 if offset == 0: - ck_data = bamfile.text + ck_data = bamfile.text.replace('\t',' ') header_line_count = bamfile.text.count('\n') else: bamfile.seek( offset ) @@ -486,9 +486,9 @@ class Bam( Binary ): break else: bamline = alignment.tostring( bamfile ) - # Galaxy display each tag as separate column because 'tostring()' funcition put spaces in between each tag of tags column. + # Galaxy display each tag as separate column because 'tostring()' funcition put tabs in between each tag of tags column. # Below code will remove spaces between each tag. - bamline_modified = ('\t').join( bamline.split()[:11] + [ ('').join(bamline.split()[11:]) ] ) + bamline_modified = ('\t').join( bamline.split()[:11] + [ (' ').join(bamline.split()[11:]) ] ) ck_data = "%s\n%s" % ( ck_data, bamline_modified ) return dumps( { 'ck_data': util.unicodify( ck_data ), 'offset': offset } ) From b370a9cbaea3781d21c3d618cfa5521bdc5bea73 Mon Sep 17 00:00:00 2001 From: ashvark Date: Mon, 10 Jul 2017 15:25:28 +0200 Subject: [PATCH 17/17] travis test fix --- lib/galaxy/datatypes/binary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 0a0bbbf3229..57b1f5223ab 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -474,7 +474,7 @@ class Bam( Binary ): ck_data = "" header_line_count = 0 if offset == 0: - ck_data = bamfile.text.replace('\t',' ') + ck_data = bamfile.text.replace('\t', ' ') header_line_count = bamfile.text.count('\n') else: bamfile.seek( offset )