diff --git a/lib/galaxy/datatypes/interval.py b/lib/galaxy/datatypes/interval.py index 420da3f148e..ccdea8daa3e 100644 --- a/lib/galaxy/datatypes/interval.py +++ b/lib/galaxy/datatypes/interval.py @@ -330,6 +330,16 @@ class Gff( Tabular ): ret_val.append( (site_name, link) ) return ret_val +class Gff3( Gff ): + """Tab delimited data in Gff3 format""" + + """Add metadata elements""" + MetadataElement( name="column_types", default=['str','str','str','int','int','float','str','int','list'], desc="Column types", readonly=True ) + + def __init__(self, **kwd): + """Initialize datatype, by adding GBrowse display app""" + Gff.__init__(self, **kwd) + class Wiggle( Tabular ): """Tab delimited data in wiggle format""" MetadataElement( name="columns", default=3, desc="Number of columns", readonly=True ) diff --git a/lib/galaxy/datatypes/registry.py b/lib/galaxy/datatypes/registry.py index 91304173555..83ab5c5997c 100644 --- a/lib/galaxy/datatypes/registry.py +++ b/lib/galaxy/datatypes/registry.py @@ -48,6 +48,7 @@ class Registry( object ): 'maf' : sequence.Maf(), 'axt' : sequence.Axt(), 'gff' : interval.Gff(), + 'gff3' : interval.Gff3(), 'wig' : interval.Wiggle(), 'gmaj.zip' : images.Gmaj(), 'laj' : images.Laj(), @@ -69,6 +70,7 @@ class Registry( object ): 'maf' : 'text/plain', 'axt' : 'text/plain', 'gff' : 'text/plain', + 'gff3' : 'text/plain', 'wig' : 'text/plain', 'gmaj.zip' : 'application/zip', 'laj' : 'text/plain', diff --git a/lib/galaxy/datatypes/sniff.py b/lib/galaxy/datatypes/sniff.py index 3eae8e0b172..9ecc72446fa 100644 --- a/lib/galaxy/datatypes/sniff.py +++ b/lib/galaxy/datatypes/sniff.py @@ -599,8 +599,10 @@ def guess_ext(fname): if is_column_based(fname, '\t', 1): headers = get_headers(fname, '\t') - if is_gff(headers) or is_gff3(headers): + if is_gff(headers): return 'gff' + if is_gff3(headers): + return 'gff3' elif is_interval(headers): return 'interval' else: diff --git a/lib/galaxy/datatypes/tabular.py b/lib/galaxy/datatypes/tabular.py index e96e32b4b68..fff31be3f5c 100644 --- a/lib/galaxy/datatypes/tabular.py +++ b/lib/galaxy/datatypes/tabular.py @@ -86,6 +86,26 @@ class Tabular( data.Text ): proceed = True except: pass + elif format == 'gff3': + valid_gff3_strand = ['+', '-', '.', '?'] + valid_start = False + valid_end = False + if elems_len == 9: + try: + start = int(hdr[3]) + valid_start = True + except: + if hdr[3] == '.': + valid_start = True + try: + end = int(hdr[4]) + valid_end = True + except: + if hdr[4] == '.': + valid_end = True + srand = hdr[6] + if valid_start and valid_end and start < end and strand in valid_gff3_strand: + proceed = True elif format=='wig': try: int( elems[0] ) diff --git a/lib/galaxy/util/__init__.py b/lib/galaxy/util/__init__.py index d7eeaa37f00..f65c3a409b0 100644 --- a/lib/galaxy/util/__init__.py +++ b/lib/galaxy/util/__init__.py @@ -70,7 +70,7 @@ mime_types = { text_types = sets.Set([ 'txt', 'text', 'wig', 'genbank', 'motif', 'acedb', 'nexus', 'fitch', 'meganon', 'codata', 'dbmotif', - 'table', 'fasta', 'txt', 'gff', 'pir', 'ig', 'seqtable', 'clustal', 'gcg', 'hennig86', 'excel', 'asn1', + 'table', 'fasta', 'txt', 'gff', 'gff3', 'pir', 'ig', 'seqtable', 'clustal', 'gcg', 'hennig86', 'excel', 'asn1', 'regions', 'simple', 'score', 'text', 'msf', 'selex', 'tagseq', 'embl', 'srspair', 'staden', 'strider', 'xbed', 'markx10', 'pair', 'markx1', 'markx0', 'markx3', 'markx2', 'jackknifer', 'ncbi', 'mega', 'fa', 'feattable', 'phylip', 'diffseq', 'bed', 'srs', 'jackknifernon', 'swiss', diff --git a/tools/data_source/ucsc_filter.py b/tools/data_source/ucsc_filter.py index 4d90db2bc19..4b20080ebeb 100644 --- a/tools/data_source/ucsc_filter.py +++ b/tools/data_source/ucsc_filter.py @@ -22,6 +22,8 @@ def exec_before_job( app, inp_data, out_data, param_dict, tool=None): ext = "maf" elif outputType == 'gff': ext = "gff" + elif outputType == 'gff3': + ext = "gff3" else: if 'hgta_doPrintSelectedFields' in param_dict: ext = "interval" diff --git a/tools/data_source/upload.xml b/tools/data_source/upload.xml index 31d2a64f0c4..b4a01261fb1 100644 --- a/tools/data_source/upload.xml +++ b/tools/data_source/upload.xml @@ -25,6 +25,7 @@ + @@ -112,7 +113,13 @@ A sequence in FASTA format consists of a single-line description, followed by li **Gff** -GFF lines have nine required fields that must be tab-separated. Gff version 3 is also supported. +GFF lines have nine required fields that must be tab-separated. + +----- + +**Gff3** + +The proposed GFF3 format addresses the most common extensions to GFF, while preserving backward compatibility with previous formats. ----- diff --git a/universe_wsgi.ini.sample b/universe_wsgi.ini.sample index 4aabde57b9f..ca2373b91f2 100644 --- a/universe_wsgi.ini.sample +++ b/universe_wsgi.ini.sample @@ -116,6 +116,7 @@ fasta = galaxy.datatypes.sequence:Fasta maf = galaxy.datatypes.sequence:Maf axt = galaxy.datatypes.sequence:Axt gff = galaxy.datatypes.interval:Gff +gff3 = galaxy.datatypes.interval:Gff3 wig = galaxy.datatypes.interval:Wiggle gmaj.zip = galaxy.datatypes.images:Gmaj,application/zip laj = galaxy.datatypes.images:Laj