Last Update: Wed Oct 01 14:49:45 -0600 2008


Libraries of physical and chemical constants for scientific calculations in Ruby.


Constants provides libraries of constant values such as the precise mass of carbon 13, or the spin of a strange quark. When applicable, the constant values include uncertainty and units (via ruby-units). Also provides Constants::Library to index and generate common collections of constant values.

I have attempted to use reputable sources for the constants data (see below). Please notify me of any errors and send me suggestions for other constants to include.


  require 'constants'
  include Constants::Libraries

  # Element predefines all chemical elements
  c = Element::C                 # => "Carbon"
  c.symbol               # => "C"
  c.atomic_number        # => 6
  c.mass                 # => 12.0
  c.mass(13)             # => 13.0033548378

  # A smorgasbord of lookups methods
  Element['Carbon']      # => Element::C
  Element['C']           # => Element::C
  Element[6]             # => Element::C

Custom Libraries

Making a new constants library is straightforward using the Constants::Library module. The following example is adapted from the molecule library (a subproject of constants).

  # A library of amino acid residues.
  class Residue
    attr_reader :letter, :abbr, :name

    def initialize(letter, abbr, name)
      @letter = letter
      @abbr = abbr
      @name = name

    A ='A', "Ala", "Alanine")
    C ='C', "Cys", "Cysteine")
    D ='D', "Asp", "Aspartic Acid")
    # ... normally you'd add the rest here ...

    include Constants::Library

    # add an index by an attribute or method
    library.index_by_attribute :letter

    # add an index where keys are calculated by a block
    library.index_by 'upcase abbr' do |residue|

    # add a collection (same basic idea, but using an array)
    library.collect_attribute 'name'

  # index access through []
  Residue['D']                   # => Residue::D
  Residue['ALA']                 # => Residue::A

  # access an index hash or collection array
  Residue.index('upcase abbr')   # => {'ALA' => Residue::A, 'CYS' => Residue::C, 'ASP' => Residue::D}
  Residue.collection('name')     # => ["Alanine", "Cysteine", "Aspartic Acid"]

As you can see, Constants::Library allows the predefinition of common views generated for a set of constants. Nothing you couldn‘t do yourself, but very handy.

Known Issues

  • Particle data is from an unreliable source
  • Constants::Constant could use some development; constants should support mathematical operations and comparisons based on uncertainty as well as value.
  • Ruby doesn‘t track of the order of constant declaration until Ruby 1.9. Constants are indexed/collected as they appear in [module].constants


Constants is available as a gem through RubyForge. Use:

  % gem install constants


Copyright (c) 2006-2008, Regents of the University of Colorado.

Developer:Simon Chiang, Biomolecular Structure Program, Hansen Lab
Support:CU Denver School of Medicine Deans Academic Enrichment Fund

Element Data

Element isotope, mass, and abundance information was obtained from the NIST Atomic Weights and Isotopic Compositions reference. All isotopes with a non-nil isotopic composition (ie relative abundance) were compiled from this view on 2008-01-22.

Physical Constant Data

The physical constant data is assembled from the NIST Fundamental Physical Constants on 2008-04-28.

Constants adds several units to ruby-units to support the physical constants reported in the NIST data. These are (as reported in the NIST data):

electron-volt:1.602176487e-19 joules
kelvin:1.3806504e-23 joules
hartree:4.35974394e-18 joules

Particle Data

Particle data was assembled from a non-ideal source, wikipedia, and will remain so until I have time to update it with something better.