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