From 666e6011efe26a8ea53dea6993508400fbd83fc1 Mon Sep 17 00:00:00 2001 From: Ryan Roussel Date: Thu, 26 Mar 2026 11:51:47 -0500 Subject: [PATCH 01/11] initial_commit --- virtual_accelerator/cheetah/diag0.py | 106 +++++++++++++++++++++++ virtual_accelerator/cheetah/variables.py | 33 ++++++- virtual_accelerator/models/sc_diag0.py | 8 +- 3 files changed, 137 insertions(+), 10 deletions(-) create mode 100644 virtual_accelerator/cheetah/diag0.py diff --git a/virtual_accelerator/cheetah/diag0.py b/virtual_accelerator/cheetah/diag0.py new file mode 100644 index 0000000..0f1c3f2 --- /dev/null +++ b/virtual_accelerator/cheetah/diag0.py @@ -0,0 +1,106 @@ +import os +import torch +from cheetah.accelerator import Segment, Screen +from cheetah.particles import ParticleBeam +from pathlib import Path + +from cheetah.accelerator.patch import Patch +from cheetah.accelerator.superimposed import SuperimposedElement +from cheetah.accelerator import Dipole, Quadrupole + +def get_diag0_beamline(): + # try to get LCLS_LATTICE -- returns none if not found + lcls_lattice_location = os.getenv('LCLS_LATTICE') + + # if LCLS_LATTICE not found, use the local json model + if lcls_lattice_location is None: + tracking_segment = Segment.from_lattice_json( + os.path.join(Path(__file__).parent, "sc_diag0.json") + ).subcell(start="bpmdg000") + else: + tracking_segment = Segment.from_lattice_json(f"{lcls_lattice_location}/cheetah/sc_diag0.json").subcell(start="bpmdg000") + + dyqdg001 = Patch(name = "dyqdg001", pitch = torch.tensor((0.0,9.49758257820075558E-003))) + dyqdg003 = Patch(name = "dyqdg003", pitch = torch.tensor((0.0,5.88487966838956720E-004))) + + elements = list(tracking_segment.elements) + + # get index of qdg001 + element_names = [ele.name for ele in tracking_segment.elements] + + # create SuperimposedElements for qdg001 and qdg003 + quad = tracking_segment.qdg001[0] + # In bmad this (and other elements below) are referenced twice, for us we need to multiply the length of a single use element by 2 + quad.length = quad.length * 2 + super_qdg001 = SuperimposedElement( + name="qdg001", + base_element=quad, + superimposed_element=Segment([ + dyqdg001, tracking_segment.bpmdg001 + ]) + ) + quad = tracking_segment.qdg003[0] + quad.length = quad.length * 2 + super_qdg003 = SuperimposedElement( + name="qdg003", + base_element=quad, + superimposed_element=Segment([ + dyqdg003, tracking_segment.bpmdg003 + ]) + ) + for ele in [super_qdg001, super_qdg003]: + idx = [ele.name for ele in elements].index(ele.name) + elements[idx:idx+3] = [ele] + + + # create superimposed elements for other quads containing bpms + split_quads = [2,4,5,8,9,11] + for idx in split_quads: + quad = getattr(tracking_segment, f"qdg{idx:0>3}")[0] + quad.length = quad.length * 2 + bpm = getattr(tracking_segment, f"bpmdg{idx:0>3}") + super_element = SuperimposedElement( + name=f"qdg{idx:0>3}", + base_element=quad, + superimposed_element=bpm + ) + idx = [ele.name for ele in elements].index(f"qdg{idx:0>3}") + elements[idx:idx+3] = [super_element] + + # create the superimposed element for the transverse deflecting cavity + tdc_idx = [ele.name for ele in elements].index(f"tcxdg0") + tdc = tracking_segment.tcxdg0[0] + tdc.length = tdc.length * 2.0 + tdc.num_steps = 11 + vkick = tracking_segment.ycdgtcx + xkick = tracking_segment.xcdgtcx + tdc.voltage = torch.tensor(0.0) + + super_tdc = SuperimposedElement( + name="tcxdg0", + base_element=tdc, + superimposed_element=Segment([vkick, xkick]) + ) + elements[tdc_idx:tdc_idx+4] = [super_tdc] + + tracking_segment = Segment(elements) + + # change the offset of these quads + tracking_segment.qdg001.base_element.misalignment = torch.tensor((0.0,-4.83865231890650768E-003)) + tracking_segment.qdg001.superimposed_element.misalignment = torch.tensor((0.0,-4.83865231890650768E-003)) + + tracking_segment.qdg003.base_element.misalignment = torch.tensor((0.0,-2.99813063290814820E-004)) + tracking_segment.qdg003.superimposed_element.misalignment = torch.tensor((0.0,-2.99813063290814820E-004)) + + # set screens to use kde + for ele in tracking_segment.elements: + if isinstance(ele, Screen): + ele.method = "charge_deposition" + elif isinstance(ele, Quadrupole): + ele.tracking_method = "second_order" + elif isinstance(ele, SuperimposedElement): + ele.base_element.tracking_method = "second_order" + else: + ele.tracking_method = "linear" + + return tracking_segment \ No newline at end of file diff --git a/virtual_accelerator/cheetah/variables.py b/virtual_accelerator/cheetah/variables.py index 8801069..d372749 100644 --- a/virtual_accelerator/cheetah/variables.py +++ b/virtual_accelerator/cheetah/variables.py @@ -1,5 +1,5 @@ from typing import Any -from cheetah.accelerator import Screen, Segment +from cheetah.accelerator import Screen, Segment, SuperimposedElement import warnings from lume.variables import Variable from virtual_accelerator.utils.variables import ( @@ -61,9 +61,34 @@ def get_variables_from_segment( warnings.warn(f"Element {element.name} not found in device mapping") continue - element_variables = get_variables_from_element_name( - type(element).__name__, control_name, element_attr_mapping - ) + if isinstance(element, SuperimposedElement): + element_variables = get_variables_from_element_name( + type(element.base_element).__name__, + control_name, + element_attr_mapping, + ) + + # iterate through the superimposed elements and get variables for each + for sub_element in element.superimposed_element.elements: + if type(sub_element).__name__ in ["Drift", "Marker", "Cavity"]: + continue + elif sub_element.name.upper() in device_mapping: + sub_control_name = device_mapping[sub_element.name.upper()] + else: + warnings.warn(f"Element {sub_element.name} not found in device mapping") + continue + + sub_element_variables = get_variables_from_element_name( + type(sub_element).__name__, + sub_control_name, + element_attr_mapping, + ) + element_variables.update(sub_element_variables) + + else: + element_variables = get_variables_from_element_name( + type(element).__name__, control_name, element_attr_mapping + ) # if element type is a screen then modify the output variable if isinstance(element, Screen): diff --git a/virtual_accelerator/models/sc_diag0.py b/virtual_accelerator/models/sc_diag0.py index b2992c4..0afc5c5 100644 --- a/virtual_accelerator/models/sc_diag0.py +++ b/virtual_accelerator/models/sc_diag0.py @@ -2,6 +2,7 @@ from lume_cheetah import LUMECheetahModel, CheetahSimulator from virtual_accelerator.cheetah.transformer import SLACCheetahTransformer from virtual_accelerator.cheetah.variables import get_variables_from_segment +from virtual_accelerator.cheetah.diag0 import get_diag0_beamline from virtual_accelerator.utils.variables import ( get_epics_to_name_mapping, split_control_and_observable, @@ -32,13 +33,8 @@ def get_sc_diag0_cheetah_model(): ) incoming_beam.particle_charges = torch.tensor(1.0) - # Get path to lattice files - lcls_lattice = os.environ.get("LCLS_LATTICE") - # Create lattice from file - segment = Segment.from_lattice_json( - os.path.join(lcls_lattice, "cheetah/sc_diag0.json") - ) + segment = get_diag0_beamline() # Define the simulator using lattice and particle beam simulator = CheetahSimulator( From 2cc360127f5e406bcbb4df6ceb4ef9a3f2ff3c09 Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Fri, 3 Apr 2026 13:39:55 -0700 Subject: [PATCH 02/11] ENH: Cheetah VA compatible with new element type Superimposed --- examples/cheetah_diag0_model.ipynb | 741 +++++++++++++++++++-- virtual_accelerator/cheetah/diag0.py | 86 +-- virtual_accelerator/cheetah/transformer.py | 31 +- virtual_accelerator/cheetah/utils.py | 50 +- virtual_accelerator/cheetah/variables.py | 4 +- virtual_accelerator/models/sc_diag0.py | 2 - 6 files changed, 797 insertions(+), 117 deletions(-) diff --git a/examples/cheetah_diag0_model.ipynb b/examples/cheetah_diag0_model.ipynb index ca8864a..06c72fb 100644 --- a/examples/cheetah_diag0_model.ipynb +++ b/examples/cheetah_diag0_model.ipynb @@ -2,24 +2,50 @@ "cells": [ { "cell_type": "code", - "execution_count": null, - "id": "aeb55fa2", - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "6313fc77", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'bmadx' for element tcxdg0 of type TransverseDeflectingCavity, supported methods are ['drift_kick_drift']. Keeping the previous tracking method drift_kick_drift.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element bpmdg000 of type BPM, supported methods are ['bpm']. Keeping the previous tracking method bpm.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element m1dg0 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element cntdg0 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element m2dg0 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element bpmdg0rf of type BPM, supported methods are ['bpm']. Keeping the previous tracking method bpm.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'second_order' for element tcxdg0 of type TransverseDeflectingCavity, supported methods are ['drift_kick_drift']. Keeping the previous tracking method drift_kick_drift.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element wsdg01 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element bpmdg012 of type BPM, supported methods are ['bpm']. Keeping the previous tracking method bpm.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element fcdg0du of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element enddiag0 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", + " super().__setattr__(name, value)\n", + "/sdf/home/c/cgarnier/fel_sandbox/lume_science/virtual-accelerator/virtual_accelerator/utils/variables.py:151: UserWarning: No variable configuration found for element type 'Dipole'\n", + " warnings.warn(\n", + "/sdf/home/c/cgarnier/fel_sandbox/lume_science/virtual-accelerator/virtual_accelerator/cheetah/variables.py:78: UserWarning: Element dyqdg001 not found in device mapping\n", + " warnings.warn(f\"Element {sub_element.name} not found in device mapping\")\n", + "/sdf/home/c/cgarnier/fel_sandbox/lume_science/virtual-accelerator/virtual_accelerator/cheetah/variables.py:78: UserWarning: Element dyqdg003 not found in device mapping\n", + " warnings.warn(f\"Element {sub_element.name} not found in device mapping\")\n" + ] + } + ], "source": [ "# model = get_sc_diag0_cheetah_model()\n", "import torch\n", "from virtual_accelerator.models.sc_diag0 import get_sc_diag0_cheetah_model\n", + "import matplotlib.pyplot as plt\n", "\n", "model = get_sc_diag0_cheetah_model()" ] @@ -34,10 +60,184 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "062b9f09", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'XCOR:DIAG0:178:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:178:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:190:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:190:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'YCOR:DIAG0:199:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:199:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:210:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:210:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'XCOR:DIAG0:218:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:218:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:230:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:230:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'YCOR:DIAG0:247:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:247:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'BTRM:DIAG0:260:BCTRL': TorchScalarVariable(name='BTRM:DIAG0:260:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:270:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:270:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'XCOR:DIAG0:280:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:280:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:280:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:280:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:285:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:285:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'XCOR:DIAG0:290:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:290:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:290:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:290:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:300:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:300:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'TCAV:DIAG0:11:AREQ': TorchScalarVariable(name='TCAV:DIAG0:11:AREQ', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='degrees', dtype=None),\n", + " 'TCAV:DIAG0:11:PREQ': TorchScalarVariable(name='TCAV:DIAG0:11:PREQ', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='MV', dtype=None),\n", + " 'YCOR:DIAG0:340:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:340:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:340:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:340:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:360:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:360:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:370:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:370:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'XCOR:DIAG0:380:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:380:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:380:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:380:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:390:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:390:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'OTRS:DIAG0:420:PNEUMATIC': TorchScalarVariable(name='OTRS:DIAG0:420:PNEUMATIC', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='bool', dtype=None),\n", + " 'QUAD:DIAG0:455:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:455:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'XCOR:DIAG0:460:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:460:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:460:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:460:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:470:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:470:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'OTRS:DIAG0:525:PNEUMATIC': TorchScalarVariable(name='OTRS:DIAG0:525:PNEUMATIC', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='bool', dtype=None),\n", + " 'BPMS:DIAG0:136:X': TorchScalarVariable(name='BPMS:DIAG0:136:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:136:Y': TorchScalarVariable(name='BPMS:DIAG0:136:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'XCOR:DIAG0:178:BACT': TorchScalarVariable(name='XCOR:DIAG0:178:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:178:BDES': TorchScalarVariable(name='XCOR:DIAG0:178:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:178:BMIN': TorchScalarVariable(name='XCOR:DIAG0:178:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:178:BMAX': TorchScalarVariable(name='XCOR:DIAG0:178:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:190:BACT': TorchScalarVariable(name='QUAD:DIAG0:190:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:190:BDES': TorchScalarVariable(name='QUAD:DIAG0:190:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:190:BMIN': TorchScalarVariable(name='QUAD:DIAG0:190:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:190:BMAX': TorchScalarVariable(name='QUAD:DIAG0:190:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'BPMS:DIAG0:190:X': TorchScalarVariable(name='BPMS:DIAG0:190:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:190:Y': TorchScalarVariable(name='BPMS:DIAG0:190:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'YCOR:DIAG0:199:BACT': TorchScalarVariable(name='YCOR:DIAG0:199:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:199:BDES': TorchScalarVariable(name='YCOR:DIAG0:199:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:199:BMIN': TorchScalarVariable(name='YCOR:DIAG0:199:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:199:BMAX': TorchScalarVariable(name='YCOR:DIAG0:199:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:210:BACT': TorchScalarVariable(name='QUAD:DIAG0:210:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:210:BDES': TorchScalarVariable(name='QUAD:DIAG0:210:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:210:BMIN': TorchScalarVariable(name='QUAD:DIAG0:210:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:210:BMAX': TorchScalarVariable(name='QUAD:DIAG0:210:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'BPMS:DIAG0:210:X': TorchScalarVariable(name='BPMS:DIAG0:210:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:210:Y': TorchScalarVariable(name='BPMS:DIAG0:210:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'XCOR:DIAG0:218:BACT': TorchScalarVariable(name='XCOR:DIAG0:218:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:218:BDES': TorchScalarVariable(name='XCOR:DIAG0:218:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:218:BMIN': TorchScalarVariable(name='XCOR:DIAG0:218:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:218:BMAX': TorchScalarVariable(name='XCOR:DIAG0:218:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:230:BACT': TorchScalarVariable(name='QUAD:DIAG0:230:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:230:BDES': TorchScalarVariable(name='QUAD:DIAG0:230:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:230:BMIN': TorchScalarVariable(name='QUAD:DIAG0:230:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:230:BMAX': TorchScalarVariable(name='QUAD:DIAG0:230:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'BPMS:DIAG0:230:X': TorchScalarVariable(name='BPMS:DIAG0:230:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:230:Y': TorchScalarVariable(name='BPMS:DIAG0:230:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'YCOR:DIAG0:247:BACT': TorchScalarVariable(name='YCOR:DIAG0:247:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:247:BDES': TorchScalarVariable(name='YCOR:DIAG0:247:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:247:BMIN': TorchScalarVariable(name='YCOR:DIAG0:247:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:247:BMAX': TorchScalarVariable(name='YCOR:DIAG0:247:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'BTRM:DIAG0:260:BACT': TorchScalarVariable(name='BTRM:DIAG0:260:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'BTRM:DIAG0:260:BDES': TorchScalarVariable(name='BTRM:DIAG0:260:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'BTRM:DIAG0:260:BMIN': TorchScalarVariable(name='BTRM:DIAG0:260:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'BTRM:DIAG0:260:BMAX': TorchScalarVariable(name='BTRM:DIAG0:260:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:270:BACT': TorchScalarVariable(name='QUAD:DIAG0:270:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:270:BDES': TorchScalarVariable(name='QUAD:DIAG0:270:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:270:BMIN': TorchScalarVariable(name='QUAD:DIAG0:270:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:270:BMAX': TorchScalarVariable(name='QUAD:DIAG0:270:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'BPMS:DIAG0:270:X': TorchScalarVariable(name='BPMS:DIAG0:270:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:270:Y': TorchScalarVariable(name='BPMS:DIAG0:270:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'XCOR:DIAG0:280:BACT': TorchScalarVariable(name='XCOR:DIAG0:280:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:280:BDES': TorchScalarVariable(name='XCOR:DIAG0:280:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:280:BMIN': TorchScalarVariable(name='XCOR:DIAG0:280:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:280:BMAX': TorchScalarVariable(name='XCOR:DIAG0:280:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:280:BACT': TorchScalarVariable(name='YCOR:DIAG0:280:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:280:BDES': TorchScalarVariable(name='YCOR:DIAG0:280:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:280:BMIN': TorchScalarVariable(name='YCOR:DIAG0:280:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:280:BMAX': TorchScalarVariable(name='YCOR:DIAG0:280:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:285:BACT': TorchScalarVariable(name='QUAD:DIAG0:285:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:285:BDES': TorchScalarVariable(name='QUAD:DIAG0:285:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:285:BMIN': TorchScalarVariable(name='QUAD:DIAG0:285:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:285:BMAX': TorchScalarVariable(name='QUAD:DIAG0:285:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'BPMS:DIAG0:285:X': TorchScalarVariable(name='BPMS:DIAG0:285:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:285:Y': TorchScalarVariable(name='BPMS:DIAG0:285:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'XCOR:DIAG0:290:BACT': TorchScalarVariable(name='XCOR:DIAG0:290:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:290:BDES': TorchScalarVariable(name='XCOR:DIAG0:290:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:290:BMIN': TorchScalarVariable(name='XCOR:DIAG0:290:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:290:BMAX': TorchScalarVariable(name='XCOR:DIAG0:290:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:290:BACT': TorchScalarVariable(name='YCOR:DIAG0:290:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:290:BDES': TorchScalarVariable(name='YCOR:DIAG0:290:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:290:BMIN': TorchScalarVariable(name='YCOR:DIAG0:290:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:290:BMAX': TorchScalarVariable(name='YCOR:DIAG0:290:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:300:BACT': TorchScalarVariable(name='QUAD:DIAG0:300:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:300:BDES': TorchScalarVariable(name='QUAD:DIAG0:300:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:300:BMIN': TorchScalarVariable(name='QUAD:DIAG0:300:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:300:BMAX': TorchScalarVariable(name='QUAD:DIAG0:300:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'BPMS:DIAG0:330:X': TorchScalarVariable(name='BPMS:DIAG0:330:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:330:Y': TorchScalarVariable(name='BPMS:DIAG0:330:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'YCOR:DIAG0:340:BACT': TorchScalarVariable(name='YCOR:DIAG0:340:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:340:BDES': TorchScalarVariable(name='YCOR:DIAG0:340:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:340:BMIN': TorchScalarVariable(name='YCOR:DIAG0:340:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:340:BMAX': TorchScalarVariable(name='YCOR:DIAG0:340:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:340:BACT': TorchScalarVariable(name='XCOR:DIAG0:340:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:340:BDES': TorchScalarVariable(name='XCOR:DIAG0:340:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:340:BMIN': TorchScalarVariable(name='XCOR:DIAG0:340:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:340:BMAX': TorchScalarVariable(name='XCOR:DIAG0:340:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:360:BACT': TorchScalarVariable(name='QUAD:DIAG0:360:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:360:BDES': TorchScalarVariable(name='QUAD:DIAG0:360:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:360:BMIN': TorchScalarVariable(name='QUAD:DIAG0:360:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:360:BMAX': TorchScalarVariable(name='QUAD:DIAG0:360:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:370:BACT': TorchScalarVariable(name='QUAD:DIAG0:370:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:370:BDES': TorchScalarVariable(name='QUAD:DIAG0:370:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:370:BMIN': TorchScalarVariable(name='QUAD:DIAG0:370:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:370:BMAX': TorchScalarVariable(name='QUAD:DIAG0:370:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'BPMS:DIAG0:370:X': TorchScalarVariable(name='BPMS:DIAG0:370:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:370:Y': TorchScalarVariable(name='BPMS:DIAG0:370:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'XCOR:DIAG0:380:BACT': TorchScalarVariable(name='XCOR:DIAG0:380:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:380:BDES': TorchScalarVariable(name='XCOR:DIAG0:380:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:380:BMIN': TorchScalarVariable(name='XCOR:DIAG0:380:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:380:BMAX': TorchScalarVariable(name='XCOR:DIAG0:380:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:380:BACT': TorchScalarVariable(name='YCOR:DIAG0:380:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:380:BDES': TorchScalarVariable(name='YCOR:DIAG0:380:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:380:BMIN': TorchScalarVariable(name='YCOR:DIAG0:380:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:380:BMAX': TorchScalarVariable(name='YCOR:DIAG0:380:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:390:BACT': TorchScalarVariable(name='QUAD:DIAG0:390:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:390:BDES': TorchScalarVariable(name='QUAD:DIAG0:390:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:390:BMIN': TorchScalarVariable(name='QUAD:DIAG0:390:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:390:BMAX': TorchScalarVariable(name='QUAD:DIAG0:390:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'BPMS:DIAG0:390:X': TorchScalarVariable(name='BPMS:DIAG0:390:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:390:Y': TorchScalarVariable(name='BPMS:DIAG0:390:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'OTRS:DIAG0:420:Image:ArrayData': TorchNDVariable(name='OTRS:DIAG0:420:Image:ArrayData', read_only=True, default_validation_config='none', shape=(1944, 1472), dtype=torch.float64, default_value=None, unit='pixel'),\n", + " 'OTRS:DIAG0:420:Image:ArraySize1_RBV': TorchScalarVariable(name='OTRS:DIAG0:420:Image:ArraySize1_RBV', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel', dtype=None),\n", + " 'OTRS:DIAG0:420:Image:ArraySize0_RBV': TorchScalarVariable(name='OTRS:DIAG0:420:Image:ArraySize0_RBV', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel', dtype=None),\n", + " 'OTRS:DIAG0:420:RESOLUTION': TorchScalarVariable(name='OTRS:DIAG0:420:RESOLUTION', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel/mm', dtype=None),\n", + " 'QUAD:DIAG0:455:BACT': TorchScalarVariable(name='QUAD:DIAG0:455:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:455:BDES': TorchScalarVariable(name='QUAD:DIAG0:455:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:455:BMIN': TorchScalarVariable(name='QUAD:DIAG0:455:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:455:BMAX': TorchScalarVariable(name='QUAD:DIAG0:455:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'XCOR:DIAG0:460:BACT': TorchScalarVariable(name='XCOR:DIAG0:460:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:460:BDES': TorchScalarVariable(name='XCOR:DIAG0:460:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:460:BMIN': TorchScalarVariable(name='XCOR:DIAG0:460:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'XCOR:DIAG0:460:BMAX': TorchScalarVariable(name='XCOR:DIAG0:460:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:460:BACT': TorchScalarVariable(name='YCOR:DIAG0:460:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:460:BDES': TorchScalarVariable(name='YCOR:DIAG0:460:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:460:BMIN': TorchScalarVariable(name='YCOR:DIAG0:460:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'YCOR:DIAG0:460:BMAX': TorchScalarVariable(name='YCOR:DIAG0:460:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", + " 'QUAD:DIAG0:470:BACT': TorchScalarVariable(name='QUAD:DIAG0:470:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:470:BDES': TorchScalarVariable(name='QUAD:DIAG0:470:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:470:BMIN': TorchScalarVariable(name='QUAD:DIAG0:470:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'QUAD:DIAG0:470:BMAX': TorchScalarVariable(name='QUAD:DIAG0:470:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", + " 'BPMS:DIAG0:470:X': TorchScalarVariable(name='BPMS:DIAG0:470:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:470:Y': TorchScalarVariable(name='BPMS:DIAG0:470:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:520:X': TorchScalarVariable(name='BPMS:DIAG0:520:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'BPMS:DIAG0:520:Y': TorchScalarVariable(name='BPMS:DIAG0:520:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", + " 'OTRS:DIAG0:525:Image:ArrayData': TorchNDVariable(name='OTRS:DIAG0:525:Image:ArrayData', read_only=True, default_validation_config='none', shape=(1944, 1472), dtype=torch.float64, default_value=None, unit='pixel'),\n", + " 'OTRS:DIAG0:525:Image:ArraySize1_RBV': TorchScalarVariable(name='OTRS:DIAG0:525:Image:ArraySize1_RBV', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel', dtype=None),\n", + " 'OTRS:DIAG0:525:Image:ArraySize0_RBV': TorchScalarVariable(name='OTRS:DIAG0:525:Image:ArraySize0_RBV', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel', dtype=None),\n", + " 'OTRS:DIAG0:525:RESOLUTION': TorchScalarVariable(name='OTRS:DIAG0:525:RESOLUTION', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel/mm', dtype=None)}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Get variables objects\n", "vars = list(model.supported_variables.keys())\n", @@ -46,10 +246,196 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "bb5822c2", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'XCOR:DIAG0:178:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:190:BCTRL': tensor(5.8001),\n", + " 'YCOR:DIAG0:199:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:210:BCTRL': tensor(-4.6278),\n", + " 'XCOR:DIAG0:218:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:230:BCTRL': tensor(5.8001),\n", + " 'YCOR:DIAG0:247:BCTRL': tensor(0.),\n", + " 'BTRM:DIAG0:260:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:270:BCTRL': tensor(2.8440),\n", + " 'XCOR:DIAG0:280:BCTRL': tensor(0.),\n", + " 'YCOR:DIAG0:280:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:285:BCTRL': tensor(-3.9079),\n", + " 'XCOR:DIAG0:290:BCTRL': tensor(0.),\n", + " 'YCOR:DIAG0:290:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:300:BCTRL': tensor(2.2146),\n", + " 'TCAV:DIAG0:11:AREQ': tensor(0.),\n", + " 'TCAV:DIAG0:11:PREQ': tensor(0.),\n", + " 'YCOR:DIAG0:340:BCTRL': tensor(0.),\n", + " 'XCOR:DIAG0:340:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:360:BCTRL': tensor(-1.4732),\n", + " 'QUAD:DIAG0:370:BCTRL': tensor(3.6887),\n", + " 'XCOR:DIAG0:380:BCTRL': tensor(0.),\n", + " 'YCOR:DIAG0:380:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:390:BCTRL': tensor(-3.7413),\n", + " 'OTRS:DIAG0:420:PNEUMATIC': True,\n", + " 'QUAD:DIAG0:455:BCTRL': tensor(4.2203),\n", + " 'XCOR:DIAG0:460:BCTRL': tensor(0.),\n", + " 'YCOR:DIAG0:460:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:470:BCTRL': tensor(-3.5611),\n", + " 'OTRS:DIAG0:525:PNEUMATIC': True,\n", + " 'BPMS:DIAG0:136:X': tensor(1.2964e-11),\n", + " 'BPMS:DIAG0:136:Y': tensor(1.0729e-11),\n", + " 'XCOR:DIAG0:178:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:178:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:178:BMIN': -100.0,\n", + " 'XCOR:DIAG0:178:BMAX': 100.0,\n", + " 'QUAD:DIAG0:190:BACT': tensor(5.8001),\n", + " 'QUAD:DIAG0:190:BDES': tensor(5.8001),\n", + " 'QUAD:DIAG0:190:BMIN': -100.0,\n", + " 'QUAD:DIAG0:190:BMAX': 100.0,\n", + " 'BPMS:DIAG0:190:X': tensor(8.3596e-11),\n", + " 'BPMS:DIAG0:190:Y': tensor(0.0002),\n", + " 'YCOR:DIAG0:199:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:199:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:199:BMIN': -100.0,\n", + " 'YCOR:DIAG0:199:BMAX': 100.0,\n", + " 'QUAD:DIAG0:210:BACT': tensor(-4.6278),\n", + " 'QUAD:DIAG0:210:BDES': tensor(-4.6278),\n", + " 'QUAD:DIAG0:210:BMIN': -100.0,\n", + " 'QUAD:DIAG0:210:BMAX': 100.0,\n", + " 'BPMS:DIAG0:210:X': tensor(7.5996e-12),\n", + " 'BPMS:DIAG0:210:Y': tensor(-2.1702e-08),\n", + " 'XCOR:DIAG0:218:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:218:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:218:BMIN': -100.0,\n", + " 'XCOR:DIAG0:218:BMAX': 100.0,\n", + " 'QUAD:DIAG0:230:BACT': tensor(5.8001),\n", + " 'QUAD:DIAG0:230:BDES': tensor(5.8001),\n", + " 'QUAD:DIAG0:230:BMIN': -100.0,\n", + " 'QUAD:DIAG0:230:BMAX': 100.0,\n", + " 'BPMS:DIAG0:230:X': tensor(-5.4240e-11),\n", + " 'BPMS:DIAG0:230:Y': tensor(1.4382e-05),\n", + " 'YCOR:DIAG0:247:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:247:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:247:BMIN': -100.0,\n", + " 'YCOR:DIAG0:247:BMAX': 100.0,\n", + " 'BTRM:DIAG0:260:BACT': tensor(0.),\n", + " 'BTRM:DIAG0:260:BDES': tensor(0.),\n", + " 'BTRM:DIAG0:260:BMIN': -100.0,\n", + " 'BTRM:DIAG0:260:BMAX': 100.0,\n", + " 'QUAD:DIAG0:270:BACT': tensor(2.8440),\n", + " 'QUAD:DIAG0:270:BDES': tensor(2.8440),\n", + " 'QUAD:DIAG0:270:BMIN': -100.0,\n", + " 'QUAD:DIAG0:270:BMAX': 100.0,\n", + " 'BPMS:DIAG0:270:X': tensor(2.9802e-12),\n", + " 'BPMS:DIAG0:270:Y': tensor(8.1738e-08),\n", + " 'XCOR:DIAG0:280:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:280:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:280:BMIN': -100.0,\n", + " 'XCOR:DIAG0:280:BMAX': 100.0,\n", + " 'YCOR:DIAG0:280:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:280:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:280:BMIN': -100.0,\n", + " 'YCOR:DIAG0:280:BMAX': 100.0,\n", + " 'QUAD:DIAG0:285:BACT': tensor(-3.9079),\n", + " 'QUAD:DIAG0:285:BDES': tensor(-3.9079),\n", + " 'QUAD:DIAG0:285:BMIN': -100.0,\n", + " 'QUAD:DIAG0:285:BMAX': 100.0,\n", + " 'BPMS:DIAG0:285:X': tensor(1.7881e-11),\n", + " 'BPMS:DIAG0:285:Y': tensor(1.5096e-07),\n", + " 'XCOR:DIAG0:290:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:290:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:290:BMIN': -100.0,\n", + " 'XCOR:DIAG0:290:BMAX': 100.0,\n", + " 'YCOR:DIAG0:290:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:290:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:290:BMIN': -100.0,\n", + " 'YCOR:DIAG0:290:BMAX': 100.0,\n", + " 'QUAD:DIAG0:300:BACT': tensor(2.2146),\n", + " 'QUAD:DIAG0:300:BDES': tensor(2.2146),\n", + " 'QUAD:DIAG0:300:BMIN': -100.0,\n", + " 'QUAD:DIAG0:300:BMAX': 100.0,\n", + " 'BPMS:DIAG0:330:X': tensor(7.0333e-11),\n", + " 'BPMS:DIAG0:330:Y': tensor(7.9073e-08),\n", + " 'YCOR:DIAG0:340:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:340:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:340:BMIN': -100.0,\n", + " 'YCOR:DIAG0:340:BMAX': 100.0,\n", + " 'XCOR:DIAG0:340:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:340:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:340:BMIN': -100.0,\n", + " 'XCOR:DIAG0:340:BMAX': 100.0,\n", + " 'QUAD:DIAG0:360:BACT': tensor(-1.4732),\n", + " 'QUAD:DIAG0:360:BDES': tensor(-1.4732),\n", + " 'QUAD:DIAG0:360:BMIN': -100.0,\n", + " 'QUAD:DIAG0:360:BMAX': 100.0,\n", + " 'QUAD:DIAG0:370:BACT': tensor(3.6887),\n", + " 'QUAD:DIAG0:370:BDES': tensor(3.6887),\n", + " 'QUAD:DIAG0:370:BMIN': -100.0,\n", + " 'QUAD:DIAG0:370:BMAX': 100.0,\n", + " 'BPMS:DIAG0:370:X': tensor(1.1683e-10),\n", + " 'BPMS:DIAG0:370:Y': tensor(3.7235e-08),\n", + " 'XCOR:DIAG0:380:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:380:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:380:BMIN': -100.0,\n", + " 'XCOR:DIAG0:380:BMAX': 100.0,\n", + " 'YCOR:DIAG0:380:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:380:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:380:BMIN': -100.0,\n", + " 'YCOR:DIAG0:380:BMAX': 100.0,\n", + " 'QUAD:DIAG0:390:BACT': tensor(-3.7413),\n", + " 'QUAD:DIAG0:390:BDES': tensor(-3.7413),\n", + " 'QUAD:DIAG0:390:BMIN': -100.0,\n", + " 'QUAD:DIAG0:390:BMAX': 100.0,\n", + " 'BPMS:DIAG0:390:X': tensor(5.9009e-11),\n", + " 'BPMS:DIAG0:390:Y': tensor(3.7972e-08),\n", + " 'OTRS:DIAG0:420:Image:ArrayData': tensor([[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]]),\n", + " 'OTRS:DIAG0:420:Image:ArraySize1_RBV': 1944,\n", + " 'OTRS:DIAG0:420:Image:ArraySize0_RBV': 1472,\n", + " 'OTRS:DIAG0:420:RESOLUTION': tensor(23.3000),\n", + " 'QUAD:DIAG0:455:BACT': tensor(4.2203),\n", + " 'QUAD:DIAG0:455:BDES': tensor(4.2203),\n", + " 'QUAD:DIAG0:455:BMIN': -100.0,\n", + " 'QUAD:DIAG0:455:BMAX': 100.0,\n", + " 'XCOR:DIAG0:460:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:460:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:460:BMIN': -100.0,\n", + " 'XCOR:DIAG0:460:BMAX': 100.0,\n", + " 'YCOR:DIAG0:460:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:460:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:460:BMIN': -100.0,\n", + " 'YCOR:DIAG0:460:BMAX': 100.0,\n", + " 'QUAD:DIAG0:470:BACT': tensor(-3.5611),\n", + " 'QUAD:DIAG0:470:BDES': tensor(-3.5611),\n", + " 'QUAD:DIAG0:470:BMIN': -100.0,\n", + " 'QUAD:DIAG0:470:BMAX': 100.0,\n", + " 'BPMS:DIAG0:470:X': tensor(-1.5497e-11),\n", + " 'BPMS:DIAG0:470:Y': tensor(-2.2240e-07),\n", + " 'BPMS:DIAG0:520:X': tensor(-7.0781e-11),\n", + " 'BPMS:DIAG0:520:Y': tensor(-1.0410e-08),\n", + " 'OTRS:DIAG0:525:Image:ArrayData': tensor([[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]]),\n", + " 'OTRS:DIAG0:525:Image:ArraySize1_RBV': 1944,\n", + " 'OTRS:DIAG0:525:Image:ArraySize0_RBV': 1472,\n", + " 'OTRS:DIAG0:525:RESOLUTION': tensor(17.4800)}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Get variable values\n", "model.get(vars)" @@ -57,10 +443,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "39e7298a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# get beam distribution on OTR screen\n", "info = model.get(\n", @@ -74,10 +481,196 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "7c2b3ca0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'XCOR:DIAG0:178:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:190:BCTRL': tensor(5.8001),\n", + " 'YCOR:DIAG0:199:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:210:BCTRL': tensor(-4.6278),\n", + " 'XCOR:DIAG0:218:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:230:BCTRL': tensor(5.8001),\n", + " 'YCOR:DIAG0:247:BCTRL': tensor(0.),\n", + " 'BTRM:DIAG0:260:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:270:BCTRL': tensor(2.8440),\n", + " 'XCOR:DIAG0:280:BCTRL': tensor(0.),\n", + " 'YCOR:DIAG0:280:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:285:BCTRL': tensor(-3.9079),\n", + " 'XCOR:DIAG0:290:BCTRL': tensor(0.),\n", + " 'YCOR:DIAG0:290:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:300:BCTRL': tensor(2.2146),\n", + " 'TCAV:DIAG0:11:AREQ': tensor(0.),\n", + " 'TCAV:DIAG0:11:PREQ': tensor(0.),\n", + " 'YCOR:DIAG0:340:BCTRL': tensor(0.),\n", + " 'XCOR:DIAG0:340:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:360:BCTRL': tensor(-1.4732),\n", + " 'QUAD:DIAG0:370:BCTRL': tensor(3.6887),\n", + " 'XCOR:DIAG0:380:BCTRL': tensor(0.),\n", + " 'YCOR:DIAG0:380:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:390:BCTRL': tensor(-3.7413),\n", + " 'OTRS:DIAG0:420:PNEUMATIC': True,\n", + " 'QUAD:DIAG0:455:BCTRL': tensor(4.2203),\n", + " 'XCOR:DIAG0:460:BCTRL': tensor(0.),\n", + " 'YCOR:DIAG0:460:BCTRL': tensor(0.),\n", + " 'QUAD:DIAG0:470:BCTRL': tensor(-3.5611),\n", + " 'OTRS:DIAG0:525:PNEUMATIC': True,\n", + " 'BPMS:DIAG0:136:X': tensor(1.2964e-11),\n", + " 'BPMS:DIAG0:136:Y': tensor(1.0729e-11),\n", + " 'XCOR:DIAG0:178:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:178:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:178:BMIN': -100.0,\n", + " 'XCOR:DIAG0:178:BMAX': 100.0,\n", + " 'QUAD:DIAG0:190:BACT': tensor(5.8001),\n", + " 'QUAD:DIAG0:190:BDES': tensor(5.8001),\n", + " 'QUAD:DIAG0:190:BMIN': -100.0,\n", + " 'QUAD:DIAG0:190:BMAX': 100.0,\n", + " 'BPMS:DIAG0:190:X': tensor(8.3596e-11),\n", + " 'BPMS:DIAG0:190:Y': tensor(0.0002),\n", + " 'YCOR:DIAG0:199:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:199:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:199:BMIN': -100.0,\n", + " 'YCOR:DIAG0:199:BMAX': 100.0,\n", + " 'QUAD:DIAG0:210:BACT': tensor(-4.6278),\n", + " 'QUAD:DIAG0:210:BDES': tensor(-4.6278),\n", + " 'QUAD:DIAG0:210:BMIN': -100.0,\n", + " 'QUAD:DIAG0:210:BMAX': 100.0,\n", + " 'BPMS:DIAG0:210:X': tensor(7.5996e-12),\n", + " 'BPMS:DIAG0:210:Y': tensor(-2.1702e-08),\n", + " 'XCOR:DIAG0:218:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:218:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:218:BMIN': -100.0,\n", + " 'XCOR:DIAG0:218:BMAX': 100.0,\n", + " 'QUAD:DIAG0:230:BACT': tensor(5.8001),\n", + " 'QUAD:DIAG0:230:BDES': tensor(5.8001),\n", + " 'QUAD:DIAG0:230:BMIN': -100.0,\n", + " 'QUAD:DIAG0:230:BMAX': 100.0,\n", + " 'BPMS:DIAG0:230:X': tensor(-5.4240e-11),\n", + " 'BPMS:DIAG0:230:Y': tensor(1.4382e-05),\n", + " 'YCOR:DIAG0:247:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:247:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:247:BMIN': -100.0,\n", + " 'YCOR:DIAG0:247:BMAX': 100.0,\n", + " 'BTRM:DIAG0:260:BACT': tensor(0.),\n", + " 'BTRM:DIAG0:260:BDES': tensor(0.),\n", + " 'BTRM:DIAG0:260:BMIN': -100.0,\n", + " 'BTRM:DIAG0:260:BMAX': 100.0,\n", + " 'QUAD:DIAG0:270:BACT': tensor(2.8440),\n", + " 'QUAD:DIAG0:270:BDES': tensor(2.8440),\n", + " 'QUAD:DIAG0:270:BMIN': -100.0,\n", + " 'QUAD:DIAG0:270:BMAX': 100.0,\n", + " 'BPMS:DIAG0:270:X': tensor(2.9802e-12),\n", + " 'BPMS:DIAG0:270:Y': tensor(8.1738e-08),\n", + " 'XCOR:DIAG0:280:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:280:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:280:BMIN': -100.0,\n", + " 'XCOR:DIAG0:280:BMAX': 100.0,\n", + " 'YCOR:DIAG0:280:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:280:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:280:BMIN': -100.0,\n", + " 'YCOR:DIAG0:280:BMAX': 100.0,\n", + " 'QUAD:DIAG0:285:BACT': tensor(-3.9079),\n", + " 'QUAD:DIAG0:285:BDES': tensor(-3.9079),\n", + " 'QUAD:DIAG0:285:BMIN': -100.0,\n", + " 'QUAD:DIAG0:285:BMAX': 100.0,\n", + " 'BPMS:DIAG0:285:X': tensor(1.7881e-11),\n", + " 'BPMS:DIAG0:285:Y': tensor(1.5096e-07),\n", + " 'XCOR:DIAG0:290:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:290:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:290:BMIN': -100.0,\n", + " 'XCOR:DIAG0:290:BMAX': 100.0,\n", + " 'YCOR:DIAG0:290:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:290:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:290:BMIN': -100.0,\n", + " 'YCOR:DIAG0:290:BMAX': 100.0,\n", + " 'QUAD:DIAG0:300:BACT': tensor(2.2146),\n", + " 'QUAD:DIAG0:300:BDES': tensor(2.2146),\n", + " 'QUAD:DIAG0:300:BMIN': -100.0,\n", + " 'QUAD:DIAG0:300:BMAX': 100.0,\n", + " 'BPMS:DIAG0:330:X': tensor(7.0333e-11),\n", + " 'BPMS:DIAG0:330:Y': tensor(7.9073e-08),\n", + " 'YCOR:DIAG0:340:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:340:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:340:BMIN': -100.0,\n", + " 'YCOR:DIAG0:340:BMAX': 100.0,\n", + " 'XCOR:DIAG0:340:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:340:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:340:BMIN': -100.0,\n", + " 'XCOR:DIAG0:340:BMAX': 100.0,\n", + " 'QUAD:DIAG0:360:BACT': tensor(-1.4732),\n", + " 'QUAD:DIAG0:360:BDES': tensor(-1.4732),\n", + " 'QUAD:DIAG0:360:BMIN': -100.0,\n", + " 'QUAD:DIAG0:360:BMAX': 100.0,\n", + " 'QUAD:DIAG0:370:BACT': tensor(3.6887),\n", + " 'QUAD:DIAG0:370:BDES': tensor(3.6887),\n", + " 'QUAD:DIAG0:370:BMIN': -100.0,\n", + " 'QUAD:DIAG0:370:BMAX': 100.0,\n", + " 'BPMS:DIAG0:370:X': tensor(1.1683e-10),\n", + " 'BPMS:DIAG0:370:Y': tensor(3.7235e-08),\n", + " 'XCOR:DIAG0:380:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:380:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:380:BMIN': -100.0,\n", + " 'XCOR:DIAG0:380:BMAX': 100.0,\n", + " 'YCOR:DIAG0:380:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:380:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:380:BMIN': -100.0,\n", + " 'YCOR:DIAG0:380:BMAX': 100.0,\n", + " 'QUAD:DIAG0:390:BACT': tensor(-3.7413),\n", + " 'QUAD:DIAG0:390:BDES': tensor(-3.7413),\n", + " 'QUAD:DIAG0:390:BMIN': -100.0,\n", + " 'QUAD:DIAG0:390:BMAX': 100.0,\n", + " 'BPMS:DIAG0:390:X': tensor(5.9009e-11),\n", + " 'BPMS:DIAG0:390:Y': tensor(3.7972e-08),\n", + " 'OTRS:DIAG0:420:Image:ArrayData': tensor([[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]]),\n", + " 'OTRS:DIAG0:420:Image:ArraySize1_RBV': 1944,\n", + " 'OTRS:DIAG0:420:Image:ArraySize0_RBV': 1472,\n", + " 'OTRS:DIAG0:420:RESOLUTION': tensor(23.3000),\n", + " 'QUAD:DIAG0:455:BACT': tensor(4.2203),\n", + " 'QUAD:DIAG0:455:BDES': tensor(4.2203),\n", + " 'QUAD:DIAG0:455:BMIN': -100.0,\n", + " 'QUAD:DIAG0:455:BMAX': 100.0,\n", + " 'XCOR:DIAG0:460:BACT': tensor(0.),\n", + " 'XCOR:DIAG0:460:BDES': tensor(0.),\n", + " 'XCOR:DIAG0:460:BMIN': -100.0,\n", + " 'XCOR:DIAG0:460:BMAX': 100.0,\n", + " 'YCOR:DIAG0:460:BACT': tensor(0.),\n", + " 'YCOR:DIAG0:460:BDES': tensor(0.),\n", + " 'YCOR:DIAG0:460:BMIN': -100.0,\n", + " 'YCOR:DIAG0:460:BMAX': 100.0,\n", + " 'QUAD:DIAG0:470:BACT': tensor(-3.5611),\n", + " 'QUAD:DIAG0:470:BDES': tensor(-3.5611),\n", + " 'QUAD:DIAG0:470:BMIN': -100.0,\n", + " 'QUAD:DIAG0:470:BMAX': 100.0,\n", + " 'BPMS:DIAG0:470:X': tensor(-1.5497e-11),\n", + " 'BPMS:DIAG0:470:Y': tensor(-2.2240e-07),\n", + " 'BPMS:DIAG0:520:X': tensor(-7.0781e-11),\n", + " 'BPMS:DIAG0:520:Y': tensor(-1.0410e-08),\n", + " 'OTRS:DIAG0:525:Image:ArrayData': tensor([[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]]),\n", + " 'OTRS:DIAG0:525:Image:ArraySize1_RBV': 1944,\n", + " 'OTRS:DIAG0:525:Image:ArraySize0_RBV': 1472,\n", + " 'OTRS:DIAG0:525:RESOLUTION': tensor(17.4800)}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Reset model and verify variables when back to init values\n", "model.reset()\n", @@ -94,10 +687,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "42167a81", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'QUAD:DIAG0:190:BCTRL': tensor(5.8001)}\n" + ] + }, + { + "data": { + "text/plain": [ + "SuperimposedElement(base_element=Quadrupole(name='qdg001', tracking_method='second_order', length=tensor(0.1970), k1=tensor(9.8074), misalignment=tensor([ 0.0000, -0.0048]), tilt=tensor(0.), num_steps=1), superimposed_element=Segment(elements=ModuleList(\n", + " (0): Patch(name='dyqdg001')\n", + " (1): BPM(name='bpmdg001', is_active=True)\n", + "), name='unnamed_element_1'))" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "print(model.get([\"QUAD:DIAG0:190:BCTRL\"]))\n", "getattr(model.simulator.segment, \"qdg001\")" @@ -105,10 +719,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "3af4c823", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "SuperimposedElement(base_element=Quadrupole(name='qdg001', tracking_method='second_order', length=tensor(0.1970), k1=tensor(10.1454), misalignment=tensor([ 0.0000, -0.0048]), tilt=tensor(0.), num_steps=1), superimposed_element=Segment(elements=ModuleList(\n", + " (0): Patch(name='dyqdg001')\n", + " (1): BPM(name='bpmdg001', is_active=True)\n", + "), name='unnamed_element_1'))" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "model.set({\"QUAD:DIAG0:190:BCTRL\": 6})\n", "getattr(model.simulator.segment, \"qdg001\")" @@ -116,38 +744,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "5bd2c652", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'QUAD:DIAG0:300:BCTRL': tensor(2.2146)}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "model.get([\"QUAD:DIAG0:190:BCTRL\"])" + "model.get([\"QUAD:DIAG0:300:BCTRL\"])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "b36ac3ae", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([5, 1])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/sdf/home/c/cgarnier/fel_sandbox/lume_science/virtual-accelerator/virtual_accelerator/cheetah/utils.py:121: UserWarning: The use of `x.T` on tensors of dimension other than 2 to reverse their shape is deprecated and it will throw an error in a future release. Consider `x.mT` to transpose batches of matrices or `x.permute(*torch.arange(x.ndim - 1, -1, -1))` to reverse the dimensions of a tensor. (Triggered internally at /home/task_177081042423342/croot/libtorch_1770810489933/work/aten/src/ATen/native/TensorShape.cpp:4413.)\n", + " \"Image:ArrayData\": FieldAccessor(lambda e, energy: e.reading.T * 65535),\n" + ] + } + ], "source": [ "vals = torch.tensor([-2.4370, -2, -1.6, -1.2, -0.8])\n", "vals = vals.unsqueeze(-1)\n", "print(vals.shape)\n", - "model.set({\"QUAD:HTR:120:BCTRL\": vals})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "355df5de", - "metadata": {}, - "outputs": [], - "source": [ - "vals = torch.tensor([-2.4370, -2, -1.6, -1.2, -0.8])\n", - "vals = vals.unsqueeze(-1)\n", - "print(vals.shape)\n", - "model.set({\"QUAD:HTR:120:BCTRL\": vals})" + "model.set({\"QUAD:DIAG0:300:BCTRL\": vals})" ] }, { @@ -155,9 +797,18 @@ "execution_count": null, "id": "7b9c97ba", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1944, 1472, 1, 5])\n" + ] + } + ], "source": [ - "model.get([\"OTRS:DIAG0:420:Image:ArrayData\"])" + "img = model.get([\"OTRS:DIAG0:420:Image:ArrayData\"])\n", + "print(img[\"OTRS:DIAG0:420:Image:ArrayData\"].shape)" ] }, { diff --git a/virtual_accelerator/cheetah/diag0.py b/virtual_accelerator/cheetah/diag0.py index 0f1c3f2..2370c72 100644 --- a/virtual_accelerator/cheetah/diag0.py +++ b/virtual_accelerator/cheetah/diag0.py @@ -1,16 +1,16 @@ import os import torch from cheetah.accelerator import Segment, Screen -from cheetah.particles import ParticleBeam from pathlib import Path from cheetah.accelerator.patch import Patch from cheetah.accelerator.superimposed import SuperimposedElement -from cheetah.accelerator import Dipole, Quadrupole +from cheetah.accelerator import Quadrupole + def get_diag0_beamline(): # try to get LCLS_LATTICE -- returns none if not found - lcls_lattice_location = os.getenv('LCLS_LATTICE') + lcls_lattice_location = os.getenv("LCLS_LATTICE") # if LCLS_LATTICE not found, use the local json model if lcls_lattice_location is None: @@ -18,79 +18,81 @@ def get_diag0_beamline(): os.path.join(Path(__file__).parent, "sc_diag0.json") ).subcell(start="bpmdg000") else: - tracking_segment = Segment.from_lattice_json(f"{lcls_lattice_location}/cheetah/sc_diag0.json").subcell(start="bpmdg000") - - dyqdg001 = Patch(name = "dyqdg001", pitch = torch.tensor((0.0,9.49758257820075558E-003))) - dyqdg003 = Patch(name = "dyqdg003", pitch = torch.tensor((0.0,5.88487966838956720E-004))) - + tracking_segment = Segment.from_lattice_json( + f"{lcls_lattice_location}/cheetah/sc_diag0.json" + ).subcell(start="bpmdg000") + + dyqdg001 = Patch( + name="dyqdg001", pitch=torch.tensor((0.0, 9.49758257820075558e-003)) + ) + dyqdg003 = Patch( + name="dyqdg003", pitch=torch.tensor((0.0, 5.88487966838956720e-004)) + ) + elements = list(tracking_segment.elements) - - # get index of qdg001 - element_names = [ele.name for ele in tracking_segment.elements] - + # create SuperimposedElements for qdg001 and qdg003 quad = tracking_segment.qdg001[0] # In bmad this (and other elements below) are referenced twice, for us we need to multiply the length of a single use element by 2 - quad.length = quad.length * 2 + quad.length = quad.length * 2 super_qdg001 = SuperimposedElement( name="qdg001", base_element=quad, - superimposed_element=Segment([ - dyqdg001, tracking_segment.bpmdg001 - ]) + superimposed_element=Segment([dyqdg001, tracking_segment.bpmdg001]), ) quad = tracking_segment.qdg003[0] quad.length = quad.length * 2 super_qdg003 = SuperimposedElement( name="qdg003", base_element=quad, - superimposed_element=Segment([ - dyqdg003, tracking_segment.bpmdg003 - ]) + superimposed_element=Segment([dyqdg003, tracking_segment.bpmdg003]), ) for ele in [super_qdg001, super_qdg003]: idx = [ele.name for ele in elements].index(ele.name) - elements[idx:idx+3] = [ele] - - + elements[idx : idx + 3] = [ele] + # create superimposed elements for other quads containing bpms - split_quads = [2,4,5,8,9,11] + split_quads = [2, 4, 5, 8, 9, 11] for idx in split_quads: quad = getattr(tracking_segment, f"qdg{idx:0>3}")[0] quad.length = quad.length * 2 bpm = getattr(tracking_segment, f"bpmdg{idx:0>3}") super_element = SuperimposedElement( - name=f"qdg{idx:0>3}", - base_element=quad, - superimposed_element=bpm + name=f"qdg{idx:0>3}", base_element=quad, superimposed_element=bpm ) idx = [ele.name for ele in elements].index(f"qdg{idx:0>3}") - elements[idx:idx+3] = [super_element] - + elements[idx : idx + 3] = [super_element] + # create the superimposed element for the transverse deflecting cavity - tdc_idx = [ele.name for ele in elements].index(f"tcxdg0") + tdc_idx = [ele.name for ele in elements].index("tcxdg0") tdc = tracking_segment.tcxdg0[0] tdc.length = tdc.length * 2.0 tdc.num_steps = 11 vkick = tracking_segment.ycdgtcx xkick = tracking_segment.xcdgtcx tdc.voltage = torch.tensor(0.0) - + super_tdc = SuperimposedElement( - name="tcxdg0", - base_element=tdc, - superimposed_element=Segment([vkick, xkick]) + name="tcxdg0", base_element=tdc, superimposed_element=Segment([vkick, xkick]) ) - elements[tdc_idx:tdc_idx+4] = [super_tdc] - + elements[tdc_idx : tdc_idx + 4] = [super_tdc] + tracking_segment = Segment(elements) - + # change the offset of these quads - tracking_segment.qdg001.base_element.misalignment = torch.tensor((0.0,-4.83865231890650768E-003)) - tracking_segment.qdg001.superimposed_element.misalignment = torch.tensor((0.0,-4.83865231890650768E-003)) - - tracking_segment.qdg003.base_element.misalignment = torch.tensor((0.0,-2.99813063290814820E-004)) - tracking_segment.qdg003.superimposed_element.misalignment = torch.tensor((0.0,-2.99813063290814820E-004)) + tracking_segment.qdg001.base_element.misalignment = torch.tensor( + (0.0, -4.83865231890650768e-003) + ) + tracking_segment.qdg001.superimposed_element.misalignment = torch.tensor( + (0.0, -4.83865231890650768e-003) + ) + + tracking_segment.qdg003.base_element.misalignment = torch.tensor( + (0.0, -2.99813063290814820e-004) + ) + tracking_segment.qdg003.superimposed_element.misalignment = torch.tensor( + (0.0, -2.99813063290814820e-004) + ) # set screens to use kde for ele in tracking_segment.elements: @@ -103,4 +105,4 @@ def get_diag0_beamline(): else: ele.tracking_method = "linear" - return tracking_segment \ No newline at end of file + return tracking_segment diff --git a/virtual_accelerator/cheetah/transformer.py b/virtual_accelerator/cheetah/transformer.py index 5654892..54c5a69 100644 --- a/virtual_accelerator/cheetah/transformer.py +++ b/virtual_accelerator/cheetah/transformer.py @@ -52,10 +52,18 @@ def get_cheetah_property(self, simulator, control_variable_name): f"No mapping found for control variable '{control_variable_name}'" ) - element = getattr(simulator.segment, element_name) - beam_energy_at_element = simulator.energies[element_name] - # due to getting beam energy this calc is very slow, maybe some list format should - # be passable for args. + try: + element = getattr(simulator.segment, element_name) + beam_energy_at_element = simulator.energies[element_name] + except AttributeError: + try: + flat_segment = simulator.segment.flattened() + element = getattr(flat_segment, element_name) + beam_energy_at_element = simulator.energies_flattened[element_name] + except AttributeError: + raise ValueError( + f"Element '{element_name}' not found in simulator.segment" + ) return access_cheetah_attribute(element, attribute, beam_energy_at_element) def set_cheetah_property(self, simulator, control_variable_name, value): @@ -79,9 +87,18 @@ def set_cheetah_property(self, simulator, control_variable_name, value): raise ValueError( f"No mapping found for control variable '{control_variable_name}'" ) - - element = getattr(simulator.segment, element_name) - beam_energy_at_element = simulator.energies[element_name] + try: + element = getattr(simulator.segment, element_name) + beam_energy_at_element = simulator.energies[element_name] + except AttributeError: + try: + flat_segment = simulator.segment.flattened() + element = getattr(flat_segment, element_name) + beam_energy_at_element = simulator.energies_flattened[element_name] + except AttributeError: + raise ValueError( + f"Element '{element_name}' not found in simulator.segment" + ) access_cheetah_attribute( element, attribute, beam_energy_at_element, set_value=value ) diff --git a/virtual_accelerator/cheetah/utils.py b/virtual_accelerator/cheetah/utils.py index 5f38ad3..c3d439c 100644 --- a/virtual_accelerator/cheetah/utils.py +++ b/virtual_accelerator/cheetah/utils.py @@ -2,6 +2,7 @@ import torch import os from pathlib import Path +from cheetah.accelerator.superimposed import SuperimposedElement class NoSetMethodError(Exception): @@ -135,6 +136,7 @@ def get_magnetic_rigidity(energy): "BPM": BPM_MAPPING, "Screen": SCREEN_MAPPING, "TransverseDeflectingCavity": TRANSVERSE_DEFLECTING_CAVITY_MAPPING, + "Patch": {}, } LCLS_ELEMENTS = os.path.join( @@ -143,7 +145,7 @@ def get_magnetic_rigidity(energy): ) -def handle_quadrupole_composite(elements, pv_attribute, energy, set_value): +def handle_quadrupole_composite(element, pv_attribute, energy, set_value): """ Handle composite quadrupole devices split into multiple subelements. @@ -177,23 +179,22 @@ def handle_quadrupole_composite(elements, pv_attribute, energy, set_value): torch.Tensor or float or None: Attribute value if getting, otherwise None. """ - total_length = sum(e.length for e in elements) + length = element.base_element.length - if set_value is not None and pv_attribute in {"BCTRL", "BDES"}: - new_k1 = set_value / get_magnetic_rigidity(energy) / total_length - - for e in elements: - e.k1 = new_k1 - return + if set_value is not None and pv_attribute in {"BCTRL", "BACT", "BDES"}: + new_k1 = set_value / get_magnetic_rigidity(energy) / length + element.base_element.k1 = new_k1 if pv_attribute in {"BCTRL", "BACT", "BDES"}: - return elements[0].k1 * total_length * get_magnetic_rigidity(energy) + return element.base_element.k1 * length * get_magnetic_rigidity(energy) # fallback behavior - return default_composite_handler(elements, pv_attribute, energy, set_value) + return access_cheetah_attribute( + element.base_element, pv_attribute, energy, set_value + ) -def default_composite_handler(elements, pv_attribute, energy, set_value): +def default_composite_handler(element, pv_attribute, energy, set_value): """ Default handler for composite devices. Assumes all subelements share identical attributes. @@ -221,18 +222,18 @@ def default_composite_handler(elements, pv_attribute, energy, set_value): torch.Tensor or float or None: Attribute value if getting, otherwise None. """ - + e = element.base_element if set_value is not None: - for e in elements: - access_cheetah_attribute(e, pv_attribute, energy, set_value) + access_cheetah_attribute(e, pv_attribute, energy, set_value) return - return access_cheetah_attribute(elements[0], pv_attribute, energy) + return access_cheetah_attribute(e, pv_attribute, energy) COMPOSITE_HANDLERS = { "Quadrupole": handle_quadrupole_composite, "TransverseDeflectingCavity": default_composite_handler, + "Patch": default_composite_handler, } @@ -267,12 +268,21 @@ def access_cheetah_attribute(element, pv_attribute, energy, set_value=None): # simplest case, each subelement has sub_length = length/len(sub_elements) # handling composite elements - if isinstance(element, list): - if len(element) == 0: + # handle when superimposed quad or tcav is called + # after handle when specific embedded elements are called? + + if isinstance(element, SuperimposedElement): + if len(element.superimposed_element.elements) == 0: raise ValueError("Cannot access attribute on empty element list") - element_type = type(element[0]).__name__ - if any(type(sub).__name__ != element_type for sub in element): - raise ValueError("All subelements in element list must have same type") + + element_type = type(element.base_element).__name__ + if any( + type(sub).__name__ not in MAPPINGS + for sub in element.superimposed_element.elements + ): + raise ValueError( + "All subelements in element list must have a supported element type" + ) handler = COMPOSITE_HANDLERS.get(element_type, default_composite_handler) return handler(element, pv_attribute, energy, set_value) diff --git a/virtual_accelerator/cheetah/variables.py b/virtual_accelerator/cheetah/variables.py index d372749..6d1e583 100644 --- a/virtual_accelerator/cheetah/variables.py +++ b/virtual_accelerator/cheetah/variables.py @@ -75,7 +75,9 @@ def get_variables_from_segment( elif sub_element.name.upper() in device_mapping: sub_control_name = device_mapping[sub_element.name.upper()] else: - warnings.warn(f"Element {sub_element.name} not found in device mapping") + warnings.warn( + f"Element {sub_element.name} not found in device mapping" + ) continue sub_element_variables = get_variables_from_element_name( diff --git a/virtual_accelerator/models/sc_diag0.py b/virtual_accelerator/models/sc_diag0.py index 07e3665..59169b4 100644 --- a/virtual_accelerator/models/sc_diag0.py +++ b/virtual_accelerator/models/sc_diag0.py @@ -1,4 +1,3 @@ -import os from lume_cheetah import LUMECheetahModel, CheetahSimulator from virtual_accelerator.cheetah.transformer import SLACCheetahTransformer from virtual_accelerator.cheetah.variables import get_variables_from_segment @@ -9,7 +8,6 @@ split_control_and_observable, convert_to_torch_variables, ) -from cheetah.accelerator import Segment from cheetah.particles import ParticleBeam import torch From 4f1df9613e52ab6405952b41d39895d4a99af3e8 Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Fri, 3 Apr 2026 13:48:17 -0700 Subject: [PATCH 03/11] removed explicit call to convert_to_torch_variables --- virtual_accelerator/models/sc_diag0.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/virtual_accelerator/models/sc_diag0.py b/virtual_accelerator/models/sc_diag0.py index 59169b4..903fa23 100644 --- a/virtual_accelerator/models/sc_diag0.py +++ b/virtual_accelerator/models/sc_diag0.py @@ -6,7 +6,6 @@ from virtual_accelerator.utils.variables import ( get_epics_to_name_mapping, split_control_and_observable, - convert_to_torch_variables, ) from cheetah.particles import ParticleBeam import torch @@ -60,8 +59,8 @@ def get_sc_diag0_cheetah_model(): # Get supported control system variables # for the model - variables = get_variables_from_segment(segment) - torch_variables = convert_to_torch_variables(variables) + torch_variables = get_variables_from_segment(segment) + # Define the controllable and observable variables control_variables, observable_variables = split_control_and_observable( torch_variables From 58caffccf8c56ea3f201988f45c5a477c12737f1 Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Fri, 10 Apr 2026 14:45:12 -0700 Subject: [PATCH 04/11] added conftest and cheetah inmports tests --- virtual_accelerator/tests/conftest.py | 13 +++++++ .../tests/test_cheetah_imports.py | 36 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 virtual_accelerator/tests/conftest.py create mode 100644 virtual_accelerator/tests/test_cheetah_imports.py diff --git a/virtual_accelerator/tests/conftest.py b/virtual_accelerator/tests/conftest.py new file mode 100644 index 0000000..66360a0 --- /dev/null +++ b/virtual_accelerator/tests/conftest.py @@ -0,0 +1,13 @@ +CHEETAH_SUBMODULES = ["diag0", "transformer", "utils", "variables"] + + +def pytest_configure(config): + config.addinivalue_line( + "markers", + "for_every_cheetah_module: run the test for every virtual_accelerator.cheetah submodule", + ) + + +def pytest_generate_tests(metafunc): + if metafunc.definition.get_closest_marker("for_every_cheetah_module"): + metafunc.parametrize("module_name", CHEETAH_SUBMODULES) diff --git a/virtual_accelerator/tests/test_cheetah_imports.py b/virtual_accelerator/tests/test_cheetah_imports.py new file mode 100644 index 0000000..68f14c8 --- /dev/null +++ b/virtual_accelerator/tests/test_cheetah_imports.py @@ -0,0 +1,36 @@ +import importlib +import pkgutil +from pathlib import Path + +import pytest + + +CHEETAH_SUBMODULES = ["diag0", "transformer", "utils", "variables"] + + +def test_virtual_accelerator_package_import(): + package = importlib.import_module("virtual_accelerator") + assert package is not None + assert hasattr(package, "__file__") + assert Path(package.__file__).exists() + + +def test_virtual_accelerator_cheetah_package_import(): + cheetah_pkg = importlib.import_module("virtual_accelerator.cheetah") + assert cheetah_pkg is not None + assert hasattr(cheetah_pkg, "__path__") + assert any(Path(path).exists() for path in cheetah_pkg.__path__) + + +def test_cheetah_submodules_present(): + cheetah_pkg = importlib.import_module("virtual_accelerator.cheetah") + available = {module.name for module in pkgutil.iter_modules(cheetah_pkg.__path__)} + assert set(CHEETAH_SUBMODULES).issubset(available) + + +@pytest.mark.for_every_cheetah_module +def test_cheetah_submodule_import(module_name): + module = importlib.import_module(f"virtual_accelerator.cheetah.{module_name}") + assert module.__name__.endswith(f".{module_name}") + assert hasattr(module, "__file__") + assert Path(module.__file__).exists() From 17b01b99cd32f2596f1dbf8b07caf7a257a6d638 Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Mon, 13 Apr 2026 14:32:46 -0700 Subject: [PATCH 05/11] created tests for cheetah models present and future --- virtual_accelerator/tests/conftest.py | 37 ++++++++ .../tests/test_cheetah_models.py | 93 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 virtual_accelerator/tests/test_cheetah_models.py diff --git a/virtual_accelerator/tests/conftest.py b/virtual_accelerator/tests/conftest.py index 66360a0..7051553 100644 --- a/virtual_accelerator/tests/conftest.py +++ b/virtual_accelerator/tests/conftest.py @@ -1,4 +1,29 @@ +import os +import sys + +import pytest + +sys.path.insert( + 0, + os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")), +) + +try: + from virtual_accelerator.models.cu_hxr import get_cu_hxr_cheetah_model +except ModuleNotFoundError: + get_cu_hxr_cheetah_model = None + +try: + from virtual_accelerator.models.sc_diag0 import get_sc_diag0_cheetah_model +except ModuleNotFoundError: + get_sc_diag0_cheetah_model = None + CHEETAH_SUBMODULES = ["diag0", "transformer", "utils", "variables"] +CHEETAH_MODEL_FACTORIES = [] +if get_cu_hxr_cheetah_model is not None: + CHEETAH_MODEL_FACTORIES.append(("cu_hxr", get_cu_hxr_cheetah_model)) +if get_sc_diag0_cheetah_model is not None: + CHEETAH_MODEL_FACTORIES.append(("sc_diag0", get_sc_diag0_cheetah_model)) def pytest_configure(config): @@ -6,8 +31,20 @@ def pytest_configure(config): "markers", "for_every_cheetah_module: run the test for every virtual_accelerator.cheetah submodule", ) + config.addinivalue_line( + "markers", + "for_every_cheetah_model: run the test for every Cheetah-based virtual accelerator model", + ) def pytest_generate_tests(metafunc): if metafunc.definition.get_closest_marker("for_every_cheetah_module"): metafunc.parametrize("module_name", CHEETAH_SUBMODULES) + if metafunc.definition.get_closest_marker("for_every_cheetah_model"): + if not CHEETAH_MODEL_FACTORIES: + pytest.skip("No Cheetah model factories available in this environment") + metafunc.parametrize( + "model_name,model_factory", + CHEETAH_MODEL_FACTORIES, + ids=[name for name, _ in CHEETAH_MODEL_FACTORIES], + ) diff --git a/virtual_accelerator/tests/test_cheetah_models.py b/virtual_accelerator/tests/test_cheetah_models.py new file mode 100644 index 0000000..c6b7eb3 --- /dev/null +++ b/virtual_accelerator/tests/test_cheetah_models.py @@ -0,0 +1,93 @@ +import pytest +from numbers import Number + +try: + import torch + from lume_cheetah import LUMECheetahModel +except ModuleNotFoundError as exc: + pytest.skip( + f"Skipping Cheetah model tests because dependency is missing: {exc.name}", + allow_module_level=True, + ) + + +@pytest.fixture +def cheetah_model(model_name, model_factory): + model = model_factory() + assert isinstance(model, LUMECheetahModel) + return model + + +class TestCheetahModelBasics: + @pytest.mark.for_every_cheetah_model + def test_has_variables(self, cheetah_model): + assert cheetah_model.control_variables + assert cheetah_model.observable_variables + assert cheetah_model.supported_variables + + for name in cheetah_model.control_variables: + assert name in cheetah_model.supported_variables + + for name in cheetah_model.observable_variables: + assert name in cheetah_model.supported_variables + + @pytest.mark.for_every_cheetah_model + def test_get_observable_variable(self, cheetah_model): + observable_name = next(iter(cheetah_model.observable_variables)) + output = cheetah_model.get([observable_name]) + + assert observable_name in output + assert output[observable_name] is not None + + value = output[observable_name] + if hasattr(value, "shape"): + assert value.shape is not None + + @pytest.mark.for_every_cheetah_model + def test_set_and_read_control_variable(self, cheetah_model): + control_name = next(iter(cheetah_model.control_variables)) + current_value = cheetah_model.get([control_name])[control_name] + + if isinstance(current_value, torch.Tensor): + current_value = float(current_value.item()) + elif isinstance(current_value, Number): + current_value = float(current_value) + else: + pytest.skip( + f"Skipping control variable {control_name} because its type is not numeric: {type(current_value)}" + ) + + new_value = ( + current_value + 1.0 if abs(current_value) < 1e6 else current_value * 0.9 + ) + cheetah_model.set({control_name: new_value}) + + updated_value = cheetah_model.get([control_name])[control_name] + if isinstance(updated_value, torch.Tensor): + updated_value = float(updated_value.item()) + + assert isinstance(updated_value, Number) + assert abs(updated_value - new_value) < 1e-6 + + @pytest.mark.for_every_cheetah_model + def test_reset_restores_initial_state(self, cheetah_model): + control_name = next(iter(cheetah_model.control_variables)) + original_value = cheetah_model.get([control_name])[control_name] + + if isinstance(original_value, torch.Tensor): + original_value = float(original_value.item()) + elif isinstance(original_value, Number): + original_value = float(original_value) + else: + pytest.skip( + f"Skipping reset test for control variable {control_name} because its type is not numeric: {type(original_value)}" + ) + + cheetah_model.set({control_name: original_value + 1.0}) + cheetah_model.reset() + + reset_value = cheetah_model.get([control_name])[control_name] + if isinstance(reset_value, torch.Tensor): + reset_value = float(reset_value.item()) + + assert abs(reset_value - original_value) < 1e-6 From 498854903b24fb850b4f29343a4c910ae308c7d1 Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Wed, 15 Apr 2026 09:22:50 -0700 Subject: [PATCH 06/11] BUGFIX: fixed batching returns for Screens and BPMS --- virtual_accelerator/cheetah/utils.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/virtual_accelerator/cheetah/utils.py b/virtual_accelerator/cheetah/utils.py index c3d439c..11d8de9 100644 --- a/virtual_accelerator/cheetah/utils.py +++ b/virtual_accelerator/cheetah/utils.py @@ -108,21 +108,23 @@ def get_magnetic_rigidity(energy): } BPM_MAPPING = { - "X": FieldAccessor(lambda e, energy: e.reading[0]), - "Y": FieldAccessor(lambda e, energy: e.reading[1]), - "XSCDT1H": FieldAccessor(lambda e, energy: e.reading[0]), - "YSCDT1H": FieldAccessor(lambda e, energy: e.reading[1]), + "X": FieldAccessor(lambda e, energy: e.reading[..., 0]), + "Y": FieldAccessor(lambda e, energy: e.reading[..., 1]), + "XSCDT1H": FieldAccessor(lambda e, energy: e.reading[..., 0]), + "YSCDT1H": FieldAccessor(lambda e, energy: e.reading[..., 1]), "TMIT": FieldAccessor(lambda e, energy: 1.0), } # multiply image intensity by 16 bit number range (is similar to real machine?) SCREEN_MAPPING = { - "Image:ArrayData": FieldAccessor(lambda e, energy: e.reading.T * 65535), + "Image:ArrayData": FieldAccessor( + lambda e, energy: e.reading.transpose(-2, -1) * 65535 + ), "PNEUMATIC": "is_active", "Image:ArraySize1_RBV": FieldAccessor(lambda e, energy: e.resolution[0]), "Image:ArraySize0_RBV": FieldAccessor(lambda e, energy: e.resolution[1]), "RESOLUTION": FieldAccessor(lambda e, energy: e.pixel_size[0] * 1e6), - "IMAGE": FieldAccessor(lambda e, energy: e.reading.T * 65535), + "IMAGE": FieldAccessor(lambda e, energy: e.reading.transpose(-2, -1) * 65535), "N_OF_ROW": FieldAccessor(lambda e, energy: e.resolution[0]), "N_OF_COL": FieldAccessor(lambda e, energy: e.resolution[1]), } @@ -180,6 +182,7 @@ def handle_quadrupole_composite(element, pv_attribute, energy, set_value): Attribute value if getting, otherwise None. """ length = element.base_element.length + # if length is vectorized need tests for broadcasting set_values/ length if set_value is not None and pv_attribute in {"BCTRL", "BACT", "BDES"}: new_k1 = set_value / get_magnetic_rigidity(energy) / length From 3e9f9a962ac511d63189fcb08c9d39f48a3f6925 Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Wed, 15 Apr 2026 15:20:32 -0700 Subject: [PATCH 07/11] updated example --- examples/cheetah_diag0_model.ipynb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/cheetah_diag0_model.ipynb b/examples/cheetah_diag0_model.ipynb index 06c72fb..c6921f2 100644 --- a/examples/cheetah_diag0_model.ipynb +++ b/examples/cheetah_diag0_model.ipynb @@ -817,7 +817,10 @@ "id": "0c13fd5c", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "bpm = model.get([\"BPM:DIAG0:190:X\", \"BPM:DIAG0:190:Y\"])\n", + "print(bpm)" + ] } ], "metadata": { From e344903660adefd3d7a2a78e44ac0a2570a061cd Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Wed, 15 Apr 2026 15:25:23 -0700 Subject: [PATCH 08/11] this was the example nb change... --- examples/cheetah_diag0_model.ipynb | 716 +---------------------------- 1 file changed, 22 insertions(+), 694 deletions(-) diff --git a/examples/cheetah_diag0_model.ipynb b/examples/cheetah_diag0_model.ipynb index c6921f2..1489dc7 100644 --- a/examples/cheetah_diag0_model.ipynb +++ b/examples/cheetah_diag0_model.ipynb @@ -2,45 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "6313fc77", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'bmadx' for element tcxdg0 of type TransverseDeflectingCavity, supported methods are ['drift_kick_drift']. Keeping the previous tracking method drift_kick_drift.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element bpmdg000 of type BPM, supported methods are ['bpm']. Keeping the previous tracking method bpm.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element m1dg0 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element cntdg0 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element m2dg0 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element bpmdg0rf of type BPM, supported methods are ['bpm']. Keeping the previous tracking method bpm.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'second_order' for element tcxdg0 of type TransverseDeflectingCavity, supported methods are ['drift_kick_drift']. Keeping the previous tracking method drift_kick_drift.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element wsdg01 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element bpmdg012 of type BPM, supported methods are ['bpm']. Keeping the previous tracking method bpm.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element fcdg0du of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/.conda/envs/linac-simulation/lib/python3.11/site-packages/torch/nn/modules/module.py:2041: PhysicsWarning: Invalid tracking method 'linear' for element enddiag0 of type Marker, supported methods are ['marker']. Keeping the previous tracking method marker.\n", - " super().__setattr__(name, value)\n", - "/sdf/home/c/cgarnier/fel_sandbox/lume_science/virtual-accelerator/virtual_accelerator/utils/variables.py:151: UserWarning: No variable configuration found for element type 'Dipole'\n", - " warnings.warn(\n", - "/sdf/home/c/cgarnier/fel_sandbox/lume_science/virtual-accelerator/virtual_accelerator/cheetah/variables.py:78: UserWarning: Element dyqdg001 not found in device mapping\n", - " warnings.warn(f\"Element {sub_element.name} not found in device mapping\")\n", - "/sdf/home/c/cgarnier/fel_sandbox/lume_science/virtual-accelerator/virtual_accelerator/cheetah/variables.py:78: UserWarning: Element dyqdg003 not found in device mapping\n", - " warnings.warn(f\"Element {sub_element.name} not found in device mapping\")\n" - ] - } - ], + "outputs": [], "source": [ "# model = get_sc_diag0_cheetah_model()\n", "import torch\n", @@ -60,184 +25,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "062b9f09", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'XCOR:DIAG0:178:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:178:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:190:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:190:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'YCOR:DIAG0:199:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:199:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:210:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:210:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'XCOR:DIAG0:218:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:218:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:230:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:230:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'YCOR:DIAG0:247:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:247:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'BTRM:DIAG0:260:BCTRL': TorchScalarVariable(name='BTRM:DIAG0:260:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:270:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:270:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'XCOR:DIAG0:280:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:280:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:280:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:280:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:285:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:285:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'XCOR:DIAG0:290:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:290:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:290:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:290:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:300:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:300:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'TCAV:DIAG0:11:AREQ': TorchScalarVariable(name='TCAV:DIAG0:11:AREQ', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='degrees', dtype=None),\n", - " 'TCAV:DIAG0:11:PREQ': TorchScalarVariable(name='TCAV:DIAG0:11:PREQ', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='MV', dtype=None),\n", - " 'YCOR:DIAG0:340:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:340:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:340:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:340:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:360:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:360:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:370:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:370:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'XCOR:DIAG0:380:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:380:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:380:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:380:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:390:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:390:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'OTRS:DIAG0:420:PNEUMATIC': TorchScalarVariable(name='OTRS:DIAG0:420:PNEUMATIC', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='bool', dtype=None),\n", - " 'QUAD:DIAG0:455:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:455:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'XCOR:DIAG0:460:BCTRL': TorchScalarVariable(name='XCOR:DIAG0:460:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:460:BCTRL': TorchScalarVariable(name='YCOR:DIAG0:460:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:470:BCTRL': TorchScalarVariable(name='QUAD:DIAG0:470:BCTRL', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'OTRS:DIAG0:525:PNEUMATIC': TorchScalarVariable(name='OTRS:DIAG0:525:PNEUMATIC', read_only=False, default_validation_config='none', default_value=None, value_range=None, unit='bool', dtype=None),\n", - " 'BPMS:DIAG0:136:X': TorchScalarVariable(name='BPMS:DIAG0:136:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:136:Y': TorchScalarVariable(name='BPMS:DIAG0:136:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'XCOR:DIAG0:178:BACT': TorchScalarVariable(name='XCOR:DIAG0:178:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:178:BDES': TorchScalarVariable(name='XCOR:DIAG0:178:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:178:BMIN': TorchScalarVariable(name='XCOR:DIAG0:178:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:178:BMAX': TorchScalarVariable(name='XCOR:DIAG0:178:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:190:BACT': TorchScalarVariable(name='QUAD:DIAG0:190:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:190:BDES': TorchScalarVariable(name='QUAD:DIAG0:190:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:190:BMIN': TorchScalarVariable(name='QUAD:DIAG0:190:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:190:BMAX': TorchScalarVariable(name='QUAD:DIAG0:190:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'BPMS:DIAG0:190:X': TorchScalarVariable(name='BPMS:DIAG0:190:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:190:Y': TorchScalarVariable(name='BPMS:DIAG0:190:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'YCOR:DIAG0:199:BACT': TorchScalarVariable(name='YCOR:DIAG0:199:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:199:BDES': TorchScalarVariable(name='YCOR:DIAG0:199:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:199:BMIN': TorchScalarVariable(name='YCOR:DIAG0:199:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:199:BMAX': TorchScalarVariable(name='YCOR:DIAG0:199:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:210:BACT': TorchScalarVariable(name='QUAD:DIAG0:210:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:210:BDES': TorchScalarVariable(name='QUAD:DIAG0:210:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:210:BMIN': TorchScalarVariable(name='QUAD:DIAG0:210:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:210:BMAX': TorchScalarVariable(name='QUAD:DIAG0:210:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'BPMS:DIAG0:210:X': TorchScalarVariable(name='BPMS:DIAG0:210:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:210:Y': TorchScalarVariable(name='BPMS:DIAG0:210:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'XCOR:DIAG0:218:BACT': TorchScalarVariable(name='XCOR:DIAG0:218:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:218:BDES': TorchScalarVariable(name='XCOR:DIAG0:218:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:218:BMIN': TorchScalarVariable(name='XCOR:DIAG0:218:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:218:BMAX': TorchScalarVariable(name='XCOR:DIAG0:218:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:230:BACT': TorchScalarVariable(name='QUAD:DIAG0:230:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:230:BDES': TorchScalarVariable(name='QUAD:DIAG0:230:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:230:BMIN': TorchScalarVariable(name='QUAD:DIAG0:230:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:230:BMAX': TorchScalarVariable(name='QUAD:DIAG0:230:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'BPMS:DIAG0:230:X': TorchScalarVariable(name='BPMS:DIAG0:230:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:230:Y': TorchScalarVariable(name='BPMS:DIAG0:230:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'YCOR:DIAG0:247:BACT': TorchScalarVariable(name='YCOR:DIAG0:247:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:247:BDES': TorchScalarVariable(name='YCOR:DIAG0:247:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:247:BMIN': TorchScalarVariable(name='YCOR:DIAG0:247:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:247:BMAX': TorchScalarVariable(name='YCOR:DIAG0:247:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'BTRM:DIAG0:260:BACT': TorchScalarVariable(name='BTRM:DIAG0:260:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'BTRM:DIAG0:260:BDES': TorchScalarVariable(name='BTRM:DIAG0:260:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'BTRM:DIAG0:260:BMIN': TorchScalarVariable(name='BTRM:DIAG0:260:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'BTRM:DIAG0:260:BMAX': TorchScalarVariable(name='BTRM:DIAG0:260:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:270:BACT': TorchScalarVariable(name='QUAD:DIAG0:270:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:270:BDES': TorchScalarVariable(name='QUAD:DIAG0:270:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:270:BMIN': TorchScalarVariable(name='QUAD:DIAG0:270:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:270:BMAX': TorchScalarVariable(name='QUAD:DIAG0:270:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'BPMS:DIAG0:270:X': TorchScalarVariable(name='BPMS:DIAG0:270:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:270:Y': TorchScalarVariable(name='BPMS:DIAG0:270:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'XCOR:DIAG0:280:BACT': TorchScalarVariable(name='XCOR:DIAG0:280:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:280:BDES': TorchScalarVariable(name='XCOR:DIAG0:280:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:280:BMIN': TorchScalarVariable(name='XCOR:DIAG0:280:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:280:BMAX': TorchScalarVariable(name='XCOR:DIAG0:280:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:280:BACT': TorchScalarVariable(name='YCOR:DIAG0:280:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:280:BDES': TorchScalarVariable(name='YCOR:DIAG0:280:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:280:BMIN': TorchScalarVariable(name='YCOR:DIAG0:280:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:280:BMAX': TorchScalarVariable(name='YCOR:DIAG0:280:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:285:BACT': TorchScalarVariable(name='QUAD:DIAG0:285:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:285:BDES': TorchScalarVariable(name='QUAD:DIAG0:285:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:285:BMIN': TorchScalarVariable(name='QUAD:DIAG0:285:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:285:BMAX': TorchScalarVariable(name='QUAD:DIAG0:285:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'BPMS:DIAG0:285:X': TorchScalarVariable(name='BPMS:DIAG0:285:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:285:Y': TorchScalarVariable(name='BPMS:DIAG0:285:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'XCOR:DIAG0:290:BACT': TorchScalarVariable(name='XCOR:DIAG0:290:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:290:BDES': TorchScalarVariable(name='XCOR:DIAG0:290:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:290:BMIN': TorchScalarVariable(name='XCOR:DIAG0:290:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:290:BMAX': TorchScalarVariable(name='XCOR:DIAG0:290:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:290:BACT': TorchScalarVariable(name='YCOR:DIAG0:290:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:290:BDES': TorchScalarVariable(name='YCOR:DIAG0:290:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:290:BMIN': TorchScalarVariable(name='YCOR:DIAG0:290:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:290:BMAX': TorchScalarVariable(name='YCOR:DIAG0:290:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:300:BACT': TorchScalarVariable(name='QUAD:DIAG0:300:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:300:BDES': TorchScalarVariable(name='QUAD:DIAG0:300:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:300:BMIN': TorchScalarVariable(name='QUAD:DIAG0:300:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:300:BMAX': TorchScalarVariable(name='QUAD:DIAG0:300:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'BPMS:DIAG0:330:X': TorchScalarVariable(name='BPMS:DIAG0:330:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:330:Y': TorchScalarVariable(name='BPMS:DIAG0:330:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'YCOR:DIAG0:340:BACT': TorchScalarVariable(name='YCOR:DIAG0:340:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:340:BDES': TorchScalarVariable(name='YCOR:DIAG0:340:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:340:BMIN': TorchScalarVariable(name='YCOR:DIAG0:340:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:340:BMAX': TorchScalarVariable(name='YCOR:DIAG0:340:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:340:BACT': TorchScalarVariable(name='XCOR:DIAG0:340:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:340:BDES': TorchScalarVariable(name='XCOR:DIAG0:340:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:340:BMIN': TorchScalarVariable(name='XCOR:DIAG0:340:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:340:BMAX': TorchScalarVariable(name='XCOR:DIAG0:340:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:360:BACT': TorchScalarVariable(name='QUAD:DIAG0:360:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:360:BDES': TorchScalarVariable(name='QUAD:DIAG0:360:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:360:BMIN': TorchScalarVariable(name='QUAD:DIAG0:360:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:360:BMAX': TorchScalarVariable(name='QUAD:DIAG0:360:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:370:BACT': TorchScalarVariable(name='QUAD:DIAG0:370:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:370:BDES': TorchScalarVariable(name='QUAD:DIAG0:370:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:370:BMIN': TorchScalarVariable(name='QUAD:DIAG0:370:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:370:BMAX': TorchScalarVariable(name='QUAD:DIAG0:370:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'BPMS:DIAG0:370:X': TorchScalarVariable(name='BPMS:DIAG0:370:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:370:Y': TorchScalarVariable(name='BPMS:DIAG0:370:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'XCOR:DIAG0:380:BACT': TorchScalarVariable(name='XCOR:DIAG0:380:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:380:BDES': TorchScalarVariable(name='XCOR:DIAG0:380:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:380:BMIN': TorchScalarVariable(name='XCOR:DIAG0:380:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:380:BMAX': TorchScalarVariable(name='XCOR:DIAG0:380:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:380:BACT': TorchScalarVariable(name='YCOR:DIAG0:380:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:380:BDES': TorchScalarVariable(name='YCOR:DIAG0:380:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:380:BMIN': TorchScalarVariable(name='YCOR:DIAG0:380:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:380:BMAX': TorchScalarVariable(name='YCOR:DIAG0:380:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:390:BACT': TorchScalarVariable(name='QUAD:DIAG0:390:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:390:BDES': TorchScalarVariable(name='QUAD:DIAG0:390:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:390:BMIN': TorchScalarVariable(name='QUAD:DIAG0:390:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:390:BMAX': TorchScalarVariable(name='QUAD:DIAG0:390:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'BPMS:DIAG0:390:X': TorchScalarVariable(name='BPMS:DIAG0:390:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:390:Y': TorchScalarVariable(name='BPMS:DIAG0:390:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'OTRS:DIAG0:420:Image:ArrayData': TorchNDVariable(name='OTRS:DIAG0:420:Image:ArrayData', read_only=True, default_validation_config='none', shape=(1944, 1472), dtype=torch.float64, default_value=None, unit='pixel'),\n", - " 'OTRS:DIAG0:420:Image:ArraySize1_RBV': TorchScalarVariable(name='OTRS:DIAG0:420:Image:ArraySize1_RBV', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel', dtype=None),\n", - " 'OTRS:DIAG0:420:Image:ArraySize0_RBV': TorchScalarVariable(name='OTRS:DIAG0:420:Image:ArraySize0_RBV', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel', dtype=None),\n", - " 'OTRS:DIAG0:420:RESOLUTION': TorchScalarVariable(name='OTRS:DIAG0:420:RESOLUTION', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel/mm', dtype=None),\n", - " 'QUAD:DIAG0:455:BACT': TorchScalarVariable(name='QUAD:DIAG0:455:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:455:BDES': TorchScalarVariable(name='QUAD:DIAG0:455:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:455:BMIN': TorchScalarVariable(name='QUAD:DIAG0:455:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:455:BMAX': TorchScalarVariable(name='QUAD:DIAG0:455:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'XCOR:DIAG0:460:BACT': TorchScalarVariable(name='XCOR:DIAG0:460:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:460:BDES': TorchScalarVariable(name='XCOR:DIAG0:460:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:460:BMIN': TorchScalarVariable(name='XCOR:DIAG0:460:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'XCOR:DIAG0:460:BMAX': TorchScalarVariable(name='XCOR:DIAG0:460:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:460:BACT': TorchScalarVariable(name='YCOR:DIAG0:460:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:460:BDES': TorchScalarVariable(name='YCOR:DIAG0:460:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:460:BMIN': TorchScalarVariable(name='YCOR:DIAG0:460:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'YCOR:DIAG0:460:BMAX': TorchScalarVariable(name='YCOR:DIAG0:460:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG-m', dtype=None),\n", - " 'QUAD:DIAG0:470:BACT': TorchScalarVariable(name='QUAD:DIAG0:470:BACT', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:470:BDES': TorchScalarVariable(name='QUAD:DIAG0:470:BDES', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:470:BMIN': TorchScalarVariable(name='QUAD:DIAG0:470:BMIN', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'QUAD:DIAG0:470:BMAX': TorchScalarVariable(name='QUAD:DIAG0:470:BMAX', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='kG', dtype=None),\n", - " 'BPMS:DIAG0:470:X': TorchScalarVariable(name='BPMS:DIAG0:470:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:470:Y': TorchScalarVariable(name='BPMS:DIAG0:470:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:520:X': TorchScalarVariable(name='BPMS:DIAG0:520:X', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'BPMS:DIAG0:520:Y': TorchScalarVariable(name='BPMS:DIAG0:520:Y', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='mm', dtype=None),\n", - " 'OTRS:DIAG0:525:Image:ArrayData': TorchNDVariable(name='OTRS:DIAG0:525:Image:ArrayData', read_only=True, default_validation_config='none', shape=(1944, 1472), dtype=torch.float64, default_value=None, unit='pixel'),\n", - " 'OTRS:DIAG0:525:Image:ArraySize1_RBV': TorchScalarVariable(name='OTRS:DIAG0:525:Image:ArraySize1_RBV', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel', dtype=None),\n", - " 'OTRS:DIAG0:525:Image:ArraySize0_RBV': TorchScalarVariable(name='OTRS:DIAG0:525:Image:ArraySize0_RBV', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel', dtype=None),\n", - " 'OTRS:DIAG0:525:RESOLUTION': TorchScalarVariable(name='OTRS:DIAG0:525:RESOLUTION', read_only=True, default_validation_config='none', default_value=None, value_range=None, unit='pixel/mm', dtype=None)}" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Get variables objects\n", "vars = list(model.supported_variables.keys())\n", @@ -246,196 +37,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "bb5822c2", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'XCOR:DIAG0:178:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:190:BCTRL': tensor(5.8001),\n", - " 'YCOR:DIAG0:199:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:210:BCTRL': tensor(-4.6278),\n", - " 'XCOR:DIAG0:218:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:230:BCTRL': tensor(5.8001),\n", - " 'YCOR:DIAG0:247:BCTRL': tensor(0.),\n", - " 'BTRM:DIAG0:260:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:270:BCTRL': tensor(2.8440),\n", - " 'XCOR:DIAG0:280:BCTRL': tensor(0.),\n", - " 'YCOR:DIAG0:280:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:285:BCTRL': tensor(-3.9079),\n", - " 'XCOR:DIAG0:290:BCTRL': tensor(0.),\n", - " 'YCOR:DIAG0:290:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:300:BCTRL': tensor(2.2146),\n", - " 'TCAV:DIAG0:11:AREQ': tensor(0.),\n", - " 'TCAV:DIAG0:11:PREQ': tensor(0.),\n", - " 'YCOR:DIAG0:340:BCTRL': tensor(0.),\n", - " 'XCOR:DIAG0:340:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:360:BCTRL': tensor(-1.4732),\n", - " 'QUAD:DIAG0:370:BCTRL': tensor(3.6887),\n", - " 'XCOR:DIAG0:380:BCTRL': tensor(0.),\n", - " 'YCOR:DIAG0:380:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:390:BCTRL': tensor(-3.7413),\n", - " 'OTRS:DIAG0:420:PNEUMATIC': True,\n", - " 'QUAD:DIAG0:455:BCTRL': tensor(4.2203),\n", - " 'XCOR:DIAG0:460:BCTRL': tensor(0.),\n", - " 'YCOR:DIAG0:460:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:470:BCTRL': tensor(-3.5611),\n", - " 'OTRS:DIAG0:525:PNEUMATIC': True,\n", - " 'BPMS:DIAG0:136:X': tensor(1.2964e-11),\n", - " 'BPMS:DIAG0:136:Y': tensor(1.0729e-11),\n", - " 'XCOR:DIAG0:178:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:178:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:178:BMIN': -100.0,\n", - " 'XCOR:DIAG0:178:BMAX': 100.0,\n", - " 'QUAD:DIAG0:190:BACT': tensor(5.8001),\n", - " 'QUAD:DIAG0:190:BDES': tensor(5.8001),\n", - " 'QUAD:DIAG0:190:BMIN': -100.0,\n", - " 'QUAD:DIAG0:190:BMAX': 100.0,\n", - " 'BPMS:DIAG0:190:X': tensor(8.3596e-11),\n", - " 'BPMS:DIAG0:190:Y': tensor(0.0002),\n", - " 'YCOR:DIAG0:199:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:199:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:199:BMIN': -100.0,\n", - " 'YCOR:DIAG0:199:BMAX': 100.0,\n", - " 'QUAD:DIAG0:210:BACT': tensor(-4.6278),\n", - " 'QUAD:DIAG0:210:BDES': tensor(-4.6278),\n", - " 'QUAD:DIAG0:210:BMIN': -100.0,\n", - " 'QUAD:DIAG0:210:BMAX': 100.0,\n", - " 'BPMS:DIAG0:210:X': tensor(7.5996e-12),\n", - " 'BPMS:DIAG0:210:Y': tensor(-2.1702e-08),\n", - " 'XCOR:DIAG0:218:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:218:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:218:BMIN': -100.0,\n", - " 'XCOR:DIAG0:218:BMAX': 100.0,\n", - " 'QUAD:DIAG0:230:BACT': tensor(5.8001),\n", - " 'QUAD:DIAG0:230:BDES': tensor(5.8001),\n", - " 'QUAD:DIAG0:230:BMIN': -100.0,\n", - " 'QUAD:DIAG0:230:BMAX': 100.0,\n", - " 'BPMS:DIAG0:230:X': tensor(-5.4240e-11),\n", - " 'BPMS:DIAG0:230:Y': tensor(1.4382e-05),\n", - " 'YCOR:DIAG0:247:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:247:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:247:BMIN': -100.0,\n", - " 'YCOR:DIAG0:247:BMAX': 100.0,\n", - " 'BTRM:DIAG0:260:BACT': tensor(0.),\n", - " 'BTRM:DIAG0:260:BDES': tensor(0.),\n", - " 'BTRM:DIAG0:260:BMIN': -100.0,\n", - " 'BTRM:DIAG0:260:BMAX': 100.0,\n", - " 'QUAD:DIAG0:270:BACT': tensor(2.8440),\n", - " 'QUAD:DIAG0:270:BDES': tensor(2.8440),\n", - " 'QUAD:DIAG0:270:BMIN': -100.0,\n", - " 'QUAD:DIAG0:270:BMAX': 100.0,\n", - " 'BPMS:DIAG0:270:X': tensor(2.9802e-12),\n", - " 'BPMS:DIAG0:270:Y': tensor(8.1738e-08),\n", - " 'XCOR:DIAG0:280:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:280:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:280:BMIN': -100.0,\n", - " 'XCOR:DIAG0:280:BMAX': 100.0,\n", - " 'YCOR:DIAG0:280:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:280:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:280:BMIN': -100.0,\n", - " 'YCOR:DIAG0:280:BMAX': 100.0,\n", - " 'QUAD:DIAG0:285:BACT': tensor(-3.9079),\n", - " 'QUAD:DIAG0:285:BDES': tensor(-3.9079),\n", - " 'QUAD:DIAG0:285:BMIN': -100.0,\n", - " 'QUAD:DIAG0:285:BMAX': 100.0,\n", - " 'BPMS:DIAG0:285:X': tensor(1.7881e-11),\n", - " 'BPMS:DIAG0:285:Y': tensor(1.5096e-07),\n", - " 'XCOR:DIAG0:290:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:290:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:290:BMIN': -100.0,\n", - " 'XCOR:DIAG0:290:BMAX': 100.0,\n", - " 'YCOR:DIAG0:290:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:290:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:290:BMIN': -100.0,\n", - " 'YCOR:DIAG0:290:BMAX': 100.0,\n", - " 'QUAD:DIAG0:300:BACT': tensor(2.2146),\n", - " 'QUAD:DIAG0:300:BDES': tensor(2.2146),\n", - " 'QUAD:DIAG0:300:BMIN': -100.0,\n", - " 'QUAD:DIAG0:300:BMAX': 100.0,\n", - " 'BPMS:DIAG0:330:X': tensor(7.0333e-11),\n", - " 'BPMS:DIAG0:330:Y': tensor(7.9073e-08),\n", - " 'YCOR:DIAG0:340:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:340:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:340:BMIN': -100.0,\n", - " 'YCOR:DIAG0:340:BMAX': 100.0,\n", - " 'XCOR:DIAG0:340:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:340:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:340:BMIN': -100.0,\n", - " 'XCOR:DIAG0:340:BMAX': 100.0,\n", - " 'QUAD:DIAG0:360:BACT': tensor(-1.4732),\n", - " 'QUAD:DIAG0:360:BDES': tensor(-1.4732),\n", - " 'QUAD:DIAG0:360:BMIN': -100.0,\n", - " 'QUAD:DIAG0:360:BMAX': 100.0,\n", - " 'QUAD:DIAG0:370:BACT': tensor(3.6887),\n", - " 'QUAD:DIAG0:370:BDES': tensor(3.6887),\n", - " 'QUAD:DIAG0:370:BMIN': -100.0,\n", - " 'QUAD:DIAG0:370:BMAX': 100.0,\n", - " 'BPMS:DIAG0:370:X': tensor(1.1683e-10),\n", - " 'BPMS:DIAG0:370:Y': tensor(3.7235e-08),\n", - " 'XCOR:DIAG0:380:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:380:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:380:BMIN': -100.0,\n", - " 'XCOR:DIAG0:380:BMAX': 100.0,\n", - " 'YCOR:DIAG0:380:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:380:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:380:BMIN': -100.0,\n", - " 'YCOR:DIAG0:380:BMAX': 100.0,\n", - " 'QUAD:DIAG0:390:BACT': tensor(-3.7413),\n", - " 'QUAD:DIAG0:390:BDES': tensor(-3.7413),\n", - " 'QUAD:DIAG0:390:BMIN': -100.0,\n", - " 'QUAD:DIAG0:390:BMAX': 100.0,\n", - " 'BPMS:DIAG0:390:X': tensor(5.9009e-11),\n", - " 'BPMS:DIAG0:390:Y': tensor(3.7972e-08),\n", - " 'OTRS:DIAG0:420:Image:ArrayData': tensor([[0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " ...,\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.]]),\n", - " 'OTRS:DIAG0:420:Image:ArraySize1_RBV': 1944,\n", - " 'OTRS:DIAG0:420:Image:ArraySize0_RBV': 1472,\n", - " 'OTRS:DIAG0:420:RESOLUTION': tensor(23.3000),\n", - " 'QUAD:DIAG0:455:BACT': tensor(4.2203),\n", - " 'QUAD:DIAG0:455:BDES': tensor(4.2203),\n", - " 'QUAD:DIAG0:455:BMIN': -100.0,\n", - " 'QUAD:DIAG0:455:BMAX': 100.0,\n", - " 'XCOR:DIAG0:460:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:460:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:460:BMIN': -100.0,\n", - " 'XCOR:DIAG0:460:BMAX': 100.0,\n", - " 'YCOR:DIAG0:460:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:460:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:460:BMIN': -100.0,\n", - " 'YCOR:DIAG0:460:BMAX': 100.0,\n", - " 'QUAD:DIAG0:470:BACT': tensor(-3.5611),\n", - " 'QUAD:DIAG0:470:BDES': tensor(-3.5611),\n", - " 'QUAD:DIAG0:470:BMIN': -100.0,\n", - " 'QUAD:DIAG0:470:BMAX': 100.0,\n", - " 'BPMS:DIAG0:470:X': tensor(-1.5497e-11),\n", - " 'BPMS:DIAG0:470:Y': tensor(-2.2240e-07),\n", - " 'BPMS:DIAG0:520:X': tensor(-7.0781e-11),\n", - " 'BPMS:DIAG0:520:Y': tensor(-1.0410e-08),\n", - " 'OTRS:DIAG0:525:Image:ArrayData': tensor([[0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " ...,\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.]]),\n", - " 'OTRS:DIAG0:525:Image:ArraySize1_RBV': 1944,\n", - " 'OTRS:DIAG0:525:Image:ArraySize0_RBV': 1472,\n", - " 'OTRS:DIAG0:525:RESOLUTION': tensor(17.4800)}" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Get variable values\n", "model.get(vars)" @@ -443,31 +48,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "39e7298a", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# get beam distribution on OTR screen\n", "info = model.get(\n", @@ -481,196 +65,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "7c2b3ca0", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'XCOR:DIAG0:178:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:190:BCTRL': tensor(5.8001),\n", - " 'YCOR:DIAG0:199:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:210:BCTRL': tensor(-4.6278),\n", - " 'XCOR:DIAG0:218:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:230:BCTRL': tensor(5.8001),\n", - " 'YCOR:DIAG0:247:BCTRL': tensor(0.),\n", - " 'BTRM:DIAG0:260:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:270:BCTRL': tensor(2.8440),\n", - " 'XCOR:DIAG0:280:BCTRL': tensor(0.),\n", - " 'YCOR:DIAG0:280:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:285:BCTRL': tensor(-3.9079),\n", - " 'XCOR:DIAG0:290:BCTRL': tensor(0.),\n", - " 'YCOR:DIAG0:290:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:300:BCTRL': tensor(2.2146),\n", - " 'TCAV:DIAG0:11:AREQ': tensor(0.),\n", - " 'TCAV:DIAG0:11:PREQ': tensor(0.),\n", - " 'YCOR:DIAG0:340:BCTRL': tensor(0.),\n", - " 'XCOR:DIAG0:340:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:360:BCTRL': tensor(-1.4732),\n", - " 'QUAD:DIAG0:370:BCTRL': tensor(3.6887),\n", - " 'XCOR:DIAG0:380:BCTRL': tensor(0.),\n", - " 'YCOR:DIAG0:380:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:390:BCTRL': tensor(-3.7413),\n", - " 'OTRS:DIAG0:420:PNEUMATIC': True,\n", - " 'QUAD:DIAG0:455:BCTRL': tensor(4.2203),\n", - " 'XCOR:DIAG0:460:BCTRL': tensor(0.),\n", - " 'YCOR:DIAG0:460:BCTRL': tensor(0.),\n", - " 'QUAD:DIAG0:470:BCTRL': tensor(-3.5611),\n", - " 'OTRS:DIAG0:525:PNEUMATIC': True,\n", - " 'BPMS:DIAG0:136:X': tensor(1.2964e-11),\n", - " 'BPMS:DIAG0:136:Y': tensor(1.0729e-11),\n", - " 'XCOR:DIAG0:178:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:178:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:178:BMIN': -100.0,\n", - " 'XCOR:DIAG0:178:BMAX': 100.0,\n", - " 'QUAD:DIAG0:190:BACT': tensor(5.8001),\n", - " 'QUAD:DIAG0:190:BDES': tensor(5.8001),\n", - " 'QUAD:DIAG0:190:BMIN': -100.0,\n", - " 'QUAD:DIAG0:190:BMAX': 100.0,\n", - " 'BPMS:DIAG0:190:X': tensor(8.3596e-11),\n", - " 'BPMS:DIAG0:190:Y': tensor(0.0002),\n", - " 'YCOR:DIAG0:199:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:199:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:199:BMIN': -100.0,\n", - " 'YCOR:DIAG0:199:BMAX': 100.0,\n", - " 'QUAD:DIAG0:210:BACT': tensor(-4.6278),\n", - " 'QUAD:DIAG0:210:BDES': tensor(-4.6278),\n", - " 'QUAD:DIAG0:210:BMIN': -100.0,\n", - " 'QUAD:DIAG0:210:BMAX': 100.0,\n", - " 'BPMS:DIAG0:210:X': tensor(7.5996e-12),\n", - " 'BPMS:DIAG0:210:Y': tensor(-2.1702e-08),\n", - " 'XCOR:DIAG0:218:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:218:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:218:BMIN': -100.0,\n", - " 'XCOR:DIAG0:218:BMAX': 100.0,\n", - " 'QUAD:DIAG0:230:BACT': tensor(5.8001),\n", - " 'QUAD:DIAG0:230:BDES': tensor(5.8001),\n", - " 'QUAD:DIAG0:230:BMIN': -100.0,\n", - " 'QUAD:DIAG0:230:BMAX': 100.0,\n", - " 'BPMS:DIAG0:230:X': tensor(-5.4240e-11),\n", - " 'BPMS:DIAG0:230:Y': tensor(1.4382e-05),\n", - " 'YCOR:DIAG0:247:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:247:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:247:BMIN': -100.0,\n", - " 'YCOR:DIAG0:247:BMAX': 100.0,\n", - " 'BTRM:DIAG0:260:BACT': tensor(0.),\n", - " 'BTRM:DIAG0:260:BDES': tensor(0.),\n", - " 'BTRM:DIAG0:260:BMIN': -100.0,\n", - " 'BTRM:DIAG0:260:BMAX': 100.0,\n", - " 'QUAD:DIAG0:270:BACT': tensor(2.8440),\n", - " 'QUAD:DIAG0:270:BDES': tensor(2.8440),\n", - " 'QUAD:DIAG0:270:BMIN': -100.0,\n", - " 'QUAD:DIAG0:270:BMAX': 100.0,\n", - " 'BPMS:DIAG0:270:X': tensor(2.9802e-12),\n", - " 'BPMS:DIAG0:270:Y': tensor(8.1738e-08),\n", - " 'XCOR:DIAG0:280:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:280:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:280:BMIN': -100.0,\n", - " 'XCOR:DIAG0:280:BMAX': 100.0,\n", - " 'YCOR:DIAG0:280:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:280:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:280:BMIN': -100.0,\n", - " 'YCOR:DIAG0:280:BMAX': 100.0,\n", - " 'QUAD:DIAG0:285:BACT': tensor(-3.9079),\n", - " 'QUAD:DIAG0:285:BDES': tensor(-3.9079),\n", - " 'QUAD:DIAG0:285:BMIN': -100.0,\n", - " 'QUAD:DIAG0:285:BMAX': 100.0,\n", - " 'BPMS:DIAG0:285:X': tensor(1.7881e-11),\n", - " 'BPMS:DIAG0:285:Y': tensor(1.5096e-07),\n", - " 'XCOR:DIAG0:290:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:290:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:290:BMIN': -100.0,\n", - " 'XCOR:DIAG0:290:BMAX': 100.0,\n", - " 'YCOR:DIAG0:290:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:290:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:290:BMIN': -100.0,\n", - " 'YCOR:DIAG0:290:BMAX': 100.0,\n", - " 'QUAD:DIAG0:300:BACT': tensor(2.2146),\n", - " 'QUAD:DIAG0:300:BDES': tensor(2.2146),\n", - " 'QUAD:DIAG0:300:BMIN': -100.0,\n", - " 'QUAD:DIAG0:300:BMAX': 100.0,\n", - " 'BPMS:DIAG0:330:X': tensor(7.0333e-11),\n", - " 'BPMS:DIAG0:330:Y': tensor(7.9073e-08),\n", - " 'YCOR:DIAG0:340:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:340:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:340:BMIN': -100.0,\n", - " 'YCOR:DIAG0:340:BMAX': 100.0,\n", - " 'XCOR:DIAG0:340:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:340:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:340:BMIN': -100.0,\n", - " 'XCOR:DIAG0:340:BMAX': 100.0,\n", - " 'QUAD:DIAG0:360:BACT': tensor(-1.4732),\n", - " 'QUAD:DIAG0:360:BDES': tensor(-1.4732),\n", - " 'QUAD:DIAG0:360:BMIN': -100.0,\n", - " 'QUAD:DIAG0:360:BMAX': 100.0,\n", - " 'QUAD:DIAG0:370:BACT': tensor(3.6887),\n", - " 'QUAD:DIAG0:370:BDES': tensor(3.6887),\n", - " 'QUAD:DIAG0:370:BMIN': -100.0,\n", - " 'QUAD:DIAG0:370:BMAX': 100.0,\n", - " 'BPMS:DIAG0:370:X': tensor(1.1683e-10),\n", - " 'BPMS:DIAG0:370:Y': tensor(3.7235e-08),\n", - " 'XCOR:DIAG0:380:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:380:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:380:BMIN': -100.0,\n", - " 'XCOR:DIAG0:380:BMAX': 100.0,\n", - " 'YCOR:DIAG0:380:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:380:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:380:BMIN': -100.0,\n", - " 'YCOR:DIAG0:380:BMAX': 100.0,\n", - " 'QUAD:DIAG0:390:BACT': tensor(-3.7413),\n", - " 'QUAD:DIAG0:390:BDES': tensor(-3.7413),\n", - " 'QUAD:DIAG0:390:BMIN': -100.0,\n", - " 'QUAD:DIAG0:390:BMAX': 100.0,\n", - " 'BPMS:DIAG0:390:X': tensor(5.9009e-11),\n", - " 'BPMS:DIAG0:390:Y': tensor(3.7972e-08),\n", - " 'OTRS:DIAG0:420:Image:ArrayData': tensor([[0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " ...,\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.]]),\n", - " 'OTRS:DIAG0:420:Image:ArraySize1_RBV': 1944,\n", - " 'OTRS:DIAG0:420:Image:ArraySize0_RBV': 1472,\n", - " 'OTRS:DIAG0:420:RESOLUTION': tensor(23.3000),\n", - " 'QUAD:DIAG0:455:BACT': tensor(4.2203),\n", - " 'QUAD:DIAG0:455:BDES': tensor(4.2203),\n", - " 'QUAD:DIAG0:455:BMIN': -100.0,\n", - " 'QUAD:DIAG0:455:BMAX': 100.0,\n", - " 'XCOR:DIAG0:460:BACT': tensor(0.),\n", - " 'XCOR:DIAG0:460:BDES': tensor(0.),\n", - " 'XCOR:DIAG0:460:BMIN': -100.0,\n", - " 'XCOR:DIAG0:460:BMAX': 100.0,\n", - " 'YCOR:DIAG0:460:BACT': tensor(0.),\n", - " 'YCOR:DIAG0:460:BDES': tensor(0.),\n", - " 'YCOR:DIAG0:460:BMIN': -100.0,\n", - " 'YCOR:DIAG0:460:BMAX': 100.0,\n", - " 'QUAD:DIAG0:470:BACT': tensor(-3.5611),\n", - " 'QUAD:DIAG0:470:BDES': tensor(-3.5611),\n", - " 'QUAD:DIAG0:470:BMIN': -100.0,\n", - " 'QUAD:DIAG0:470:BMAX': 100.0,\n", - " 'BPMS:DIAG0:470:X': tensor(-1.5497e-11),\n", - " 'BPMS:DIAG0:470:Y': tensor(-2.2240e-07),\n", - " 'BPMS:DIAG0:520:X': tensor(-7.0781e-11),\n", - " 'BPMS:DIAG0:520:Y': tensor(-1.0410e-08),\n", - " 'OTRS:DIAG0:525:Image:ArrayData': tensor([[0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " ...,\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.],\n", - " [0., 0., 0., ..., 0., 0., 0.]]),\n", - " 'OTRS:DIAG0:525:Image:ArraySize1_RBV': 1944,\n", - " 'OTRS:DIAG0:525:Image:ArraySize0_RBV': 1472,\n", - " 'OTRS:DIAG0:525:RESOLUTION': tensor(17.4800)}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Reset model and verify variables when back to init values\n", "model.reset()\n", @@ -687,31 +85,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "42167a81", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'QUAD:DIAG0:190:BCTRL': tensor(5.8001)}\n" - ] - }, - { - "data": { - "text/plain": [ - "SuperimposedElement(base_element=Quadrupole(name='qdg001', tracking_method='second_order', length=tensor(0.1970), k1=tensor(9.8074), misalignment=tensor([ 0.0000, -0.0048]), tilt=tensor(0.), num_steps=1), superimposed_element=Segment(elements=ModuleList(\n", - " (0): Patch(name='dyqdg001')\n", - " (1): BPM(name='bpmdg001', is_active=True)\n", - "), name='unnamed_element_1'))" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "print(model.get([\"QUAD:DIAG0:190:BCTRL\"]))\n", "getattr(model.simulator.segment, \"qdg001\")" @@ -719,24 +96,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "3af4c823", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "SuperimposedElement(base_element=Quadrupole(name='qdg001', tracking_method='second_order', length=tensor(0.1970), k1=tensor(10.1454), misalignment=tensor([ 0.0000, -0.0048]), tilt=tensor(0.), num_steps=1), superimposed_element=Segment(elements=ModuleList(\n", - " (0): Patch(name='dyqdg001')\n", - " (1): BPM(name='bpmdg001', is_active=True)\n", - "), name='unnamed_element_1'))" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "model.set({\"QUAD:DIAG0:190:BCTRL\": 6})\n", "getattr(model.simulator.segment, \"qdg001\")" @@ -744,52 +107,25 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "5bd2c652", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'QUAD:DIAG0:300:BCTRL': tensor(2.2146)}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "model.get([\"QUAD:DIAG0:300:BCTRL\"])" + "model.get([\"QUAD:DIAG0:199:BCTRL\"])" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "b36ac3ae", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([5, 1])\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/sdf/home/c/cgarnier/fel_sandbox/lume_science/virtual-accelerator/virtual_accelerator/cheetah/utils.py:121: UserWarning: The use of `x.T` on tensors of dimension other than 2 to reverse their shape is deprecated and it will throw an error in a future release. Consider `x.mT` to transpose batches of matrices or `x.permute(*torch.arange(x.ndim - 1, -1, -1))` to reverse the dimensions of a tensor. (Triggered internally at /home/task_177081042423342/croot/libtorch_1770810489933/work/aten/src/ATen/native/TensorShape.cpp:4413.)\n", - " \"Image:ArrayData\": FieldAccessor(lambda e, energy: e.reading.T * 65535),\n" - ] - } - ], + "outputs": [], "source": [ "vals = torch.tensor([-2.4370, -2, -1.6, -1.2, -0.8])\n", "vals = vals.unsqueeze(-1)\n", "print(vals.shape)\n", - "model.set({\"QUAD:DIAG0:300:BCTRL\": vals})" + "model.set({\"QUAD:DIAG0:190:BCTRL\": vals})" ] }, { @@ -797,15 +133,7 @@ "execution_count": null, "id": "7b9c97ba", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([1944, 1472, 1, 5])\n" - ] - } - ], + "outputs": [], "source": [ "img = model.get([\"OTRS:DIAG0:420:Image:ArrayData\"])\n", "print(img[\"OTRS:DIAG0:420:Image:ArrayData\"].shape)" @@ -818,7 +146,7 @@ "metadata": {}, "outputs": [], "source": [ - "bpm = model.get([\"BPM:DIAG0:190:X\", \"BPM:DIAG0:190:Y\"])\n", + "bpm = model.get([\"BPMS:DIAG0:190:X\", \"BPMS:DIAG0:190:Y\"])\n", "print(bpm)" ] } From a38f314cd8a6b492f76001f067417b35776fba82 Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Wed, 6 May 2026 16:19:34 -0700 Subject: [PATCH 09/11] added DIAG0 BSA BPM pvs --- virtual_accelerator/utils/slac_variable_config.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/virtual_accelerator/utils/slac_variable_config.yaml b/virtual_accelerator/utils/slac_variable_config.yaml index e55c0ed..69aea2c 100644 --- a/virtual_accelerator/utils/slac_variable_config.yaml +++ b/virtual_accelerator/utils/slac_variable_config.yaml @@ -8,6 +8,16 @@ BPM: unit: mm read_only: true variable_class: ScalarVariable + XSCDTH: + unit: mm + read_only: true + variable_class: ScalarVariable + default_value: NULL + YSCDTH: + unit: mm + read_only: true + variable_class: ScalarVariable + Quadrupole: BCTRL: From 19ff2e4c7fe08254ccb16fefb6fa4b30bce98087 Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Thu, 7 May 2026 11:10:44 -0700 Subject: [PATCH 10/11] fixed example/cheetah_diag0_model.ipynb --- examples/cheetah_diag0_model.ipynb | 14 +++++++++++--- virtual_accelerator/cheetah/utils.py | 2 ++ virtual_accelerator/cheetah/variables.py | 2 +- virtual_accelerator/models/sc_diag0.py | 3 ++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/examples/cheetah_diag0_model.ipynb b/examples/cheetah_diag0_model.ipynb index 1489dc7..7e3b5e7 100644 --- a/examples/cheetah_diag0_model.ipynb +++ b/examples/cheetah_diag0_model.ipynb @@ -112,7 +112,7 @@ "metadata": {}, "outputs": [], "source": [ - "model.get([\"QUAD:DIAG0:199:BCTRL\"])" + "model.get([\"QUAD:DIAG0:190:BCTRL\"])" ] }, { @@ -146,14 +146,22 @@ "metadata": {}, "outputs": [], "source": [ - "bpm = model.get([\"BPMS:DIAG0:190:X\", \"BPMS:DIAG0:190:Y\"])\n", + "bpm = model.get([\"BPMS:DIAG0:190:XSCDTH\", \"BPMS:DIAG0:190:YSCDTH\"])\n", "print(bpm)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eda3eb11", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "linac-simulation", "language": "python", "name": "python3" }, diff --git a/virtual_accelerator/cheetah/utils.py b/virtual_accelerator/cheetah/utils.py index 11d8de9..7822273 100644 --- a/virtual_accelerator/cheetah/utils.py +++ b/virtual_accelerator/cheetah/utils.py @@ -112,6 +112,8 @@ def get_magnetic_rigidity(energy): "Y": FieldAccessor(lambda e, energy: e.reading[..., 1]), "XSCDT1H": FieldAccessor(lambda e, energy: e.reading[..., 0]), "YSCDT1H": FieldAccessor(lambda e, energy: e.reading[..., 1]), + "XSCDTH": FieldAccessor(lambda e, energy: e.reading[..., 0]), + "YSCDTH": FieldAccessor(lambda e, energy: e.reading[..., 1]), "TMIT": FieldAccessor(lambda e, energy: 1.0), } diff --git a/virtual_accelerator/cheetah/variables.py b/virtual_accelerator/cheetah/variables.py index f1ccd2b..929385b 100644 --- a/virtual_accelerator/cheetah/variables.py +++ b/virtual_accelerator/cheetah/variables.py @@ -46,7 +46,7 @@ def get_variables_from_segment( See `get_variables_from_element_name` for details on the specification of `element_attr_mapping`. """ - from cheetah.accelerator import Screen + from cheetah.accelerator import Screen, SuperimposedElement all_variables = {} element_attr_mapping = element_attr_mapping or get_element_attr_mapping() diff --git a/virtual_accelerator/models/sc_diag0.py b/virtual_accelerator/models/sc_diag0.py index 8d2d4ae..c7a2832 100644 --- a/virtual_accelerator/models/sc_diag0.py +++ b/virtual_accelerator/models/sc_diag0.py @@ -37,10 +37,10 @@ def get_sc_diag0_cheetah_model(): ) from lume_cheetah import LUMECheetahModel, CheetahSimulator - from cheetah.accelerator import Segment from cheetah.particles import ParticleBeam from virtual_accelerator.cheetah.transformer import SLACCheetahTransformer from virtual_accelerator.cheetah.variables import get_variables_from_segment + from virtual_accelerator.cheetah.diag0 import get_diag0_beamline import torch incoming_beam = ParticleBeam.from_twiss( @@ -53,6 +53,7 @@ def get_sc_diag0_cheetah_model(): energy=torch.tensor(90e6), ) incoming_beam.particle_charges = torch.tensor(1.0) + lcls_lattice = os.environ.get("LCLS_LATTICE") # Create lattice from file segment = get_diag0_beamline() From 1ac50ddf3bd94be554b0704fe356d94bad727297 Mon Sep 17 00:00:00 2001 From: Chris Garnier Date: Mon, 15 Jun 2026 09:13:17 -0700 Subject: [PATCH 11/11] commiting previous work --- virtual_accelerator/cheetah/diag0.py | 2 +- virtual_accelerator/cheetah/utils.py | 81 +++++++++++++++++++++----- virtual_accelerator/models/sc_diag0.py | 1 - virtual_accelerator/utils/variables.py | 2 +- 4 files changed, 68 insertions(+), 18 deletions(-) diff --git a/virtual_accelerator/cheetah/diag0.py b/virtual_accelerator/cheetah/diag0.py index 2370c72..a5c9573 100644 --- a/virtual_accelerator/cheetah/diag0.py +++ b/virtual_accelerator/cheetah/diag0.py @@ -102,7 +102,7 @@ def get_diag0_beamline(): ele.tracking_method = "second_order" elif isinstance(ele, SuperimposedElement): ele.base_element.tracking_method = "second_order" - else: + elif hasattr(ele, "supported_tracking_methods"): ele.tracking_method = "linear" return tracking_segment diff --git a/virtual_accelerator/cheetah/utils.py b/virtual_accelerator/cheetah/utils.py index 7822273..5e370b3 100644 --- a/virtual_accelerator/cheetah/utils.py +++ b/virtual_accelerator/cheetah/utils.py @@ -93,10 +93,17 @@ def get_magnetic_rigidity(energy): "BCON": FieldAccessor(lambda e, energy: 1.0), "BDES": FieldAccessor(lambda e, energy: e.angle * get_magnetic_rigidity(energy)), } +# check set_cheetah_value works then update othe setattrs TRANSVERSE_DEFLECTING_CAVITY_MAPPING = { - "AREQ": "voltage", - "PREQ": "phase", + "AREQ": FieldAccessor( + lambda e, energy: e.voltage / 1e6, + lambda e, energy, v: set_cheetah_value(e, "voltage", v * 1e6), + ), + "PREQ": FieldAccessor( + lambda e, energy: e.phase * (360 / (2 * torch.pi)), + lambda e, energy, p: setattr(e, "phase", p * (2 * torch.pi) / 360), + ), "AFBENB": FieldAccessor(lambda e, energy: 0.0), "AFBST": FieldAccessor(lambda e, energy: 0.0), "AMPL_W0CH0": FieldAccessor(lambda e, energy: 0.0), @@ -108,12 +115,24 @@ def get_magnetic_rigidity(energy): } BPM_MAPPING = { - "X": FieldAccessor(lambda e, energy: e.reading[..., 0]), - "Y": FieldAccessor(lambda e, energy: e.reading[..., 1]), - "XSCDT1H": FieldAccessor(lambda e, energy: e.reading[..., 0]), - "YSCDT1H": FieldAccessor(lambda e, energy: e.reading[..., 1]), - "XSCDTH": FieldAccessor(lambda e, energy: e.reading[..., 0]), - "YSCDTH": FieldAccessor(lambda e, energy: e.reading[..., 1]), + "X": FieldAccessor( + lambda e, energy: e.reading[..., 0] * 1000 + ), # convert from m to mm + "Y": FieldAccessor( + lambda e, energy: e.reading[..., 1] * 1000 + ), # convert from m to mm + "XSCDT1H": FieldAccessor( + lambda e, energy: e.reading[..., 0] * 1000 + ), # convert from m to mm + "YSCDT1H": FieldAccessor( + lambda e, energy: e.reading[..., 1] * 1000 + ), # convert from m to mm + "XSCDTH": FieldAccessor( + lambda e, energy: e.reading[..., 0] * 1000 + ), # convert from m to mm + "YSCDTH": FieldAccessor( + lambda e, energy: e.reading[..., 1] * 1000 + ), # convert from m to mm "TMIT": FieldAccessor(lambda e, energy: 1.0), } @@ -269,13 +288,9 @@ def access_cheetah_attribute(element, pv_attribute, energy, set_value=None): value: The corresponding Cheetah attribute value if `set_value` is None, otherwise sets the value and returns None. """ - # implementing fix for quads, will rethink for tcavs - # simplest case, each subelement has sub_length = length/len(sub_elements) - # handling composite elements - - # handle when superimposed quad or tcav is called - # after handle when specific embedded elements are called? - + # need to think about writing/reading to and from nn.Parameters, + # if var 'TRAINABLE:PV:300' is set to nn.Parameter(torch.tensor(1.0)) + # if needs to make the corresponding element attribute a nn.Parameter as well, or if it can just set the data of the existing attribute if isinstance(element, SuperimposedElement): if len(element.superimposed_element.elements) == 0: raise ValueError("Cannot access attribute on empty element list") @@ -330,6 +345,42 @@ def access_cheetah_attribute(element, pv_attribute, energy, set_value=None): ) from e +def set_cheetah_value(element, attr_name, value): + """ + Set a Cheetah element attribute safely. + + If the existing attribute is an nn.Parameter, update its value in-place + without replacing the Parameter object. + + If the existing attribute is a Tensor, update in-place when shape-compatible. + + Otherwise, fall back to setattr. + """ + existing = getattr(element, attr_name) + # value = nn.Parameter ( ) * tensor is not a param. + if isinstance(existing, torch.nn.Parameter): + print("is nn should update in place.") + value = torch.as_tensor( + value, + dtype=existing.dtype, + device=existing.device, + ) + + with torch.no_grad(): + existing.copy_(value) + + return + + if isinstance(existing, torch.Tensor): + value = torch.as_tensor( + value, + dtype=existing.dtype, + device=existing.device, + ) + + setattr(element, attr_name, value) + + def get_mad_control_mapping(fname: str | None = None): """ Create a mapping from madnames to control names and device types diff --git a/virtual_accelerator/models/sc_diag0.py b/virtual_accelerator/models/sc_diag0.py index c7a2832..0c5530d 100644 --- a/virtual_accelerator/models/sc_diag0.py +++ b/virtual_accelerator/models/sc_diag0.py @@ -1,5 +1,4 @@ import os - from virtual_accelerator.utils.optional_dependencies import import_optional from virtual_accelerator.utils.variables import ( get_epics_to_name_or_overlay_mapping, diff --git a/virtual_accelerator/utils/variables.py b/virtual_accelerator/utils/variables.py index c72623f..198c8be 100644 --- a/virtual_accelerator/utils/variables.py +++ b/virtual_accelerator/utils/variables.py @@ -62,7 +62,7 @@ def get_name_or_overlay_to_epics_mapping( df = df[df["Beampath"].str.contains(beampath, na=False)] # remove rows with `keyword` = `USEG` and `LCAV` - df = df[~df["Keyword"].str.contains("USEG|LCAV|TCAV", na=False)] + df = df[~df["Keyword"].str.contains("USEG|LCAV", na=False)] name_data = df[["Element", "Control System Name"]].dropna() return dict(zip(name_data["Element"], name_data["Control System Name"]))