mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
@@ -8,6 +8,7 @@ from galaxy.exceptions import ActionInputError
|
||||
|
||||
log = logging.getLogger( __name__ )
|
||||
|
||||
|
||||
class AdminActions( object ):
|
||||
"""
|
||||
Mixin for controllers that provide administrative functionality.
|
||||
@@ -22,7 +23,7 @@ class AdminActions( object ):
|
||||
create_amount = False
|
||||
if not params.name or not params.description:
|
||||
raise ActionInputError( "Enter a valid name and a description." )
|
||||
elif self.sa_session.query( self.app.model.Quota ).filter( self.app.model.Quota.table.c.name==params.name ).first():
|
||||
elif self.sa_session.query( self.app.model.Quota ).filter( self.app.model.Quota.table.c.name == params.name ).first():
|
||||
raise ActionInputError( "Quota names must be unique and a quota with that name already exists, so choose another name." )
|
||||
elif not params.get( 'amount', None ):
|
||||
raise ActionInputError( "Enter a valid quota amount." )
|
||||
@@ -60,7 +61,7 @@ class AdminActions( object ):
|
||||
def _rename_quota( self, quota, params ):
|
||||
if not params.name:
|
||||
raise ActionInputError( 'Enter a valid name' )
|
||||
elif params.name != quota.name and self.sa_session.query( self.app.model.Quota ).filter( self.app.model.Quota.table.c.name==params.name ).first():
|
||||
elif params.name != quota.name and self.sa_session.query( self.app.model.Quota ).filter( self.app.model.Quota.table.c.name == params.name ).first():
|
||||
raise ActionInputError( 'A quota with that name already exists' )
|
||||
else:
|
||||
old_name = quota.name
|
||||
@@ -150,7 +151,7 @@ class AdminActions( object ):
|
||||
message += ', '.join( names )
|
||||
return message
|
||||
|
||||
def _undelete_quota( self, quota, params = None):
|
||||
def _undelete_quota( self, quota, params=None):
|
||||
quotas = util.listify( quota )
|
||||
names = []
|
||||
for q in quotas:
|
||||
@@ -197,4 +198,3 @@ class AdminActions( object ):
|
||||
self.sa_session.flush()
|
||||
message += ', '.join( names )
|
||||
return message
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ from galaxy.datatypes.metadata import MetadataElement
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Amos( data.Text ):
|
||||
"""Class describing the AMOS assembly file """
|
||||
edam_format = "format_2561"
|
||||
@@ -53,17 +54,18 @@ class Amos( data.Text ):
|
||||
while not isAmos:
|
||||
line = fh.readline()
|
||||
if not line:
|
||||
break #EOF
|
||||
break # EOF
|
||||
line = line.strip()
|
||||
if line: #first non-empty line
|
||||
if line: # first non-empty line
|
||||
if line.startswith( '{' ):
|
||||
if re.match(r'{(RED|CTG|TLE)$',line):
|
||||
if re.match(r'{(RED|CTG|TLE)$', line):
|
||||
isAmos = True
|
||||
fh.close()
|
||||
except:
|
||||
pass
|
||||
return isAmos
|
||||
|
||||
|
||||
class Sequences( sequence.Fasta ):
|
||||
"""Class describing the Sequences file generated by velveth """
|
||||
|
||||
@@ -83,24 +85,25 @@ class Sequences( sequence.Fasta ):
|
||||
while True:
|
||||
line = fh.readline()
|
||||
if not line:
|
||||
break #EOF
|
||||
break # EOF
|
||||
line = line.strip()
|
||||
if line: #first non-empty line
|
||||
if line: # first non-empty line
|
||||
if line.startswith( '>' ):
|
||||
if not re.match(r'>[^\t]+\t\d+\t\d+$',line):
|
||||
if not re.match(r'>[^\t]+\t\d+\t\d+$', line):
|
||||
break
|
||||
#The next line.strip() must not be '', nor startwith '>'
|
||||
# The next line.strip() must not be '', nor startwith '>'
|
||||
line = fh.readline().strip()
|
||||
if line == '' or line.startswith( '>' ):
|
||||
break
|
||||
return True
|
||||
else:
|
||||
break #we found a non-empty line, but it's not a fasta header
|
||||
break # we found a non-empty line, but it's not a fasta header
|
||||
fh.close()
|
||||
except:
|
||||
pass
|
||||
return False
|
||||
|
||||
|
||||
class Roadmaps( data.Text ):
|
||||
"""Class describing the Sequences file generated by velveth """
|
||||
edam_format = "format_2561"
|
||||
@@ -119,23 +122,24 @@ class Roadmaps( data.Text ):
|
||||
while True:
|
||||
line = fh.readline()
|
||||
if not line:
|
||||
break #EOF
|
||||
break # EOF
|
||||
line = line.strip()
|
||||
if line: #first non-empty line
|
||||
if not re.match(r'\d+\t\d+\t\d+$',line):
|
||||
if line: # first non-empty line
|
||||
if not re.match(r'\d+\t\d+\t\d+$', line):
|
||||
break
|
||||
#The next line.strip() should be 'ROADMAP 1'
|
||||
# The next line.strip() should be 'ROADMAP 1'
|
||||
line = fh.readline().strip()
|
||||
if not re.match(r'ROADMAP \d+$',line):
|
||||
if not re.match(r'ROADMAP \d+$', line):
|
||||
break
|
||||
return True
|
||||
else:
|
||||
break #we found a non-empty line, but it's not a fasta header
|
||||
break # we found a non-empty line, but it's not a fasta header
|
||||
fh.close()
|
||||
except:
|
||||
pass
|
||||
return False
|
||||
|
||||
|
||||
class Velvet( Html ):
|
||||
MetadataElement( name="base_name", desc="base name for velveth dataset", default="velvet", readonly=True, set_in_upload=True)
|
||||
MetadataElement( name="paired_end_reads", desc="has paired-end reads", default="False", readonly=False, set_in_upload=True)
|
||||
@@ -147,17 +151,17 @@ class Velvet( Html ):
|
||||
|
||||
def __init__( self, **kwd ):
|
||||
Html.__init__( self, **kwd )
|
||||
self.add_composite_file( 'Sequences', mimetype = 'text/html', description = 'Sequences', substitute_name_with_metadata = None, is_binary = False )
|
||||
self.add_composite_file( 'Roadmaps', mimetype = 'text/html', description = 'Roadmaps', substitute_name_with_metadata = None, is_binary = False )
|
||||
self.add_composite_file( 'Log', mimetype = 'text/html', description = 'Log', optional = 'True', substitute_name_with_metadata = None, is_binary = False )
|
||||
self.add_composite_file( 'Sequences', mimetype='text/html', description='Sequences', substitute_name_with_metadata=None, is_binary=False )
|
||||
self.add_composite_file( 'Roadmaps', mimetype='text/html', description='Roadmaps', substitute_name_with_metadata=None, is_binary=False )
|
||||
self.add_composite_file( 'Log', mimetype='text/html', description='Log', optional='True', substitute_name_with_metadata=None, is_binary=False )
|
||||
|
||||
def generate_primary_file( self, dataset = None ):
|
||||
log.debug( "Velvet log info %s %s" % ('JJ generate_primary_file',dataset))
|
||||
def generate_primary_file( self, dataset=None ):
|
||||
log.debug( "Velvet log info %s %s" % ('JJ generate_primary_file', dataset))
|
||||
rval = ['<html><head><title>Velvet Galaxy Composite Dataset </title></head><p/>']
|
||||
rval.append('<div>This composite dataset is composed of the following files:<p/><ul>')
|
||||
for composite_name, composite_file in self.get_composite_files( dataset = dataset ).iteritems():
|
||||
for composite_name, composite_file in self.get_composite_files( dataset=dataset ).iteritems():
|
||||
fn = composite_name
|
||||
log.debug( "Velvet log info %s %s %s" % ('JJ generate_primary_file',fn,composite_file))
|
||||
log.debug( "Velvet log info %s %s %s" % ('JJ generate_primary_file', fn, composite_file))
|
||||
opt_text = ''
|
||||
if composite_file.optional:
|
||||
opt_text = ' (optional)'
|
||||
@@ -168,7 +172,7 @@ class Velvet( Html ):
|
||||
rval.append( '</ul></div></html>' )
|
||||
return "\n".join( rval )
|
||||
|
||||
def regenerate_primary_file(self,dataset):
|
||||
def regenerate_primary_file(self, dataset):
|
||||
"""
|
||||
cannot do this until we are setting metadata
|
||||
"""
|
||||
@@ -176,23 +180,23 @@ class Velvet( Html ):
|
||||
gen_msg = ''
|
||||
try:
|
||||
efp = dataset.extra_files_path
|
||||
log_path = os.path.join(efp,'Log')
|
||||
f = open(log_path,'r')
|
||||
log_path = os.path.join(efp, 'Log')
|
||||
f = open(log_path, 'r')
|
||||
log_content = f.read(1000)
|
||||
f.close()
|
||||
log_msg = re.sub('/\S*/','',log_content)
|
||||
log_msg = re.sub('/\S*/', '', log_content)
|
||||
log.debug( "Velveth log info %s" % log_msg)
|
||||
paired_end_reads = re.search('-(short|long)Paired', log_msg) != None
|
||||
paired_end_reads = re.search('-(short|long)Paired', log_msg) is not None
|
||||
dataset.metadata.paired_end_reads = paired_end_reads
|
||||
long_reads = re.search('-long', log_msg) != None
|
||||
long_reads = re.search('-long', log_msg) is not None
|
||||
dataset.metadata.long_reads = long_reads
|
||||
short2_reads = re.search('-short(Paired)?2', log_msg) != None
|
||||
short2_reads = re.search('-short(Paired)?2', log_msg) is not None
|
||||
dataset.metadata.short2_reads = short2_reads
|
||||
dataset.info = re.sub('.*velveth \S+','hash_length',re.sub('\n',' ',log_msg))
|
||||
dataset.info = re.sub('.*velveth \S+', 'hash_length', re.sub('\n', ' ', log_msg))
|
||||
if paired_end_reads:
|
||||
gen_msg = gen_msg + ' Paired-End Reads'
|
||||
gen_msg = gen_msg + ' Paired-End Reads'
|
||||
if long_reads:
|
||||
gen_msg = gen_msg + ' Long Reads'
|
||||
gen_msg = gen_msg + ' Long Reads'
|
||||
if len(gen_msg) > 0:
|
||||
gen_msg = 'Uses: ' + gen_msg
|
||||
except:
|
||||
@@ -200,12 +204,12 @@ class Velvet( Html ):
|
||||
log.debug( "Velveth log info %s" % gen_msg)
|
||||
rval = ['<html><head><title>Velvet Galaxy Composite Dataset </title></head><p/>']
|
||||
# rval.append('<div>Generated:<p/><code> %s </code></div>' %(re.sub('\n','<br>',log_msg)))
|
||||
rval.append('<div>Generated:<p/> %s </div>' %(gen_msg))
|
||||
rval.append('<div>Generated:<p/> %s </div>' % (gen_msg))
|
||||
rval.append('<div>Velveth dataset:<p/><ul>')
|
||||
for composite_name, composite_file in self.get_composite_files( dataset = dataset ).iteritems():
|
||||
for composite_name, composite_file in self.get_composite_files( dataset=dataset ).iteritems():
|
||||
fn = composite_name
|
||||
log.debug( "Velvet log info %s %s %s" % ('JJ regenerate_primary_file',fn,composite_file))
|
||||
if re.search('Log',fn) == None:
|
||||
log.debug( "Velvet log info %s %s %s" % ('JJ regenerate_primary_file', fn, composite_file))
|
||||
if re.search('Log', fn) is None:
|
||||
opt_text = ''
|
||||
if composite_file.optional:
|
||||
opt_text = ' (optional)'
|
||||
@@ -214,7 +218,7 @@ class Velvet( Html ):
|
||||
else:
|
||||
rval.append( '<li><a href="%s" type="text/plain">%s</a>%s</li>' % ( fn, fn, opt_text ) )
|
||||
rval.append( '</ul></div></html>' )
|
||||
f = file(dataset.file_name,'w')
|
||||
f = file(dataset.file_name, 'w')
|
||||
f.write("\n".join( rval ))
|
||||
f.write('\n')
|
||||
f.close()
|
||||
|
||||
@@ -11,7 +11,6 @@ import shutil
|
||||
import struct
|
||||
import subprocess
|
||||
import tempfile
|
||||
import re
|
||||
import warnings
|
||||
import zipfile
|
||||
|
||||
@@ -35,6 +34,7 @@ log = logging.getLogger(__name__)
|
||||
|
||||
# Currently these supported binary data types must be manually set on upload
|
||||
|
||||
|
||||
class Binary( data.Data ):
|
||||
"""Binary data"""
|
||||
edam_format = "format_2333"
|
||||
@@ -89,7 +89,7 @@ class Binary( data.Data ):
|
||||
to_ext = dataset.extension
|
||||
valid_chars = '.,^_-()[]0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
fname = ''.join(c in valid_chars and c or '_' for c in dataset.name)[0:150]
|
||||
trans.response.set_content_type( "application/octet-stream" ) #force octet-stream so Safari doesn't append mime extensions to filename
|
||||
trans.response.set_content_type( "application/octet-stream" ) # force octet-stream so Safari doesn't append mime extensions to filename
|
||||
trans.response.headers["Content-Disposition"] = 'attachment; filename="Galaxy%s-[%s].%s"' % (dataset.hid, fname, to_ext)
|
||||
return open( dataset.file_name )
|
||||
|
||||
@@ -100,7 +100,7 @@ class Ab1( Binary ):
|
||||
|
||||
def set_peek( self, dataset, is_multi_byte=False ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "Binary ab1 sequence file"
|
||||
dataset.peek = "Binary ab1 sequence file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
@@ -134,7 +134,6 @@ class Idat( Binary ):
|
||||
Binary.register_sniffable_binary_format("idat", "idat", Idat)
|
||||
|
||||
|
||||
|
||||
class CompressedArchive( Binary ):
|
||||
"""
|
||||
Class describing an compressed binary file
|
||||
@@ -145,7 +144,7 @@ class CompressedArchive( Binary ):
|
||||
|
||||
def set_peek( self, dataset, is_multi_byte=False ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "Compressed binary file"
|
||||
dataset.peek = "Compressed binary file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
@@ -209,7 +208,7 @@ class Bam( Binary ):
|
||||
if stderr:
|
||||
if exit_code != 0:
|
||||
shutil.rmtree(tmp_dir) # clean up
|
||||
raise Exception, "Error merging BAM files: %s" % stderr
|
||||
raise Exception( "Error merging BAM files: %s" % stderr )
|
||||
else:
|
||||
print stderr
|
||||
os.unlink(stderr_name)
|
||||
@@ -243,11 +242,11 @@ class Bam( Binary ):
|
||||
# seconds to index with samtools, and 45 minutes to sort, so indexing is relatively inexpensive.
|
||||
if self._is_coordinate_sorted( file_name ):
|
||||
return False
|
||||
index_name = tempfile.NamedTemporaryFile( prefix = "bam_index" ).name
|
||||
stderr_name = tempfile.NamedTemporaryFile( prefix = "bam_index_stderr" ).name
|
||||
index_name = tempfile.NamedTemporaryFile( prefix="bam_index" ).name
|
||||
stderr_name = tempfile.NamedTemporaryFile( prefix="bam_index_stderr" ).name
|
||||
command = 'samtools index %s %s' % ( file_name, index_name )
|
||||
proc = subprocess.Popen( args=command, shell=True, stderr=open( stderr_name, 'wb' ) )
|
||||
exit_code = proc.wait()
|
||||
proc.wait()
|
||||
stderr = open( stderr_name ).read().strip()
|
||||
if stderr:
|
||||
try:
|
||||
@@ -276,28 +275,28 @@ class Bam( Binary ):
|
||||
on an output dataset after the content is initially generated.
|
||||
"""
|
||||
# Use samtools to sort the Bam file
|
||||
##$ samtools sort
|
||||
##Usage: samtools sort [-on] [-m <maxMem>] <in.bam> <out.prefix>
|
||||
## Sort alignments by leftmost coordinates. File <out.prefix>.bam will be created.
|
||||
## This command may also create temporary files <out.prefix>.%d.bam when the
|
||||
## whole alignment cannot be fitted into memory ( controlled by option -m ).
|
||||
#do this in a unique temp directory, because of possible <out.prefix>.%d.bam temp files
|
||||
# $ samtools sort
|
||||
# Usage: samtools sort [-on] [-m <maxMem>] <in.bam> <out.prefix>
|
||||
# Sort alignments by leftmost coordinates. File <out.prefix>.bam will be created.
|
||||
# This command may also create temporary files <out.prefix>.%d.bam when the
|
||||
# whole alignment cannot be fitted into memory ( controlled by option -m ).
|
||||
# do this in a unique temp directory, because of possible <out.prefix>.%d.bam temp files
|
||||
if not self.dataset_content_needs_grooming( file_name ):
|
||||
# Don't re-sort if already sorted
|
||||
return
|
||||
tmp_dir = tempfile.mkdtemp()
|
||||
tmp_sorted_dataset_file_name_prefix = os.path.join( tmp_dir, 'sorted' )
|
||||
stderr_name = tempfile.NamedTemporaryFile( dir = tmp_dir, prefix = "bam_sort_stderr" ).name
|
||||
samtools_created_sorted_file_name = "%s.bam" % tmp_sorted_dataset_file_name_prefix #samtools accepts a prefix, not a filename, it always adds .bam to the prefix
|
||||
stderr_name = tempfile.NamedTemporaryFile( dir=tmp_dir, prefix="bam_sort_stderr" ).name
|
||||
samtools_created_sorted_file_name = "%s.bam" % tmp_sorted_dataset_file_name_prefix # samtools accepts a prefix, not a filename, it always adds .bam to the prefix
|
||||
command = "samtools sort %s %s" % ( file_name, tmp_sorted_dataset_file_name_prefix )
|
||||
proc = subprocess.Popen( args=command, shell=True, cwd=tmp_dir, stderr=open( stderr_name, 'wb' ) )
|
||||
exit_code = proc.wait()
|
||||
#Did sort succeed?
|
||||
# Did sort succeed?
|
||||
stderr = open( stderr_name ).read().strip()
|
||||
if stderr:
|
||||
if exit_code != 0:
|
||||
shutil.rmtree( tmp_dir) #clean up
|
||||
raise Exception, "Error Grooming BAM file contents: %s" % stderr
|
||||
shutil.rmtree( tmp_dir) # clean up
|
||||
raise Exception( "Error Grooming BAM file contents: %s" % stderr )
|
||||
else:
|
||||
print stderr
|
||||
# Move samtools_created_sorted_file_name to our output dataset location
|
||||
@@ -309,20 +308,20 @@ class Bam( Binary ):
|
||||
def init_meta( self, dataset, copy_from=None ):
|
||||
Binary.init_meta( self, dataset, copy_from=copy_from )
|
||||
|
||||
def set_meta( self, dataset, overwrite = True, **kwd ):
|
||||
def set_meta( self, dataset, overwrite=True, **kwd ):
|
||||
""" Creates the index for the BAM file. """
|
||||
# These metadata values are not accessible by users, always overwrite
|
||||
index_file = dataset.metadata.bam_index
|
||||
if not index_file:
|
||||
index_file = dataset.metadata.spec['bam_index'].param.new_file( dataset = dataset )
|
||||
index_file = dataset.metadata.spec['bam_index'].param.new_file( dataset=dataset )
|
||||
# Create the Bam index
|
||||
##$ samtools index
|
||||
##Usage: samtools index <in.bam> [<out.index>]
|
||||
stderr_name = tempfile.NamedTemporaryFile( prefix = "bam_index_stderr" ).name
|
||||
# $ samtools index
|
||||
# Usage: samtools index <in.bam> [<out.index>]
|
||||
stderr_name = tempfile.NamedTemporaryFile( prefix="bam_index_stderr" ).name
|
||||
command = [ 'samtools', 'index', dataset.file_name, index_file.file_name ]
|
||||
proc = subprocess.Popen( args=command, stderr=open( stderr_name, 'wb' ) )
|
||||
exit_code = proc.wait()
|
||||
#Did index succeed?
|
||||
# Did index succeed?
|
||||
if exit_code == -6:
|
||||
# SIGABRT, most likely samtools 1.0+ which does not accept the index name parameter.
|
||||
dataset_symlink = os.path.join( os.path.dirname( index_file.file_name ),
|
||||
@@ -339,8 +338,8 @@ class Bam( Binary ):
|
||||
stderr = open( stderr_name ).read().strip()
|
||||
if stderr:
|
||||
if exit_code != 0:
|
||||
os.unlink( stderr_name ) #clean up
|
||||
raise Exception, "Error Setting BAM Metadata: %s" % stderr
|
||||
os.unlink( stderr_name ) # clean up
|
||||
raise Exception( "Error Setting BAM Metadata: %s" % stderr )
|
||||
else:
|
||||
print stderr
|
||||
dataset.metadata.bam_index = index_file
|
||||
@@ -371,7 +370,7 @@ class Bam( Binary ):
|
||||
|
||||
def set_peek( self, dataset, is_multi_byte=False ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "Binary bam alignments file"
|
||||
dataset.peek = "Binary bam alignments file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
@@ -383,14 +382,12 @@ class Bam( Binary ):
|
||||
except:
|
||||
return "Binary bam alignments file (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
|
||||
|
||||
|
||||
# ------------- Dataproviders
|
||||
# pipe through samtools view
|
||||
#ALSO: (as Sam)
|
||||
# ALSO: (as Sam)
|
||||
# bam does not use '#' to indicate comments/headers - we need to strip out those headers from the std. providers
|
||||
#TODO:?? seems like there should be an easier way to do/inherit this - metadata.comment_char?
|
||||
#TODO: incorporate samtools options to control output: regions first, then flags, etc.
|
||||
# TODO:?? seems like there should be an easier way to do/inherit this - metadata.comment_char?
|
||||
# TODO: incorporate samtools options to control output: regions first, then flags, etc.
|
||||
@dataproviders.decorators.dataprovider_factory( 'line', dataproviders.line.FilteredLineDataProvider.settings )
|
||||
def line_dataprovider( self, dataset, **settings ):
|
||||
samtools_source = dataproviders.dataset.SamtoolsDataProvider( dataset )
|
||||
@@ -417,13 +414,13 @@ class Bam( Binary ):
|
||||
|
||||
# these can't be used directly - may need BamColumn, BamDict (Bam metadata -> column/dict)
|
||||
# OR - see genomic_region_dataprovider
|
||||
#@dataproviders.decorators.dataprovider_factory( 'dataset-column', dataproviders.column.ColumnarDataProvider.settings )
|
||||
#def dataset_column_dataprovider( self, dataset, **settings ):
|
||||
# @dataproviders.decorators.dataprovider_factory( 'dataset-column', dataproviders.column.ColumnarDataProvider.settings )
|
||||
# def dataset_column_dataprovider( self, dataset, **settings ):
|
||||
# settings[ 'comment_char' ] = '@'
|
||||
# return super( Sam, self ).dataset_column_dataprovider( dataset, **settings )
|
||||
|
||||
#@dataproviders.decorators.dataprovider_factory( 'dataset-dict', dataproviders.column.DictDataProvider.settings )
|
||||
#def dataset_dict_dataprovider( self, dataset, **settings ):
|
||||
# @dataproviders.decorators.dataprovider_factory( 'dataset-dict', dataproviders.column.DictDataProvider.settings )
|
||||
# def dataset_dict_dataprovider( self, dataset, **settings ):
|
||||
# settings[ 'comment_char' ] = '@'
|
||||
# return super( Sam, self ).dataset_dict_dataprovider( dataset, **settings )
|
||||
|
||||
@@ -443,10 +440,10 @@ class Bam( Binary ):
|
||||
@dataproviders.decorators.dataprovider_factory( 'genomic-region', dataproviders.column.ColumnarDataProvider.settings )
|
||||
def genomic_region_dataprovider( self, dataset, **settings ):
|
||||
# GenomicRegionDataProvider currently requires a dataset as source - may not be necc.
|
||||
#TODO:?? consider (at least) the possible use of a kwarg: metadata_source (def. to source.dataset),
|
||||
# TODO:?? consider (at least) the possible use of a kwarg: metadata_source (def. to source.dataset),
|
||||
# or remove altogether...
|
||||
#samtools_source = dataproviders.dataset.SamtoolsDataProvider( dataset )
|
||||
#return dataproviders.dataset.GenomicRegionDataProvider( samtools_source, metadata_source=dataset,
|
||||
# samtools_source = dataproviders.dataset.SamtoolsDataProvider( dataset )
|
||||
# return dataproviders.dataset.GenomicRegionDataProvider( samtools_source, metadata_source=dataset,
|
||||
# 2, 3, 3, **settings )
|
||||
|
||||
# instead, set manually and use in-class column gen
|
||||
@@ -469,6 +466,7 @@ class Bam( Binary ):
|
||||
|
||||
Binary.register_sniffable_binary_format("bam", "bam", Bam)
|
||||
|
||||
|
||||
class Bcf( Binary):
|
||||
"""Class describing a BCF file"""
|
||||
edam_format = "format_3020"
|
||||
@@ -487,21 +485,21 @@ class Bcf( Binary):
|
||||
except:
|
||||
return False
|
||||
|
||||
def set_meta( self, dataset, overwrite = True, **kwd ):
|
||||
def set_meta( self, dataset, overwrite=True, **kwd ):
|
||||
""" Creates the index for the BCF file. """
|
||||
# These metadata values are not accessible by users, always overwrite
|
||||
index_file = dataset.metadata.bcf_index
|
||||
if not index_file:
|
||||
index_file = dataset.metadata.spec['bcf_index'].param.new_file( dataset = dataset )
|
||||
index_file = dataset.metadata.spec['bcf_index'].param.new_file( dataset=dataset )
|
||||
# Create the bcf index
|
||||
##$ bcftools index
|
||||
##Usage: bcftools index <in.bcf>
|
||||
# $ bcftools index
|
||||
# Usage: bcftools index <in.bcf>
|
||||
|
||||
dataset_symlink = os.path.join( os.path.dirname( index_file.file_name ),
|
||||
'__dataset_%d_%s' % ( dataset.id, os.path.basename( index_file.file_name ) ) )
|
||||
os.symlink( dataset.file_name, dataset_symlink )
|
||||
|
||||
stderr_name = tempfile.NamedTemporaryFile( prefix = "bcf_index_stderr" ).name
|
||||
stderr_name = tempfile.NamedTemporaryFile( prefix="bcf_index_stderr" ).name
|
||||
command = [ 'bcftools', 'index', dataset_symlink ]
|
||||
proc = subprocess.Popen( args=command, stderr=open( stderr_name, 'wb' ) )
|
||||
exit_code = proc.wait()
|
||||
@@ -510,8 +508,8 @@ class Bcf( Binary):
|
||||
stderr = open( stderr_name ).read().strip()
|
||||
if stderr:
|
||||
if exit_code != 0:
|
||||
os.unlink( stderr_name ) #clean up
|
||||
raise Exception, "Error Setting BCF Metadata: %s" % stderr
|
||||
os.unlink( stderr_name ) # clean up
|
||||
raise Exception( "Error Setting BCF Metadata: %s" % stderr )
|
||||
else:
|
||||
print stderr
|
||||
dataset.metadata.bcf_index = index_file
|
||||
@@ -527,7 +525,7 @@ class H5( Binary ):
|
||||
|
||||
def set_peek( self, dataset, is_multi_byte=False ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "Binary h5 file"
|
||||
dataset.peek = "Binary h5 file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
@@ -549,7 +547,7 @@ class Scf( Binary ):
|
||||
|
||||
def set_peek( self, dataset, is_multi_byte=False ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "Binary scf sequence file"
|
||||
dataset.peek = "Binary scf sequence file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
@@ -585,7 +583,7 @@ class Sff( Binary ):
|
||||
|
||||
def set_peek( self, dataset, is_multi_byte=False ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "Binary sff file"
|
||||
dataset.peek = "Binary sff file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
@@ -627,7 +625,7 @@ class BigWig(Binary):
|
||||
|
||||
def set_peek( self, dataset, is_multi_byte=False ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "Binary UCSC %s file" % self._name
|
||||
dataset.peek = "Binary UCSC %s file" % self._name
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
@@ -699,7 +697,7 @@ class SQlite ( Binary ):
|
||||
def init_meta( self, dataset, copy_from=None ):
|
||||
Binary.init_meta( self, dataset, copy_from=copy_from )
|
||||
|
||||
def set_meta( self, dataset, overwrite = True, **kwd ):
|
||||
def set_meta( self, dataset, overwrite=True, **kwd ):
|
||||
try:
|
||||
tables = []
|
||||
columns = dict()
|
||||
@@ -708,7 +706,7 @@ class SQlite ( Binary ):
|
||||
c = conn.cursor()
|
||||
tables_query = "SELECT name,sql FROM sqlite_master WHERE type='table' ORDER BY name"
|
||||
rslt = c.execute(tables_query).fetchall()
|
||||
for table,sql in rslt:
|
||||
for table, sql in rslt:
|
||||
tables.append(table)
|
||||
try:
|
||||
col_query = 'SELECT * FROM %s LIMIT 0' % table
|
||||
@@ -742,12 +740,12 @@ class SQlite ( Binary ):
|
||||
|
||||
def set_peek( self, dataset, is_multi_byte=False ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "SQLite Database"
|
||||
dataset.peek = "SQLite Database"
|
||||
lines = ['SQLite Database']
|
||||
if dataset.metadata.tables:
|
||||
for table in dataset.metadata.tables:
|
||||
try:
|
||||
lines.append('%s [%s]' % (table,dataset.metadata.table_row_count[table]))
|
||||
lines.append('%s [%s]' % (table, dataset.metadata.table_row_count[table]))
|
||||
except:
|
||||
continue
|
||||
dataset.peek = '\n'.join(lines)
|
||||
@@ -762,7 +760,6 @@ class SQlite ( Binary ):
|
||||
except:
|
||||
return "SQLite Database (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
|
||||
|
||||
@dataproviders.decorators.dataprovider_factory( 'sqlite', dataproviders.dataset.SQliteDataProvider.settings )
|
||||
def sqlite_dataprovider( self, dataset, **settings ):
|
||||
dataset_source = dataproviders.dataset.DatasetDataProvider( dataset )
|
||||
@@ -779,7 +776,7 @@ class SQlite ( Binary ):
|
||||
return dataproviders.dataset.SQliteDataDictProvider( dataset_source, **settings )
|
||||
|
||||
|
||||
#Binary.register_sniffable_binary_format("sqlite", "sqlite", SQlite)
|
||||
# Binary.register_sniffable_binary_format("sqlite", "sqlite", SQlite)
|
||||
|
||||
|
||||
class GeminiSQLite( SQlite ):
|
||||
@@ -788,8 +785,8 @@ class GeminiSQLite( SQlite ):
|
||||
readonly=True, visible=True, no_value='0.10.0' )
|
||||
file_ext = "gemini.sqlite"
|
||||
|
||||
def set_meta( self, dataset, overwrite = True, **kwd ):
|
||||
super( GeminiSQLite, self ).set_meta( dataset, overwrite = overwrite, **kwd )
|
||||
def set_meta( self, dataset, overwrite=True, **kwd ):
|
||||
super( GeminiSQLite, self ).set_meta( dataset, overwrite=overwrite, **kwd )
|
||||
try:
|
||||
conn = sqlite.connect( dataset.file_name )
|
||||
c = conn.cursor()
|
||||
@@ -821,7 +818,7 @@ class GeminiSQLite( SQlite ):
|
||||
|
||||
def set_peek( self, dataset, is_multi_byte=False ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "Gemini SQLite Database, version %s" % ( dataset.metadata.gemini_version or 'unknown' )
|
||||
dataset.peek = "Gemini SQLite Database, version %s" % ( dataset.metadata.gemini_version or 'unknown' )
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
@@ -841,7 +838,8 @@ Binary.register_sniffable_binary_format("sqlite", "sqlite", SQlite)
|
||||
|
||||
class Xlsx(Binary):
|
||||
"""Class for Excel 2007 (xlsx) files"""
|
||||
file_ext="xlsx"
|
||||
file_ext = "xlsx"
|
||||
|
||||
def sniff( self, filename ):
|
||||
# Xlsx is compressed in zip format and must not be uncompressed in Galaxy.
|
||||
try:
|
||||
@@ -878,7 +876,7 @@ class Sra( Binary ):
|
||||
|
||||
def set_peek(self, dataset, is_multi_byte=False):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = 'Binary sra file'
|
||||
dataset.peek = 'Binary sra file'
|
||||
dataset.blurb = data.nice_size(dataset.get_size())
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import os
|
||||
import re
|
||||
import bz2
|
||||
import gzip
|
||||
@@ -18,8 +17,9 @@ except ImportError:
|
||||
except:
|
||||
PIL = None
|
||||
|
||||
|
||||
def check_image( file_path ):
|
||||
if PIL != None:
|
||||
if PIL is not None:
|
||||
try:
|
||||
im = PIL.open( file_path )
|
||||
except:
|
||||
@@ -28,10 +28,11 @@ def check_image( file_path ):
|
||||
return im
|
||||
return False
|
||||
else:
|
||||
if imghdr.what( file_path ) != None:
|
||||
if imghdr.what( file_path ) is not None:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def check_html( file_path, chunk=None ):
|
||||
if chunk is None:
|
||||
temp = open( file_path, "U" )
|
||||
@@ -58,6 +59,7 @@ def check_html( file_path, chunk=None ):
|
||||
temp.close()
|
||||
return False
|
||||
|
||||
|
||||
def check_binary( name, file_path=True ):
|
||||
# Handles files if file_path is True or text if file_path is False
|
||||
is_binary = False
|
||||
@@ -65,7 +67,6 @@ def check_binary( name, file_path=True ):
|
||||
temp = open( name, "U" )
|
||||
else:
|
||||
temp = StringIO( name )
|
||||
chars_read = 0
|
||||
try:
|
||||
for char in temp.read( 100 ):
|
||||
if util.is_binary( char ):
|
||||
@@ -75,6 +76,7 @@ def check_binary( name, file_path=True ):
|
||||
temp.close( )
|
||||
return is_binary
|
||||
|
||||
|
||||
def check_gzip( file_path ):
|
||||
# This method returns a tuple of booleans representing ( is_gzipped, is_valid )
|
||||
# Make sure we have a gzipped file
|
||||
@@ -95,7 +97,7 @@ def check_gzip( file_path ):
|
||||
return ( True, True )
|
||||
except:
|
||||
return( False, False )
|
||||
CHUNK_SIZE = 2**15 # 32Kb
|
||||
CHUNK_SIZE = 2 ** 15 # 32Kb
|
||||
gzipped_file = gzip.GzipFile( file_path, mode='rb' )
|
||||
chunk = gzipped_file.read( CHUNK_SIZE )
|
||||
gzipped_file.close()
|
||||
@@ -104,6 +106,7 @@ def check_gzip( file_path ):
|
||||
return ( True, False )
|
||||
return ( True, True )
|
||||
|
||||
|
||||
def check_bz2( file_path ):
|
||||
try:
|
||||
temp = open( file_path, "U" )
|
||||
@@ -113,7 +116,7 @@ def check_bz2( file_path ):
|
||||
return ( False, False )
|
||||
except:
|
||||
return( False, False )
|
||||
CHUNK_SIZE = 2**15 # reKb
|
||||
CHUNK_SIZE = 2 ** 15 # reKb
|
||||
bzipped_file = bz2.BZ2File( file_path, mode='rb' )
|
||||
chunk = bzipped_file.read( CHUNK_SIZE )
|
||||
bzipped_file.close()
|
||||
@@ -122,15 +125,18 @@ def check_bz2( file_path ):
|
||||
return ( True, False )
|
||||
return ( True, True )
|
||||
|
||||
|
||||
def check_zip( file_path ):
|
||||
if zipfile.is_zipfile( file_path ):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def is_bz2( file_path ):
|
||||
is_bz2, is_valid = check_bz2( file_path )
|
||||
return is_bz2
|
||||
|
||||
|
||||
def is_gzip( file_path ):
|
||||
is_gzipped, is_valid = check_gzip( file_path )
|
||||
return is_gzipped
|
||||
|
||||
@@ -7,4 +7,3 @@ class ChromInfo( Tabular ):
|
||||
file_ext = "len"
|
||||
MetadataElement( name="chrom", default=1, desc="Chrom column", param=metadata.ColumnParameter )
|
||||
MetadataElement( name="length", default=2, desc="Length column", param=metadata.ColumnParameter )
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ from galaxy.datatypes.tabular import Tabular
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class LastzCoverage( Tabular ):
|
||||
file_ext = "coverage"
|
||||
|
||||
@@ -28,7 +29,6 @@ class LastzCoverage( Tabular ):
|
||||
"""
|
||||
# Maybe if we import here people will still be able to use Galaxy when numpy kills it
|
||||
eggs.require("numpy>=1.2.1")
|
||||
#from numpy.lib import format
|
||||
import numpy
|
||||
|
||||
range = end - start
|
||||
@@ -55,5 +55,3 @@ class LastzCoverage( Tabular ):
|
||||
resolution = min( resolution, 10000 )
|
||||
resolution = max( resolution, 1 )
|
||||
return resolution
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user