diff --git a/a3fe/__init__.py b/a3fe/__init__.py index 461336f..ad38d3d 100644 --- a/a3fe/__init__.py +++ b/a3fe/__init__.py @@ -13,26 +13,25 @@ import warnings as _warnings from ._version import __version__ -from .run import ( - CalcSet, - Calculation, - LamWindow, - Leg, - Simulation, - Stage, -) - from .configuration import ( - SlurmConfig, - _EngineConfig, - SomdConfig, EngineType, JobStatus, LegType, PreparationStage, + SlurmConfig, + SomdConfig, + SomdSystemPreparationConfig, StageType, + _EngineConfig, enums, - SomdSystemPreparationConfig, +) +from .run import ( + CalcSet, + Calculation, + LamWindow, + Leg, + Simulation, + Stage, ) # A3FE can open many files due to the use of multiprocessing and diff --git a/a3fe/_version.py b/a3fe/_version.py index 6a9beea..3d26edf 100644 --- a/a3fe/_version.py +++ b/a3fe/_version.py @@ -1 +1 @@ -__version__ = "0.4.0" +__version__ = "0.4.1" diff --git a/a3fe/analyse/mbar.py b/a3fe/analyse/mbar.py index 46b0d63..1b54aae 100644 --- a/a3fe/analyse/mbar.py +++ b/a3fe/analyse/mbar.py @@ -15,6 +15,7 @@ import numpy as _np +from ..configuration import SlurmConfig as _SlurmConfig from ..read._process_somd_files import read_mbar_gradients as _read_mbar_gradients from ..read._process_somd_files import read_mbar_result as _read_mbar_result from ..read._process_somd_files import ( @@ -23,8 +24,6 @@ from ..run._virtual_queue import Job as _Job from ..run._virtual_queue import VirtualQueue as _VirtualQueue -from ..configuration import SlurmConfig as _SlurmConfig - def run_mbar( output_dir: str, diff --git a/a3fe/analyse/process_grads.py b/a3fe/analyse/process_grads.py index 2700c67..a97e65b 100644 --- a/a3fe/analyse/process_grads.py +++ b/a3fe/analyse/process_grads.py @@ -136,7 +136,8 @@ def __init__( stat_ineffs_all_winds = ( _np.array(stat_ineffs_all_winds) * lam_winds[0].sims[0].engine_config.timestep - ) # Timestep should be same for all sims + / 1_000_000 + ) # Timestep should be same for all sims, fs to ns # Get the SEMs of the free energy changes from the inter-run SEMs of the gradients lam_weights = _np.array([lam.lam_val_weight for lam in lam_winds]) diff --git a/a3fe/configuration/__init__.py b/a3fe/configuration/__init__.py index b2eefad..1bace22 100644 --- a/a3fe/configuration/__init__.py +++ b/a3fe/configuration/__init__.py @@ -1,9 +1,9 @@ """Pydantic configuration classes for the a3fe package.""" +from .engine_config import SomdConfig, _EngineConfig +from .enums import EngineType, JobStatus, LegType, PreparationStage, StageType +from .slurm_config import SlurmConfig from .system_prep_config import ( - _BaseSystemPreparationConfig, SomdSystemPreparationConfig, + _BaseSystemPreparationConfig, ) -from .slurm_config import SlurmConfig -from .engine_config import _EngineConfig, SomdConfig -from .enums import EngineType, JobStatus, LegType, PreparationStage, StageType diff --git a/a3fe/configuration/engine_config.py b/a3fe/configuration/engine_config.py index e114e65..90d01a2 100644 --- a/a3fe/configuration/engine_config.py +++ b/a3fe/configuration/engine_config.py @@ -5,23 +5,36 @@ ] import os as _os +from abc import ABC as _ABC +from abc import abstractmethod as _abstractmethod from decimal import Decimal as _Decimal from typing import ( Dict as _Dict, - Literal as _Literal, +) +from typing import ( List as _List, - Union as _Union, +) +from typing import ( + Literal as _Literal, +) +from typing import ( Optional as _Optional, ) +from typing import ( + Union as _Union, +) + +import yaml as _yaml from pydantic import ( BaseModel as _BaseModel, +) +from pydantic import ( Field as _Field, +) +from pydantic import ( model_validator as _model_validator, ) -import yaml as _yaml -from abc import ABC as _ABC, abstractmethod as _abstractmethod - class _EngineConfig(_BaseModel, _ABC): """Base class for engine runner configurations.""" diff --git a/a3fe/configuration/enums.py b/a3fe/configuration/enums.py index 65e3656..87df412 100644 --- a/a3fe/configuration/enums.py +++ b/a3fe/configuration/enums.py @@ -1,12 +1,13 @@ """Enums required for Classes in the run package.""" from enum import Enum as _Enum +from typing import Any as _Any from typing import List as _List -import yaml as _yaml -from .engine_config import _EngineConfig, SomdConfig as _SomdConfig +import yaml as _yaml -from typing import Any as _Any +from .engine_config import SomdConfig as _SomdConfig +from .engine_config import _EngineConfig __all__ = [ "JobStatus", @@ -141,11 +142,17 @@ def file_suffix(self) -> str: @property def prep_fn(self): """The function to use to prepare the input files for this stage.""" + from ..run.system_prep import ( + heat_and_preequil_input as _heat_and_preequil_input, + ) + from ..run.system_prep import ( + minimise_input as _minimise_input, + ) from ..run.system_prep import ( parameterise_input as _parameterise_input, + ) + from ..run.system_prep import ( solvate_input as _solvate_input, - minimise_input as _minimise_input, - heat_and_preequil_input as _heat_and_preequil_input, ) prep_fns = { diff --git a/a3fe/configuration/slurm_config.py b/a3fe/configuration/slurm_config.py index e7abb3d..4709edd 100644 --- a/a3fe/configuration/slurm_config.py +++ b/a3fe/configuration/slurm_config.py @@ -4,17 +4,16 @@ "SlurmConfig", ] -import yaml as _yaml -import subprocess as _subprocess +import os as _os import re as _re +import subprocess as _subprocess +from typing import Dict as _Dict +from typing import List as _List +import yaml as _yaml from pydantic import BaseModel as _BaseModel -from pydantic import Field as _Field from pydantic import ConfigDict as _ConfigDict - -import os as _os - -from typing import List as _List, Dict as _Dict +from pydantic import Field as _Field class SlurmConfig(_BaseModel): @@ -33,8 +32,12 @@ class SlurmConfig(_BaseModel): extra_options: _Dict[str, str] = _Field( {}, description="Extra options to pass to SLURM. For example, {'account': 'qt'}" ) - queue_check_interval: int = _Field(30, ge=1, description="Interval in seconds between SLURM queue status checks.") - job_submission_wait: int = _Field(300, ge=1, description="Wait time in seconds for job submission to SLURM queue.") + queue_check_interval: int = _Field( + 30, ge=1, description="Interval in seconds between SLURM queue status checks." + ) + job_submission_wait: int = _Field( + 300, ge=1, description="Wait time in seconds for job submission to SLURM queue." + ) model_config = _ConfigDict(validate_assignment=True) diff --git a/a3fe/configuration/system_prep_config.py b/a3fe/configuration/system_prep_config.py index 3e9fea5..b1c8e0c 100644 --- a/a3fe/configuration/system_prep_config.py +++ b/a3fe/configuration/system_prep_config.py @@ -6,18 +6,17 @@ "SomdSystemPreparationConfig", ] -import yaml as _yaml - from abc import ABC as _ABC +from typing import Dict as _Dict +from typing import List as _List +import yaml as _yaml from pydantic import BaseModel as _BaseModel -from pydantic import Field as _Field from pydantic import ConfigDict as _ConfigDict +from pydantic import Field as _Field -from .enums import StageType as _StageType from .enums import LegType as _LegType - -from typing import List as _List, Dict as _Dict +from .enums import StageType as _StageType class _BaseSystemPreparationConfig(_ABC, _BaseModel): diff --git a/a3fe/read/_read_exp_dgs.py b/a3fe/read/_read_exp_dgs.py index 6677f11..5934cb5 100644 --- a/a3fe/read/_read_exp_dgs.py +++ b/a3fe/read/_read_exp_dgs.py @@ -2,11 +2,10 @@ This must have the columns: calc_base_dir, name, exp_dg, exp_er""" import os as _os - from typing import Optional as _Optional -import pandas as _pd import numpy as _np +import pandas as _pd def read_exp_dgs( diff --git a/a3fe/run/_simulation_runner.py b/a3fe/run/_simulation_runner.py index c56714e..bd7ad06 100644 --- a/a3fe/run/_simulation_runner.py +++ b/a3fe/run/_simulation_runner.py @@ -22,15 +22,14 @@ import pandas as _pd import scipy.stats as _stats +from .._version import __version__ as _version from ..analyse.exceptions import AnalysisError as _AnalysisError from ..analyse.plot import plot_convergence as _plot_convergence from ..analyse.plot import plot_sq_sem_convergence as _plot_sq_sem_convergence -from ._logging_formatters import _A3feFileFormatter, _A3feStreamFormatter - -from ..configuration import SlurmConfig as _SlurmConfig from ..configuration import EngineType as _EngineType +from ..configuration import SlurmConfig as _SlurmConfig from ..configuration import _EngineConfig -from .._version import __version__ as _version +from ._logging_formatters import _A3feFileFormatter, _A3feStreamFormatter class SimulationRunner(ABC): diff --git a/a3fe/run/_virtual_queue.py b/a3fe/run/_virtual_queue.py index be3a4ff..f9d429c 100644 --- a/a3fe/run/_virtual_queue.py +++ b/a3fe/run/_virtual_queue.py @@ -10,9 +10,9 @@ from typing import List as _List from typing import Optional as _Optional +from ..configuration.enums import JobStatus as _JobStatus from ._logging_formatters import _A3feFileFormatter, _A3feStreamFormatter from ._utils import retry as _retry -from ..configuration.enums import JobStatus as _JobStatus @_dataclass diff --git a/a3fe/run/calc_set.py b/a3fe/run/calc_set.py index ededb7d..29fb966 100644 --- a/a3fe/run/calc_set.py +++ b/a3fe/run/calc_set.py @@ -12,12 +12,10 @@ import numpy as _np from scipy import stats as _stats -from ..configuration import SlurmConfig as _SlurmConfig -from ..configuration import _EngineConfig -from ..configuration import _BaseSystemPreparationConfig - from ..analyse.analyse_set import compute_stats as _compute_stats from ..analyse.plot import plot_against_exp as _plt_against_exp +from ..configuration import SlurmConfig as _SlurmConfig +from ..configuration import _BaseSystemPreparationConfig, _EngineConfig from ..read._read_exp_dgs import read_exp_dgs as _read_exp_dgs from ._simulation_runner import SimulationRunner as _SimulationRunner from ._utils import SimulationRunnerIterator as _SimulationRunnerIterator diff --git a/a3fe/run/calculation.py b/a3fe/run/calculation.py index e8e101a..d6acb7e 100644 --- a/a3fe/run/calculation.py +++ b/a3fe/run/calculation.py @@ -6,17 +6,16 @@ import logging as _logging import os as _os import time as _time +from pathlib import Path as _Path from typing import List as _List from typing import Optional as _Optional -from pathlib import Path as _Path -from ._simulation_runner import SimulationRunner as _SimulationRunner +from ..configuration import EngineType as _EngineType +from ..configuration import SlurmConfig as _SlurmConfig +from ..configuration import _BaseSystemPreparationConfig, _EngineConfig from ..configuration.enums import PreparationStage as _PreparationStage +from ._simulation_runner import SimulationRunner as _SimulationRunner from .leg import Leg as _Leg -from ..configuration import _BaseSystemPreparationConfig -from ..configuration import SlurmConfig as _SlurmConfig -from ..configuration import _EngineConfig -from ..configuration import EngineType as _EngineType class Calculation(_SimulationRunner): diff --git a/a3fe/run/lambda_window.py b/a3fe/run/lambda_window.py index 8715076..4e1c765 100644 --- a/a3fe/run/lambda_window.py +++ b/a3fe/run/lambda_window.py @@ -17,12 +17,12 @@ from ..analyse.detect_equil import ( dummy_check_equil_multiwindow as _dummy_check_equil_multiwindow, ) +from ..configuration import EngineType as _EngineType +from ..configuration import SlurmConfig as _SlurmConfig +from ..configuration import _EngineConfig from ._simulation_runner import SimulationRunner as _SimulationRunner from ._virtual_queue import VirtualQueue as _VirtualQueue from .simulation import Simulation as _Simulation -from ..configuration import SlurmConfig as _SlurmConfig -from ..configuration import _EngineConfig -from ..configuration import EngineType as _EngineType class LamWindow(_SimulationRunner): diff --git a/a3fe/run/leg.py b/a3fe/run/leg.py index af3b61a..14c95cb 100644 --- a/a3fe/run/leg.py +++ b/a3fe/run/leg.py @@ -22,20 +22,19 @@ from ..analyse.plot import plot_convergence as _plot_convergence from ..analyse.plot import plot_rmsds as _plot_rmsds from ..analyse.plot import plot_sq_sem_convergence as _plot_sq_sem_convergence +from ..configuration import EngineType as _EngineType +from ..configuration import LegType as _LegType +from ..configuration import PreparationStage as _PreparationStage +from ..configuration import SlurmConfig as _SlurmConfig +from ..configuration import StageType as _StageType +from ..configuration import _BaseSystemPreparationConfig, _EngineConfig from . import system_prep as _system_prep from ._restraint import A3feRestraint as _A3feRestraint from ._simulation_runner import SimulationRunner as _SimulationRunner from ._utils import get_single_mol as _get_single_mol from ._virtual_queue import Job as _Job from ._virtual_queue import VirtualQueue as _VirtualQueue -from ..configuration import LegType as _LegType -from ..configuration import PreparationStage as _PreparationStage -from ..configuration import StageType as _StageType -from ..configuration import EngineType as _EngineType -from ..configuration import _EngineConfig -from ..configuration import SlurmConfig as _SlurmConfig from .stage import Stage as _Stage -from ..configuration import _BaseSystemPreparationConfig class Leg(_SimulationRunner): diff --git a/a3fe/run/simulation.py b/a3fe/run/simulation.py index 4501367..3368cda 100644 --- a/a3fe/run/simulation.py +++ b/a3fe/run/simulation.py @@ -14,13 +14,13 @@ import numpy as _np from sire.units import k_boltz as _k_boltz -from ._simulation_runner import SimulationRunner as _SimulationRunner -from ._virtual_queue import Job as _Job -from ._virtual_queue import VirtualQueue as _VirtualQueue +from ..configuration import EngineType as _EngineType from ..configuration import JobStatus as _JobStatus from ..configuration import SlurmConfig as _SlurmConfig from ..configuration import _EngineConfig -from ..configuration import EngineType as _EngineType +from ._simulation_runner import SimulationRunner as _SimulationRunner +from ._virtual_queue import Job as _Job +from ._virtual_queue import VirtualQueue as _VirtualQueue class Simulation(_SimulationRunner): diff --git a/a3fe/run/stage.py b/a3fe/run/stage.py index 4b71401..6b7b722 100644 --- a/a3fe/run/stage.py +++ b/a3fe/run/stage.py @@ -9,7 +9,6 @@ import threading as _threading from copy import deepcopy as _deepcopy from math import ceil as _ceil -import matplotlib.pyplot as _plt from multiprocessing import get_context as _get_context from time import sleep as _sleep from typing import Any as _Any @@ -20,6 +19,7 @@ from typing import Tuple as _Tuple from typing import Union as _Union +import matplotlib.pyplot as _plt import numpy as _np import pandas as _pd import scipy.stats as _stats @@ -49,13 +49,13 @@ from ..analyse.plot import plot_rmsds as _plot_rmsds from ..analyse.plot import plot_sq_sem_convergence as _plot_sq_sem_convergence from ..analyse.process_grads import GradientData as _GradientData +from ..configuration import EngineType as _EngineType +from ..configuration import SlurmConfig as _SlurmConfig +from ..configuration import StageType as _StageType +from ..configuration import _EngineConfig from ._simulation_runner import SimulationRunner as _SimulationRunner from ._virtual_queue import VirtualQueue as _VirtualQueue -from ..configuration import StageType as _StageType from .lambda_window import LamWindow as _LamWindow -from ..configuration import SlurmConfig as _SlurmConfig -from ..configuration import _EngineConfig -from ..configuration import EngineType as _EngineType class Stage(_SimulationRunner): diff --git a/a3fe/run/system_prep.py b/a3fe/run/system_prep.py index f1d9275..5f49c87 100644 --- a/a3fe/run/system_prep.py +++ b/a3fe/run/system_prep.py @@ -14,11 +14,11 @@ import BioSimSpace.Sandpit.Exscientia as _BSS -from ..read._process_bss_systems import rename_lig as _rename_lig -from ._utils import check_has_wat_and_box as _check_has_wat_and_box +from ..configuration import EngineType as _EngineType from ..configuration import LegType as _LegType from ..configuration import PreparationStage as _PreparationStage -from ..configuration import EngineType as _EngineType +from ..read._process_bss_systems import rename_lig as _rename_lig +from ._utils import check_has_wat_and_box as _check_has_wat_and_box def parameterise_input( diff --git a/a3fe/tests/test_calc_set.py b/a3fe/tests/test_calc_set.py index ba818fd..8a78abd 100644 --- a/a3fe/tests/test_calc_set.py +++ b/a3fe/tests/test_calc_set.py @@ -2,9 +2,8 @@ import os -import pytest - import pandas as pd +import pytest def test_calc_set_analysis(calc_set): diff --git a/a3fe/tests/test_engine_configuration.py b/a3fe/tests/test_engine_configuration.py index 2c0e770..705634d 100644 --- a/a3fe/tests/test_engine_configuration.py +++ b/a3fe/tests/test_engine_configuration.py @@ -1,7 +1,8 @@ """Unit and regression tests for the engine configuration class.""" -from tempfile import TemporaryDirectory import os +from tempfile import TemporaryDirectory + import pytest from pydantic import ValidationError diff --git a/a3fe/tests/test_run.py b/a3fe/tests/test_run.py index 2d637c7..0ad3c9b 100644 --- a/a3fe/tests/test_run.py +++ b/a3fe/tests/test_run.py @@ -16,7 +16,6 @@ import a3fe as a3 from a3fe.analyse.detect_equil import dummy_check_equil_multiwindow - LEGS_WITH_STAGES = {"bound": ["discharge", "vanish"], "free": ["discharge", "vanish"]} diff --git a/a3fe/tests/test_run_integration.py b/a3fe/tests/test_run_integration.py index 715ef64..0f89579 100644 --- a/a3fe/tests/test_run_integration.py +++ b/a3fe/tests/test_run_integration.py @@ -18,16 +18,16 @@ See README.md in this directory for more information on running these tests. """ +import glob +import logging import os -import pytest import subprocess -import glob from tempfile import TemporaryDirectory -import logging -import a3fe as a3 -from a3fe.tests import SLURM_PRESENT, RUN_SLURM_TESTS +import pytest +import a3fe as a3 +from a3fe.tests import RUN_SLURM_TESTS, SLURM_PRESENT # Define the legs and stages for testing LEGS_WITH_STAGES = { diff --git a/a3fe/tests/test_slurm_configuration.py b/a3fe/tests/test_slurm_configuration.py index 9a718a4..9ffe7c2 100644 --- a/a3fe/tests/test_slurm_configuration.py +++ b/a3fe/tests/test_slurm_configuration.py @@ -1,14 +1,11 @@ """Unit and regression tests for the SlurmConfig class.""" +import os from tempfile import TemporaryDirectory - - from unittest.mock import patch from a3fe import SlurmConfig -import os - def test_create_default_config(): """Test that the default config is created correctly.""" diff --git a/a3fe/tests/test_update_engine_config_option.py b/a3fe/tests/test_update_engine_config_option.py index c754f29..e65ee8e 100644 --- a/a3fe/tests/test_update_engine_config_option.py +++ b/a3fe/tests/test_update_engine_config_option.py @@ -1,10 +1,11 @@ """Test the functionality of updating engine_config (SomdConfig) options.""" -from a3fe import SomdConfig -from a3fe.run._simulation_runner import SimulationRunner import pytest from pydantic import ValidationError +from a3fe import SomdConfig +from a3fe.run._simulation_runner import SimulationRunner + class MockSimulationRunner(SimulationRunner): """Simple mock for testing update_engine_config_option.""" diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst index 588056c..da42034 100644 --- a/docs/CHANGELOG.rst +++ b/docs/CHANGELOG.rst @@ -2,6 +2,10 @@ Change Log =============== +0.4.1 +==================== +- Fixed the statistical inefficiency timestep units from femtoseconds to nanoseconds. + 0.4.0 ====================