bahuvrihi-molecules 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/molecules/calc.rb +22 -83
  2. metadata +1 -1
@@ -10,101 +10,40 @@ Unit.setup
10
10
 
11
11
  module Molecules
12
12
 
13
- # :startdoc::manifest a mass calculator
14
- # Calculates the mass of a molecule or empirical formula. The
15
- # options can be used to alter the output (precision, mass
16
- # calculation method etc.) You may enter compound formulae, or
17
- # a list of formulae. In addition, polypeptides can be specified
18
- # using the one-letter residue codes:
13
+ # :startdoc::manifest a mass calculator
19
14
  #
20
- # % tap -- molecules/calc H2O
21
- # I[17:09:00] 18.0105646863 Da H2O
22
- #
23
- # % tap -- molecules/calc H2O -u kg
24
- # I[13:35:59] 2.99072e-026 kg H2O
15
+ # Calculates the mass of a molecule. Compound formulae are allowed and you may
16
+ # specify a list of formulae. The options can be used to alter the output (precision,
17
+ # mass calculation method etc.)
25
18
  #
26
- # % tap -- molecules/calc 'C3H5NO + H2O' C50H73N15O11 -p 2
27
- # I[17:08:21] 89.05 Da C3H5NO + H2O
28
- # I[17:08:21] 1059.56 Da C50H73N15O11
29
- #
30
- # % tap -- molecules/calc :RPPGFSPFR
31
- # I[13:35:02] 1059.56 Da :RPPGFSPFR
32
- #
33
- # Furthermore, if a unimod path is specified in the configurations,
34
- # unimod modifcations may be specified by name as the polypeptide
35
- # termini. Use '%' signs as in a SQL query to shorten the name:
36
- #
37
- # % tap -- molecules/calc 'Acetyl:RPPGFSPFR:Hydroxyl%' --unimod-path <...>
38
- # I[13:33:25] 1059.56 Da Acetyl:RPPGFSPFR:Hydroxyl%
19
+ # % tap run -- molecules/calc H2O
20
+ # I[17:08:00] 18.0105646863 Da H2O
39
21
  #
40
- # The unimod path must point to an sqlite3 ActiveUnimod database, and
41
- # sqlite3-ruby must be installed for this feature to work.
42
- #
43
- # * ActiveUnimod[http://bioactive.rubyforge.org/]
44
- # * sqlite3-ruby[http://rubyforge.org/projects/sqlite-ruby/]
45
- #
22
+ # % tap run -- molecules/calc H2O --units yg --precision 6
23
+ # I[17:08:21] 29.907243 yg H2O
24
+ #
25
+ # % tap run -- molecules/calc 'C3H5NO + H2O' C50H73N15O11 -p 2
26
+ # I[17:08:53] 89.05 Da C3H5NO + H2O
27
+ # I[17:08:53] 1059.56 Da C50H73N15O11
28
+ #
46
29
  class Calc < Tap::Task
47
30
 
48
31
  config :type, :monoisotopic # the mass type calculated
49
32
  config :precision, nil, :short => 'p' # the precision of the mass
50
33
  config :units, "Da", :short => 'u', &c.string # the mass unit reported
51
34
  config :composition, false, :short => 'c', &c.flag # reports the composition, not the formula
52
- config :unimod_path, nil do |path| # the path to the unimod database
53
- case
54
- when path == nil then nil
55
- when File.exists?(path) then path
56
- else raise "path to unimod db does not exist: #{path}"
57
- end
58
- end
59
35
 
60
- # Formulates a query for a modification matching code_name
61
- # for the unimod database. If the code_name contains a '%'
62
- # then the query will use a LIKE syntax, otherwise the
63
- # code_name will be searced for exactly.
64
- def mod_query(code_name)
65
- # should do a rails-like escape on code_name
66
- "SELECT code_name, composition FROM modifications WHERE code_name #{code_name.include?('%') ? 'LIKE' : '='} '#{code_name}'"
36
+ # Parses the formula string into an EmpiricalFormula.
37
+ # Can be used as a hook for more complicated formulae
38
+ # in subclases.
39
+ def parse(formula)
40
+ EmpiricalFormula.parse(formula)
67
41
  end
68
42
 
69
- # Attempts to find and instantiate an EmpiricalFormula for
70
- # a unimod modification matching code_name.
71
- def find_mod(code_name)
72
- raise "no unimod_path was specified" if unimod_path == nil
73
- require 'sqlite3' unless Object.const_defined?(:SQLite3)
74
-
75
- results = []
76
- db = SQLite3::Database.new(unimod_path)
77
- db.execute(mod_query(code_name)) do |row|
78
- results << row
79
- end
80
- db.close
81
-
82
- case results.length
83
- when 1 then EmpiricalFormula.parse_simple(results[0][1])
84
- when 0 then raise "could not find modification: #{code_name}"
85
- else raise "multiple modifications found for: #{code_name} (#{results.collect {|result| result[0]}.join(', ')})"
86
- end
87
- end
88
-
89
- WATER = EmpiricalFormula.parse "H2O"
90
- HYDROGEN = EmpiricalFormula.parse "H"
91
- HYDROXIDE = EmpiricalFormula.parse "OH"
92
-
93
43
  # Returns an array of the calculated masses, in the correct unit.
94
44
  def process(*formulae)
95
- formulae.collect do |formula_str|
96
- formula = EmpiricalFormula.parse(formula_str) do |str|
97
- case str
98
- when /^(.*?):([A-Z]+):?(.*)$/
99
- peptide = Libraries::Polypeptide.new($2) + WATER
100
- peptide += find_mod($1) unless $1.to_s.empty?
101
- peptide += find_mod($3) unless $3.to_s.empty?
102
- peptide
103
- else nil
104
- end
105
- end
106
-
107
- mass = formula.mass do |element|
45
+ formulae.collect do |formula_str|
46
+ mass = parse(formula_str).mass do |element|
108
47
  case type
109
48
  when :monoisotopic then element.mass
110
49
  when :average then element.std_atomic_weight.value
@@ -116,8 +55,8 @@ module Molecules
116
55
  unless precision == nil
117
56
  mass = Unit.new( Utils.round(mass.scalar, precision), units)
118
57
  end
119
-
120
- log mass, composition ? formula : formula_str
58
+
59
+ log "#{mass.scalar} #{mass.units}", composition ? formula : formula_str
121
60
 
122
61
  mass
123
62
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bahuvrihi-molecules
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Chiang