""" """ """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ __author__ = "Théo de la Hogue" __credits__ = [] __copyright__ = "Copyright 2023, Ecole Nationale de l'Aviation Civile (ENAC)" __license__ = "GPLv3" import math from argaze import DataFeatures @DataFeatures.timestamp class PupilDiameter(float, DataFeatures.TimestampedObject): """Define pupil diameter as a single float value. Parameters: value: pupil 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 pupil diameter value.""" return float(self) class TimeStampedPupilDiameters(DataFeatures.TimestampedObjectsList): """Handle timestamped pupil diameters into a list.""" def __init__(self, pupil_diameters: list = []): DataFeatures.TimestampedObjectsList.__init__(self, PupilDiameter, pupil_diameters) class PupilDiameterAnalyzer(DataFeatures.PipelineStepObject): """Abstract class to define what should provide a pupil diameter analyser.""" @DataFeatures.PipelineStepMethod def analyze(self, pupil_diameter: PupilDiameter) -> any: """Analyze pupil diameter from successive timestamped pupil diameters.""" raise NotImplementedError('analyze() method not implemented') def browse(self, ts_pupil_diameters: TimeStampedPupilDiameters) -> list: """Analyze by browsing timestamped pupil diameters. Parameters: ts_pupil_diameters: list of timestamped pupil diameters. Returns: ts_analysis: list of (timestamp, analysis). """ assert(type(ts_pupil_diameters) == TimeStampedPupilDiameters) # TODO: Have TimestampedDataDictionary and TimestampedDataDictionaryList classes? ts_analysis = [] # Iterate on pupil diameters for pupil_diameter in ts_pupil_diameters: analysis = self.analyze(pupil_diameter.timestamp, pupil_diameter) if analysis is not None: ts_analysis.append((pupil_diameter.timestamp, analysis)) return ts_analysis