Source code for dependencies
"""
Simtools dependencies version management.
This modules provides two main functionalities:
- retrieve the versions of simtools dependencies (e.g., databases, sim_telarray, CORSIKA)
- provide space for future implementations of version management
"""
import logging
import os
import re
import subprocess
from pathlib import Path
import simtools.utils.general as gen
from simtools.db.db_handler import DatabaseHandler
_logger = logging.getLogger(__name__)
[docs]
def get_version_string(db_config=None):
"""Print the versions of the dependencies."""
return (
f"Database version: {get_database_version(db_config)}\n"
f"sim_telarray version: {get_sim_telarray_version()}\n"
f"CORSIKA version: {get_corsika_version()}\n"
)
[docs]
def get_database_version(db_config):
"""
Get the version of the simulation model data base used.
Parameters
----------
db_config : dict
Dictionary containing the database configuration.
Returns
-------
str
Version of the simulation model data base used.
"""
if db_config is None:
return None
db = DatabaseHandler(db_config)
return db.mongo_db_config.get("db_simulation_model")
[docs]
def get_sim_telarray_version():
"""
Get the version of the sim_telarray package using 'sim_telarray --version'.
Returns
-------
str
Version of the sim_telarray package.
"""
sim_telarray_path = os.getenv("SIMTOOLS_SIMTEL_PATH")
if sim_telarray_path is None:
_logger.warning("Environment variable SIMTOOLS_SIMTEL_PATH is not set.")
return None
sim_telarray_path = Path(sim_telarray_path) / "bin" / "sim_telarray"
# expect stdout with e.g. a line 'Release: 2024.271.0 from 2024-09-27'
result = subprocess.run(
[sim_telarray_path, "--version"],
capture_output=True,
text=True,
check=False,
)
match = re.search(r"^Release:\s+(.+)", result.stdout, re.MULTILINE)
if match:
return match.group(1).split()[0]
raise ValueError(f"sim_telarray release not found in {result.stdout}")
[docs]
def get_corsika_version():
"""
Get the version of the corsika package.
Returns
-------
str
Version of the corsika package.
"""
try:
build_opts = get_build_options()
except (FileNotFoundError, TypeError):
_logger.warning("CORSIKA version not implemented yet.")
return None
return build_opts.get("corsika_version")
[docs]
def get_build_options():
"""
Return CORSIKA / sim_telarray build options.
Expects a build_opts.yml file in the sim_telarray directory.
"""
try:
return gen.collect_data_from_file(
Path(os.getenv("SIMTOOLS_SIMTEL_PATH")) / "build_opts.yml"
)
except FileNotFoundError as exc:
raise FileNotFoundError("No build_opts.yml file found.") from exc
except TypeError as exc:
raise TypeError("SIMTOOLS_SIMTEL_PATH not defined.") from exc