PEP-8 and pylint fixes.

This commit is contained in:
Nicola Soranzo
2015-06-29 15:19:49 +01:00
parent 71b963b2d0
commit 11e8a6c30a
3 changed files with 89 additions and 94 deletions
+1
View File
@@ -17,6 +17,7 @@ lib/galaxy/queue_worker.py
lib/galaxy/tags
lib/galaxy/tools
lib/galaxy/util/{__init__,json,permutations,plugin_config,properties,simplegraph,sockets,sleeper,streamball,submodules,xml_macros}.py
lib/galaxy/visualization/data_providers/{__init__,genome,registry}.py
lib/galaxy/web/{proxy,security}
lib/galaxy/web/base/{__init__,interactive_environments}.py
lib/galaxy/web/formatting.py
@@ -28,15 +28,17 @@ from galaxy.visualization.data_providers.cigar import get_ref_based_read_seq_and
# Utility functions.
#
def float_nan(n):
'''
Return None instead of NaN to pass jQuery 1.4's strict JSON
'''
if n != n: # NaN != NaN
if n != n: # NaN != NaN
return None
else:
return float(n)
def get_bounds( reads, start_pos_index, end_pos_index ):
'''
Returns the minimum and maximum position for a set of reads.
@@ -50,6 +52,7 @@ def get_bounds( reads, start_pos_index, end_pos_index ):
max_high = read[ end_pos_index ]
return max_low, max_high
def _convert_between_ucsc_and_ensemble_naming( chrom ):
'''
Convert between UCSC chromosome ('chr1') naming conventions and Ensembl
@@ -62,9 +65,11 @@ def _convert_between_ucsc_and_ensemble_naming( chrom ):
# Convert from Ensembl to UCSC
return 'chr' + chrom
def _chrom_naming_matches( chrom1, chrom2 ):
return ( chrom1.startswith( 'chr' ) and chrom2.startswith( 'chr' ) ) or ( not chrom1.startswith( 'chr' ) and not chrom2.startswith( 'chr' ) )
class FeatureLocationIndexDataProvider( BaseDataProvider ):
"""
Reads/writes/queries feature location index (FLI) datasets.
@@ -113,6 +118,7 @@ class FeatureLocationIndexDataProvider( BaseDataProvider ):
textloc_file.close()
return result
class GenomeDataProvider( BaseDataProvider ):
"""
Base class for genome data providers. All genome providers use BED coordinate
@@ -152,7 +158,7 @@ class GenomeDataProvider( BaseDataProvider ):
"""
Returns chroms/contigs that the dataset contains
"""
return None # by default
return None # by default
def has_data( self, chrom, start, end, **kwargs ):
"""
@@ -210,7 +216,6 @@ class GenomeDataProvider( BaseDataProvider ):
'dataset_type': self.dataset_type
}
def get_filters( self ):
"""
Returns filters for provider's data. Return value is a list of
@@ -224,7 +229,7 @@ class GenomeDataProvider( BaseDataProvider ):
except AttributeError:
try:
column_names = range( self.original_dataset.metadata.columns )
except: # Give up
except: # Give up
return []
# Dataset must have column types; if not, cannot create filters.
@@ -240,7 +245,7 @@ class GenomeDataProvider( BaseDataProvider ):
# Some columns are optional, so can't assume that a filter
# column is in dataset.
if viz_col_index >= len( column_names ):
continue;
continue
col_name = column_names[ viz_col_index ]
# Make sure that column has a mapped index. If not, do not add filter.
try:
@@ -248,7 +253,7 @@ class GenomeDataProvider( BaseDataProvider ):
except KeyError:
continue
filters.append(
{ 'name' : attrs[ 'name' ], 'type' : column_types[viz_col_index], \
{ 'name' : attrs[ 'name' ], 'type' : column_types[viz_col_index],
'index' : attrs[ 'index' ] } )
return filters
@@ -259,6 +264,7 @@ class GenomeDataProvider( BaseDataProvider ):
# -- Base mixins and providers --
#
class FilterableMixin:
def get_filters( self ):
""" Returns a dataset's filters. """
@@ -270,13 +276,14 @@ class FilterableMixin:
return True
except:
return False
def is_float( column_text ):
try:
float( column_text )
return True
except:
if column_text.strip().lower() == 'na':
return True #na is special cased to be a float
return True # na is special cased to be a float
return False
#
@@ -307,27 +314,6 @@ class FilterableMixin:
'tool_id': 'gff_filter_by_attribute',
'tool_exp_name': name } )
filter_col += 1
'''
# Old code: use first line in dataset to find attributes.
for i, line in enumerate( open(self.original_dataset.file_name) ):
if not line.startswith('#'):
# Look at first line for attributes and types.
attributes = parse_gff_attributes( line.split('\t')[8] )
for attr, value in attributes.items():
# Get attribute type.
if is_int( value ):
attr_type = 'int'
elif is_float( value ):
attr_type = 'float'
else:
attr_type = 'str'
# Add to filters.
if attr_type is not 'str':
filters.append( { 'name': attr, 'type': attr_type, 'index': filter_col } )
filter_col += 1
break
'''
elif isinstance( self.original_dataset.datatype, Bed ):
# Can filter by score column only.
filters = [ { 'name': 'Score',
@@ -335,7 +321,7 @@ class FilterableMixin:
'index': filter_col,
'tool_id': 'Filter1',
'tool_exp_name': 'c5'
} ]
} ]
return filters
@@ -351,8 +337,8 @@ class TabixDataProvider( FilterableMixin, GenomeDataProvider ):
def get_iterator( self, chrom, start, end, **kwargs ):
start, end = int(start), int(end)
if end >= (2<<29):
end = (2<<29 - 1) # Tabix-enforced maximum
if end >= (2 << 29):
end = (2 << 29 - 1) # Tabix-enforced maximum
bgzip_fname = self.dependencies['bgzip'].file_name
@@ -371,7 +357,6 @@ class TabixDataProvider( FilterableMixin, GenomeDataProvider ):
return iterator
def write_data_to_file( self, regions, filename ):
out = open( filename, "w" )
@@ -390,6 +375,7 @@ class TabixDataProvider( FilterableMixin, GenomeDataProvider ):
# -- Interval data providers --
#
class IntervalDataProvider( GenomeDataProvider ):
dataset_type = 'interval_index'
@@ -415,8 +401,11 @@ class IntervalDataProvider( GenomeDataProvider ):
no_detail = ( "no_detail" in kwargs )
rval = []
message = None
# Subtract one b/c columns are 1-based but indices are 0-based.
col_fn = lambda col: None if col is None else col - 1
def col_fn(col):
return None if col is None else col - 1
start_col = self.original_dataset.metadata.startCol - 1
end_col = self.original_dataset.metadata.endCol - 1
strand_col = col_fn( self.original_dataset.metadata.strandCol )
@@ -424,14 +413,14 @@ class IntervalDataProvider( GenomeDataProvider ):
for count, line in enumerate( iterator ):
if count < start_val:
continue
if max_vals and count-start_val >= max_vals:
if max_vals and count - start_val >= max_vals:
message = self.error_max_vals % ( max_vals, "features" )
break
feature = line.split()
length = len(feature)
# Unique id is just a hash of the line
payload = [ hash(line), int( feature[start_col] ), int( feature [end_col] ) ]
payload = [ hash(line), int( feature[start_col] ), int( feature[end_col] ) ]
if no_detail:
rval.append( payload )
@@ -442,7 +431,8 @@ class IntervalDataProvider( GenomeDataProvider ):
payload.append( feature[name_col] )
if strand_col:
# Put empty name as placeholder.
if not name_col: payload.append( "" )
if not name_col:
payload.append( "" )
payload.append( feature[strand_col] )
# Score (filter data)
@@ -459,6 +449,7 @@ class IntervalDataProvider( GenomeDataProvider ):
def write_data_to_file( self, regions, filename ):
raise Exception( "Unimplemented Function" )
class IntervalTabixDataProvider( TabixDataProvider, IntervalDataProvider ):
"""
Provides data from a BED file indexed via tabix.
@@ -499,7 +490,7 @@ class BedDataProvider( GenomeDataProvider ):
for count, line in enumerate( iterator ):
if count < start_val:
continue
if max_vals and count-start_val >= max_vals:
if max_vals and count - start_val >= max_vals:
message = self.error_max_vals % ( max_vals, "features" )
break
# TODO: can we use column metadata to fill out payload?
@@ -560,12 +551,14 @@ class BedDataProvider( GenomeDataProvider ):
out.close()
class BedTabixDataProvider( TabixDataProvider, BedDataProvider ):
"""
Provides data from a BED file indexed via tabix.
"""
pass
class RawBedDataProvider( BedDataProvider ):
"""
Provide data from BED file.
@@ -592,8 +585,8 @@ class RawBedDataProvider( BedDataProvider ):
feature_start = int( feature[1] )
feature_end = int( feature[2] )
if ( chrom is not None and feature_chrom != chrom ) \
or ( start is not None and feature_start > end ) \
or ( end is not None and feature_end < start ):
or ( start is not None and feature_start > end ) \
or ( end is not None and feature_end < start ):
continue
yield line
@@ -603,6 +596,7 @@ class RawBedDataProvider( BedDataProvider ):
# -- VCF data providers --
#
class VcfDataProvider( GenomeDataProvider ):
"""
Abstract class that processes VCF data from native format to payload format.
@@ -671,7 +665,7 @@ class VcfDataProvider( GenomeDataProvider ):
for count, line in enumerate( iterator ):
if count < start_val:
continue
if max_vals and count-start_val >= max_vals:
if max_vals and count - start_val >= max_vals:
message = self.error_max_vals % ( max_vals, "features" )
break
@@ -680,11 +674,9 @@ class VcfDataProvider( GenomeDataProvider ):
pos, c_id, ref, alt, qual, c_filter, info = feature[ 1:8 ]
# Format and samples data are optional.
format = None
samples_data = []
if len( feature ) > 8:
format = feature[ 8 ]
samples_data = feature [ 9: ]
samples_data = feature[ 9: ]
# VCF is 1-based but provided position is 0-based.
pos = int( pos ) - 1
@@ -695,7 +687,7 @@ class VcfDataProvider( GenomeDataProvider ):
continue
# Set up array to track allele counts.
allele_counts = [ 0 for i in range ( alt.count( ',' ) + 1 ) ]
allele_counts = [ 0 for i in range( alt.count( ',' ) + 1 ) ]
sample_gts = []
if samples_data:
@@ -730,7 +722,7 @@ class VcfDataProvider( GenomeDataProvider ):
# No samples, so set allele count and sample genotype manually.
allele_counts = [ 1 ]
sample_gts = [ '1/1' ]
# Add locus data.
locus_data = [
-1,
@@ -760,6 +752,7 @@ class VcfDataProvider( GenomeDataProvider ):
out.write( "%s\n" % line )
out.close()
class VcfTabixDataProvider( TabixDataProvider, VcfDataProvider ):
"""
Provides data from a VCF file indexed via tabix.
@@ -767,6 +760,7 @@ class VcfTabixDataProvider( TabixDataProvider, VcfDataProvider ):
dataset_type = 'variant'
class RawVcfDataProvider( VcfDataProvider ):
"""
Provide data from VCF file.
@@ -779,13 +773,10 @@ class RawVcfDataProvider( VcfDataProvider ):
source = open( self.original_dataset.file_name )
# Skip comments.
pos = 0
line = None
for line in source:
if not line.startswith("#"):
break
else:
pos = source.tell()
# If last line is a comment, there are no data lines.
if line.startswith( "#" ):
@@ -817,6 +808,7 @@ class RawVcfDataProvider( VcfDataProvider ):
return line_filter_iter()
class BamDataProvider( GenomeDataProvider, FilterableMixin ):
"""
Provides access to intervals from a sorted indexed BAM file. Coordinate
@@ -834,18 +826,17 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
filters = []
filters.append( { 'name': 'Mapping Quality',
'type': 'number',
'index': filter_col
} )
'index': filter_col }
)
return filters
def write_data_to_file( self, regions, filename ):
"""
Write reads in regions to file.
"""
# Open current BAM file using index.
bamfile = csamtools.Samfile( filename=self.original_dataset.file_name, mode='rb', \
bamfile = csamtools.Samfile( filename=self.original_dataset.file_name, mode='rb',
index_filename=self.converted_dataset.file_name )
# TODO: write headers as well?
@@ -859,7 +850,7 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
try:
data = bamfile.fetch(start=start, end=end, reference=chrom)
except ValueError, e:
except ValueError:
# Try alternative chrom naming.
chrom = _convert_between_ucsc_and_ensemble_naming( chrom )
try:
@@ -887,7 +878,7 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
bamfile = csamtools.Samfile( filename=orig_data_filename, mode='rb', index_filename=index_filename )
try:
data = bamfile.fetch( start=start, end=end, reference=chrom )
except ValueError, e:
except ValueError:
# Try alternative chrom naming.
chrom = _convert_between_ucsc_and_ensemble_naming( chrom )
try:
@@ -895,9 +886,8 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
except ValueError:
return None
return data
def process_data( self, iterator, start_val=0, max_vals=None, ref_seq=None,
def process_data( self, iterator, start_val=0, max_vals=None, ref_seq=None,
iterator_type='nth', mean_depth=None, start=0, end=0, **kwargs ):
"""
Returns a dict with the following attributes::
@@ -932,7 +922,7 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
def decode_strand( read_flag, mask ):
""" Decode strand from read flag. """
strand_flag = ( read_flag & mask == 0 )
if strand_flag:
return "+"
@@ -956,16 +946,9 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
"""
# Convert threshold to N for stepping through iterator.
n = int( 1/threshold )
n = int( 1 / threshold )
return itertools.islice( read_iterator, None, None, n )
# Alternatate and much slower implementation that looks for pending pairs.
'''
for i, e in enumerate( read_iterator ):
if e.qname in paired_pending or ( i % n ) == 0:
yield e
'''
# -- Choose iterator. --
# Calculate threshold for non-sequential iterators based on mean_depth and read length.
@@ -976,8 +959,8 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
return { 'data': [], 'message': None, 'max_low': start, 'max_high': start }
read_len = len( first_read.seq )
num_reads = max( ( end - start ) * mean_depth / float ( read_len ), 1 )
threshold = float( max_vals )/ num_reads
num_reads = max( ( end - start ) * mean_depth / float( read_len ), 1 )
threshold = float( max_vals ) / num_reads
iterator = itertools.chain( iter( [ first_read ] ), iterator )
# Use specified iterator type, save for when threshold is >= 1.
@@ -1015,9 +998,9 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
seq = read.seq
strand = decode_strand( read.flag, 0x0010 )
if read.cigar is not None:
read_len = sum( [cig[1] for cig in read.cigar] ) # Use cigar to determine length
read_len = sum( [cig[1] for cig in read.cigar] ) # Use cigar to determine length
else:
read_len = len(seq) # If no cigar, just use sequence length
read_len = len(seq) # If no cigar, just use sequence length
if read.is_proper_pair:
if qname in paired_pending:
@@ -1030,7 +1013,7 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
[ pair['start'], pair['end'], pair['cigar'], pair['strand'], pair['seq'] ],
[ read.pos, read.pos + read_len, read.cigar, strand, seq ],
None, [ pair['mapq'], read.mapq ]
] )
] )
del paired_pending[qname]
else:
# Insert first of pair.
@@ -1042,7 +1025,7 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
read.pos, read.pos + read_len, qname,
read.cigar, strand, read.seq, read.mapq ] )
count += 1
# Take care of reads whose mates are out of range.
for qname, read in paired_pending.iteritems():
if read['mate_start'] < read['start']:
@@ -1089,7 +1072,7 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
read_cigar += '%i%s' % ( op_tuple[1], cigar_ops[ op_tuple[0] ] )
read[ cigar_field ] = read_cigar
# Choose method for processing reads. Use reference-based compression
# Choose method for processing reads. Use reference-based compression
# if possible. Otherwise, convert cigar.
if ref_seq:
# Uppercase for easy comparison.
@@ -1114,6 +1097,7 @@ class BamDataProvider( GenomeDataProvider, FilterableMixin ):
return { 'data': results, 'message': message, 'max_low': max_low, 'max_high': max_high }
class SamDataProvider( BamDataProvider ):
dataset_type = 'bai'
@@ -1130,6 +1114,7 @@ class SamDataProvider( BamDataProvider ):
self.original_dataset = converted_dataset
self.converted_dataset = converted_dataset.metadata.bam_index
class BBIDataProvider( GenomeDataProvider ):
"""
BBI data provider for the Galaxy track browser.
@@ -1144,7 +1129,7 @@ class BBIDataProvider( GenomeDataProvider ):
def has_data( self, chrom ):
f, bbi = self._get_dataset()
all_dat = bbi.query( chrom, 0, 2147483647, 1 ) or \
bbi.query( _convert_between_ucsc_and_ensemble_naming( chrom ), 0, 2147483647, 1 )
bbi.query( _convert_between_ucsc_and_ensemble_naming( chrom ), 0, 2147483647, 1 )
f.close()
return all_dat is not None
@@ -1156,7 +1141,7 @@ class BBIDataProvider( GenomeDataProvider ):
# naming convention.
def _summarize_bbi( bbi, chrom, start, end, num_points ):
return bbi.summarize( chrom, start, end, num_points ) or \
bbi.summarize( _convert_between_ucsc_and_ensemble_naming( chrom ) , start, end, num_points )
bbi.summarize( _convert_between_ucsc_and_ensemble_naming( chrom ) , start, end, num_points )
# Bigwig can be a standalone bigwig file, in which case we use
# original_dataset, or coming from wig->bigwig conversion in
@@ -1203,12 +1188,12 @@ class BBIDataProvider( GenomeDataProvider ):
# of interval length.
summary = _summarize_bbi( bbi, chrom, start, end, num_points )
if summary:
#mean = summary.sum_data / summary.valid_count
# mean = summary.sum_data / summary.valid_count
## Standard deviation by bin, not yet used
## var = summary.sum_squares - mean
## var /= minimum( valid_count - 1, 1 )
## sd = sqrt( var )
# Standard deviation by bin, not yet used
# var = summary.sum_squares - mean
# var /= minimum( valid_count - 1, 1 )
# sd = sqrt( var )
pos = start
step_size = (end - start) / num_points
@@ -1259,12 +1244,14 @@ class BBIDataProvider( GenomeDataProvider ):
'dataset_type': self.dataset_type
}
class BigBedDataProvider( BBIDataProvider ):
def _get_dataset( self ):
# Nothing converts to bigBed so we don't consider converted dataset
f = open( self.original_dataset.file_name )
return f, BigBedFile(file=f)
class BigWigDataProvider ( BBIDataProvider ):
"""
Provides data from BigWig files; position data is reported in 1-based
@@ -1277,6 +1264,7 @@ class BigWigDataProvider ( BBIDataProvider ):
f = open( self.original_dataset.file_name )
return f, BigWigFile(file=f)
class IntervalIndexDataProvider( FilterableMixin, GenomeDataProvider ):
"""
Interval index files used for GFF, Pileup files.
@@ -1317,7 +1305,6 @@ class IntervalIndexDataProvider( FilterableMixin, GenomeDataProvider ):
provides data in the region chrom:start-end
"""
start, end = int(start), int(end)
source = open( self.original_dataset.file_name )
index = Indexes( self.converted_dataset.file_name )
if chrom not in index.indexes:
@@ -1341,10 +1328,10 @@ class IntervalIndexDataProvider( FilterableMixin, GenomeDataProvider ):
filter_cols = loads( kwargs.get( "filter_cols", "[]" ) )
no_detail = ( "no_detail" in kwargs )
for count, val in enumerate( iterator ):
start, end, offset = val[0], val[1], val[2]
offset = val[2]
if count < start_val:
continue
if count-start_val >= max_vals:
if count - start_val >= max_vals:
message = self.error_max_vals % ( max_vals, "features" )
break
source.seek( offset )
@@ -1360,6 +1347,7 @@ class IntervalIndexDataProvider( FilterableMixin, GenomeDataProvider ):
return { 'data': results, 'message': message }
class RawGFFDataProvider( GenomeDataProvider ):
"""
Provide data from GFF file that has not been indexed.
@@ -1414,7 +1402,7 @@ class RawGFFDataProvider( GenomeDataProvider ):
for count, ( feature, offset ) in enumerate( iterator ):
if count < start_val:
continue
if count-start_val >= max_vals:
if count - start_val >= max_vals:
message = self.error_max_vals % ( max_vals, "reads" )
break
@@ -1422,9 +1410,9 @@ class RawGFFDataProvider( GenomeDataProvider ):
payload.insert( 0, offset )
results.append( payload )
return { 'data': results, 'dataset_type': self.dataset_type, 'message': message }
class GtfTabixDataProvider( TabixDataProvider ):
"""
Returns data from GTF datasets that are indexed via tabix.
@@ -1456,7 +1444,7 @@ class GtfTabixDataProvider( TabixDataProvider ):
for count, intervals in enumerate( features.values() ):
if count < start_val:
continue
if count-start_val >= max_vals:
if count - start_val >= max_vals:
message = self.error_max_vals % ( max_vals, "reads" )
break
@@ -1471,6 +1459,7 @@ class GtfTabixDataProvider( TabixDataProvider ):
# -- ENCODE Peak data providers.
#
class ENCODEPeakDataProvider( GenomeDataProvider ):
"""
Abstract class that processes ENCODEPeak data from native format to payload format.
@@ -1486,7 +1475,7 @@ class ENCODEPeakDataProvider( GenomeDataProvider ):
Provides
"""
## FIXMEs:
# FIXMEs:
# (1) should be able to unify some of this code with BedDataProvider.process_data
# (2) are optional number of parameters supported?
@@ -1502,12 +1491,11 @@ class ENCODEPeakDataProvider( GenomeDataProvider ):
for count, line in enumerate( iterator ):
if count < start_val:
continue
if max_vals and count-start_val >= max_vals:
if max_vals and count - start_val >= max_vals:
message = self.error_max_vals % ( max_vals, "features" )
break
feature = line.split()
length = len( feature )
# Feature initialization.
payload = [
@@ -1516,7 +1504,7 @@ class ENCODEPeakDataProvider( GenomeDataProvider ):
# Add start, end.
int( feature[1] ),
int( feature[2] )
]
]
if no_detail:
rval.append( payload )
@@ -1537,12 +1525,13 @@ class ENCODEPeakDataProvider( GenomeDataProvider ):
float( feature[6] ),
float( feature[7] ),
float( feature[8] )
] )
] )
rval.append( payload )
return { 'data': rval, 'message': message }
class ENCODEPeakTabixDataProvider( TabixDataProvider, ENCODEPeakDataProvider ):
"""
Provides data from an ENCODEPeak dataset indexed via tabix.
@@ -1583,6 +1572,8 @@ class ENCODEPeakTabixDataProvider( TabixDataProvider, ENCODEPeakDataProvider ):
#
# -- ChromatinInteraction data providers --
#
class ChromatinInteractionsDataProvider( GenomeDataProvider ):
def process_data( self, iterator, start_val=0, max_vals=None, **kwargs ):
"""
@@ -1594,12 +1585,11 @@ class ChromatinInteractionsDataProvider( GenomeDataProvider ):
for count, line in enumerate( iterator ):
if count < start_val:
continue
if max_vals and count-start_val >= max_vals:
if max_vals and count - start_val >= max_vals:
message = self.error_max_vals % ( max_vals, "interactions" )
break
feature = line.split()
length = len( feature )
s1 = int( feature[1] )
e1 = int( feature[2] )
@@ -1621,7 +1611,8 @@ class ChromatinInteractionsDataProvider( GenomeDataProvider ):
return { 'data': rval, 'message': message }
def get_default_max_vals( self ):
return 100000;
return 100000
class ChromatinInteractionsTabixDataProvider( TabixDataProvider, ChromatinInteractionsDataProvider ):
def get_iterator( self, chrom, start=0, end=sys.maxint, interchromosomal=False, **kwargs ):
@@ -1629,7 +1620,8 @@ class ChromatinInteractionsTabixDataProvider( TabixDataProvider, ChromatinIntera
"""
# Modify start as needed to get earlier interactions with start region.
span = int( end ) - int( start )
filter_start = max( 0, int( start ) - span - span/2 )
filter_start = max( 0, int( start ) - span - span / 2 )
def filter( iter ):
for line in iter:
feature = line.split()
@@ -1650,6 +1642,7 @@ class ChromatinInteractionsTabixDataProvider( TabixDataProvider, ChromatinIntera
# -- Helper methods. --
#
def package_gff_feature( feature, no_detail=False, filter_cols=[] ):
""" Package a GFF feature in an array for data providers. """
feature = convert_gff_coords_to_bed( feature )
@@ -7,6 +7,7 @@ from galaxy.datatypes.interval import Interval, ENCODEPeak, ChromatinInteraction
from galaxy.datatypes.xml import Phyloxml
from galaxy.datatypes.data import Newick, Nexus
class DataProviderRegistry( object ):
"""
Registry for data providers that enables listing and lookup.