mspire-lipidomics 0.1.5 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/bin/lipidomic-search.rb +4 -0
- data/lib/mspire/lipid/ion.rb +19 -5
- data/lib/mspire/lipid/modification.rb +7 -5
- data/lib/mspire/lipid_maps.rb +1 -1
- data/mspire-lipidomics.gemspec +6 -6
- data/script/find_nearest_lipid.rb +22 -18
- data/spec/mspire/lipid/ion_spec.rb +20 -9
- data/spec/mspire/lipid/modification_spec.rb +36 -20
- data/spec/mspire/lipid/search_spec.rb +3 -0
- metadata +7 -7
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ Jeweler::Tasks.new do |gem|
|
|
13
13
|
gem.description = %Q{does lipidomics}
|
14
14
|
gem.email = "jtprince@gmail.com"
|
15
15
|
gem.authors = ["John T. Prince"]
|
16
|
-
gem.add_dependency "mspire", "
|
16
|
+
gem.add_dependency "mspire", "~> 0.7.17"
|
17
17
|
gem.add_development_dependency "rubabel", ">= 0.1.0"
|
18
18
|
gem.add_development_dependency "rspec", "~> 2.3.0"
|
19
19
|
gem.add_development_dependency "jeweler", "~> 1.6.4"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.8
|
data/bin/lipidomic-search.rb
CHANGED
data/lib/mspire/lipid/ion.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'mspire/lipid/ion/fragment'
|
2
|
+
require 'mspire/molecular_formula'
|
2
3
|
|
3
4
|
module Mspire
|
4
5
|
class Lipid
|
@@ -20,20 +21,27 @@ module Mspire
|
|
20
21
|
def charge
|
21
22
|
z = 0
|
22
23
|
@modifications.each do |mod|
|
23
|
-
z
|
24
|
+
z += mod.charge
|
24
25
|
end
|
25
26
|
z
|
26
27
|
end
|
27
28
|
|
29
|
+
# a MolecularFormula object
|
28
30
|
def formula
|
29
|
-
|
31
|
+
_formula = @lipid.formula
|
32
|
+
_formula = Mspire::MolecularFormula.from_any(_formula) unless _formula.is_a?(Mspire::MolecularFormula)
|
30
33
|
modifications.each do |mod|
|
31
|
-
|
34
|
+
if mod.gain?
|
35
|
+
_formula += mod.formula
|
36
|
+
else
|
37
|
+
_formula -= mod.formula
|
38
|
+
end
|
32
39
|
end
|
33
|
-
|
40
|
+
_formula
|
34
41
|
end
|
35
42
|
|
36
|
-
|
43
|
+
# value is cached
|
44
|
+
def mz_signed
|
37
45
|
return @mz if @mz
|
38
46
|
mass = @lipid.mass
|
39
47
|
charge = 0
|
@@ -48,6 +56,12 @@ module Mspire
|
|
48
56
|
end
|
49
57
|
end
|
50
58
|
|
59
|
+
# the unsigned m/z value
|
60
|
+
def mz
|
61
|
+
_mz_signed = mz_signed
|
62
|
+
_mz_signed >= 0 ? _mz_signed : -_mz_signed
|
63
|
+
end
|
64
|
+
|
51
65
|
def inspect
|
52
66
|
"<|| Ion mz=#{mz} #{lipid.inspect} + #{modifications.map(&:inspect).join(', ')} ||>"
|
53
67
|
end
|
@@ -59,7 +59,7 @@ module Mspire
|
|
59
59
|
|
60
60
|
# as a symbol
|
61
61
|
attr_accessor :name
|
62
|
-
#
|
62
|
+
# a MolecularFormula object
|
63
63
|
attr_accessor :formula
|
64
64
|
# negative indicates a loss
|
65
65
|
attr_accessor :massdiff
|
@@ -73,7 +73,7 @@ module Mspire
|
|
73
73
|
#
|
74
74
|
# attributes:
|
75
75
|
# :formula = the chemical formula, lipidmaps style ("C2H4BrO") or
|
76
|
-
# any valid argument to MolecularFormula.
|
76
|
+
# any valid argument to MolecularFormula.from_any
|
77
77
|
# :massdiff = +/-Float
|
78
78
|
# :charge = +/- Integer
|
79
79
|
#
|
@@ -89,7 +89,7 @@ module Mspire
|
|
89
89
|
@name = name
|
90
90
|
@formula =
|
91
91
|
if ( form_string = (opts[:formula] || FORMULAS[name]) )
|
92
|
-
Mspire::MolecularFormula.
|
92
|
+
Mspire::MolecularFormula.from_any( form_string )
|
93
93
|
end
|
94
94
|
@massdiff = opts[:massdiff] || MASSDIFFS[name]
|
95
95
|
@charge = opts[:charge] || CHARGE[name]
|
@@ -102,10 +102,12 @@ module Mspire
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
-
def
|
105
|
+
def charged_formula_string
|
106
106
|
@formula.to_s + @charge.abs.times.map { (@charge > 0) ? '+' : '-' }.join
|
107
107
|
end
|
108
108
|
|
109
|
+
alias_method :to_s, :charged_formula_string
|
110
|
+
|
109
111
|
def gain?
|
110
112
|
massdiff > 0
|
111
113
|
end
|
@@ -115,7 +117,7 @@ module Mspire
|
|
115
117
|
end
|
116
118
|
|
117
119
|
def inspect
|
118
|
-
"<Mod: #{
|
120
|
+
"<Mod: #{to_s}>"
|
119
121
|
end
|
120
122
|
|
121
123
|
end
|
data/lib/mspire/lipid_maps.rb
CHANGED
@@ -69,7 +69,7 @@ module Mspire
|
|
69
69
|
if opts.values_at(:molecular_formula_objects, :rubabel_molecules).any? || (opts[:high_res_mass] && lm_ft == :programmatic)
|
70
70
|
lipids.each do |lipid|
|
71
71
|
if opts[:molecular_formula_objects]
|
72
|
-
lipid.formula = Mspire::MolecularFormula.
|
72
|
+
lipid.formula = Mspire::MolecularFormula.from_string(lipid.formula)
|
73
73
|
end
|
74
74
|
if lm_ft == :programmatic && opts[:high_res_mass]
|
75
75
|
lipid.mass = Mspire::Mass.formula_to_exact_mass(lipid.formula)
|
data/mspire-lipidomics.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "mspire-lipidomics"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["John T. Prince"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-07-10"
|
13
13
|
s.description = "does lipidomics"
|
14
14
|
s.email = "jtprince@gmail.com"
|
15
15
|
s.executables = ["lipidomic-search.rb"]
|
@@ -56,27 +56,27 @@ Gem::Specification.new do |s|
|
|
56
56
|
s.homepage = "http://github.com/princelab/mspire-lipidomics"
|
57
57
|
s.licenses = ["MIT"]
|
58
58
|
s.require_paths = ["lib"]
|
59
|
-
s.rubygems_version = "1.8.
|
59
|
+
s.rubygems_version = "1.8.24"
|
60
60
|
s.summary = "mass spectrometry based lipidomics - especially shotgun lipidomics"
|
61
61
|
|
62
62
|
if s.respond_to? :specification_version then
|
63
63
|
s.specification_version = 3
|
64
64
|
|
65
65
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
66
|
-
s.add_runtime_dependency(%q<mspire>, ["
|
66
|
+
s.add_runtime_dependency(%q<mspire>, ["~> 0.7.17"])
|
67
67
|
s.add_development_dependency(%q<rubabel>, [">= 0.1.0"])
|
68
68
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
69
69
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
70
70
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
71
71
|
else
|
72
|
-
s.add_dependency(%q<mspire>, ["
|
72
|
+
s.add_dependency(%q<mspire>, ["~> 0.7.17"])
|
73
73
|
s.add_dependency(%q<rubabel>, [">= 0.1.0"])
|
74
74
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
75
75
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
76
76
|
s.add_dependency(%q<rcov>, [">= 0"])
|
77
77
|
end
|
78
78
|
else
|
79
|
-
s.add_dependency(%q<mspire>, ["
|
79
|
+
s.add_dependency(%q<mspire>, ["~> 0.7.17"])
|
80
80
|
s.add_dependency(%q<rubabel>, [">= 0.1.0"])
|
81
81
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
82
82
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
@@ -14,11 +14,11 @@ parser = Trollop::Parser.new do
|
|
14
14
|
opt :top_n, "how many closest ions to print", :default => 3
|
15
15
|
banner ""
|
16
16
|
text "modifications: (at least 1 charged mod is required)"
|
17
|
-
opt :lithium, "search for lithium adducts"
|
18
|
-
opt :ammonium, "search for ammonium adducts"
|
19
|
-
opt :proton_gain, "search for proton
|
20
|
-
opt :proton_loss, "search for proton
|
21
|
-
opt :water_loss, "if used, *all* mods are also considered with water
|
17
|
+
opt :lithium, "search for i down to 1 lithium adducts", :default => 0
|
18
|
+
opt :ammonium, "search for i down to 1 ammonium adducts", :default => 0
|
19
|
+
opt :proton_gain, "search for i down to 1 proton additions", :default => 0
|
20
|
+
opt :proton_loss, "search for i down to 1 proton losses", :default => 0
|
21
|
+
opt :water_loss, "if used, *all* mods are also considered with i down to 0 water losses", :default => 0
|
22
22
|
opt :textfile, "a text file with m/z values, one per line", :type => String
|
23
23
|
opt :lower_bound, "use lower bound searching (requires m/z's to be in sorted order)"
|
24
24
|
opt :sort, "sorts the m/z's"
|
@@ -33,7 +33,7 @@ end
|
|
33
33
|
|
34
34
|
CHARGED_MODS = [:lithium, :ammonium, :proton_gain, :proton_loss]
|
35
35
|
|
36
|
-
unless CHARGED_MODS.any? {|key| opts[key] }
|
36
|
+
unless CHARGED_MODS.any? {|key| opts[key] > 0 }
|
37
37
|
puts "*" * 78
|
38
38
|
puts "ArgumentError: need at least one charged mod!"
|
39
39
|
puts "*" * 78
|
@@ -44,9 +44,11 @@ end
|
|
44
44
|
(lipidmaps, *actual_mzs) = ARGV
|
45
45
|
|
46
46
|
if f=opts[:textfile]
|
47
|
-
actual_mzs = IO.readlines(f).map(&:chomp)
|
47
|
+
actual_mzs = IO.readlines(f).map(&:chomp)
|
48
48
|
end
|
49
49
|
|
50
|
+
actual_mzs.map!(&:to_f)
|
51
|
+
|
50
52
|
unless actual_mzs.size > 0
|
51
53
|
STDERR.puts "NO m/z values given!!!"
|
52
54
|
parser.educate
|
@@ -55,14 +57,14 @@ end
|
|
55
57
|
|
56
58
|
$VERBOSE = opts[:verbose]
|
57
59
|
|
58
|
-
|
60
|
+
LipidMod = Mspire::Lipid::Modification
|
59
61
|
|
60
62
|
mods = {
|
61
|
-
proton_gain:
|
62
|
-
water_loss:
|
63
|
-
lithium:
|
64
|
-
ammonium:
|
65
|
-
proton_loss:
|
63
|
+
proton_gain: LipidMod.new(:proton),
|
64
|
+
water_loss: LipidMod.new(:water, :loss => true),
|
65
|
+
lithium: LipidMod.new(:lithium),
|
66
|
+
ammonium: LipidMod.new(:ammonium),
|
67
|
+
proton_loss: LipidMod.new(:proton, :loss => true)
|
66
68
|
}
|
67
69
|
|
68
70
|
lipids = Mspire::LipidMaps.parse_file(lipidmaps)
|
@@ -70,10 +72,12 @@ lipids = Mspire::LipidMaps.parse_file(lipidmaps)
|
|
70
72
|
ions = []
|
71
73
|
lipids.each do |lipid|
|
72
74
|
CHARGED_MODS.each do |key|
|
73
|
-
if opts[key]
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
if opts[key] > 0
|
76
|
+
opts[key].downto(1) do |num_charge_mod|
|
77
|
+
mods_to_use = [mods[key]] * num_charge_mod
|
78
|
+
opts[:water_loss].downto(0) do |i|
|
79
|
+
ions << Mspire::Lipid::Ion.new(lipid, mods_to_use + ([mods[:water_loss]]*i))
|
80
|
+
end
|
77
81
|
end
|
78
82
|
end
|
79
83
|
end
|
@@ -110,7 +114,7 @@ actual_mzs.each do |exp_mz|
|
|
110
114
|
rank = i + 1
|
111
115
|
ppm = ((exp_mz - ion.mz) / ion.mz) * 1e6
|
112
116
|
lipid = ion.lipid
|
113
|
-
row.push( rank, ppm, ppm.abs, lipid.category, lipid.lm_id, lipid.common_name, ion.modifications.map(&:
|
117
|
+
row.push( rank, ppm, ppm.abs, lipid.category, lipid.lm_id, lipid.common_name, ion.modifications.map(&:charged_formula_string).join(", ") )
|
114
118
|
end
|
115
119
|
puts row.join("\t")
|
116
120
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
3
|
require 'mspire/lipid'
|
5
4
|
require 'mspire/lipid/modification'
|
6
5
|
require 'mspire/lipid/ion'
|
@@ -15,17 +14,29 @@ end
|
|
15
14
|
describe Mspire::Lipid::Ion do
|
16
15
|
|
17
16
|
before do
|
18
|
-
lipid = Mspire::Lipid.new
|
19
|
-
lipid.mass = 300.2
|
17
|
+
lipid = Mspire::Lipid.new("LMGP02010009", "PE(16:0/18:1(9Z))", "1-hexadecanoyl-2-(9Z-octadecenoyl)-sn-glycero-3-phosphoethanolamine", 'C39H76NO8P', 717.5308, 'Glycerophospholipids [GP]', 'Glycerophosphoethanolamines [GP02]', 'Diacylglycerophosphoethanolamines [GP0201]', '7850611', 'FHQVHHIBKUMWTI-OTMQOFQLSA-N')
|
20
18
|
proton = Mspire::Lipid::Modification.new(:proton)
|
19
|
+
proton_loss = Mspire::Lipid::Modification.new(:proton, :loss => true)
|
21
20
|
h2o_loss = Mspire::Lipid::Modification.new(:water, :loss => true)
|
22
|
-
@
|
23
|
-
@
|
21
|
+
@plus1_less_h20 = Mspire::Lipid::Ion.new(lipid, [proton, h2o_loss])
|
22
|
+
@plus2_less_h20 = Mspire::Lipid::Ion.new(lipid, [proton, proton, h2o_loss])
|
23
|
+
@minus1_less_h20 = Mspire::Lipid::Ion.new(lipid, [proton_loss, h2o_loss])
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'calculates the correct m/z' do
|
27
|
-
@
|
28
|
-
@
|
27
|
+
@plus1_less_h20.mz.should be_within(1e-5).of(700.52751178307)
|
28
|
+
@plus2_less_h20.mz.should be_within(1e-5).of(350.76739412492003)
|
29
|
+
@minus1_less_h20.mz.should be_within(1e-5).of(698.5129588842301)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'calculates the correct formula' do
|
33
|
+
@plus1_less_h20.formula.to_s.should == "C39H75NO7P"
|
34
|
+
@plus1_less_h20.charge.should == 1
|
35
|
+
|
36
|
+
@plus2_less_h20.formula.to_s.should == "C39H76NO7P"
|
37
|
+
@plus2_less_h20.charge.should == 2
|
38
|
+
@minus1_less_h20.formula.to_s.should == "C39H73NO7P"
|
39
|
+
@minus1_less_h20.charge.should == -1
|
29
40
|
end
|
30
41
|
|
31
42
|
describe 'predicting ms/ms fragments' do
|
@@ -43,7 +54,8 @@ describe Mspire::Lipid::Ion do
|
|
43
54
|
mzs.sort.should == frags.sort
|
44
55
|
end
|
45
56
|
|
46
|
-
|
57
|
+
# WORKING THIS GUY OUT!!!!!!
|
58
|
+
xit '11-methyl-9S-hydroxy-13E-hexadecenoic acid' do
|
47
59
|
lipid = Mspire::Lipid.new(nil, 'Made Up', '11-methyl-9S-hydroxy-13E-hexadecenoic acid', 'C17H32O3', 284.23514488492003, 'Fatty Acyls [FA]', 'Fatty Acids and Conjugates [FA01]', 'Branched fatty acids [FA0102]')
|
48
60
|
ion = Mspire::Lipid::Ion.new(lipid, [MSS::PROTON_LOSS])
|
49
61
|
|
@@ -69,7 +81,6 @@ describe Mspire::Lipid::Ion do
|
|
69
81
|
frags << frag1 - (MSS::H2O + MSS::CO2)
|
70
82
|
|
71
83
|
mzs = ion.predict_fragment_mzs
|
72
|
-
p mzs
|
73
84
|
#mzs.sort.should == frags.sort
|
74
85
|
end
|
75
86
|
|
@@ -1,30 +1,46 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
require 'mspire/lipid/modification'
|
4
|
+
require 'mspire/lipid'
|
5
|
+
require 'mspire/lipid/ion'
|
4
6
|
|
5
7
|
describe Mspire::Lipid::Modification do
|
6
8
|
Mod = Mspire::Lipid::Modification
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
10
|
+
describe 'creates common mods easily' do
|
11
|
+
|
12
|
+
it 'water loss' do
|
13
|
+
water_loss = Mod.new(:water, :loss => true)
|
14
|
+
water_loss.loss?.should be_true
|
15
|
+
water_loss.massdiff.<(0).should be_true
|
16
|
+
water_loss.charge.should == 0
|
17
|
+
water_loss.charged_formula_string.should == 'H2O'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'proton gain' do
|
21
|
+
prot = Mod.new(:proton)
|
22
|
+
prot.gain?.should be_true
|
23
|
+
prot.massdiff.>(0).should be_true
|
24
|
+
prot.charge.should == 1
|
25
|
+
prot.charged_formula_string.should == 'H+'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'proton loss' do
|
29
|
+
prot_loss = Mod.new(:proton, :loss => true)
|
30
|
+
prot_loss.gain?.should be_false
|
31
|
+
prot_loss.loss?.should be_true
|
32
|
+
prot_loss.massdiff.<(0).should be_true
|
33
|
+
prot_loss.charge.should == -1
|
34
|
+
prot_loss.charged_formula_string.should == 'H-'
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'ammonium gain' do
|
38
|
+
ammon = Mod.new(:ammonium)
|
39
|
+
ammon.gain?.should be_true
|
40
|
+
ammon.massdiff.>(0).should be_true
|
41
|
+
ammon.charge.should == 1
|
42
|
+
ammon.charged_formula_string.should == 'H4N+'
|
43
|
+
end
|
28
44
|
end
|
29
45
|
|
30
46
|
it 'can create custom mods' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mspire-lipidomics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mspire
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.7.
|
21
|
+
version: 0.7.17
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.7.
|
29
|
+
version: 0.7.17
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rubabel
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
155
|
version: '0'
|
156
156
|
requirements: []
|
157
157
|
rubyforge_project:
|
158
|
-
rubygems_version: 1.8.
|
158
|
+
rubygems_version: 1.8.24
|
159
159
|
signing_key:
|
160
160
|
specification_version: 3
|
161
161
|
summary: mass spectrometry based lipidomics - especially shotgun lipidomics
|