From d15632915ab20887ea22939c13b5aa3e711d5980 Mon Sep 17 00:00:00 2001 From: Ed Rogers <etr@orc.soton.ac.uk> Date: Wed, 4 Apr 2018 20:51:04 +0200 Subject: [PATCH] Add saving of data to file --- HearingTest.py | 27 ++++++++++++++++++--------- HearingTestGUI.py | 17 +++++++++++------ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/HearingTest.py b/HearingTest.py index 8598822..5a2382f 100644 --- a/HearingTest.py +++ b/HearingTest.py @@ -2,8 +2,7 @@ import time import numpy as np import random from SoundLibrary import SoundLibrary -from typing import List -# from HearingTestGUI import HearingMplCanvas + class SoundRecord: def __init__(self, freq, volume, time): @@ -52,22 +51,22 @@ class HearingTest: for i, freq in enumerate(self.freqs): choices.extend([(freq, v) for v in np.arange(self.lower_bounds[i], self.upper_bounds[i], self.get_block_size())]) - freq, volume = random.choice(choices) - self.library.play(freq, volume) played_time = time.time() next_sleep_time = random.uniform(self.max_response_time*1.2, self.max_response_time*3) - self.sounds.append(SoundRecord(freq, volume, played_time)) - test_finished = np.all(self.finished_freqs()) - self.check_for_not_heard(played_time) - return test_finished, freq, volume, played_time, next_sleep_time + return self.test_finished, freq, volume, played_time, next_sleep_time + + @property + def test_finished(self): + return np.all(self.finished_freqs) + @property def finished_freqs(self): - return self.upper_bounds - self.lower_bounds < self.get_block_size() * 1.2 + return self.upper_bounds - self.lower_bounds < self.get_block_size() * 0.9 def check_for_not_heard(self, event_time): for sound in reversed(self.sounds): @@ -87,3 +86,13 @@ class HearingTest: def set_upper_bound(self, freq, volume): self.upper_bounds[self.freqs == freq] = volume self.canvas.update_result(self) + + @property + def thresholds(self) -> np.ndarray: + if not self.test_finished: + raise ValueError + return mean_two_arrays(self.lower_bounds, self.upper_bounds) + + +def mean_two_arrays(a: np.ndarray, b: np.ndarray): + return np.mean(np.array([a, b]), axis=0) diff --git a/HearingTestGUI.py b/HearingTestGUI.py index 3ad9434..f5cd21e 100644 --- a/HearingTestGUI.py +++ b/HearingTestGUI.py @@ -77,7 +77,7 @@ class HearingMplCanvas(FigureCanvas): def update_result(self, result: HearingTest) -> None: self.set_bar_heights(self.ul_bar, result.upper_bounds-self.baseline) self.set_bar_heights(self.ll_bar, result.lower_bounds-self.baseline) - self.set_bar_colors([self.ul_bar, self.ll_bar], result.finished_freqs()) + self.set_bar_colors([self.ul_bar, self.ll_bar], result.finished_freqs) self.draw() @staticmethod @@ -126,7 +126,7 @@ class TestWindow(QMainWindow): def __init__(self, library): self.library = library - self.result = None + self.test = None self.testing_thread = None self.test_running = False @@ -175,7 +175,7 @@ class TestWindow(QMainWindow): if event.key() == Qt.Qt.Key_Escape: self.testing_thread.abort = True key_press_time = time.time() - self.result.handle_key_press(key_press_time) + self.test.handle_key_press(key_press_time) self.record_key_press(event, key_press_time) def record_key_press(self, event: QtGui.QKeyEvent, _time): @@ -185,8 +185,8 @@ class TestWindow(QMainWindow): self.log.setText('') self.title.setText('Test running') self.log.append('Starting...') - self.result = HearingTest(self.library, self.graph) - self.testing_thread = HearingTestThread(self.result) + self.test = HearingTest(self.library, self.graph) + self.testing_thread = HearingTestThread(self.test) self.testing_thread.played_sound.connect(self.sound_played) self.testing_thread.finished.connect(self.test_finished) self.testing_thread.aborted.connect(self.aborted) @@ -203,10 +203,15 @@ class TestWindow(QMainWindow): self.test_running = False self.title.setText("Press any key to start...") self.log.append("Finished test") + self.log.append("Writing test result to file") + thresholds = self.test.thresholds + thresholds = thresholds.reshape(thresholds.shape[0], -1) # convert to 2d + with open('data.csv', 'ba') as file: + np.savetxt(file, thresholds.T, fmt='%.2f', delimiter=',') # TODO store test # TODO calculate score # TODO display test - self.result = None + self.test = None def main(): -- GitLab