mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Fix for 1 line interval files that do not include a commented header. Added default values for chrom, start, end for interval format and enhanced set_meta() so that auto-detect button on edit form will work for interval files.
This commit is contained in:
@@ -41,9 +41,9 @@ class Interval( Tabular ):
|
||||
file_ext = "interval"
|
||||
|
||||
"""Add metadata elements"""
|
||||
MetadataElement( name="chromCol", desc="Chrom column", param=metadata.ColumnParameter )
|
||||
MetadataElement( name="startCol", desc="Start column", param=metadata.ColumnParameter )
|
||||
MetadataElement( name="endCol", desc="End column", param=metadata.ColumnParameter )
|
||||
MetadataElement( name="chromCol", default=1, desc="Chrom column", param=metadata.ColumnParameter )
|
||||
MetadataElement( name="startCol", default=2, desc="Start column", param=metadata.ColumnParameter )
|
||||
MetadataElement( name="endCol", default=3, desc="End column", param=metadata.ColumnParameter )
|
||||
MetadataElement( name="strandCol", desc="Strand column (click box & select)", param=metadata.ColumnParameter, optional=True, no_value=0 )
|
||||
MetadataElement( name="nameCol", desc="Name/Identifier column (click box & select)", param=metadata.ColumnParameter, optional=True, no_value=0 )
|
||||
MetadataElement( name="columns", default=3, desc="Number of columns", readonly=True, visible=False )
|
||||
@@ -59,33 +59,62 @@ class Interval( Tabular ):
|
||||
def set_peek( self, dataset ):
|
||||
"""Set the peek and blurb text"""
|
||||
dataset.peek = data.get_file_peek( dataset.file_name )
|
||||
## dataset.peek = self.make_html_table( dataset.peek )
|
||||
dataset.blurb = util.commaify( str( data.get_line_count( dataset.file_name ) ) ) + " regions"
|
||||
#i don't think set_meta should not be called here, it should be called separately
|
||||
#self.set_meta( dataset )
|
||||
|
||||
def set_meta( self, dataset, first_line_is_header=False ):
|
||||
Tabular.set_meta( self, dataset, 1 )
|
||||
Tabular.set_meta( self, dataset, skip=0 )
|
||||
|
||||
"""Tries to guess from the line the location number of the column for the chromosome, region start-end and strand"""
|
||||
if dataset.has_data():
|
||||
for i, line in enumerate( file(dataset.file_name) ):
|
||||
line = line.rstrip('\r\n')
|
||||
if len(line)>0:
|
||||
if (first_line_is_header or line[0] == '#'):
|
||||
self.init_meta(dataset)
|
||||
line = line.strip("#")
|
||||
elems = line.split("\t")
|
||||
valid = dict(alias_helper) # shrinks
|
||||
for index, col_name in enumerate(elems):
|
||||
for i, line in enumerate( file( dataset.file_name ) ):
|
||||
line = line.rstrip( '\r\n' )
|
||||
if line:
|
||||
if ( first_line_is_header or line[0] == '#' ):
|
||||
self.init_meta( dataset )
|
||||
line = line.strip( '#' )
|
||||
elems = line.split( '\t' )
|
||||
valid = dict( alias_helper ) # shrinks
|
||||
for index, col_name in enumerate( elems ):
|
||||
if col_name in valid:
|
||||
meta_name = valid[col_name]
|
||||
setattr(dataset.metadata, meta_name, index+1)
|
||||
values = alias_spec[meta_name]
|
||||
start = values.index(col_name)
|
||||
for lower in values[start:]:
|
||||
del valid[lower] # removes lower priority keys
|
||||
setattr( dataset.metadata, meta_name, index+1 )
|
||||
values = alias_spec[ meta_name ]
|
||||
start = values.index( col_name )
|
||||
for lower in values[ start: ]:
|
||||
del valid[ lower ] # removes lower priority keys
|
||||
break # Our metadata is set, so break out of the outer loop
|
||||
else:
|
||||
# Header lines in Interval files are optional. For example, BED is Interval but has no header.
|
||||
# We'll make a best guess at the location of the metadata columns.
|
||||
metadata_is_set = False
|
||||
elems = line.split( '\t' )
|
||||
if len( elems ) > 2:
|
||||
for str in data.col1_startswith:
|
||||
if line.lower().startswith( str ):
|
||||
dataset.metadata.chromCol = 1
|
||||
try:
|
||||
int( elems[1] )
|
||||
dataset.metadata.startCol = 2
|
||||
except:
|
||||
pass # Metadata default will be used
|
||||
try:
|
||||
int( elems[2] )
|
||||
dataset.metadata.endCol = 3
|
||||
except:
|
||||
pass # Metadata default will be used
|
||||
if len( elems ) > 3:
|
||||
try:
|
||||
int( elems[3] )
|
||||
except:
|
||||
dataset.metadata.nameCol = 4
|
||||
if len( elems ) < 6:
|
||||
dataset.metadata.strandCol = 0
|
||||
else:
|
||||
dataset.metadata.strandCol = 6
|
||||
metadata_is_set = True
|
||||
break
|
||||
if metadata_is_set:
|
||||
break # Our metadata is set, so break out of the outer loop
|
||||
|
||||
def get_estimated_display_viewport( self, dataset ):
|
||||
"""Return a chrom, start, stop tuple for viewing a file."""
|
||||
@@ -202,7 +231,7 @@ class Interval( Tabular ):
|
||||
so we'll just look for some valid data.
|
||||
"""
|
||||
for hdr in headers:
|
||||
if not (hdr[0] == '' or hdr[0].startswith( '#' )):
|
||||
if hdr and not hdr[0].startswith( '#' ):
|
||||
if len(hdr) < 3:
|
||||
return False
|
||||
try:
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
Classes related to parameter validation.
|
||||
"""
|
||||
|
||||
import re
|
||||
import re, logging
|
||||
from elementtree.ElementTree import XML
|
||||
|
||||
log = logging.getLogger( __name__ )
|
||||
|
||||
class Validator( object ):
|
||||
"""
|
||||
A validator checks that a value meets some conditions OR raises ValueError
|
||||
@@ -146,7 +148,7 @@ class MetadataValidator( Validator ):
|
||||
"""
|
||||
def validate( self, value, history=None ):
|
||||
if value.missing_meta():
|
||||
raise ValueError( "you are missing required metadata" )
|
||||
raise ValueError( "Metadata missing, click the pencil icon in the history item to edit / save the metadata attributes" )
|
||||
|
||||
validator_types = dict( expression=ExpressionValidator,
|
||||
regex=RegexValidator,
|
||||
|
||||
Reference in New Issue
Block a user