ms-msrun 0.1.0 → 0.2.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 +3 -0
- data/.gitmodules +3 -0
- data/History +18 -0
- data/{README → README.rdoc} +0 -0
- data/Rakefile +93 -107
- data/VERSION +1 -0
- data/lib/lmat.rb +141 -39
- data/lib/ms/msrun/nokogiri.rb +1 -0
- data/lib/ms/msrun/search_dev_notes.txt +47 -0
- data/spec/lmat_spec.rb +87 -11
- data/spec/metadata/opd1/000.v1.mzXML.yml +3 -0
- data/spec/metadata/opd1/000.v2.1.mzXML.yml +3 -0
- data/spec/metadata/opd1/020.mzData.xml.yml +3 -0
- data/spec/metadata/opd1/020.v2.0.readw.mzXML.yml +3 -0
- data/spec/ms/msrun/hpricot.rb +38 -0
- data/spec/ms/msrun/index_spec.rb +12 -13
- data/spec/ms/msrun/search_spec.rb +5 -4
- data/spec/ms/msrun/sha1_spec.rb +3 -6
- data/spec/ms/msrun/test_parsing_xml_frags/parse_test.rb +25 -0
- data/spec/ms/msrun/test_parsing_xml_frags/test1.xml +5 -0
- data/spec/ms/msrun/test_parsing_xml_frags/test2.xml +6 -0
- data/spec/ms/msrun/test_parsing_xml_frags/test3.xml +4 -0
- data/spec/ms/msrun/test_parsing_xml_frags/test4.xml +11 -0
- data/spec/ms/msrun/test_parsing_xml_frags/test_failures.rb +47 -0
- data/spec/ms/msrun_bm.rb +22 -0
- data/spec/ms/msrun_spec.rb +90 -109
- data/spec/ms/scan_spec.rb +5 -6
- data/spec/ms/spectrum/compare_spec.rb +31 -28
- data/spec/ms/spectrum/filter_spec.rb +15 -13
- data/spec/spec_helper.rb +21 -0
- data/spec/testfiles/lmat/tmp1.lmat +0 -0
- data/spec/testfiles/lmat/tmp1.lmata +44 -0
- data/spec/testfiles/lmat/tmp2.lmata +11 -0
- data/spec/testfiles/opd1/000.v1.mzXML +418 -0
- data/spec/testfiles/opd1/000.v1.mzXML.key.yml +51 -0
- data/spec/testfiles/opd1/000.v2.1.mzXML +382 -0
- data/spec/testfiles/opd1/000.v2.1.mzXML.key.yml +51 -0
- data/spec/testfiles/opd1/020.mzData.xml +683 -0
- data/spec/testfiles/opd1/020.mzData.xml.key.yml +43 -0
- data/spec/testfiles/opd1/020.v2.0.readw.mzXML +382 -0
- data/spec/testfiles/opd1/020.v2.0.readw.mzXML.key.yml +46 -0
- metadata +85 -34
data/spec/ms/msrun_bm.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "ms/msrun"
|
2
|
+
|
3
|
+
#Ms::Msrun.open("LPT_GFP_NUCLf.mzXML") do |ms|
|
4
|
+
Ms::Msrun.open("000.mzXML") do |ms|
|
5
|
+
#indices = (1..1000).to_a
|
6
|
+
#start = Time.now
|
7
|
+
#indices.each do |n|
|
8
|
+
# ms.scan(n).spectrum[0]
|
9
|
+
#end
|
10
|
+
|
11
|
+
start = Time.now
|
12
|
+
cnt = 0
|
13
|
+
ms.each do |scan|
|
14
|
+
scan.spectrum
|
15
|
+
cnt += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
#puts "#{(Time.now - start) / indices.size} / scan"
|
19
|
+
#puts "#{Time.now - start} total secs for #{indices.size} scans"
|
20
|
+
puts "#{(Time.now - start) / cnt} / scan"
|
21
|
+
puts "#{Time.now - start} total secs for #{cnt} scans"
|
22
|
+
end
|
data/spec/ms/msrun_spec.rb
CHANGED
@@ -3,156 +3,137 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
|
|
3
3
|
require 'ms/msrun'
|
4
4
|
|
5
5
|
module MsrunSpec
|
6
|
-
extend Shareable
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
before_all = lambda do |file|
|
8
|
+
nums = (1..20).to_a # define scan numbers
|
9
|
+
key = YAML.load_file(file + '.key.yml')
|
10
|
+
[key, nums]
|
12
11
|
end
|
13
12
|
|
14
|
-
|
15
|
-
@key || @key = YAML.load_file(@file + '.key.yml')
|
16
|
-
end
|
13
|
+
shared 'an msrun object' do
|
17
14
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
else
|
25
|
-
puts "#{k}: #{v} but was #{obj.send(k.to_sym)}" if obj.send(k.to_sym) != v
|
26
|
-
obj.send(k.to_sym).must_equal v
|
15
|
+
it 'reads header information' do
|
16
|
+
Ms::Msrun.open(@file) do |ms|
|
17
|
+
@key['header'].each do |k,v|
|
18
|
+
#puts "K: #{k} Vexp: #{v} Vact: #{ms.send(k.to_sym)}"
|
19
|
+
ms.send(k.to_sym).is v
|
20
|
+
end
|
27
21
|
end
|
28
22
|
end
|
29
|
-
end
|
30
23
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
ms.send(k.to_sym).must_equal v
|
24
|
+
it 'can access random scans' do
|
25
|
+
Ms::Msrun.open(@file) do |ms|
|
26
|
+
scan = ms.scan(20)
|
27
|
+
hash_match(@key['scans'][20], scan)
|
36
28
|
end
|
37
29
|
end
|
38
|
-
end
|
39
30
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
num_required_scans = key['scans'].size
|
49
|
-
Ms::Msrun.open(@file) do |ms|
|
50
|
-
ms.each do |scan|
|
51
|
-
if hash = key['scans'][scan.num]
|
52
|
-
hash_match(hash, scan)
|
53
|
-
num_required_scans -= 1
|
31
|
+
it 'can read all scans' do
|
32
|
+
num_required_scans = @key['scans'].size
|
33
|
+
Ms::Msrun.open(@file) do |ms|
|
34
|
+
ms.each do |scan|
|
35
|
+
if hash = @key['scans'][scan.num]
|
36
|
+
hash_match(hash, scan)
|
37
|
+
num_required_scans -= 1
|
38
|
+
end
|
54
39
|
end
|
55
40
|
end
|
41
|
+
num_required_scans.is 0
|
56
42
|
end
|
57
|
-
num_required_scans.must_equal 0
|
58
|
-
end
|
59
43
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
44
|
+
it 'can read scans of a certain ms_level' do
|
45
|
+
nums = [1,5,9,13,17]
|
46
|
+
Ms::Msrun.open(@file) do |ms|
|
47
|
+
ms.each(:ms_level => 1) do |scan|
|
48
|
+
scan.num.is nums.shift
|
49
|
+
end
|
50
|
+
end
|
51
|
+
nums = [2,3,4,6,7,8,10,11,12,14,15,16,18,19,20]
|
52
|
+
Ms::Msrun.foreach(@file, :ms_level => 2) do |scan|
|
53
|
+
scan.num.is nums.shift
|
65
54
|
end
|
66
55
|
end
|
67
|
-
nums = [2,3,4,6,7,8,10,11,12,14,15,16,18,19,20]
|
68
|
-
Ms::Msrun.foreach(@file, :ms_level => 2) do |scan|
|
69
|
-
scan.num.must_equal nums.shift
|
70
|
-
end
|
71
|
-
end
|
72
56
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
57
|
+
it 'can avoid reading spectra' do
|
58
|
+
nums = @nums.map
|
59
|
+
Ms::Msrun.foreach(@file, :spectrum => false) do |scan|
|
60
|
+
scan.spectrum.nil?.ok
|
61
|
+
scan.num.is nums.shift
|
62
|
+
end
|
78
63
|
end
|
79
|
-
end
|
80
64
|
|
81
|
-
|
82
|
-
|
83
|
-
|
65
|
+
it 'can avoid reading precursor information' do
|
66
|
+
Ms::Msrun.foreach(@file, :precursor => false) do |scan|
|
67
|
+
scan.precursor.nil?.ok
|
68
|
+
end
|
84
69
|
end
|
85
|
-
end
|
86
70
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
71
|
+
it 'gives scan counts for different ms levels' do
|
72
|
+
Ms::Msrun.open(@file) do |ms|
|
73
|
+
@key['scan_count'].each do |index, count|
|
74
|
+
ms.scan_count(index).is count
|
75
|
+
end
|
91
76
|
end
|
92
77
|
end
|
93
|
-
end
|
94
78
|
|
95
|
-
|
96
|
-
|
97
|
-
|
79
|
+
it 'gives start and end mz even if the information is not given' do
|
80
|
+
Ms::Msrun.open(@file) do |ms|
|
81
|
+
ms.start_and_end_mz_brute_force.is(@key['start_and_end_mz'][1])
|
82
|
+
end
|
98
83
|
end
|
99
84
|
end
|
100
85
|
|
101
|
-
|
102
|
-
|
103
|
-
class Mzxml_v1 < MiniTest::Spec
|
104
|
-
include MsrunSpec
|
105
|
-
before do
|
106
|
-
super
|
86
|
+
describe 'reading an mzXML v1 file' do
|
107
87
|
@file = TESTFILES + '/opd1/000.v1.mzXML'
|
108
|
-
|
88
|
+
|
89
|
+
(@key, @nums) = before_all.call(@file)
|
90
|
+
|
109
91
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
92
|
+
it 'can give start and end mz' do
|
93
|
+
# scan has attributes startMz endMz
|
94
|
+
Ms::Msrun.open(@file) do |ms|
|
95
|
+
#ms.start_and_end_mz.is([300.0, 1500.0])
|
96
|
+
ms.start_and_end_mz.is @key['start_and_end_mz'][1]
|
97
|
+
end
|
115
98
|
end
|
99
|
+
|
100
|
+
behaves_like 'an msrun object'
|
101
|
+
|
116
102
|
end
|
117
|
-
end
|
118
103
|
|
119
|
-
|
120
|
-
include MsrunSpec
|
121
|
-
before do
|
122
|
-
super
|
104
|
+
describe 'reading an mzXML v2.0 file' do
|
123
105
|
@file = TESTFILES + '/opd1/020.v2.0.readw.mzXML'
|
106
|
+
(@key, @nums) = before_all.call(@file)
|
107
|
+
behaves_like 'an msrun object'
|
124
108
|
end
|
125
|
-
end
|
126
109
|
|
127
|
-
|
128
|
-
include MsrunSpec
|
129
|
-
before do
|
130
|
-
super
|
110
|
+
describe 'reading an mzXML v2.1 file' do
|
131
111
|
@file = TESTFILES + '/opd1/000.v2.1.mzXML'
|
132
|
-
|
112
|
+
(@key, @nums) = before_all.call(@file)
|
113
|
+
behaves_like 'an msrun object'
|
133
114
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
115
|
+
it 'gives nil if scans do not have start and end mz info' do
|
116
|
+
# scans do not have startMz endMz or filterLine
|
117
|
+
Ms::Msrun.open(@file) do |ms|
|
118
|
+
ms.start_and_end_mz.is([nil, nil])
|
119
|
+
end
|
138
120
|
end
|
139
|
-
end
|
140
121
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
122
|
+
it 'gives start and end mz if filterLine present' do
|
123
|
+
newname = @file + ".TMP.mzXML"
|
124
|
+
File.open(newname, 'w') do |out|
|
125
|
+
IO.foreach(@file) do |line|
|
126
|
+
if line =~ /msLevel="1"/
|
127
|
+
out.puts %Q{ filterLine="FTMS + p NSI Full ms [300.00-1500.00]"}
|
128
|
+
end
|
129
|
+
out.print line
|
147
130
|
end
|
148
|
-
out.print line
|
149
131
|
end
|
132
|
+
Ms::Msrun.open(newname) do |ms|
|
133
|
+
ms.start_and_end_mz.is([300.0, 1500.0])
|
134
|
+
end
|
135
|
+
File.unlink(newname) if File.exist?(newname)
|
150
136
|
end
|
151
|
-
Ms::Msrun.open(newname) do |ms|
|
152
|
-
ms.start_and_end_mz.must_equal([300.0, 1500.0])
|
153
|
-
end
|
154
|
-
File.unlink(newname) if File.exist?(newname)
|
155
|
-
end
|
156
137
|
|
138
|
+
end
|
157
139
|
end
|
158
|
-
|
data/spec/ms/scan_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
2
|
|
3
3
|
require 'ms/msrun'
|
4
4
|
|
5
|
-
|
5
|
+
describe 'a scan' do
|
6
6
|
|
7
7
|
before do
|
8
8
|
@scan = Ms::Scan.new
|
@@ -10,25 +10,24 @@ class ScanUnitSpec < MiniTest::Spec
|
|
10
10
|
@scan.spectrum = Ms::Spectrum.new([[1,2,3,4], [2,4,4,2]])
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
it 'determines if its +1 or not' do
|
13
|
+
it 'can determine if its +1 or not' do
|
15
14
|
# these have not been checked for accuracy, just sanity
|
16
15
|
reply = [0.1,2.5, 3.5, 5].map do |prec_mz|
|
17
16
|
@scan.precursor.mz = prec_mz
|
18
17
|
@scan.plus1?(-0.1)
|
19
18
|
end
|
20
|
-
reply.all? {|v| v == true }.
|
19
|
+
reply.all? {|v| v == true }.ok
|
21
20
|
|
22
21
|
reply = [0.1,2.5, 3.5, 5].map do |prec_mz|
|
23
22
|
@scan.precursor.mz = prec_mz
|
24
23
|
@scan.plus1?(1.0)
|
25
24
|
end
|
26
|
-
reply.all? {|v| v == false }.
|
25
|
+
reply.all? {|v| v == false }.ok
|
27
26
|
|
28
27
|
reply = [0.1,2.5, 3.5, 5].map do |prec_mz|
|
29
28
|
@scan.precursor.mz = prec_mz
|
30
29
|
@scan.plus1?(0.5)
|
31
30
|
end
|
32
|
-
reply.
|
31
|
+
reply.enums [false, false, true, true]
|
33
32
|
end
|
34
33
|
end
|
@@ -9,42 +9,45 @@ class Array
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
module CompareSpec
|
13
13
|
include Ms
|
14
14
|
|
15
|
-
|
16
|
-
@a = Spectrum.new([[0,2,3,4], [5,6,7,8]])
|
17
|
-
@b = Spectrum.new([[0, 1.5, 3.5, 5.5], [9,10,11,12]])
|
15
|
+
describe 'comparison of spectra' do
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
before do
|
18
|
+
@a = Spectrum.new([[0,2,3,4], [5,6,7,8]])
|
19
|
+
@b = Spectrum.new([[0, 1.5, 3.5, 5.5], [9,10,11,12]])
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
@c.compare(@d).must_equal [[8, 10, 0.6]]
|
21
|
+
@c = Spectrum.new([[0, 1], [8,9]])
|
22
|
+
@d = Spectrum.new([[0.6, 0.75], [10,11]])
|
23
|
+
end
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
it 'compares spectra' do
|
26
|
+
# array form:
|
27
|
+
@c.compare(@d).rev_ab.is( @d.compare(@c) )
|
28
|
+
@c.compare(@d).is [[8, 10, 0.6]]
|
29
|
+
|
30
|
+
# block form
|
31
|
+
exp = [[5,9], [6,10], [7,11]]
|
32
|
+
# default radius 1.0
|
33
|
+
@a.compare(@b) do |int_a, int_b|
|
34
|
+
exp.delete([int_a, int_b])
|
35
|
+
end
|
36
|
+
exp.size.is 0
|
33
37
|
end
|
34
|
-
exp.size.must_equal 0
|
35
|
-
end
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
it 'computes similarity score' do
|
40
|
+
@a.sim_score(@a, :radius => 0.1).is 1.0
|
41
|
+
# this is just frozen, not verified:
|
42
|
+
@a.sim_score(@b).should.be.close 0.702945603476432, 0.000001
|
43
|
+
end
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
it 'computes a pic score' do
|
46
|
+
@a.pic_score(@a, :radius => 0.01).is 100.0
|
47
|
+
@a.pic_score(@d, :radius => 0.01).is 0.0
|
48
|
+
# frozen:
|
49
|
+
@a.pic_score(@b).should.be.close 68.4981684981685, 0.000001
|
50
|
+
end
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
@@ -10,24 +10,26 @@ class Array
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
class FilterSpec
|
13
|
+
class FilterSpec
|
14
14
|
include Ms
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
describe 'filtering spectra' do
|
17
|
+
before do
|
18
|
+
@a = Spectrum.new([[0,5,10, 15,16,17,18, 20.1], [0,1,2, 3,8,10,4, 0]])
|
19
|
+
@null = Spectrum.new([[],[]])
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
it 'filters spectra' do
|
23
|
+
spec = @a.filter(:bins, :bin_width => 10, :num_peaks => 2)
|
24
|
+
spec.mzs.enums [5,10,16,17,20.1]
|
25
|
+
spec.intensities.enums [1,2,8,10,0]
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
@a.filter(:bins, :bin_width => 100, :num_peaks => 8).is @a
|
28
|
+
@a.filter(:bins, :bin_width => 1, :num_peaks => 1).is @a
|
29
|
+
@a.filter(:bins, :bin_width => 1, :num_peaks => 0).is @null
|
30
|
+
end
|
30
31
|
|
32
|
+
end
|
31
33
|
end
|
32
34
|
|
33
35
|
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec/more'
|
3
|
+
|
4
|
+
TESTFILES = File.expand_path(File.dirname(__FILE__)) + '/testfiles'
|
5
|
+
|
6
|
+
module Bacon
|
7
|
+
class Context
|
8
|
+
def hash_match(hash, obj)
|
9
|
+
hash.each do |k,v|
|
10
|
+
if v.is_a?(Hash)
|
11
|
+
hash_match(v, obj.send(k.to_sym))
|
12
|
+
else
|
13
|
+
puts "#{k}: #{v} but was #{obj.send(k.to_sym)}" if obj.send(k.to_sym) != v
|
14
|
+
obj.send(k.to_sym).should.equal v
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Bacon.summary_on_exit
|
Binary file
|