aboutsummaryrefslogtreecommitdiff
path: root/src/argaze/PupillFeatures.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/argaze/PupillFeatures.py')
-rw-r--r--src/argaze/PupillFeatures.py78
1 files changed, 24 insertions, 54 deletions
diff --git a/src/argaze/PupillFeatures.py b/src/argaze/PupillFeatures.py
index d8f9331..492e7ca 100644
--- a/src/argaze/PupillFeatures.py
+++ b/src/argaze/PupillFeatures.py
@@ -10,71 +10,41 @@ __license__ = "BSD"
from typing import TypeVar
from dataclasses import dataclass, field
import json
+import math
from argaze import DataFeatures
-@dataclass(frozen=True)
-class PupillDiameter():
- """Define pupill diameter as ..."""
-
- value: float = field(default=0.)
- """Pupill diameter value."""
-
- @property
- def valid(self) -> bool:
- """Is the value not 0"""
-
- return self.value != 0.
-
- def __repr__(self):
- """String representation"""
+PupillDiameterType = TypeVar('PupillDiameter', bound="PupillDiameter")
+# Type definition for type annotation convenience
- return json.dumps(self, ensure_ascii = False, default=vars)
+class PupillDiameter(float, DataFeatures.TimestampedObject):
+ """Define pupill diameter as a single float value.
-class UnvalidPupillDiameter(PupillDiameter):
- """Unvalid pupill diameter."""
+ Parameters:
+ value: pupill diameter value.
+ """
+ def __new__(cls, value: float = math.nan, **kwargs):
- def __init__(self, message=None):
+ return float.__new__(cls, value)
- self.message = message
+ def __init__(self, value: float = math.nan, **kwargs):
- super().__init__(0.)
+ 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.TimeStampedBuffer):
- """Define timestamped buffer to store pupill diameters."""
-
- def __setitem__(self, key, value: PupillDiameter|dict):
- """Force PupillDiameter storage."""
-
- # Convert dict into PupillDiameter
- if type(value) == dict:
-
- assert(set(['value']).issubset(value.keys()))
-
- if 'message' in value.keys():
-
- value = UnvalidPupillDiameter(value['message'])
-
- else:
-
- value = PupillDiameter(value['value'])
-
- assert(type(value) == PupillDiameter or type(value) == UnvalidPupillDiameter)
-
- super().__setitem__(key, value)
-
- @classmethod
- def from_json(self, json_filepath: str) -> TimeStampedPupillDiametersType:
- """Create a TimeStampedPupillDiametersType from .json file."""
-
- with open(json_filepath, encoding='utf-8') as ts_buffer_file:
+class TimeStampedPupillDiameters(DataFeatures.TimestampedObjectsList):
+ """Handle timestamped pupill diamters into a list."""
- json_buffer = json.load(ts_buffer_file)
+ def __init__(self, pupill_diameters: list = []):
- return TimeStampedPupillDiameters({ast.literal_eval(ts_str): json_buffer[ts_str] for ts_str in json_buffer})
+ DataFeatures.TimestampedObjectsList.__init__(self, PupillDiameter, pupill_diameters)
TimeStampedBufferType = TypeVar('TimeStampedBuffer', bound="TimeStampedBuffer")
# Type definition for type annotation convenience
@@ -83,7 +53,7 @@ class PupillDiameterAnalyzer(DataFeatures.PipelineStepObject):
"""Abstract class to define what should provide a pupill diameter analyser."""
@DataFeatures.PipelineStepMethod
- def analyze(self, timestamp: int|float, pupill_diameter, float) -> float:
+ def analyze(self, pupill_diameter: PupillDiameterType) -> any:
"""Analyze pupill diameter from successive timestamped pupill diameters."""
raise NotImplementedError('analyze() method not implemented')
@@ -96,9 +66,9 @@ class PupillDiameterAnalyzer(DataFeatures.PipelineStepObject):
ts_analyzis = DataFeatures.TimeStampedBuffer()
# Iterate on pupill diameters
- for ts, pupill_diameter in ts_pupill_diameters.items():
+ for pupill_diameter in ts_pupill_diameters:
- analysis = self.analyze(ts, pupill_diameter)
+ analysis = self.analyze(pupill_diameter)
if analysis is not None: