Skip to content
Merged
4 changes: 2 additions & 2 deletions devtools/conda-envs/basic.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ dependencies:
- nglview

- qcengine >=0.25
- qcelemental >=0.25.1
- qcfractal >=0.65,<0.70.0a0
- qcelemental >=0.50.2
- qcfractal >=0.65
- qcarchivetesting
- qcportal

Expand Down
4 changes: 2 additions & 2 deletions devtools/conda-envs/psi4.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ dependencies:
- nglview

- qcengine >=0.25
- qcelemental >=0.25.1
- qcfractal >=0.65,<0.70.0a0
- qcelemental >=0.50.2
- qcfractal >=0.65
- qcarchivetesting
- qcportal

Expand Down
9 changes: 9 additions & 0 deletions docs/releasehistory.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ Releases are given with dates in YYYY-MM-DD format.

<!--## Version / Date YYYY-MM-DD -->

## 0.59.0 / 2026-09-24

### API/Behavior Changes

[PR #398:] Updates for QCPortal 0.70/QCElemental 0.50. After these changes, QCSubmit requires QCElemental >=0.51.2 but
may continue to work with older versions of QCPortal. [@bennybp] [@j-wags]

## 0.58.0 / 2026-08-13

### API/Behavior Changes
Expand Down Expand Up @@ -244,6 +251,7 @@ For more information on this release, see https://github.com/openforcefield/open
[PR #382:]: https://github.com/openforcefield/openff-qcsubmit/pull/382
[PR #387:]: https://github.com/openforcefield/openff-qcsubmit/pull/387
[PR #394:]: https://github.com/openforcefield/openff-qcsubmit/pull/394
[PR #398:]: https://github.com/openforcefield/openff-qcsubmit/pull/398

[@jthorton]: https://github.com/jthorton
[@dotsdl]: https://github.com/dotsdl
Expand All @@ -253,3 +261,4 @@ For more information on this release, see https://github.com/openforcefield/open
[@j-wags]: https://github.com/j-wags
[@pavankum]: https://github.com/pavankum
[@ntBre]: https://github.com/ntBre
[@bennybp]: https://github.com/bennybp
11 changes: 10 additions & 1 deletion openff/qcsubmit/_tests/results/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ def mock_basic_result_collection(molecules, monkeypatch) -> BasicResultCollectio
is_service=False,
created_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
properties=None,
manager_name=None,
creator_user=None,
# compute_history=list(),
status=RecordStatusEnum.complete,
client=_PortalClient(address=address),
Expand Down Expand Up @@ -129,6 +132,9 @@ def mock_optimization_result_collection(
is_service=False,
created_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
properties=None,
manager_name=None,
creator_user=None,
# compute_history=list(),
# ),
client=_PortalClient(address=address),
Expand Down Expand Up @@ -170,7 +176,7 @@ def mock_torsion_drive_result_collection(
id=entry.record_id,
specification=TorsiondriveSpecification(
program="torsiondrive",
keywords=TDKeywords(dihedrals=[], grid_spacing=[]),
keywords=TDKeywords(dihedrals=[], grid_spacing=[]).dict(),
optimization_specification=OptimizationSpecification(
program="geometric",
keywords={},
Expand All @@ -194,6 +200,9 @@ def mock_torsion_drive_result_collection(
is_service=True,
created_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
properties=None,
manager_name=None,
creator_user=None,
),
molecules[address][int(entry.record_id) - 1],
)
Expand Down
6 changes: 6 additions & 0 deletions openff/qcsubmit/_tests/results/test_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,9 @@ def test_connectivity_filter():
status=RecordStatusEnum.complete,
is_service=False,
# client=_PortalClient(address=address)
properties=None,
manager_name=None,
creator_user=None,
)

connectivity_filter = ConnectivityFilter()
Expand Down Expand Up @@ -255,6 +258,9 @@ def test_record_status_filter():
molecule_id=1,
status=RecordStatusEnum.complete,
is_service=False,
properties=None,
manager_name=None,
creator_user=None,
)

status_filter = RecordStatusFilter(status=RecordStatusEnum.complete)
Expand Down
11 changes: 11 additions & 0 deletions openff/qcsubmit/_tests/results/test_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,9 @@ def test_base_validate_record_types():
created_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
id=1,
properties=None,
manager_name=None,
creator_user=None,
),
OptimizationRecord(
# OptimizationRecord(
Expand All @@ -177,11 +180,16 @@ def test_base_validate_record_types():
),
),
initial_molecule_id=1,
final_molecule_id=1,
energies=[],
status=RecordStatusEnum.complete,
is_service=False,
created_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
id=1,
properties=None,
manager_name=None,
creator_user=None,
),
]

Expand Down Expand Up @@ -494,6 +502,9 @@ def test_torsion_smirnoff_coverage(public_client, monkeypatch):
created_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0),
# compute_history=list(),
properties=None,
manager_name=None,
creator_user=None,
# )
),
molecule,
Expand Down
4 changes: 2 additions & 2 deletions openff/qcsubmit/common_structures.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import numpy as np
from openff.toolkit.topology import Molecule
from qcelemental import constants
from qcelemental.models.common_models import Model
from qcelemental.models.results import WavefunctionProtocolEnum
from qcelemental.models.v1.common_models import Model
from qcelemental.models.v1.results import WavefunctionProtocolEnum
from qcportal.singlepoint import SinglepointDriver

from openff.qcsubmit._pydantic import (
Expand Down
28 changes: 15 additions & 13 deletions openff/qcsubmit/datasets/datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -847,15 +847,17 @@ def _get_entries(self) -> List[SinglepointDatasetNewEntry]:
name = index + f"-{tag + j}"
entries.append(
SinglepointDatasetNewEntry(
name=name, molecule=molecule, attributes=entry.attributes
name=name,
molecule=molecule.dict(),
attributes=entry.attributes.dict(),
)
)
else:
entries.append(
SinglepointDatasetNewEntry(
name=entry_name,
molecule=entry.initial_molecules[0],
attributes=entry.attributes,
molecule=entry.initial_molecules[0].dict(),
attributes=entry.attributes.dict(),
)
)

Expand Down Expand Up @@ -1032,7 +1034,7 @@ def _get_specifications(self) -> Dict[str, OptimizationSpecification]:
program=self.optimization_procedure.program,
qc_specification=qc_spec,
keywords=opt_kw,
protocols=self.protocols,
protocols=self.protocols.dict(),
)

return ret
Expand All @@ -1042,7 +1044,7 @@ def _get_entries(self) -> List[OptimizationDatasetNewEntry]:

for entry_name, entry in self.dataset.items():
# TODO this probably needs even more keywords
opt_kw = dict(constraints=entry.constraints)
opt_kw = dict(constraints=entry.constraints.dict())
opt_kw.update(entry.keywords)
if len(entry.initial_molecules) > 1:
# check if the index has a number tag
Expand All @@ -1054,18 +1056,18 @@ def _get_entries(self) -> List[OptimizationDatasetNewEntry]:
entries.append(
OptimizationDatasetNewEntry(
name=name,
initial_molecule=molecule,
initial_molecule=molecule.dict(),
additional_keywords=opt_kw,
attributes=entry.attributes,
attributes=entry.attributes.dict(),
)
)
else:
entries.append(
OptimizationDatasetNewEntry(
name=entry_name,
initial_molecule=entry.initial_molecules[0],
initial_molecule=entry.initial_molecules[0].dict(),
additional_keywords=opt_kw,
attributes=entry.attributes,
attributes=entry.attributes.dict(),
)
)

Expand Down Expand Up @@ -1251,7 +1253,7 @@ def _get_specifications(self) -> Dict[str, TorsiondriveSpecification]:
spec = OptimizationSpecification(
program=self.optimization_procedure.program,
qc_specification=qc_spec,
protocols=self.protocols,
protocols=self.protocols.dict(),
)
ret[spec_name] = TorsiondriveSpecification(
optimization_specification=spec,
Expand All @@ -1274,15 +1276,15 @@ def _get_entries(self) -> List[TorsiondriveDatasetNewEntry]:

td_keywords.update(entry.keywords.dict(exclude_defaults=True))

opt_keywords = dict(constraints=entry.constraints)
opt_keywords = dict(constraints=entry.constraints.dict())

entries.append(
TorsiondriveDatasetNewEntry(
name=entry_name,
initial_molecules=entry.initial_molecules,
initial_molecules=[m.dict() for m in entry.initial_molecules],
additional_keywords=td_keywords,
additional_optimization_keywords=opt_keywords,
attributes=entry.attributes,
attributes=entry.attributes.dict(),
)
)

Expand Down
4 changes: 3 additions & 1 deletion openff/qcsubmit/results/results.py
Original file line number Diff line number Diff line change
Expand Up @@ -766,7 +766,9 @@ def create_basic_dataset(
isomeric=True, explicit_hydrogens=False, mapped=False
),
molecule=None,
initial_molecules=[rec.final_molecule for rec, _ in records],
initial_molecules=[
rec.final_molecule.convert_v(1) for rec, _ in records
],
attributes=MoleculeAttributes.from_openff_molecule(base_molecule),
extras=base_record.extras,
keywords=base_record.specification.keywords,
Expand Down
Loading