From cb584620be5b1286c6e04f397766644c0a11c8da Mon Sep 17 00:00:00 2001 From: ElliottKasoar <45317199+ElliottKasoar@users.noreply.github.com> Date: Wed, 10 Dec 2025 10:56:45 +0000 Subject: [PATCH 1/5] Create new directory for results --- janus_core/helpers/utils.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/janus_core/helpers/utils.py b/janus_core/helpers/utils.py index 41456b64..b04fd86c 100644 --- a/janus_core/helpers/utils.py +++ b/janus_core/helpers/utils.py @@ -110,8 +110,20 @@ def _get_default_prefix( struct_name = struct.get_chemical_formula() # Set default output directory - prefix = Path("./janus_results") / struct_name - + results_dir = Path("./janus_results") + results_dirs = sorted(Path(".").glob("janus_results*")) + + if results_dirs: + try: + results_dir = Path( + "janus_results_" + + str(int(results_dirs[-1].name.split("_")[-1]) + 1) + ) + except ValueError: + if results_dir.exists(): + results_dir = Path("./janus_results_1") + + prefix = results_dir / struct_name return "-".join((str(prefix), *filter(None, additional))) def _build_filename( From 85d6524473ec189e9d2ccab413a49165b52246ab Mon Sep 17 00:00:00 2001 From: ElliottKasoar <45317199+ElliottKasoar@users.noreply.github.com> Date: Wed, 10 Dec 2025 11:19:54 +0000 Subject: [PATCH 2/5] Test creating new results directories --- tests/test_filenamemixin.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/test_filenamemixin.py b/tests/test_filenamemixin.py index c3a01955..4b1761b2 100644 --- a/tests/test_filenamemixin.py +++ b/tests/test_filenamemixin.py @@ -8,6 +8,7 @@ import pytest from janus_core.helpers.utils import FileNameMixin +from tests.utils import chdir DATA_PATH = Path(__file__).parent / "data" STRUCT = read(DATA_PATH / "benzene.xyz") @@ -125,3 +126,29 @@ def test_file_name_mixin_build(mixin_params, file_args, file_kwargs, file_name): assert ( file_mix.build_filename(*file_args, **file_kwargs) == Path(file_name).absolute() ) + + +@pytest.mark.parametrize( + "existing_dirs, expected_new_dir", + ( + # Defaults to structure atoms from ASE + ((), "janus_results"), + (("janus_results",), "janus_results_1"), + (("janus_results_1",), "janus_results_2"), + (("janus_results", "janus_results_1"), "janus_results_2"), + (("janus_results_1", "janus_results_2"), "janus_results_3"), + (("janus_results", "janus_results_2"), "janus_results_3"), + (("janus_results", "janus_results_1", "janus_results_2"), "janus_results_3"), + ), +) +def test_new_results_dir(tmp_path, existing_dirs, expected_new_dir): + """Test the creation of new results directories.""" + with chdir(tmp_path): + for dir in existing_dirs: + Path(dir).mkdir(parents=True, exist_ok=True) + + file_mix = DummyFileHandler(STRUCT, None, None) + assert ( + file_mix.file_prefix.as_posix() + == (Path(expected_new_dir) / "C6H6").as_posix() + ) From 64def0e06e0491a646ece1c5040c0ae597dc4855 Mon Sep 17 00:00:00 2001 From: ElliottKasoar <45317199+ElliottKasoar@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:01:38 +0000 Subject: [PATCH 3/5] Check previous results directories for MD restart --- janus_core/calculations/md.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/janus_core/calculations/md.py b/janus_core/calculations/md.py index d3ea513f..006bce4c 100644 --- a/janus_core/calculations/md.py +++ b/janus_core/calculations/md.py @@ -808,7 +808,18 @@ def _prepare_restart(self) -> None: restart_stem = self._restart_stem # Use restart_stem.name otherwise T300.0 etc. counts as extension - poss_restarts = restart_stem.parent.glob(f"{restart_stem.name}*.extxyz") + poss_restarts = list( + restart_stem.parent.glob(f"{restart_stem.name}*.extxyz") + ) + + # If no restarts found, check potential last results directory + if not poss_restarts: + results_dirs = sorted(restart_stem.parent.parent.glob("janus_results*")) + if results_dirs: + poss_restarts = results_dirs[-1].glob( + f"{restart_stem.name}*.extxyz" + ) + try: last_restart = max(poss_restarts, key=getmtime) From 5111d8f5393538aafef6446bd7cdc084a870706a Mon Sep 17 00:00:00 2001 From: ElliottKasoar <45317199+ElliottKasoar@users.noreply.github.com> Date: Thu, 11 Dec 2025 13:50:02 +0000 Subject: [PATCH 4/5] Use regex for output dir rotation --- janus_core/helpers/utils.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/janus_core/helpers/utils.py b/janus_core/helpers/utils.py index b04fd86c..432d714c 100644 --- a/janus_core/helpers/utils.py +++ b/janus_core/helpers/utils.py @@ -7,6 +7,7 @@ from io import StringIO from logging import Logger from pathlib import Path +import re from typing import Any, Literal, TextIO from ase import Atoms @@ -111,17 +112,20 @@ def _get_default_prefix( # Set default output directory results_dir = Path("./janus_results") - results_dirs = sorted(Path(".").glob("janus_results*")) + results_dirs = Path(".").glob("janus_results_*") if results_dirs: - try: - results_dir = Path( - "janus_results_" - + str(int(results_dirs[-1].name.split("_")[-1]) + 1) - ) - except ValueError: - if results_dir.exists(): - results_dir = Path("./janus_results_1") + idx = ( + int(match.group(0)) + for dir in results_dirs + if (match := re.search("([0-9]+)$", str(dir))) + ) + new_idx = max(idx, default=-1) + 1 + + if new_idx: + results_dir = Path(f"./janus_results_{new_idx}") + elif results_dir.exists(): + results_dir = Path("./janus_results_1") prefix = results_dir / struct_name return "-".join((str(prefix), *filter(None, additional))) From 0a3e0cc4aca43c4bcf983d81badab7fdd26ed883 Mon Sep 17 00:00:00 2001 From: ElliottKasoar <45317199+ElliottKasoar@users.noreply.github.com> Date: Thu, 11 Dec 2025 13:50:11 +0000 Subject: [PATCH 5/5] Increase tests for output dir rotation --- tests/test_filenamemixin.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/test_filenamemixin.py b/tests/test_filenamemixin.py index 4b1761b2..02ccbabd 100644 --- a/tests/test_filenamemixin.py +++ b/tests/test_filenamemixin.py @@ -131,14 +131,20 @@ def test_file_name_mixin_build(mixin_params, file_args, file_kwargs, file_name): @pytest.mark.parametrize( "existing_dirs, expected_new_dir", ( - # Defaults to structure atoms from ASE ((), "janus_results"), (("janus_results",), "janus_results_1"), - (("janus_results_1",), "janus_results_2"), (("janus_results", "janus_results_1"), "janus_results_2"), + (("janus_results", "janus_results_1", "janus_results_2"), "janus_results_3"), + # Check non-sequential output directories + (("janus_results_1",), "janus_results_2"), + (("janus_results_2",), "janus_results_3"), (("janus_results_1", "janus_results_2"), "janus_results_3"), (("janus_results", "janus_results_2"), "janus_results_3"), - (("janus_results", "janus_results_1", "janus_results_2"), "janus_results_3"), + # Check non-default output directories + (("janus_results1"), "janus_results"), + (("janus_results", "janus_results1"), "janus_results_1"), + (("janus_result"), "janus_results"), + (("janus_results_abc"), "janus_results"), ), ) def test_new_results_dir(tmp_path, existing_dirs, expected_new_dir):