Module: PeptideMw

Defined in:
lib/peptide_mw.rb

Constant Summary collapse

AMINO_ACID_MASSES =
{
  'A' => 71.03711, 'R' => 156.10111, 'N' => 114.04293, 'D' => 115.02694,
  'C' => 103.00919, 'E' => 129.04259, 'Q' => 128.05858, 'G' => 57.02146,
  'H' => 137.05891, 'I' => 113.08406, 'L' => 113.08406, 'K' => 128.09496,
  'M' => 131.04049, 'F' => 147.06841, 'P' => 97.05276, 'S' => 87.03203,
  'T' => 101.04768, 'W' => 186.07931, 'Y' => 163.06333, 'V' => 99.06841
}.freeze
WATER_MASS =
18.01056
AMINO_ACID_FORMULA =
{
  'A' => { C: 3, H: 5, N: 1, O: 1, S: 0 },
  'R' => { C: 6, H: 12, N: 4, O: 1, S: 0 },
  'N' => { C: 4, H: 6, N: 2, O: 2, S: 0 },
  'D' => { C: 4, H: 5, N: 1, O: 3, S: 0 },
  'C' => { C: 3, H: 5, N: 1, O: 1, S: 1 },
  'E' => { C: 5, H: 7, N: 1, O: 3, S: 0 },
  'Q' => { C: 5, H: 8, N: 2, O: 2, S: 0 },
  'G' => { C: 2, H: 3, N: 1, O: 1, S: 0 },
  'H' => { C: 6, H: 7, N: 3, O: 1, S: 0 },
  'I' => { C: 6, H: 11, N: 1, O: 1, S: 0 },
  'L' => { C: 6, H: 11, N: 1, O: 1, S: 0 },
  'K' => { C: 6, H: 12, N: 2, O: 1, S: 0 },
  'M' => { C: 5, H: 9, N: 1, O: 1, S: 1 },
  'F' => { C: 9, H: 9, N: 1, O: 1, S: 0 },
  'P' => { C: 5, H: 7, N: 1, O: 1, S: 0 },
  'S' => { C: 3, H: 5, N: 1, O: 2, S: 0 },
  'T' => { C: 4, H: 7, N: 1, O: 2, S: 0 },
  'W' => { C: 11, H: 10, N: 2, O: 1, S: 0 },
  'Y' => { C: 9, H: 9, N: 1, O: 2, S: 0 },
  'V' => { C: 5, H: 9, N: 1, O: 1, S: 0 }
}.freeze
SUBSCRIPTS =
'₀₁₂₃₄₅₆₇₈₉'

Class Method Summary collapse

Class Method Details

.calculate_molecular_formula(sequence) ⇒ String

Calculate molecular formula with Unicode subscripts.

Parameters:

  • sequence (String)

    Single-letter amino acid codes

Returns:

  • (String)

    Molecular formula (e.g., "C₂₃H₄₁N₅O₇S₁")

Raises:

  • (ArgumentError)

    If sequence is empty or contains invalid characters



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/peptide_mw.rb', line 61

def calculate_molecular_formula(sequence)
  raise ArgumentError, 'Sequence cannot be nil or empty' if sequence.nil? || sequence.strip.empty?

  seq = sequence.upcase
  seq.each_char do |aa|
    raise ArgumentError, "Invalid amino acid: '#{aa}'" unless AMINO_ACID_FORMULA.key?(aa)
  end

  counts = { C: 0, H: 0, N: 0, O: 0, S: 0 }

  seq.each_char do |aa|
    formula = AMINO_ACID_FORMULA[aa]
    counts.each_key { |element| counts[element] += formula[element] }
  end

  # Add water (H2O)
  counts[:H] += 2
  counts[:O] += 1

  "C#{to_subscript(counts[:C])}H#{to_subscript(counts[:H])}N#{to_subscript(counts[:N])}" \
    "O#{to_subscript(counts[:O])}S#{to_subscript(counts[:S])}"
end

.calculate_molecular_weight(sequence) ⇒ Float

Calculate monoisotopic molecular weight of a peptide sequence.

Parameters:

  • sequence (String)

    Single-letter amino acid codes (e.g., "AGILM")

Returns:

  • (Float)

    Molecular weight in Daltons

Raises:

  • (ArgumentError)

    If sequence is empty or contains invalid characters



45
46
47
48
49
50
51
52
53
54
# File 'lib/peptide_mw.rb', line 45

def calculate_molecular_weight(sequence)
  raise ArgumentError, 'Sequence cannot be nil or empty' if sequence.nil? || sequence.strip.empty?

  seq = sequence.upcase
  seq.each_char do |aa|
    raise ArgumentError, "Invalid amino acid: '#{aa}'" unless AMINO_ACID_MASSES.key?(aa)
  end

  seq.chars.sum { |aa| AMINO_ACID_MASSES[aa] } + WATER_MASS
end