diff --git a/b_asic/GUI/signal_generator_input.py b/b_asic/GUI/signal_generator_input.py index a2db9aa0f44e22cf902bc093cc74f4a28ee72149..6c20dfa0c909ff0c6aef3d31bc3eecd02c189b50 100644 --- a/b_asic/GUI/signal_generator_input.py +++ b/b_asic/GUI/signal_generator_input.py @@ -103,6 +103,11 @@ class ZeroPadInput(SignalGeneratorInput): class FromFileInput(SignalGeneratorInput): + """ + Class for graphically configuring and generating a + :class:`~b_asic.signal_generators.FromFile` signal generator. + """ + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.file_label = QLabel("Browse") diff --git a/b_asic/signal_generator.py b/b_asic/signal_generator.py index 45840415f481e0afb4688f2c99622ae307fab866..debab6dc6c156f88439369e61aa26f621f075768 100644 --- a/b_asic/signal_generator.py +++ b/b_asic/signal_generator.py @@ -13,6 +13,7 @@ if you want more information. from math import pi, sin from numbers import Number +from pathlib import Path from typing import Optional, Sequence import numpy as np @@ -172,12 +173,17 @@ class FromFile(SignalGenerator): """ def __init__(self, path) -> None: + try: + Path(path).resolve(strict=True) + except FileNotFoundError: + raise Exception("Selected input file not found.") + try: data = np.loadtxt(path, dtype=complex).tolist() self._data = data self._len = len(data) - except FileNotFoundError: - self._window.logger.error(f"Selected input file not found.") + except ValueError: + raise Exception("Selected input file is not of the right format.") def __call__(self, time: int) -> complex: if 0 <= time < self._len: @@ -185,7 +191,7 @@ class FromFile(SignalGenerator): return 0.0 def __repr__(self) -> str: - return f"ZeroPad({self._data})" + return f"FromFile({self._data})" class Sinusoid(SignalGenerator): diff --git a/test/test_signal_generator.py b/test/test_signal_generator.py index b982e6cc6530d4b04d9dc43a1187a1bd5dee2e30..213e7062f00c6039977a0951eb99f1abf4d57994 100644 --- a/test/test_signal_generator.py +++ b/test/test_signal_generator.py @@ -1,3 +1,4 @@ +import os from math import sqrt import pytest @@ -5,6 +6,7 @@ import pytest from b_asic.signal_generator import ( Constant, Delay, + FromFile, Gaussian, Impulse, Sinusoid, @@ -269,3 +271,14 @@ def test_division(): assert str(g) == "Sinusoid(0.5, 0.25) / (0.5 * Step())" assert isinstance(g, _DivGenerator) + + +def test_fromfile(): + absolute_path = os.path.dirname(__file__) + relative_path = "../examples/input.csv" + full_path = os.path.join(absolute_path, relative_path) + g = FromFile(full_path) + assert g(-1) == 0.0 + assert g(0) == 0 + assert g(1) == 1 + assert g(2) == 0