From 90e69f6b78deabb3e196e386fb07489134ed3879 Mon Sep 17 00:00:00 2001
From: "Olivier J.N. Bertrand" <olivier.bertrand@uni-bielefeld.de>
Date: Mon, 5 Mar 2018 23:03:24 +0100
Subject: [PATCH] Move processing tools and constants to scene for more
 intuitive use with other modules

---
 doc/source/tutorials/index.rst           |  4 +-
 navipy/__init__.py                       |  1 +
 navipy/comparing/__init__.py             |  3 +-
 navipy/comparing/test.py                 |  2 +-
 navipy/database/__init__.py              |  4 +-
 navipy/maths/__init__.py                 |  0
 navipy/maths/coordinates.py              | 23 ++++++++++
 navipy/processing/constants.py           | 22 ----------
 navipy/processing/pcode.py               | 25 +++++++----
 navipy/processing/test.py                |  2 +-
 navipy/{processing/tools.py => scene.py} | 55 +++++++++++-------------
 11 files changed, 73 insertions(+), 68 deletions(-)
 create mode 100644 navipy/maths/__init__.py
 create mode 100644 navipy/maths/coordinates.py
 delete mode 100644 navipy/processing/constants.py
 rename navipy/{processing/tools.py => scene.py} (82%)

diff --git a/doc/source/tutorials/index.rst b/doc/source/tutorials/index.rst
index 5bd7cf6..719a9a3 100644
--- a/doc/source/tutorials/index.rst
+++ b/doc/source/tutorials/index.rst
@@ -42,7 +42,7 @@ Tutorials
 
        .. container:: descr
 
-         .. figure:: /tutorials/database.jpeg
+         .. figure:: /tutorials/examples/database.svg
             :target: database.html
 
          :doc:`/tutorials/database`
@@ -50,7 +50,7 @@ Tutorials
 
        .. container:: descr
 
-         .. figure:: /tutorials/renderimage.svg
+         .. figure:: /tutorials/examples/renderimage.svg
             :target: renderimage.html
 
          :doc:`/tutorials/renderimage`
diff --git a/navipy/__init__.py b/navipy/__init__.py
index 9c66ee8..d1a86f5 100644
--- a/navipy/__init__.py
+++ b/navipy/__init__.py
@@ -38,6 +38,7 @@ An agent using an average skyline homing vector, could be build as follow
 
 """
 from navipy.database import DataBaseLoad
+import numpy as np
 
 
 class Bunch:
diff --git a/navipy/comparing/__init__.py b/navipy/comparing/__init__.py
index 934ef27..7d32eaa 100644
--- a/navipy/comparing/__init__.py
+++ b/navipy/comparing/__init__.py
@@ -2,8 +2,7 @@
 Comparing
 """
 import numpy as np
-from navipy.processing.tools import is_ibpc, is_obpc
-from navipy.processing.tools import check_scene
+from navipy.scene import is_ibpc, is_obpc, check_scene
 
 
 def simple_imagediff(current, memory):
diff --git a/navipy/comparing/test.py b/navipy/comparing/test.py
index 7770aa4..03df852 100644
--- a/navipy/comparing/test.py
+++ b/navipy/comparing/test.py
@@ -2,7 +2,7 @@ import unittest
 import numpy as np
 import navipy.database as database
 import navipy.comparing as comparing
-from navipy.processing.tools import is_numeric_array
+from navipy.scene import is_numeric_array
 import pkg_resources
 
 
diff --git a/navipy/database/__init__.py b/navipy/database/__init__.py
index 1a3d7b6..511d66b 100644
--- a/navipy/database/__init__.py
+++ b/navipy/database/__init__.py
@@ -8,7 +8,7 @@ import pandas as pd
 import sqlite3
 import io
 import warnings
-import navipy.processing.tools as tools
+from navipy.scene import is_numeric_array
 
 
 def adapt_array(arr):
@@ -528,7 +528,7 @@ class DataBaseSave(DataBase):
         if image.shape[2] != len(self.channels):
             raise Exception('image channels number differs from\
                              given channel number')
-        if not tools.is_numeric_array(image):
+        if not is_numeric_array(image):
             raise TypeError('scene is of non numeric type')
         normed_im = np.zeros(image.shape, dtype=dtype)
         maxval_nim = np.iinfo(normed_im.dtype).max
diff --git a/navipy/maths/__init__.py b/navipy/maths/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/navipy/maths/coordinates.py b/navipy/maths/coordinates.py
new file mode 100644
index 0000000..e670d9e
--- /dev/null
+++ b/navipy/maths/coordinates.py
@@ -0,0 +1,23 @@
+"""
+ Conversion between coordinates systems
+"""
+import numpy as np
+
+
+def cartesian_to_spherical(x, y, z):
+    radius = np.sqrt(x**2 + y**2 + z**2)
+    elevation = np.arctan2(z, np.sqrt(x**2 + y**2))
+    azimuth = np.arctan2(y, x)
+    spherical = np.zeros_like(x)
+    spherical = np.tile(spherical[..., np.newaxis], (3,))
+    return elevation, azimuth, radius
+
+
+def spherical_to_cartesian(elevation, azimuth, radius=1):
+    cartesian = np.zeros_like(elevation)
+    cartesian = np.tile(cartesian[..., np.newaxis], (3,))
+    x = np.cos(elevation) * np.cos(azimuth)
+    y = np.cos(elevation) * np.sin(azimuth)
+    z = np.sin(elevation)
+    cartesian = radius * cartesian
+    return x, y, z
diff --git a/navipy/processing/constants.py b/navipy/processing/constants.py
deleted file mode 100644
index b2570be..0000000
--- a/navipy/processing/constants.py
+++ /dev/null
@@ -1,22 +0,0 @@
-"""
-Define some constant
-"""
-
-__spherical_indeces__ = {'elevation': 0,
-                         'azimuth': 1,
-                         'radius': 2}
-__cartesian_indeces__ = {'x': 0,
-                         'y': 1,
-                         'z': 2}
-__ibpc_indeces__ = {'elevation': 0,
-                    'azimuth': 1,
-                    'channel': 2,
-                    'component': 3}
-__obpc_indeces__ = {'ommatidia': 0,
-                    'channel': 1,
-                    'component': 2}
-__eye_indeces__ = {'elevation': 0,
-                   'azimuth': 1,
-                   'component': 2}
-__ommadia_indeces__ = {'ommatidia': 0,
-                       'component': 1}
diff --git a/navipy/processing/pcode.py b/navipy/processing/pcode.py
index 8a6d038..8ed0ead 100644
--- a/navipy/processing/pcode.py
+++ b/navipy/processing/pcode.py
@@ -3,14 +3,15 @@ place code derived from scene
 """
 import numpy as np
 from scipy.ndimage import maximum_filter, minimum_filter
-from .constants import __spherical_indeces__
-from .constants import __ibpc_indeces__
-from .constants import __obpc_indeces__
-from .tools import is_ibpc
-from .tools import is_obpc
-from .tools import spherical_to_cartesian
-from .tools import check_scene
-from .tools import check_viewing_direction
+from navipy.scene import __spherical_indeces__
+from navipy.scene import __cartesian_indeces__
+from navipy.scene import __ibpc_indeces__
+from navipy.scene import __obpc_indeces__
+from navipy.scene import is_ibpc
+from navipy.scene import is_obpc
+from navipy.maths.coordinates import spherical_to_cartesian
+from navipy.scene import check_scene
+from navipy.scene import check_viewing_direction
 
 
 def skyline(scene):
@@ -132,7 +133,13 @@ def pcv(place_code, viewing_directions):
                        should be 1'.format(place_code.shape[component_dim]))
     elevation = viewing_directions[..., __spherical_indeces__['elevation']]
     azimuth = viewing_directions[..., __spherical_indeces__['azimuth']]
-    unscaled_lv = spherical_to_cartesian(elevation, azimuth, radius=1)
+    x, y, z = spherical_to_cartesian(elevation, azimuth, radius=1)
+    unscaled_lv = np.zeros((viewing_directions.shape[0],
+                            viewing_directions.shape[1],
+                            3))
+    unscaled_lv[..., __cartesian_indeces__['x']] = x
+    unscaled_lv[..., __cartesian_indeces__['y']] = y
+    unscaled_lv[..., __cartesian_indeces__['z']] = z
     scaled_lv = np.zeros_like(place_code)
     # (3,) -> (1,1,3) or (1,1,1,3) see numpy.tile
     scaled_lv = np.tile(scaled_lv, (unscaled_lv.shape[-1],))
diff --git a/navipy/processing/test.py b/navipy/processing/test.py
index 1722cae..ff13c23 100644
--- a/navipy/processing/test.py
+++ b/navipy/processing/test.py
@@ -4,7 +4,7 @@ import numpy as np
 import pandas as pd
 import navipy.database as database
 import navipy.processing.pcode as pcode
-from navipy.processing.tools import is_numeric_array
+from navipy.scene import is_numeric_array
 import pkg_resources
 
 
diff --git a/navipy/processing/tools.py b/navipy/scene.py
similarity index 82%
rename from navipy/processing/tools.py
rename to navipy/scene.py
index 42e0cc8..8b42261 100644
--- a/navipy/processing/tools.py
+++ b/navipy/scene.py
@@ -1,11 +1,32 @@
-from .constants import __ibpc_indeces__
-from .constants import __spherical_indeces__
-from .constants import __cartesian_indeces__
-from .constants import __obpc_indeces__
-from .constants import __eye_indeces__
+"""
+ Define what a scene is
+"""
 import numpy as np
 
 
+#
+# Define constants
+#
+__spherical_indeces__ = {'elevation': 0,
+                         'azimuth': 1,
+                         'radius': 2}
+__cartesian_indeces__ = {'x': 0,
+                         'y': 1,
+                         'z': 2}
+__ibpc_indeces__ = {'elevation': 0,
+                    'azimuth': 1,
+                    'channel': 2,
+                    'component': 3}
+__obpc_indeces__ = {'ommatidia': 0,
+                    'channel': 1,
+                    'component': 2}
+__eye_indeces__ = {'elevation': 0,
+                   'azimuth': 1,
+                   'component': 2}
+__ommadia_indeces__ = {'ommatidia': 0,
+                       'component': 1}
+
+
 def check_scene(scene):
     if is_ibpc(scene):
         #  print("normal")
@@ -139,27 +160,3 @@ def ibs_to_obs(scene, eye_map):
                 eye_map.shape[__ibpc_indeces__['component']])
     ommatidia_map = eye_map.reshape(omm_size)
     return (obs_scene, ommatidia_map)
-
-
-def cartesian_to_spherical(x, y, z):
-    radius = np.sqrt(x**2 + y**2 + z**2)
-    elevation = np.arctan2(z, np.sqrt(x**2 + y**2))
-    azimuth = np.arctan2(y, x)
-    spherical = np.zeros_like(x)
-    spherical = np.tile(spherical[..., np.newaxis], (3,))
-    spherical[..., __spherical_indeces__['elevation']] = elevation
-    spherical[..., __spherical_indeces__['azimuth']] = azimuth
-    spherical[..., __spherical_indeces__['radius']] = radius
-    return spherical
-
-
-def spherical_to_cartesian(elevation, azimuth, radius=1):
-    cartesian = np.zeros_like(elevation)
-    cartesian = np.tile(cartesian[..., np.newaxis], (3,))
-    cartesian[..., __cartesian_indeces__['x']] = np.cos(
-        elevation) * np.cos(azimuth)
-    cartesian[..., __cartesian_indeces__['y']] = np.cos(
-        elevation) * np.sin(azimuth)
-    cartesian[..., __cartesian_indeces__['z']] = np.sin(elevation)
-    cartesian = radius * cartesian
-    return cartesian
-- 
GitLab