McUtils.Data
Provides a small data framework for wrapping up datasets into classes for access and loading.
The basic structure for a new dataset is defined in CommonData.DataHandler
.
A simple, concrete example is in AtomData.AtomData
.
A slightly more involved example is in ConstantsData.UnitsData
.
Members
Examples
We can work with atomic data. The key can be specified in multiple different ways.
from McUtils.Data import AtomData
assert isinstance(AtomData["H"], dict)
assert isinstance(AtomData["Hydrogen"], dict)
assert isinstance(AtomData["Helium3"], dict)
assert AtomData["Hydrogen2"] is AtomData["Deuterium"]
assert AtomData["H2"] is AtomData["Deuterium"]
assert AtomData["H1"] is AtomData["Hydrogen"]
assert AtomData[8] is AtomData["Oxygen"]
A fun property of isotopes
from McUtils.Data import AtomData
assert AtomData["Helium3", "Mass"] < AtomData["T"]["Mass"]
We can work with unit conversions. Inverse units are supplied using "Inverse..."
, prefixes can modify units (e.g. "Centi"
).
from McUtils.Data import UnitsData
assert UnitsData.data[("Hartrees", "InverseMeters")]["Value"] > 21947463.13
assert UnitsData.data[("Hartrees", "InverseMeters")]["Value"] == UnitsData.convert("Hartrees", "InverseMeters")
assert UnitsData.convert("Hartrees", "Wavenumbers") == UnitsData.convert("Hartrees", "InverseMeters") / 100
assert UnitsData.convert("Hartrees", "Wavenumbers") == UnitsData.convert("Centihartrees", "InverseMeters")
Atomic units, as a general system, are supported
from McUtils.Data import UnitsData
assert UnitsData.convert("AtomicMassUnits", "AtomicUnitOfMass") == UnitsData.convert("AtomicMassUnits", "ElectronMass")
assert UnitsData.convert("Wavenumbers", "AtomicUnitOfEnergy") == UnitsData.convert("Wavenumbers", "Hartrees")
Before we can run our examples we should get a bit of setup out of the way. Since these examples were harvested from the unit tests not all pieces will be necessary for all situations.
All tests are wrapped in a test class
class DataTests(TestCase):
AtomData
def test_AtomData(self):
self.assertIsInstance(AtomData["H"], DataRecord)
self.assertIsInstance(AtomData["Hydrogen"], DataRecord)
self.assertIsInstance(AtomData["Helium3"], DataRecord)
self.assertIs(AtomData["Hydrogen2"], AtomData["Deuterium"])
self.assertIs(AtomData["H2"], AtomData["Deuterium"])
self.assertIs(AtomData["H1"], AtomData["Hydrogen"])
self.assertIs(AtomData[8], AtomData["Oxygen"])
AtomMasses
def test_AtomMasses(self):
self.assertLess(AtomData["Helium3", "Mass"], AtomData["T"]["Mass"])
Conversions
def test_Conversions(self):
# print(AtomData["T"]["Mass"]-AtomData["Helium3", "Mass"], file=sys.stderr)
self.assertGreater(UnitsData.data[("Hartrees", "InverseMeters")]["Value"], 21947463.13)
self.assertLess(UnitsData.data[("Hartrees", "InverseMeters")]["Value"], 21947463.14)
self.assertAlmostEqual(
UnitsData.convert("Hartrees", "Wavenumbers"),
UnitsData.convert("Hartrees", "InverseMeters") / 100
)
self.assertAlmostEqual(
UnitsData.convert("Hartrees", "Wavenumbers"),
UnitsData.convert("Centihartrees", "InverseMeters")
)
AtomicUnits
def test_AtomicUnits(self):
# print(UnitsData["AtomicUnitOfMass"])
self.assertAlmostEqual(UnitsData.convert("AtomicMassUnits", "AtomicUnitOfMass"), 1822.888486217313)
BondData
def test_BondData(self):
self.assertIsInstance(BondData["H"], dict)
self.assertLess(BondData["H", "H", 1], 1)
self.assertLess(BondData["H", "O", 1], 1)
self.assertGreater(BondData["H", "C", 1], 1)