ms-msrun 0.0.1
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/LICENSE +16 -0
- data/README +62 -0
- data/Rakefile +113 -0
- data/bin/base64_to_array.rb +13 -0
- data/bin/ms_to_obiwarp.rb +69 -0
- data/bin/ms_to_search.rb +44 -0
- data/lib/bsearch.rb +120 -0
- data/lib/lmat.rb +171 -0
- data/lib/ms/msrun.rb +297 -0
- data/lib/ms/msrun/axml/mzxml.rb +141 -0
- data/lib/ms/msrun/search.rb +118 -0
- data/lib/ms/precursor.rb +27 -0
- data/lib/ms/scan.rb +93 -0
- data/lib/ms/spectrum.rb +373 -0
- data/lib/ms/spectrum/compare.rb +118 -0
- data/lib/ms/spectrum/filter.rb +46 -0
- data/spec/lmat_spec.rb +29 -0
- data/spec/ms/msrun/search_spec.rb +56 -0
- data/spec/ms/msrun_spec.rb +50 -0
- data/spec/ms/scan_spec.rb +34 -0
- data/spec/ms/spectrum/compare_spec.rb +44 -0
- data/spec/ms/spectrum/filter_spec.rb +33 -0
- metadata +97 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
|
2
|
+
require 'ms/spectrum'
|
3
|
+
|
4
|
+
module Kernel
|
5
|
+
private
|
6
|
+
def this_method
|
7
|
+
caller[0] =~ /`([^']*)'/ and $1
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Array
|
12
|
+
def sum
|
13
|
+
self.inject(0.0) {|_sum, v| _sum += v }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module Ms
|
18
|
+
class Spectrum
|
19
|
+
module Compare
|
20
|
+
|
21
|
+
# (Σ (Ii*Ij)^½) / (ΣIi * ΣIj)^½
|
22
|
+
def sim_score(other, opts={})
|
23
|
+
numer = 0.0
|
24
|
+
compare(other, {:yield_diff => false}) do |sint, oint|
|
25
|
+
numer += Math.sqrt(sint * oint)
|
26
|
+
end
|
27
|
+
numer / Math.sqrt( self.ints.sum * other.ints.sum )
|
28
|
+
end
|
29
|
+
|
30
|
+
# opts[:type] == :mutual_best
|
31
|
+
# will only return intensities on mutual best matches within radius.
|
32
|
+
# yields [self_intensity, other_intensity] for each match within
|
33
|
+
# the radius.
|
34
|
+
#
|
35
|
+
# opts[:type] == :best
|
36
|
+
# yields the best match in the radius peak. If one peak is already
|
37
|
+
# spoken for, a different peak may still match a close peak if it is
|
38
|
+
# its best match (how to explain this?).
|
39
|
+
#
|
40
|
+
# if opts[:yield_diff] == true then returns [..., diff] (d: true)
|
41
|
+
# if opts[:yield_mz] == true then returns [mz, mz, int, int] (d: false)
|
42
|
+
# if opts[:yield_indices] == true then returns [i,j] (d: false)
|
43
|
+
# assumes mzs are increasing
|
44
|
+
def compare(other, opts={})
|
45
|
+
defaults = {:radius => 1.0, :type=>:mutual_best, :yield_diff => true, :yield_mz => false, :yield_indices => false}
|
46
|
+
(radius, type, yield_diff, yield_mz, yield_indices) = defaults.merge(opts).values_at(:radius, :type, :yield_diff, :yield_mz, :yield_indices)
|
47
|
+
blk = block_given?
|
48
|
+
output = [] if !blk
|
49
|
+
s_ints = self.intensities
|
50
|
+
s_size = self.mzs.size
|
51
|
+
o_mzs = other.mzs
|
52
|
+
o_size = o_mzs.size
|
53
|
+
o_ints = other.intensities
|
54
|
+
oi = 0
|
55
|
+
start_j = 0
|
56
|
+
save = []
|
57
|
+
self.mzs.each_with_index do |mz,i|
|
58
|
+
break if start_j >= o_size
|
59
|
+
hi = mz + radius
|
60
|
+
lo = mz - radius
|
61
|
+
start_j.upto(o_size-1) do |j|
|
62
|
+
diff = mz - o_mzs[j]
|
63
|
+
absdiff = diff.abs
|
64
|
+
if absdiff <= radius # a potential hit!
|
65
|
+
save << [absdiff, i, j]
|
66
|
+
elsif diff < 0 # we overshot
|
67
|
+
break
|
68
|
+
else # undershot
|
69
|
+
start_j = j + 1 # this is for the benefit of the next search
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
#puts "BEFORE SORT: "
|
75
|
+
#p save
|
76
|
+
#save.sort!
|
77
|
+
#puts "AFTER SORT: "
|
78
|
+
#p save
|
79
|
+
iset = Array.new(s_size)
|
80
|
+
jset = Array.new(o_size)
|
81
|
+
save.each do |diff, i, j|
|
82
|
+
unless iset[i] || jset[j]
|
83
|
+
if type == :best
|
84
|
+
iset[i] = true
|
85
|
+
jset[j] = true
|
86
|
+
end
|
87
|
+
to_ret =
|
88
|
+
if yield_indices
|
89
|
+
[i,j]
|
90
|
+
else
|
91
|
+
[s_ints[i], o_ints[j]]
|
92
|
+
end
|
93
|
+
if yield_mz
|
94
|
+
to_ret.unshift( s_mzs[i], o_mzs[j] )
|
95
|
+
end
|
96
|
+
if yield_diff
|
97
|
+
to_ret.push( diff )
|
98
|
+
end
|
99
|
+
if blk
|
100
|
+
yield to_ret
|
101
|
+
else
|
102
|
+
output << to_ret
|
103
|
+
end
|
104
|
+
end
|
105
|
+
if type == :mutual_best
|
106
|
+
iset[i] = true
|
107
|
+
jset[j] = true
|
108
|
+
end
|
109
|
+
end
|
110
|
+
output
|
111
|
+
end
|
112
|
+
end # Compare
|
113
|
+
|
114
|
+
include Compare
|
115
|
+
end # Spectrum
|
116
|
+
end # Ms
|
117
|
+
|
118
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'ms/spectrum'
|
2
|
+
|
3
|
+
module Ms
|
4
|
+
class Spectrum
|
5
|
+
module Filter
|
6
|
+
|
7
|
+
def filter(by=:bins, opts={})
|
8
|
+
send("filter_by_#{by}".to_sym, opts)
|
9
|
+
end
|
10
|
+
|
11
|
+
# filters by binning the mz field
|
12
|
+
# bin_width is in m/z units
|
13
|
+
# num_peaks is the top peaks to include per bin
|
14
|
+
def filter_by_bins(opts={})
|
15
|
+
(bw, np) = {:bin_width => 100, :num_peaks => 7 }.merge(opts).values_at(:bin_width, :num_peaks)
|
16
|
+
|
17
|
+
stop = bw
|
18
|
+
track = []
|
19
|
+
track_all = [track]
|
20
|
+
ints = self.intensities
|
21
|
+
self.each do |mz,int|
|
22
|
+
if mz > stop
|
23
|
+
stop += bw
|
24
|
+
track = []
|
25
|
+
track_all << track
|
26
|
+
end
|
27
|
+
track << [int, mz]
|
28
|
+
end
|
29
|
+
|
30
|
+
include = []
|
31
|
+
track_all.each do |track|
|
32
|
+
track.sort!
|
33
|
+
start = (track.size < np) ? track.size : np
|
34
|
+
include.push( *( track[-start,np]) )
|
35
|
+
end
|
36
|
+
|
37
|
+
ret_ints = []
|
38
|
+
ret_mzs = include.map {|int, mz| [mz, int] }.sort.map {|mz,int| ret_ints << int ; mz }
|
39
|
+
|
40
|
+
return Spectrum.new(ret_mzs, ret_ints)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
include Filter
|
45
|
+
end
|
46
|
+
end
|
data/spec/lmat_spec.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path( File.dirname(__FILE__) + '/spec_helper' )
|
2
|
+
|
3
|
+
require 'lmat'
|
4
|
+
|
5
|
+
class LmatUnitSpec < MiniTest::Spec
|
6
|
+
|
7
|
+
def initialize(*args)
|
8
|
+
@klass = Lmat
|
9
|
+
super(*args)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'can be created with no arguments' do
|
13
|
+
obj1 = @klass.new
|
14
|
+
obj1.class.must_equal @klass
|
15
|
+
end
|
16
|
+
|
17
|
+
xit 'can be created with arrays' do
|
18
|
+
obj = @klass[[1,2,3],[4,5,6]]
|
19
|
+
obj[0,0].must_equal 1
|
20
|
+
obj[1,0].must_equal 4
|
21
|
+
obj[1,2].must_equal 6
|
22
|
+
end
|
23
|
+
|
24
|
+
xit 'can find the max value' do
|
25
|
+
obj = @klass[[1,2,3],[1,8,3]]
|
26
|
+
obj.max.must_equal 8
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
require 'ms/msrun'
|
4
|
+
|
5
|
+
class SearchSpec < MiniTest::Spec
|
6
|
+
|
7
|
+
xit 'works' do
|
8
|
+
@file = '/home/jtprince/ms-msrun/spec/files/opd1/000.v1.mzXML'
|
9
|
+
params = {
|
10
|
+
:bottom_mh => 300.0,
|
11
|
+
:top_mh => 4500.0,
|
12
|
+
:ms_levels => (2..-1),
|
13
|
+
:min_peaks => 10,
|
14
|
+
}
|
15
|
+
|
16
|
+
# no scans:
|
17
|
+
no_scans = [
|
18
|
+
[:min_peaks, 1000],
|
19
|
+
[:first_scan, 21],
|
20
|
+
[:first_scan, 10000],
|
21
|
+
[:last_scan, 0],
|
22
|
+
[:ms_levels, (3..4)],
|
23
|
+
[:ms_levels, 0],
|
24
|
+
[:ms_levels, 3],
|
25
|
+
[:top_mh, 0.0],
|
26
|
+
[:bottom_mh, 5000],
|
27
|
+
]
|
28
|
+
Ms::Msrun.open(@file) do |ms|
|
29
|
+
no_scans.each do |k,v|
|
30
|
+
ms.to_mgf(nil, k => v).must_equal ""
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
some_scans = [
|
35
|
+
[:min_peaks, 0],
|
36
|
+
[:first_scan, 1],
|
37
|
+
[:first_scan, 9],
|
38
|
+
[:last_scan, 8],
|
39
|
+
[:ms_levels, 2],
|
40
|
+
[:ms_levels, (2..2)],
|
41
|
+
[:ms_levels, (2...3)],
|
42
|
+
[:top_mh, 1500],
|
43
|
+
[:bottom_mh, 500],
|
44
|
+
]
|
45
|
+
Ms::Msrun.open(@file) do |ms|
|
46
|
+
no_scans.each do |k,v|
|
47
|
+
reply = ms.to_mgf(nil, k => v)
|
48
|
+
puts reply
|
49
|
+
reply.must_match(/BEGIN.IONS/)
|
50
|
+
reply.must_match(/END.IONS/)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
|
2
|
+
|
3
|
+
require 'ms/msrun'
|
4
|
+
|
5
|
+
module MsrunSpec
|
6
|
+
extend Shareable
|
7
|
+
|
8
|
+
before do
|
9
|
+
@file = nil # you need to define this!
|
10
|
+
@key = nil # <- do nothing with this.
|
11
|
+
end
|
12
|
+
|
13
|
+
def key
|
14
|
+
@key || @key = YAML.load_file(@file + '.key.yml')
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'reads header information' do
|
18
|
+
Ms::Msrun.open(@file) do |ms|
|
19
|
+
key['header'].each do |k,v|
|
20
|
+
ms.send(k.to_sym).must_equal v
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
class Mzxml_v1 < MiniTest::Spec
|
28
|
+
include MsrunSpec
|
29
|
+
before do
|
30
|
+
super
|
31
|
+
@file = '/home/jtprince/ms-msrun/spec/files/opd1/000.v1.mzXML'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Mzxml_v2_0 < MiniTest::Spec
|
36
|
+
include MsrunSpec
|
37
|
+
before do
|
38
|
+
super
|
39
|
+
@file = '/home/jtprince/ms-msrun/spec/files/opd1/020.v2.0.readw.mzXML'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Mzxml_v2_1 < MiniTest::Spec
|
44
|
+
include MsrunSpec
|
45
|
+
before do
|
46
|
+
super
|
47
|
+
@file = '/home/jtprince/ms-msrun/spec/files/opd1/000.v2.1.mzXML'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
require 'ms/msrun'
|
4
|
+
|
5
|
+
class ScanUnitSpec < MiniTest::Spec
|
6
|
+
|
7
|
+
before do
|
8
|
+
@scan = Ms::Scan.new
|
9
|
+
@scan.precursor = Ms::Precursor.new
|
10
|
+
@scan.spectrum = Ms::Spectrum.new([1,2,3,4], [2,4,4,2])
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
it 'determines if its +1 or not' do
|
15
|
+
# these have not been checked for accuracy, just sanity
|
16
|
+
reply = [0.1,2.5, 3.5, 5].map do |prec_mz|
|
17
|
+
@scan.precursor.mz = prec_mz
|
18
|
+
@scan.plus1?(-0.1)
|
19
|
+
end
|
20
|
+
reply.all? {|v| v == true }.must_equal true
|
21
|
+
|
22
|
+
reply = [0.1,2.5, 3.5, 5].map do |prec_mz|
|
23
|
+
@scan.precursor.mz = prec_mz
|
24
|
+
@scan.plus1?(1.0)
|
25
|
+
end
|
26
|
+
reply.all? {|v| v == false }.must_equal true
|
27
|
+
|
28
|
+
reply = [0.1,2.5, 3.5, 5].map do |prec_mz|
|
29
|
+
@scan.precursor.mz = prec_mz
|
30
|
+
@scan.plus1?(0.5)
|
31
|
+
end
|
32
|
+
reply.must_equal [false, false, true, true]
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
|
2
|
+
|
3
|
+
require 'ms/spectrum/compare'
|
4
|
+
|
5
|
+
# when you switch order the return intensities are swapped:
|
6
|
+
class Array
|
7
|
+
def rev_ab
|
8
|
+
each {|v| (v[0], v[1]) = v[1], v[0] }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class CompareSpec < MiniTest::Spec
|
13
|
+
include Ms
|
14
|
+
|
15
|
+
before do
|
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])
|
18
|
+
|
19
|
+
@c = Spectrum.new([0, 1], [8,9])
|
20
|
+
@d = Spectrum.new([0.6, 0.75], [10,11])
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'compares spectra' do
|
24
|
+
# array form:
|
25
|
+
@c.compare(@d).rev_ab.must_equal( @d.compare(@c) )
|
26
|
+
@c.compare(@d).must_equal [[8, 10, 0.6]]
|
27
|
+
|
28
|
+
# block form
|
29
|
+
exp = [[5,9], [6,10], [7,11]]
|
30
|
+
# default radius 1.0
|
31
|
+
@a.compare(@b) do |int_a, int_b|
|
32
|
+
exp.delete([int_a, int_b])
|
33
|
+
end
|
34
|
+
exp.size.must_equal 0
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'computes similarity score' do
|
38
|
+
p @a.sim_score(@b)
|
39
|
+
p @a.sim_score(@a)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
|
2
|
+
|
3
|
+
require 'ms/spectrum/filter'
|
4
|
+
|
5
|
+
|
6
|
+
# when you switch order the return intensities are swapped:
|
7
|
+
class Array
|
8
|
+
def rev_ab
|
9
|
+
each {|v| (v[0], v[1]) = v[1], v[0] }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class FilterSpec < MiniTest::Spec
|
14
|
+
include Ms
|
15
|
+
|
16
|
+
before do
|
17
|
+
@a = Spectrum.new([0,5,10, 15,16,17,18, 20.1], [0,1,2, 3,8,10,4, 0])
|
18
|
+
@null = Spectrum.new
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'filters spectra' do
|
22
|
+
spec = @a.filter(:bins, :bin_width => 10, :num_peaks => 2)
|
23
|
+
spec.mzs.must_equal [5,10,16,17,20.1]
|
24
|
+
spec.ints.must_equal [1,2,8,10,0]
|
25
|
+
|
26
|
+
@a.filter(:bins, :bin_width => 100, :num_peaks => 8).must_equal @a
|
27
|
+
@a.filter(:bins, :bin_width => 1, :num_peaks => 1).must_equal @a
|
28
|
+
@a.filter(:bins, :bin_width => 1, :num_peaks => 0).must_equal @null
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ms-msrun
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Prince
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-03-17 00:00:00 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: axml
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ~>
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.5
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: runarray
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description: A library for working with LC/MS runs. Part of mspire. Has parsers for mzXML v1, 2, and 3, mzData and mzML. Can convert to commonly desired search output (such as mgf)
|
36
|
+
email: jtprince@gmail.com
|
37
|
+
executables:
|
38
|
+
- ms_to_search.rb
|
39
|
+
- base64_to_array.rb
|
40
|
+
- ms_to_obiwarp.rb
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files:
|
44
|
+
- README
|
45
|
+
- LICENSE
|
46
|
+
files:
|
47
|
+
- lib/ms/spectrum.rb
|
48
|
+
- lib/ms/msrun/axml/mzxml.rb
|
49
|
+
- lib/ms/msrun/search.rb
|
50
|
+
- lib/ms/msrun.rb
|
51
|
+
- lib/ms/scan.rb
|
52
|
+
- lib/ms/spectrum/compare.rb
|
53
|
+
- lib/ms/spectrum/filter.rb
|
54
|
+
- lib/ms/precursor.rb
|
55
|
+
- lib/bsearch.rb
|
56
|
+
- lib/lmat.rb
|
57
|
+
- README
|
58
|
+
- LICENSE
|
59
|
+
- Rakefile
|
60
|
+
has_rdoc: true
|
61
|
+
homepage: http://mspire.rubyforge.org/projects/ms-msrun
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options:
|
64
|
+
- --main
|
65
|
+
- README
|
66
|
+
- --title
|
67
|
+
- ms-msrun
|
68
|
+
- --line-numbers
|
69
|
+
- --inline-source
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: "0"
|
77
|
+
version:
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: "0"
|
83
|
+
version:
|
84
|
+
requirements:
|
85
|
+
- xmlparser (preferrably) or libxml
|
86
|
+
rubyforge_project: mspire
|
87
|
+
rubygems_version: 1.3.1
|
88
|
+
signing_key:
|
89
|
+
specification_version: 2
|
90
|
+
summary: A library for working with LC/MS runs
|
91
|
+
test_files:
|
92
|
+
- spec/ms/msrun_spec.rb
|
93
|
+
- spec/ms/msrun/search_spec.rb
|
94
|
+
- spec/ms/spectrum/compare_spec.rb
|
95
|
+
- spec/ms/spectrum/filter_spec.rb
|
96
|
+
- spec/ms/scan_spec.rb
|
97
|
+
- spec/lmat_spec.rb
|