Skip to content

add Sync_UB_Matrix #340

Open
Open
@prjemian

Description

@prjemian

Is there a way motor positions (and UB matrices) of the two engines can be synchronized automatically?

class Sync_UB_Matrix:
    """Copy the UB matrix from source to target diffractometers."""

    def __init__(self, source: Diffractometer, target: Diffractometer):
        self.source = source
        self.target = target
        self.source.UB.subscribe(self.sync_callback)

        # initialize
        self.sync_callback(self.source.UB.get())

    def cleanup(self, *args, **kwargs):
        """Remove all our subscriptions to ophyd objects."""
        self.source.UB.clear_sub(self.sync_callback)

    def sync_callback(self, value=None, **kwargs):
        if value is None:
            raise RuntimeError(f"sync_callback: {value=!r}  {kwargs=!r}")
        ub_source = value
        print(f"Copy UB={ub_source=} from {self.source.name} to {self.source.name}")
        self.target.UB.put(ub_source)

        for axis in self.source.real_positioners._fields:
            ptarget = getattr(self.target, axis)
            if isinstance(ptarget, SoftPositioner):
                # If the target is a simulated motor, sync it with the source.
                psource = getattr(self.source, axis)
                ptarget.move(psource.position)
                print(f"Sync {self.target.name}.{axis}={ptarget.position}")


try:
    sync_UB.cleanup()
except Exception:
    pass
sync_UB = Sync_UB_Matrix(polar, polar_psi)

@strempfer - Thanks for the suggestion!

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions