From 8d57fa5aa5abb76f277f051f606706aa1309aeac Mon Sep 17 00:00:00 2001 From: Eric Teunis de Boone Date: Thu, 10 Mar 2022 15:41:09 +0100 Subject: [PATCH] Extraced Recv/Antenna from notebook --- .../03_emitter_receiver_simulation.ipynb | 84 +----------- simulations/lib/__init__.py | 2 + simulations/lib/location.py | 125 ++++++++++++++++++ .../lib/{TravelSignal.py => travelsignal.py} | 0 4 files changed, 132 insertions(+), 79 deletions(-) create mode 100644 simulations/lib/__init__.py create mode 100644 simulations/lib/location.py rename simulations/lib/{TravelSignal.py => travelsignal.py} (100%) diff --git a/simulations/03_emitter_receiver_simulation.ipynb b/simulations/03_emitter_receiver_simulation.ipynb index a5e5b39..707c135 100644 --- a/simulations/03_emitter_receiver_simulation.ipynb +++ b/simulations/03_emitter_receiver_simulation.ipynb @@ -14,7 +14,6 @@ "outputs": [], "source": [ "import numpy as np\n", - "from functools import partial\n", "\n", "import matplotlib.pyplot as plt" ] @@ -39,7 +38,7 @@ "metadata": {}, "outputs": [], "source": [ - "from lib.TravelSignal import TravelSignal\n", + "from lib import TravelSignal\n", "\n", "####\n", "from scipy.stats import norm\n", @@ -86,80 +85,7 @@ "metadata": {}, "outputs": [], "source": [ - "### Location\n", - "class Location:\n", - " \"\"\"\n", - " A location is a point designated by a spatial coordinate x.\n", - " \"\"\"\n", - "\n", - " def __init__(self, x):\n", - " self.x = np.asarray(x) \n", - "\n", - " def __repr__(self):\n", - " return \"Location({})\".format(repr(self.x))\n", - "\n", - " def __getitem__(self, key):\n", - " return self.x[key]\n", - "\n", - " def __setitem__(self, key, val):\n", - " self.x[key] = val\n", - "\n", - " def __add__(self, other):\n", - " if isinstance(other, Location):\n", - " other = other.x\n", - "\n", - " return self.__class__(self.x + other)\n", - "\n", - " def __sub__(self, other):\n", - " if isinstance(other, Location):\n", - " other = other.x\n", - "\n", - " return self.__class__(self.x - other)\n", - " \n", - " def __eq__(self, other):\n", - " if isinstance(other, Location):\n", - " other = other.x\n", - "\n", - " return np.all(self.x == other)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "### Receiver\n", - "class Receiver(Location):\n", - " \"\"\"\n", - " A location able to trace a signal over time.\n", - " \n", - " Optionally applies a transformation to the traced signal.\n", - " \"\"\"\n", - " def __repr__(self):\n", - " return \"Receiver({})\".format(repr(self.x))\n", - " \n", - " def recv(self, travel_signal: TravelSignal) -> TravelSignal:\n", - " \"\"\"\n", - " Return a function that traces the signal as a function of time\n", - " at the receiver's location\n", - " \"\"\"\n", - " return partial(travel_signal, x_f=self.x) " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - " ### Emitter\n", - "class Emitter(Location):\n", - " \"\"\"\n", - " Emit a signal from position x_0 (and time t_0)\n", - " \"\"\"\n", - " def emit(self, travel_signal: TravelSignal) -> TravelSignal:\n", - " return partial(travel_signal, x_0=self.x)" + "from lib.location import Receiver, Emitter" ] }, { @@ -171,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -188,7 +114,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -255,7 +181,7 @@ "\n", "### Plot Traces\n", "fig, axs = plt.subplots(1+len(antennae),1, sharex=True, figsize=(12,6))\n", - "axs[0].set_title(\"Traces of Emitter and Antenna\")\n", + "axs[0].set_title(\"Traces of Emitter and Antennae\")\n", "\n", "# Emitter\n", "i = 0\n", diff --git a/simulations/lib/__init__.py b/simulations/lib/__init__.py new file mode 100644 index 0000000..75a5779 --- /dev/null +++ b/simulations/lib/__init__.py @@ -0,0 +1,2 @@ +from .travelsignal import * +from .location import * diff --git a/simulations/lib/location.py b/simulations/lib/location.py new file mode 100644 index 0000000..8b0bf45 --- /dev/null +++ b/simulations/lib/location.py @@ -0,0 +1,125 @@ +""" +Locations are wrappers around a Numpy N-dimensional +array. +""" + +import numpy as np +from functools import partial + +try: + from travelsignal import TravelSignal +except ModuleNotFoundError: + from .travelsignal import TravelSignal + +class Location: + """ + A location is a point designated by a spatial coordinate x. + """ + + def __init__(self, x): + self.x = np.asarray(x) + + def __repr__(self): + return "Location({})".format(repr(self.x)) + + def __getitem__(self, key): + return self.x[key] + + def __setitem__(self, key, val): + self.x[key] = val + + def __add__(self, other): + if isinstance(other, Location): + other = other.x + + return self.__class__(self.x + other) + + def __sub__(self, other): + if isinstance(other, Location): + other = other.x + + return self.__class__(self.x - other) + + def __eq__(self, other): + if isinstance(other, Location): + other = other.x + + return np.all(self.x == other) + +class Receiver(Location): + """ + A location able to trace a signal over time. + + Optionally applies a transformation to the traced signal. + """ + def __repr__(self): + return "Receiver({})".format(repr(self.x)) + + def recv(self, travel_signal: TravelSignal) -> TravelSignal: + """ + Return a function that traces the signal as a function of time + at the receiver's location + """ + return partial(travel_signal, x_f=self.x) + + receive = recv + +class Emitter(Location): + """ + Emit a signal from position x_0 (and time t_0) + """ + def emit(self, travel_signal: TravelSignal) -> TravelSignal: + return partial(travel_signal, x_0=self.x) + + +if __name__ == "__main__": + import matplotlib.pyplot as plt + from mpl_toolkits.mplot3d import axes3d + + # 2D showcase + source = Emitter([1,1]) + + antennae = [ + Receiver([2,3]), + Receiver([10,10]), + Receiver([-2,-3]), + Receiver([-10,0]), + ] + + fig, ax = plt.subplots() + + ax.set_title("Geometry of Emitter(s) and Antennae") + ax.set_ylabel("y") + ax.set_xlabel("x") + ax.plot(*source.x, '*', label="Emitter") + + for j, ant in enumerate(antennae): + ax.plot(*ant.x, '+', label="Antenna {}".format(j)) + + ax.legend() + fig.show() + + # 3D showcase + source = Emitter([1,1,1]) + + antennae = [ + Receiver([2,3,0]), + Receiver([10,10,-5]), + Receiver([-2,-3,9]), + Receiver([-10,0,-5]), + ] + + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + + ax.set_title("Geometry of Emitter(s) and Antennae") + ax.set_xlabel("x") + ax.set_ylabel("y") + ax.set_zlabel("z") + ax.plot([source.x[0]], *source.x[1:], '*', label="Emitter") + + for j, ant in enumerate(antennae): + ax.plot([ant.x[0]], *ant.x[1:], '+', label="Antenna {}".format(j)) + + ax.legend() + plt.show() diff --git a/simulations/lib/TravelSignal.py b/simulations/lib/travelsignal.py similarity index 100% rename from simulations/lib/TravelSignal.py rename to simulations/lib/travelsignal.py