Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
python-version: ["3.12", "3.13"]
python-version: ["3.12", "3.13", "3.14"]
openeye: [true, false]
nagl: [true, false]
exclude:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
python-version: [ "3.12"]
python-version: [ "3.12", "3.14" ]

env:
PYTEST_ARGS: -r fE -v -x --tb=short -nauto --durations=10
Expand Down
3 changes: 1 addition & 2 deletions devtools/conda-envs/examples.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ dependencies:
- openff-nagl-models >=2025
- nglview
# Toolkit-specific
# https://github.com/rdkit/rdkit/issues/7221 and https://github.com/rdkit/rdkit/issues/7583
- rdkit =2024
- rdkit
# Test-only/optional/dev/typing/examples
- pytest =8
- pytest-xdist
Expand Down
4 changes: 1 addition & 3 deletions devtools/conda-envs/test_env.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@ dependencies:
- openff-nagl-models >=0.3.0
# Toolkit-specific
- ambertools >=22
# rdkit 2024.03.6 and 2024.09.1 packages fail when run natively on osx-arm64 macs
# https://github.com/rdkit/rdkit/issues/7583
- rdkit !=2024.03.6,!=2024.09.1
- rdkit >=2025

- openeye::openeye-toolkits
# Test-only/optional/dev/typing
Expand Down
3 changes: 1 addition & 2 deletions devtools/conda-envs/test_env_no_openeye.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ dependencies:
- openff-nagl-models >=0.3.0
# Toolkit-specific
- ambertools >=22
# https://github.com/rdkit/rdkit/issues/7221 and https://github.com/rdkit/rdkit/issues/7583
- rdkit !=2024.03.6,!=2024.03.5
- rdkit >=2025
# Test-only/optional/dev/typing
- pytest =8
- pytest-cov
Expand Down
6 changes: 5 additions & 1 deletion docs/releasehistory.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,16 @@ Releases follow the `major.minor.micro` scheme recommended by [PEP440](https://w

### Behavior changes

- [PR #2238](https://github.com/openforcefield/openff-toolkit/pull/2238): Adds support for QCSchema V2 in `Molecule.to_qcschema`, which now only returns QCSchema V2 models.

### Bugfixes

- [PR #2234](https://github.com/openforcefield/openff-toolkit/pull/2234): Fixes some deprecation warnings thrown by using deprecated Pydantic V1 methods in tests.
- [PR #2236](https://github.com/openforcefield/openff-toolkit/pull/2236): Fixes a rare case in which force field files with similar names were incorrectly loaded.

### New features
### Tests updated

- [PR #2238](https://github.com/openforcefield/openff-toolkit/pull/2238): Run tests on Python 3.14.

### Improved documentation and warnings

Expand Down
156 changes: 87 additions & 69 deletions examples/QCArchive_interface/QCarchive_interface.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,19 @@
"execution_count": 1,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:15.496419Z",
"iopub.status.busy": "2026-05-25T19:46:15.496314Z",
"iopub.status.idle": "2026-05-25T19:46:21.504039Z",
"shell.execute_reply": "2026-05-25T19:46:21.503399Z",
"shell.execute_reply.started": "2026-05-25T19:46:15.496407Z"
"iopub.execute_input": "2026-09-18T18:11:52.229678Z",
"iopub.status.busy": "2026-09-18T18:11:52.229615Z",
"iopub.status.idle": "2026-09-18T18:11:56.853976Z",
"shell.execute_reply": "2026-09-18T18:11:56.853311Z",
"shell.execute_reply.started": "2026-09-18T18:11:52.229671Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "678eea5ba7b04d1892b4a5e800deea61",
"model_id": "d80f270f7f8345599434d07c7a6f7a2d",
"version_major": 2,
"version_minor": 0
},
Expand All @@ -42,7 +42,7 @@
"output_type": "stream",
"text": [
" id type record_count name\n",
"---- ---------------- -------------- ---------------------------------------------------------------------------------------\n",
"---- ---------------- -------------- ----------------------------------------------------------------------------------------\n",
" 35 torsiondrive 454 OpenFF Fragmenter Phenyl Benchmark\n",
" 36 torsiondrive 820 OpenFF Group1 Torsions\n",
" 41 optimization 937 OpenFF Optimization Set 1\n",
Expand Down Expand Up @@ -240,7 +240,7 @@
" 463 singlepoint 158905 tmQM xtb Dataset T=100K low-mw high-coordinate mult=5 v0.0\n",
" 464 singlepoint 206240 tmQM xtb Dataset T=100K low-mw high-coordinate mult=3 v0.0\n",
" 465 singlepoint 968 OpenFF TMC Atom Energies v0.0\n",
" 467 optimization 1968 TM Benchmark Optimization Dataset Step 2 v0.0\n",
" 467 optimization 2624 TM Benchmark Optimization Dataset Step 2 v0.0\n",
" 468 singlepoint 68794 tmQM xtb Dataset T=100K low-mw high-coordinate geom-mult=3 v0.0\n",
" 469 singlepoint 102338 tmQM xtb Dataset T=100K low-mw high-coordinate geom-mult=1 v0.0\n",
" 470 torsiondrive 1371 OpenFF SMIRNOFF Sage 2.3.0\n",
Expand All @@ -250,8 +250,12 @@
" 474 optimization 6780 OpenFF NSP Optimization Set 1 Nitrogen v4.0\n",
" 475 optimization 7940 OpenFF NSP Optimization Set 1 Sulfur v4.0\n",
" 476 torsiondrive 27 OpenFF Lipid Torsion Drives v4.1\n",
" 477 optimization 80972 OpenFF Organometallic Complexes Architector Minimum Energy Structures v0.0\n",
" 478 optimization 2350 OpenFF SPICE2 Subset Optimization Dataset v4.0\n"
" 477 optimization 161944 OpenFF Organometallic Complexes Architector Minimum Energy Structures v0.0\n",
" 478 optimization 2350 OpenFF SPICE2 Subset Optimization Dataset v4.0\n",
" 479 torsiondrive 50 OpenFF PEG Ether Fragments TorsionDrives v4.0\n",
" 480 optimization 389480 OpenFF Architector Methyl-Capped Metal Complexes Optimization Dataset v0.0\n",
" 481 optimization 389480 OpenFF Architector Unconstrained Methyl-Capped Metal Complexes Optimization Dataset v0.0\n",
" 482 optimization 142198 tmQM Charge Multiplicity Variant Optimization Dataset v0.0\n"
]
}
],
Expand All @@ -277,11 +281,11 @@
"execution_count": 2,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:21.504712Z",
"iopub.status.busy": "2026-05-25T19:46:21.504518Z",
"iopub.status.idle": "2026-05-25T19:46:21.588739Z",
"shell.execute_reply": "2026-05-25T19:46:21.588122Z",
"shell.execute_reply.started": "2026-05-25T19:46:21.504701Z"
"iopub.execute_input": "2026-09-18T18:11:56.854869Z",
"iopub.status.busy": "2026-09-18T18:11:56.854594Z",
"iopub.status.idle": "2026-09-18T18:11:56.896999Z",
"shell.execute_reply": "2026-09-18T18:11:56.896318Z",
"shell.execute_reply.started": "2026-09-18T18:11:56.854858Z"
}
},
"outputs": [],
Expand All @@ -304,11 +308,11 @@
"execution_count": 3,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:21.589232Z",
"iopub.status.busy": "2026-05-25T19:46:21.589131Z",
"iopub.status.idle": "2026-05-25T19:46:21.913250Z",
"shell.execute_reply": "2026-05-25T19:46:21.912544Z",
"shell.execute_reply.started": "2026-05-25T19:46:21.589223Z"
"iopub.execute_input": "2026-09-18T18:11:56.897664Z",
"iopub.status.busy": "2026-09-18T18:11:56.897490Z",
"iopub.status.idle": "2026-09-18T18:11:57.098351Z",
"shell.execute_reply": "2026-09-18T18:11:57.097211Z",
"shell.execute_reply.started": "2026-09-18T18:11:56.897636Z"
}
},
"outputs": [],
Expand All @@ -328,11 +332,11 @@
"execution_count": 4,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:21.913688Z",
"iopub.status.busy": "2026-05-25T19:46:21.913583Z",
"iopub.status.idle": "2026-05-25T19:46:21.922641Z",
"shell.execute_reply": "2026-05-25T19:46:21.921956Z",
"shell.execute_reply.started": "2026-05-25T19:46:21.913678Z"
"iopub.execute_input": "2026-09-18T18:11:57.098938Z",
"iopub.status.busy": "2026-09-18T18:11:57.098830Z",
"iopub.status.idle": "2026-09-18T18:11:57.123227Z",
"shell.execute_reply": "2026-09-18T18:11:57.122574Z",
"shell.execute_reply.started": "2026-09-18T18:11:57.098927Z"
}
},
"outputs": [
Expand Down Expand Up @@ -417,7 +421,18 @@
" [ 3.28745938e+00, -6.00243631e+00, -9.86032950e+00]]),\n",
" 'name': 'C29ClFH26N4O4S',\n",
" 'identifiers': {'molecule_hash': '58aaa33a5e7d9445e4276a015de257c3d6bde558',\n",
" 'molecular_formula': 'C29ClFH26N4O4S'},\n",
" 'molecular_formula': 'C29ClFH26N4O4S',\n",
" 'smiles': None,\n",
" 'inchi': None,\n",
" 'inchikey': None,\n",
" 'canonical_explicit_hydrogen_smiles': None,\n",
" 'canonical_isomeric_explicit_hydrogen_mapped_smiles': None,\n",
" 'canonical_isomeric_explicit_hydrogen_smiles': None,\n",
" 'canonical_isomeric_smiles': None,\n",
" 'canonical_smiles': None,\n",
" 'pubchem_cid': None,\n",
" 'pubchem_sid': None,\n",
" 'pubchem_conformerid': None},\n",
" 'molecular_charge': 0.0,\n",
" 'molecular_multiplicity': 1,\n",
" 'masses': array([12. , 12. , 12. , 12. , 12. ,\n",
Expand Down Expand Up @@ -577,11 +592,11 @@
"execution_count": 5,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:21.923099Z",
"iopub.status.busy": "2026-05-25T19:46:21.922993Z",
"iopub.status.idle": "2026-05-25T19:46:22.098581Z",
"shell.execute_reply": "2026-05-25T19:46:22.097808Z",
"shell.execute_reply.started": "2026-05-25T19:46:21.923089Z"
"iopub.execute_input": "2026-09-18T18:11:57.123774Z",
"iopub.status.busy": "2026-09-18T18:11:57.123661Z",
"iopub.status.idle": "2026-09-18T18:11:57.266596Z",
"shell.execute_reply": "2026-09-18T18:11:57.266198Z",
"shell.execute_reply.started": "2026-09-18T18:11:57.123763Z"
}
},
"outputs": [],
Expand All @@ -602,11 +617,11 @@
"execution_count": 6,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:22.099156Z",
"iopub.status.busy": "2026-05-25T19:46:22.099023Z",
"iopub.status.idle": "2026-05-25T19:46:22.184984Z",
"shell.execute_reply": "2026-05-25T19:46:22.184376Z",
"shell.execute_reply.started": "2026-05-25T19:46:22.099144Z"
"iopub.execute_input": "2026-09-18T18:11:57.266937Z",
"iopub.status.busy": "2026-09-18T18:11:57.266872Z",
"iopub.status.idle": "2026-09-18T18:11:57.316732Z",
"shell.execute_reply": "2026-09-18T18:11:57.316385Z",
"shell.execute_reply.started": "2026-09-18T18:11:57.266930Z"
},
"scrolled": true
},
Expand All @@ -615,7 +630,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'qcelemental.models.v1.molecule.Molecule'>\n",
"<class 'qcelemental.models._v1v2.molecule.Molecule'>\n",
"6 6\n",
"6 6\n",
"6 6\n",
Expand Down Expand Up @@ -713,11 +728,11 @@
"execution_count": 7,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:22.185851Z",
"iopub.status.busy": "2026-05-25T19:46:22.185700Z",
"iopub.status.idle": "2026-05-25T19:46:22.200983Z",
"shell.execute_reply": "2026-05-25T19:46:22.200374Z",
"shell.execute_reply.started": "2026-05-25T19:46:22.185837Z"
"iopub.execute_input": "2026-09-18T18:11:57.317110Z",
"iopub.status.busy": "2026-09-18T18:11:57.317041Z",
"iopub.status.idle": "2026-09-18T18:11:57.337507Z",
"shell.execute_reply": "2026-09-18T18:11:57.336716Z",
"shell.execute_reply.started": "2026-09-18T18:11:57.317104Z"
}
},
"outputs": [
Expand Down Expand Up @@ -765,18 +780,18 @@
"execution_count": 8,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:22.201533Z",
"iopub.status.busy": "2026-05-25T19:46:22.201425Z",
"iopub.status.idle": "2026-05-25T19:46:22.226037Z",
"shell.execute_reply": "2026-05-25T19:46:22.224987Z",
"shell.execute_reply.started": "2026-05-25T19:46:22.201523Z"
"iopub.execute_input": "2026-09-18T18:11:57.338368Z",
"iopub.status.busy": "2026-09-18T18:11:57.338112Z",
"iopub.status.idle": "2026-09-18T18:11:57.361884Z",
"shell.execute_reply": "2026-09-18T18:11:57.361507Z",
"shell.execute_reply.started": "2026-09-18T18:11:57.338352Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e792d4ffed78496f8c91ab5f78effb6e",
"model_id": "893433354cf84b14bed5634e4528aa57",
"version_major": 2,
"version_minor": 0
},
Expand All @@ -798,18 +813,18 @@
"execution_count": 9,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:22.226744Z",
"iopub.status.busy": "2026-05-25T19:46:22.226631Z",
"iopub.status.idle": "2026-05-25T19:46:22.247736Z",
"shell.execute_reply": "2026-05-25T19:46:22.246655Z",
"shell.execute_reply.started": "2026-05-25T19:46:22.226734Z"
"iopub.execute_input": "2026-09-18T18:11:57.362299Z",
"iopub.status.busy": "2026-09-18T18:11:57.362235Z",
"iopub.status.idle": "2026-09-18T18:11:57.382705Z",
"shell.execute_reply": "2026-09-18T18:11:57.381992Z",
"shell.execute_reply.started": "2026-09-18T18:11:57.362293Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5d9fa5b8107c433e8d66f75114ea60a0",
"model_id": "17c03a78ef5d40efaaabe63f568bbe57",
"version_major": 2,
"version_minor": 0
},
Expand Down Expand Up @@ -844,11 +859,11 @@
"execution_count": 10,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:22.248423Z",
"iopub.status.busy": "2026-05-25T19:46:22.248192Z",
"iopub.status.idle": "2026-05-25T19:46:22.653973Z",
"shell.execute_reply": "2026-05-25T19:46:22.653067Z",
"shell.execute_reply.started": "2026-05-25T19:46:22.248409Z"
"iopub.execute_input": "2026-09-18T18:11:57.383224Z",
"iopub.status.busy": "2026-09-18T18:11:57.383165Z",
"iopub.status.idle": "2026-09-18T18:11:57.605683Z",
"shell.execute_reply": "2026-09-18T18:11:57.605119Z",
"shell.execute_reply.started": "2026-09-18T18:11:57.383219Z"
}
},
"outputs": [],
Expand All @@ -857,11 +872,14 @@
"\n",
"# set up the RDKit task\n",
"rdkit_task = {\n",
" \"schema_name\": \"qcschema_input\",\n",
" \"schema_name\": \"qcschema_atomic_input\",\n",
" \"schema_version\": 2,\n",
" \"molecule\": qc_molecule,\n",
" \"driver\": \"energy\",\n",
" \"model\": {\"method\": \"uff\", \"basis\": None},\n",
" \"keywords\": {\"scf_type\": \"df\"},\n",
" \"specification\": {\n",
" \"driver\": \"energy\",\n",
" \"model\": {\"method\": \"uff\", \"basis\": None},\n",
" \"keywords\": {\"scf_type\": \"df\"},\n",
" },\n",
"}\n",
"\n",
"# now lets compute the energy using qcengine and RDKit and print the result\n",
Expand All @@ -873,11 +891,11 @@
"execution_count": 11,
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-25T19:46:22.654680Z",
"iopub.status.busy": "2026-05-25T19:46:22.654534Z",
"iopub.status.idle": "2026-05-25T19:46:22.658193Z",
"shell.execute_reply": "2026-05-25T19:46:22.657207Z",
"shell.execute_reply.started": "2026-05-25T19:46:22.654666Z"
"iopub.execute_input": "2026-09-18T18:11:57.606313Z",
"iopub.status.busy": "2026-09-18T18:11:57.606225Z",
"iopub.status.idle": "2026-09-18T18:11:57.617644Z",
"shell.execute_reply": "2026-09-18T18:11:57.617253Z",
"shell.execute_reply.started": "2026-09-18T18:11:57.606306Z"
},
"tags": []
},
Expand Down Expand Up @@ -912,7 +930,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.13"
"version": "3.13.15"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
Expand Down
2 changes: 1 addition & 1 deletion openff/toolkit/_tests/test_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -819,7 +819,7 @@ def test_index(self):
parameters.index("[#2:1]")

p4 = ParameterType(smirks="[#2:1]")
with pytest.raises(ValueError, match="is not in list"):
with pytest.raises(ValueError, match=" not in list"):
parameters.index(p4)

with pytest.raises(TypeError, match="non-None values for start"):
Expand Down
4 changes: 2 additions & 2 deletions openff/toolkit/topology/molecule.py
Original file line number Diff line number Diff line change
Expand Up @@ -4451,7 +4451,7 @@ def to_qcschema(self, multiplicity=1, conformer=0, extras=None):

Returns
---------
qcelemental.models.Molecule
qcelemental.models.v2.Molecule
Comment thread
mattwthompson marked this conversation as resolved.
A validated QCElemental Molecule.

Examples
Expand Down Expand Up @@ -4504,7 +4504,7 @@ def to_qcschema(self, multiplicity=1, conformer=0, extras=None):
"identifiers": identifiers,
}

return qcel.models.Molecule.from_data(schema_dict, validate=True)
return qcel.models.v2.Molecule.from_data(schema_dict, validate=True)

@classmethod
def from_mapped_smiles(
Expand Down
Loading