Source code for pyetsimul.evaluation.analysis_utils

"""Utility functions for performance analysis.

This module provides helper functions used across performance analysis modules
to ensure consistency and reduce code duplication.
"""

import numpy as np


def _compute_stats(values: np.ndarray) -> dict[str, float]:
    """Compute basic statistics for error values."""
    return {
        "mean": float(np.mean(values)),
        "max": float(np.max(values)),
        "std": float(np.std(values)),
        "median": float(np.median(values)),
    }


[docs] def calculate_error_statistics( U: np.ndarray, V: np.ndarray, angular_errors: np.ndarray ) -> dict[str, dict[str, float]]: """Calculate gaze tracking error statistics. Args: U: Error array in X direction (in mm) V: Error array in Y direction (in mm) angular_errors: Angular error array (in degrees) Returns: dict: Error statistics with 'mm' and 'deg' keys containing mean, max, std, median """ euclidean_errors = np.sqrt(U**2 + V**2).flatten() angular_errors_flat = angular_errors.flatten() valid_mask = ~(np.isnan(euclidean_errors) | np.isnan(angular_errors_flat)) if not np.any(valid_mask): nan_stats = {"mean": np.nan, "max": np.nan, "std": np.nan, "median": np.nan} return {"mm": nan_stats, "deg": nan_stats} valid_euclidean = euclidean_errors[valid_mask] valid_angular = angular_errors_flat[valid_mask] return { "mm": _compute_stats(valid_euclidean), "deg": _compute_stats(valid_angular), }