File indexing completed on 2026-05-15 07:41:52
0001 import argparse
0002 import os
0003 import re
0004 import subprocess
0005
0006
0007 def parse_geant4_version(version):
0008 match = re.fullmatch(r"\s*(\d+)\.(\d+)(?:\.(?:(\d+)|p(\d+))(?:\.beta)?)?\s*", version)
0009 if match is None:
0010 raise RuntimeError(f"Unable to parse Geant4 version: {version!r}")
0011
0012 major, minor, patch, patchlevel = match.groups(default="0")
0013 return int(major), int(minor), int(patch if patch != "0" else patchlevel)
0014
0015
0016 def detect_geant4_version():
0017 version = os.environ.get("GEANT4_VERSION")
0018 if version:
0019 return version.strip()
0020
0021 try:
0022 return subprocess.check_output(["geant4-config", "--version"], text=True).strip()
0023 except (OSError, subprocess.CalledProcessError) as err:
0024 raise RuntimeError(
0025 "Unable to determine Geant4 version. Set GEANT4_VERSION or ensure geant4-config is available."
0026 ) from err
0027
0028
0029 def geant4_series(version=None):
0030 resolved = detect_geant4_version() if version is None else version
0031 major, minor, _patch = parse_geant4_version(resolved)
0032
0033 if (major, minor) == (11, 3):
0034 return "11.3"
0035 if (major, minor) >= (11, 4):
0036 return "11.4+"
0037
0038 raise RuntimeError(
0039 f"Unsupported Geant4 version {resolved!r}. Add support for this release family."
0040 )
0041
0042
0043 def main():
0044 parser = argparse.ArgumentParser()
0045 parser.add_argument("field", nargs="?", choices=("version", "series"), default="version")
0046 args = parser.parse_args()
0047
0048 version = detect_geant4_version()
0049
0050 if args.field == "version":
0051 print(version)
0052 else:
0053 print(geant4_series(version))
0054
0055
0056 if __name__ == "__main__":
0057 main()