protk 1.3.1.pre3 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +21 -19
- data/bin/add_retention_times.rb +1 -1
- data/bin/interprophet.rb +16 -5
- data/bin/make_decoy.rb +1 -1
- data/bin/manage_db.rb +1 -1
- data/bin/mascot_search.rb +2 -2
- data/bin/mascot_to_pepxml.rb +1 -1
- data/bin/msgfplus_search.rb +26 -9
- data/bin/omssa_search.rb +1 -1
- data/bin/peptide_prophet.rb +57 -20
- data/bin/pepxml_to_table.rb +15 -2
- data/bin/protein_prophet.rb +41 -1
- data/bin/protk_setup.rb +2 -2
- data/bin/protxml_to_gff.rb +50 -42
- data/bin/protxml_to_psql.rb +1 -1
- data/bin/protxml_to_table.rb +16 -3
- data/bin/repair_run_summary.rb +1 -1
- data/bin/sixframe.rb +2 -2
- data/bin/swissprot_to_table.rb +1 -1
- data/bin/tandem_search.rb +1 -1
- data/bin/tandem_to_pepxml.rb +1 -1
- data/lib/protk/constants.rb +2 -1
- data/lib/protk/convert_util.rb +1 -1
- data/lib/protk/data/tandem-style.css +349 -0
- data/lib/protk/data/tandem-style.xsl +264 -0
- data/lib/protk/data/tandem_gpm_defaults.xml +3 -3
- data/lib/protk/data/tandem_isb_kscore_defaults.xml +2 -0
- data/lib/protk/data/tandem_isb_native_defaults.xml +3 -0
- data/lib/protk/data/tandem_params.xml +0 -8
- data/lib/protk/fastadb.rb +1 -1
- data/lib/protk/galaxy_stager.rb +14 -3
- data/lib/protk/galaxy_util.rb +39 -31
- data/lib/protk/gffdb.rb +6 -1
- data/lib/protk/manage_db_rakefile.rake +1 -1
- data/lib/protk/manage_db_tool.rb +1 -1
- data/lib/protk/pepxml.rb +159 -7
- data/lib/protk/plasmodb.rb +1 -1
- data/lib/protk/prophet_tool.rb +20 -52
- data/lib/protk/setup_rakefile.rake +18 -11
- data/lib/protk/tandem_search_tool.rb +20 -7
- data/lib/protk/tool.rb +1 -1
- data/lib/protk/uniprot_mapper.rb +1 -1
- metadata +10 -14
data/lib/protk/manage_db_tool.rb
CHANGED
data/lib/protk/pepxml.rb
CHANGED
@@ -1,22 +1,174 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require '
|
3
|
-
|
2
|
+
require 'libxml'
|
3
|
+
|
4
|
+
include LibXML
|
5
|
+
|
6
|
+
# require 'rexml/document'
|
7
|
+
# require 'rexml/xpath'
|
4
8
|
|
5
9
|
class PepXML
|
10
|
+
|
11
|
+
attr_accessor :file_name
|
12
|
+
|
6
13
|
def initialize(file_name)
|
7
|
-
@
|
14
|
+
@file_name=file_name
|
15
|
+
|
16
|
+
XML::Error.set_handler(&XML::Error::QUIET_HANDLER)
|
17
|
+
pepxml_parser=XML::Parser.file("#{file_name}")
|
18
|
+
|
19
|
+
@pepxml_ns_prefix="xmlns:"
|
20
|
+
@pepxml_ns="xmlns:http://regis-web.systemsbiology.net/pepXML"
|
21
|
+
@pepxml_doc=pepxml_parser.parse
|
22
|
+
if not @pepxml_doc.root.namespaces.default
|
23
|
+
@pepxml_ns_prefix=""
|
24
|
+
@pepxml_ns=nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
# Obtain the database name from the given input file
|
31
|
+
#
|
32
|
+
def extract_db()
|
33
|
+
reader = XML::Reader.file(self.file_name)
|
34
|
+
throw "Failed to open xml file #{file_name}" unless reader!=nil
|
35
|
+
|
36
|
+
while(reader.read)
|
37
|
+
# For pep.xml files
|
38
|
+
#
|
39
|
+
if ( reader.name == "search_database" )
|
40
|
+
dbnode=reader.expand
|
41
|
+
dbvalue=dbnode['local_path']
|
42
|
+
reader.close
|
43
|
+
return dbvalue
|
44
|
+
end
|
45
|
+
|
46
|
+
# For prot.xml files
|
47
|
+
#
|
48
|
+
if ( reader.name == "protein_summary_header" )
|
49
|
+
dbnode=reader.expand
|
50
|
+
dbvalue=dbnode['reference_database']
|
51
|
+
reader.close
|
52
|
+
return dbvalue
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
# Obtain the search engine name from the input file
|
64
|
+
# The name of the engine is returned in lowercase and should contain no spaces
|
65
|
+
# Names of common engines are searched for and extracted in simplified form if possible
|
66
|
+
#
|
67
|
+
def extract_engine()
|
68
|
+
reader = XML::Reader.file(self.file_name)
|
69
|
+
throw "Failed to open xml file #{file_name}" unless reader!=nil
|
70
|
+
|
71
|
+
while(reader.read)
|
72
|
+
if ( reader.name == "search_summary" )
|
73
|
+
dbnode=reader.expand
|
74
|
+
dbvalue=dbnode['search_engine']
|
75
|
+
reader.close
|
76
|
+
engine_name=dbvalue.gsub(/ /,"_")
|
77
|
+
engine_name=engine_name.gsub(/\(/,"")
|
78
|
+
engine_name=engine_name.gsub(/\)/,"")
|
79
|
+
engine_name=engine_name.gsub(/\!/,"")
|
80
|
+
return engine_name.downcase
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
def extract_enzyme()
|
87
|
+
reader = XML::Reader.file(self.file_name)
|
88
|
+
throw "Failed to open xml file #{file_name}" unless reader!=nil
|
89
|
+
|
90
|
+
while(reader.read)
|
91
|
+
if ( reader.name == "sample_enzyme" )
|
92
|
+
dbnode=reader.expand
|
93
|
+
dbvalue=dbnode['name']
|
94
|
+
reader.close
|
95
|
+
return dbvalue.downcase
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
def type_from_base_name(basename)
|
103
|
+
# A common error is for tools to include the extension in the base_name attribute.
|
104
|
+
# We exploit this to guess the type
|
105
|
+
ext_guess=""
|
106
|
+
case basename
|
107
|
+
when /.mgf$/
|
108
|
+
ext_guess="mgf"
|
109
|
+
when /.mzML$/
|
110
|
+
ext_guess="mzML"
|
111
|
+
when /.mzXML$/
|
112
|
+
ext_guess="mzXML"
|
113
|
+
else
|
114
|
+
ext_guess=""
|
115
|
+
end
|
116
|
+
ext_guess
|
117
|
+
end
|
118
|
+
|
119
|
+
def type_from_summary_attributes(atts)
|
120
|
+
if is_valid_type(atts["raw_data_type"])
|
121
|
+
return atts["raw_data_type"]
|
122
|
+
end
|
123
|
+
|
124
|
+
if is_valid_type(atts["raw_data"])
|
125
|
+
return atts["raw_data"]
|
126
|
+
end
|
127
|
+
return ""
|
128
|
+
end
|
129
|
+
|
130
|
+
def is_valid_type(type)
|
131
|
+
case type
|
132
|
+
when /^mgf$/i
|
133
|
+
return true
|
134
|
+
when /^mzML$/i
|
135
|
+
return true
|
136
|
+
when /^mzXML$/i
|
137
|
+
return true
|
138
|
+
else
|
139
|
+
return false
|
140
|
+
end
|
8
141
|
end
|
9
142
|
|
10
|
-
|
143
|
+
|
144
|
+
# TODO: Make this faster and more memory efficient by using XML::Reader as in the functions above
|
145
|
+
#
|
146
|
+
def find_runs()
|
147
|
+
|
148
|
+
|
149
|
+
run_summaries = @pepxml_doc.find("//#{@pepxml_ns_prefix}msms_run_summary", @pepxml_ns)
|
150
|
+
|
11
151
|
runs = {}
|
12
|
-
|
152
|
+
run_summaries.each do |summary|
|
13
153
|
base_name = summary.attributes["base_name"]
|
14
154
|
if not runs.has_key?(base_name)
|
15
|
-
|
16
|
-
|
155
|
+
bn = summary.attributes["base_name"]
|
156
|
+
|
157
|
+
runs[base_name] = {:base_name => summary.attributes["base_name"]}
|
158
|
+
|
159
|
+
if is_valid_type(type_from_summary_attributes(summary.attributes))
|
160
|
+
runs[base_name][:type] = type_from_summary_attributes(summary.attributes)
|
161
|
+
elsif is_valid_type(type_from_base_name(bn))
|
162
|
+
runs[base_name][:type] = type_from_base_name(bn)
|
163
|
+
else
|
164
|
+
runs[base_name][:type] = "mzML" # Same guess as peptide prophet makes
|
165
|
+
end
|
166
|
+
|
17
167
|
end
|
18
168
|
end
|
19
169
|
runs
|
20
170
|
end
|
171
|
+
|
172
|
+
|
21
173
|
|
22
174
|
end
|
data/lib/protk/plasmodb.rb
CHANGED
data/lib/protk/prophet_tool.rb
CHANGED
@@ -21,63 +21,31 @@ class ProphetTool < SearchTool
|
|
21
21
|
|
22
22
|
super(option_support)
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
# Obtain the database name from the given input file
|
29
|
-
#
|
30
|
-
def extract_db(file_name)
|
31
|
-
reader = XML::Reader.file(file_name)
|
32
|
-
throw "Failed to open xml file #{file_name}" unless reader!=nil
|
33
|
-
|
34
|
-
while(reader.read)
|
35
|
-
# For pep.xml files
|
36
|
-
#
|
37
|
-
if ( reader.name == "search_database" )
|
38
|
-
dbnode=reader.expand
|
39
|
-
dbvalue=dbnode['local_path']
|
40
|
-
reader.close
|
41
|
-
return dbvalue
|
42
|
-
end
|
43
|
-
|
44
|
-
# For prot.xml files
|
45
|
-
#
|
46
|
-
if ( reader.name == "protein_summary_header" )
|
47
|
-
dbnode=reader.expand
|
48
|
-
dbvalue=dbnode['reference_database']
|
49
|
-
reader.close
|
50
|
-
return dbvalue
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
|
24
|
+
if ( option_support.include? :probability_threshold )
|
25
|
+
add_value_option(:probability_threshold,0.05,['--p-thresh val', 'Probability threshold below which PSMs are discarded'])
|
55
26
|
end
|
56
27
|
|
57
28
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
# Obtain the search engine name from the input file
|
62
|
-
# The name of the engine is returned in lowercase and should contain no spaces
|
63
|
-
# Names of common engines are searched for and extracted in simplified form if possible
|
29
|
+
|
30
|
+
# TODO: Deal with multiple enzyme combos
|
64
31
|
#
|
65
|
-
def
|
66
|
-
|
67
|
-
|
32
|
+
def self.xinteract_code_for_enzyme(enzyme_name)
|
33
|
+
|
34
|
+
codes = {
|
35
|
+
'trypsin' => 'T',
|
36
|
+
'stricttrypsin' => 'S',
|
37
|
+
'chymotrypsin' => 'C',
|
38
|
+
'ralphtrypsin' => 'R',
|
39
|
+
'aspn' => 'A',
|
40
|
+
'gluc' => 'G',
|
41
|
+
'glucbicarb' => 'B',
|
42
|
+
'cnbr' => 'M',
|
43
|
+
'elastase' => 'E',
|
44
|
+
'lysn' => 'L',
|
45
|
+
'nonspecific' => 'N'
|
46
|
+
}
|
47
|
+
codes[enzyme_name]
|
68
48
|
|
69
|
-
while(reader.read)
|
70
|
-
if ( reader.name == "search_summary" )
|
71
|
-
dbnode=reader.expand
|
72
|
-
dbvalue=dbnode['search_engine']
|
73
|
-
reader.close
|
74
|
-
engine_name=dbvalue.gsub(/ /,"_")
|
75
|
-
engine_name=engine_name.gsub(/\(/,"")
|
76
|
-
engine_name=engine_name.gsub(/\)/,"")
|
77
|
-
engine_name=engine_name.gsub(/\!/,"")
|
78
|
-
return engine_name.downcase
|
79
|
-
end
|
80
|
-
end
|
81
49
|
end
|
82
50
|
|
83
51
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
|
2
2
|
require 'protk/constants.rb'
|
3
|
+
require 'rake/clean'
|
3
4
|
require 'rbconfig'
|
4
5
|
|
5
|
-
env=Constants.
|
6
|
+
env=Constants.instance
|
6
7
|
|
7
8
|
@build_dir = "#{env.protk_dir}/tmp/build"
|
8
9
|
@download_dir = "#{env.protk_dir}/tmp/download"
|
@@ -10,6 +11,8 @@ env=Constants.new
|
|
10
11
|
directory @build_dir
|
11
12
|
directory @download_dir
|
12
13
|
|
14
|
+
CLEAN.include @build_dir, @download_dir
|
15
|
+
|
13
16
|
def package_manager_name
|
14
17
|
package_managers = ["brew","yum","apt-get"]
|
15
18
|
|
@@ -30,7 +33,7 @@ def clean_build_dir
|
|
30
33
|
end
|
31
34
|
|
32
35
|
def download_buildfile url, file
|
33
|
-
sh %{cd #{@download_dir}; wget
|
36
|
+
sh %{cd #{@download_dir}; wget -O #{file} #{url}}
|
34
37
|
end
|
35
38
|
|
36
39
|
def download_task url, packagefile
|
@@ -133,10 +136,10 @@ task :perl_locallib => [perl_locallib_installed_file]
|
|
133
136
|
#
|
134
137
|
# TPP
|
135
138
|
#
|
136
|
-
tpp_version="4.
|
139
|
+
tpp_version="4.8.0"
|
137
140
|
tpp_packagefile="TPP-#{tpp_version}.tgz"
|
138
141
|
tpp_installed_file = "#{env.tpp_root}/bin/xinteract"
|
139
|
-
tpp_url = "
|
142
|
+
tpp_url = "http://sourceforge.net/projects/sashimi/files/Trans-Proteomic%20Pipeline%20%28TPP%29/TPP%20v4.8%20%28philae%29%20rev%200/TPP_4.8.0-src.tgz/download"
|
140
143
|
|
141
144
|
tpp_download_file = download_task tpp_url, tpp_packagefile
|
142
145
|
|
@@ -229,10 +232,11 @@ def blast_platform
|
|
229
232
|
'x64-linux'
|
230
233
|
end
|
231
234
|
|
232
|
-
blast_version="2.2.
|
235
|
+
blast_version="2.2.30+"
|
233
236
|
blast_packagefile="ncbi-blast-#{blast_version}-#{blast_platform}.tar.gz"
|
234
237
|
blast_url="ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/#{blast_version.chomp('+')}/#{blast_packagefile}"
|
235
238
|
blast_installed_file="#{env.blast_root}/bin/makeblastdb"
|
239
|
+
blast_required_bin=["makeblastdb", "blastdbcmd"]
|
236
240
|
|
237
241
|
download_task blast_url, blast_packagefile
|
238
242
|
|
@@ -241,8 +245,10 @@ file blast_installed_file => [@build_dir,"#{@download_dir}/#{blast_packagefile}"
|
|
241
245
|
sh %{cp #{@download_dir}/#{blast_packagefile} #{@build_dir}}
|
242
246
|
sh %{cd #{@build_dir}; gunzip #{blast_packagefile}}
|
243
247
|
sh %{cd #{@build_dir}; tar -xvf #{blast_packagefile.chomp('.gz')}}
|
244
|
-
sh %{mkdir -p #{env.blast_root}}
|
245
|
-
|
248
|
+
sh %{mkdir -p #{env.blast_root}/bin}
|
249
|
+
blast_required_bin.each do |binary|
|
250
|
+
sh %{cd #{@build_dir}; cp -r ncbi-blast-#{blast_version}/bin/#{binary} #{env.blast_root}/bin/}
|
251
|
+
end
|
246
252
|
end
|
247
253
|
|
248
254
|
task :blast => blast_installed_file
|
@@ -251,7 +257,7 @@ task :blast => blast_installed_file
|
|
251
257
|
#
|
252
258
|
# MSGFPlus
|
253
259
|
#
|
254
|
-
msgfplus_version="
|
260
|
+
msgfplus_version="20140630"
|
255
261
|
msgfplus_packagefile="MSGFPlus.#{msgfplus_version}.zip"
|
256
262
|
msgfplus_url="http://proteomics.ucsd.edu/Software/MSGFPlus/MSGFPlus.#{msgfplus_version}.zip"
|
257
263
|
msgfplus_installed_file="#{env.msgfplus_root}/MSGFPlus.jar"
|
@@ -274,7 +280,7 @@ def pwiz_platform
|
|
274
280
|
if RbConfig::CONFIG['host_os'] =~ /darwin/
|
275
281
|
return 'darwin-x86-xgcc40'
|
276
282
|
end
|
277
|
-
'linux-x86_64-
|
283
|
+
'linux-x86_64-gcc48'
|
278
284
|
end
|
279
285
|
|
280
286
|
def platform_bunzip
|
@@ -284,7 +290,7 @@ def platform_bunzip
|
|
284
290
|
'bunzip2'
|
285
291
|
end
|
286
292
|
|
287
|
-
pwiz_version="
|
293
|
+
pwiz_version="3_0_6790"
|
288
294
|
pwiz_folder_name="pwiz-bin-#{pwiz_platform}-release-#{pwiz_version}"
|
289
295
|
pwiz_packagefile="#{pwiz_folder_name}.tar.bz2"
|
290
296
|
pwiz_url="https://dl.dropbox.com/u/226794/#{pwiz_packagefile}"
|
@@ -297,7 +303,8 @@ file pwiz_installed_file => [@build_dir,"#{@download_dir}/#{pwiz_packagefile}"]
|
|
297
303
|
sh %{cd #{@build_dir}; #{platform_bunzip} -f #{pwiz_packagefile}}
|
298
304
|
sh %{cd #{@build_dir}; tar -xvf #{pwiz_packagefile.chomp('.bz2')}}
|
299
305
|
sh %{mkdir -p #{env.pwiz_root}}
|
300
|
-
sh %{cd #{@build_dir}; cp
|
306
|
+
sh %{cd #{@build_dir}; cp ./msconvert #{env.pwiz_root}/}
|
307
|
+
sh %{cd #{@build_dir}; cp ./idconvert #{env.pwiz_root}/}
|
301
308
|
end
|
302
309
|
|
303
310
|
task :pwiz => pwiz_installed_file
|
@@ -48,7 +48,8 @@ class TandemSearchTool < SearchTool
|
|
48
48
|
:fragment_tolu => "spectrum, fragment monoisotopic mass error units",
|
49
49
|
:acetyl_nterm => "protein, quick acetyl",
|
50
50
|
:output_spectra => "output, spectra",
|
51
|
-
:threads => "spectrum, threads"
|
51
|
+
:threads => "spectrum, threads",
|
52
|
+
:enzyme => "protein, cleavage site"
|
52
53
|
}
|
53
54
|
|
54
55
|
@xtandem_keys_for_precursor_tol = {
|
@@ -61,7 +62,7 @@ class TandemSearchTool < SearchTool
|
|
61
62
|
|
62
63
|
@option_parser.banner = "Run an X!Tandem msms search on a set of mzML input files.\n\nUsage: tandem_search.rb [options] file1.mzML file2.mzML ..."
|
63
64
|
@options.output_suffix="_tandem"
|
64
|
-
|
65
|
+
@options.enzyme="[RK]|{P}"
|
65
66
|
add_value_option(:tandem_params,"isb_native",['-T', '--tandem-params tandem', 'Either the full path to an xml file containing a complete set of default parameters, or one of the following (isb_native,isb_kscore,gpm). Default is isb_native'])
|
66
67
|
add_boolean_option(:keep_params_files,false,['-K', '--keep-params-files', 'Keep X!Tandem parameter files'])
|
67
68
|
add_boolean_option(:output_spectra,false,['--output-spectra', 'Include spectra in the output file'])
|
@@ -71,12 +72,24 @@ class TandemSearchTool < SearchTool
|
|
71
72
|
private
|
72
73
|
# Galaxy changes things like @ to __at__ we need to change it back
|
73
74
|
#
|
74
|
-
def
|
75
|
+
def decode_galaxy_string(mstring)
|
75
76
|
mstring.gsub!("__at__","@")
|
76
77
|
mstring.gsub!("__oc__","{")
|
77
78
|
mstring.gsub!("__cc__","}")
|
78
79
|
mstring.gsub!("__ob__","[")
|
79
80
|
mstring.gsub!("__cb__","]")
|
81
|
+
mstring.gsub!("__gt__",">")
|
82
|
+
mstring.gsub!("__lt__","<")
|
83
|
+
mstring.gsub!("__sq__","'")
|
84
|
+
mstring.gsub!("__dq__","\"")
|
85
|
+
mstring.gsub!("__cn__","\n")
|
86
|
+
mstring.gsub!("__cr__","\r")
|
87
|
+
mstring.gsub!("__tc__","\t")
|
88
|
+
mstring.gsub!("__pd__","#")
|
89
|
+
|
90
|
+
# For characters not allowed at all by galaxy
|
91
|
+
mstring.gsub!("__pc__","|")
|
92
|
+
|
80
93
|
mstring
|
81
94
|
end
|
82
95
|
|
@@ -157,7 +170,6 @@ class TandemSearchTool < SearchTool
|
|
157
170
|
set_option(std_params,"protein, taxon",db_info.name)
|
158
171
|
|
159
172
|
|
160
|
-
|
161
173
|
# set_option(std_params, "protein, cleavage semi", self.cleavage_semi ? "yes" : "no")
|
162
174
|
|
163
175
|
# Simple options (unique with a 1:1 mapping to parameters from this tool)
|
@@ -168,7 +180,7 @@ class TandemSearchTool < SearchTool
|
|
168
180
|
if opt_val.is_a?(TrueClass) || opt_val.is_a?(FalseClass)
|
169
181
|
opt_val = opt_val ? "yes" : "no"
|
170
182
|
end
|
171
|
-
append_option(std_params,xtandem_key,opt_val.to_s)
|
183
|
+
append_option(std_params,xtandem_key,decode_galaxy_string(opt_val.to_s))
|
172
184
|
end
|
173
185
|
end
|
174
186
|
|
@@ -182,6 +194,7 @@ class TandemSearchTool < SearchTool
|
|
182
194
|
end
|
183
195
|
end
|
184
196
|
|
197
|
+
|
185
198
|
# Per residue Fixed and Variable Modifications
|
186
199
|
#
|
187
200
|
# These can be added using a variety of methods in xtandem
|
@@ -195,7 +208,7 @@ class TandemSearchTool < SearchTool
|
|
195
208
|
#
|
196
209
|
|
197
210
|
var_mods = self.var_mods.split(",").collect { |mod| mod.lstrip.rstrip }.reject {|e| e.empty? }
|
198
|
-
var_mods=var_mods.collect {|mod|
|
211
|
+
var_mods=var_mods.collect {|mod| decode_galaxy_string(mod) }
|
199
212
|
|
200
213
|
# var_mods allows motif's as well as standard mods. These should be in a separate array
|
201
214
|
var_motifs = [].replace(var_mods)
|
@@ -203,7 +216,7 @@ class TandemSearchTool < SearchTool
|
|
203
216
|
var_motifs.keep_if {|mod| mod.xtandem_modification_motif? }
|
204
217
|
|
205
218
|
fix_mods = self.fix_mods.split(",").collect { |mod| mod.lstrip.rstrip }.reject { |e| e.empty? }
|
206
|
-
fix_mods=fix_mods.collect {|mod|
|
219
|
+
fix_mods=fix_mods.collect {|mod| decode_galaxy_string(mod)}
|
207
220
|
|
208
221
|
# We also support the --glyco and --methionineo shortcuts.
|
209
222
|
# Add these here. No check is made for duplication
|