1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
import json
import datetime
import pytest
from monty.io import zopen
from monty.serialization import loadfn
from emmet.core.qchem.task import TaskDocument
from emmet.core.molecules.bonds import MoleculeBondingDoc
@pytest.fixture(scope="session")
def test_tasks(test_dir):
with zopen(test_dir / "liec_tasks.json.gz") as f:
data = json.load(f)
for d in data:
d["last_updated"] = datetime.datetime.strptime(
d["last_updated"]["string"], "%Y-%m-%d %H:%M:%S.%f"
)
tasks = [TaskDocument(**t) for t in data]
return tasks
@pytest.fixture(scope="session")
def nbo_task(test_dir):
return TaskDocument(**loadfn(test_dir / "open_shell_nbo_task.json.gz"))
def test_bonding(test_tasks, nbo_task):
# No Critic2 or NBO
try:
ob_mee = MoleculeBondingDoc.from_task(
test_tasks[0],
molecule_id="b9ba54febc77d2a9177accf4605767db-C1Li2O3-1-2",
preferred_methods=["OpenBabelNN + metal_edge_extender"],
)
except RuntimeError:
pytest.skip("openbabel is only available for the default Python version")
assert ob_mee.property_name == "bonding"
assert ob_mee.method == "OpenBabelNN + metal_edge_extender"
assert len(ob_mee.bonds) == 12
assert len(ob_mee.bonds_nometal) == 10
assert set(ob_mee.bond_types.keys()) == {"C-C", "C-H", "C-O", "Li-O"}
ob_critic = MoleculeBondingDoc.from_task(
test_tasks[3],
molecule_id="b9ba54febc77d2a9177accf4605767db-C1Li2O3-1-2",
preferred_methods=["critic2"],
)
assert ob_critic.method == "critic2"
assert len(ob_critic.bonds) == 12
assert len(ob_critic.bonds_nometal) == 10
assert set(ob_critic.bond_types.keys()) == {"C-C", "C-H", "C-O", "Li-O"}
assert ob_mee.molecule_graph.isomorphic_to(ob_critic.molecule_graph)
nbo = MoleculeBondingDoc.from_task(
nbo_task,
molecule_id="b9ba54febc77d2a9177accf4605767db-C1Li2O3-1-2",
preferred_methods=["nbo"],
)
assert nbo.method == "nbo"
assert len(nbo.bonds) == 11
assert len(nbo.bonds_nometal) == 9
assert set(nbo.bond_types.keys()) == {"C-H", "C-O", "C-Li", "Li-O"}
|