diff --git a/datatypes_conf.xml.sample b/datatypes_conf.xml.sample index 645cb00c2ee..b00a14540b9 100644 --- a/datatypes_conf.xml.sample +++ b/datatypes_conf.xml.sample @@ -19,7 +19,7 @@ - + @@ -42,7 +42,9 @@ - + + + @@ -186,7 +188,9 @@ - + + + diff --git a/lib/galaxy/datatypes/converters/fastqsolexa_to_qual_converter.xml b/lib/galaxy/datatypes/converters/fastqsolexa_to_qual_converter.xml index fcf966626b7..c8c8c48147a 100644 --- a/lib/galaxy/datatypes/converters/fastqsolexa_to_qual_converter.xml +++ b/lib/galaxy/datatypes/converters/fastqsolexa_to_qual_converter.xml @@ -4,7 +4,7 @@ - + diff --git a/lib/galaxy/datatypes/qualityscore.py b/lib/galaxy/datatypes/qualityscore.py index 8367cbf979f..275f58529df 100644 --- a/lib/galaxy/datatypes/qualityscore.py +++ b/lib/galaxy/datatypes/qualityscore.py @@ -9,11 +9,11 @@ from galaxy import util log = logging.getLogger(__name__) -class QualityScore ( data.Text ): +class QualityScoreSOLiD ( data.Text ): """ until we know more about quality score formats """ - file_ext = "qual" + file_ext = "qualsolid" def set_peek( self, dataset, line_count=None ): if not dataset.dataset.purged: @@ -21,7 +21,7 @@ class QualityScore ( data.Text ): if line_count is None: dataset.blurb = data.nice_size( dataset.get_size() ) else: - dataset.blurb = "%s lines, Quality score file" % util.commaify( str( line_count ) ) + dataset.blurb = "%s lines, SOLiD Quality score file" % util.commaify( str( line_count ) ) else: dataset.peek = 'file does not exist' dataset.blurb = 'file purged from disk' @@ -30,15 +30,80 @@ class QualityScore ( data.Text ): try: return dataset.peek except: - return "Quality score file (%s)" % ( data.nice_size( dataset.get_size() ) ) + return "SOLiD Quality score file (%s)" % ( data.nice_size( dataset.get_size() ) ) def sniff( self, filename ): """ >>> fname = get_test_fname( 'sequence.fasta' ) - >>> QualityScore().sniff( fname ) + >>> QualityScoreSOLiD().sniff( fname ) False - >>> fname = get_test_fname( 'sequence.qual' ) - >>> QualityScore().sniff( fname ) + >>> fname = get_test_fname( 'sequence.qualsolid' ) + >>> QualityScoreSOLiD().sniff( fname ) + True + """ + try: + fh = open( filename ) + readlen = None + goodblock = 0 + while True: + line = fh.readline() + if not line: + if goodblock > 0: + return True + else: + break #EOF + line = line.strip() + if line and not line.startswith( '#' ): #first non-empty non-comment line + if line.startswith( '>' ): + line = fh.readline().strip() + if line == '' or line.startswith( '>' ): + break + try: + [ int( x ) for x in line.split() ] + if not(readlen): + readlen = len(line.split()) + assert len(line.split()) == readlen #SOLiD reads should be of the same length + except: + break + goodblock += 1 + if goodblock > 10: + return True + else: + break #we found a non-empty line, but it's not a header + except: + pass + return False + +class QualityScore454 ( data.Text ): + """ + until we know more about quality score formats + """ + file_ext = "qual454" + + def set_peek( self, dataset, line_count=None ): + if not dataset.dataset.purged: + dataset.peek = data.get_file_peek( dataset.file_name ) + if line_count is None: + dataset.blurb = data.nice_size( dataset.get_size() ) + else: + dataset.blurb = "%s lines, 454 Quality score file" % util.commaify( str( line_count ) ) + else: + dataset.peek = 'file does not exist' + dataset.blurb = 'file purged from disk' + + def display_peek(self, dataset): + try: + return dataset.peek + except: + return "454 Quality score file (%s)" % ( data.nice_size( dataset.get_size() ) ) + + def sniff( self, filename ): + """ + >>> fname = get_test_fname( 'sequence.fasta' ) + >>> QualityScore454().sniff( fname ) + False + >>> fname = get_test_fname( 'sequence.qual454' ) + >>> QualityScore454().sniff( fname ) True """ try: @@ -63,3 +128,59 @@ class QualityScore ( data.Text ): except: pass return False + +class QualityScoreSolexa ( data.Text ): + """ + until we know more about quality score formats + """ + file_ext = "qualsolexa" + + def set_peek( self, dataset, line_count=None ): + if not dataset.dataset.purged: + dataset.peek = data.get_file_peek( dataset.file_name ) + if line_count is None: + dataset.blurb = data.nice_size( dataset.get_size() ) + else: + dataset.blurb = "%s lines, Solexa Quality score file" % util.commaify( str( line_count ) ) + else: + dataset.peek = 'file does not exist' + dataset.blurb = 'file purged from disk' + + def display_peek(self, dataset): + try: + return dataset.peek + except: + return "Solexa Quality score file (%s)" % ( data.nice_size( dataset.get_size() ) ) + + def sniff( self, filename ): + """ + >>> fname = get_test_fname( 'sequence.fasta' ) + >>> QualityScoreSolexa().sniff( fname ) + False + >>> fname = get_test_fname( 'sequence.qualsolexa' ) + >>> QualityScoreSolexa().sniff( fname ) + True + """ + try: + fh = open( filename ) + readlen = None + while True: + line = fh.readline() + if not line: + break #EOF + line = line.strip() + if line and not line.startswith( '#' ): + if len(line.split('\t')) > 1: + break + try: + [ int( x ) for x in line.split() ] + if not(readlen): + readlen = len(line.split()) + assert len(line.split()) == readlen #Solexa reads should be of the same length + except: + break + + except: + pass + return False + diff --git a/lib/galaxy/datatypes/registry.py b/lib/galaxy/datatypes/registry.py index 77c74d52832..f9a2b8c4072 100644 --- a/lib/galaxy/datatypes/registry.py +++ b/lib/galaxy/datatypes/registry.py @@ -116,7 +116,9 @@ class Registry( object ): 'laj' : images.Laj(), 'lav' : sequence.Lav(), 'maf' : sequence.Maf(), - 'qual' : qualityscore.QualityScore(), + 'qualsolid' : qualityscore.QualityScoreSOLiD(), + 'qualsolexa' : qualityscore.QualityScoreSolexa(), + 'qual454' : qualityscore.QualityScore454(), 'scf' : images.Scf(), 'tabular' : tabular.Tabular(), 'taxonomy' : tabular.Taxonomy(), @@ -140,7 +142,9 @@ class Registry( object ): 'laj' : 'text/plain', 'lav' : 'text/plain', 'maf' : 'text/plain', - 'qual' : 'text/plain', + 'qualsolid' : 'text/plain', + 'qualsolexa' : 'text/plain', + 'qual454' : 'text/plain', 'scf' : 'application/octet-stream', 'tabular' : 'text/plain', 'taxonomy' : 'text/plain', diff --git a/lib/galaxy/model/migrate/versions/0006_change_qual_datatype.py b/lib/galaxy/model/migrate/versions/0006_change_qual_datatype.py new file mode 100644 index 00000000000..1cba27320a6 --- /dev/null +++ b/lib/galaxy/model/migrate/versions/0006_change_qual_datatype.py @@ -0,0 +1,47 @@ +from sqlalchemy import * +from sqlalchemy.orm import * +from migrate import * +import sys, logging + +log = logging.getLogger( __name__ ) +log.setLevel(logging.DEBUG) +handler = logging.StreamHandler( sys.stdout ) +format = "%(name)s %(levelname)s %(asctime)s %(message)s" +formatter = logging.Formatter( format ) +handler.setFormatter( formatter ) +log.addHandler( handler ) + +metadata = MetaData( migrate_engine ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +HistoryDatasetAssociation_table = Table( "history_dataset_association", metadata, autoload=True ) + +def upgrade(): + # Load existing tables + metadata.reflect() + # Add 2 indexes to the galaxy_user table + i = Index( 'ix_hda_extension', HistoryDatasetAssociation_table.c.extension ) + try: + i.create() + except Exception, e: + log.debug( "Adding index 'ix_hda_extension' to history_dataset_association table failed: %s" % ( str( e ) ) ) + + # Set the default data in the galaxy_user table, but only for null values + cmd = "UPDATE history_dataset_association SET extension = 'qual454' WHERE extension = 'qual' and peek like \'>%%\'" + try: + db_session.execute( cmd ) + except Exception, e: + log.debug( "Resetting extension qual to qual454 in history_dataset_association failed: %s" % ( str( e ) ) ) + cmd = "UPDATE history_dataset_association SET extension = 'qualsolexa' WHERE extension = 'qual' and peek not like \'>%%\'" + try: + db_session.execute( cmd ) + except Exception, e: + log.debug( "Resetting extension qual to qualsolexa in history_dataset_association failed: %s" % ( str( e ) ) ) + # Add 1 index to the history_dataset_association table + try: + i.drop() + except Exception, e: + log.debug( "Dropping index 'ix_hda_extension' to history_dataset_association table failed: %s" % ( str( e ) ) ) + + +def downgrade(): + pass diff --git a/tools/metag_tools/fastqsolexa_to_fasta_qual.xml b/tools/metag_tools/fastqsolexa_to_fasta_qual.xml index 5f1e5cdd9fc..6ea0d6e189d 100644 --- a/tools/metag_tools/fastqsolexa_to_fasta_qual.xml +++ b/tools/metag_tools/fastqsolexa_to_fasta_qual.xml @@ -6,7 +6,7 @@ - + diff --git a/tools/metag_tools/rmapq_wrapper.xml b/tools/metag_tools/rmapq_wrapper.xml index 1447fa70259..2a02ba80c2a 100644 --- a/tools/metag_tools/rmapq_wrapper.xml +++ b/tools/metag_tools/rmapq_wrapper.xml @@ -13,7 +13,7 @@ - + @@ -46,7 +46,7 @@ - + diff --git a/tools/metag_tools/short_reads_figure_high_quality_length.xml b/tools/metag_tools/short_reads_figure_high_quality_length.xml index fba61acb112..d35dfb6588e 100644 --- a/tools/metag_tools/short_reads_figure_high_quality_length.xml +++ b/tools/metag_tools/short_reads_figure_high_quality_length.xml @@ -5,7 +5,7 @@ - + @@ -17,12 +17,12 @@ - + - + diff --git a/tools/metag_tools/short_reads_figure_score.xml b/tools/metag_tools/short_reads_figure_score.xml index fc471689b6a..42f7d4602b3 100644 --- a/tools/metag_tools/short_reads_figure_score.xml +++ b/tools/metag_tools/short_reads_figure_score.xml @@ -5,7 +5,7 @@ - + @@ -17,11 +17,11 @@ - + - + diff --git a/tools/metag_tools/short_reads_trim_seq.xml b/tools/metag_tools/short_reads_trim_seq.xml index 2af57f6ba39..824c022744c 100644 --- a/tools/metag_tools/short_reads_trim_seq.xml +++ b/tools/metag_tools/short_reads_trim_seq.xml @@ -7,7 +7,7 @@ - + @@ -36,7 +36,7 @@ - + @@ -45,7 +45,7 @@ - +