resonance.api.types

resonance.api.types

RsoxsError

Bases: Exception

Base exception for RSoXS operations

MotorError

Bases: RsoxsError

Motor operation failed

MotorTimeoutError

Bases: MotorError

Motor move did not complete in time

ShutterError

Bases: RsoxsError

Shutter operation failed

AcquisitionError

Bases: RsoxsError

Data acquisition failed

ValidationError

Bases: RsoxsError

Scan plan validation failed

ScanAbortedError

Bases: RsoxsError

Scan was aborted by user

ScanPoint(index, motors, exposure_time, ai_channels=None, delay_after_move=0.2) dataclass

Single point in a scan trajectory

validate()

Validate motor names and exposure time

Source code in src/resonance/api/types.py
def validate(self) -> None:
    """Validate motor names and exposure time"""
    if self.exposure_time <= 0:
        raise ValidationError(f"Invalid exposure time: {self.exposure_time}")

    # Validate motor names
    for motor_name in self.motors.keys():
        if motor_name not in motor:
            raise ValidationError(f"Invalid motor name: {motor_name}")

ScanResult(index, motors, ai_data, exposure_time, timestamp, raw_data, image=None) dataclass

Results from a scan point with uncertainty

to_series()

Convert to pandas Series with canonical column names.

Source code in src/resonance/api/types.py
def to_series(self) -> pd.Series:
    """Convert to pandas Series with canonical column names."""
    data: dict[str, float] = {}
    for motor_name, pos in self.motors.items():
        data[f"{normalize_header(motor_name)}_position"] = pos
    for chan, uval in self.ai_data.items():
        data[f"{normalize_header(chan)}_mean"] = uval.nominal_value
        data[f"{normalize_header(chan)}_std"] = uval.std_dev
    data[normalize_header("exposure")] = self.exposure_time
    data["timestamp"] = self.timestamp
    return pd.Series(data)