Source code for pyaml.rf.rf_transmitter
import numpy as np
from pydantic import BaseModel, ConfigDict
try:
from typing import Self # Python 3.11+
except ImportError:
from typing_extensions import Self # Python 3.10 and earlier
from .. import PyAMLException
from ..common import abstract
from ..common.element import Element, ElementConfigModel
from ..control.deviceaccess import DeviceAccess
# Define the main class name for this module
PYAMLCLASS = "RFTransmitter"
[docs]
class ConfigModel(ElementConfigModel):
"""
Configuration model for RF Transmitter.
Attributes
----------
voltage : DeviceAccess or None, optional
Device to apply cavity voltage
phase : DeviceAccess or None, optional
Device to apply cavity phase
cavities : list[str]
List of cavity names connected to this transmitter
harmonic : float, optional
Harmonic frequency ratio, 1.0 for main frequency, by default 1.0
distribution : float, optional
RF distribution (Part of the total RF voltage powered by this transmitter),
by default 1.0
"""
model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid")
voltage: DeviceAccess | None = None
phase: DeviceAccess | None = None
cavities: list[str]
harmonic: float = 1.0
distribution: float = 1.0
[docs]
class RFTransmitter(Element):
"""
Class that handle a RF transmitter
"""
def __init__(self, cfg: ConfigModel):
super().__init__(cfg.name)
self._cfg = cfg
self.__voltage = None
self.__phase = None
@property
def voltage(self) -> abstract.ReadWriteFloatScalar:
"""
Get the RF voltage in [V].
Returns
-------
abstract.ReadWriteFloatScalar
Read/write access to RF voltage
Raises
------
PyAMLException
If transmitter is unattached or has no voltage device defined
"""
if self.__voltage is None:
raise PyAMLException(f"{str(self)} is unattached or has no voltage device defined")
return self.__voltage
@property
def phase(self) -> abstract.ReadWriteFloatScalar:
"""
Get the RF phase in [rad].
Returns
-------
abstract.ReadWriteFloatScalar
Read/write access to RF phase
Raises
------
PyAMLException
If transmitter is unattached or has no phase device defined
"""
if self.__phase is None:
raise PyAMLException(f"{str(self)} is unattached or has no phase device defined")
return self.__phase
[docs]
def attach(
self,
peer,
voltage: abstract.ReadWriteFloatScalar,
phase: abstract.ReadWriteFloatScalar,
) -> Self:
"""
Attach voltage and phase attributes to a peer.
Parameters
----------
peer : object
The peer object (simulator or control system)
voltage : abstract.ReadWriteFloatScalar
Voltage accessor to attach
phase : abstract.ReadWriteFloatScalar
Phase accessor to attach
Returns
-------
Self
A new attached instance of RFTransmitter
"""
# Attach voltage and phase attribute and returns a new reference
obj = self.__class__(self._cfg)
obj.__voltage = voltage
obj.__phase = phase
obj._peer = peer
return obj