Source code for lr_reduction.utils

# standard imports
from contextlib import contextmanager
from copy import deepcopy
from pathlib import Path
from typing import Union

# third-party libraries
from mantid.kernel import ConfigService


[docs] def mantid_algorithm_exec(algorithm_class, **kwargs): algorithm_instance = algorithm_class() assert algorithm_instance.PyInit, "str(algorithm_class) is not a Mantid Python algorithm" algorithm_instance.PyInit() for name, value in kwargs.items(): algorithm_instance.setProperty(name, value) algorithm_instance.PyExec() if 'OutputWorkspace' in kwargs: return algorithm_instance.getProperty('OutputWorkspace').value
[docs] @contextmanager def amend_config( new_config: dict = None, data_dir: Union[str, list] = None, data_dir_insert_mode: str = "prepend" ) -> None: r""" Context manager to safely modify Mantid Configuration Service while the function is executed. Parameters ---------- new_config (key, value) pairs to substitute in the configuration service data_dir prepend one (when passing a string) or more (when passing a list) directories to the list of data search directories. Alternatively, replace instead of prepend. data_dir_insert_mode How to insert the data directories. Options are: "prepend" (default) and "replace". """ modified_keys = list() backup = dict() config = ConfigService.Instance() if new_config is not None: SEARCH_ARCHIVE = "datasearch.searcharchive" if SEARCH_ARCHIVE not in new_config: new_config[SEARCH_ARCHIVE] = "hfir, sns" DEFAULT_FACILITY = "default.facility" if DEFAULT_FACILITY not in new_config: new_config[DEFAULT_FACILITY] = "SNS" for key, val in new_config.items(): backup[key] = config[key] config[key] = val # config does not have an 'update' method modified_keys.append(key) if data_dir is not None: data_dirs = ( [ data_dir, ] if isinstance(data_dir, str) else data_dir ) # make sure the data_dirs exists and are directories for path in data_dirs: if Path(path).is_dir() is False: raise ValueError(f"Data directory: {path} does not exist or is not a directory") key = "datasearch.directories" backup[key] = deepcopy(config[key]) # prepend or replace our custom data directories to the list of data search directories if data_dir_insert_mode == "prepend": config.setDataSearchDirs(data_dirs + list(config.getDataSearchDirs())) elif data_dir_insert_mode == "replace": config.setDataSearchDirs(data_dirs) else: raise ValueError(f"Invalid data_dir_insert_mode: {data_dir_insert_mode}") try: yield finally: for key in modified_keys: config[key] = backup[key]