Skip to content

pyaml user feedback using SOLEIL II digital twin #29

@GamelinAl

Description

@GamelinAl

Context

Thanks to the work of @Pichon, I was able to test the current pyaml version on the SOLEIL II digital twin (based on a modified version of the ESRF-EBS simulator).

Here is some user feedback on the current implementation, I propose to discuss it and them to split it in subtasks when we agree on some changes.

For this feedback, I focused on the most basic features of pyAML but I was also able to run the tune response matrix example of @JeanLucPons adapted to the SOLEIL II lattice. I think that with a few modifications to the actual code base, we will not be too far from a version in which we will be able to implement the chosen use cases.


General Comments

  1. Coding Style:
    • The codebase uses many get/set functions, which feels un-Pythonic. Consider using properties with getters/setters for a smoother user experience.
  2. Internal vs. User-facing Methods:
    • Clearly distinguish between methods intended for users and internal ones.
    • Internal methods should be prefixed with _ or __ to hide them from introspection (e.g., in IPython/terminal).
  3. Function Naming:
    • The function pyaml (used to load .yaml configurations) should have a descriptive name, e.g., load_pymal_config.

Specific Feedback

pyaml.lattice.simulator.Simulator / pyaml.controlsystem.TangoControlSystem

  1. get_all_magnets Method:
    • Currently returns a dict, but should return an array to enable filtering/sorting.
    • Question: Should this be a property instead of a method?
  2. Feature Request:
    • Add a property/method to retrieve all elements (magnets, BPMs, devices, etc.), not just magnets.

pyaml.lattice.magnet

  1. __repr__ Method:
    • Should include the control_mode (e.g., simulated vs. live) to avoid confusion.
  2. __str__ Method:
    • Should print detailed information about the magnet, e.g.:
      Sextupole(name='SXF2', strength=809.008, currents=[140,...], hardware_name='AN01-AR/EM/SCF.02', control_mode='live', ...)
  3. hardware_name Accessibility:
    • Should be accessible as a property (at least in "live" mode).
    • Current Workaround:
      quad.model.get_devices()[0].name()  # Returns 'AN14-AR/EM/OH.03-CQLN.13/strength'
  4. Control System Layer Access:
    • Should provide easy access to the Python control system layer (e.g., pyTango/pyEPICS).
    • For Tango, suggest adding a device_proxy attribute to return the TangoDeviceProxy for the element.

pyaml.arrays.magnet_arrays.MagnetArray

  1. Subset Handling:
    • Subsets (e.g., qcorr[0:5]) should return a MagnetArray, not a list.
      • Bug: qcorr[0:5].strengthsAttributeError: 'list' object has no attribute 'strengths'.
  2. The MagnetArray class is currently too simplistic and lacks key features for practical use.
    • Support heterogeneous MagnetArray (different magnet types).
    • Implement element access by:
      • hardware_name
      • name
      • Element type filtering

pyaml.control.abstract_impl.RWStrengthScalar

  1. get Method:
    • Currently returns an array instead of a float.
      • Example:
        quad.strength.get()  # Returns [0.0]

pyaml.arrays.magnet_array.RWMagnetStrength

  1. Setting Values:
    • Should support setting RWArrays using a single value (not just arrays of the same shape).
      • Bug: sh1.strengths.set(1)TypeError: 'float' object is not subscriptable

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions