From ab1d8679155636d7a4e49c53cbe139bf10492ccd Mon Sep 17 00:00:00 2001
From: Greg Von Kuster
Date: Fri, 30 Nov 2007 20:08:21 +0000
Subject: [PATCH] More dynamic options cleanup. Eliminated the "tool_type"
attribute, among other cleanup chores.
---
lib/galaxy/tools/dynamic_options.py | 261 ++++++++++--------
lib/galaxy/web/controllers/root.py | 12 +-
.../encode_import_all_latest_datasets.xml | 4 +-
...ncode_import_chromatin_and_chromosomes.xml | 4 +-
tools/data_source/encode_import_gencode.xml | 4 +-
.../encode_import_genes_and_transcripts.xml | 4 +-
...import_multi-species_sequence_analysis.xml | 4 +-
...encode_import_transcription_regulation.xml | 4 +-
tools/data_source/microbial_import.xml | 18 +-
tools/data_source/upload.xml | 2 +-
tools/extract/genebed_maf_to_fasta.xml | 4 +-
.../extract/interval_maf_to_merged_fasta.xml | 4 +-
12 files changed, 185 insertions(+), 140 deletions(-)
diff --git a/lib/galaxy/tools/dynamic_options.py b/lib/galaxy/tools/dynamic_options.py
index 0d847365f92..c604325b064 100644
--- a/lib/galaxy/tools/dynamic_options.py
+++ b/lib/galaxy/tools/dynamic_options.py
@@ -23,8 +23,8 @@ class DynamicOptions( object ):
self.data_file = self.from_file[ i+1: ]
except:
self.data_file = self.from_file
- else: self.data_file = None
- self.tool_type = elem.get( 'tool_type', None )
+ else:
+ self.data_file = None
self.filters = elem.findall( 'filter' )
self.data_ref = None
for filter in self.filters:
@@ -38,7 +38,7 @@ class DynamicOptions( object ):
self.param_ref = filter.get( 'param_ref', None )
assert self.param_ref is not None, "Required 'param_ref' attribute missing from 'param_meta' filter"
self.param_ref = self.param_ref.strip()
- def get_dataset( self, trans, other_values ):
+ def get_data_ref_value( self, trans, other_values ):
# No value indicates a configuration error, the named DataToolParameter must preceed this parameter in the tool config
assert self.data_ref in other_values, "Value for associated DataToolParameter not found"
# Get the value of the associated DataToolParameter (a dataset)
@@ -50,11 +50,13 @@ class DynamicOptions( object ):
return None
return dataset
def get_param_value( self, param, trans, other_values ):
- if param is None: return None
+ if param is None:
+ return None
assert param in other_values, "Value for associated param_value %s not found" %param
return other_values[ param ]
def get_param_ref_value( self, trans, other_values ):
- if self.param_ref is None: return None
+ if self.param_ref is None:
+ return None
assert self.param_ref in other_values, "Value for associated param_ref %s not found" %self.param_ref.name
return other_values[ self.param_ref ]
def get_unique_elems( self, elems ):
@@ -70,26 +72,29 @@ class DynamicOptions( object ):
filter_type = filter_type.strip()
if filter_type == 'data_meta':
filters[ 'data_meta' ] = {}
- dataset = self.get_dataset( trans, other_values )
- if dataset is None: return []
+ dataset = self.get_data_ref_value( trans, other_values )
+ if dataset is None:
+ return []
key = filter.get( 'key', None )
- assert key is not None, "key attribute missing from data_meta filter"
- filters[ 'data_meta' ][ 'key' ] = key.strip()
+ if key is not None:
+ filters[ 'data_meta' ][ 'key' ] = key.strip()
value = filter.get( 'value', None )
- if value is not None: value = value.strip()
+ if value is not None:
+ value = value.strip()
else:
- if key == 'build': value = dataset.get_dbkey()
- elif key == 'file_name': value = dataset.get_file_name()
- elif key == 'species': value = dataset.metadata.species
+ if key == 'build':
+ value = dataset.get_dbkey()
+ elif key == 'file_name':
+ value = dataset.get_file_name()
+ elif key == 'species':
+ value = dataset.metadata.species
filters[ 'data_meta' ][ 'value' ] = value
if self.data_file == 'maf_index.loc' and key == 'build' and value == '?':
- if must_be_valid: return []
+ if must_be_valid:
+ return []
return self.build_not_set_option
elif filter_type == 'param_meta':
filters[ 'param_meta' ] = {}
- key = filter.get( 'key', None )
- assert key is not None, "key attribute missing from param_meta filter"
- filters[ 'param_meta' ][ 'key' ] = key.strip()
value = self.get_param_ref_value( trans, other_values )
filters[ 'param_meta' ][ 'value' ] = value
elif filter_type == 'param_value':
@@ -130,65 +135,75 @@ class DynamicOptions( object ):
filters[ 'params' ][ n ] = v
# Now that we've parsed our filters, we need to see if the tool is a maf tool
# which requires special handling
- try: key = filters[ 'data_meta' ][ 'key' ]
- except: key = None
- if key == 'maf':
+ try:
maf_source = filters[ 'params' ][ 'maf_source' ]
if maf_source == 'cached':
maf_uid = filters[ 'param_meta' ][ 'value' ]
if maf_uid in [ None, 'None' ]:
- if must_be_valid: return []
- if maf_uid is None: return self.no_data_option
- if maf_uid == 'None': return self.build_not_set_option
+ if must_be_valid:
+ return []
+ if maf_uid is None:
+ return self.no_data_option
+ if maf_uid == 'None':
+ return self.build_not_set_option
+ return self.generate_for_maf( maf_uid, '\t', must_be_valid=must_be_valid )
elif maf_source == 'user':
- dataset = self.get_dataset( trans, other_values )
- if dataset is None: return self.wait_for_maf_option
+ dataset = self.get_data_ref_value( trans, other_values )
+ if dataset is None:
+ return self.wait_for_maf_option
filters[ 'data_meta' ][ 'key' ] = 'species'
filters[ 'data_meta' ][ 'value' ] = dataset.metadata.species
+ except:
+ pass
return self.generate_options( filters, must_be_valid=must_be_valid )
def generate_options( self, filters={}, sep='\t', must_be_valid=False ):
- if self.tool_type == 'upload':
- return self.generate_from_datatypes_registry()
- elif self.tool_type == 'encode':
- encode_group = filters[ 'params' ][ 'encode_group' ]
- build = filters[ 'params' ][ 'build' ]
- return self.generate_from_file_for_encode( encode_group, build, must_be_valid=must_be_valid )
- elif self.tool_type == 'microbial':
- if self.from_file_data is None: self.load_microbial_data()
- try: kingdom = filters[ 'param_values' ][ 'kingdom' ]
- except: kingdom = None
- try: org = filters[ 'param_values' ][ 'org' ]
- except: org = None
- try: feature = filters[ 'params' ][ 'feature' ]
- except: feature = None
- return self.generate_from_file_for_microbial( kingdom, org, feature, must_be_valid=must_be_valid )
- else: # self.tool_type is None
- try: key = filters[ 'data_meta' ][ 'key' ]
- except:
- try: key = filters[ 'param_meta' ][ 'key' ]
- except: key = None
- if key == 'species':
- value = filters[ 'data_meta' ][ 'value' ]
- return self.generate_from_dataset_for_species( value )
- elif key == 'maf':
- maf_source = filters[ 'params' ][ 'maf_source' ]
- try: value = filters[ 'data_meta' ][ 'value' ]
- except: value = filters[ 'param_meta' ][ 'value' ]
- return self.generate_from_file_for_maf( maf_source, value, must_be_valid=must_be_valid )
- elif key == 'file_name':
- value = filters[ 'data_meta' ][ 'value' ]
- value_col = int( filters[ 'columns' ][ 'value_col' ] )
- return self.generate_from_dataset( value, value_col )
- elif key == 'build':
- value = filters[ 'data_meta' ][ 'value' ]
- build_col = int( filters[ 'columns' ][ 'build_col' ].strip() )
+ try:
+ key = filters[ 'data_meta' ][ 'key' ]
+ except:
+ try:
+ key = filters[ 'param_meta' ][ 'key' ]
+ except:
+ key = None
+ if key == 'species':
+ species = filters[ 'data_meta' ][ 'value' ]
+ return self.generate_for_species( species )
+ elif key == 'file_name':
+ file_name = filters[ 'data_meta' ][ 'value' ]
+ value_col = int( filters[ 'columns' ][ 'value_col' ] )
+ return self.generate_from_dataset( file_name, value_col, sep )
+ elif key == 'build':
+ build = filters[ 'data_meta' ][ 'value' ]
+ build_col = int( filters[ 'columns' ][ 'build_col' ].strip() )
+ name_col = int( filters[ 'columns' ][ 'name_col' ] )
+ value_col = int( filters[ 'columns' ][ 'value_col' ] )
+ return self.generate_for_build( build, build_col, name_col, value_col, sep, must_be_valid=must_be_valid )
+ else: # key is None
+ if self.data_file == 'datatypes_registry':
+ return self.generate_from_datatypes_registry()
+ elif self.data_file == 'encode_datasets.loc':
+ encode_group = filters[ 'params' ][ 'encode_group' ]
+ build = filters[ 'params' ][ 'build' ]
+ return self.generate_for_encode( encode_group, build, sep, must_be_valid=must_be_valid )
+ elif self.data_file == 'microbial_data.loc':
+ if self.from_file_data is None:
+ self.load_microbial_data()
+ try:
+ kingdom = filters[ 'param_values' ][ 'kingdom' ]
+ except:
+ kingdom = None
+ try:
+ org = filters[ 'param_values' ][ 'org' ]
+ except:
+ org = None
+ try:
+ feature = filters[ 'params' ][ 'feature' ]
+ except:
+ feature = None
+ return self.generate_for_microbial( kingdom, org, feature, must_be_valid=must_be_valid )
+ else:
name_col = int( filters[ 'columns' ][ 'name_col' ] )
value_col = int( filters[ 'columns' ][ 'value_col' ] )
- return self.generate_from_file_for_build( value, build_col, name_col, value_col, must_be_valid=must_be_valid )
- else: # key is None
- name_col = int( filters[ 'columns' ][ 'name_col' ] )
- value_col = int( filters[ 'columns' ][ 'value_col' ] )
- return self.generate_from_file( name_col, value_col )
+ return self.generate( name_col, value_col, sep )
def generate_from_datatypes_registry( self ):
from galaxy.datatypes import registry
datatypes_registry = registry.Registry()
@@ -200,7 +215,7 @@ class DynamicOptions( object ):
label = format.capitalize()
options.append( ( label, format, False ) )
return options
- def generate_from_file_for_encode( self, encode_group, build, sep='\t', must_be_valid=False ):
+ def generate_for_encode( self, encode_group, build, sep, must_be_valid=False ):
options = []
def generate():
encode_sets = {}
@@ -214,14 +229,21 @@ class DynamicOptions( object ):
description = fields[ 2 ]
uid = fields[ 3 ]
path = fields[ 4 ]
- try: file_type = fields[ 5 ]
- except: file_type = "bed"
+ try:
+ file_type = fields[ 5 ]
+ except:
+ file_type = "bed"
#TODO: will remove this later, when galaxy can handle gff files
- if file_type != "bed": continue
- if not os.path.isfile( path ): continue
- except: continue
- try: temp = encode_sets[ encode_group ]
- except: encode_sets[ encode_group ] = {}
+ if file_type != "bed":
+ continue
+ if not os.path.isfile( path ):
+ continue
+ except:
+ continue
+ try:
+ temp = encode_sets[ encode_group ]
+ except:
+ encode_sets[ encode_group ] = {}
try:
encode_sets[ encode_group ][ build ].append( ( description, uid, False ) )
except:
@@ -255,7 +277,8 @@ class DynamicOptions( object ):
if int( item[ 'date' ] ) > int( ordered_item[ 'date' ] ):
ordered_build.insert( i, ( description, uid, selected, item ) )
break
- else: ordered_build.append( ( description, uid, selected, item ) )
+ else:
+ ordered_build.append( ( description, uid, selected, item ) )
last_desc = None
last_partitioned = None
for i in range( len( ordered_build ) ) :
@@ -270,15 +293,18 @@ class DynamicOptions( object ):
return encode_sets
d = generate()
if len( d ) < 1:
- if must_be_valid: return []
+ if must_be_valid:
+ return []
return self.no_data_option_not_selected
else:
- try: options = d[ encode_group ][ build ][ 0: ]
+ try:
+ options = d[ encode_group ][ build ][ 0: ]
except:
- if must_be_valid: return []
+ if must_be_valid:
+ return []
return self.no_data_option_not_selected
return options
- def generate_from_file_for_microbial( self, kingdom=None, org=None, feature=None, must_be_valid=False ):
+ def generate_for_microbial( self, kingdom=None, org=None, feature=None, must_be_valid=False ):
options = []
if not kingdom and not org and not feature:
kingdoms = self.from_file_data.keys()
@@ -296,14 +322,15 @@ class DynamicOptions( object ):
if self.from_file_data[ kingdom ][ orgs[ j ] ][ 'name' ] > self.from_file_data[ kingdom ][ orgs[ j + 1 ] ][ 'name' ]:
orgs[ j ], orgs[ j + 1 ] = orgs[ j + 1 ], orgs[ j ]
swap_test = True
- if swap_test == False: break
+ if swap_test == False:
+ break
for org in orgs:
if self.from_file_data[ kingdom ][ org ][ 'link_site' ] == "UCSC":
options.append( ( "" + self.from_file_data[ kingdom ][ org ][ 'name' ] + " (about)", org, False ) )
else:
options.append( ( self.from_file_data[ kingdom ][ org ][ 'name' ] + " (about)", org, False ) )
if options:
- options[0] = ( options[0][0], options[0][1], True)
+ options[0] = ( options[0][0], options[0][1], True )
else:
chroms = self.from_file_data[ kingdom ][ org ][ 'chrs' ].keys()
chroms.sort()
@@ -378,8 +405,10 @@ class DynamicOptions( object ):
if 'data' not in orgs[ org_num ][ 'chrs' ][ chr_acc ]:
orgs[ org_num ][ 'chrs' ][ chr_acc ][ 'data' ] = {}
orgs[ org_num ][ 'chrs' ][ chr_acc ][ 'data' ][ uid ] = data
- else: continue
- except: continue
+ else:
+ continue
+ except:
+ continue
for org_num in orgs:
org = orgs[ org_num ]
if org[ 'kingdom' ] not in microbe_info:
@@ -387,15 +416,14 @@ class DynamicOptions( object ):
if org_num not in microbe_info[ org[ 'kingdom' ] ]:
microbe_info[ org[ 'kingdom' ] ][org_num] = org
self.from_file_data = microbe_info
- def generate_from_dataset_for_species( self, value ):
+ def generate_for_species( self, species ):
options = []
- for species in value:
- options.append( ( species, species, False ) )
+ for s in species:
+ options.append( ( s, s, False ) )
return options
- def generate_from_file_for_maf( self, maf_source, maf_uid, sep='\t', must_be_valid=False ):
+ def generate_for_maf( self, maf_uid, sep, must_be_valid=False ):
options = []
d = {}
- # We will only reach here if the maf-source param value is 'cached'
for line in open( self.from_file ):
line = line.rstrip( '\r\n' )
if line and not line.startswith( '#' ):
@@ -412,19 +440,23 @@ class DynamicOptions( object ):
d[ value_col_data ] = {}
d[ value_col_data ][ 'description' ] = name_col_data
d[ value_col_data ][ 'builds' ] = build_list
- except: continue
+ except:
+ continue
for key in d[ maf_uid ][ 'builds' ]:
options.append( ( key, key, False ) )
if not options:
- if must_be_valid: return []
+ if must_be_valid:
+ return []
return self.no_data_option
return options
- def generate_from_dataset( self, value, value_col, sep='\t', must_be_valid=False ):
+ def generate_from_dataset( self, file_name, value_col, sep, must_be_valid=False ):
options = []
elem_list = []
- try: in_file = open( value, "r" )
+ try:
+ in_file = open( file_name, "r" )
except:
- if must_be_valid: return []
+ if must_be_valid:
+ return []
return self.no_data_option
try:
for line in in_file:
@@ -432,16 +464,18 @@ class DynamicOptions( object ):
if line and not line.startswith( '#' ):
elems = line.split( sep )
elem_list.append( elems[ value_col ] )
- except: pass
+ except:
+ pass
in_file.close()
if not( elem_list ):
- if must_be_valid: return []
+ if must_be_valid:
+ return []
return self.no_elems_option
elem_list = self.get_unique_elems( elem_list )
for elem in elem_list:
options.append( ( elem, elem, False ) )
return options
- def generate_from_file_for_build( self, value, build_col, name_col, value_col, sep='\t', must_be_valid=False ):
+ def generate_for_build( self, build, build_col, name_col, value_col, sep, must_be_valid=False ):
options = []
d = {}
for line in open( self.from_file ):
@@ -458,8 +492,10 @@ class DynamicOptions( object ):
# tool, which seems to be deprecated. Can we eliminate it altogether?
if self.data_file == 'alignseq.loc':
if fields[ build_col ].strip() == 'align':
- try: d[ fields[ name_col ] ].append( fields[ value_col ] )
- except: d[ fields[ name_col ] ] = [ fields[ value_col ] ]
+ try:
+ d[ fields[ name_col ] ].append( fields[ value_col ] )
+ except:
+ d[ fields[ name_col ] ] = [ fields[ value_col ] ]
elif self.data_file == 'regions.loc' or self.data_file == 'phastOdds.loc' or self.data_file == 'binned_scores.loc':
if not fields[ build_col ] in d:
d[ fields[ build_col ] ] = []
@@ -471,40 +507,45 @@ class DynamicOptions( object ):
builds = fields[ build_col ] # armadillo=armadillo,baboon=baboon,galGal2=chicken,...
build_list = []
split_builds = builds.split( ',' )
- for build in split_builds:
- this_build = build.split( '=' )[0]
+ for b in split_builds:
+ this_build = b.split( '=' )[0]
build_list.append( this_build )
d[ maf_uid ] = {}
d[ maf_uid ][ 'description' ] = maf_desc
d[ maf_uid ][ 'builds' ] = build_list
- except: continue
+ except:
+ continue
# TODO: the alignseq.loc file is currently ony used by the "Extract blastz alignments1"
# tool, which seems to be deprecated. Can we eliminate it altogether?
if self.data_file == 'alignseq.loc':
# FIXME: We need a database of descriptive names corresponding to dbkeys.
# We need to resolve the musMusX <--> mmX confusion
- if value[ 0:2 ] == "mm": value = value.replace( 'mm', 'musMus' )
- if value[ 0:2 ] == "rn": value = value.replace( 'rn', 'ratNor' )
- if value in d:
- for val in d[ value ]:
+ if build[ 0:2 ] == "mm":
+ build = build.replace( 'mm', 'musMus' )
+ if build[ 0:2 ] == "rn":
+ build = build.replace( 'rn', 'ratNor' )
+ if build in d:
+ for val in d[ build ]:
options.append( ( val, val, False ) )
elif self.data_file == 'regions.loc' or self.data_file == 'phastOdds.loc' or self.data_file == 'binned_scores.loc':
- if value in d:
- for (key, val) in d[ value ]:
+ if build in d:
+ for (key, val) in d[ build ]:
options.append( ( key, val, False ) )
elif self.data_file == 'maf_index.loc' or self.data_file == 'maf_pairwise.loc':
for key in d:
- if value in d[ key ][ 'builds' ]:
+ if build in d[ key ][ 'builds' ]:
options.append( ( d[ key ][ 'description' ], key, False ) )
if not options:
- if must_be_valid: return []
+ if must_be_valid:
+ return []
return self.no_data_option
if not options:
- if must_be_valid: return []
+ if must_be_valid:
+ return []
return self.unspecified_build_option
return options
- def generate_from_file( self, name_col, value_col, sep='\t' ):
+ def generate( self, name_col, value_col, sep ):
options = []
for line in open( self.from_file ):
line = line.rstrip( '\r\n' )
diff --git a/lib/galaxy/web/controllers/root.py b/lib/galaxy/web/controllers/root.py
index d335bdf91ee..472384123c7 100644
--- a/lib/galaxy/web/controllers/root.py
+++ b/lib/galaxy/web/controllers/root.py
@@ -421,8 +421,10 @@ class Universe( BaseController ):
@web.expose
def dataset_state ( self, trans, id=None, stamp=None ):
if id is not None:
- try: data = self.app.model.Dataset.get( id )
- except: return trans.show_error_message( "Unable to check dataset $id.")
+ try:
+ data = self.app.model.Dataset.get( id )
+ except:
+ return trans.show_error_message( "Unable to check dataset $id.")
trans.response.headers['X-Dataset-State'] = data.state
trans.response.headers['Pragma'] = 'no-cache'
trans.response.headers['Expires'] = '0'
@@ -433,8 +435,10 @@ class Universe( BaseController ):
@web.expose
def dataset_code( self, trans, id=None, hid=None, stamp=None ):
if id is not None:
- try: data = self.app.model.Dataset.get( id )
- except: return trans.show_error_message( "Unable to check dataset $id.")
+ try:
+ data = self.app.model.Dataset.get( id )
+ except:
+ return trans.show_error_message( "Unable to check dataset $id.")
trans.response.headers['Pragma'] = 'no-cache'
trans.response.headers['Expires'] = '0'
return trans.fill_template("dataset_code.tmpl", data=data, hid=hid)
diff --git a/tools/data_source/encode_import_all_latest_datasets.xml b/tools/data_source/encode_import_all_latest_datasets.xml
index 61731cdeada..237cf29e860 100644
--- a/tools/data_source/encode_import_all_latest_datasets.xml
+++ b/tools/data_source/encode_import_all_latest_datasets.xml
@@ -6,13 +6,13 @@
hg16 (most recent datasets in bold)
$hg16
-
+
-
+
diff --git a/tools/data_source/encode_import_chromatin_and_chromosomes.xml b/tools/data_source/encode_import_chromatin_and_chromosomes.xml
index 4712068e278..9985f645c74 100644
--- a/tools/data_source/encode_import_chromatin_and_chromosomes.xml
+++ b/tools/data_source/encode_import_chromatin_and_chromosomes.xml
@@ -6,13 +6,13 @@
hg16 (most recent datasets in bold)
$hg16
-
+
-
+
diff --git a/tools/data_source/encode_import_gencode.xml b/tools/data_source/encode_import_gencode.xml
index f31b5617e48..9b64d3cc55b 100644
--- a/tools/data_source/encode_import_gencode.xml
+++ b/tools/data_source/encode_import_gencode.xml
@@ -6,13 +6,13 @@
hg16 (most recent datasets in bold)
$hg16
-
+
-
+
diff --git a/tools/data_source/encode_import_genes_and_transcripts.xml b/tools/data_source/encode_import_genes_and_transcripts.xml
index a5a493fd898..d93740d1c71 100644
--- a/tools/data_source/encode_import_genes_and_transcripts.xml
+++ b/tools/data_source/encode_import_genes_and_transcripts.xml
@@ -6,13 +6,13 @@
hg16 (most recent datasets in bold)
$hg16
-
+
-
+
diff --git a/tools/data_source/encode_import_multi-species_sequence_analysis.xml b/tools/data_source/encode_import_multi-species_sequence_analysis.xml
index 982fc564d3b..d6cbed08adf 100644
--- a/tools/data_source/encode_import_multi-species_sequence_analysis.xml
+++ b/tools/data_source/encode_import_multi-species_sequence_analysis.xml
@@ -6,13 +6,13 @@
hg16 (most recent datasets in bold)
$hg16
-
+
-
+
diff --git a/tools/data_source/encode_import_transcription_regulation.xml b/tools/data_source/encode_import_transcription_regulation.xml
index 26db457e369..83dceedd494 100644
--- a/tools/data_source/encode_import_transcription_regulation.xml
+++ b/tools/data_source/encode_import_transcription_regulation.xml
@@ -6,13 +6,13 @@
hg16 (most recent datasets in bold)
$hg16
-
+
-
+
diff --git a/tools/data_source/microbial_import.xml b/tools/data_source/microbial_import.xml
index 9b67a4b7f74..5e616fd45b9 100644
--- a/tools/data_source/microbial_import.xml
+++ b/tools/data_source/microbial_import.xml
@@ -6,7 +6,7 @@
Select the Desired Kingdom
$kingdom
-
+
@@ -14,7 +14,7 @@
Select the Desired Organism
$org
-
+
@@ -30,49 +30,49 @@
Select Desired Glimmer3 Annotations
$Glimmer3
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/tools/data_source/upload.xml b/tools/data_source/upload.xml
index 55f3b5d6d2f..f4e5919a5ef 100644
--- a/tools/data_source/upload.xml
+++ b/tools/data_source/upload.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/tools/extract/genebed_maf_to_fasta.xml b/tools/extract/genebed_maf_to_fasta.xml
index 697f74f3d25..80afe71c7b7 100644
--- a/tools/extract/genebed_maf_to_fasta.xml
+++ b/tools/extract/genebed_maf_to_fasta.xml
@@ -15,7 +15,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
diff --git a/tools/extract/interval_maf_to_merged_fasta.xml b/tools/extract/interval_maf_to_merged_fasta.xml
index 1ebf27489fb..0cbe851089e 100644
--- a/tools/extract/interval_maf_to_merged_fasta.xml
+++ b/tools/extract/interval_maf_to_merged_fasta.xml
@@ -16,7 +16,7 @@
-
+
@@ -32,7 +32,7 @@
-
+