Recipe 1.6 - Fetching Atoms and Molecules
Problem
You want to create Atom and Molecule.
Solution
Flyweight objects Atoms are accessible through the singleton class PeriodicTable. Molecules have to be built from the Composition class. Getting main isotope atom given an AtomicSymbol
PeriodicTable periodicTable = PeriodicTable.getInstance();
Atom hydrogen = periodicTable.getAtom(AtomicSymbol.H);
Assert.assertEquals(1, hydrogen.getMassNumber());
Getting specific isotope given an AtomicSymbol
Atom deuterium = periodicTable.getAtom(AtomicSymbol.H, 2);
Assert.assertEquals(2, deuterium.getMassNumber());
Getting Atom from a String
Atom hydrogen = periodicTable.getAtom(AtomicSymbol.valueOf("H"), 2);
Assert.assertEquals(2, hydrogen.getMassNumber());
PeriodicTable also provides static Atoms and masses that are the most used
Atom atom = PeriodicTable.C;
Assert.assertEquals(PeriodicTable.C_MASS, atom.getMass(), 0.0001);
Accessors from Atoms
AtomicSymbol symbol = atom.getSymbol();
Assert.assertEquals(AtomicSymbol.C, symbol);
double abundance = atom.getAbundance();
Assert.assertEquals(0.989, abundance, 0.001);
double mass = atom.getMass();
Assert.assertEquals(12, mass, 0.0001);
Lastly PeriodicTable provides a method that fetch the list of isotopes from an AtomicSymbol
PeriodicTable periodicTable = PeriodicTable.getInstance();
List<Atom> isotopes = periodicTable.getAtoms(AtomicSymbol.C);
Assert.assertEquals(Arrays.asList(PeriodicTable.C, PeriodicTable.C13, periodicTable.getAtom(AtomicSymbol.valueOf("C"), 14)), isotopes);
Creating Composition given atoms and an overall optional charge
Composition sulfateComp = new Composition.Builder(AtomicSymbol.S).add(AtomicSymbol.O, 4).charge(-2).build();
// accessors
Set<Atom> atoms = sulfateComp.getAtoms();
Assert.assertTrue(atoms.contains(PeriodicTable.S));
Assert.assertTrue(atoms.contains(PeriodicTable.O));
Assert.assertEquals(4, sulfateComp.getCount(PeriodicTable.O));
Assert.assertEquals(0, sulfateComp.getCount(PeriodicTable.C));
double exactMass = sulfateComp.getMolecularMass();
Assert.assertEquals(95.9528, exactMass, 0.0001);
double avgMass = MassCalculator.calculateAverageMass(sulfateComp);
Assert.assertEquals(96.0627, avgMass, 0.0001);
Creating Composition from a string
Composition sulfateComp = Composition.parseComposition("SO4(2-)");
Discussion
Composition parses chemical formula expressions. An expression is composed of many atoms, each atom is represented by - a symbol
- an optional neutron number
- and an optional quantifier (can be negative)
An overall charge can be defined at the end of expression For example SO4(2-) or H[2]3O(+) are valid expressions.
See also
See AtomicCompositionParser to learn more about the Composition format
|