From 30f1815658508d030ee61eeb272b07b75cb398b0 Mon Sep 17 00:00:00 2001 From: Daniel Blankenberg Date: Mon, 26 Jan 2015 15:11:06 -0500 Subject: [PATCH] Load genomes list from data tables for visualizations. Based off of Pull Request: https://bitbucket.org/galaxy/galaxy-central/pull-request/601/load-genomes-list-from-data-tables-for/diff --- config/tool_data_table_conf.xml.sample | 5 ++ lib/galaxy/visualization/genomes.py | 72 ++++++++++++++++++-------- 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/config/tool_data_table_conf.xml.sample b/config/tool_data_table_conf.xml.sample index 8c0aefec89a..910889e8320 100644 --- a/config/tool_data_table_conf.xml.sample +++ b/config/tool_data_table_conf.xml.sample @@ -60,4 +60,9 @@ value, dbkey, name, path + + + value, path + +
diff --git a/lib/galaxy/visualization/genomes.py b/lib/galaxy/visualization/genomes.py index 36d856fd4ad..b92f01de0f6 100644 --- a/lib/galaxy/visualization/genomes.py +++ b/lib/galaxy/visualization/genomes.py @@ -179,33 +179,59 @@ class Genomes( object ): """ def __init__( self, app ): + self.app = app # Create list of genomes from app.genome_builds self.genomes = {} - for key, description in app.genome_builds.get_genome_build_names(): + # Store internal versions of data tables for twobit and __dbkey__ + self._table_versions = { 'twobit': None, '__dbkeys__': None } + self.reload_genomes() + + def reload_genomes( self ): + self.genomes = {} + # Store table versions for later + for table_name in self._table_versions.keys(): + table = self.app.tool_data_tables.get( table_name, None ) + if table is not None: + self._table_versions[ table_name ] = table._loaded_content_version + + twobit_table = self.app.tool_data_tables.get( 'twobit', None ) + twobit_fields = {} + if twobit_table is None: + # Add genome data (twobit files) to genomes, directly from twobit.loc + try: + for line in open( os.path.join( self.app.config.tool_data_path, "twobit.loc" ) ): + if line.startswith("#"): continue + val = line.split() + if len( val ) == 2: + key, path = val + twobit_fields[ key ] = path + except IOError, e: + # Thrown if twobit.loc does not exist. + log.exception( "Error reading twobit.loc: %s", e ) + for key, description in self.app.genome_builds.get_genome_build_names(): self.genomes[ key ] = Genome( key, description ) + # Add len files to genomes. + self.genomes[ key ].len_file = self.app.genome_builds.get_chrom_info( key )[0] + if self.genomes[ key ].len_file: + if not os.path.exists( self.genomes[ key ].len_file ): + self.genomes[ key ].len_file = None + # Add genome data (twobit files) to genomes. + if twobit_table is not None: + self.genomes[ key ].twobit_file = twobit_table.get_entry( 'value', key, 'path', default=None ) + elif key in twobit_fields: + self.genomes[ key ].twobit_file = twobit_fields[ key ] + - # Add len files to genomes. - len_files = glob.glob( os.path.join( app.config.len_file_path, "*.len" ) ) - for f in len_files: - key = os.path.split( f )[1].split( ".len" )[0] - if key in self.genomes: - self.genomes[ key ].len_file = f - - # Add genome data (twobit files) to genomes. - try: - for line in open( os.path.join( app.config.tool_data_path, "twobit.loc" ) ): - if line.startswith("#"): continue - val = line.split() - if len( val ) == 2: - key, path = val - if key in self.genomes: - self.genomes[ key ].twobit_file = path - except IOError, e: - # Thrown if twobit.loc does not exist. - log.exception( str( e ) ) + def check_and_reload( self ): + # Check if tables have been modified, if so reload + for table_name, table_version in self._table_versions.iteritems(): + table = self.app.tool_data_tables.get( table_name, None ) + if table is not None and not table.is_current_version( table_version ): + return self.reload_genomes() def get_build( self, dbkey ): """ Returns build for the given key. """ + self.check_and_reload() rval = None if dbkey in self.genomes: rval = self.genomes[ dbkey ] @@ -214,6 +240,7 @@ class Genomes( object ): def get_dbkeys( self, trans, chrom_info=False, **kwd ): """ Returns all known dbkeys. If chrom_info is True, only dbkeys with chromosome lengths are returned. """ + self.check_and_reload() dbkeys = [] # Add user's custom keys to dbkeys. @@ -241,7 +268,7 @@ class Genomes( object ): Returns a naturally sorted list of chroms/contigs for a given dbkey. Use either chrom or low to specify the starting chrom in the return list. """ - + self.check_and_reload() # If there is no dbkey owner, default to current user. dbkey_owner, dbkey = decode_dbkey( dbkey ) if dbkey_owner: @@ -303,6 +330,7 @@ class Genomes( object ): Returns true if there is reference data for the specified dbkey. If dbkey is custom, dbkey_owner is needed to determine if there is reference data. """ + self.check_and_reload() # Look for key in built-in builds. if dbkey in self.genomes and self.genomes[ dbkey ].twobit_file: # There is built-in reference data. @@ -323,7 +351,7 @@ class Genomes( object ): """ Return reference data for a build. """ - + self.check_and_reload() # If there is no dbkey owner, default to current user. dbkey_owner, dbkey = decode_dbkey( dbkey ) if dbkey_owner: