stjames 0.0.40__tar.gz → 0.0.42__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of stjames might be problematic. Click here for more details.

Files changed (64) hide show
  1. {stjames-0.0.40/stjames.egg-info → stjames-0.0.42}/PKG-INFO +3 -3
  2. {stjames-0.0.40 → stjames-0.0.42}/README.md +1 -1
  3. {stjames-0.0.40 → stjames-0.0.42}/pyproject.toml +19 -6
  4. {stjames-0.0.40 → stjames-0.0.42}/stjames/__init__.py +3 -0
  5. stjames-0.0.42/stjames/atom.py +66 -0
  6. stjames-0.0.42/stjames/base.py +42 -0
  7. {stjames-0.0.40 → stjames-0.0.42}/stjames/basis_set.py +3 -7
  8. {stjames-0.0.40 → stjames-0.0.42}/stjames/calculation.py +2 -0
  9. stjames-0.0.42/stjames/constraint.py +36 -0
  10. stjames-0.0.42/stjames/data/__init__.py +1 -0
  11. stjames-0.0.42/stjames/data/bragg_radii.json +1 -0
  12. stjames-0.0.42/stjames/data/elements.py +27 -0
  13. stjames-0.0.42/stjames/data/isotopes.json +1 -0
  14. stjames-0.0.42/stjames/data/nist_isotopes.json +1 -0
  15. stjames-0.0.42/stjames/data/read_nist_isotopes.py +116 -0
  16. stjames-0.0.42/stjames/data/symbol_element.json +1 -0
  17. {stjames-0.0.40 → stjames-0.0.42}/stjames/method.py +34 -1
  18. stjames-0.0.42/stjames/molecule.py +192 -0
  19. stjames-0.0.42/stjames/opt_settings.py +21 -0
  20. stjames-0.0.42/stjames/periodic_cell.py +34 -0
  21. {stjames-0.0.40 → stjames-0.0.42}/stjames/settings.py +25 -38
  22. {stjames-0.0.40 → stjames-0.0.42}/stjames/solvent.py +1 -0
  23. {stjames-0.0.40 → stjames-0.0.42}/stjames/task.py +1 -0
  24. stjames-0.0.42/stjames/types.py +8 -0
  25. {stjames-0.0.40 → stjames-0.0.42}/stjames/workflows/__init__.py +6 -0
  26. stjames-0.0.42/stjames/workflows/admet.py +7 -0
  27. stjames-0.0.42/stjames/workflows/basic_calculation.py +9 -0
  28. stjames-0.0.42/stjames/workflows/bde.py +269 -0
  29. {stjames-0.0.40 → stjames-0.0.42}/stjames/workflows/descriptors.py +2 -1
  30. stjames-0.0.42/stjames/workflows/fukui.py +12 -0
  31. stjames-0.0.42/stjames/workflows/molecular_dynamics.py +60 -0
  32. stjames-0.0.42/stjames/workflows/multistage_opt.py +261 -0
  33. {stjames-0.0.40 → stjames-0.0.42}/stjames/workflows/redox_potential.py +9 -8
  34. {stjames-0.0.40 → stjames-0.0.42}/stjames/workflows/scan.py +6 -6
  35. stjames-0.0.42/stjames/workflows/spin_states.py +144 -0
  36. stjames-0.0.42/stjames/workflows/workflow.py +46 -0
  37. {stjames-0.0.40 → stjames-0.0.42/stjames.egg-info}/PKG-INFO +3 -3
  38. {stjames-0.0.40 → stjames-0.0.42}/stjames.egg-info/SOURCES.txt +18 -1
  39. stjames-0.0.42/tests/test_molecule.py +39 -0
  40. stjames-0.0.40/stjames/base.py +0 -42
  41. stjames-0.0.40/stjames/constraint.py +0 -16
  42. stjames-0.0.40/stjames/molecule.py +0 -94
  43. stjames-0.0.40/stjames/opt_settings.py +0 -16
  44. stjames-0.0.40/stjames/workflows/fukui.py +0 -13
  45. stjames-0.0.40/stjames/workflows/workflow.py +0 -16
  46. {stjames-0.0.40 → stjames-0.0.42}/LICENSE +0 -0
  47. {stjames-0.0.40 → stjames-0.0.42}/setup.cfg +0 -0
  48. {stjames-0.0.40 → stjames-0.0.42}/stjames/_deprecated_solvent_settings.py +0 -0
  49. {stjames-0.0.40 → stjames-0.0.42}/stjames/correction.py +0 -0
  50. {stjames-0.0.40 → stjames-0.0.42}/stjames/diis_settings.py +0 -0
  51. {stjames-0.0.40 → stjames-0.0.42}/stjames/grid_settings.py +0 -0
  52. {stjames-0.0.40 → stjames-0.0.42}/stjames/int_settings.py +0 -0
  53. {stjames-0.0.40 → stjames-0.0.42}/stjames/message.py +0 -0
  54. {stjames-0.0.40 → stjames-0.0.42}/stjames/mode.py +0 -0
  55. {stjames-0.0.40 → stjames-0.0.42}/stjames/py.typed +0 -0
  56. {stjames-0.0.40 → stjames-0.0.42}/stjames/scf_settings.py +0 -0
  57. {stjames-0.0.40 → stjames-0.0.42}/stjames/status.py +0 -0
  58. {stjames-0.0.40 → stjames-0.0.42}/stjames/thermochem_settings.py +0 -0
  59. {stjames-0.0.40 → stjames-0.0.42}/stjames/workflows/conformer.py +0 -0
  60. {stjames-0.0.40 → stjames-0.0.42}/stjames/workflows/pka.py +0 -0
  61. {stjames-0.0.40 → stjames-0.0.42}/stjames/workflows/tautomer.py +0 -0
  62. {stjames-0.0.40 → stjames-0.0.42}/stjames.egg-info/dependency_links.txt +0 -0
  63. {stjames-0.0.40 → stjames-0.0.42}/stjames.egg-info/requires.txt +0 -0
  64. {stjames-0.0.40 → stjames-0.0.42}/stjames.egg-info/top_level.txt +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: stjames
3
- Version: 0.0.40
3
+ Version: 0.0.42
4
4
  Summary: standardized JSON atom/molecule encoding scheme
5
5
  Author-email: Corin Wagen <corin@rowansci.com>
6
6
  Project-URL: Homepage, https://github.com/rowansci/stjames
7
7
  Project-URL: Bug Tracker, https://github.com/rowansci/stjames/issues
8
- Requires-Python: >=3.8
8
+ Requires-Python: >=3.11
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
11
  Requires-Dist: pydantic>=2.4
@@ -27,7 +27,7 @@ This is not intended to be run as a standalone library: it's basically just a bi
27
27
 
28
28
  ## Installation
29
29
 
30
- To install, ensure you have Python 3.8 or newer. Then run:
30
+ To install, ensure you have Python 3.11 or newer. Then run:
31
31
 
32
32
  ```
33
33
  pip install stjames
@@ -14,7 +14,7 @@ This is not intended to be run as a standalone library: it's basically just a bi
14
14
 
15
15
  ## Installation
16
16
 
17
- To install, ensure you have Python 3.8 or newer. Then run:
17
+ To install, ensure you have Python 3.11 or newer. Then run:
18
18
 
19
19
  ```
20
20
  pip install stjames
@@ -1,9 +1,9 @@
1
1
  [project]
2
2
  name = "stjames"
3
- version = "0.0.40"
3
+ version = "0.0.42"
4
4
  description = "standardized JSON atom/molecule encoding scheme"
5
5
  readme = "README.md"
6
- requires-python = ">=3.8"
6
+ requires-python = ">=3.11"
7
7
  authors = [
8
8
  { name = "Corin Wagen", email = "corin@rowansci.com" },
9
9
  ]
@@ -28,20 +28,33 @@ include = ["stjames", "stjames.*"] # package names should match these glob patt
28
28
  exclude = [] # exclude packages matching these glob patterns (empty by default)
29
29
  namespaces = false # to disable scanning PEP 420 namespaces (true by default)
30
30
 
31
+ [tool.setuptools.package-data]
32
+ "*" = ["*.json"]
33
+
31
34
  [tool.ruff]
32
35
  line-length = 160
33
36
 
34
37
  [tool.ruff.lint]
35
38
  select = [
36
- "E", # pycodestyle errors
37
- "F", # pyflakes
38
- "I", # isort
39
- "W", # pycodestyle warnings
39
+ "E", # pycodestyle errors
40
+ "F", # pyflakes
41
+ "I", # isort
42
+ "W", # pycodestyle warnings
40
43
  ]
41
44
  ignore = ["E741"]
42
45
 
43
46
  [tool.ruff.lint.per-file-ignores]
44
47
  "__init__.py" = ["F401", "F403"]
45
48
 
49
+ [tool.pytest.ini_options]
50
+ testpaths = ["stjames", "tests"]
51
+ addopts = "--doctest-modules"
52
+ doctest_optionflags = "NORMALIZE_WHITESPACE"
53
+ markers = [
54
+ "smoke: sanity tests to reveal simple failures"
55
+ ]
56
+
46
57
  [tool.mypy]
47
58
  plugins = ["pydantic.mypy"]
59
+ strict = true
60
+ warn_unused_ignores = true
@@ -1,6 +1,8 @@
1
1
  # ruff: noqa: I001
2
2
 
3
3
  from .calculation import *
4
+ from .atom import *
5
+ from .periodic_cell import *
4
6
  from .molecule import *
5
7
  from .workflows import *
6
8
 
@@ -21,3 +23,4 @@ from .mode import *
21
23
  from .status import *
22
24
  from .constraint import *
23
25
  from .message import *
26
+ from .types import *
@@ -0,0 +1,66 @@
1
+ from typing import Self, Sequence
2
+
3
+ from pydantic import NonNegativeInt
4
+
5
+ from .base import Base
6
+ from .data import ELEMENT_SYMBOL, SYMBOL_ELEMENT
7
+ from .types import Vector3D
8
+
9
+
10
+ class Atom(Base):
11
+ atomic_number: NonNegativeInt
12
+ position: Vector3D # in Å
13
+
14
+ def __repr__(self) -> str:
15
+ """
16
+ >>> Atom(atomic_number=2, position=[0, 1, 2])
17
+ Atom(2, [0.00000, 1.00000, 2.00000])
18
+ """
19
+ x, y, z = self.position
20
+ return f"Atom({self.atomic_number}, [{x:.5f}, {y:.5f}, {z:.5f}])"
21
+
22
+ def __str__(self) -> str:
23
+ """
24
+ >>> str(Atom(atomic_number=2, position=[0, 1, 2]))
25
+ 'He 0.0000000000 1.0000000000 2.0000000000'
26
+ """
27
+ x, y, z = self.position
28
+ return f"{self.atomic_symbol:2} {x:15.10f} {y:15.10f} {z:15.10f}"
29
+
30
+ @property
31
+ def atomic_symbol(self) -> str:
32
+ """
33
+ >>> Atom(atomic_number=2, position=[0, 1, 2]).atomic_symbol
34
+ 'He'
35
+ """
36
+ return ELEMENT_SYMBOL[self.atomic_number]
37
+
38
+ def edited(self, atomic_number: int | None = None, position: Sequence[float] | None = None) -> Self:
39
+ """
40
+ Create a new Atom with the specified changes.
41
+
42
+ >>> a = Atom(atomic_number=2, position=[0, 1, 2])
43
+ >>> a2 = a.edited(3)
44
+ >>> a is a2
45
+ False
46
+ >>> a2
47
+ Atom(3, [0.00000, 1.00000, 2.00000])
48
+ """
49
+ if atomic_number is None:
50
+ atomic_number = self.atomic_number
51
+ if position is None:
52
+ position = list(self.position)
53
+
54
+ return self.__class__(atomic_number=atomic_number, position=position)
55
+
56
+ @classmethod
57
+ def from_xyz(cls: type[Self], xyz_line: str) -> Self:
58
+ """
59
+ >>> Atom.from_xyz("H 0 0 0")
60
+ Atom(1, [0.00000, 0.00000, 0.00000])
61
+ """
62
+ name, *xyz = xyz_line.split()
63
+ symbol = int(name) if name.isdigit() else SYMBOL_ELEMENT[name]
64
+ if not len(xyz) == 3:
65
+ raise ValueError("XYZ file should have 3 coordinates per atom")
66
+ return cls(atomic_number=symbol, position=xyz)
@@ -0,0 +1,42 @@
1
+ from enum import Enum
2
+ from typing import Annotated, Any, Hashable, TypeVar
3
+
4
+ import numpy as np
5
+ import pydantic
6
+
7
+ _T = TypeVar("_T")
8
+
9
+
10
+ class Base(pydantic.BaseModel):
11
+ @pydantic.field_validator("*", mode="before")
12
+ @classmethod
13
+ def coerce_numpy(cls, val: _T) -> _T | list[Any]:
14
+ if isinstance(val, np.ndarray):
15
+ return val.tolist() # type: ignore [no-any-return, unused-ignore]
16
+
17
+ return val
18
+
19
+
20
+ class LowercaseStrEnum(str, Enum):
21
+ """Enum where hyphens, underscores, and case are ignored."""
22
+
23
+ @classmethod
24
+ def _missing_(cls, value: object) -> str | None:
25
+ for member in cls:
26
+ if isinstance(value, str):
27
+ if member.lower().replace("-", "").replace("_", "") == value.lower().replace("-", "").replace("_", ""):
28
+ return member
29
+ return None
30
+
31
+
32
+ # cf. https://github.com/pydantic/pydantic-core/pull/820#issuecomment-1670475909
33
+ _H = TypeVar("_H", bound=Hashable)
34
+
35
+
36
+ def _validate_unique_list(v: list[_H]) -> list[_H]:
37
+ if len(v) != len(set(v)):
38
+ raise ValueError("this list must be unique, and isn't!")
39
+ return v
40
+
41
+
42
+ UniqueList = Annotated[list[_H], pydantic.AfterValidator(_validate_unique_list)]
@@ -1,10 +1,6 @@
1
- import pydantic
2
- from pydantic import PositiveFloat, PositiveInt
1
+ from typing import Optional, Self
3
2
 
4
- try:
5
- from typing import Optional, Self
6
- except ImportError:
7
- from typing_extensions import Optional, Self
3
+ from pydantic import PositiveFloat, PositiveInt, model_validator
8
4
 
9
5
  from .base import Base
10
6
 
@@ -14,7 +10,7 @@ class BasisSetOverride(Base):
14
10
  atomic_numbers: Optional[list[PositiveInt]] = None
15
11
  atoms: Optional[list[PositiveInt]] = None # 1-indexed
16
12
 
17
- @pydantic.model_validator(mode="after")
13
+ @model_validator(mode="after")
18
14
  def check_override(self) -> Self:
19
15
  # ^ is xor
20
16
  assert (self.atomic_numbers is not None) ^ (self.atoms is not None), "Exactly one of ``atomic_numbers`` or ``atoms`` must be specified!"
@@ -5,6 +5,7 @@ from .message import Message
5
5
  from .molecule import Molecule
6
6
  from .settings import Settings
7
7
  from .status import Status
8
+ from .types import UUID
8
9
 
9
10
 
10
11
  class StJamesVersion(LowercaseStrEnum):
@@ -29,6 +30,7 @@ class Calculation(Base):
29
30
  messages: list[Message] = []
30
31
 
31
32
  engine: Optional[str] = "peregrine"
33
+ uuids: list[UUID | None] | None = None
32
34
 
33
35
  # not to be changed by end users, diff. versions will have diff. defaults
34
36
  json_format: str = StJamesVersion.V0
@@ -0,0 +1,36 @@
1
+ from pydantic import PositiveFloat, PositiveInt
2
+
3
+ from .base import Base, LowercaseStrEnum
4
+
5
+
6
+ class ConstraintType(LowercaseStrEnum):
7
+ """Different sorts of constraints."""
8
+
9
+ BOND = "bond"
10
+ ANGLE = "angle"
11
+ DIHEDRAL = "dihedral"
12
+
13
+
14
+ class Constraint(Base):
15
+ """Represents a single (absolute) constraint."""
16
+
17
+ constraint_type: ConstraintType
18
+ atoms: list[PositiveInt] # 1-indexed
19
+
20
+
21
+ class PairwiseHarmonicConstraint(Base):
22
+ """
23
+ Represents a harmonic constraint, with a characteristic spring constant.
24
+ """
25
+
26
+ atoms: tuple[PositiveInt, PositiveInt] # 1-indexed
27
+ spring_constant: PositiveFloat # kcal/mol / Å**2
28
+
29
+
30
+ class SphericalHarmonicConstraint(Base):
31
+ """
32
+ Represents a spherical harmonic constraint to keep a system near the origin.
33
+ """
34
+
35
+ confining_radius: PositiveFloat
36
+ confining_force_constant: PositiveFloat = 10 # kcal/mol / Å**2
@@ -0,0 +1 @@
1
+ from .elements import *
@@ -0,0 +1 @@
1
+ {"1": 0.661, "2": 0.661, "3": 2.74, "4": 1.984, "5": 1.606, "6": 1.323, "7": 1.228, "8": 1.134, "9": 0.945, "10": 0.9, "11": 3.402, "12": 2.835, "13": 2.362, "14": 2.079, "15": 1.89, "16": 1.89, "17": 1.89, "18": 1.89, "19": 4.157, "20": 3.402, "21": 3.024, "22": 2.656, "23": 2.551, "24": 2.656, "25": 2.656, "26": 2.656, "27": 2.551, "28": 2.551, "29": 2.551, "30": 2.551, "31": 2.457, "32": 2.362, "33": 2.173, "34": 2.173, "35": 2.173, "36": 2.173, "37": 4.441, "38": 3.78, "39": 3.402, "40": 2.929, "41": 2.74, "42": 2.74, "43": 2.551, "44": 2.457, "45": 2.551, "46": 2.646, "47": 3.024, "48": 2.929, "49": 2.929, "50": 2.74, "51": 2.74, "52": 2.646, "53": 2.646, "54": 2.646, "55": 4.913, "56": 4.063, "57": 3.685, "58": 3.496, "59": 3.496, "60": 3.496, "61": 3.496, "62": 3.496, "63": 3.496, "64": 3.402, "65": 3.307, "66": 3.307, "67": 3.307, "68": 3.307, "69": 3.307, "70": 3.307, "71": 3.307, "72": 3.307, "73": 2.929, "74": 2.74, "75": 2.551, "76": 2.551, "77": 2.457, "78": 2.551, "79": 2.551, "80": 2.551, "81": 2.835, "82": 3.591, "83": 3.024, "84": 3.024, "85": 3.591, "86": 3.591, "87": 3.591, "88": 4.063, "89": 4.063, "90": 3.685, "91": 3.401, "92": 3.401, "93": 3.307, "94": 3.307, "95": 3.307, "96": 3.307, "97": 3.307, "98": 3.307, "99": 3.307, "100": 3.307, "101": 3.307, "102": 3.307, "103": 3.307, "104": 3.307, "105": 3.307}
@@ -0,0 +1,27 @@
1
+ """Read elemental data from files."""
2
+
3
+ import json
4
+ from collections import namedtuple
5
+ from importlib import resources
6
+
7
+ data_dir = resources.files("stjames").joinpath("data")
8
+
9
+ with data_dir.joinpath("symbol_element.json").open() as f:
10
+ SYMBOL_ELEMENT: dict[str, int] = json.loads(f.read())
11
+
12
+ ELEMENT_SYMBOL = {v: k for k, v in SYMBOL_ELEMENT.items()}
13
+
14
+ Isotope = namedtuple("Isotope", ["relative_atomic_mass", "isotopic_composition", "standard_atomic_weight"])
15
+ with data_dir.joinpath("nist_isotopes.json").open() as f:
16
+ d = json.loads(f.read())
17
+
18
+ ISOTOPES: dict[int, dict[int, Isotope]] = {
19
+ int(k): {
20
+ int(kk): Isotope(*vv)
21
+ for kk, vv in v.items() # stay open
22
+ }
23
+ for k, v in d.items()
24
+ }
25
+
26
+ with data_dir.joinpath("bragg_radii.json").open() as f:
27
+ BRAGG_RADII: dict[int, float] = json.loads(f.read())
@@ -0,0 +1 @@
1
+ {"H": {"1.007825": 0.999885, "2.014102": 0.000115, "3.016049": 0.0}, "He": {"3.016029": 1e-06, "4.002603": 0.999999}, "Li": {"6.015123": 0.0759, "7.016003": 0.9241}, "Be": {"9.012183": 1.0}, "B": {"10.012937": 0.199, "11.009305": 0.801}, "C": {"12.0": 0.9893, "13.003355": 0.0107, "14.003242": 0.0}, "N": {"14.003074": 0.99636, "15.000109": 0.00364}, "O": {"15.994915": 0.99757, "16.999132": 0.00038, "17.99916": 0.00205}, "F": {"18.998403": 1.0}, "Ne": {"19.99244": 0.9048, "20.993847": 0.0027, "21.991385": 0.0925}, "Na": {"22.989769": 1.0}, "Mg": {"23.985042": 0.7899, "24.985837": 0.1, "25.982593": 0.1101}, "Al": {"26.981539": 1.0}, "Si": {"27.976927": 0.92223, "28.976495": 0.04685, "29.97377": 0.03092}, "P": {"30.973762": 1.0}, "S": {"31.972071": 0.9499, "32.971459": 0.0075, "33.967867": 0.0425, "35.967081": 0.0001}, "Cl": {"34.968853": 0.7576, "36.965903": 0.2424}, "Ar": {"35.967545": 0.003336, "37.962732": 0.000629, "39.962383": 0.996035}, "K": {"38.963706": 0.932581, "39.963998": 0.000117, "40.961825": 0.067302}, "Ca": {"39.962591": 0.96941, "41.958618": 0.00647, "42.958766": 0.00135, "43.955482": 0.02086, "45.953689": 4e-05, "47.952523": 0.00187}, "Sc": {"44.955908": 1.0}, "Ti": {"45.952628": 0.0825, "46.951759": 0.0744, "47.947942": 0.7372, "48.947866": 0.0541, "49.944787": 0.0518}, "V": {"49.947156": 0.0025, "50.943957": 0.9975}, "Cr": {"49.946042": 0.04345, "51.940506": 0.83789, "52.940648": 0.09501, "53.938879": 0.02365}, "Mn": {"54.938044": 1.0}, "Fe": {"53.939609": 0.05845, "55.934936": 0.91754, "56.935393": 0.02119, "57.933274": 0.00282}, "Co": {"58.933194": 1.0}, "Ni": {"57.935342": 0.68077, "59.930786": 0.26223, "60.931056": 0.011399, "61.928345": 0.036346, "63.927967": 0.009255}, "Cu": {"62.929598": 0.6915, "64.92779": 0.3085}, "Zn": {"63.929142": 0.4917, "65.926034": 0.2773, "66.927128": 0.0404, "67.924845": 0.1845, "69.925319": 0.0061}, "Ga": {"68.925573": 0.60108, "70.924703": 0.39892}, "Ge": {"69.924249": 0.2057, "71.922076": 0.2745, "72.923459": 0.0775, "73.921178": 0.365, "75.921403": 0.0773}, "As": {"74.921595": 1.0}, "Se": {"73.922476": 0.0089, "75.919214": 0.0937, "76.919914": 0.0763, "77.917309": 0.2377, "79.916522": 0.4961, "81.916699": 0.0873}, "Br": {"78.918338": 0.5069, "80.91629": 0.4931}, "Kr": {"77.920365": 0.00355, "79.916378": 0.02286, "81.913483": 0.11593, "82.914127": 0.115, "83.911498": 0.56987, "85.910611": 0.17279}, "Rb": {"84.91179": 0.7217, "86.909181": 0.2783}, "Sr": {"83.913419": 0.0056, "85.909261": 0.0986, "86.908878": 0.07, "87.905613": 0.8258}, "Y": {"88.90584": 1.0}, "Zr": {"89.904698": 0.5145, "90.90564": 0.1122, "91.905035": 0.1715, "93.906311": 0.1738, "95.908271": 0.028}, "Nb": {"92.906373": 1.0}, "Mo": {"91.906808": 0.1453, "93.905085": 0.0915, "94.905839": 0.1584, "95.904676": 0.1667, "96.906018": 0.096, "97.905405": 0.2439, "99.907472": 0.0982}, "Tc": {"96.906367": 0.0, "97.907212": 0.0, "98.906251": 0.0}, "Ru": {"95.90759": 0.0554, "97.905287": 0.0187, "98.905934": 0.1276, "99.904214": 0.126, "100.905577": 0.1706, "101.904344": 0.3155, "103.905428": 0.1862}, "Rh": {"102.905498": 1.0}, "Pd": {"101.905602": 0.0102, "103.904031": 0.1114, "104.90508": 0.2233, "105.90348": 0.2733, "107.903892": 0.2646, "109.905172": 0.1172}, "Ag": {"106.905092": 0.51839, "108.904755": 0.48161}, "Cd": {"105.90646": 0.0125, "107.904183": 0.0089, "109.903007": 0.1249, "110.904183": 0.128, "111.902763": 0.2413, "112.904408": 0.1222, "113.903365": 0.2873, "115.904763": 0.0749}, "In": {"112.904062": 0.0429, "114.903879": 0.9571}, "Sn": {"111.904824": 0.0097, "113.902783": 0.0066, "114.903345": 0.0034, "115.901743": 0.1454, "116.902954": 0.0768, "117.901607": 0.2422, "118.903311": 0.0859, "119.902202": 0.3258, "121.903444": 0.0463, "123.905277": 0.0579}, "Sb": {"120.903812": 0.5721, "122.904213": 0.4279}, "Te": {"119.904059": 0.0009, "121.903043": 0.0255, "122.90427": 0.0089, "123.902817": 0.0474, "124.90443": 0.0707, "125.903311": 0.1884, "127.904461": 0.3174, "129.906223": 0.3408}, "I": {"126.904472": 1.0}, "Xe": {"123.905892": 0.000952, "125.904298": 0.00089, "127.903531": 0.019102, "128.904781": 0.264006, "129.903509": 0.04071, "130.905084": 0.212324, "131.904155": 0.269086, "133.905395": 0.104357, "135.907214": 0.088573}, "Cs": {"132.905452": 1.0}, "Ba": {"129.906321": 0.00106, "131.905061": 0.00101, "133.904508": 0.02417, "134.905688": 0.06592, "135.904576": 0.07854, "136.905827": 0.11232, "137.905247": 0.71698}, "La": {"137.907115": 0.000888, "138.906356": 0.999112}, "Ce": {"135.907129": 0.00185, "137.905991": 0.00251, "139.905443": 0.8845, "141.90925": 0.11114}, "Pr": {"140.907658": 1.0}, "Nd": {"141.907729": 0.27152, "142.90982": 0.12174, "143.910093": 0.23798, "144.912579": 0.08293, "145.913123": 0.17189, "147.916899": 0.05756, "149.920902": 0.05638}, "Pm": {"144.912756": 0.0, "146.915145": 0.0}, "Sm": {"143.912006": 0.0307, "146.914904": 0.1499, "147.914829": 0.1124, "148.917192": 0.1382, "149.917283": 0.0738, "151.91974": 0.2675, "153.922217": 0.2275}, "Eu": {"150.919858": 0.4781, "152.921238": 0.5219}, "Gd": {"151.9198": 0.002, "153.920874": 0.0218, "154.92263": 0.148, "155.922131": 0.2047, "156.923969": 0.1565, "157.924112": 0.2484, "159.927062": 0.2186}, "Tb": {"158.925355": 1.0}, "Dy": {"155.924285": 0.00056, "157.924416": 0.00095, "159.925205": 0.02329, "160.926941": 0.18889, "161.926806": 0.25475, "162.928738": 0.24896, "163.929182": 0.2826}, "Ho": {"164.930329": 1.0}, "Er": {"161.928788": 0.00139, "163.929209": 0.01601, "165.930299": 0.33503, "166.932055": 0.22869, "167.932377": 0.26978, "169.93547": 0.1491}, "Tm": {"168.934218": 1.0}, "Yb": {"167.93389": 0.00123, "169.934766": 0.02982, "170.93633": 0.1409, "171.936386": 0.2168, "172.938215": 0.16103, "173.938866": 0.32026, "175.942576": 0.12996}, "Lu": {"174.940775": 0.97401, "175.94269": 0.02599}, "Hf": {"173.940046": 0.0016, "175.941408": 0.0526, "176.943228": 0.186, "177.943706": 0.2728, "178.945823": 0.1362, "179.946557": 0.3508}, "Ta": {"179.947465": 0.00012, "180.947996": 0.99988}, "W": {"179.946711": 0.0012, "181.948204": 0.265, "182.950223": 0.1431, "183.950931": 0.3064, "185.954363": 0.2843}, "Re": {"184.952955": 0.374, "186.95575": 0.626}, "Os": {"183.952488": 0.0002, "185.953835": 0.0159, "186.955747": 0.0196, "187.955835": 0.1324, "188.958144": 0.1615, "189.958444": 0.2626, "191.961477": 0.4078}, "Ir": {"190.960589": 0.373, "192.962922": 0.627}, "Pt": {"189.95993": 0.00012, "191.961039": 0.00782, "193.962681": 0.3286, "194.964792": 0.3378, "195.964952": 0.2521, "197.967895": 0.07356}, "Au": {"196.966569": 1.0}, "Hg": {"195.965833": 0.0015, "197.966769": 0.0997, "198.968281": 0.1687, "199.968327": 0.231, "200.970303": 0.1318, "201.970643": 0.2986, "203.973494": 0.0687}, "Tl": {"202.972345": 0.2952, "204.974428": 0.7048}, "Pb": {"203.973044": 0.014, "205.974466": 0.241, "206.975897": 0.221, "207.976653": 0.524}, "Bi": {"208.980399": 1.0}, "Po": {"208.982431": 0.0, "209.982874": 0.0}, "At": {"209.987148": 0.0, "210.987497": 0.0}, "Rn": {"210.990601": 0.0, "220.011394": 0.0, "222.017578": 0.0}, "Fr": {"223.019736": 0.0}, "Ra": {"223.018502": 0.0, "224.020212": 0.0, "226.02541": 0.0, "228.031071": 0.0}, "Ac": {"227.027752": 0.0}, "Th": {"230.033134": 0.0, "232.038056": 1.0}, "Pa": {"231.035884": 1.0}, "U": {"233.039636": 0.0, "234.040952": 5.4e-05, "235.04393": 0.007204, "236.045568": 0.0, "238.050788": 0.992742}, "Np": {"236.04657": 0.0, "237.048174": 0.0}, "Pu": {"238.04956": 0.0, "239.052164": 0.0, "240.053814": 0.0, "241.056852": 0.0, "242.058743": 0.0, "244.064205": 0.0}, "Am": {"241.056829": 0.0, "243.061381": 0.0}, "Cm": {"243.061389": 0.0, "244.062753": 0.0, "245.065492": 0.0, "246.067224": 0.0, "247.070354": 0.0, "248.07235": 0.0}, "Bk": {"247.070307": 0.0, "249.074988": 0.0}, "Cf": {"249.074854": 0.0, "250.076406": 0.0, "251.079589": 0.0, "252.081627": 0.0}, "Es": {"252.08298": 0.0}, "Fm": {"257.095106": 0.0}, "Md": {"258.098432": 0.0, "260.10365": 0.0}, "No": {"259.10103": 0.0}, "Lr": {"262.10961": 0.0}, "Rf": {"267.12179": 0.0}, "Db": {"268.12567": 0.0}, "Sg": {"271.13393": 0.0}, "Bh": {"272.13826": 0.0}, "Hs": {"270.13429": 0.0}, "Mt": {"276.15159": 0.0}, "Ds": {"281.16451": 0.0}, "Rg": {"280.16514": 0.0}, "Cn": {"285.17712": 0.0}, "Nh": {"284.17873": 0.0}, "Fl": {"289.19042": 0.0}, "Mc": {"288.19274": 0.0}, "Lv": {"293.20449": 0.0}, "Ts": {"292.20746": 0.0}, "Og": {"294.21392": 0.0}}
@@ -0,0 +1 @@
1
+ {"1": {"1": [1.00782503223, 0.999885, 1.00784], "2": [2.01410177812, 0.000115, 1.00784], "3": [3.0160492779, 0, 1.00784]}, "2": {"3": [3.0160293201, 1.34e-06, 4.002602], "4": [4.00260325413, 0.99999866, 4.002602]}, "3": {"6": [6.0151228874, 0.0759, 6.938], "7": [7.0160034366, 0.9241, 6.938]}, "4": {"9": [9.012183065, 1.0, 9.0121831]}, "5": {"10": [10.01293695, 0.199, 10.806], "11": [11.00930536, 0.801, 10.806]}, "6": {"12": [12.0, 0.9893, 12.0096], "13": [13.00335483507, 0.0107, 12.0096], "14": [14.0032419884, 0, 12.0096]}, "7": {"14": [14.00307400443, 0.99636, 14.00643], "15": [15.00010889888, 0.00364, 14.00643]}, "8": {"16": [15.99491461957, 0.99757, 15.99903], "17": [16.9991317565, 0.00038, 15.99903], "18": [17.99915961286, 0.00205, 15.99903]}, "9": {"19": [18.99840316273, 1.0, 18.998403163]}, "10": {"20": [19.9924401762, 0.9048, 20.1797], "21": [20.993846685, 0.0027, 20.1797], "22": [21.991385114, 0.0925, 20.1797]}, "11": {"23": [22.989769282, 1.0, 22.98976928]}, "12": {"24": [23.985041697, 0.7899, 24.304], "25": [24.985836976, 0.1, 24.304], "26": [25.982592968, 0.1101, 24.304]}, "13": {"27": [26.98153853, 1.0, 26.9815385]}, "14": {"28": [27.97692653465, 0.92223, 28.084], "29": [28.9764946649, 0.04685, 28.084], "30": [29.973770136, 0.03092, 28.084]}, "15": {"31": [30.97376199842, 1.0, 30.973761998]}, "16": {"32": [31.9720711744, 0.9499, 32.059], "33": [32.9714589098, 0.0075, 32.059], "34": [33.967867004, 0.0425, 32.059], "36": [35.96708071, 0.0001, 32.059]}, "17": {"35": [34.968852682, 0.7576, 35.446], "37": [36.965902602, 0.2424, 35.446]}, "18": {"36": [35.967545105, 0.003336, 39.948], "38": [37.96273211, 0.000629, 39.948], "40": [39.9623831237, 0.996035, 39.948]}, "19": {"39": [38.9637064864, 0.932581, 39.0983], "40": [39.963998166, 0.000117, 39.0983], "41": [40.9618252579, 0.067302, 39.0983]}, "20": {"40": [39.962590863, 0.96941, 40.078], "42": [41.95861783, 0.00647, 40.078], "43": [42.95876644, 0.00135, 40.078], "44": [43.95548156, 0.02086, 40.078], "46": [45.953689, 4e-05, 40.078], "48": [47.95252276, 0.00187, 40.078]}, "21": {"45": [44.95590828, 1.0, 44.955908]}, "22": {"46": [45.95262772, 0.0825, 47.867], "47": [46.95175879, 0.0744, 47.867], "48": [47.94794198, 0.7372, 47.867], "49": [48.94786568, 0.0541, 47.867], "50": [49.94478689, 0.0518, 47.867]}, "23": {"50": [49.94715601, 0.0025, 50.9415], "51": [50.94395704, 0.9975, 50.9415]}, "24": {"50": [49.94604183, 0.04345, 51.9961], "52": [51.94050623, 0.83789, 51.9961], "53": [52.94064815, 0.09501, 51.9961], "54": [53.93887916, 0.02365, 51.9961]}, "25": {"55": [54.93804391, 1.0, 54.938044]}, "26": {"54": [53.93960899, 0.05845, 55.845], "56": [55.93493633, 0.91754, 55.845], "57": [56.93539284, 0.02119, 55.845], "58": [57.93327443, 0.00282, 55.845]}, "27": {"59": [58.93319429, 1.0, 58.933194]}, "28": {"58": [57.93534241, 0.68077, 58.6934], "60": [59.93078588, 0.26223, 58.6934], "61": [60.93105557, 0.011399, 58.6934], "62": [61.92834537, 0.036346, 58.6934], "64": [63.92796682, 0.009255, 58.6934]}, "29": {"63": [62.92959772, 0.6915, 63.546], "65": [64.9277897, 0.3085, 63.546]}, "30": {"64": [63.92914201, 0.4917, 65.38], "66": [65.92603381, 0.2773, 65.38], "67": [66.92712775, 0.0404, 65.38], "68": [67.92484455, 0.1845, 65.38], "70": [69.9253192, 0.0061, 65.38]}, "31": {"69": [68.9255735, 0.60108, 69.723], "71": [70.92470258, 0.39892, 69.723]}, "32": {"70": [69.92424875, 0.2057, 72.63], "72": [71.922075826, 0.2745, 72.63], "73": [72.923458956, 0.0775, 72.63], "74": [73.921177761, 0.365, 72.63], "76": [75.921402726, 0.0773, 72.63]}, "33": {"75": [74.92159457, 1.0, 74.921595]}, "34": {"74": [73.922475934, 0.0089, 78.971], "76": [75.919213704, 0.0937, 78.971], "77": [76.919914154, 0.0763, 78.971], "78": [77.91730928, 0.2377, 78.971], "80": [79.9165218, 0.4961, 78.971], "82": [81.9166995, 0.0873, 78.971]}, "35": {"79": [78.9183376, 0.5069, 79.901], "81": [80.9162897, 0.4931, 79.901]}, "36": {"78": [77.92036494, 0.00355, 83.798], "80": [79.91637808, 0.02286, 83.798], "82": [81.91348273, 0.11593, 83.798], "83": [82.91412716, 0.115, 83.798], "84": [83.9114977282, 0.56987, 83.798], "86": [85.9106106269, 0.17279, 83.798]}, "37": {"85": [84.9117897379, 0.7217, 85.4678], "87": [86.909180531, 0.2783, 85.4678]}, "38": {"84": [83.9134191, 0.0056, 87.62], "86": [85.9092606, 0.0986, 87.62], "87": [86.9088775, 0.07, 87.62], "88": [87.9056125, 0.8258, 87.62]}, "39": {"89": [88.9058403, 1.0, 88.90584]}, "40": {"90": [89.9046977, 0.5145, 91.224], "91": [90.9056396, 0.1122, 91.224], "92": [91.9050347, 0.1715, 91.224], "94": [93.9063108, 0.1738, 91.224], "96": [95.9082714, 0.028, 91.224]}, "41": {"93": [92.906373, 1.0, 92.90637]}, "42": {"92": [91.90680796, 0.1453, 95.95], "94": [93.9050849, 0.0915, 95.95], "95": [94.90583877, 0.1584, 95.95], "96": [95.90467612, 0.1667, 95.95], "97": [96.90601812, 0.096, 95.95], "98": [97.90540482, 0.2439, 95.95], "100": [99.9074718, 0.0982, 95.95]}, "43": {"97": [96.9063667, 0, 98.0], "98": [97.9072124, 0, 98.0], "99": [98.9062508, 0, 98.0]}, "44": {"96": [95.90759025, 0.0554, 101.07], "98": [97.9052868, 0.0187, 101.07], "99": [98.9059341, 0.1276, 101.07], "100": [99.9042143, 0.126, 101.07], "101": [100.9055769, 0.1706, 101.07], "102": [101.9043441, 0.3155, 101.07], "104": [103.9054275, 0.1862, 101.07]}, "45": {"103": [102.905498, 1.0, 102.9055]}, "46": {"102": [101.9056022, 0.0102, 106.42], "104": [103.9040305, 0.1114, 106.42], "105": [104.9050796, 0.2233, 106.42], "106": [105.9034804, 0.2733, 106.42], "108": [107.9038916, 0.2646, 106.42], "110": [109.9051722, 0.1172, 106.42]}, "47": {"107": [106.9050916, 0.51839, 107.8682], "109": [108.9047553, 0.48161, 107.8682]}, "48": {"106": [105.9064599, 0.0125, 112.414], "108": [107.9041834, 0.0089, 112.414], "110": [109.90300661, 0.1249, 112.414], "111": [110.90418287, 0.128, 112.414], "112": [111.90276287, 0.2413, 112.414], "113": [112.90440813, 0.1222, 112.414], "114": [113.90336509, 0.2873, 112.414], "116": [115.90476315, 0.0749, 112.414]}, "49": {"113": [112.90406184, 0.0429, 114.818], "115": [114.903878776, 0.9571, 114.818]}, "50": {"112": [111.90482387, 0.0097, 118.71], "114": [113.9027827, 0.0066, 118.71], "115": [114.903344699, 0.0034, 118.71], "116": [115.9017428, 0.1454, 118.71], "117": [116.90295398, 0.0768, 118.71], "118": [117.90160657, 0.2422, 118.71], "119": [118.90331117, 0.0859, 118.71], "120": [119.90220163, 0.3258, 118.71], "122": [121.9034438, 0.0463, 118.71], "124": [123.9052766, 0.0579, 118.71]}, "51": {"121": [120.903812, 0.5721, 121.76], "123": [122.9042132, 0.4279, 121.76]}, "52": {"120": [119.9040593, 0.0009, 127.6], "122": [121.9030435, 0.0255, 127.6], "123": [122.9042698, 0.0089, 127.6], "124": [123.9028171, 0.0474, 127.6], "125": [124.9044299, 0.0707, 127.6], "126": [125.9033109, 0.1884, 127.6], "128": [127.90446128, 0.3174, 127.6], "130": [129.906222748, 0.3408, 127.6]}, "53": {"127": [126.9044719, 1.0, 126.90447]}, "54": {"124": [123.905892, 0.000952, 131.293], "126": [125.9042983, 0.00089, 131.293], "128": [127.903531, 0.019102, 131.293], "129": [128.9047808611, 0.264006, 131.293], "130": [129.903509349, 0.04071, 131.293], "131": [130.90508406, 0.212324, 131.293], "132": [131.9041550856, 0.269086, 131.293], "134": [133.90539466, 0.104357, 131.293], "136": [135.907214484, 0.088573, 131.293]}, "55": {"133": [132.905451961, 1.0, 132.90545196]}, "56": {"130": [129.9063207, 0.00106, 137.327], "132": [131.9050611, 0.00101, 137.327], "134": [133.90450818, 0.02417, 137.327], "135": [134.90568838, 0.06592, 137.327], "136": [135.90457573, 0.07854, 137.327], "137": [136.90582714, 0.11232, 137.327], "138": [137.905247, 0.71698, 137.327]}, "57": {"138": [137.9071149, 0.0008881, 138.90547], "139": [138.9063563, 0.9991119, 138.90547]}, "58": {"136": [135.90712921, 0.00185, 140.116], "138": [137.905991, 0.00251, 140.116], "140": [139.9054431, 0.8845, 140.116], "142": [141.9092504, 0.11114, 140.116]}, "59": {"141": [140.9076576, 1.0, 140.90766]}, "60": {"142": [141.907729, 0.27152, 144.242], "143": [142.90982, 0.12174, 144.242], "144": [143.910093, 0.23798, 144.242], "145": [144.9125793, 0.08293, 144.242], "146": [145.9131226, 0.17189, 144.242], "148": [147.9168993, 0.05756, 144.242], "150": [149.9209022, 0.05638, 144.242]}, "61": {"145": [144.9127559, 0, 145.0], "147": [146.915145, 0, 145.0]}, "62": {"144": [143.9120065, 0.0307, 150.36], "147": [146.9149044, 0.1499, 150.36], "148": [147.9148292, 0.1124, 150.36], "149": [148.9171921, 0.1382, 150.36], "150": [149.9172829, 0.0738, 150.36], "152": [151.9197397, 0.2675, 150.36], "154": [153.9222169, 0.2275, 150.36]}, "63": {"151": [150.9198578, 0.4781, 151.964], "153": [152.921238, 0.5219, 151.964]}, "64": {"152": [151.9197995, 0.002, 157.25], "154": [153.9208741, 0.0218, 157.25], "155": [154.9226305, 0.148, 157.25], "156": [155.9221312, 0.2047, 157.25], "157": [156.9239686, 0.1565, 157.25], "158": [157.9241123, 0.2484, 157.25], "160": [159.9270624, 0.2186, 157.25]}, "65": {"159": [158.9253547, 1.0, 158.92535]}, "66": {"156": [155.9242847, 0.00056, 162.5], "158": [157.9244159, 0.00095, 162.5], "160": [159.9252046, 0.02329, 162.5], "161": [160.9269405, 0.18889, 162.5], "162": [161.9268056, 0.25475, 162.5], "163": [162.9287383, 0.24896, 162.5], "164": [163.9291819, 0.2826, 162.5]}, "67": {"165": [164.9303288, 1.0, 164.93033]}, "68": {"162": [161.9287884, 0.00139, 167.259], "164": [163.9292088, 0.01601, 167.259], "166": [165.9302995, 0.33503, 167.259], "167": [166.9320546, 0.22869, 167.259], "168": [167.9323767, 0.26978, 167.259], "170": [169.9354702, 0.1491, 167.259]}, "69": {"169": [168.9342179, 1.0, 168.93422]}, "70": {"168": [167.9338896, 0.00123, 173.054], "170": [169.9347664, 0.02982, 173.054], "171": [170.9363302, 0.1409, 173.054], "172": [171.9363859, 0.2168, 173.054], "173": [172.9382151, 0.16103, 173.054], "174": [173.9388664, 0.32026, 173.054], "176": [175.9425764, 0.12996, 173.054]}, "71": {"175": [174.9407752, 0.97401, 174.9668], "176": [175.9426897, 0.02599, 174.9668]}, "72": {"174": [173.9400461, 0.0016, 178.49], "176": [175.9414076, 0.0526, 178.49], "177": [176.9432277, 0.186, 178.49], "178": [177.9437058, 0.2728, 178.49], "179": [178.9458232, 0.1362, 178.49], "180": [179.946557, 0.3508, 178.49]}, "73": {"180": [179.9474648, 0.0001201, 180.94788], "181": [180.9479958, 0.9998799, 180.94788]}, "74": {"180": [179.9467108, 0.0012, 183.84], "182": [181.94820394, 0.265, 183.84], "183": [182.95022275, 0.1431, 183.84], "184": [183.95093092, 0.3064, 183.84], "186": [185.9543628, 0.2843, 183.84]}, "75": {"185": [184.9529545, 0.374, 186.207], "187": [186.9557501, 0.626, 186.207]}, "76": {"184": [183.9524885, 0.0002, 190.23], "186": [185.953835, 0.0159, 190.23], "187": [186.9557474, 0.0196, 190.23], "188": [187.9558352, 0.1324, 190.23], "189": [188.9581442, 0.1615, 190.23], "190": [189.9584437, 0.2626, 190.23], "192": [191.961477, 0.4078, 190.23]}, "77": {"191": [190.9605893, 0.373, 192.217], "193": [192.9629216, 0.627, 192.217]}, "78": {"190": [189.9599297, 0.00012, 195.084], "192": [191.9610387, 0.00782, 195.084], "194": [193.9626809, 0.3286, 195.084], "195": [194.9647917, 0.3378, 195.084], "196": [195.96495209, 0.2521, 195.084], "198": [197.9678949, 0.07356, 195.084]}, "79": {"197": [196.96656879, 1.0, 196.966569]}, "80": {"196": [195.9658326, 0.0015, 200.592], "198": [197.9667686, 0.0997, 200.592], "199": [198.96828064, 0.1687, 200.592], "200": [199.96832659, 0.231, 200.592], "201": [200.97030284, 0.1318, 200.592], "202": [201.9706434, 0.2986, 200.592], "204": [203.97349398, 0.0687, 200.592]}, "81": {"203": [202.9723446, 0.2952, 204.382], "205": [204.9744278, 0.7048, 204.382]}, "82": {"204": [203.973044, 0.014, 207.2], "206": [205.9744657, 0.241, 207.2], "207": [206.9758973, 0.221, 207.2], "208": [207.9766525, 0.524, 207.2]}, "83": {"209": [208.9803991, 1.0, 208.9804]}, "84": {"209": [208.9824308, 0, 209.0], "210": [209.9828741, 0, 209.0]}, "85": {"210": [209.9871479, 0, 210.0], "211": [210.9874966, 0, 210.0]}, "86": {"211": [210.9906011, 0, 222.0], "220": [220.0113941, 0, 222.0], "222": [222.0175782, 0, 222.0]}, "87": {"223": [223.019736, 0, 223.0]}, "88": {"223": [223.0185023, 0, 226.0], "224": [224.020212, 0, 226.0], "226": [226.0254103, 0, 226.0], "228": [228.0310707, 0, 226.0]}, "89": {"227": [227.0277523, 0, 227.0]}, "90": {"230": [230.0331341, 0, 232.0377], "232": [232.0380558, 1.0, 232.0377]}, "91": {"231": [231.0358842, 1.0, 231.03588]}, "92": {"233": [233.0396355, 0, 238.02891], "234": [234.0409523, 5.4e-05, 238.02891], "235": [235.0439301, 0.007204, 238.02891], "236": [236.0455682, 0, 238.02891], "238": [238.0507884, 0.992742, 238.02891]}, "93": {"236": [236.04657, 0, 237.0], "237": [237.0481736, 0, 237.0]}, "94": {"238": [238.0495601, 0, 244.0], "239": [239.0521636, 0, 244.0], "240": [240.0538138, 0, 244.0], "241": [241.0568517, 0, 244.0], "242": [242.0587428, 0, 244.0], "244": [244.0642053, 0, 244.0]}, "95": {"241": [241.0568293, 0, 241.0568293], "243": [243.0613813, 0, 243.0613813]}, "96": {"243": [243.0613893, 0, 243.0613893], "244": [244.0627528, 0, 244.0627528], "245": [245.0654915, 0, 245.0654915], "246": [246.0672238, 0, 246.0672238], "247": [247.0703541, 0, 247.0703541], "248": [248.0723499, 0, 248.0723499]}, "97": {"247": [247.0703073, 0, 247.0703073], "249": [249.0749877, 0, 249.0749877]}, "98": {"249": [249.0748539, 0, 249.0748539], "250": [250.0764062, 0, 250.0764062], "251": [251.0795886, 0, 251.0795886], "252": [252.0816272, 0, 252.0816272]}, "99": {"252": [252.08298, 0, 252.08298]}, "100": {"257": [257.0951061, 0, 257.0951061]}, "101": {"258": [258.0984315, 0, 258.0984315], "260": [260.10365, 0, 260.10365]}, "102": {"259": [259.10103, 0, 259.10103]}, "103": {"262": [262.10961, 0, 262.10961]}, "104": {"267": [267.12179, 0, 267.12179]}, "105": {"268": [268.12567, 0, 268.12567]}, "106": {"271": [271.13393, 0, 271.13393]}, "107": {"272": [272.13826, 0, 272.13826]}, "108": {"270": [270.13429, 0, 270.13429]}, "109": {"276": [276.15159, 0, 276.15159]}, "110": {"281": [281.16451, 0, 281.16451]}, "111": {"280": [280.16514, 0, 280.16514]}, "112": {"285": [285.17712, 0, 285.17712]}, "113": {"284": [284.17873, 0, 284.17873]}, "114": {"289": [289.19042, 0, 289.19042]}, "115": {"288": [288.19274, 0, 288.19274]}, "116": {"293": [293.20449, 0, 293.20449]}, "117": {"292": [292.20746, 0, 292.20746]}, "118": {"294": [294.21392, 0, 294.21392]}}
@@ -0,0 +1,116 @@
1
+ """
2
+ Read the NIST isotopes data file and write it to a JSON file.
3
+
4
+ NIST Isotopes data from:
5
+ https://physics.nist.gov/cgi-bin/Compositions/stand_alone.pl?ele=&all=all&ascii=ascii2
6
+ """
7
+
8
+ import json
9
+ from collections import defaultdict
10
+ from importlib import resources
11
+ from typing import Callable, TypeVar
12
+
13
+ data_dir = resources.files("stjames").joinpath("data")
14
+
15
+ _T = TypeVar("_T")
16
+
17
+
18
+ def process_line(line: str, fmt: Callable[[str], _T] = str) -> _T: # type: ignore[assignment]
19
+ """
20
+ Process a line from the NIST data file.
21
+
22
+ :param line: line to process
23
+ :param fmt: function to format the value
24
+ >>> process_line("Atomic Number = 1", int)
25
+ 1
26
+ """
27
+ return fmt(line.split("=")[-1].strip())
28
+
29
+
30
+ def fmt_float(val: str) -> float:
31
+ """
32
+ Format a float from the NIST data file.
33
+
34
+ >>> fmt_float(" 1.00784(7)")
35
+ 1.00784
36
+ """
37
+ return float(val.strip().split("(")[0])
38
+
39
+
40
+ def fmt_maybe_list(val: str) -> float:
41
+ """
42
+ Format a float or list of floats from the NIST data file.
43
+
44
+ Only the first value is returned.
45
+
46
+ >>> fmt_maybe_list("1.00784(7)")
47
+ 1.00784
48
+ >>> fmt_maybe_list(" [1.00784,1.00811]")
49
+ 1.00784
50
+ >>> fmt_maybe_list(" [98]")
51
+ 98.0
52
+ """
53
+ val = val.strip()
54
+ if val.startswith("["):
55
+ val = val[1:-1].split(",")[0]
56
+ return fmt_float(val)
57
+
58
+
59
+ def process_chunk(chunk: str) -> tuple[int, int, tuple[float, float, float]]:
60
+ r"""
61
+ Atomic Number, Mass Number, (Relative Atomic Mass, Isotopic Composition, Standard Atomic Weight)
62
+
63
+ >>> process_chunk('''\
64
+ ... Atomic Number = 1
65
+ ... Atomic Symbol = H
66
+ ... Mass Number = 1
67
+ ... Relative Atomic Mass = 1.00784(7)
68
+ ... Isotopic Composition = 0.999885(70)
69
+ ... Standard Atomic Weight = [1.00784,1.00811]
70
+ ... Notes = m
71
+ ... ''')
72
+ (1, 1, (1.00784, 0.999885, 1.00784))
73
+ """
74
+ lines = chunk.splitlines()
75
+
76
+ atomic_number = process_line(lines[0], int)
77
+ _atomic_symbol = process_line(lines[1], str)
78
+ mass_number = process_line(lines[2], int)
79
+ relative_atomic_mass = process_line(lines[3], fmt_float)
80
+ try:
81
+ isotopic_composition = process_line(lines[4], fmt_float)
82
+ except ValueError:
83
+ isotopic_composition = 0
84
+ try:
85
+ standard_atomic_weight = process_line(lines[5], fmt_maybe_list)
86
+ except ValueError:
87
+ standard_atomic_weight = relative_atomic_mass
88
+
89
+ return atomic_number, mass_number, (relative_atomic_mass, isotopic_composition, standard_atomic_weight)
90
+
91
+
92
+ def read_nist_isotopes() -> dict[int, dict[int, tuple[float, float, float]]]:
93
+ """
94
+ Read the NIST data file and write it to a JSON file.
95
+
96
+ {Atomic Number: {Mass Number, (Relative Atomic Mass, Isotopic Composition, Standard Atomic Weight)}}
97
+ """
98
+ with data_dir.joinpath("nist_isotopes.txt").open() as f:
99
+ next(f), next(f) # Skip the first two lines
100
+ nist_isotopes = f.read()
101
+
102
+ isotopes: dict[int, dict[int, tuple[float, float, float]]] = defaultdict(dict)
103
+ for chunk in nist_isotopes.split("\n\n"):
104
+ atomic_number, mass_number, values = process_chunk(chunk)
105
+ isotopes[atomic_number][mass_number] = values
106
+
107
+ with open("nist_isotopes.json", "w") as f:
108
+ json.dump(isotopes, f)
109
+
110
+ return isotopes
111
+
112
+
113
+ if __name__ == "__main__":
114
+ from pprint import pprint
115
+
116
+ pprint(read_nist_isotopes())
@@ -0,0 +1 @@
1
+ {"Bq": 0, "H": 1, "He": 2, "Li": 3, "Be": 4, "B": 5, "C": 6, "N": 7, "O": 8, "F": 9, "Ne": 10, "Na": 11, "Mg": 12, "Al": 13, "Si": 14, "P": 15, "S": 16, "Cl": 17, "Ar": 18, "K": 19, "Ca": 20, "Sc": 21, "Ti": 22, "V": 23, "Cr": 24, "Mn": 25, "Fe": 26, "Co": 27, "Ni": 28, "Cu": 29, "Zn": 30, "Ga": 31, "Ge": 32, "As": 33, "Se": 34, "Br": 35, "Kr": 36, "Rb": 37, "Sr": 38, "Y": 39, "Zr": 40, "Nb": 41, "Mo": 42, "Tc": 43, "Ru": 44, "Rh": 45, "Pd": 46, "Ag": 47, "Cd": 48, "In": 49, "Sn": 50, "Sb": 51, "Te": 52, "I": 53, "Xe": 54, "Cs": 55, "Ba": 56, "La": 57, "Ce": 58, "Pr": 59, "Nd": 60, "Pm": 61, "Sm": 62, "Eu": 63, "Gd": 64, "Tb": 65, "Dy": 66, "Ho": 67, "Er": 68, "Tm": 69, "Yb": 70, "Lu": 71, "Hf": 72, "Ta": 73, "W": 74, "Re": 75, "Os": 76, "Ir": 77, "Pt": 78, "Au": 79, "Hg": 80, "Tl": 81, "Pb": 82, "Bi": 83, "Po": 84, "At": 85, "Rn": 86, "Fr": 87, "Ra": 88, "Ac": 89, "Th": 90, "Pa": 91, "U": 92, "Np": 93, "Pu": 94, "Am": 95, "Cm": 96, "Bk": 97, "Cf": 98, "Es": 99, "Fm": 100, "Md": 101, "No": 102, "Lr": 103, "Rf": 104, "Db": 105, "Sg": 106, "Bh": 107, "Hs": 108, "Mt": 109, "Ds": 110, "Rg": 111, "Cn": 112, "Nh": 113, "Fl": 114, "Mc": 115, "Lv": 116, "Ts": 117, "Og": 118}
@@ -29,10 +29,43 @@ class Method(LowercaseStrEnum):
29
29
 
30
30
  AIMNET2_WB97MD3 = "aimnet2_wb97md3"
31
31
 
32
+ GFN_FF = "gfn_ff"
32
33
  GFN0_XTB = "gfn0_xtb"
33
34
  GFN1_XTB = "gfn1_xtb"
34
35
  GFN2_XTB = "gfn2_xtb"
35
- GFN_FF = "gfn_ff"
36
36
 
37
37
  # this was going to be removed, but Jonathon wrote such a nice basis set test... it's off the front end.
38
38
  BP86 = "bp86"
39
+
40
+
41
+ MLFF = [
42
+ Method.AIMNET2_WB97MD3,
43
+ ]
44
+
45
+ XTB_METHODS = [
46
+ Method.GFN_FF,
47
+ Method.GFN0_XTB,
48
+ Method.GFN1_XTB,
49
+ Method.GFN2_XTB,
50
+ ]
51
+
52
+ COMPOSITE_METHODS = [
53
+ Method.HF3C,
54
+ Method.B973C,
55
+ Method.R2SCAN3C,
56
+ Method.WB97X3C,
57
+ ]
58
+
59
+ PREPACKAGED_METHODS = [
60
+ *MLFF,
61
+ *XTB_METHODS,
62
+ *COMPOSITE_METHODS,
63
+ ]
64
+
65
+ METHODS_WITH_CORRECTION = [
66
+ Method.WB97XD3,
67
+ Method.WB97XV,
68
+ Method.WB97MV,
69
+ Method.WB97MD3BJ,
70
+ Method.DSDBLYPD3BJ,
71
+ ]