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 @@
-
+