From f64d35b3afbb45339641a3a90903b90b559589ed Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Fri, 4 Oct 2024 12:33:33 -0400 Subject: [PATCH 01/14] use `get` to avoid KeyError on missing cmiles attribute --- openff/qcsubmit/results/results.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index 94a17260..c696b937 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -321,9 +321,9 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - cmiles = entry.attributes[ + cmiles = entry.attributes.get( "canonical_isomeric_explicit_hydrogen_mapped_smiles" - ] + ) if not cmiles: print(f"MISSING CMILES! entry = {entry_name}") continue @@ -470,9 +470,9 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - cmiles = entry.attributes[ + cmiles = entry.attributes.get( "canonical_isomeric_explicit_hydrogen_mapped_smiles" - ] + ) if not cmiles: print(f"MISSING CMILES! entry = {entry_name}") continue From 2ab5d7e4b132e987fbea37b5b9ae199f956ef8bc Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Mon, 7 Oct 2024 14:59:46 -0400 Subject: [PATCH 02/14] add failing test for #299 --- openff/qcsubmit/_tests/results/test_results.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/openff/qcsubmit/_tests/results/test_results.py b/openff/qcsubmit/_tests/results/test_results.py index 6c437737..1a30c25b 100644 --- a/openff/qcsubmit/_tests/results/test_results.py +++ b/openff/qcsubmit/_tests/results/test_results.py @@ -464,3 +464,17 @@ def test_torsion_smirnoff_coverage(public_client, monkeypatch): assert {*coverage["Bonds"].values()} == {3} assert {*coverage["Angles"].values()} == {3} assert {*coverage["ProperTorsions"].values()} == {1, 3} + + +def test_missing_cmiles_basic_result_collection(public_client): + """Some older datasets don't have CMILES in the single-point records. As + reported in #299, this would cause a KeyError when retrieving these + datasets. Such entries should now be skipped, but this can lead to empty + datasets, so we also print a warning for each missing CMILES. + """ + basic_collection = BasicResultCollection.from_server( + public_client, + ["OpenFF Gen 2 Opt Set 1 Roche"], + spec_name="spec_1", + ) + assert basic_collection.n_results == 0 From bbb9a067b3e087b09410f96d2be1b30bb1585873 Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Mon, 7 Oct 2024 15:07:57 -0400 Subject: [PATCH 03/14] warn with MissingCMILESWarning instead of printing --- openff/qcsubmit/results/results.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index c696b937..ea912eb7 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -50,6 +50,11 @@ S = TypeVar("S") +class MissingCMILESWarning(Warning): + "Warning used to signal a missing CMILES in BaseResultCollection.from_datasets" + pass + + class _BaseResult(BaseModel, abc.ABC): """The base model for storing information about a QC record generated by QCFractal.""" @@ -325,7 +330,7 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - print(f"MISSING CMILES! entry = {entry_name}") + warnings.warn(f"MISSING CMILES! entry = {entry_name}", MissingCMILESWarning) continue inchi_key = entry.attributes.get("fixed_hydrogen_inchi_key") @@ -474,7 +479,7 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - print(f"MISSING CMILES! entry = {entry_name}") + warnings.warn(f"MISSING CMILES! entry = {entry_name}", MissingCMILESWarning) continue inchi_key = entry.attributes.get("fixed_hydrogen_inchi_key") From abd6d7c803e257db6d4a96927c9cf90db53d432d Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Mon, 7 Oct 2024 15:09:49 -0400 Subject: [PATCH 04/14] check that a warning is emitted --- openff/qcsubmit/_tests/results/test_results.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/openff/qcsubmit/_tests/results/test_results.py b/openff/qcsubmit/_tests/results/test_results.py index 1a30c25b..6b162de9 100644 --- a/openff/qcsubmit/_tests/results/test_results.py +++ b/openff/qcsubmit/_tests/results/test_results.py @@ -26,7 +26,7 @@ TorsionDriveResultCollection, ) from openff.qcsubmit.results.filters import ResultFilter -from openff.qcsubmit.results.results import TorsionDriveResult, _BaseResultCollection +from openff.qcsubmit.results.results import MissingCMILESWarning, TorsionDriveResult, _BaseResultCollection from openff.qcsubmit.utils import _CachedPortalClient, portal_client_manager from . import ( @@ -472,9 +472,10 @@ def test_missing_cmiles_basic_result_collection(public_client): datasets. Such entries should now be skipped, but this can lead to empty datasets, so we also print a warning for each missing CMILES. """ - basic_collection = BasicResultCollection.from_server( - public_client, - ["OpenFF Gen 2 Opt Set 1 Roche"], - spec_name="spec_1", - ) + with pytest.warns(MissingCMILESWarning): + basic_collection = BasicResultCollection.from_server( + public_client, + ["OpenFF Gen 2 Opt Set 1 Roche"], + spec_name="spec_1", + ) assert basic_collection.n_results == 0 From 0934011a94663df7474df599198519089f6b98bc Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Mon, 7 Oct 2024 15:16:35 -0400 Subject: [PATCH 05/14] run pre-commit hooks --- openff/qcsubmit/_tests/results/test_results.py | 6 +++++- openff/qcsubmit/results/results.py | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/openff/qcsubmit/_tests/results/test_results.py b/openff/qcsubmit/_tests/results/test_results.py index 6b162de9..1c948bb5 100644 --- a/openff/qcsubmit/_tests/results/test_results.py +++ b/openff/qcsubmit/_tests/results/test_results.py @@ -26,7 +26,11 @@ TorsionDriveResultCollection, ) from openff.qcsubmit.results.filters import ResultFilter -from openff.qcsubmit.results.results import MissingCMILESWarning, TorsionDriveResult, _BaseResultCollection +from openff.qcsubmit.results.results import ( + MissingCMILESWarning, + TorsionDriveResult, + _BaseResultCollection, +) from openff.qcsubmit.utils import _CachedPortalClient, portal_client_manager from . import ( diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index ea912eb7..60099504 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -330,7 +330,9 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - warnings.warn(f"MISSING CMILES! entry = {entry_name}", MissingCMILESWarning) + warnings.warn( + f"MISSING CMILES! entry = {entry_name}", MissingCMILESWarning + ) continue inchi_key = entry.attributes.get("fixed_hydrogen_inchi_key") @@ -479,7 +481,9 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - warnings.warn(f"MISSING CMILES! entry = {entry_name}", MissingCMILESWarning) + warnings.warn( + f"MISSING CMILES! entry = {entry_name}", MissingCMILESWarning + ) continue inchi_key = entry.attributes.get("fixed_hydrogen_inchi_key") From 1dbd9a0219b76edf08d650238df1fd187e848f83 Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Wed, 9 Oct 2024 15:48:45 -0400 Subject: [PATCH 06/14] switch to logging from warnings based on these docs (https://docs.python.org/3/howto/logging.html#when-to-use-logging) warnings should be used "if the issue is avoidable and the client application should be modified to eliminate the warning," (like a deprecation warning) while logging a warning should be used "if there is nothing the client application can do about the situation, but the event should still be noted." I think this warning is closer to the latter case, where there's not much a user can do about this, and this allows us to filter these warnings by default, which I don't think is possible with the warnings module --- openff/qcsubmit/_tests/results/test_results.py | 15 +++++++-------- openff/qcsubmit/results/results.py | 14 ++++---------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/openff/qcsubmit/_tests/results/test_results.py b/openff/qcsubmit/_tests/results/test_results.py index 1c948bb5..2d4b3bbd 100644 --- a/openff/qcsubmit/_tests/results/test_results.py +++ b/openff/qcsubmit/_tests/results/test_results.py @@ -27,7 +27,6 @@ ) from openff.qcsubmit.results.filters import ResultFilter from openff.qcsubmit.results.results import ( - MissingCMILESWarning, TorsionDriveResult, _BaseResultCollection, ) @@ -470,16 +469,16 @@ def test_torsion_smirnoff_coverage(public_client, monkeypatch): assert {*coverage["ProperTorsions"].values()} == {1, 3} -def test_missing_cmiles_basic_result_collection(public_client): +def test_missing_cmiles_basic_result_collection(public_client, caplog): """Some older datasets don't have CMILES in the single-point records. As reported in #299, this would cause a KeyError when retrieving these datasets. Such entries should now be skipped, but this can lead to empty datasets, so we also print a warning for each missing CMILES. """ - with pytest.warns(MissingCMILESWarning): - basic_collection = BasicResultCollection.from_server( - public_client, - ["OpenFF Gen 2 Opt Set 1 Roche"], - spec_name="spec_1", - ) + basic_collection = BasicResultCollection.from_server( + public_client, + ["OpenFF Gen 2 Opt Set 1 Roche"], + spec_name="spec_1", + ) + assert "MISSING CMILES" in caplog.text assert basic_collection.n_results == 0 diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index 60099504..6f11a43b 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -7,6 +7,7 @@ import abc import warnings +import logging from collections import defaultdict from typing import ( TYPE_CHECKING, @@ -49,10 +50,7 @@ T = TypeVar("T") S = TypeVar("S") - -class MissingCMILESWarning(Warning): - "Warning used to signal a missing CMILES in BaseResultCollection.from_datasets" - pass +logger = logging.getLogger(__name__) class _BaseResult(BaseModel, abc.ABC): @@ -330,9 +328,7 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - warnings.warn( - f"MISSING CMILES! entry = {entry_name}", MissingCMILESWarning - ) + logger.warning(f"MISSING CMILES! entry = {entry_name}") continue inchi_key = entry.attributes.get("fixed_hydrogen_inchi_key") @@ -481,9 +477,7 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - warnings.warn( - f"MISSING CMILES! entry = {entry_name}", MissingCMILESWarning - ) + logger.warning(f"MISSING CMILES! entry = {entry_name}") continue inchi_key = entry.attributes.get("fixed_hydrogen_inchi_key") From e70ec874c602f7994fc46f457251a5738c608ebd Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Wed, 9 Oct 2024 15:57:17 -0400 Subject: [PATCH 07/14] move individual warnings to info level to hide by default --- openff/qcsubmit/_tests/results/test_results.py | 16 +++++++++------- openff/qcsubmit/results/results.py | 4 ++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/openff/qcsubmit/_tests/results/test_results.py b/openff/qcsubmit/_tests/results/test_results.py index 2d4b3bbd..d7fb44f9 100644 --- a/openff/qcsubmit/_tests/results/test_results.py +++ b/openff/qcsubmit/_tests/results/test_results.py @@ -3,6 +3,7 @@ """ import datetime +import logging from tempfile import TemporaryDirectory import pytest @@ -475,10 +476,11 @@ def test_missing_cmiles_basic_result_collection(public_client, caplog): datasets. Such entries should now be skipped, but this can lead to empty datasets, so we also print a warning for each missing CMILES. """ - basic_collection = BasicResultCollection.from_server( - public_client, - ["OpenFF Gen 2 Opt Set 1 Roche"], - spec_name="spec_1", - ) - assert "MISSING CMILES" in caplog.text - assert basic_collection.n_results == 0 + with caplog.at_level(logging.INFO): + basic_collection = BasicResultCollection.from_server( + public_client, + ["OpenFF Gen 2 Opt Set 1 Roche"], + spec_name="spec_1", + ) + assert "MISSING CMILES" in caplog.text + assert basic_collection.n_results == 0 diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index 6f11a43b..797b8a46 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -328,7 +328,7 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - logger.warning(f"MISSING CMILES! entry = {entry_name}") + logger.info(f"MISSING CMILES! entry = {entry_name}") continue inchi_key = entry.attributes.get("fixed_hydrogen_inchi_key") @@ -477,7 +477,7 @@ def from_datasets( "canonical_isomeric_explicit_hydrogen_mapped_smiles" ) if not cmiles: - logger.warning(f"MISSING CMILES! entry = {entry_name}") + logger.info(f"MISSING CMILES! entry = {entry_name}") continue inchi_key = entry.attributes.get("fixed_hydrogen_inchi_key") From 4b06d4cf30a3875795d32c2ef55802cd330b9726 Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Wed, 9 Oct 2024 16:05:52 -0400 Subject: [PATCH 08/14] call basicConfig first to fully initialize logger --- openff/qcsubmit/results/results.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index 797b8a46..e2918925 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -50,6 +50,7 @@ T = TypeVar("T") S = TypeVar("S") +logging.basicConfig() logger = logging.getLogger(__name__) From 4677298f7f168322e4942fb113d8a775e37c38d3 Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Wed, 9 Oct 2024 16:52:20 -0400 Subject: [PATCH 09/14] track total number of missing CMILES and warn at the end --- openff/qcsubmit/_tests/results/test_results.py | 14 ++++++++++++++ openff/qcsubmit/results/results.py | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/openff/qcsubmit/_tests/results/test_results.py b/openff/qcsubmit/_tests/results/test_results.py index d7fb44f9..4ccb3811 100644 --- a/openff/qcsubmit/_tests/results/test_results.py +++ b/openff/qcsubmit/_tests/results/test_results.py @@ -4,6 +4,7 @@ import datetime import logging +from collections import defaultdict from tempfile import TemporaryDirectory import pytest @@ -482,5 +483,18 @@ def test_missing_cmiles_basic_result_collection(public_client, caplog): ["OpenFF Gen 2 Opt Set 1 Roche"], spec_name="spec_1", ) + + logs = defaultdict(int) + for record in caplog.records: + logs[record.levelname] += 1 + + # should be 298 of these at the INFO level + assert logs["INFO"] == 298 assert "MISSING CMILES" in caplog.text + + # should be 1 of these at the end at the default WARNING level + assert logs["WARNING"] == 1 + assert "Missing 298/298" in caplog.text + + # no results because they are all missing CMILES assert basic_collection.n_results == 0 diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index e2918925..55179524 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -299,6 +299,8 @@ def from_datasets( result_records = defaultdict(dict) + missing_cmiles = 0 + total_entries = 0 for dataset in datasets: client = dataset._client @@ -314,6 +316,7 @@ def from_datasets( for entry_name, spec_name, record in dataset.iterate_records( specification_names=spec_name, status=RecordStatusEnum.complete ): + total_entries += 1 entry = dataset.get_entry(entry_name) molecule = entry.molecule @@ -330,6 +333,7 @@ def from_datasets( ) if not cmiles: logger.info(f"MISSING CMILES! entry = {entry_name}") + missing_cmiles += 1 continue inchi_key = entry.attributes.get("fixed_hydrogen_inchi_key") @@ -348,6 +352,9 @@ def from_datasets( ) result_records[client.address][record.id] = br + if missing_cmiles > 0: + logger.warning(f"Missing {missing_cmiles}/{total_entries} CMILES") + return cls( entries={ address: [*records.values()] From eedf0d6008e853bd3563434410a4a20e2e37741d Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Wed, 9 Oct 2024 16:58:43 -0400 Subject: [PATCH 10/14] extend the warning message to mention loading from an opt dataset --- openff/qcsubmit/results/results.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index 55179524..10ee23cb 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -353,7 +353,14 @@ def from_datasets( result_records[client.address][record.id] = br if missing_cmiles > 0: - logger.warning(f"Missing {missing_cmiles}/{total_entries} CMILES") + logger.warning( + f"Missing {missing_cmiles}/{total_entries} CMILES. " + "Some legacy datasets may only have CMILES in their " + "optimization datasets (often with the same name as the " + "singlepoint dataset). " + "See OptimizationResultCollection.to_basic_result_collection " + "for a way to convert to a BasicResultCollection." + ) return cls( entries={ From 666c34392eded76a74f05e724945d5d082d8daa0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 20:59:13 +0000 Subject: [PATCH 11/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- openff/qcsubmit/_tests/results/test_results.py | 5 +---- openff/qcsubmit/results/results.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/openff/qcsubmit/_tests/results/test_results.py b/openff/qcsubmit/_tests/results/test_results.py index 4ccb3811..7fc1508e 100644 --- a/openff/qcsubmit/_tests/results/test_results.py +++ b/openff/qcsubmit/_tests/results/test_results.py @@ -28,10 +28,7 @@ TorsionDriveResultCollection, ) from openff.qcsubmit.results.filters import ResultFilter -from openff.qcsubmit.results.results import ( - TorsionDriveResult, - _BaseResultCollection, -) +from openff.qcsubmit.results.results import TorsionDriveResult, _BaseResultCollection from openff.qcsubmit.utils import _CachedPortalClient, portal_client_manager from . import ( diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index 10ee23cb..5ae8acff 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -6,8 +6,8 @@ from __future__ import annotations import abc -import warnings import logging +import warnings from collections import defaultdict from typing import ( TYPE_CHECKING, From f93d7fed5729f1e9d170690b40ff0505134c3772 Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Tue, 15 Oct 2024 11:15:07 -0400 Subject: [PATCH 12/14] update release notes --- docs/releasehistory.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/releasehistory.md b/docs/releasehistory.md index b5593c8a..4ab4a207 100644 --- a/docs/releasehistory.md +++ b/docs/releasehistory.md @@ -11,6 +11,12 @@ Releases are given with dates in DD-MM-YYYY format. +## Current development + +### Bugfixes +* [PR #300:]: Fixes [an issue](https://github.com/openforcefield/openff-qcsubmit/issues/299) where methods to retrieve `BasicResultCollection` and `OptimizationResultCollection` objects from QCArchive would crash if an entry was missing a CMILES. + + ## 0.53.0 / 12-8-2024 ### Bugfixes @@ -153,6 +159,7 @@ For more information on this release, see https://github.com/openforcefield/open [PR #288:]: https://github.com/openforcefield/openff-qcsubmit/pull/288 [PR #289:]: https://github.com/openforcefield/openff-qcsubmit/pull/289 [PR #290:]: https://github.com/openforcefield/openff-qcsubmit/pull/290 +[PR #300:]: https://github.com/openforcefield/openff-qcsubmit/pull/300 [@jthorton]: https://github.com/jthorton [@dotsdl]: https://github.com/dotsdl From a4a7b032d1046a05ab3710aba9e5386d42d50b44 Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Tue, 15 Oct 2024 11:17:13 -0400 Subject: [PATCH 13/14] fix extra colon --- docs/releasehistory.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasehistory.md b/docs/releasehistory.md index 4ab4a207..fef497df 100644 --- a/docs/releasehistory.md +++ b/docs/releasehistory.md @@ -14,7 +14,7 @@ Releases are given with dates in DD-MM-YYYY format. ## Current development ### Bugfixes -* [PR #300:]: Fixes [an issue](https://github.com/openforcefield/openff-qcsubmit/issues/299) where methods to retrieve `BasicResultCollection` and `OptimizationResultCollection` objects from QCArchive would crash if an entry was missing a CMILES. +* [PR #300:] Fixes [an issue](https://github.com/openforcefield/openff-qcsubmit/issues/299) where methods to retrieve `BasicResultCollection` and `OptimizationResultCollection` objects from QCArchive would crash if an entry was missing a CMILES. ## 0.53.0 / 12-8-2024 From 89b05646dcc360072ab3922a6dc0027ade91e7c1 Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Mon, 21 Oct 2024 16:18:50 -0400 Subject: [PATCH 14/14] fix minor typos --- docs/releasehistory.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/releasehistory.md b/docs/releasehistory.md index fef497df..bd78894f 100644 --- a/docs/releasehistory.md +++ b/docs/releasehistory.md @@ -20,13 +20,13 @@ Releases are given with dates in DD-MM-YYYY format. ## 0.53.0 / 12-8-2024 ### Bugfixes -* [PR #294:]: Fixes [a bug](https://github.com/openforcefield/openff-qcsubmit/issues/223) in ConformerRMSDFilter where automorphs are sometimes incorrectly handled, leading to incorrect atom mappings used in RMSD calculations. +* [PR #294:] Fixes [a bug](https://github.com/openforcefield/openff-qcsubmit/issues/223) in ConformerRMSDFilter where automorphs are sometimes incorrectly handled, leading to incorrect atom mappings used in RMSD calculations. ## 0.52.0 / 22-07-2024 ### API breaking changes -* [PR #288:]: Adds a new named argument, `properties=False` to `QCSpec.qc_keywords`, changing it from a property to a method. +* [PR #288:] Adds a new named argument, `properties=False` to `QCSpec.qc_keywords`, changing it from a property to a method. ### Examples updated @@ -159,6 +159,7 @@ For more information on this release, see https://github.com/openforcefield/open [PR #288:]: https://github.com/openforcefield/openff-qcsubmit/pull/288 [PR #289:]: https://github.com/openforcefield/openff-qcsubmit/pull/289 [PR #290:]: https://github.com/openforcefield/openff-qcsubmit/pull/290 +[PR #294:]: https://github.com/openforcefield/openff-qcsubmit/pull/294 [PR #300:]: https://github.com/openforcefield/openff-qcsubmit/pull/300 [@jthorton]: https://github.com/jthorton