""" """ __author__ = "Théo de la Hogue" __credits__ = [] __copyright__ = "Copyright 2023, Ecole Nationale de l'Aviation Civile (ENAC)" __license__ = "BSD" from typing import TypeVar from dataclasses import dataclass, field import json import math from argaze import DataFeatures PupillDiameterType = TypeVar('PupillDiameter', bound="PupillDiameter") # Type definition for type annotation convenience class PupillDiameter(float, DataFeatures.TimestampedObject): """Define pupill diameter as a single float value. Parameters: value: pupill diameter value. """ def __new__(cls, value: float = math.nan, **kwargs): return float.__new__(cls, value) def __init__(self, value: float = math.nan, **kwargs): super().__init__(**kwargs) @property def value(self): """Get pupill diameter value.""" return float(self) TimeStampedPupillDiametersType = TypeVar('TimeStampedPupillDiameters', bound="TimeStampedPupillDiameters") # Type definition for type annotation convenience class TimeStampedPupillDiameters(DataFeatures.TimestampedObjectsList): """Handle timestamped pupill diamters into a list.""" def __init__(self, pupill_diameters: list = []): DataFeatures.TimestampedObjectsList.__init__(self, PupillDiameter, pupill_diameters) TimeStampedBufferType = TypeVar('TimeStampedBuffer', bound="TimeStampedBuffer") # Type definition for type annotation convenience class PupillDiameterAnalyzer(DataFeatures.PipelineStepObject): """Abstract class to define what should provide a pupill diameter analyser.""" @DataFeatures.PipelineStepMethod def analyze(self, pupill_diameter: PupillDiameterType) -> any: """Analyze pupill diameter from successive timestamped pupill diameters.""" raise NotImplementedError('analyze() method not implemented') def browse(self, ts_pupill_diameters: TimeStampedPupillDiameters) -> TimeStampedBufferType: """Analyze by browsing timestamped pupill diameters.""" assert(type(ts_pupill_diameters) == TimeStampedPupillDiameters) ts_analyzis = DataFeatures.TimeStampedBuffer() # Iterate on pupill diameters for pupill_diameter in ts_pupill_diameters: analysis = self.analyze(pupill_diameter.timestamp, pupill_diameter) if analysis is not None: ts_analyzis[ts] = analysis return ts_analyzis