#!/usr/bin/env python """Basic analysis module. """ __author__ = "Théo de la Hogue" __credits__ = [] __copyright__ = "Copyright 2023, Ecole Nationale de l'Aviation Civile (ENAC)" __license__ = "BSD" from dataclasses import dataclass from argaze import GazeFeatures, DataFeatures import numpy @dataclass class ScanPathAnalyzer(GazeFeatures.ScanPathAnalyzer): """Basic scan path analysis.""" def __post_init__(self): super().__init__() self.__path_duration = 0 self.__steps_number = 0 self.__step_fixation_durations_average = 0 @DataFeatures.PipelineStep def analyze(self, scan_path: GazeFeatures.ScanPathType): self.__path_duration = scan_path.duration self.__steps_number = len(scan_path) sum_fixation_durations = 0 # DEBUG a = 1 / 0 for scan_step in scan_path: sum_fixation_durations += scan_step.fixation_duration self.__step_fixation_durations_average = sum_fixation_durations / self.__steps_number @property def path_duration(self) -> float: """Scan path duration.""" return self.__path_duration @property def steps_number(self) -> float: """Scan path steps number.""" return self.__steps_number @property def step_fixation_durations_average(self) -> float: """Scan path step fixation durations average.""" return self.__step_fixation_durations_average @dataclass class AOIScanPathAnalyzer(GazeFeatures.AOIScanPathAnalyzer): """Basic AOI scan path analysis.""" def __post_init__(self): super().__init__() self.__path_duration = 0 self.__steps_number = 0 self.__step_fixation_durations_average = 0 @DataFeatures.PipelineStep def analyze(self, aoi_scan_path: GazeFeatures.ScanPathType): self.__path_duration = aoi_scan_path.duration self.__steps_number = len(aoi_scan_path) sum_fixation_durations = 0 self.__sum_aoi_fixation_durations = {} for aoi_scan_step in aoi_scan_path: sum_fixation_durations += aoi_scan_step.fixation_duration try: self.__sum_aoi_fixation_durations[aoi_scan_step.aoi] = self.__sum_aoi_fixation_durations[aoi_scan_step.aoi] + aoi_scan_step.fixation_duration except KeyError: self.__sum_aoi_fixation_durations[aoi_scan_step.aoi] = aoi_scan_step.fixation_duration self.__step_fixation_durations_average = sum_fixation_durations / self.__steps_number self.__aoi_fixation_distribution = {} for aoi_name, sum_aoi_fixation_duration in self.__sum_aoi_fixation_durations.items(): self.__aoi_fixation_distribution[aoi_name] = sum_aoi_fixation_duration / sum_fixation_durations @property def path_duration(self) -> float: """AOI scan path duration.""" return self.__path_duration @property def steps_number(self) -> float: """AOI scan path steps number.""" return self.__steps_number @property def step_fixation_durations_average(self) -> float: """AOI scan path step fixation durations average.""" return self.__step_fixation_durations_average @property def aoi_fixation_distribution(self) -> dict: """percentage of time spent on each AOI.""" return self.__aoi_fixation_distribution