Class: Mspire::MolecularFormula
- Inherits:
-
Hash
- Object
- Hash
- Mspire::MolecularFormula
- Defined in:
- lib/mspire/molecular_formula.rb,
lib/mspire/isotope/distribution.rb
Instance Attribute Summary collapse
-
#charge ⇒ Object
integer desribing the charge state mass calculations will add/remove electron mass from this.
Class Method Summary collapse
- .from_aaseq(aaseq) ⇒ Object
-
.from_any(arg, charge = 0) ⇒ Object
(also: [])
arg may be a String, Hash, or MolecularFormula object.
-
.from_string(mol_form_str, charge = 0) ⇒ Object
takes a string, with properly capitalized elements making up the formula.
Instance Method Summary collapse
- #*(int) ⇒ Object
-
#+(*others) ⇒ Object
returns a new formula object where all the atoms have been added up.
-
#-(*others) ⇒ Object
returns a new formula object where all the formulas have been subtracted from the caller.
- #/(int) ⇒ Object
- #==(other) ⇒ Object
-
#add!(*others) ⇒ Object
returns self.
- #avg_mass ⇒ Object
- #div!(int, also_do_charge = true) ⇒ Object
-
#initialize(hash = {}, charge = 0) ⇒ MolecularFormula
constructor
Takes a hash and an optional Integer expressing the charge 22, c: 12, n: 1, o: 3, s: 2 # case and string/sym doesn’t matter.
-
#isotope_distribution(normalize = Mspire::Isotope::Distribution::NORMALIZE, percent_cutoff = nil) ⇒ Object
takes any element composition (see any_to_num_elements).
-
#isotope_distribution_spectrum(*args) ⇒ Object
returns a spectrum object with mass values and intensity values.
-
#mass(consider_electron_masses = true) ⇒ Object
gives the monoisotopic mass adjusted by the current charge (i.e., adds/subtracts electron masses for the charges).
- #mul!(int, also_do_charge = true) ⇒ Object
-
#mz(consider_electron_masses = true) ⇒ Object
returns nil if the charge == 0.
-
#raw_isotope_distribution ⇒ Object
returns relative ratios from low nominal mass to high nominal mass.
- #sub!(*others) ⇒ Object
- #to_hash ⇒ Object
- #to_s(alphabetize = true) ⇒ Object
Constructor Details
#initialize(hash = {}, charge = 0) ⇒ MolecularFormula
Takes a hash and an optional Integer expressing the charge
{h: 22, c: 12, n: 1, o: 3, s: 2} # case and string/sym doesn't matter
45 46 47 48 |
# File 'lib/mspire/molecular_formula.rb', line 45 def initialize(hash={}, charge=0) @charge = charge self.merge!(hash) end |
Instance Attribute Details
#charge ⇒ Object
integer desribing the charge state mass calculations will add/remove electron mass from this
41 42 43 |
# File 'lib/mspire/molecular_formula.rb', line 41 def charge @charge end |
Class Method Details
.from_aaseq(aaseq) ⇒ Object
8 9 10 11 12 13 14 15 |
# File 'lib/mspire/molecular_formula.rb', line 8 def from_aaseq(aaseq) hash = aaseq.each_char.inject({}) do |hash,aa| hash.merge(Mspire::Isotope::AA::FORMULAS[aa]) {|h,o,n| (o ? o : 0) +n } end hash[:h] += 2 hash[:o] += 1 self.new(hash) end |
.from_any(arg, charge = 0) ⇒ Object Also known as: []
arg may be a String, Hash, or MolecularFormula object.
28 29 30 31 32 33 34 |
# File 'lib/mspire/molecular_formula.rb', line 28 def from_any(arg, charge=0) if arg.is_a?(String) from_string(arg, charge) else self.new(arg, arg.respond_to?(:charge) ? arg.charge : 0) end end |
.from_string(mol_form_str, charge = 0) ⇒ Object
takes a string, with properly capitalized elements making up the formula. The elements may be in any order.
19 20 21 22 23 24 25 |
# File 'lib/mspire/molecular_formula.rb', line 19 def from_string(mol_form_str, charge=0) mf = self.new({}, charge) mol_form_str.scan(/([A-Z][a-z]?)(\d*)/).each do |k,v| mf[k.downcase.to_sym] = (v == '' ? 1 : v.to_i) end mf end |
Instance Method Details
#*(int) ⇒ Object
86 87 88 |
# File 'lib/mspire/molecular_formula.rb', line 86 def *(int) self.dup.mul!(int) end |
#+(*others) ⇒ Object
returns a new formula object where all the atoms have been added up
51 52 53 |
# File 'lib/mspire/molecular_formula.rb', line 51 def +(*others) self.dup.add!(*others) end |
#-(*others) ⇒ Object
returns a new formula object where all the formulas have been subtracted from the caller
66 67 68 |
# File 'lib/mspire/molecular_formula.rb', line 66 def -(*others) self.dup.sub!(*others) end |
#/(int) ⇒ Object
99 100 101 |
# File 'lib/mspire/molecular_formula.rb', line 99 def /(int) self.dup.div!(int) end |
#==(other) ⇒ Object
157 158 159 |
# File 'lib/mspire/molecular_formula.rb', line 157 def ==(other) old_equal(other) && self.charge == other.charge end |
#add!(*others) ⇒ Object
returns self
56 57 58 59 60 61 62 |
# File 'lib/mspire/molecular_formula.rb', line 56 def add!(*others) others.each do |other| self.merge!(other) {|key, oldval, newval| self[key] = oldval + newval } self.charge += other.charge end self end |
#avg_mass ⇒ Object
126 127 128 |
# File 'lib/mspire/molecular_formula.rb', line 126 def avg_mass inject(0.0) {|sum,(el,cnt)| sum + (Mspire::Mass::AVG[el]*cnt) } end |
#div!(int, also_do_charge = true) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/mspire/molecular_formula.rb', line 103 def div!(int, also_do_charge=true) raise ArgumentError, "must be an integer" unless int.is_a?(Integer) self.each do |k,v| quotient, modulus = v.divmod(int) raise ArgumentError "all numbers must be divisible by int" unless modulus == 0 self[k] = quotient end if also_do_charge quotient, modulus = self.charge.divmod(int) raise ArgumentError "charge must be divisible by int" unless modulus == 0 self.charge = quotient end self end |
#isotope_distribution(normalize = Mspire::Isotope::Distribution::NORMALIZE, percent_cutoff = nil) ⇒ Object
takes any element composition (see any_to_num_elements).
returns isotopic distribution beginning with monoisotopic peak. It cuts off when no more peaks contribute more than percent_cutoff to the total distribution. After that, normalization is performed.
all values will be fractional. normalize may be one of:
:total normalize to the total intensity
:max normalize to the highest peak intensity
:first normalize to the intensity of the first peak
(this is typically the monoisotopic peak)
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/mspire/isotope/distribution.rb', line 32 def isotope_distribution(normalize=Mspire::Isotope::Distribution::NORMALIZE, percent_cutoff=nil) mono_dist = raw_isotope_distribution if percent_cutoff total_signal = mono_dist.reduce(:+) cutoff_index = (mono_dist.size-1).downto(0).find do |i| (mono_dist[i] / total_signal) >= (percent_cutoff/100.0) end # deletes these elements if cutoff_index mono_dist.slice!((cutoff_index+1)..-1) else # no peaks pass that percent cutoff threshold! mono_dist = [] end end # normalization norm_by = case normalize when :total total_signal || mono_dist.reduce(:+) when :max mono_dist.max when :first mono_dist.first end mono_dist.map do |i| v = i / norm_by (v > 0) ? v : 0 end end |
#isotope_distribution_spectrum(*args) ⇒ Object
returns a spectrum object with mass values and intensity values. Arguments are passed directly to isotope_distribution. the molecule has a charge, this will be used to adjust the m/z values (by removing or adding electrons to the m/z and as the z)
69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/mspire/isotope/distribution.rb', line 69 def isotope_distribution_spectrum(*args) intensities = isotope_distribution(*args) mono = self.map {|el,cnt| Mspire::Mass::MONO[el]*cnt }.reduce(:+) masses = Array.new(intensities.size) neutron = Mspire::Mass::NEUTRON masses[0] = mono (1...masses.size).each {|i| masses[i] = masses[i-1] + neutron } if self.charge && self.charge != 0 masses.map! do |mass| (mass - (self.charge * Mspire::Mass::ELECTRON)) / self.charge end end Mspire::Spectrum.new [masses, intensities] end |
#mass(consider_electron_masses = true) ⇒ Object
gives the monoisotopic mass adjusted by the current charge (i.e., adds/subtracts electron masses for the charges)
120 121 122 123 124 |
# File 'lib/mspire/molecular_formula.rb', line 120 def mass(consider_electron_masses = true) mss = inject(0.0) {|sum,(el,cnt)| sum + (Mspire::Mass::MONO[el]*cnt) } mss -= (Mspire::Mass::ELECTRON * charge) if consider_electron_masses mss end |
#mul!(int, also_do_charge = true) ⇒ Object
90 91 92 93 94 95 96 97 |
# File 'lib/mspire/molecular_formula.rb', line 90 def mul!(int, also_do_charge=true) raise ArgumentError, "must be an integer" unless int.is_a?(Integer) self.each do |k,v| self[k] = v * int end self.charge *= int if also_do_charge self end |
#mz(consider_electron_masses = true) ⇒ Object
returns nil if the charge == 0
131 132 133 134 135 136 137 |
# File 'lib/mspire/molecular_formula.rb', line 131 def mz(consider_electron_masses = true) if charge == 0 nil else mass(consider_electron_masses) / charge end end |
#raw_isotope_distribution ⇒ Object
returns relative ratios from low nominal mass to high nominal mass. These are not normalized at all.
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/mspire/isotope/distribution.rb', line 86 def raw_isotope_distribution low_nominal = 0 high_nominal = 0 self.each do |el,cnt| isotopes = Mspire::Isotope::BY_ELEMENT[el] low_nominal += (isotopes.first.mass_number * cnt) high_nominal += (isotopes.last.mass_number * cnt) end ffts = self.map do |el, cnt| isotope_el_ar = NArray.float(high_nominal+1) Mspire::Isotope::BY_ELEMENT[el].each do |isotope| isotope_el_ar[isotope.mass_number] = isotope.relative_abundance end FFTW3.fft(isotope_el_ar)**cnt end FFTW3.ifft(ffts.reduce(:*)).real.to_a[low_nominal..high_nominal] end |
#sub!(*others) ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/mspire/molecular_formula.rb', line 70 def sub!(*others) others.each do |other| oth = other.dup self.each do |k,v| if oth.key?(k) self[k] -= oth.delete(k) end end oth.each do |k,v| self[k] = -v end self.charge -= other.charge end self end |
#to_hash ⇒ Object
151 152 153 |
# File 'lib/mspire/molecular_formula.rb', line 151 def to_hash Hash[ self ] end |
#to_s(alphabetize = true) ⇒ Object
139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/mspire/molecular_formula.rb', line 139 def to_s(alphabetize=true) h = alphabetize ? self.sort : self st = '' h.each do |k,v| if v > 0 st << k.to_s.capitalize st << v.to_s if v > 1 end end st end |