diff --git a/.gitignore b/.gitignore index 75e5e330..bfb34fe0 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,7 @@ Thumbs.db # pixi environments .pixi *.egg-info + +# IDEs +.vscode/ +.cursor/ diff --git a/pixi.lock b/pixi.lock index ece738fd..97d3da87 100644 --- a/pixi.lock +++ b/pixi.lock @@ -37,7 +37,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/f2/89ea3361a305466bc6460a532188830351220b5f0851a5fa133155c16eca/opentelemetry_api-1.32.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/5e/f5ded172af40b7e7ae60697a2b2096cec53e45344edce41e91a74425473c/ophyd-1.10.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/b3/1e63820f1a4df7854e33f0c3c5fa6be758c7fb7ea007ae9c8b9b35f48690/ophyd-1.10.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl @@ -99,7 +99,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/f2/89ea3361a305466bc6460a532188830351220b5f0851a5fa133155c16eca/opentelemetry_api-1.32.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/5e/f5ded172af40b7e7ae60697a2b2096cec53e45344edce41e91a74425473c/ophyd-1.10.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/b3/1e63820f1a4df7854e33f0c3c5fa6be758c7fb7ea007ae9c8b9b35f48690/ophyd-1.10.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl @@ -181,7 +181,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/f2/89ea3361a305466bc6460a532188830351220b5f0851a5fa133155c16eca/opentelemetry_api-1.32.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/5e/f5ded172af40b7e7ae60697a2b2096cec53e45344edce41e91a74425473c/ophyd-1.10.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/b3/1e63820f1a4df7854e33f0c3c5fa6be758c7fb7ea007ae9c8b9b35f48690/ophyd-1.10.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl @@ -248,7 +248,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/f2/89ea3361a305466bc6460a532188830351220b5f0851a5fa133155c16eca/opentelemetry_api-1.32.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/5e/f5ded172af40b7e7ae60697a2b2096cec53e45344edce41e91a74425473c/ophyd-1.10.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/b3/1e63820f1a4df7854e33f0c3c5fa6be758c7fb7ea007ae9c8b9b35f48690/ophyd-1.10.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl @@ -380,14 +380,15 @@ packages: requires_python: '>=3.8' - pypi: . name: cditools - version: 0.1.dev34+ga046dfc.d20250710 - sha256: dad64b187309de0f2f9b697f8c3db9aed41ac45331ac2cfc86122a070bb83645 + version: 0.1.dev42+g156513b.d20250730 + sha256: 9cd6f3f1c81072d40049cafcdbc62317a84242bf1cb69c494bcb4d0c2869b283 requires_dist: - ophyd - h5py - pytest>=6 ; extra == 'test' - pytest-cov>=3 ; extra == 'test' - caproto[standard]>=0.4.2rc1,!=1.2.0 ; extra == 'test' + - ophyd>=1.10.6 ; extra == 'test' - caproto[standard]>=0.4.2rc1,!=1.2.0 ; extra == 'dev' - pytest>=6 ; extra == 'dev' - pytest-cov>=3 ; extra == 'dev' @@ -396,6 +397,7 @@ packages: - ipython ; extra == 'dev' - ruff ; extra == 'dev' - pyright ; extra == 'dev' + - ophyd>=1.10.6 ; extra == 'dev' - sphinx>=7.0 ; extra == 'docs' - myst-parser>=0.13 ; extra == 'docs' - sphinx-copybutton ; extra == 'docs' @@ -983,10 +985,10 @@ packages: - deprecated>=1.2.6 - importlib-metadata>=6.0,<8.7.0 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f2/5e/f5ded172af40b7e7ae60697a2b2096cec53e45344edce41e91a74425473c/ophyd-1.10.5-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/fa/b3/1e63820f1a4df7854e33f0c3c5fa6be758c7fb7ea007ae9c8b9b35f48690/ophyd-1.10.7-py3-none-any.whl name: ophyd - version: 1.10.5 - sha256: 9acdc0b69b9f51bc8ee50cfaff11c18a5e089dd66f13ce8fe2ea57e291bf959a + version: 1.10.7 + sha256: d34a385a603d6ee255507dd2992ccb72a4316b824bf226bd2c8d2f0ce825bfbe requires_dist: - networkx>=2.0 - numpy @@ -996,7 +998,7 @@ packages: - attrs>=19.3.0 ; extra == 'dev' - black==22.3.0 ; extra == 'dev' - bluesky>=1.11.0 ; extra == 'dev' - - caproto[standard]>=0.4.2rc1 ; extra == 'dev' + - caproto[standard]>=0.4.2rc1,!=1.2.0 ; extra == 'dev' - pytest-codecov ; extra == 'dev' - databroker>=1.0.0b1 ; extra == 'dev' - doctr ; extra == 'dev' diff --git a/pyproject.toml b/pyproject.toml index 0cfb33ee..9486a072 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,7 @@ test = [ "pytest >=6", "pytest-cov >=3", "caproto[standard] >=0.4.2rc1,!=1.2.0", + "ophyd >=v1.10.6", ] dev = [ "caproto[standard] >=0.4.2rc1,!=1.2.0", @@ -49,6 +50,7 @@ dev = [ "ipython", "ruff", "pyright", + "ophyd >=v1.10.6", ] docs = [ "sphinx>=7.0", diff --git a/scripts/ophyd-generators/example_components.xlsx b/scripts/ophyd-generators/example_components.xlsx deleted file mode 100644 index 6df2dd94..00000000 Binary files a/scripts/ophyd-generators/example_components.xlsx and /dev/null differ diff --git a/scripts/ophyd-generators/generate_from_excel.py b/scripts/ophyd-generators/generate_from_excel.py deleted file mode 100644 index 06ce91e5..00000000 --- a/scripts/ophyd-generators/generate_from_excel.py +++ /dev/null @@ -1,181 +0,0 @@ -from __future__ import annotations - -import argparse -import logging -from collections import defaultdict -from pathlib import Path - -import pandas as pd - - -def parse_excel_file(filename): - """ - Parse Excel file and generate Ophyd device classes for each unique component. - - Parameters: - ----------- - filename : str - Path to the Excel file containing the component information. - - Returns: - -------- - str - Python code containing the generated Ophyd device classes. - """ - # Read Excel file - excel_df = pd.read_excel(filename, sheet_name="Motion axis summary", dtype=str) - - # Drop rows with NaN values in required columns - required_columns = [ - "Component Name", - "Component ID", - "Full component name", - "Full axis name", - "Axis ID", - "IOC Name", - ] - - # Check if all required columns exist - missing_columns = [col for col in required_columns if col not in excel_df.columns] - if missing_columns: - msg = f"Missing required columns: {missing_columns}" - raise ValueError(msg) - - # Filter out rows with missing values in required columns - excel_df = excel_df.dropna(subset=required_columns) - - # Group components by Component Name + Component ID - components = defaultdict(list) - - for _, row in excel_df.iterrows(): - component_name = row["Component Name"] - component_id = row["Component ID"] - - # Skip rows where Component Name is "MC" - if component_name == "MC": - logging.warning( - "Skipping row with Component Name 'MC', Component ID: %s", component_id - ) - continue - - full_component_name = row["Full component name"] - full_axis_name = row["Full axis name"] - axis_id = row["Axis ID"] - - # Get axis prefix by removing the full component name from the full axis name - # This assumes the full_axis_name starts with full_component_name - if full_axis_name.startswith(full_component_name): - axis_prefix = full_axis_name[len(full_component_name) :] - else: - # If not, just use the full axis name (might need adjustment) - axis_prefix = full_axis_name - - # Create unique key for components using Component Name + Component ID - group_key = f"{component_name}_{component_id}" - - # Store component information - components[group_key].append( - { - "component_name": component_name, - "component_id": component_id, - "full_component_name": full_component_name, - "axis_prefix": axis_prefix, - "axis_id": axis_id, - } - ) - - # Generate Ophyd device classes - return generate_ophyd_classes(components) - - -def generate_ophyd_classes(components): - """ - Generate Ophyd device classes based on the parsed data. - - Parameters: - ----------- - components : dict - Dictionary containing component information. - - Returns: - -------- - str - Python code with Ophyd device class definitions. - """ - code = [ - "#!/usr/bin/env python", - "from ophyd import Device, Component as Cpt, EpicsMotor", - "", - "# Auto-generated Ophyd device classes", - "", - ] - - for _, axes in components.items(): - if not axes: - continue - - # Use the first entry to get the component details - first_axis = axes[0] - component_name = first_axis["component_name"] - component_id = first_axis["component_id"] - full_component_name = first_axis["full_component_name"] - - # Start class definition - concatenate Component Name and Component ID for class name - class_name = f"{component_name.replace(' ', '')}{component_id}" - code.append(f"class {class_name}(Device):") - code.append(f' """Ophyd Device for {component_name} {component_id}"""') - - # Add component for each axis - without Component ID in name - read_attrs = [] - for axis in axes: - axis_id = axis["axis_id"] - # Use only the Axis ID for the component name, not including Component ID - motor_name = f"{axis_id}" - motor_name_clean = motor_name.replace("-", "_").replace(" ", "_").lower() - code.append( - f" {motor_name_clean} = Cpt(EpicsMotor, '-{axis['axis_prefix'].split('-')[-1]}')" - ) - read_attrs.append(motor_name_clean) - - # Add default value for prefix - code.append(f" _default_prefix = '{full_component_name}'") - code.append(f" _default_read_attrs = {read_attrs}") - code.append("") - - # Add instantiation code comment - device_name = f"{component_name.lower()}_{component_id.lower()}" - code.append(f"# Instantiate {device_name}") - code.append( - f"{device_name} = {class_name}(prefix='{full_component_name[:-1]}', name='{device_name}')" - ) - code.append("") - - return "\n".join(code) - - -def main(): - parser = argparse.ArgumentParser( - description="Parse Excel file and generate Ophyd device classes." - ) - parser.add_argument("filename", help="Path to the Excel file") - parser.add_argument( - "-o", - "--output", - help="Output Python file (default: ophyd_devices.py)", - default="ophyd_devices.py", - ) - - args = parser.parse_args() - - code = parse_excel_file(args.filename) - - with Path(args.output).open("w") as f: - f.write(code) - - logging.info("Successfully generated Ophyd device classes in %s", args.output) - - return 0 - - -if __name__ == "__main__": - main() diff --git a/src/cditools/motors.py b/src/cditools/motors.py index 634c4571..50bd6d06 100644 --- a/src/cditools/motors.py +++ b/src/cditools/motors.py @@ -2,264 +2,319 @@ from ophyd import Component as Cpt # type: ignore[import-not-found] from ophyd import Device, EpicsMotor - -# Auto-generated Ophyd device classes - - -class SltWB1(Device): - """Ophyd Device for Slt WB1""" - - i = Cpt(EpicsMotor, "-Ax:I}Mtr") - o = Cpt(EpicsMotor, "-Ax:O}Mtr") - b = Cpt(EpicsMotor, "-Ax:B}Mtr") - t = Cpt(EpicsMotor, "-Ax:T}Mtr") - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - hc = Cpt(EpicsMotor, "-Ax:HC}Mtr") - vg = Cpt(EpicsMotor, "-Ax:VG}Mtr") - vc = Cpt(EpicsMotor, "-Ax:VC}Mtr") - - -class FltrDM1(Device): - """Ophyd Device for Fltr DM1""" - - y = Cpt(EpicsMotor, "-Ax:Y}Mtr") - - -class FSVPM(Device): - """Ophyd Device for FS VPM""" - - y = Cpt(EpicsMotor, "-Ax:Y}Mtr") - - -class FSHPM(Device): - """Ophyd Device for FS HPM""" - - y = Cpt(EpicsMotor, "-Ax:Y}Mtr") - - -class FSDM2(Device): - """Ophyd Device for FS DM2""" - - y = Cpt(EpicsMotor, "-Ax:Y}Mtr") - - -class MonoDMM(Device): - """Ophyd Device for Mono DMM""" - - tx = Cpt(EpicsMotor, "-Ax:TX}Mtr") - ty = Cpt(EpicsMotor, "-Ax:TY}Mtr") - bragg = Cpt(EpicsMotor, "-Ax:Bragg}Mtr") - roll = Cpt(EpicsMotor, "-Ax:Roll}Mtr") - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - pitch = Cpt(EpicsMotor, "-Ax:Pitch}Mtr") - tz = Cpt(EpicsMotor, "-Ax:TZ}Mtr") - fp = Cpt(EpicsMotor, "-Ax:FP}Mtr") - fr = Cpt(EpicsMotor, "-Ax:FR}Mtr") - - -class MonoHDCM(Device): - """Ophyd Device for Mono HDCM""" - - tx = Cpt(EpicsMotor, "-Ax:TX}Mtr") - ty = Cpt(EpicsMotor, "-Ax:TY}Mtr") - bragg = Cpt(EpicsMotor, "-Ax:Bragg}Mtr") - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - pitch = Cpt(EpicsMotor, "-Ax:Pitch}Mtr") - roll = Cpt(EpicsMotor, "-Ax:Roll}Mtr") - fp = Cpt(EpicsMotor, "-Ax:FP}Mtr") - - -class SltVPM(Device): - """Ophyd Device for Slt VPM""" - - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - hc = Cpt(EpicsMotor, "-Ax:HC}Mtr") - vg = Cpt(EpicsMotor, "-Ax:VG}Mtr") - vc = Cpt(EpicsMotor, "-Ax:VC}Mtr") - - -class SltHPM(Device): - """Ophyd Device for Slt HPM""" - - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - hc = Cpt(EpicsMotor, "-Ax:HC}Mtr") - vg = Cpt(EpicsMotor, "-Ax:VG}Mtr") - vc = Cpt(EpicsMotor, "-Ax:VC}Mtr") - - -class MirVPM(Device): - """Ophyd Device for Mir VPM""" - - yuc = Cpt(EpicsMotor, "-Ax:YUC}Mtr") - ydi = Cpt(EpicsMotor, "-Ax:YDI}Mtr") - ydo = Cpt(EpicsMotor, "-Ax:YDO}Mtr") - pitch = Cpt(EpicsMotor, "-Ax:Pitch}Mtr") - roll = Cpt(EpicsMotor, "-Ax:Roll}Mtr") - ty = Cpt(EpicsMotor, "-Ax:TY}Mtr") - tx = Cpt(EpicsMotor, "-Ax:TX}Mtr") - ub = Cpt(EpicsMotor, "-Ax:UB}Mtr") - db = Cpt(EpicsMotor, "-Ax:DB}Mtr") - bnd = Cpt(EpicsMotor, "-Ax:Bnd}Mtr") - bndoff = Cpt(EpicsMotor, "-Ax:BndOff}Mtr") - - -class IMDM2(Device): - """Ophyd Device for IM DM2""" - - y = Cpt(EpicsMotor, "-Ax:Y}Mtr") - - -class MirHPM(Device): - """Ophyd Device for Mir HPM""" - - yuc = Cpt(EpicsMotor, "-Ax:YUC}Mtr") - ydi = Cpt(EpicsMotor, "-Ax:YDI}Mtr") - ydo = Cpt(EpicsMotor, "-Ax:YDO}Mtr") - pitch = Cpt(EpicsMotor, "-Ax:Pitch}Mtr") - roll = Cpt(EpicsMotor, "-Ax:Roll}Mtr") - ty = Cpt(EpicsMotor, "-Ax:TY}Mtr") - ub = Cpt(EpicsMotor, "-Ax:UB}Mtr") - db = Cpt(EpicsMotor, "-Ax:DB}Mtr") - bnd = Cpt(EpicsMotor, "-Ax:Bnd}Mtr") - bndoff = Cpt(EpicsMotor, "-Ax:BndOff}Mtr") - xu = Cpt(EpicsMotor, "-Ax:XU}Mtr") - xd = Cpt(EpicsMotor, "-Ax:XD}Mtr") - tx = Cpt(EpicsMotor, "-Ax:TX}Mtr") - yaw = Cpt(EpicsMotor, "-Ax:Yaw}Mtr") - - -class SltDM3(Device): - """Ophyd Device for Slt DM3""" - - i = Cpt(EpicsMotor, "-Ax:I}Mtr") - o = Cpt(EpicsMotor, "-Ax:O}Mtr") - b = Cpt(EpicsMotor, "-Ax:B}Mtr") - t = Cpt(EpicsMotor, "-Ax:T}Mtr") - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - hc = Cpt(EpicsMotor, "-Ax:HC}Mtr") - vg = Cpt(EpicsMotor, "-Ax:VG}Mtr") - vc = Cpt(EpicsMotor, "-Ax:VC}Mtr") - - -class BPMDM3(Device): - """Ophyd Device for BPM DM3""" - - tx = Cpt(EpicsMotor, "-Ax:TX}Mtr") - ty = Cpt(EpicsMotor, "-Ax:TY}Mtr") - foil = Cpt(EpicsMotor, "-Ax:Foil}Mtr") - - -class FSDM3(Device): - """Ophyd Device for FS DM3""" - - fs = Cpt(EpicsMotor, "-Ax:FS}Mtr") - - -class MirKBv(Device): - """Ophyd Device for Mir KBv""" - - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - hc = Cpt(EpicsMotor, "-Ax:HC}Mtr") - vg = Cpt(EpicsMotor, "-Ax:VG}Mtr") - vc = Cpt(EpicsMotor, "-Ax:VC}Mtr") - yuc = Cpt(EpicsMotor, "-Ax:YUC}Mtr") - ydi = Cpt(EpicsMotor, "-Ax:YDI}Mtr") - ydo = Cpt(EpicsMotor, "-Ax:YDO}Mtr") - yaw = Cpt(EpicsMotor, "-Ax:Yaw}Mtr") - roll = Cpt(EpicsMotor, "-Ax:Roll}Mtr") - ty = Cpt(EpicsMotor, "-Ax:TY}Mtr") - tx = Cpt(EpicsMotor, "-Ax:TX}Mtr") - tz = Cpt(EpicsMotor, "-Ax:TZ}Mtr") - pitch = Cpt(EpicsMotor, "-Ax:Pitch}Mtr") - fs = Cpt(EpicsMotor, "-Ax:FS}Mtr") - - -class MirKBh(Device): - """Ophyd Device for Mir KBh""" - - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - hc = Cpt(EpicsMotor, "-Ax:HC}Mtr") - vg = Cpt(EpicsMotor, "-Ax:VG}Mtr") - vc = Cpt(EpicsMotor, "-Ax:VC}Mtr") - yuc = Cpt(EpicsMotor, "-Ax:YUC}Mtr") - ydi = Cpt(EpicsMotor, "-Ax:YDI}Mtr") - ydo = Cpt(EpicsMotor, "-Ax:YDO}Mtr") - yaw = Cpt(EpicsMotor, "-Ax:Yaw}Mtr") - roll = Cpt(EpicsMotor, "-Ax:Roll}Mtr") - ty = Cpt(EpicsMotor, "-Ax:TY}Mtr") - tx = Cpt(EpicsMotor, "-Ax:TX}Mtr") - tz = Cpt(EpicsMotor, "-Ax:TZ}Mtr") - pitch = Cpt(EpicsMotor, "-Ax:Pitch}Mtr") - fs = Cpt(EpicsMotor, "-Ax:FS}Mtr") - - -class BPMDM4(Device): - """Ophyd Device for BPM DM4""" - - tx = Cpt(EpicsMotor, "-Ax:TX}Mtr") - ty = Cpt(EpicsMotor, "-Ax:TY}Mtr") - - -class WndExit(Device): - """Ophyd Device for Wnd Exit""" - - tx = Cpt(EpicsMotor, "-Ax:TX}Mtr") - ty = Cpt(EpicsMotor, "-Ax:TY}Mtr") - - -class Gon1(Device): - """Ophyd Device for Gon 1""" - - rx1 = Cpt(EpicsMotor, "-Ax:Rx1}Mtr") - rz1 = Cpt(EpicsMotor, "-Ax:Rz1}Mtr") - rx2 = Cpt(EpicsMotor, "-Ax:Rx2}Mtr") - rz2 = Cpt(EpicsMotor, "-Ax:Rz2}Mtr") - y = Cpt(EpicsMotor, "-Ax:Y}Mtr") - ry = Cpt(EpicsMotor, "-Ax:Ry}Mtr") - x1 = Cpt(EpicsMotor, "-Ax:X1}Mtr") - z1 = Cpt(EpicsMotor, "-Ax:Z1}Mtr") - x2 = Cpt(EpicsMotor, "-Ax:X2}Mtr") - z2 = Cpt(EpicsMotor, "-Ax:Z2}Mtr") - rx3 = Cpt(EpicsMotor, "-Ax:Rx3}Mtr") - rz3 = Cpt(EpicsMotor, "-Ax:Rz3}Mtr") - x3 = Cpt(EpicsMotor, "-Ax:X3}Mtr") - y3 = Cpt(EpicsMotor, "-Ax:Y3}Mtr") - z3 = Cpt(EpicsMotor, "-Ax:Z3}Mtr") - visual = Cpt(EpicsMotor, "-Ax:Visual}Mtr") - xp = Cpt(EpicsMotor, "-Ax:XP}Mtr") - yp = Cpt(EpicsMotor, "-Ax:YP}Mtr") - zp = Cpt(EpicsMotor, "-Ax:ZP}Mtr") - - -class SltBCUU(Device): - """Ophyd Device for Slt BCUU""" - - i = Cpt(EpicsMotor, "-Ax:I}Mtr") - o = Cpt(EpicsMotor, "-Ax:O}Mtr") - b = Cpt(EpicsMotor, "-Ax:B}Mtr") - t = Cpt(EpicsMotor, "-Ax:T}Mtr") - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - hc = Cpt(EpicsMotor, "-Ax:HC}Mtr") - vg = Cpt(EpicsMotor, "-Ax:VG}Mtr") - vc = Cpt(EpicsMotor, "-Ax:VC}Mtr") - - -class SltBCUD(Device): - """Ophyd Device for Slt BCUD""" - - i = Cpt(EpicsMotor, "-Ax:I}Mtr") - o = Cpt(EpicsMotor, "-Ax:O}Mtr") - b = Cpt(EpicsMotor, "-Ax:B}Mtr") - t = Cpt(EpicsMotor, "-Ax:T}Mtr") - hg = Cpt(EpicsMotor, "-Ax:HG}Mtr") - hc = Cpt(EpicsMotor, "-Ax:HC}Mtr") - vg = Cpt(EpicsMotor, "-Ax:VG}Mtr") - vc = Cpt(EpicsMotor, "-Ax:VC}Mtr") - - -class Qstar1(Device): - """Ophyd Device for Qstar 1""" - - ax1 = Cpt(EpicsMotor, "-Ax:1}Mtr") - ax2 = Cpt(EpicsMotor, "-Ax:2}Mtr") - ax3 = Cpt(EpicsMotor, "-Ax:3}Mtr") +from ophyd import DynamicDeviceComponent as DDC + + +class DM1(Device): + """Ophyd Device for DM1""" + + slit = DDC( + { + "ib": (EpicsMotor, "Slt:WB1-Ax:I}Mtr", {}), + "ob": (EpicsMotor, "Slt:WB1-Ax:O}Mtr", {}), + "bb": (EpicsMotor, "Slt:WB1-Ax:B}Mtr", {}), + "tb": (EpicsMotor, "Slt:WB1-Ax:T}Mtr", {}), + "hg": (EpicsMotor, "Slt:WB1-Ax:HG}Mtr", {}), + "hc": (EpicsMotor, "Slt:WB1-Ax:HC}Mtr", {}), + "vg": (EpicsMotor, "Slt:WB1-Ax:VG}Mtr", {}), + "vc": (EpicsMotor, "Slt:WB1-Ax:VC}Mtr", {}), + } + ) + filt = Cpt(EpicsMotor, "Fltr:DM1-Ax:Y}Mtr") + + +class VPM(Device): + fs = DDC( + { + "y": (EpicsMotor, "FS:VPM-Ax:Y}Mtr", {}), + } + ) + slit = DDC( + { + "hg": (EpicsMotor, "Slt:VPM-Ax:HG}Mtr", {}), + "hc": (EpicsMotor, "Slt:VPM-Ax:HC}Mtr", {}), + "vg": (EpicsMotor, "Slt:VPM-Ax:VG}Mtr", {}), + "vc": (EpicsMotor, "Slt:VPM-Ax:VC}Mtr", {}), + } + ) + mir = DDC( + { + "us_j": (EpicsMotor, "Mir:VPM-Ax:YUC}Mtr", {}), + "ib_j": (EpicsMotor, "Mir:VPM-Ax:YDI}Mtr", {}), + "ob_j": (EpicsMotor, "Mir:VPM-Ax:YDO}Mtr", {}), + "p": (EpicsMotor, "Mir:VPM-Ax:Pitch}Mtr", {}), + "r": (EpicsMotor, "Mir:VPM-Ax:Roll}Mtr", {}), + "y": (EpicsMotor, "Mir:VPM-Ax:TY}Mtr", {}), + "x": (EpicsMotor, "Mir:VPM-Ax:TX}Mtr", {}), + "us_b": (EpicsMotor, "Mir:VPM-Ax:UB}Mtr", {}), + "ds_b": (EpicsMotor, "Mir:VPM-Ax:DB}Mtr", {}), + "bend": (EpicsMotor, "Mir:VPM-Ax:Bnd}Mtr", {}), + "bend_off": (EpicsMotor, "Mir:VPM-Ax:BndOff}Mtr", {}), + } + ) + + +class HPM(Device): + fs = DDC( + { + "y": (EpicsMotor, "FS:HPM-Ax:Y}Mtr", {}), + } + ) + slit = DDC( + { + "hg": (EpicsMotor, "Slt:HPM-Ax:HG}Mtr", {}), + "hc": (EpicsMotor, "Slt:HPM-Ax:HC}Mtr", {}), + "vg": (EpicsMotor, "Slt:HPM-Ax:VG}Mtr", {}), + "vc": (EpicsMotor, "Slt:HPM-Ax:VC}Mtr", {}), + } + ) + mir = DDC( + { + "us_j": (EpicsMotor, "Mir:HPM-Ax:YUC}Mtr", {}), + "ib_j": (EpicsMotor, "Mir:HPM-Ax:YDI}Mtr", {}), + "ob_j": (EpicsMotor, "Mir:HPM-Ax:YDO}Mtr", {}), + "p": (EpicsMotor, "Mir:HPM-Ax:Pitch}Mtr", {}), + "r": (EpicsMotor, "Mir:HPM-Ax:Roll}Mtr", {}), + "y": (EpicsMotor, "Mir:HPM-Ax:TY}Mtr", {}), + "us_b": (EpicsMotor, "Mir:HPM-Ax:UB}Mtr", {}), + "ds_b": (EpicsMotor, "Mir:HPM-Ax:DB}Mtr", {}), + "bend": (EpicsMotor, "Mir:HPM-Ax:Bnd}Mtr", {}), + "bend_off": (EpicsMotor, "Mir:HPM-Ax:BndOff}Mtr", {}), + "us_x": (EpicsMotor, "Mir:HPM-Ax:XU}Mtr", {}), + "ds_x": (EpicsMotor, "Mir:HPM-Ax:XD}Mtr", {}), + "x": (EpicsMotor, "Mir:HPM-Ax:TX}Mtr", {}), + "yaw": (EpicsMotor, "Mir:HPM-Ax:Yaw}Mtr", {}), + } + ) + + +class DM2(Device): + fs = DDC( + { + "y": (EpicsMotor, "FS:DM2-Ax:Y}Mtr", {}), + } + ) + foil = Cpt(EpicsMotor, "IM:DM2-Ax:Y}Mtr") + + +class DMM(Device): + h = Cpt(EpicsMotor, "Mono:DMM-Ax:TX}Mtr") + v = Cpt(EpicsMotor, "Mono:DMM-Ax:TY}Mtr") + bragg = Cpt(EpicsMotor, "Mono:DMM-Ax:Bragg}Mtr") + mlm1 = DDC( + { + "r": (EpicsMotor, "Mono:DMM-Ax:Roll}Mtr", {}), + "fr": (EpicsMotor, "Mono:DMM-Ax:FR}Mtr", {}), + } + ) + mgap = Cpt(EpicsMotor, "Mono:DMM-Ax:HG}Mtr") + mlm2 = DDC( + { + "p": (EpicsMotor, "Mono:DMM-Ax:Pitch}Mtr", {}), + "fp": (EpicsMotor, "Mono:DMM-Ax:FP}Mtr", {}), + } + ) + zoff = Cpt(EpicsMotor, "Mono:DMM-Ax:TZ}Mtr") + + +class DCM(Device): + h = Cpt(EpicsMotor, "Mono:HDCM-Ax:TX}Mtr") + v = Cpt(EpicsMotor, "Mono:HDCM-Ax:TY}Mtr") + bragg = Cpt(EpicsMotor, "Mono:HDCM-Ax:Bragg}Mtr") + cgap = Cpt(EpicsMotor, "Mono:HDCM-Ax:HG}Mtr") + c2 = DDC( + { + "p": (EpicsMotor, "Mono:HDCM-Ax:Pitch}Mtr", {}), + "r": (EpicsMotor, "Mono:HDCM-Ax:Roll}Mtr", {}), + "fp": (EpicsMotor, "Mono:HDCM-Ax:FP}Mtr", {}), + } + ) + + +class DM3(Device): + slit = DDC( + { + "ib": (EpicsMotor, "Slt:DM3-Ax:I}Mtr", {}), + "ob": (EpicsMotor, "Slt:DM3-Ax:O}Mtr", {}), + "bb": (EpicsMotor, "Slt:DM3-Ax:B}Mtr", {}), + "tb": (EpicsMotor, "Slt:DM3-Ax:T}Mtr", {}), + "hg": (EpicsMotor, "Slt:DM3-Ax:HG}Mtr", {}), + "hc": (EpicsMotor, "Slt:DM3-Ax:HC}Mtr", {}), + "vg": (EpicsMotor, "Slt:DM3-Ax:VG}Mtr", {}), + "vc": (EpicsMotor, "Slt:DM3-Ax:VC}Mtr", {}), + } + ) + bpm = DDC( + { + "x": (EpicsMotor, "BPM:DM3-Ax:TX}Mtr", {}), + "y": (EpicsMotor, "BPM:DM3-Ax:TY}Mtr", {}), + "foil": (EpicsMotor, "BPM:DM3-Ax:Foil}Mtr", {}), + } + ) + fs = DDC( + { + "y": (EpicsMotor, "FS:DM3-Ax:FS}Mtr", {}), + } + ) + + +class VKB(Device): + slit = DDC( + { + "hg": (EpicsMotor, "Slt:KBv-Ax:HG}Mtr", {}), + "hc": (EpicsMotor, "Slt:KBv-Ax:HC}Mtr", {}), + "vg": (EpicsMotor, "Slt:KBv-Ax:VG}Mtr", {}), + "vc": (EpicsMotor, "Slt:KBv-Ax:VC}Mtr", {}), + } + ) + mir = DDC( + { + "us_j": (EpicsMotor, "Mir:KBv-Ax:YUC}Mtr", {}), + "ib_j": (EpicsMotor, "Mir:KBv-Ax:YDI}Mtr", {}), + "ob_j": (EpicsMotor, "Mir:KBv-Ax:YDO}Mtr", {}), + "yaw": (EpicsMotor, "Mir:KBv-Ax:Yaw}Mtr", {}), + "r": (EpicsMotor, "Mir:KBv-Ax:Roll}Mtr", {}), + "y": (EpicsMotor, "Mir:KBv-Ax:TY}Mtr", {}), + "x": (EpicsMotor, "Mir:KBv-Ax:TX}Mtr", {}), + "z": (EpicsMotor, "Mir:KBv-Ax:TZ}Mtr", {}), + "p": (EpicsMotor, "Mir:KBv-Ax:Pitch}Mtr", {}), + } + ) + fs = DDC( + { + "y": (EpicsMotor, "FS:KBv-Ax:FS}Mtr", {}), + } + ) + + +class HKB(Device): + slit = DDC( + { + "hg": (EpicsMotor, "Slt:KBh-Ax:HG}Mtr", {}), + "hc": (EpicsMotor, "Slt:KBh-Ax:HC}Mtr", {}), + "vg": (EpicsMotor, "Slt:KBh-Ax:VG}Mtr", {}), + "vc": (EpicsMotor, "Slt:KBh-Ax:VC}Mtr", {}), + } + ) + mir = DDC( + { + "us_j": (EpicsMotor, "Mir:KBh-Ax:YUC}Mtr", {}), + "ib_j": (EpicsMotor, "Mir:KBh-Ax:YDI}Mtr", {}), + "ob_j": (EpicsMotor, "Mir:KBh-Ax:YDO}Mtr", {}), + "yaw": (EpicsMotor, "Mir:KBh-Ax:Yaw}Mtr", {}), + "r": (EpicsMotor, "Mir:KBh-Ax:Roll}Mtr", {}), + "y": (EpicsMotor, "Mir:KBh-Ax:TY}Mtr", {}), + "x": (EpicsMotor, "Mir:KBh-Ax:TX}Mtr", {}), + "z": (EpicsMotor, "Mir:KBh-Ax:TZ}Mtr", {}), + "p": (EpicsMotor, "Mir:KBh-Ax:Pitch}Mtr", {}), + } + ) + fs = DDC( + { + "y": (EpicsMotor, "Mir:KBh-Ax:FS}Mtr", {}), + } + ) + + +class KB(Device): + vkb = Cpt(VKB, "") + hkb = Cpt(HKB, "") + win = DDC( + { + "x": (EpicsMotor, "Wnd:Exit-Ax:TX}Mtr", {}), + "y": (EpicsMotor, "Wnd:Exit-Ax:TY}Mtr", {}), + } + ) + + +class DM4(Device): + bpm = DDC( + { + "x": (EpicsMotor, "BPM:DM4-Ax:TX}Mtr", {}), + "y": (EpicsMotor, "BPM:DM4-Ax:TY}Mtr", {}), + } + ) + + +class SAM(Device): + c_sm = DDC( + { + "lrx": (EpicsMotor, "Gon:1-Ax:Rx1}Mtr", {}), + "lrz": (EpicsMotor, "Gon:1-Ax:Rz1}Mtr", {}), + } + ) + c_lg = DDC( + { + "lrx": (EpicsMotor, "Gon:1-Ax:Rx2}Mtr", {}), + "lrz": (EpicsMotor, "Gon:1-Ax:Rz2}Mtr", {}), + } + ) + ly = Cpt(EpicsMotor, "Gon:1-Ax:Y}Mtr") + ry = Cpt(EpicsMotor, "Gon:1-Ax:Ry}Mtr") + t_sm = DDC( + { + "lx": (EpicsMotor, "Gon:1-Ax:X1}Mtr", {}), + "lz": (EpicsMotor, "Gon:1-Ax:Z1}Mtr", {}), + } + ) + t_lg = DDC( + { + "lx": (EpicsMotor, "Gon:1-Ax:X2}Mtr", {}), + "lz": (EpicsMotor, "Gon:1-Ax:Z2}Mtr", {}), + } + ) + lfx = Cpt(EpicsMotor, "Gon:1-Ax:XP}Mtr") + lfy = Cpt(EpicsMotor, "Gon:1-Ax:YP}Mtr") + lfz = Cpt(EpicsMotor, "Gon:1-Ax:ZP}Mtr") + + +class GON(Device): + sam = Cpt(SAM, "") + align = DDC( + { + "rx": (EpicsMotor, "Gon:1-Ax:Rx3}Mtr", {}), + "rz": (EpicsMotor, "Gon:1-Ax:Rz3}Mtr", {}), + "x": (EpicsMotor, "Gon:1-Ax:X3}Mtr", {}), + "y": (EpicsMotor, "Gon:1-Ax:Y3}Mtr", {}), + "z": (EpicsMotor, "Gon:1-Ax:Z3}Mtr", {}), + } + ) + fs = DDC( + { + "y": (EpicsMotor, "Gon:1-Ax:Visual}Mtr", {}), + } + ) + + +class BCU(Device): + slit_us = DDC( + { + "ib": (EpicsMotor, "Slt:BCUU-Ax:I}Mtr", {}), + "ob": (EpicsMotor, "Slt:BCUU-Ax:O}Mtr", {}), + "bb": (EpicsMotor, "Slt:BCUU-Ax:B}Mtr", {}), + "tb": (EpicsMotor, "Slt:BCUU-Ax:T}Mtr", {}), + "hg": (EpicsMotor, "Slt:BCUU-Ax:HG}Mtr", {}), + "hc": (EpicsMotor, "Slt:BCUU-Ax:HC}Mtr", {}), + "vg": (EpicsMotor, "Slt:BCUU-Ax:VG}Mtr", {}), + "vc": (EpicsMotor, "Slt:BCUU-Ax:VC}Mtr", {}), + } + ) + slit_ds = DDC( + { + "ib": (EpicsMotor, "Slt:BCUD-Ax:I}Mtr", {}), + "ob": (EpicsMotor, "Slt:BCUD-Ax:O}Mtr", {}), + "bb": (EpicsMotor, "Slt:BCUD-Ax:B}Mtr", {}), + "tb": (EpicsMotor, "Slt:BCUD-Ax:T}Mtr", {}), + "hg": (EpicsMotor, "Slt:BCUD-Ax:HG}Mtr", {}), + "hc": (EpicsMotor, "Slt:BCUD-Ax:HC}Mtr", {}), + "vg": (EpicsMotor, "Slt:BCUD-Ax:VG}Mtr", {}), + "vc": (EpicsMotor, "Slt:BCUD-Ax:VC}Mtr", {}), + } + ) + ilcam = DDC( + { + "x": (EpicsMotor, "Qstar:1-Ax:1}Mtr", {}), + "y": (EpicsMotor, "Qstar:1-Ax:2}Mtr", {}), + "z": (EpicsMotor, "Qstar:1-Ax:3}Mtr", {}), + } + ) diff --git a/tests/test_motors.py b/tests/test_motors.py index dff6a44b..2afa3ca8 100644 --- a/tests/test_motors.py +++ b/tests/test_motors.py @@ -6,33 +6,25 @@ from subprocess import PIPE, Popen import pytest +from ophyd import Device, EpicsSignal from cditools.motors import ( - BPMDM3, - BPMDM4, - FSDM2, - FSDM3, - FSHPM, - FSVPM, - IMDM2, - FltrDM1, - Gon1, - MirHPM, - MirKBh, - MirKBv, - MirVPM, - MonoDMM, - MonoHDCM, - Qstar1, - SltBCUD, - SltBCUU, - SltDM3, - SltHPM, - SltVPM, - SltWB1, - WndExit, + BCU, + DCM, + DM1, + DM2, + DM3, + DM4, + DMM, + GON, + HPM, + KB, + VPM, ) +EpicsSignal.set_defaults(timeout=20.0, connection_timeout=20.0, write_timeout=20.0) +Device.set_defaults(connection_timeout=20.0) + @pytest.fixture(scope="session") def black_hole_ioc() -> Generator[None, None, None]: @@ -62,71 +54,35 @@ def black_hole_ioc() -> Generator[None, None, None]: def test_motors_can_connect(black_hole_ioc: None) -> None: - slt_wb1 = SltWB1(prefix="XF:09IDA-OP:1{Slt:WB1", name="slt_wb1") - slt_wb1.wait_for_connection(timeout=10.0) - - fltr_dm1 = FltrDM1(prefix="XF:09IDA-OP:1{Fltr:DM1", name="fltr_dm1") - fltr_dm1.wait_for_connection(timeout=10.0) - - fsvpm = FSVPM(prefix="XF:09IDA-OP:1{FS:VPM", name="fsvpm") - fsvpm.wait_for_connection(timeout=10.0) - - fshpm = FSHPM(prefix="XF:09IDA-OP:1{FS:HPM", name="fshpm") - fshpm.wait_for_connection(timeout=10.0) - - fsdm2 = FSDM2(prefix="XF:09IDA-OP:1{FS:DM2", name="fsdm2") - fsdm2.wait_for_connection(timeout=10.0) - - mono_dmm = MonoDMM(prefix="XF:09IDA-OP:1{Mono:DMM", name="mono_dmm") - mono_dmm.wait_for_connection(timeout=10.0) - - mono_hdcm = MonoHDCM(prefix="XF:09IDA-OP:1{Mono:HDCM", name="mono_hdcm") - mono_hdcm.wait_for_connection(timeout=10.0) - - slt_vpm = SltVPM(prefix="XF:09IDA-OP:1{Slt:VPM", name="slt_vpm") - slt_vpm.wait_for_connection(timeout=10.0) - - slt_hpm = SltHPM(prefix="XF:09IDA-OP:1{Slt:HPM", name="slt_hpm") - slt_hpm.wait_for_connection(timeout=10.0) - - mir_vpm = MirVPM(prefix="XF:09IDA-OP:1{Mir:VPM", name="mir_vpm") - mir_vpm.wait_for_connection(timeout=10.0) - - imdm2 = IMDM2(prefix="XF:09IDA-OP:1{IM:DM2", name="imdm2") - imdm2.wait_for_connection(timeout=10.0) - - mir_hpm = MirHPM(prefix="XF:09IDA-OP:1{Mir:HPM", name="mir_hpm") - mir_hpm.wait_for_connection(timeout=10.0) - - slt_dm3 = SltDM3(prefix="XF:09IDB-OP:1{Slt:DM3", name="slt_dm3") - slt_dm3.wait_for_connection(timeout=10.0) + dm1 = DM1(prefix="XF:09IDA-OP:1{", name="dm1") + dm1.wait_for_connection(timeout=10.0) - bpm_dm3 = BPMDM3(prefix="XF:09IDB-OP:1{BPM:DM3", name="bpm_dm3") - bpm_dm3.wait_for_connection(timeout=10.0) + vpm = VPM(prefix="XF:09IDA-OP:1{", name="vpm") + vpm.wait_for_connection(timeout=10.0) - fsdm3 = FSDM3(prefix="XF:09IDB-OP:1{FS:DM3", name="fsdm3") - fsdm3.wait_for_connection(timeout=10.0) + hpm = HPM(prefix="XF:09IDA-OP:1{", name="hpm") + hpm.wait_for_connection(timeout=10.0) - mir_kbv = MirKBv(prefix="XF:09IDC-OP:1{Mir:KBv", name="mir_kbv") - mir_kbv.wait_for_connection(timeout=10.0) + dm2 = DM2(prefix="XF:09IDA-OP:1{", name="dm2") + dm2.wait_for_connection(timeout=10.0) - mir_kbh = MirKBh(prefix="XF:09IDC-OP:1{Mir:KBh", name="mir_kbh") - mir_kbh.wait_for_connection(timeout=10.0) + dmm = DMM(prefix="XF:09IDA-OP:1{", name="dmm") + dmm.wait_for_connection(timeout=10.0) - bpm_dm4 = BPMDM4(prefix="XF:09IDC-OP:1{BPM:DM4", name="bpm_dm4") - bpm_dm4.wait_for_connection(timeout=10.0) + dcm = DCM(prefix="XF:09IDA-OP:1{", name="dcm") + dcm.wait_for_connection(timeout=10.0) - wnd_exit = WndExit(prefix="XF:09IDC-OP:1{Wnd:Exit", name="wnd_exit") - wnd_exit.wait_for_connection(timeout=10.0) + dm3 = DM3(prefix="XF:09IDB-OP:1{", name="dm3") + dm3.wait_for_connection(timeout=10.0) - gon1 = Gon1(prefix="XF:09IDC-OP:1{Gon:1", name="gon1") - gon1.wait_for_connection(timeout=10.0) + kb = KB(prefix="XF:09IDC-OP:1{", name="kb") + kb.wait_for_connection(timeout=10.0) - slt_bcuu = SltBCUU(prefix="XF:09IDC-OP:1{Slt:BCUU", name="slt_bcuu") - slt_bcuu.wait_for_connection(timeout=10.0) + dm4 = DM4(prefix="XF:09IDC-OP:1{", name="dm4") + dm4.wait_for_connection(timeout=10.0) - slt_bcud = SltBCUD(prefix="XF:09IDC-OP:1{Slt:BCUD", name="slt_bcud") - slt_bcud.wait_for_connection(timeout=10.0) + gon = GON(prefix="XF:09IDC-OP:1{", name="gon") + gon.wait_for_connection(timeout=10.0) - qstar1 = Qstar1(prefix="XF:09IDC-OP:1{Qstar:1", name="qstar1") - qstar1.wait_for_connection(timeout=10.0) + bcu = BCU(prefix="XF:09IDC-OP:1{", name="bcu") + bcu.wait_for_connection(timeout=10.0)