mspire 0.6.18 → 0.6.19
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/VERSION +1 -1
- data/lib/ms/mzml/spectrum.rb +25 -0
- data/lib/ms/mzml.rb +11 -12
- data/lib/ms/spectrum.rb +1 -1
- data/lib/ms/spectrum_like.rb +14 -13
- data/spec/ms/mzml/plms1_spec.rb +2 -2
- data/spec/ms/mzml_spec.rb +27 -4
- metadata +16 -16
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.19
|
data/lib/ms/mzml/spectrum.rb
CHANGED
@@ -64,6 +64,30 @@ module MS
|
|
64
64
|
# currently being described, ordered.
|
65
65
|
attr_accessor :products
|
66
66
|
|
67
|
+
# takes a Nokogiri node and sets relevant properties
|
68
|
+
def self.from_xml(xml)
|
69
|
+
spec = MS::Mzml::Spectrum.new(xml[:id])
|
70
|
+
|
71
|
+
params = {}
|
72
|
+
xml.xpath("./cvParam").each do |cvparam|
|
73
|
+
params[cvparam[:accession]] = cvparam[:value]
|
74
|
+
end
|
75
|
+
spec.ms_level = params['MS:1000511'].to_i
|
76
|
+
# TODO: need to slot in all the other info in reasonable ways
|
77
|
+
|
78
|
+
data_arrays = xml.xpath('./binaryDataArrayList/binaryDataArray').map do |binary_data_array_n|
|
79
|
+
accessions = binary_data_array_n.xpath('./cvParam').map {|node| node['accession'] }
|
80
|
+
base64 = binary_data_array_n.xpath('./binary').text
|
81
|
+
MS::Mzml.unpack_binary(base64, accessions)
|
82
|
+
end
|
83
|
+
# if there is no spectrum, we will still return a spectrum object, it
|
84
|
+
# just has no mzs or intensities
|
85
|
+
data_arrays = [[], []] if data_arrays.size == 0
|
86
|
+
spec.data_arrays = data_arrays
|
87
|
+
spec
|
88
|
+
end
|
89
|
+
|
90
|
+
|
67
91
|
# the most common param to pass in would be ms level: 'MS:1000511'
|
68
92
|
#
|
69
93
|
# This would generate a spectrum of ms_level=2 :
|
@@ -76,6 +100,7 @@ module MS
|
|
76
100
|
block.call(self) if block
|
77
101
|
end
|
78
102
|
|
103
|
+
|
79
104
|
# see SpectrumList for generating the entire list
|
80
105
|
def to_xml(builder)
|
81
106
|
atts = {}
|
data/lib/ms/mzml.rb
CHANGED
@@ -4,7 +4,7 @@ require 'nokogiri'
|
|
4
4
|
require 'io/bookmark'
|
5
5
|
require 'zlib'
|
6
6
|
require 'ms/mzml/index_list'
|
7
|
-
require 'ms/spectrum'
|
7
|
+
require 'ms/mzml/spectrum'
|
8
8
|
require 'ms/mzml/file_description'
|
9
9
|
require 'ms/mzml/software'
|
10
10
|
require 'ms/mzml/scan_list'
|
@@ -161,6 +161,7 @@ module MS
|
|
161
161
|
end
|
162
162
|
|
163
163
|
class << self
|
164
|
+
|
164
165
|
# read-only right now
|
165
166
|
def open(filename, &block)
|
166
167
|
File.open(filename) do |io|
|
@@ -169,6 +170,7 @@ module MS
|
|
169
170
|
end
|
170
171
|
|
171
172
|
def foreach(filename, &block)
|
173
|
+
block or return enum_for(__method__, filename)
|
172
174
|
open(filename) do |mzml|
|
173
175
|
mzml.each(&block)
|
174
176
|
end
|
@@ -208,9 +210,14 @@ module MS
|
|
208
210
|
end
|
209
211
|
|
210
212
|
def each_spectrum(&block)
|
213
|
+
block or return enum_for(__method__)
|
211
214
|
(0...@index_list[:spectrum].size).each do |int|
|
212
|
-
block.call
|
215
|
+
block.call(spectrum(int))
|
213
216
|
end
|
217
|
+
#block_given? or return enum_for(__method__)
|
218
|
+
#(0...@index_list[:spectrum].size).each do |int|
|
219
|
+
# yield spectrum(int)
|
220
|
+
#end
|
214
221
|
end
|
215
222
|
|
216
223
|
# returns the Nokogiri::XML::Node object associated with each spectrum
|
@@ -231,17 +238,9 @@ module MS
|
|
231
238
|
# @param [Object] arg an index number (Integer) or id string (String)
|
232
239
|
# @return [MS::Spectrum] a spectrum object
|
233
240
|
def spectrum(arg)
|
234
|
-
################### trouble
|
235
241
|
start_byte = index_list[0].start_byte(arg)
|
236
|
-
|
237
|
-
|
238
|
-
base64 = binary_data_array_n.xpath('./binary').text
|
239
|
-
MS::Mzml.unpack_binary(base64, accessions)
|
240
|
-
end
|
241
|
-
# if there is no spectrum, we will still return a spectrum object, it
|
242
|
-
# just has no mzs or intensities
|
243
|
-
data_arrays = [[], []] if data_arrays.size == 0
|
244
|
-
MS::Spectrum.new(data_arrays)
|
242
|
+
spec_n = spectrum_node_from_start_byte(start_byte)
|
243
|
+
MS::Mzml::Spectrum.from_xml(spec_n)
|
245
244
|
end
|
246
245
|
|
247
246
|
# returns the number of spectra
|
data/lib/ms/spectrum.rb
CHANGED
@@ -156,7 +156,7 @@ module MS
|
|
156
156
|
|
157
157
|
if opt[:normalize]
|
158
158
|
sz = spectra.size
|
159
|
-
spectrum.
|
159
|
+
spectrum.intensities.map! {|v| v.to_f / sz }
|
160
160
|
end
|
161
161
|
if opt[:return_data]
|
162
162
|
$stderr.puts "returning spectrum (#{spectrum.mzs.size}) and data" if $VERBOSE
|
data/lib/ms/spectrum_like.rb
CHANGED
@@ -10,24 +10,25 @@ module MS
|
|
10
10
|
# boolean for if the spectrum represents centroided data or not
|
11
11
|
attr_accessor :centroided
|
12
12
|
|
13
|
-
# The underlying data store. methods are implemented so that
|
14
|
-
# the m/z's and
|
15
|
-
attr_accessor :
|
13
|
+
# The underlying data store. methods are implemented so that data_arrays[0] is
|
14
|
+
# the m/z's and data_arrays[1] is intensities
|
15
|
+
attr_accessor :data_arrays
|
16
|
+
|
16
17
|
|
17
18
|
def centroided?() centroided end
|
18
19
|
|
19
|
-
# data takes an array: [mzs, intensities]
|
20
20
|
# @return [MS::Spectrum]
|
21
21
|
# @param [Array] data two element array of mzs and intensities
|
22
|
-
|
23
|
-
|
22
|
+
# @param [Boolean] centroided is the spectrum centroided or not
|
23
|
+
def initialize(data_arrays, centroided=true)
|
24
|
+
@data_arrays = data_arrays
|
24
25
|
@centroided = centroided
|
25
26
|
end
|
26
27
|
|
27
28
|
# found by querying the size of the data store. This should almost always
|
28
29
|
# be 2 (m/z and intensities)
|
29
30
|
def size
|
30
|
-
@
|
31
|
+
@data_arrays.size
|
31
32
|
end
|
32
33
|
|
33
34
|
def ==(other)
|
@@ -36,26 +37,26 @@ module MS
|
|
36
37
|
|
37
38
|
# An array of the mz data.
|
38
39
|
def mzs
|
39
|
-
@
|
40
|
+
@data_arrays[0]
|
40
41
|
end
|
41
42
|
|
42
43
|
# An array of the intensities data, corresponding to mzs.
|
43
44
|
def intensities
|
44
|
-
@
|
45
|
+
@data_arrays[1]
|
45
46
|
end
|
46
47
|
|
47
48
|
def mzs_and_intensities
|
48
|
-
[@
|
49
|
+
[@data_arrays[0], @data_arrays[1]]
|
49
50
|
end
|
50
51
|
|
51
52
|
# retrieve an m/z and intensity doublet at that index
|
52
53
|
def [](array_index)
|
53
|
-
[@
|
54
|
+
[@data_arrays[0][array_index], @data_arrays[1][array_index]]
|
54
55
|
end
|
55
56
|
|
56
57
|
# yields(mz, inten) across the spectrum, or array of doublets if no block
|
57
58
|
def points(&block)
|
58
|
-
@
|
59
|
+
@data_arrays[0].zip(@data_arrays[1], &block)
|
59
60
|
end
|
60
61
|
|
61
62
|
alias_method :each, :points
|
@@ -84,7 +85,7 @@ module MS
|
|
84
85
|
def sort!
|
85
86
|
_points = points.to_a
|
86
87
|
_points.sort!
|
87
|
-
_points.each_with_index {|(mz,int), i| @
|
88
|
+
_points.each_with_index {|(mz,int), i| @data_arrays[0][i] = mz ; @data_arrays[1][i] = int }
|
88
89
|
self
|
89
90
|
end
|
90
91
|
|
data/spec/ms/mzml/plms1_spec.rb
CHANGED
@@ -23,7 +23,7 @@ describe 'converting mzml to plms1' do
|
|
23
23
|
plms1.scan_numbers.should == scan_nums
|
24
24
|
plms1.spectra.each do |spec|
|
25
25
|
spec.size.should == 2
|
26
|
-
spec.
|
26
|
+
spec.should be_a_kind_of(MS::SpectrumLike)
|
27
27
|
spec.mzs.should == []
|
28
28
|
spec.intensities.should == []
|
29
29
|
end
|
@@ -51,7 +51,7 @@ describe 'converting mzml to plms1' do
|
|
51
51
|
plms1.scan_numbers.should == [1, 2, 3]
|
52
52
|
sizes = [20168, 315, 634]
|
53
53
|
plms1.spectra.zip(sizes).each do |spec,exp_size|
|
54
|
-
spec.
|
54
|
+
spec.should be_a_kind_of(MS::SpectrumLike)
|
55
55
|
spec.size.should == 2
|
56
56
|
spec.mzs.size.should == exp_size
|
57
57
|
spec.intensities.size.should == exp_size
|
data/spec/ms/mzml_spec.rb
CHANGED
@@ -19,9 +19,10 @@ describe MS::Mzml do
|
|
19
19
|
|
20
20
|
it '#spectrum (or #[]) returns a spectrum when queried by index (Integer)' do
|
21
21
|
spectrum = @mzml.spectrum(1) # getting the second spectrum
|
22
|
-
spectrum1 = @mzml[1]
|
22
|
+
spectrum1 = @mzml[1] # can get with brackets
|
23
|
+
spectrum.ms_level.should == 2
|
23
24
|
spectrum.should == spectrum1
|
24
|
-
spectrum.should be_a(MS::Spectrum)
|
25
|
+
spectrum.should be_a(MS::Mzml::Spectrum)
|
25
26
|
spectrum.should respond_to(:mzs)
|
26
27
|
spectrum.should respond_to(:intensities)
|
27
28
|
spectrum.mzs.size.should == 315
|
@@ -32,8 +33,9 @@ describe MS::Mzml do
|
|
32
33
|
it '#spectrum (or #[]) returns a spectrum when queried by id (String)' do
|
33
34
|
spectrum = @mzml.spectrum("controllerType=0 controllerNumber=1 scan=2")
|
34
35
|
spectrum1 = @mzml["controllerType=0 controllerNumber=1 scan=2"]
|
36
|
+
spectrum.ms_level.should == 2
|
35
37
|
spectrum.should == spectrum1
|
36
|
-
spectrum.should be_a(MS::Spectrum)
|
38
|
+
spectrum.should be_a(MS::Mzml::Spectrum)
|
37
39
|
end
|
38
40
|
|
39
41
|
it 'goes through spectrum with #each or #each_spectrum' do
|
@@ -42,6 +44,27 @@ describe MS::Mzml do
|
|
42
44
|
spec.mzs.size.should == mz_sizes.shift
|
43
45
|
end
|
44
46
|
end
|
47
|
+
|
48
|
+
it 'gets an enumerator if called without a block' do
|
49
|
+
mz_sizes = [20168, 315, 634]
|
50
|
+
iter = @mzml.each
|
51
|
+
3.times { iter.next.mzs.size.should == mz_sizes.shift }
|
52
|
+
lambda {iter.next}.should raise_error
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'iterates with foreach' do
|
56
|
+
mz_sizes = [20168, 315, 634]
|
57
|
+
iter = MS::Mzml.foreach(@file)
|
58
|
+
3.times { iter.next.mzs.size.should == mz_sizes.shift }
|
59
|
+
lambda {iter.next}.should raise_error
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'can gracefully determine the m/z with highest peak in select scans' do
|
63
|
+
highest_mzs = MS::Mzml.foreach(@file).select {|v| v.ms_level > 1 }.map do |spec|
|
64
|
+
spec.points.sort_by(&:last).first.first
|
65
|
+
end
|
66
|
+
highest_mzs.map(&:round).should == [453, 866]
|
67
|
+
end
|
45
68
|
end
|
46
69
|
end
|
47
70
|
|
@@ -51,7 +74,7 @@ describe MS::Mzml do
|
|
51
74
|
string.gsub(/"mspire" version="([\.\d]+)"/, %Q{"mspire" version="X.X.X"})
|
52
75
|
end
|
53
76
|
|
54
|
-
it '
|
77
|
+
it 'writes MS1 spectra and retention times' do
|
55
78
|
|
56
79
|
spec_params = ['MS:1000127', ['MS:1000511', 1]]
|
57
80
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mspire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.19
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-02-
|
13
|
+
date: 2012-02-24 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: nokogiri
|
17
|
-
requirement: &
|
17
|
+
requirement: &10271800 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '1.5'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *10271800
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: bsearch
|
28
|
-
requirement: &
|
28
|
+
requirement: &10656900 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 1.5.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *10656900
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: andand
|
39
|
-
requirement: &
|
39
|
+
requirement: &10739280 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 1.3.1
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *10739280
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: obo
|
50
|
-
requirement: &
|
50
|
+
requirement: &10814460 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: 0.1.0
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *10814460
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: rspec
|
61
|
-
requirement: &
|
61
|
+
requirement: &10811160 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ~>
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: '2.6'
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *10811160
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: jeweler
|
72
|
-
requirement: &
|
72
|
+
requirement: &10888880 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
@@ -77,10 +77,10 @@ dependencies:
|
|
77
77
|
version: 1.5.2
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *10888880
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: rcov
|
83
|
-
requirement: &
|
83
|
+
requirement: &10902860 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - ! '>='
|
@@ -88,7 +88,7 @@ dependencies:
|
|
88
88
|
version: '0'
|
89
89
|
type: :development
|
90
90
|
prerelease: false
|
91
|
-
version_requirements: *
|
91
|
+
version_requirements: *10902860
|
92
92
|
description: mass spectrometry proteomics, lipidomics, and tools, a rewrite of mspire,
|
93
93
|
merging of ms-* gems
|
94
94
|
email: jtprince@gmail.com
|