Source code for simind_python_connector.utils.simind_utils

import os
from numbers import Number


[docs] class SimindError(Exception): """Base exception for SIMIND-related errors."""
[docs] class SimindNotFoundError(SimindError): """Raised when SIMIND executable is not found."""
[docs] def create_window_file( lower_bounds: list, upper_bounds: list, scatter_orders: list, output_filename: str = "input", energy_window=None, lower_ew=None, upper_ew=None, ): """ Creates a window file for simind simulation Args: lower_bounds (list): lower bounds of energy windows upper_bounds (list): upper bounds of energy windows scatter_orders (list): scatter orders of energy windows output_filename (str, optional): name of output file. Defaults to 'input'. ! energy_window (str, optional): energy window type can be dew or dew. Defaults to None. ! lower_ew (list, optional): lower energy window lower and upper bounds. Defaults to None. ! upper_ew (list, optional): upper energy window lower and upper bounds. Defaults to None. ! Note that dual and triple energy windows are not yet supported by this wrapper. Please define your own energy windows and work out yourself """ # if path suffix is not. win, add it if not output_filename.endswith(".win"): output_filename += ".win" if isinstance(lower_bounds, Number): lower_bounds = [lower_bounds] if isinstance(upper_bounds, Number): upper_bounds = [upper_bounds] if isinstance(scatter_orders, Number): scatter_orders = [scatter_orders] assert len(lower_bounds) == len(upper_bounds) == len(scatter_orders), ( "lower_bounds, upper_bounds and scatter_orders must have same length" ) # remove previous window file if present if os.path.exists(output_filename): os.remove(output_filename) with open(output_filename, "w") as file: for i in range(len(lower_bounds)): # for some reason simind doesn't like the last line to have a newline # character file.write( f"{float(lower_bounds[i])},{float(upper_bounds[i])},{int(scatter_orders[i])}\n" ) # simind sometimes doesn't output scatter files unless there's one line # with a dedicated scatter order # annoyingle this will create one extra total, air, scatter file if max(scatter_orders) < 1: file.write(f"{float(lower_bounds[i])},{float(upper_bounds[i])},1")