ms-in_silico 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/History +5 -1
- data/{MIT-LICENSE → LICENSE} +0 -0
- data/{README → README.rdoc} +0 -0
- data/Rakefile +43 -0
- data/VERSION +1 -0
- data/lib/ms/in_silico/digester.rb +42 -18
- data/lib/ms/in_silico/spectrum.rb +2 -2
- data/spec/ms/in_silico/digester_spec.rb +301 -0
- data/spec/ms/in_silico/fragment_spec.rb +19 -0
- data/spec/ms/in_silico/spectrum_spec.rb +68 -0
- data/spec/readme_spec.rb +30 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/tap_test_helper.rb +2 -0
- data/{test → spec}/tap_test_suite.rb +0 -0
- data/test/ms/in_silico/digest_test.rb +72 -0
- data/test/ms/in_silico/fragment_test.rb +36 -0
- metadata +84 -32
data/History
CHANGED
data/{MIT-LICENSE → LICENSE}
RENAMED
File without changes
|
data/{README → README.rdoc}
RENAMED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'jeweler'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
require 'rcov/rcovtask'
|
6
|
+
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = "ms-in_silico"
|
9
|
+
gem.summary = 'in-silico calculations for mass spec data'
|
10
|
+
gem.description = 'peptide fragmentation and protein digestion'
|
11
|
+
gem.email = "jtprince@gmail.com"
|
12
|
+
gem.homepage = "http://github.com/jtprince/ms-in_silico"
|
13
|
+
gem.authors = ["Simon Chiang"]
|
14
|
+
gem.rubyforge_project = "mspire"
|
15
|
+
gem.add_dependency("molecules", ">= 0.2.0")
|
16
|
+
gem.add_dependency("tap", ">= 0.17.0")
|
17
|
+
gem.add_development_dependency("tap-test", ">= 0.1.0")
|
18
|
+
gem.add_development_dependency("spec-more", ">= 0")
|
19
|
+
end
|
20
|
+
Jeweler::GemcutterTasks.new
|
21
|
+
|
22
|
+
Rake::TestTask.new(:spec) do |spec|
|
23
|
+
spec.libs << 'lib' << 'spec'
|
24
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
25
|
+
spec.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
Rcov::RcovTask.new do |spec|
|
29
|
+
spec.libs << 'spec'
|
30
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
31
|
+
spec.verbose = true
|
32
|
+
end
|
33
|
+
|
34
|
+
task :default => :spec
|
35
|
+
|
36
|
+
Rake::RDocTask.new do |rdoc|
|
37
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
38
|
+
|
39
|
+
rdoc.rdoc_dir = 'rdoc'
|
40
|
+
rdoc.title = "ms-in_silico #{version}"
|
41
|
+
rdoc.rdoc_files.include('README*')
|
42
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
43
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.4.0
|
@@ -239,25 +239,49 @@ module Ms
|
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
242
|
-
ARG_C =
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
242
|
+
# ARG_C = mascot_parse('Arg-C C-Term R P no no')
|
243
|
+
# ENZYMES[:arg_c] = ARG_C
|
244
|
+
ENZYMES = {
|
245
|
+
:arg_c => 'Arg-C C-Term R P no no',
|
246
|
+
:asp_n => 'Asp-N N-Term BD no no',
|
247
|
+
:asp_n_ambic => 'Asp-N_ambic N-Term DE no no',
|
248
|
+
:chymotrypsin => 'Chymotrypsin C-Term FLWY P no no',
|
249
|
+
:cnbr => 'CNBr C-Term M no no',
|
250
|
+
:lys_c => 'Lys-C C-Term K P no no',
|
251
|
+
:lys_c_p => 'Lys-C/P C-Term K no no',
|
252
|
+
:pepsin_a => 'PepsinA C-Term FL no no',
|
253
|
+
:tryp_cnbr => 'Tryp-CNBr C-Term KMR P no no',
|
254
|
+
:tryp_chymo => 'TrypChymo C-Term FKLRWY P no no',
|
255
|
+
:trypsin_p => 'Trypsin/P C-Term KR no no',
|
256
|
+
:v8_de => 'V8-DE C-Term BDEZ P no no',
|
257
|
+
:v8_e => 'V8-E C-Term EZ P no no',
|
258
|
+
:trypsin => 'Trypsin C-Term KR P no no',
|
259
|
+
:v8_e_trypsin => 'V8-E+Trypsin C-Term EKRZ P no no',
|
260
|
+
:v8_de_trypsin => 'V8-DE+Trypsin C-Term BDEKRZ P no no',
|
261
|
+
:arg_c => 'Arg-C C-Term R P no no',
|
262
|
+
:asp_n => 'Asp-N N-Term BD no no',
|
263
|
+
:asp_n_ambic => 'Asp-N_ambic N-Term DE no no',
|
264
|
+
:chymotrypsin => 'Chymotrypsin C-Term FLWY P no no',
|
265
|
+
:cnbr => 'CNBr C-Term M no no',
|
266
|
+
:lys_c => 'Lys-C C-Term K P no no',
|
267
|
+
:lys_c_p => 'Lys-C/P C-Term K no no',
|
268
|
+
:pepsin_a => 'PepsinA C-Term FL no no',
|
269
|
+
:tryp_cnbr => 'Tryp-CNBr C-Term KMR P no no',
|
270
|
+
:tryp_chymo => 'TrypChymo C-Term FKLRWY P no no',
|
271
|
+
:trypsin_p => 'Trypsin/P C-Term KR no no',
|
272
|
+
:v8_de => 'V8-DE C-Term BDEZ P no no',
|
273
|
+
:v8_e => 'V8-E C-Term EZ P no no',
|
274
|
+
:trypsin => 'Trypsin C-Term KR P no no',
|
275
|
+
:v8_e_trypsin => 'V8-E+Trypsin C-Term EKRZ P no no',
|
276
|
+
:v8_de_trypsin => 'V8-DE+Trypsin C-Term BDEKRZ P no no',
|
277
|
+
}
|
278
|
+
ENZYMES.each do |k,v|
|
279
|
+
self.const_set(k.upcase, mascot_parse(v))
|
280
|
+
ENZYMES[k] = self.const_get(k.upcase)
|
281
|
+
end
|
282
|
+
|
259
283
|
include Constants::Library
|
260
284
|
library.index_by_attribute :name
|
261
285
|
end
|
262
286
|
end
|
263
|
-
end
|
287
|
+
end
|
@@ -149,7 +149,7 @@ module Ms
|
|
149
149
|
hash = {}
|
150
150
|
0.upto(residues_to_locate.length-1) do |index|
|
151
151
|
letter = residues_to_locate[index, 1]
|
152
|
-
byte = letter[0]
|
152
|
+
byte = letter[0,1].ord
|
153
153
|
hash[letter] = locations[byte]
|
154
154
|
end
|
155
155
|
|
@@ -454,4 +454,4 @@ module Ms
|
|
454
454
|
end
|
455
455
|
end
|
456
456
|
end
|
457
|
-
end
|
457
|
+
end
|
@@ -0,0 +1,301 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
require 'ms/in_silico/digester'
|
4
|
+
require 'pp'
|
5
|
+
|
6
|
+
describe 'a digester' do
|
7
|
+
before do
|
8
|
+
@digester = Ms::InSilico::Digester.new('arg', 'R')
|
9
|
+
end
|
10
|
+
|
11
|
+
def spp(input, str="")
|
12
|
+
PP.singleline_pp(input, str)
|
13
|
+
end
|
14
|
+
|
15
|
+
def nk_string(n, split)
|
16
|
+
str = []
|
17
|
+
count = 0
|
18
|
+
|
19
|
+
(n * 1000).times do
|
20
|
+
count += 1
|
21
|
+
if count < split
|
22
|
+
str << 'A'
|
23
|
+
else
|
24
|
+
count = 0
|
25
|
+
str << 'R'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
str.join('')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'performs digestion and can specify sites of digestion' do
|
33
|
+
trypsin = Ms::InSilico::Digester['Trypsin']
|
34
|
+
|
35
|
+
expected = [
|
36
|
+
'MIVIGR',
|
37
|
+
'SIVHPYITNEYEPFAAEK',
|
38
|
+
'QQILSIMAG']
|
39
|
+
trypsin.digest('MIVIGRSIVHPYITNEYEPFAAEKQQILSIMAG').is expected
|
40
|
+
|
41
|
+
expected = [
|
42
|
+
'MIVIGR',
|
43
|
+
'MIVIGRSIVHPYITNEYEPFAAEK',
|
44
|
+
'SIVHPYITNEYEPFAAEK',
|
45
|
+
'SIVHPYITNEYEPFAAEKQQILSIMAG',
|
46
|
+
'QQILSIMAG']
|
47
|
+
trypsin.digest('MIVIGRSIVHPYITNEYEPFAAEKQQILSIMAG', 1).is expected
|
48
|
+
|
49
|
+
expected = [
|
50
|
+
[0,6],
|
51
|
+
[0,24],
|
52
|
+
[6,24],
|
53
|
+
[6,33],
|
54
|
+
[24,33]]
|
55
|
+
trypsin.site_digest('MIVIGRSIVHPYITNEYEPFAAEKQQILSIMAG', 1).is expected
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'completely ignores whitespace inside protein sequences' do
|
59
|
+
expected = [
|
60
|
+
"\tMIVIGR",
|
61
|
+
"SIVHP\nYITNEYEPFAAE K",
|
62
|
+
"QQILSI\rMAG"]
|
63
|
+
Ms::InSilico::Digester['Trypsin'].digest("\tMIVIGRSIVHP\nYITNEYEPFAAE KQQILSI\rMAG").is expected
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'runs cleavage sites documentation' do
|
67
|
+
d = Ms::InSilico::Digester.new('Trypsin', 'KR', 'P')
|
68
|
+
seq = "AARGGR"
|
69
|
+
sites = d.cleavage_sites(seq)
|
70
|
+
sites.is [0, 3, 6]
|
71
|
+
|
72
|
+
seq[sites[0], sites[0+1] - sites[0]].is "AAR"
|
73
|
+
seq[sites[1], sites[1+1] - sites[1]].is "GGR"
|
74
|
+
|
75
|
+
seq = "AAR \n GGR"
|
76
|
+
sites = d.cleavage_sites(seq)
|
77
|
+
sites.is [0, 8, 11]
|
78
|
+
|
79
|
+
seq[sites[0], sites[0+1] - sites[0]].is "AAR \n "
|
80
|
+
seq[sites[1], sites[1+1] - sites[1]].is "GGR"
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'finds cleavage site indices' do
|
84
|
+
{
|
85
|
+
"" => [0,0],
|
86
|
+
"A" => [0,1],
|
87
|
+
"R" => [0,1],
|
88
|
+
"AAA" => [0,3],
|
89
|
+
"RAA" => [0,1,3],
|
90
|
+
"ARA" => [0,2,3],
|
91
|
+
"AAR" => [0,3],
|
92
|
+
"RRA" => [0,1,2,3],
|
93
|
+
"RAR" => [0,1,3],
|
94
|
+
"RRR" => [0,1,2,3],
|
95
|
+
|
96
|
+
"R\nR\nR" => [0,2,4,5],
|
97
|
+
"R\n\n\nR\nR\n\n" => [0,4,6,9]
|
98
|
+
}.each do |sequence, expected|
|
99
|
+
@digester.cleavage_sites(sequence).is expected
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'finds cleavage sites with exception' do
|
104
|
+
@digester = Ms::InSilico::Digester.new('argp', 'R', 'P')
|
105
|
+
{
|
106
|
+
"" => [0,0],
|
107
|
+
"A" => [0,1],
|
108
|
+
"R" => [0,1],
|
109
|
+
"AAA" => [0,3],
|
110
|
+
"RAA" => [0,1,3],
|
111
|
+
"ARA" => [0,2,3],
|
112
|
+
"AAR" => [0,3],
|
113
|
+
"RRA" => [0,1,2,3],
|
114
|
+
"RAR" => [0,1,3],
|
115
|
+
"RRR" => [0,1,2,3],
|
116
|
+
|
117
|
+
"PR" => [0,1,2],
|
118
|
+
"PR" => [0,2],
|
119
|
+
"PRR" => [0,2,3],
|
120
|
+
"RPR" => [0,3],
|
121
|
+
"RRP" => [0,1,3],
|
122
|
+
"APRA" => [0,3,4],
|
123
|
+
"ARPA" => [0,4],
|
124
|
+
"ARPARA" => [0,5,6],
|
125
|
+
"R\nPR\nR" => [0,5,6],
|
126
|
+
"RP\nR\nR" => [0,5,6],
|
127
|
+
"RP\nR\nR\n" => [0,5,7]
|
128
|
+
}.each do |sequence, expected|
|
129
|
+
@digester.cleavage_sites(sequence).is expected
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'finds cleavage sites with offset and limit' do
|
134
|
+
{
|
135
|
+
"RxxR" => [2,4],
|
136
|
+
"RxAxR" => [2,4],
|
137
|
+
"RxAAAxR" => [2,4],
|
138
|
+
"RxRRRxR" => [2,3,4]
|
139
|
+
}.each do |sequence, expected|
|
140
|
+
@digester.cleavage_sites(sequence, 2, 2).is expected
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'finds cleavage sites fast' do
|
145
|
+
str = nk_string(10, 1000)
|
146
|
+
@digester.cleavage_sites(str).length.is 11
|
147
|
+
benchmark(20) do |x|
|
148
|
+
x.report("10kx - fragments") do
|
149
|
+
10000.times { @digester.cleavage_sites(str) }
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'digests proteins' do
|
155
|
+
{
|
156
|
+
"" => [''],
|
157
|
+
"A" => ["A"],
|
158
|
+
"R" => ["R"],
|
159
|
+
"AAA" => ["AAA"],
|
160
|
+
"RAA" => ["R", "AA"],
|
161
|
+
"ARA" => ["AR", "A"],
|
162
|
+
"AAR" => ["AAR"],
|
163
|
+
"RRA" => ["R", "R", "A"],
|
164
|
+
"RAR" => ["R", "AR"],
|
165
|
+
"RRR" => ["R", "R", "R"]
|
166
|
+
}.each do |sequence, expected|
|
167
|
+
# spp(sequence)
|
168
|
+
@digester.digest(sequence) {|frag, s, e| frag}.is expected
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'digests with missed cleavages' do
|
173
|
+
{
|
174
|
+
"" => [''],
|
175
|
+
"A" => ["A"],
|
176
|
+
"R" => ["R"],
|
177
|
+
"AAA" => ["AAA"],
|
178
|
+
"RAA" => ["R", "RAA", "AA"],
|
179
|
+
"ARA" => ["AR", "ARA", "A"],
|
180
|
+
"AAR" => ["AAR"],
|
181
|
+
"RRA" => ["R", "RR", "R", "RA", "A"],
|
182
|
+
"RAR" => ["R", "RAR", "AR"],
|
183
|
+
"RRR" => ["R", "RR", "R", "RR", "R"]
|
184
|
+
}.each do |sequence, expected|
|
185
|
+
@digester.digest(sequence, 1) {|frag, s, e| frag}.is expected
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'digests with two missed cleavages' do
|
190
|
+
{
|
191
|
+
"" => [''],
|
192
|
+
"A" => ["A"],
|
193
|
+
"R" => ["R"],
|
194
|
+
"AAA" => ["AAA"],
|
195
|
+
"RAA" => ["R", "RAA", "AA"],
|
196
|
+
"ARA" => ["AR", "ARA", "A"],
|
197
|
+
"AAR" => ["AAR"],
|
198
|
+
"RRA" => ["R", "RR", "RRA", "R", "RA", "A"],
|
199
|
+
"RAR" => ["R", "RAR", "AR"],
|
200
|
+
"RRR" => ["R", "RR", "RRR", "R", "RR", "R"]
|
201
|
+
}.each do |sequence, expected|
|
202
|
+
@digester.digest(sequence, 2) {|frag, s, e| frag}.is expected
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'digests fast' do
|
207
|
+
str = nk_string(10, 1000)
|
208
|
+
@digester.digest(str).length.is 10
|
209
|
+
benchmark(20) do |x|
|
210
|
+
x.report("10kx - fragments") do
|
211
|
+
10000.times { @digester.digest(str) }
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'finds sites to be digested' do
|
217
|
+
{
|
218
|
+
"" => [[0,0]],
|
219
|
+
"A" => [[0,1]],
|
220
|
+
"R" => [[0,1]],
|
221
|
+
"AAA" => [[0,3]],
|
222
|
+
"RAA" => [[0,1],[1,3]],
|
223
|
+
"ARA" => [[0,2],[2,3]],
|
224
|
+
"AAR" => [[0,3]],
|
225
|
+
"RRA" => [[0,1],[1,2],[2,3]],
|
226
|
+
"RAR" => [[0,1],[1,3]],
|
227
|
+
"RRR" => [[0,1],[1,2],[2,3]]
|
228
|
+
}.each do |sequence, expected|
|
229
|
+
@digester.site_digest(sequence).is expected
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'finds sites to be digested with missed cleavages' do
|
234
|
+
{
|
235
|
+
"" => [[0,0]],
|
236
|
+
"A" => [[0,1]],
|
237
|
+
"R" => [[0,1]],
|
238
|
+
"AAA" => [[0,3]],
|
239
|
+
"RAA" => [[0,1],[0,3],[1,3]],
|
240
|
+
"ARA" => [[0,2],[0,3],[2,3]],
|
241
|
+
"AAR" => [[0,3]],
|
242
|
+
"RRA" => [[0,1],[0,2],[1,2],[1,3],[2,3]],
|
243
|
+
"RAR" => [[0,1],[0,3],[1,3]],
|
244
|
+
"RRR" => [[0,1],[0,2],[1,2],[1,3],[2,3]]
|
245
|
+
}.each do |sequence, expected|
|
246
|
+
@digester.site_digest(sequence, 1).is expected
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
it 'finds sites to be digested with two missed cleavages' do
|
251
|
+
{
|
252
|
+
"" => [[0,0]],
|
253
|
+
"A" => [[0,1]],
|
254
|
+
"R" => [[0,1]],
|
255
|
+
"AAA" => [[0,3]],
|
256
|
+
"RAA" => [[0,1],[0,3],[1,3]],
|
257
|
+
"ARA" => [[0,2],[0,3],[2,3]],
|
258
|
+
"AAR" => [[0,3]],
|
259
|
+
"RRA" => [[0,1],[0,2],[0,3],[1,2],[1,3],[2,3]],
|
260
|
+
"RAR" => [[0,1],[0,3],[1,3]],
|
261
|
+
"RRR" => [[0,1],[0,2],[0,3],[1,2],[1,3],[2,3]]
|
262
|
+
}.each do |sequence, expected|
|
263
|
+
@digester.site_digest(sequence, 2).is expected
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'does site digestion fast' do
|
268
|
+
str = nk_string(10, 1000)
|
269
|
+
@digester.site_digest(str).length.is 10
|
270
|
+
benchmark(20) do |x|
|
271
|
+
x.report("10kx - fragments") do
|
272
|
+
10000.times { @digester.site_digest(str) }
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
it 'does a trypsin digest' do
|
278
|
+
trypsin = Ms::InSilico::Digester::TRYPSIN
|
279
|
+
{
|
280
|
+
"" => [''],
|
281
|
+
"A" => ["A"],
|
282
|
+
"R" => ["R"],
|
283
|
+
"AAA" => ["AAA"],
|
284
|
+
"RAA" => ["R", "AA"],
|
285
|
+
"ARA" => ["AR", "A"],
|
286
|
+
"AAR" => ["AAR"],
|
287
|
+
"RRA" => ["R", "R", "A"],
|
288
|
+
"RAR" => ["R", "AR"],
|
289
|
+
"RRR" => ["R", "R", "R"],
|
290
|
+
"RKR" => ["R", "K", "R"],
|
291
|
+
|
292
|
+
"ARP" => ["ARP"],
|
293
|
+
"PRA" => ["PR","A"],
|
294
|
+
"ARPARAA" => ["ARPAR", "AA"],
|
295
|
+
"RPRRR" => ["RPR", "R", "R"]
|
296
|
+
}.each do |sequence, expected|
|
297
|
+
trypsin.digest(sequence) {|frag, s, e| frag}.is expected
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
require 'ms/in_silico/fragment'
|
4
|
+
|
5
|
+
describe 'creating fragmentation spectra' do
|
6
|
+
|
7
|
+
it 'creates tandem mass spectra from a peptide' do
|
8
|
+
frag = Ms::InSilico::Fragment.new :charge => 1, :series => ['b']
|
9
|
+
spec = Ms::InSilico::Spectrum.new('TVQQEL', 'H', 'HO')
|
10
|
+
|
11
|
+
headers = frag.headers(spec)
|
12
|
+
headers[:charge].is 1
|
13
|
+
headers[:nterm].is 'H'
|
14
|
+
headers[:cterm].is 'HO'
|
15
|
+
headers[:parent_ion_mass].should.be.close 717.377745628191, 0.000000000001
|
16
|
+
headers[:series].is ['b']
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require 'ms/in_silico/spectrum'
|
3
|
+
|
4
|
+
# class locate_residues tests
|
5
|
+
class Subclass < Ms::InSilico::Spectrum
|
6
|
+
locate_residues "PS"
|
7
|
+
end
|
8
|
+
|
9
|
+
class Cumulative < Ms::InSilico::Spectrum
|
10
|
+
locate_residues "PS"
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
describe 'creating spectral fragmentation ladders' do
|
15
|
+
|
16
|
+
it 'locates residues' do
|
17
|
+
Subclass.new('RPPGFSPFR').residue_locations.is( {'P' => [1, 2, 6], 'S' => [5]} )
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'does cumulative locate calls' do
|
21
|
+
Cumulative.residues_to_locate.is "PS"
|
22
|
+
Cumulative.locate_residues "R"
|
23
|
+
Cumulative.residues_to_locate.is "PSR"
|
24
|
+
|
25
|
+
Cumulative.locate_residues "G"
|
26
|
+
Cumulative.residues_to_locate.is "PSRG"
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'creates spectral series' do
|
30
|
+
f = Ms::InSilico::Spectrum.new 'RPPGFSPFR'
|
31
|
+
f.y_series.is f.series('y')
|
32
|
+
f.b_series(2).is f.series('b++')
|
33
|
+
f.nladder_series(-1).is f.series('nladder-')
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'specifies charges' do
|
37
|
+
f = Ms::InSilico::Spectrum.new 'RPPGFSPFR'
|
38
|
+
f.y_series.is f.series('y')
|
39
|
+
|
40
|
+
f.y_series(-1).is f.series('y-')
|
41
|
+
f.y_series(-2).is f.series('y--')
|
42
|
+
|
43
|
+
f.y_series(1).is f.series('y+')
|
44
|
+
f.y_series(2).is f.series('y++')
|
45
|
+
|
46
|
+
f.y_series(-1).is f.series('y++---')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'raises an error for zero charge or unknown series' do
|
50
|
+
f = Ms::InSilico::Spectrum.new('SAMPLE')
|
51
|
+
lambda { f.series 'y+-' }.should.raise ArgumentError
|
52
|
+
lambda { f.series 'q' }.should.raise ArgumentError
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'handles whitespace in the peptide spec' do
|
56
|
+
s = Ms::InSilico::Spectrum.new('SAMPLE')
|
57
|
+
s1 = Ms::InSilico::Spectrum.new(" SA\n MPL\t \rE ")
|
58
|
+
s1.series('y').is s.series('y')
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'is fast' do
|
62
|
+
1.is 1
|
63
|
+
benchmark(20) do |x|
|
64
|
+
x.report("1k RPPGFSPFR * 10") { 1000.times { Ms::InSilico::Spectrum.new("RPPGFSPFR" * 10) } }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
data/spec/readme_spec.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
require 'ms/in_silico/digester'
|
3
|
+
require 'ms/in_silico/spectrum'
|
4
|
+
|
5
|
+
describe 'readme documentation' do
|
6
|
+
|
7
|
+
it 'works' do
|
8
|
+
trypsin = Ms::InSilico::Digester['Trypsin']
|
9
|
+
peptides = trypsin.digest('MIVIGRSIVHPYITNEYEPFAAEKQQILSIMAG')
|
10
|
+
expected = [
|
11
|
+
'MIVIGR',
|
12
|
+
'SIVHPYITNEYEPFAAEK',
|
13
|
+
'QQILSIMAG']
|
14
|
+
peptides.sort.is expected.sort
|
15
|
+
|
16
|
+
spectrum = Ms::InSilico::Spectrum.new(peptides[0])
|
17
|
+
spectrum.parent_ion_mass.should.be.close 688.417442373391, 10**-12
|
18
|
+
|
19
|
+
expected = [
|
20
|
+
132.047761058391,
|
21
|
+
245.131825038791,
|
22
|
+
344.200238954991,
|
23
|
+
457.284302935391,
|
24
|
+
514.305766658991,
|
25
|
+
670.406877687091]
|
26
|
+
spectrum.series('b').zip(expected) do |o,e|
|
27
|
+
o.should.be.close e, 10**-12
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec/more'
|
3
|
+
|
4
|
+
require 'benchmark'
|
5
|
+
|
6
|
+
Bacon.summary_on_exit
|
7
|
+
|
8
|
+
module Bacon
|
9
|
+
class Context
|
10
|
+
def benchmark(width=7, &block)
|
11
|
+
if ENV['BENCHMARK']
|
12
|
+
Benchmark.bm(width, &block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
def assert_equal(x,y)
|
16
|
+
x.is y
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
File without changes
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../tap_test_helper.rb')
|
2
|
+
require 'ms/in_silico/digest'
|
3
|
+
|
4
|
+
class Ms::InSilico::DigestTest < Test::Unit::TestCase
|
5
|
+
include Ms::InSilico
|
6
|
+
acts_as_tap_test
|
7
|
+
acts_as_shell_test(
|
8
|
+
:cmd_pattern => '% ',
|
9
|
+
:env => {'TAP_GEMS' => ''}
|
10
|
+
)
|
11
|
+
|
12
|
+
attr_accessor :d
|
13
|
+
|
14
|
+
def setup
|
15
|
+
super
|
16
|
+
@d = Digest.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_digest_documentation
|
20
|
+
sh_test %q{
|
21
|
+
% rap digest MIVIGRSIVHPYITNEYEPFAAEKQQILSIMAG --:i dump
|
22
|
+
MIVIGR
|
23
|
+
SIVHPYITNEYEPFAAEK
|
24
|
+
QQILSIMAG
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# process test
|
30
|
+
#
|
31
|
+
|
32
|
+
def test_process_returns_array_of_peptide_fragments
|
33
|
+
assert_equal %w{
|
34
|
+
MIVIGR
|
35
|
+
SIVHPYITNEYEPFAAEK
|
36
|
+
QQILSIMAG
|
37
|
+
}, d.process("MIVIGRSIVHPYITNEYEPFAAEKQQILSIMAG")
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_process_removes_whitespace_from_sequence
|
41
|
+
assert_equal %w{
|
42
|
+
MIVIGR
|
43
|
+
SIVHPYITNEYEPFAAEK
|
44
|
+
QQILSIMAG
|
45
|
+
}, d.process(" MIVI\nGRSIVHP YITNEYEPFA \n\r\nAEKQQILSIMAG\n")
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_process_skips_header_of_fasta_entries
|
49
|
+
assert_equal %w{
|
50
|
+
MIVIGR
|
51
|
+
SIVHPYITNEYEPFAAEK
|
52
|
+
QQILSIMAG
|
53
|
+
}, d.process(">header\nMIVIGRSIVHPYITNEYEPFAAEKQQILSIMAG")
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_process_filters_on_min_max_length
|
57
|
+
d.min_length = 9
|
58
|
+
d.max_length = 9
|
59
|
+
assert_equal %w{
|
60
|
+
QQILSIMAG
|
61
|
+
}, d.process("MIVIGRSIVHPYITNEYEPFAAEKQQILSIMAG")
|
62
|
+
|
63
|
+
d.min_length = 6
|
64
|
+
d.max_length = 18
|
65
|
+
assert_equal %w{
|
66
|
+
MIVIGR
|
67
|
+
SIVHPYITNEYEPFAAEK
|
68
|
+
QQILSIMAG
|
69
|
+
}, d.process("MIVIGRSIVHPYITNEYEPFAAEKQQILSIMAG")
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../../tap_test_helper.rb')
|
2
|
+
require 'ms/in_silico/fragment'
|
3
|
+
|
4
|
+
class FragmentTest < Test::Unit::TestCase
|
5
|
+
include Ms::InSilico
|
6
|
+
acts_as_tap_test
|
7
|
+
|
8
|
+
#
|
9
|
+
# process test
|
10
|
+
#
|
11
|
+
|
12
|
+
def test_process_returns_data_and_a_hash_of_headers
|
13
|
+
data, headers = Fragment.new.process('TVQQEL')
|
14
|
+
|
15
|
+
assert_equal %w{
|
16
|
+
102.054954926291
|
17
|
+
132.101905118891
|
18
|
+
201.123368842491
|
19
|
+
261.144498215091
|
20
|
+
329.181946353891
|
21
|
+
389.203075726491
|
22
|
+
457.240523865291
|
23
|
+
517.261653237891
|
24
|
+
586.283116961491
|
25
|
+
616.330067154091
|
26
|
+
699.367180941891
|
27
|
+
717.377745628191
|
28
|
+
}, data.collect {|mass| mass.to_s }
|
29
|
+
|
30
|
+
assert_equal 1, headers[:charge]
|
31
|
+
assert_equal 'H', headers[:nterm]
|
32
|
+
assert_equal 'HO', headers[:cterm]
|
33
|
+
assert_in_delta 717.377745628191, headers[:parent_ion_mass], 0.000000000001
|
34
|
+
assert_equal ['y', 'b'], headers[:series]
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ms-in_silico
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 4
|
8
|
+
- 0
|
9
|
+
version: 0.4.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Simon Chiang
|
@@ -9,84 +14,131 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2010-06-23 00:00:00 -06:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
21
|
+
name: molecules
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 2
|
30
|
+
- 0
|
31
|
+
version: 0.2.0
|
17
32
|
type: :runtime
|
18
|
-
|
19
|
-
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: tap
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
20
38
|
requirements:
|
21
39
|
- - ">="
|
22
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 17
|
44
|
+
- 0
|
23
45
|
version: 0.17.0
|
24
|
-
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
25
48
|
- !ruby/object:Gem::Dependency
|
26
49
|
name: tap-test
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
30
52
|
requirements:
|
31
53
|
- - ">="
|
32
54
|
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
- 1
|
58
|
+
- 0
|
33
59
|
version: 0.1.0
|
34
|
-
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
35
62
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
name: spec-more
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
40
66
|
requirements:
|
41
67
|
- - ">="
|
42
68
|
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
72
|
+
type: :development
|
73
|
+
version_requirements: *id004
|
74
|
+
description: peptide fragmentation and protein digestion
|
75
|
+
email: jtprince@gmail.com
|
47
76
|
executables: []
|
48
77
|
|
49
78
|
extensions: []
|
50
79
|
|
51
80
|
extra_rdoc_files:
|
52
|
-
-
|
53
|
-
-
|
54
|
-
- History
|
81
|
+
- LICENSE
|
82
|
+
- README.rdoc
|
55
83
|
files:
|
84
|
+
- .gitignore
|
85
|
+
- History
|
86
|
+
- LICENSE
|
87
|
+
- README.rdoc
|
88
|
+
- Rakefile
|
89
|
+
- VERSION
|
56
90
|
- lib/ms/in_silico.rb
|
57
91
|
- lib/ms/in_silico/digest.rb
|
58
92
|
- lib/ms/in_silico/digester.rb
|
59
93
|
- lib/ms/in_silico/fragment.rb
|
60
94
|
- lib/ms/in_silico/spectrum.rb
|
95
|
+
- spec/ms/in_silico/digester_spec.rb
|
96
|
+
- spec/ms/in_silico/fragment_spec.rb
|
97
|
+
- spec/ms/in_silico/spectrum_spec.rb
|
98
|
+
- spec/readme_spec.rb
|
99
|
+
- spec/spec_helper.rb
|
100
|
+
- spec/tap_test_helper.rb
|
101
|
+
- spec/tap_test_suite.rb
|
61
102
|
- tap.yml
|
62
|
-
-
|
63
|
-
-
|
64
|
-
- History
|
103
|
+
- test/ms/in_silico/digest_test.rb
|
104
|
+
- test/ms/in_silico/fragment_test.rb
|
65
105
|
has_rdoc: true
|
66
|
-
homepage: http://
|
67
|
-
|
68
|
-
rdoc_options: []
|
106
|
+
homepage: http://github.com/jtprince/ms-in_silico
|
107
|
+
licenses: []
|
69
108
|
|
109
|
+
post_install_message:
|
110
|
+
rdoc_options:
|
111
|
+
- --charset=UTF-8
|
70
112
|
require_paths:
|
71
113
|
- lib
|
72
114
|
required_ruby_version: !ruby/object:Gem::Requirement
|
73
115
|
requirements:
|
74
116
|
- - ">="
|
75
117
|
- !ruby/object:Gem::Version
|
118
|
+
segments:
|
119
|
+
- 0
|
76
120
|
version: "0"
|
77
|
-
version:
|
78
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
122
|
requirements:
|
80
123
|
- - ">="
|
81
124
|
- !ruby/object:Gem::Version
|
125
|
+
segments:
|
126
|
+
- 0
|
82
127
|
version: "0"
|
83
|
-
version:
|
84
128
|
requirements: []
|
85
129
|
|
86
130
|
rubyforge_project: mspire
|
87
|
-
rubygems_version: 1.3.
|
131
|
+
rubygems_version: 1.3.6
|
88
132
|
signing_key:
|
89
|
-
specification_version:
|
133
|
+
specification_version: 3
|
90
134
|
summary: in-silico calculations for mass spec data
|
91
135
|
test_files:
|
92
|
-
-
|
136
|
+
- spec/tap_test_suite.rb
|
137
|
+
- spec/ms/in_silico/fragment_spec.rb
|
138
|
+
- spec/ms/in_silico/spectrum_spec.rb
|
139
|
+
- spec/ms/in_silico/digester_spec.rb
|
140
|
+
- spec/readme_spec.rb
|
141
|
+
- spec/tap_test_helper.rb
|
142
|
+
- spec/spec_helper.rb
|
143
|
+
- test/ms/in_silico/digest_test.rb
|
144
|
+
- test/ms/in_silico/fragment_test.rb
|