Source code for pyaml.rf.rf_plant
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
from .rf_transmitter import RFTransmitter
# Define the main class name for this module
PYAMLCLASS = "RFPlant"
[docs]
class ConfigModel(ElementConfigModel):
masterclock: DeviceAccess | None = None
"""Device to apply main RF frequency"""
transmitters: list[RFTransmitter] | None = None
"""List of RF trasnmitters"""
[docs]
class RFPlant(Element):
"""
Main RF object
"""
def __init__(self, cfg: ConfigModel):
super().__init__(cfg.name)
self._cfg = cfg
self.__frequency = None
self.__voltage = None
@property
def frequency(self) -> abstract.ReadWriteFloatScalar:
if self.__frequency is None:
raise PyAMLException(f"{str(self)} has no masterclock device defined")
return self.__frequency
@property
def voltage(self) -> abstract.ReadWriteFloatScalar:
if self.__voltage is None:
raise PyAMLException(f"{str(self)} has no trasmitter device defined")
return self.__voltage
[docs]
def attach(
self,
peer,
frequency: abstract.ReadWriteFloatScalar,
voltage: abstract.ReadWriteFloatScalar,
) -> Self:
# Attach frequency attribute and returns a new reference
obj = self.__class__(self._cfg)
obj.__frequency = frequency
obj.__voltage = voltage
obj._peer = peer
return obj
[docs]
class RWTotalVoltage(abstract.ReadWriteFloatScalar):
def __init__(self, transmitters: list[RFTransmitter]):
"""
Construct a RWTotalVoltage setter
Parameters
----------
transmitters : list[RFTransmitter]
List of attached transmitters
"""
self.__trans = transmitters
[docs]
def get(self) -> float:
sum = 0
# Count only fundamental harmonic
for t in self.__trans:
if t._cfg.harmonic == 1.0:
sum += t.voltage.get()
return sum
[docs]
def set(self, value: float):
# Assume that sum of transmitter (fundamental harmonic) distribution is 1
for t in self.__trans:
if t._cfg.harmonic == 1.0:
v = value * t._cfg.distribution
t.voltage.set(v)
[docs]
def set_and_wait(self, value: float):
raise NotImplementedError("Not implemented yet.")
[docs]
def unit(self) -> str:
return self.__trans[0]._cfg.phase.unit()