Class: Diadem::IsotopeDistribution
- Inherits:
-
Object
- Object
- Diadem::IsotopeDistribution
- Defined in:
- lib/diadem/isotope_distribution.rb
Constant Summary collapse
- DEFAULT_ISOTOPE_TABLE =
Mspire::Isotope::BY_ELEMENT
Instance Attribute Summary collapse
-
#intensities ⇒ Object
should always add up to 1.
-
#nucleon_start ⇒ Object
should be inclusive of last value.
Class Method Summary collapse
-
.average(distributions, weights = nil) ⇒ Object
returns a new distribution, uses equal weights if none given.
- .from_formula(formula) ⇒ Object
Instance Method Summary collapse
-
#initialize(intensities = [], nucleon_start = 0) ⇒ IsotopeDistribution
constructor
A new instance of IsotopeDistribution.
-
#normalize!(normalize_to = 1.0) ⇒ Object
normalizes intensity values and returns self.
- #nucleon_end ⇒ Object
Constructor Details
#initialize(intensities = [], nucleon_start = 0) ⇒ IsotopeDistribution
Returns a new instance of IsotopeDistribution.
14 15 16 |
# File 'lib/diadem/isotope_distribution.rb', line 14 def initialize(intensities=[], nucleon_start=0) @intensities, @nucleon_start = intensities, nucleon_start end |
Instance Attribute Details
#intensities ⇒ Object
should always add up to 1
11 12 13 |
# File 'lib/diadem/isotope_distribution.rb', line 11 def intensities @intensities end |
#nucleon_start ⇒ Object
should be inclusive of last value
13 14 15 |
# File 'lib/diadem/isotope_distribution.rb', line 13 def nucleon_start @nucleon_start end |
Class Method Details
.average(distributions, weights = nil) ⇒ Object
returns a new distribution, uses equal weights if none given
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/diadem/isotope_distribution.rb', line 29 def average(distributions, weights=nil) weights ||= Array.new(distributions.size, 1) min_nucleon_num = distributions.map(&:nucleon_start).min max_nucleon_num = distributions.map(&:nucleon_end).max new_intensity_arrays = distributions.zip(weights).map do |dist, weight| new_pcts = dist.intensities.dup right_pad = max_nucleon_num - dist.nucleon_end left_pad = dist.nucleon_start - min_nucleon_num [[right_pad, new_pcts.size], [left_pad, 0]].each do |pad, loc| new_pcts[loc,0] = Array.new(pad, 0.0) end new_pcts.map! {|v| v * weight } new_pcts end summed_intensities = new_intensity_arrays.transpose.map do |col| col.reduce(:+) end new_dist = self.new(summed_intensities, min_nucleon_num) new_dist.normalize! end |
.from_formula(formula) ⇒ Object
24 25 26 |
# File 'lib/diadem/isotope_distribution.rb', line 24 def from_formula(formula) Mspire::MolecularFormula[formula].isotope_distribution end |
Instance Method Details
#normalize!(normalize_to = 1.0) ⇒ Object
normalizes intensity values and returns self
55 56 57 58 59 |
# File 'lib/diadem/isotope_distribution.rb', line 55 def normalize!(normalize_to=1.0) sum = intensities.reduce(:+) intensities.map! {|v| (v.to_f/sum)*normalize_to } self end |
#nucleon_end ⇒ Object
18 19 20 |
# File 'lib/diadem/isotope_distribution.rb', line 18 def nucleon_end nucleon_start + intensities.size - 1 end |