From e39061e397a25623c01ca0c9e7f53b3606b114d7 Mon Sep 17 00:00:00 2001
From: Jan Caron <j.caron@fz-juelich.de>
Date: Thu, 25 Sep 2014 13:45:12 +0200
Subject: [PATCH] Intermediat commit on the way to implement norms and more
 regularizations. minor changes to plotting methods (PhaseMap now plottable
 without colorbar). phase_map: gain can now be set to 'auto' (5 fringes,
 determined by max. phase). renamed 'density' to 'gain' (makes more sense).
 regularisator: started to include norms and more kinds of regularisations.
 mag_slicer: GUI which can go through loaded magnetizations along the major
 axes. paper 1: minor changes to the scripts for the results.

---
 pyramid/costfunction.py                       |   6 +-
 pyramid/dataset.py                            |   6 +-
 pyramid/kernel.py                             |  22 +-
 pyramid/phasemap.py                           |  44 +--
 pyramid/phasemapper.py                        |   2 +
 pyramid/regularisator.py                      |  31 ++-
 scripts/collaborations/example_joern.py       |  75 ++++++
 .../vtk_conversion_nanowire_full.py           |  12 +-
 .../create_multiple_samples.py                |   2 +-
 scripts/gui/mag_slicer.py                     | 253 ++++++++++++------
 scripts/gui/mag_slicer.ui                     | 193 +++++++++++--
 .../ch5-0-evaluation_and_comparison.py        |   2 +-
 .../paper 1/ch5-1-evaluation_real_space.py    |  14 +-
 .../paper 1/ch5-2-evaluation_fourier_space.py |  16 +-
 .../paper 1/ch5-3-comparison_of_methods.py    |   2 +-
 .../ch5-4-comparison_of_methods_new.py        | 180 +++++++------
 scripts/test methods/compare_methods.py       |  13 +-
 17 files changed, 592 insertions(+), 281 deletions(-)
 create mode 100644 scripts/collaborations/example_joern.py

diff --git a/pyramid/costfunction.py b/pyramid/costfunction.py
index a18cc4e..f924f74 100644
--- a/pyramid/costfunction.py
+++ b/pyramid/costfunction.py
@@ -50,7 +50,7 @@ class Costfunction(object):
             Se_inv = eye(len(y))
         self.Se_inv = Se_inv
         if regularisator is None:
-            regularisator = ZeroOrderRegularisator(lam=1E-4, size=3*fwd_model.size_3d)
+            regularisator = ZeroOrderRegularisator(fwd_model, lam=1E-4)
         self.regularisator = regularisator
         self.LOG.debug('Created '+str(self))
 
@@ -90,7 +90,7 @@ class Costfunction(object):
         return F.jac_T_dot(x, Se_inv.dot(F(x)-y))
 
     def hess_dot(self, x, vector):
-        '''Calculate the product of a `vector` with the Hession matrix of the costfunction.
+        '''Calculate the product of a `vector` with the Hessian matrix of the costfunction.
 
         Parameters
         ----------
@@ -120,7 +120,7 @@ class CFAdapterScipyCG(LinearOperator):
     This class provides an adapter for the :class:`~.Costfunction` to be usable with the
     :func:`~.scipy.sparse.linalg.cg` function. the :func:`~.matvec` function is overwritten to
     implement a multiplication with the Hessian of the adapted costfunction. This is used in the
-    :func:`~pyramid.reconstruction.optimice_sparse_cg` function of the
+    :func:`~pyramid.reconstruction.optimise_sparse_cg` function of the
     :mod:`~pyramid.reconstruction` module.
 
     Attributes
diff --git a/pyramid/dataset.py b/pyramid/dataset.py
index 5496239..f423b15 100644
--- a/pyramid/dataset.py
+++ b/pyramid/dataset.py
@@ -139,7 +139,7 @@ class DataSet(object):
         plt.show()
 
     def display_combined(self, phase_maps=None, title='Combined Plot', cmap='RdBu', limit=None,
-                         norm=None, density=1, interpolation='none', grad_encode='bright'):
+                         norm=None, gain=1, interpolation='none', grad_encode='bright'):
         '''Display all phasemaps and the resulting color coded holography images.
 
         Parameters
@@ -158,7 +158,7 @@ class DataSet(object):
         norm : :class:`~matplotlib.colors.Normalize` or subclass, optional
             Norm, which is used to determine the colors to encode the phase information.
             If not specified, :class:`~matplotlib.colors.Normalize` is automatically used.
-        density : float, optional
+        gain : float, optional
             The gain factor for determining the number of contour lines in the holographic
             contour map. The default is 1.
         interpolation : {'none, 'bilinear', 'cubic', 'nearest'}, optional
@@ -179,7 +179,7 @@ class DataSet(object):
         if phase_maps is None:
             phase_maps = self.phase_maps
         [phase_map.display_combined('{} ({})'.format(title, self.projectors[i].get_info()),
-                                    cmap, limit, norm, density, interpolation, grad_encode)
+                                    cmap, limit, norm, gain, interpolation, grad_encode)
             for (i, phase_map) in enumerate(phase_maps)]
         plt.show()
 
diff --git a/pyramid/kernel.py b/pyramid/kernel.py
index b0c8477..1aa8ae3 100644
--- a/pyramid/kernel.py
+++ b/pyramid/kernel.py
@@ -91,7 +91,7 @@ class Kernel(object):
         self.u = coeff * get_elementary_phase(geometry, uu, vv, a)
         self.v = coeff * get_elementary_phase(geometry, vv, uu, a)
         # Calculate Fourier trafo of kernel components:
-        dim_combined = 3*np.array(dim_uv) - 1  # dim_uv + (2*dim_uv - 1) magnetisation + kernel
+        dim_combined = 3*np.array(dim_uv) - 2  # (dim_uv-1) + dim_uv + (dim_uv-1) mag + kernel
         self.dim_fft = 2 ** np.ceil(np.log2(dim_combined)).astype(int)  # next multiple of 2
         self.slice_fft = (slice(dim_uv[0]-1, 2*dim_uv[0]-1), slice(dim_uv[1]-1, 2*dim_uv[1]-1))
         self.u_fft = np.fft.rfftn(self.u, self.dim_fft)
@@ -208,23 +208,3 @@ class Kernel(object):
         result = np.zeros(2*np.prod(self.dim_uv))
         core.multiply_jacobi_T_core(self.dim_uv[0], self.dim_uv[1], self.u, self.v, vector, result)
         return result
-
-    def test(self, vector):
-        result = np.zeros(2*np.prod(self.dim_uv))
-        u_dim, v_dim = self.dim_uv
-        r = 0  # Current result component / contributing pixel (numbered consecutively)
-        # Iterate over all contributingh pixels:
-        for j in range(v_dim):
-            for i in range(u_dim):
-                u_min = (u_dim-1) - i  # u_max = u_min + u_dim
-                v_min = (v_dim-1) - j  # v_max = v_min + v_dim
-                s = 0  # Current affected pixel (numbered consecutively)
-                # Go over the current kernel cutout [v_min:v_max, u_min:u_max]:
-                for v in range(v_min, v_min + v_dim):
-                    for u in range(u_min, u_min + u_dim):
-                        result[r] += vector[s] * self.u[v, u]
-                        result[r+self.size] -= vector[s] * self.v[v, u]
-                        s += 1
-                r += 1
-        return result
-# TODO: delete
diff --git a/pyramid/phasemap.py b/pyramid/phasemap.py
index 9dd4add..93126b3 100644
--- a/pyramid/phasemap.py
+++ b/pyramid/phasemap.py
@@ -296,8 +296,8 @@ class PhaseMap(object):
         phase_file.close()
         return PhaseMap(a, phase)
 
-    def display_phase(self, title='Phase Map', cmap='RdBu',
-                      limit=None, norm=None, axis=None, show=True):
+    def display_phase(self, title='Phase Map', cmap='RdBu', limit=None,
+                      norm=None, axis=None, cbar=True, show=True):
         '''Display the phasemap as a colormesh.
 
         Parameters
@@ -315,6 +315,8 @@ class PhaseMap(object):
             If not specified, :class:`~matplotlib.colors.Normalize` is automatically used.
         axis : :class:`~matplotlib.axes.AxesSubplot`, optional
             Axis on which the graph is plotted. Creates a new figure if none is specified.
+        cbar : bool, optional
+            A switch determining if the colorbar should be plotted or not. Default is True.
         show : bool, optional
             A switch which determines if the plot is shown at the end of plotting.
 
@@ -348,12 +350,13 @@ class PhaseMap(object):
         axis.set_xlabel('u-axis [nm]', fontsize=15)
         axis.set_ylabel('v-axis [nm]', fontsize=15)
         # Add colorbar:
-        fig = plt.gcf()
-        fig.subplots_adjust(right=0.8)
-        cbar_ax = fig.add_axes([0.82, 0.15, 0.02, 0.7])
-        cbar = fig.colorbar(im, cax=cbar_ax)
-        cbar.ax.tick_params(labelsize=14)
-        cbar.set_label(u'phase shift [{}]'.format(self.unit), fontsize=15)
+        if cbar:
+            fig = plt.gcf()
+            fig.subplots_adjust(right=0.8)
+            cbar_ax = fig.add_axes([0.82, 0.15, 0.02, 0.7])
+            cbar = fig.colorbar(im, cax=cbar_ax)
+            cbar.ax.tick_params(labelsize=14)
+            cbar.set_label(u'phase shift [{}]'.format(self.unit), fontsize=15)
         # Show plot:
         if show:
             plt.show()
@@ -402,16 +405,17 @@ class PhaseMap(object):
         # Return plotting axis:
         return axis
 
-    def display_holo(self, title='Holographic Contour Map', density=1,
-                     axis=None, grad_encode='bright', interpolation='none', show=True):
+    def display_holo(self, title=None, gain=1, axis=None, grad_encode='bright',
+                     interpolation='none', show=True):
         '''Display the color coded holography image.
 
         Parameters
         ----------
         title : string, optional
-            The title of the plot. The default is 'Holographic Contour Map'.
-        density : float, optional
+            The title of the plot. The default is 'Contour Map (gain: %g)' % gain.
+        gain : float or 'auto', optional
             The gain factor for determining the number of contour lines. The default is 1.
+            If 'auto' is used, the gain will be determined automatically to look pretty.
         axis : :class:`~matplotlib.axes.AxesSubplot`, optional
             Axis on which the graph is plotted. Creates a new figure if none is specified.
         grad_encode: {'bright', 'dark', 'color', 'none'}, optional
@@ -431,8 +435,14 @@ class PhaseMap(object):
 
         '''
         self.LOG.debug('Calling display_holo')
+        # Calculate gain if 'auto' is selected:
+        if gain == 'auto':
+            gain = 5 * 2*pi/self.phase.max()
+        # Set title if not set:
+        if title is None:
+            title = 'Contour Map (gain: %.2g)' % gain
         # Calculate the holography image intensity:
-        img_holo = (1 + np.cos(density * self.phase)) / 2
+        img_holo = (1 + np.cos(gain * self.phase)) / 2
         # Calculate the phase gradients, expressed by magnitude and angle:
         phase_grad_y, phase_grad_x = np.gradient(self.phase, self.a, self.a)
         phase_angle = (1 - np.arctan2(phase_grad_y, phase_grad_x)/pi) / 2
@@ -469,7 +479,7 @@ class PhaseMap(object):
         axis.imshow(holo_image, origin='lower', interpolation=interpolation)
         # Set the title and the axes labels:
         axis.set_title(title)
-        plt.tick_params(axis='both', which='major', labelsize=14)
+        axis.tick_params(axis='both', which='major', labelsize=14)
         axis.set_title(title, fontsize=18)
         axis.set_xlabel('u-axis [px]', fontsize=15)
         axis.set_ylabel('v-axis [px]', fontsize=15)
@@ -484,7 +494,7 @@ class PhaseMap(object):
         return axis
 
     def display_combined(self, title='Combined Plot', cmap='RdBu', limit=None, norm=None,
-                         density=1, interpolation='none', grad_encode='bright', show=True):
+                         gain=1, interpolation='none', grad_encode='bright', show=True):
         '''Display the phase map and the resulting color coded holography image in one plot.
 
         Parameters
@@ -500,7 +510,7 @@ class PhaseMap(object):
         norm : :class:`~matplotlib.colors.Normalize` or subclass, optional
             Norm, which is used to determine the colors to encode the phase information.
             If not specified, :class:`~matplotlib.colors.Normalize` is automatically used.
-        density : float, optional
+        gain : float, optional
             The gain factor for determining the number of contour lines in the holographic
             contour map. The default is 1.
         interpolation : {'none, 'bilinear', 'cubic', 'nearest'}, optional
@@ -526,7 +536,7 @@ class PhaseMap(object):
         fig.suptitle(title, fontsize=20)
         # Plot holography image:
         holo_axis = fig.add_subplot(1, 2, 1, aspect='equal')
-        self.display_holo(density=density, axis=holo_axis, interpolation=interpolation,
+        self.display_holo(gain=gain, axis=holo_axis, interpolation=interpolation,
                           show=False, grad_encode=grad_encode)
         # Plot phase map:
         phase_axis = fig.add_subplot(1, 2, 2, aspect='equal')
diff --git a/pyramid/phasemapper.py b/pyramid/phasemapper.py
index 77ed1be..62aeabd 100644
--- a/pyramid/phasemapper.py
+++ b/pyramid/phasemapper.py
@@ -306,10 +306,12 @@ class PMConvolve(PhaseMapper):
         u_mag_fft = np.fft.rfftn(u_mag, kernel.dim_fft)
         v_mag_fft = np.fft.rfftn(v_mag, kernel.dim_fft)
         # Convolve the magnetization with the kernel in Fourier space:
+        # TODO: why copy again?
         u_phase = np.fft.irfftn(u_mag_fft * kernel.u_fft, kernel.dim_fft)[kernel.slice_fft].copy()
         v_phase = np.fft.irfftn(v_mag_fft * kernel.v_fft, kernel.dim_fft)[kernel.slice_fft].copy()
         # Return the result:
         return PhaseMap(self.a, u_phase-v_phase)
+        # TODO: backtransformation AFTER subtraction???
 
     def __repr__(self):
         self.LOG.debug('Calling __repr__')
diff --git a/pyramid/regularisator.py b/pyramid/regularisator.py
index c3b680f..2cf9421 100644
--- a/pyramid/regularisator.py
+++ b/pyramid/regularisator.py
@@ -10,7 +10,9 @@ import abc
 
 import numpy as np
 
-from scipy.sparse import eye
+from scipy.sparse import eye, coo_matrix, csr_matrix
+
+from pyramid.converter import IndexConverter
 
 import logging
 
@@ -28,7 +30,7 @@ class Regularisator(object):
     LOG = logging.getLogger(__name__+'.Regularisator')
 
     @abc.abstractmethod
-    def __init__(self, Sa_sqrt_inv, x_a=None):
+    def __init__(self, Sa_inv, x_a=None):
         self.LOG.debug('Calling __init__')
         self.Sa_sqrt_inv = Sa_sqrt_inv
         if x_a is None:
@@ -56,8 +58,8 @@ class Regularisator(object):
 class ZeroOrderRegularisator(Regularisator):
     # TODO: Docstring!
 
-    def __init__(self, lam, size, x_a=None):
-        Sa_inv = lam * eye(size)
+    def __init__(self, fwd_model, lam, x_a=None):
+        Sa_inv = lam * eye(3*fwd_model.size_3d)
         super(ZeroOrderRegularisator, self).__init__(Sa_inv, x_a)
         self.LOG.debug('Created '+str(self))
 
@@ -65,15 +67,30 @@ class ZeroOrderRegularisator(Regularisator):
 class FirstOrderRegularisator(Regularisator):
     # TODO: Docstring!
 
-    def __init__(self, lam, size, x_a=None):
+    def __init__(self, fwd_model, lam, x_a=None):
+        size_3d = fwd_model.size_3d
+        dim = fwd_model.dim
+        converter = IndexConverter(dim)
+        row = []
+        col = []
+        data = []
+
+        for i in range(size_3d):
+            neighbours = converter.find_neighbour_ind(i)
+
+
+
+
+
+
+
 
-        Sa_inv = lam * eye(size)
 
 
+            Sa_inv = csr_matrix(coo_matrix(data, (rows, columns)), shape=(3*size_3d, 3*size_3d))
 
 
 
-        csr_matrix(coo_matrix((np.tile(data, dim_rot), (rows, columns)), shape=(size_2d, size_3d)))
 
         term2 = []
         for i in range(3):
diff --git a/scripts/collaborations/example_joern.py b/scripts/collaborations/example_joern.py
new file mode 100644
index 0000000..8420d9a
--- /dev/null
+++ b/scripts/collaborations/example_joern.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Mon Aug 11 08:41:23 2014
+
+@author: Jan
+"""
+
+import os
+
+import numpy as np
+
+import pickle
+
+import matplotlib.pyplot as plt
+
+import pyramid
+from pyramid.phasemap import PhaseMap
+from pyramid.projector import SimpleProjector
+from pyramid.phasemapper import PMConvolve
+import pyramid.reconstruction as rc
+
+from time import clock
+
+import logging
+import logging.config
+
+
+LOGGING_CONF = os.path.join(os.path.dirname(os.path.realpath(pyramid.__file__)), 'logging.ini')
+
+
+logging.config.fileConfig(LOGGING_CONF, disable_existing_loggers=False)
+###################################################################################################
+threshold = 1
+a = 1.0  # in nm
+gain = 5
+b_0 = 1
+inter = 'none'
+dim_small = (64, 64)
+smoothed_pictures = True
+lam = 1E-4
+order = 1
+log = True
+PATH = '../../output/joern/'
+###################################################################################################
+# Read in files:
+phase_map = PhaseMap.load_from_netcdf4(PATH+'phase_map.nc')
+with open(PATH+'mask.pickle') as pf:
+    mask = pickle.load(pf)
+# Reconstruct the magnetic distribution:
+tic = clock()
+mag_data_rec = rc.optimize_simple_leastsq(phase_map, mask, b_0, lam=lam, order=order)
+print 'reconstruction time:', clock() - tic
+# Display the reconstructed phase map and holography image:
+phase_map_rec = PMConvolve(a, SimpleProjector(mag_data_rec.dim), b_0)(mag_data_rec)
+phase_map_rec.display_combined('Reconstr. Distribution', gain=gain, interpolation=inter)
+# Plot the magnetization:
+axis = (mag_data_rec*(1/mag_data_rec.magnitude.max())).quiver_plot()
+axis.set_xlim(20, 45)
+axis.set_ylim(20, 45)
+# Display the Phase:
+phase_diff = phase_map_rec-phase_map
+phase_diff.display_phase('Difference')
+# Get the average difference from the experimental results:
+print 'Average difference:', np.average(phase_diff.phase)
+# Plot holographic contour maps with overlayed magnetic distributions:
+axis = phase_map_rec.display_holo('Magnetization Overlay', gain=0.1, interpolation=inter)
+mag_data_rec.quiver_plot(axis=axis)
+axis = plt.gca()
+axis.set_xlim(20, 45)
+axis.set_ylim(20, 45)
+axis = phase_map_rec.display_holo('Magnetization Overlay', gain=0.1, interpolation=inter)
+mag_data_rec.quiver_plot(axis=axis, log=log)
+axis = plt.gca()
+axis.set_xlim(20, 45)
+axis.set_ylim(20, 45)
diff --git a/scripts/collaborations/vtk_conversion_nanowire_full.py b/scripts/collaborations/vtk_conversion_nanowire_full.py
index 697e6bc..fdd3820 100644
--- a/scripts/collaborations/vtk_conversion_nanowire_full.py
+++ b/scripts/collaborations/vtk_conversion_nanowire_full.py
@@ -36,7 +36,7 @@ force_calculation = False
 count = 16
 dim_uv_x = (500, 100)
 dim_uv_y = (100, 500)
-density = 8
+gain = 8
 ###################################################################################################
 # Load vtk-data:
 if force_calculation or not os.path.exists(PATH+'.pickle'):
@@ -142,8 +142,8 @@ for i in range(len(pm_y)):
     data_set_y.append((pm_y[i](mag_data_scaled), projectors_y[i]))
     data_set_x.append((pm_x[i](mag_data_scaled), projectors_x[i]))
 # Display phase maps:
-data_set_y.display_combined(density=density, interpolation='bilinear')
-data_set_x.display_combined(density=density, interpolation='bilinear')
+data_set_y.display_combined(gain=gain, interpolation='bilinear')
+data_set_x.display_combined(gain=gain, interpolation='bilinear')
 # Save figures:
 figures = [manager.canvas.figure for manager in Gcf.get_all_fig_managers()]
 for i, figure in enumerate(figures):
@@ -164,7 +164,7 @@ for angle in angles:
     mag_data_tip = MagData(mag_data.a, mag_data.magnitude[:, 608:, ...])
     pm = PMConvolve(mag_data.a, projector)
     phase_map_tip = PhaseMap(mag_data.a, pm(mag_data_tip).phase[350-shift:530-shift, :])
-    phase_map_tip.display_combined('Phase Map Nanowire Tip', density=density,
+    phase_map_tip.display_combined('Phase Map Nanowire Tip', gain=gain,
                                    interpolation='bilinear')
     plt.savefig(PATH+'_nanowire_tip_xtilt_{}.png'.format(angle))
     mag_data_tip.scale_down()
@@ -181,9 +181,9 @@ for angle in angles:
     mag_data_bot = MagData(mag_data.a, mag_data.magnitude[:, :300, ...])
     pm = PMConvolve(mag_data.a, projector)
     phase_map_tip = PhaseMap(mag_data.a, pm(mag_data_bot).phase[50+shift:225+shift, :])
-    phase_map_tip.display_combined('Phase Map Nanowire Bottom', density=density,
+    phase_map_tip.display_combined('Phase Map Nanowire Bottom', gain=gain,
                                    interpolation='bilinear')
-    plt.savefig(PATH+'_nanowire_bot_xtilt_{}.png'.format(angle))
+    plt.savefig(PATH+'_nanowire_bot_xtilt_{}_no_frame.png'.format(angle))
     mag_data_bot.scale_down()
     mag_proj_bot = projector_scaled.to_mag_data(mag_data_bot)
     axis = mag_proj_bot.quiver_plot()
diff --git a/scripts/create distributions/create_multiple_samples.py b/scripts/create distributions/create_multiple_samples.py
index d791960..1900007 100644
--- a/scripts/create distributions/create_multiple_samples.py	
+++ b/scripts/create distributions/create_multiple_samples.py	
@@ -49,4 +49,4 @@ mag_data += MagData(a, mc.create_mag_dist_homog(mag_shape_sphere, pi))
 mag_data.quiver_plot()
 mag_data.save_to_llg(filename)
 phase_map = PMConvolve(a, SimpleProjector(dim))(mag_data)
-phase_map.display_combined(density=0.5)
+phase_map.display_combined(gain='auto')
diff --git a/scripts/gui/mag_slicer.py b/scripts/gui/mag_slicer.py
index fcce907..bfe8119 100644
--- a/scripts/gui/mag_slicer.py
+++ b/scripts/gui/mag_slicer.py
@@ -15,6 +15,8 @@ from PyQt4 import QtCore, QtGui
 from matplotlibwidget import MatplotlibWidget
 
 from pyramid.magdata import MagData
+from pyramid.projector import SimpleProjector
+from pyramid.phasemapper import PMConvolve
 
 
 try:
@@ -39,118 +41,201 @@ class UI_MagSlicerMain(QtGui.QWidget):
     def __init__(self, parent=None):
         QtGui.QWidget.__init__(self, parent)
         Form = self
-        self.setGeometry(100, 100, 650, 650)
+        self.setGeometry(100, 100, 1405, 550)
         self.setWindowTitle('Mag Slicer')
-        self.gridLayout = QtGui.QGridLayout(Form)
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
+        ###########################################################################################
+        self.verticalLayout = QtGui.QVBoxLayout(Form)
+        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
         self.horizontalLayout = QtGui.QHBoxLayout()
         self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
-        self.pushButton = QtGui.QPushButton(Form)
-        self.pushButton.setObjectName(_fromUtf8("pushButton"))
-        self.horizontalLayout.addWidget(self.pushButton)
-        self.scaleCheckBox = QtGui.QCheckBox(Form)
-        self.scaleCheckBox.setChecked(True)
-        self.scaleCheckBox.setTristate(False)
-        self.scaleCheckBox.setObjectName(_fromUtf8("scaleCheckBox"))
-        self.horizontalLayout.addWidget(self.scaleCheckBox)
-        self.logCheckBox = QtGui.QCheckBox(Form)
-        self.logCheckBox.setObjectName(_fromUtf8("logCheckBox"))
-        self.horizontalLayout.addWidget(self.logCheckBox)
-        self.comboBox = QtGui.QComboBox(Form)
-        self.comboBox.setObjectName(_fromUtf8("comboBox"))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.horizontalLayout.addWidget(self.comboBox)
-        self.label = QtGui.QLabel(Form)
-        self.label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing |
-                                QtCore.Qt.AlignVCenter)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.horizontalLayout.addWidget(self.label)
-        self.spinBox = QtGui.QSpinBox(Form)
-        self.spinBox.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing |
-                                  QtCore.Qt.AlignVCenter)
-        self.spinBox.setMaximum(0)
-        self.spinBox.setProperty("value", 0)
-        self.spinBox.setObjectName(_fromUtf8("spinBox"))
-        self.horizontalLayout.addWidget(self.spinBox)
-        self.scrollBar = QtGui.QScrollBar(Form)
+        self.pushButtonLoad = QtGui.QPushButton(Form)
+        self.pushButtonLoad.setObjectName(_fromUtf8("pushButtonLoad"))
+        self.horizontalLayout.addWidget(self.pushButtonLoad)
+        self.checkBoxScale = QtGui.QCheckBox(Form)
+        self.checkBoxScale.setChecked(True)
+        self.checkBoxScale.setTristate(False)
+        self.checkBoxScale.setObjectName(_fromUtf8("checkBoxScale"))
+        self.horizontalLayout.addWidget(self.checkBoxScale)
+        self.checkBoxLog = QtGui.QCheckBox(Form)
+        self.checkBoxLog.setObjectName(_fromUtf8("checkBoxLog"))
+        self.horizontalLayout.addWidget(self.checkBoxLog)
+        self.comboBoxSlice = QtGui.QComboBox(Form)
+        self.comboBoxSlice.setObjectName(_fromUtf8("comboBoxSlice"))
+        self.comboBoxSlice.addItem(_fromUtf8(""))
+        self.comboBoxSlice.addItem(_fromUtf8(""))
+        self.comboBoxSlice.addItem(_fromUtf8(""))
+        self.horizontalLayout.addWidget(self.comboBoxSlice)
+        self.labelSlice = QtGui.QLabel(Form)
+        self.labelSlice.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing |
+                                     QtCore.Qt.AlignVCenter)
+        self.labelSlice.setObjectName(_fromUtf8("labelSlice"))
+        self.horizontalLayout.addWidget(self.labelSlice)
+        self.spinBoxSlice = QtGui.QSpinBox(Form)
+        self.spinBoxSlice.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing |
+                                       QtCore.Qt.AlignVCenter)
+        self.spinBoxSlice.setMaximum(0)
+        self.spinBoxSlice.setProperty("value", 0)
+        self.spinBoxSlice.setObjectName(_fromUtf8("spinBoxSlice"))
+        self.horizontalLayout.addWidget(self.spinBoxSlice)
+        self.scrollBarSlice = QtGui.QScrollBar(Form)
         sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.scrollBar.sizePolicy().hasHeightForWidth())
-        self.scrollBar.setSizePolicy(sizePolicy)
-        self.scrollBar.setMaximum(0)
-        self.scrollBar.setOrientation(QtCore.Qt.Horizontal)
-        self.scrollBar.setObjectName(_fromUtf8("scrollBar"))
-        self.horizontalLayout.addWidget(self.scrollBar)
-        self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
-        self.mplWidget = MatplotlibWidget(Form)
-        self.mplWidget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
-        self.mplWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
-        self.mplWidget.setAutoFillBackground(False)
-        self.mplWidget.setObjectName(_fromUtf8("mplWidget"))
-        self.gridLayout.addWidget(self.mplWidget, 1, 0, 1, 1)
+        sizePolicy.setHeightForWidth(self.scrollBarSlice.sizePolicy().hasHeightForWidth())
+        self.scrollBarSlice.setSizePolicy(sizePolicy)
+        self.scrollBarSlice.setMinimumSize(QtCore.QSize(400, 0))
+        self.scrollBarSlice.setMaximum(0)
+        self.scrollBarSlice.setOrientation(QtCore.Qt.Horizontal)
+        self.scrollBarSlice.setObjectName(_fromUtf8("scrollBarSlice"))
+        self.horizontalLayout.addWidget(self.scrollBarSlice)
+        self.checkBoxSmooth = QtGui.QCheckBox(Form)
+        self.checkBoxSmooth.setChecked(True)
+        self.checkBoxSmooth.setObjectName(_fromUtf8("checkBoxSmooth"))
+        self.horizontalLayout.addWidget(self.checkBoxSmooth)
+        self.checkBoxAuto = QtGui.QCheckBox(Form)
+        self.checkBoxAuto.setChecked(True)
+        self.checkBoxAuto.setObjectName(_fromUtf8("checkBoxAuto"))
+        self.horizontalLayout.addWidget(self.checkBoxAuto)
+        self.labelGain = QtGui.QLabel(Form)
+        self.labelGain.setObjectName(_fromUtf8("labelGain"))
+        self.horizontalLayout.addWidget(self.labelGain)
+        self.spinBoxGain = QtGui.QDoubleSpinBox(Form)
+        self.spinBoxGain.setEnabled(False)
+        self.spinBoxGain.setMaximum(1000000.0)
+        self.spinBoxGain.setSingleStep(0.1)
+        self.spinBoxGain.setProperty("value", 1.0)
+        self.spinBoxGain.setObjectName(_fromUtf8("spinBoxGain"))
+        self.horizontalLayout.addWidget(self.spinBoxGain)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.horizontalLayoutPlots = QtGui.QHBoxLayout()
+        self.horizontalLayoutPlots.setSpacing(0)
+        self.horizontalLayoutPlots.setSizeConstraint(QtGui.QLayout.SetNoConstraint)
+        self.horizontalLayoutPlots.setObjectName(_fromUtf8("horizontalLayoutPlots"))
+        self.mplWidgetMag = MatplotlibWidget(Form)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(10)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.mplWidgetMag.sizePolicy().hasHeightForWidth())
+        self.mplWidgetMag.setSizePolicy(sizePolicy)
+        self.mplWidgetMag.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+        self.mplWidgetMag.setLayoutDirection(QtCore.Qt.LeftToRight)
+        self.mplWidgetMag.setAutoFillBackground(False)
+        self.mplWidgetMag.setObjectName(_fromUtf8("mplWidgetMag"))
+        self.horizontalLayoutPlots.addWidget(self.mplWidgetMag)
+        self.mplWidgetHolo = MatplotlibWidget(Form)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(10)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.mplWidgetHolo.sizePolicy().hasHeightForWidth())
+        self.mplWidgetHolo.setSizePolicy(sizePolicy)
+        self.mplWidgetHolo.setObjectName(_fromUtf8("mplWidgetHolo"))
+        self.horizontalLayoutPlots.addWidget(self.mplWidgetHolo)
+        self.mplWidgetPhase = MatplotlibWidget(Form)
+        self.mplWidgetPhase.setEnabled(True)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(10)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.mplWidgetPhase.sizePolicy().hasHeightForWidth())
+        self.mplWidgetPhase.setSizePolicy(sizePolicy)
+        self.mplWidgetPhase.setObjectName(_fromUtf8("mplWidgetPhase"))
+        self.horizontalLayoutPlots.addWidget(self.mplWidgetPhase)
+        self.verticalLayout.addLayout(self.horizontalLayoutPlots)
+        ###########################################################################################
         self.retranslateUi(Form)
-        self.connect(self.scrollBar, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")),
-                     self.spinBox.setValue)
-        self.connect(self.spinBox, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")),
-                     self.scrollBar.setValue)
-        self.connect(self.logCheckBox, QtCore.SIGNAL(_fromUtf8('clicked()')),
-                     self.update_plot)
-        self.connect(self.scaleCheckBox, QtCore.SIGNAL(_fromUtf8('clicked()')),
-                     self.update_plot)
-        self.connect(self.spinBox, QtCore.SIGNAL(_fromUtf8('valueChanged(int)')),
-                     self.update_plot)
-        self.connect(self.comboBox, QtCore.SIGNAL(_fromUtf8('currentIndexChanged(int)')),
-                     self.update_ui)
-        self.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8('clicked()')),
+        self.connect(self.spinBoxSlice, QtCore.SIGNAL(_fromUtf8("editingFinished()")),
+                     self.scrollBarSlice.setValue)
+        self.connect(self.scrollBarSlice, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")),
+                     self.spinBoxSlice.setValue)
+        self.connect(self.checkBoxAuto, QtCore.SIGNAL(_fromUtf8("toggled(bool)")),
+                     self.spinBoxGain.setDisabled)
+        self.connect(self.checkBoxLog, QtCore.SIGNAL(_fromUtf8('clicked()')),
+                     self.update_slice)
+        self.connect(self.checkBoxScale, QtCore.SIGNAL(_fromUtf8('clicked()')),
+                     self.update_slice)
+        self.connect(self.spinBoxSlice, QtCore.SIGNAL(_fromUtf8('valueChanged(int)')),
+                     self.update_slice)
+        self.connect(self.comboBoxSlice, QtCore.SIGNAL(_fromUtf8('currentIndexChanged(int)')),
+                     self.update_phase)
+        self.connect(self.spinBoxGain, QtCore.SIGNAL(_fromUtf8('editingFinished()')),
+                     self.update_phase)
+        self.connect(self.checkBoxAuto, QtCore.SIGNAL(_fromUtf8('toggled(bool)')),
+                     self.update_phase)
+        self.connect(self.checkBoxSmooth, QtCore.SIGNAL(_fromUtf8('toggled(bool)')),
+                     self.update_phase)
+        self.connect(self.pushButtonLoad, QtCore.SIGNAL(_fromUtf8('clicked()')),
                      self.load)
         QtCore.QMetaObject.connectSlotsByName(Form)
+        self.mplWidgetMag.axes.set_visible(False)
+        self.mplWidgetHolo.axes.set_visible(False)
+        self.mplWidgetPhase.axes.set_visible(False)
+        self.mag_data_loaded = False
 
     def retranslateUi(self, Form):
+        ###########################################################################################
         Form.setWindowTitle(_translate("Form", "Mag Slicer", None))
-        self.pushButton.setText(_translate("Form", "Laden", None))
-        self.scaleCheckBox.setText(_translate("Form", "Scaled", None))
-        self.logCheckBox.setText(_translate("Form", "Log", None))
-        self.comboBox.setItemText(0, _translate("Form", "xy-plane", None))
-        self.comboBox.setItemText(1, _translate("Form", "xz-plane", None))
-        self.comboBox.setItemText(2, _translate("Form", "zy-plane", None))
-        self.label.setText(_translate("Form", "Slice:", None))
-
-    def update_ui(self):
+        self.pushButtonLoad.setText(_translate("Form", "Laden", None))
+        self.checkBoxScale.setText(_translate("Form", "Scaled", None))
+        self.checkBoxLog.setText(_translate("Form", "Log", None))
+        self.comboBoxSlice.setItemText(0, _translate("Form", "xy-plane", None))
+        self.comboBoxSlice.setItemText(1, _translate("Form", "xz-plane", None))
+        self.comboBoxSlice.setItemText(2, _translate("Form", "zy-plane", None))
+        self.labelSlice.setText(_translate("Form", "Slice:", None))
+        self.checkBoxSmooth.setText(_translate("Form", "Smooth", None))
+        self.checkBoxAuto.setText(_translate("Form", "Auto", None))
+        self.labelGain.setText(_translate("Form", "Gain:", None))
+        ###########################################################################################
+
+    def update_phase(self):
         if self.mag_data_loaded:
-            mode_ind = self.comboBox.currentIndex()
+            mode_ind = self.comboBoxSlice.currentIndex()
             if mode_ind == 0:
                 self.mode = 'z'
-                length = self.mag_data.dim[0]-1
+                length = self.mag_data.dim[0] - 1
             elif mode_ind == 1:
                 self.mode = 'y'
-                length = self.mag_data.dim[1]-1
+                length = self.mag_data.dim[1] - 1
             else:
                 self.mode = 'x'
-                length = self.mag_data.dim[2]-1
-            self.spinBox.setMaximum(length)
-            self.scrollBar.setMaximum(length)
-            self.spinBox.setValue(int(length/2.))
-            self.update_plot()
+                length = self.mag_data.dim[2] - 1
+            if self.checkBoxAuto.isChecked():
+                gain = 'auto'
+            else:
+                gain = self.spinBoxGain.value()
+            self.projector = SimpleProjector(self.mag_data.dim, axis=self.mode)
+            self.spinBoxSlice.setMaximum(length)
+            self.scrollBarSlice.setMaximum(length)
+            self.spinBoxSlice.setValue(int(length/2.))
+            self.update_slice()
+            self.phase_map = PMConvolve(self.mag_data.a, self.projector)(self.mag_data)
+            self.phase_map.display_phase(axis=self.mplWidgetPhase.axes, cbar=False, show=False)
+            if self.checkBoxSmooth.isChecked():
+                interpolation = 'bilinear'
+            else:
+                interpolation = 'none'
+            self.phase_map.display_holo(axis=self.mplWidgetHolo.axes, gain=gain,
+                                        interpolation=interpolation, show=False)
+            self.mplWidgetPhase.draw()
+            self.mplWidgetHolo.draw()
 
-    def update_plot(self):
+    def update_slice(self):
         if self.mag_data_loaded:
-            self.mag_data.quiver_plot(axis=self.mplWidget.axes, proj_axis=self.mode,
-                                      ax_slice=self.spinBox.value(),
-                                      log=self.logCheckBox.isChecked(),
-                                      scaled=self.scaleCheckBox.isChecked(),
+            self.mag_data.quiver_plot(axis=self.mplWidgetMag.axes, proj_axis=self.mode,
+                                      ax_slice=self.spinBoxSlice.value(),
+                                      log=self.checkBoxLog.isChecked(),
+                                      scaled=self.checkBoxScale.isChecked(),
                                       show=False)
-            self.mplWidget.draw()
+            self.mplWidgetMag.draw()
 
     def load(self):
         mag_file = QtGui.QFileDialog.getOpenFileName(self, 'Open Data File', '',
                                                      'NetCDF files (*.nc)')
         self.mag_data = MagData.load_from_netcdf4(mag_file)
         self.mag_data_loaded = True
-        self.comboBox.setCurrentIndex(0)
-        self.update_ui()
+        self.mplWidgetMag.axes.set_visible(True)
+        self.mplWidgetHolo.axes.set_visible(True)
+        self.mplWidgetPhase.axes.set_visible(True)
+        self.comboBoxSlice.setCurrentIndex(0)
+        self.update_phase()
 
 
 if __name__ == '__main__':
diff --git a/scripts/gui/mag_slicer.ui b/scripts/gui/mag_slicer.ui
index 030f735..453a95c 100644
--- a/scripts/gui/mag_slicer.ui
+++ b/scripts/gui/mag_slicer.ui
@@ -6,25 +6,31 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>652</width>
-    <height>646</height>
+    <width>993</width>
+    <height>351</height>
    </rect>
   </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
   <property name="windowTitle">
    <string>Mag Slicer</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0">
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
-      <widget class="QPushButton" name="pushButton">
+      <widget class="QPushButton" name="pushButtonLoad">
        <property name="text">
         <string>Laden</string>
        </property>
       </widget>
      </item>
      <item>
-      <widget class="QCheckBox" name="scaleCheckBox">
+      <widget class="QCheckBox" name="checkBoxScale">
        <property name="text">
         <string>Scaled</string>
        </property>
@@ -37,14 +43,14 @@
       </widget>
      </item>
      <item>
-      <widget class="QCheckBox" name="logCheckBox">
+      <widget class="QCheckBox" name="checkBoxLog">
        <property name="text">
         <string>Log</string>
        </property>
       </widget>
      </item>
      <item>
-      <widget class="QComboBox" name="comboBox">
+      <widget class="QComboBox" name="comboBoxSlice">
        <item>
         <property name="text">
          <string>xy-plane</string>
@@ -63,7 +69,7 @@
       </widget>
      </item>
      <item>
-      <widget class="QLabel" name="label">
+      <widget class="QLabel" name="labelSlice">
        <property name="text">
         <string>Slice:</string>
        </property>
@@ -73,7 +79,7 @@
       </widget>
      </item>
      <item>
-      <widget class="QSpinBox" name="spinBox">
+      <widget class="QSpinBox" name="spinBoxSlice">
        <property name="alignment">
         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
        </property>
@@ -86,13 +92,19 @@
       </widget>
      </item>
      <item>
-      <widget class="QScrollBar" name="scrollBar">
+      <widget class="QScrollBar" name="scrollBarSlice">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
+       <property name="minimumSize">
+        <size>
+         <width>400</width>
+         <height>0</height>
+        </size>
+       </property>
        <property name="maximum">
         <number>0</number>
        </property>
@@ -101,26 +113,102 @@
        </property>
       </widget>
      </item>
+     <item>
+      <widget class="QCheckBox" name="checkBoxSmooth">
+       <property name="text">
+        <string>Smooth</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="checkBoxAuto">
+       <property name="text">
+        <string>Auto</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="labelGain">
+       <property name="text">
+        <string>Gain:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QDoubleSpinBox" name="spinBoxGain">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="maximum">
+        <double>1000000.000000000000000</double>
+       </property>
+       <property name="singleStep">
+        <double>0.100000000000000</double>
+       </property>
+       <property name="value">
+        <double>1.000000000000000</double>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
-   <item row="1" column="0">
-    <widget class="MatplotlibWidget" name="mplWidget">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="cursor">
-      <cursorShape>ArrowCursor</cursorShape>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayoutPlots">
+     <property name="spacing">
+      <number>0</number>
      </property>
-     <property name="layoutDirection">
-      <enum>Qt::LeftToRight</enum>
+     <property name="sizeConstraint">
+      <enum>QLayout::SetNoConstraint</enum>
      </property>
-     <property name="autoFillBackground">
-      <bool>false</bool>
-     </property>
-    </widget>
+     <item>
+      <widget class="MatplotlibWidget" name="mplWidgetMag">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Ignored" vsizetype="Expanding">
+         <horstretch>10</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="cursor">
+        <cursorShape>ArrowCursor</cursorShape>
+       </property>
+       <property name="layoutDirection">
+        <enum>Qt::LeftToRight</enum>
+       </property>
+       <property name="autoFillBackground">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="MatplotlibWidget" name="mplWidgetHolo">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Ignored" vsizetype="Expanding">
+         <horstretch>10</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="MatplotlibWidget" name="mplWidgetPhase">
+       <property name="enabled">
+        <bool>true</bool>
+       </property>
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Ignored" vsizetype="Expanding">
+         <horstretch>10</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+      </widget>
+     </item>
+    </layout>
    </item>
   </layout>
  </widget>
@@ -132,5 +220,54 @@
   </customwidget>
  </customwidgets>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>spinBoxSlice</sender>
+   <signal>valueChanged(int)</signal>
+   <receiver>scrollBarSlice</receiver>
+   <slot>setValue(int)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>335</x>
+     <y>18</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>380</x>
+     <y>17</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>scrollBarSlice</sender>
+   <signal>valueChanged(int)</signal>
+   <receiver>spinBoxSlice</receiver>
+   <slot>setValue(int)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>364</x>
+     <y>27</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>321</x>
+     <y>29</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>checkBoxAuto</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>spinBoxGain</receiver>
+   <slot>setDisabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>761</x>
+     <y>18</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>870</x>
+     <y>14</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
 </ui>
diff --git a/scripts/publications/paper 1/ch5-0-evaluation_and_comparison.py b/scripts/publications/paper 1/ch5-0-evaluation_and_comparison.py
index 4465481..82417ca 100644
--- a/scripts/publications/paper 1/ch5-0-evaluation_and_comparison.py	
+++ b/scripts/publications/paper 1/ch5-0-evaluation_and_comparison.py	
@@ -29,7 +29,7 @@ force_calculation = False
 
 print '\nACCESS SHELVE'
 # Create / Open databank:
-directory = '../../output/paper 1'
+directory = '../../../output/paper 1'
 if not os.path.exists(directory):
     os.makedirs(directory)
 data_shelve = shelve.open(directory + '/paper_1_shelve')
diff --git a/scripts/publications/paper 1/ch5-1-evaluation_real_space.py b/scripts/publications/paper 1/ch5-1-evaluation_real_space.py
index 3f0b350..7f6d92c 100644
--- a/scripts/publications/paper 1/ch5-1-evaluation_real_space.py	
+++ b/scripts/publications/paper 1/ch5-1-evaluation_real_space.py	
@@ -37,7 +37,7 @@ force_calculation = False
 
 print '\nACCESS SHELVE'
 # Create / Open databank:
-directory = '../../output/paper 1'
+directory = '../../../output/paper 1'
 if not os.path.exists(directory):
     os.makedirs(directory)
 data_shelve = shelve.open(directory + '/paper_1_shelve')
@@ -49,7 +49,7 @@ print 'CH5-1 ANALYTIC SOLUTIONS'
 a = 0.125  # in nm
 phi = pi/2
 dim = (128, 1024, 1024)  # in px (z, y, x)
-density = 100
+gain = 100
 # Create magnetic shape:
 center = (dim[0]/2-0.5, dim[1]/2.-0.5, dim[2]/2.-0.5)  # in px (z, y, x) index starts with 0!
 radius = dim[1]/4  # in px
@@ -59,13 +59,13 @@ print '--CALCULATE ANALYTIC SOLUTIONS'
 phase_map_ana_disc = an.phase_mag_disc(dim, a, phi, center, radius, height)
 phase_map_ana_vort = an.phase_mag_vortex(dim, a, center, radius, height)
 print '--PLOT/SAVE ANALYTIC SOLUTIONS'
-phase_map_ana_disc.display_combined(density, 'Analytic solution: hom. magn. disc', 'bilinear')
+phase_map_ana_disc.display_combined('Analytic solution: hom. magn. disc', 'bilinear', gain=gain)
 axis = plt.gcf().add_subplot(1, 2, 2, aspect='equal')
 axis.axhline(y=512, linewidth=3, linestyle='--', color='r')
 plt.figtext(0.15, 0.2, 'a)', fontsize=30, color='w')
 #plt.figtext(0.52, 0.2, 'b)', fontsize=30)
 plt.savefig(directory + '/ch5-1-analytic_solution_disc.png', bbox_inches='tight')
-phase_map_ana_vort.display_combined(density, 'Analytic solution: vortex state', 'bilinear')
+phase_map_ana_vort.display_combined('Analytic solution: vortex state', 'bilinear', gain=gain)
 axis = plt.gcf().add_subplot(1, 2, 2, aspect='equal')
 axis.axhline(y=512, linewidth=3, linestyle='--', color='r')
 plt.figtext(0.15, 0.2, 'c)', fontsize=30, color='w')
@@ -82,7 +82,7 @@ print 'CH5-1 PHASE SLICES REAL SPACE'
 # Input parameters:
 a = 0.5  # in nm
 phi = pi/2
-density = 100
+gain = 100
 dim = (32, 256, 256)  # in px (z, y, x)
 # Create magnetic shape:
 center = (dim[0]/2-0.5, dim[1]/2.-0.5, dim[2]/2.-0.5)  # in px (z, y, x) index starts with 0!
@@ -123,7 +123,7 @@ else:
         print '----a =', mag_data_disc.a, 'nm', 'dim =', mag_data_disc.dim
         projector = SimpleProjector(mag_data_disc.dim)
         phase_map = PMConvolve(mag_data_disc.a, projector)(mag_data_disc)
-        phase_map.display_combined(density, 'Disc, a = {} nm'.format(mag_data_disc.a))
+        phase_map.display_combined('Disc, a = {} nm'.format(mag_data_disc.a), gain=gain)
         x_d.append(np.linspace(mag_data_disc.a * 0.5,
                                mag_data_disc.a * (mag_data_disc.dim[1]-0.5),
                                mag_data_disc.dim[1]))
@@ -157,7 +157,7 @@ else:
         print '----a =', mag_data_vort.a, 'nm', 'dim =', mag_data_vort.dim
         projector = SimpleProjector(mag_data_vort.dim)
         phase_map = PMConvolve(mag_data_vort.a, projector)(mag_data_vort)
-        phase_map.display_combined(density, 'Disc, a = {} nm'.format(mag_data_vort.a))
+        phase_map.display_combined('Disc, a = {} nm'.format(mag_data_vort.a), gain=gain)
         x_v.append(np.linspace(mag_data_vort.a * 0.5,
                                mag_data_vort.a * (mag_data_vort.dim[1]-0.5),
                                mag_data_vort.dim[1]))
diff --git a/scripts/publications/paper 1/ch5-2-evaluation_fourier_space.py b/scripts/publications/paper 1/ch5-2-evaluation_fourier_space.py
index e2460f6..45b5370 100644
--- a/scripts/publications/paper 1/ch5-2-evaluation_fourier_space.py	
+++ b/scripts/publications/paper 1/ch5-2-evaluation_fourier_space.py	
@@ -36,7 +36,7 @@ force_calculation = False
 
 print '\nACCESS SHELVE'
 # Create / Open databank:
-directory = '../../output/paper 1'
+directory = '../../../output/paper 1'
 if not os.path.exists(directory):
     os.makedirs(directory)
 data_shelve = shelve.open(directory + '/paper_1_shelve')
@@ -47,7 +47,7 @@ print 'CH5-1 PHASE SLICES FOURIER SPACE'
 # Input parameters:
 a = 0.5  # in nm
 phi = pi/2
-density = 100
+gain = 100
 dim = (32, 256, 256)  # in px (z, y, x)
 # Create magnetic shape:
 center = (dim[0]/2-0.5, dim[1]/2.-0.5, dim[2]/2.-0.5)  # in px (z, y, x) index starts with 0!
@@ -95,8 +95,8 @@ else:
         phase_map10 = PMFourier(mag_data_disc.a, projector, padding=10)(mag_data_disc)
         phase_map0.unit = 'mrad'
         phase_map10.unit = 'mrad'
-        phase_map0.display_combined(density, 'Disc, a = {} nm'.format(mag_data_disc.a))
-        phase_map10.display_combined(density, 'Disc, a = {} nm'.format(mag_data_disc.a))
+        phase_map0.display_combined('Disc, a = {} nm'.format(mag_data_disc.a), gain=gain)
+        phase_map10.display_combined('Disc, a = {} nm'.format(mag_data_disc.a), gain=gain)
         x_d.append(np.linspace(mag_data_disc.a * 0.5,
                                mag_data_disc.a * (mag_data_disc.dim[1]-0.5),
                                mag_data_disc.dim[1]))
@@ -142,8 +142,8 @@ else:
         print np.mean(phase_map0.phase)
         phase_map0 -= phase_map0.phase[0, 0]
         phase_map10 -= phase_map10.phase[0, 0]
-        phase_map0.display_combined(density, 'Vortex, a = {} nm'.format(mag_data_vort.a))
-        phase_map10.display_combined(density, 'Vortex, a = {} nm'.format(mag_data_vort.a))
+        phase_map0.display_combined('Vortex, a = {} nm'.format(mag_data_vort.a), gain=gain)
+        phase_map10.display_combined('Vortex, a = {} nm'.format(mag_data_vort.a), gain=gain)
         x_v.append(np.linspace(mag_data_vort.a * 0.5,
                                mag_data_vort.a * (mag_data_vort.dim[1]-0.5),
                                mag_data_vort.dim[1]))
@@ -592,7 +592,7 @@ axes[1].plot(data_disc[0], data_disc[2], 'bo-')
 axes[1].set_xlabel('padding', fontsize=15)
 axes[1].set_ylabel('duration [s]', fontsize=15)
 axes[1].set_xlim(-0.5, 16.5)
-axes[1].set_ylim(-0.05, 1.5)
+axes[1].set_ylim(-0.05, 2.5)
 axes[1].xaxis.set_major_locator(MaxNLocator(nbins=10, integer=True))
 axes[1].yaxis.set_major_locator(MaxNLocator(nbins=10))
 axes[1].tick_params(axis='both', which='major', labelsize=14)
@@ -650,7 +650,7 @@ axes[1].plot(data_vort[0], data_vort[2], 'bo-')
 axes[1].set_xlabel('padding', fontsize=15)
 axes[1].set_ylabel('duration [s]', fontsize=15)
 axes[1].set_xlim(-0.5, 16.5)
-axes[1].set_ylim(-0.05, 1.5)
+axes[1].set_ylim(-0.05, 2.5)
 axes[1].xaxis.set_major_locator(MaxNLocator(nbins=10, integer=True))
 axes[1].yaxis.set_major_locator(MaxNLocator(nbins=10))
 axes[1].tick_params(axis='both', which='major', labelsize=14)
diff --git a/scripts/publications/paper 1/ch5-3-comparison_of_methods.py b/scripts/publications/paper 1/ch5-3-comparison_of_methods.py
index e32b90d..f41c80e 100644
--- a/scripts/publications/paper 1/ch5-3-comparison_of_methods.py	
+++ b/scripts/publications/paper 1/ch5-3-comparison_of_methods.py	
@@ -31,7 +31,7 @@ logging.config.fileConfig(LOGGING_CONF, disable_existing_loggers=False)
 
 print '\nACCESS SHELVE'
 # Create / Open databank:
-directory = '../../output/paper 1'
+directory = '../../../output/paper 1'
 if not os.path.exists(directory):
     os.makedirs(directory)
 data_shelve = shelve.open(directory + '/paper_1_shelve')
diff --git a/scripts/publications/paper 1/ch5-4-comparison_of_methods_new.py b/scripts/publications/paper 1/ch5-4-comparison_of_methods_new.py
index b000976..58a3382 100644
--- a/scripts/publications/paper 1/ch5-4-comparison_of_methods_new.py	
+++ b/scripts/publications/paper 1/ch5-4-comparison_of_methods_new.py	
@@ -30,9 +30,23 @@ logging.config.fileConfig(LOGGING_CONF, disable_existing_loggers=False)
 
 force_calculation = True
 
+n = 1
+
+
+def get_time(pm, mag_data, n):
+    t = []
+    for i in range(n):
+        start = time.clock()
+        pm(mag_data)
+        t.append(time.clock()-start)
+    t, dt = np.mean(t), np.std(t)
+    phase_map = pm(mag_data)
+    return phase_map, t, dt
+
+
 print '\nACCESS SHELVE'
 # Create / Open databank:
-directory = '../../output/paper 1'
+directory = '../../../output/paper 1'
 if not os.path.exists(directory):
     os.makedirs(directory)
 data_shelve = shelve.open(directory + '/paper_1_shelve')
@@ -46,8 +60,7 @@ if key in data_shelve and not force_calculation:
     (data_disc_fourier0, data_vort_fourier0,
      data_disc_fourier3, data_vort_fourier3,
      data_disc_fourier10, data_vort_fourier10,
-     data_disc_real_s, data_vort_real_s,
-     data_disc_real_d, data_vort_real_d) = data_shelve[key]
+     data_disc_real, data_vort_real) = data_shelve[key]
 else:
     # Input parameters:
     steps = 4
@@ -68,16 +81,14 @@ else:
 
     # Create Data Arrays:
     dim_list = [dim[2]/2**i for i in range(steps)]
-    data_disc_fourier0 = np.vstack((dim_list, np.zeros((2, steps))))
-    data_vort_fourier0 = np.vstack((dim_list, np.zeros((2, steps))))
-    data_disc_fourier3 = np.vstack((dim_list, np.zeros((2, steps))))
-    data_vort_fourier3 = np.vstack((dim_list, np.zeros((2, steps))))
-    data_disc_fourier10 = np.vstack((dim_list, np.zeros((2, steps))))
-    data_vort_fourier10 = np.vstack((dim_list, np.zeros((2, steps))))
-    data_disc_real_s = np.vstack((dim_list, np.zeros((2, steps))))
-    data_vort_real_s = np.vstack((dim_list, np.zeros((2, steps))))
-    data_disc_real_d = np.vstack((dim_list, np.zeros((2, steps))))
-    data_vort_real_d = np.vstack((dim_list, np.zeros((2, steps))))
+    data_disc_fourier0 = np.vstack((dim_list, np.zeros((3, steps))))
+    data_vort_fourier0 = np.vstack((dim_list, np.zeros((3, steps))))
+    data_disc_fourier3 = np.vstack((dim_list, np.zeros((3, steps))))
+    data_vort_fourier3 = np.vstack((dim_list, np.zeros((3, steps))))
+    data_disc_fourier10 = np.vstack((dim_list, np.zeros((3, steps))))
+    data_vort_fourier10 = np.vstack((dim_list, np.zeros((3, steps))))
+    data_disc_real = np.vstack((dim_list, np.zeros((3, steps))))
+    data_vort_real = np.vstack((dim_list, np.zeros((3, steps))))
 
     for i in range(steps):
         # Scale mag_data, grid spacing and dimensions:
@@ -93,90 +104,86 @@ else:
         projector = SimpleProjector(dim)
         pm_fourier0 = PMFourier(a, projector, padding=0)
         pm_fourier3 = PMFourier(a, projector, padding=3)
-        pm_fourier10 = PMFourier(a, projector, padding=10)
-        pm_slab = PMConvolve(a, projector, geometry='slab')
-        pm_disc = PMConvolve(a, projector, geometry='disc')
+        pm_fourier10 = PMFourier(a, projector, padding=7)
+        pm_real = PMConvolve(a, projector)
 
         print '----CALCULATE RMS/DURATION HOMOG. MAGN. DISC'
         # Analytic solution:
         phase_ana_disc = an.phase_mag_disc(dim, a, phi, center, radius, height)
         # Fourier unpadded:
-        start_time = time.clock()
-        phase_num_disc = pm_fourier0(mag_data_disc)
-        data_disc_fourier0[2, i] = time.clock() - start_time
+        phase_num_disc, t, dt = get_time(pm_fourier0, mag_data_disc, n)
+        data_disc_fourier0[2, i], data_disc_fourier0[3, i] = t, dt
         print '------time (disc, fourier0) =', data_disc_fourier0[2, i]
         phase_diff_disc = (phase_ana_disc-phase_num_disc) * 1E3  # in mrad -> *1000
+        print 'phase mean:', np.mean(phase_num_disc.phase)
         data_disc_fourier0[1, i] = np.sqrt(np.mean(phase_diff_disc.phase**2))
         # Fourier padding 3:
-        start_time = time.clock()
-        phase_num_disc = pm_fourier3(mag_data_disc)
-        data_disc_fourier3[2, i] = time.clock() - start_time
+        phase_num_disc, t, dt = get_time(pm_fourier3, mag_data_disc, n)
+        data_disc_fourier3[2, i], data_disc_fourier3[3, i] = t, dt
         print '------time (disc, fourier3) =', data_disc_fourier3[2, i]
         phase_diff_disc = (phase_ana_disc-phase_num_disc) * 1E3  # in mrad -> *1000
+        print 'phase mean:', np.mean(phase_num_disc.phase)
         data_disc_fourier3[1, i] = np.sqrt(np.mean(phase_diff_disc.phase**2))
         # Fourier padding 10:
-        start_time = time.clock()
-        phase_num_disc = pm_fourier10(mag_data_disc)
-        data_disc_fourier10[2, i] = time.clock() - start_time
+        phase_num_disc, t, dt = get_time(pm_fourier10, mag_data_disc, n)
+        data_disc_fourier10[2, i], data_disc_fourier10[3, i] = t, dt
         print '------time (disc, fourier10) =', data_disc_fourier10[2, i]
         phase_diff_disc = (phase_ana_disc-phase_num_disc) * 1E3  # in mrad -> *1000
+        print 'phase mean:', np.mean(phase_num_disc.phase)
         data_disc_fourier10[1, i] = np.sqrt(np.mean(phase_diff_disc.phase**2))
-        # Real space slab:
-        start_time = time.clock()
-        phase_num_disc = pm_slab(mag_data_disc)
-        data_disc_real_s[2, i] = time.clock() - start_time
-        print '------time (disc, real slab) =', data_disc_real_s[2, i]
-        phase_diff_disc = (phase_ana_disc-phase_num_disc) * 1E3  # in mrad -> *1000
-        data_disc_real_s[1, i] = np.sqrt(np.mean(phase_diff_disc.phase**2))
         # Real space disc:
-        start_time = time.clock()
-        phase_num_disc = pm_disc(mag_data_disc)
-        data_disc_real_d[2, i] = time.clock() - start_time
-        print '------time (disc, real disc) =', data_disc_real_d[2, i]
+        phase_num_disc, t, dt = get_time(pm_real, mag_data_disc, n)
+        data_disc_real[2, i], data_disc_real[3, i] = t, dt
+        print '------time (disc, real space) =', data_disc_real[2, i]
         phase_diff_disc = (phase_ana_disc-phase_num_disc) * 1E3  # in mrad -> *1000
-        data_disc_real_d[1, i] = np.sqrt(np.mean(phase_diff_disc.phase**2))
-        print 'TIME:', data_disc_real_d[2, i]
+        print 'phase mean:', np.mean(phase_num_disc.phase)
+        data_disc_real[1, i] = np.sqrt(np.mean(phase_diff_disc.phase**2))
+        print 'TIME:', data_disc_real[2, i]
         print 'RMS%:', np.sqrt(np.mean(((phase_ana_disc-phase_num_disc).phase /
                                         phase_ana_disc.phase)**2))*100, '%'
 
-        print '----CALCULATE RMS/DURATION HOMOG. MAGN. DISC'
+        print '----CALCULATE RMS/DURATION VORTEX STATE DISC'
         # Analytic solution:
         phase_ana_vort = an.phase_mag_vortex(dim, a, center, radius, height)
         # Fourier unpadded:
-        start_time = time.clock()
-        phase_num_vort = pm_fourier0(mag_data_vort)
-        data_vort_fourier0[2, i] = time.clock() - start_time
+        phase_num_vort, t, dt = get_time(pm_fourier0, mag_data_vort, n)
+        phase_fft0 = phase_num_vort
+        data_vort_fourier0[2, i], data_vort_fourier0[3, i] = t, dt
         print '------time (vortex, fourier0) =', data_vort_fourier0[2, i]
         phase_diff_vort = (phase_ana_vort-phase_num_vort) * 1E3  # in mrad -> *1000
+        print 'phase mean:', np.mean(phase_num_vort.phase)
+        phase_diff_vort -= np.mean(phase_diff_vort.phase)
         data_vort_fourier0[1, i] = np.sqrt(np.mean(phase_diff_vort.phase**2))
         # Fourier padding 3:
-        start_time = time.clock()
-        phase_num_vort = pm_fourier3(mag_data_vort)
-        data_vort_fourier3[2, i] = time.clock() - start_time
+        phase_num_vort, t, dt = get_time(pm_fourier3, mag_data_vort, n)
+        phase_fft3 = phase_num_vort
+        data_vort_fourier3[2, i], data_vort_fourier3[3, i] = t, dt
         print '------time (vortex, fourier3) =', data_vort_fourier3[2, i]
         phase_diff_vort = (phase_ana_vort-phase_num_vort) * 1E3  # in mrad -> *1000
+        print 'phase mean:', np.mean(phase_num_vort.phase)
+        phase_diff_vort -= np.mean(phase_diff_vort.phase)
         data_vort_fourier3[1, i] = np.sqrt(np.mean(phase_diff_vort.phase**2))
         # Fourier padding 10:
-        start_time = time.clock()
-        phase_num_vort = pm_fourier10(mag_data_vort)
-        data_vort_fourier10[2, i] = time.clock() - start_time
+        phase_num_vort, t, dt = get_time(pm_fourier10, mag_data_vort, n)
+        phase_fft10 = phase_num_vort
+        data_vort_fourier10[2, i], data_vort_fourier10[3, i] = t, dt
         print '------time (vortex, fourier10) =', data_vort_fourier10[2, i]
         phase_diff_vort = (phase_ana_vort-phase_num_vort) * 1E3  # in mrad -> *1000
+        print 'phase mean:', np.mean(phase_num_vort.phase)
+        phase_diff_vort -= np.mean(phase_diff_vort.phase)
         data_vort_fourier10[1, i] = np.sqrt(np.mean(phase_diff_vort.phase**2))
-        # Real space slab:
-        start_time = time.clock()
-        phase_num_vort = pm_slab(mag_data_vort)
-        data_vort_real_s[2, i] = time.clock() - start_time
-        print '------time (vortex, real slab) =', data_vort_real_s[2, i]
-        phase_diff_vort = (phase_ana_vort-phase_num_vort) * 1E3  # in mrad -> *1000
-        data_vort_real_s[1, i] = np.sqrt(np.mean(phase_diff_vort.phase**2))
         # Real space disc:
-        start_time = time.clock()
-        phase_num_vort = pm_disc(mag_data_vort)
-        data_vort_real_d[2, i] = time.clock() - start_time
-        print '------time (vortex, real disc) =', data_vort_real_d[2, i]
+        phase_num_vort, t, dt = get_time(pm_real, mag_data_vort, n)
+        phase_real = phase_num_vort
+        data_vort_real[2, i], data_vort_real[3, i] = t, dt
+        print '------time (vortex, real space) =', data_vort_real[2, i]
         phase_diff_vort = (phase_ana_vort-phase_num_vort) * 1E3  # in mrad -> *1000
-        data_vort_real_d[1, i] = np.sqrt(np.mean(phase_diff_vort.phase**2))
+        print 'phase mean:', np.mean(phase_num_vort.phase)
+#        phase_diff_vort -= np.mean(phase_diff_vort.phase)
+        data_vort_real[1, i] = np.sqrt(np.mean(phase_diff_vort.phase**2))
+        print 'TIME:', data_disc_real[2, i]
+        print 'RMS%:', np.sqrt(np.mean(((phase_ana_vort-phase_num_vort).phase /
+                                        phase_ana_vort.phase)**2))*100, '%'
 
         # Scale down for next iteration:
         mag_data_disc.scale_down()
@@ -186,8 +193,7 @@ else:
     data_shelve[key] = (data_disc_fourier0, data_vort_fourier0,
                         data_disc_fourier3, data_vort_fourier3,
                         data_disc_fourier10, data_vort_fourier10,
-                        data_disc_real_s, data_vort_real_s,
-                        data_disc_real_d, data_vort_real_d)
+                        data_disc_real, data_vort_real)
 
 print '--PLOT/SAVE METHOD DATA'
 
@@ -196,14 +202,13 @@ fig, axes = plt.subplots(2, 2, sharex='col', sharey='row', figsize=(12, 8))
 fig.tight_layout(rect=(0.05, 0.05, 0.95, 0.95))
 fig.suptitle('Method Comparison', fontsize=20)
 
-# Plot duration against a (disc) [top/left]:
+# Plot RMS against a (disc) [top/left]:
 axes[1, 0].set_xscale('log')
 axes[1, 0].set_yscale('log')
 axes[1, 0].plot(data_disc_fourier0[0], data_disc_fourier0[1], ':bs')
 axes[1, 0].plot(data_disc_fourier3[0], data_disc_fourier3[1], ':bo')
 axes[1, 0].plot(data_disc_fourier10[0], data_disc_fourier10[1], ':b^')
-axes[1, 0].plot(data_disc_real_s[0], data_disc_real_s[1], '--rs')
-axes[1, 0].plot(data_disc_real_d[0], data_disc_real_d[1], '--ro')
+axes[1, 0].plot(data_disc_real[0], data_disc_real[1], '--ro')
 axes[1, 0].set_xlabel('grid size [px]', fontsize=15)
 axes[1, 0].set_ylabel('RMS [mrad]', fontsize=15)
 axes[1, 0].set_xlim(25, 350)
@@ -213,25 +218,29 @@ axes[1, 0].xaxis.set_major_formatter(LogFormatter(base=2))
 axes[1, 0].xaxis.set_minor_locator(NullLocator())
 axes[1, 0].grid()
 
-# Plot RMS against a (disc) [bottom/left]:
+# Plot duration against a (disc) [bottom/left]:
 plt.tick_params(axis='both', which='major', labelsize=14)
 axes[0, 0].set_xscale('log')
 axes[0, 0].set_yscale('log')
-axes[0, 0].plot(data_disc_fourier0[0], data_disc_fourier0[2], ':bs')
-axes[0, 0].plot(data_disc_fourier3[0], data_disc_fourier3[2], ':bo')
-axes[0, 0].plot(data_disc_fourier10[0], data_disc_fourier10[2], ':b^')
-axes[0, 0].plot(data_disc_real_s[0], data_disc_real_s[2], '--rs')
-axes[0, 0].plot(data_disc_real_d[0], data_disc_real_d[2], '--ro')
+axes[0, 0].errorbar(data_disc_fourier0[0], data_disc_fourier0[2],
+                    yerr=0*data_vort_fourier3[3], fmt=':bs')
+axes[0, 0].errorbar(data_disc_fourier3[0], data_disc_fourier3[2],
+                    yerr=0*data_vort_fourier3[3], fmt=':bo')
+axes[0, 0].errorbar(data_disc_fourier10[0], data_disc_fourier10[2],
+                    yerr=0*data_vort_fourier3[3], fmt=':b^')
+axes[0, 0].errorbar(data_disc_real[0], data_disc_real[2],
+                    yerr=0*data_vort_fourier3[3], fmt='--ro')
 axes[0, 0].set_title('Homog. magn. disc', fontsize=18)
 axes[0, 0].set_ylabel('duration [s]', fontsize=15)
 axes[0, 0].set_xlim(25, 350)
+axes[0, 0].set_ylim(1E-4, 1E1)
 axes[0, 0].tick_params(axis='both', which='major', labelsize=14)
 axes[0, 0].xaxis.set_major_locator(LogLocator(base=2))
 axes[0, 0].xaxis.set_major_formatter(LogFormatter(base=2))
 axes[0, 0].xaxis.set_minor_locator(NullLocator())
 axes[0, 0].grid()
 
-# Plot duration against a (vortex) [top/right]:
+# Plot RMS against a (vortex) [top/right]:
 axes[1, 1].set_xscale('log')
 axes[1, 1].set_yscale('log')
 axes[1, 1].plot(data_vort_fourier0[0], data_vort_fourier0[1], ':bs',
@@ -240,10 +249,8 @@ axes[1, 1].plot(data_vort_fourier3[0], data_vort_fourier3[1], ':bo',
                 label='Fourier padding=3')
 axes[1, 1].plot(data_vort_fourier10[0], data_vort_fourier10[1], ':b^',
                 label='Fourier padding=10')
-axes[1, 1].plot(data_vort_real_s[0], data_vort_real_s[1], '--rs',
-                label='Real space (slab)')
-axes[1, 1].plot(data_vort_real_d[0], data_vort_real_d[1], '--ro',
-                label='Real space (disc)')
+axes[1, 1].plot(data_vort_real[0], data_vort_real[1], '--ro',
+                label='Real space')
 axes[1, 1].set_xlabel('grid size [px]', fontsize=15)
 axes[1, 1].set_xlim(25, 350)
 axes[1, 1].tick_params(axis='both', which='major', labelsize=14)
@@ -252,21 +259,20 @@ axes[1, 1].xaxis.set_major_formatter(LogFormatter(base=2))
 axes[1, 1].xaxis.set_minor_locator(NullLocator())
 axes[1, 1].grid()
 
-# Plot RMS against a (vortex) [bottom/right]:
+# Plot duration against a (vortex) [bottom/right]:
 axes[0, 1].set_xscale('log')
 axes[0, 1].set_yscale('log')
-axes[0, 1].plot(data_vort_fourier0[0], data_vort_fourier0[2], ':bs',
-                label='Fourier padding=0')
-axes[0, 1].plot(data_vort_fourier3[0], data_vort_fourier3[2], ':bo',
-                label='Fourier padding=3')
-axes[0, 1].plot(data_vort_fourier10[0], data_vort_fourier10[2], ':b^',
-                label='Fourier padding=10')
-axes[0, 1].plot(data_vort_real_s[0], data_vort_real_s[2], '--rs',
-                label='Real space (slab)')
-axes[0, 1].plot(data_vort_real_d[0], data_vort_real_d[2], '--ro',
-                label='Real space (disc)')
+axes[0, 1].errorbar(data_vort_fourier0[0], data_vort_fourier0[2], yerr=0*data_vort_fourier0[3],
+                    fmt=':bs', label='Fourier padding=0')
+axes[0, 1].errorbar(data_vort_fourier3[0], data_vort_fourier3[2], yerr=0*data_vort_fourier3[3],
+                    fmt=':bo', label='Fourier padding=3')
+axes[0, 1].errorbar(data_vort_fourier10[0], data_vort_fourier10[2], yerr=0*data_vort_fourier3[3],
+                    fmt=':b^', label='Fourier padding=10')
+axes[0, 1].errorbar(data_vort_real[0], data_vort_real[2], yerr=0*data_vort_fourier3[3],
+                    fmt='--ro', label='Real space')
 axes[0, 1].set_title('Vortex state disc', fontsize=18)
 axes[0, 1].set_xlim(25, 350)
+axes[0, 1].set_ylim(1E-4, 1E1)
 axes[0, 1].tick_params(axis='both', which='major', labelsize=14)
 axes[0, 1].xaxis.set_major_locator(LogLocator(base=2))
 axes[0, 1].xaxis.set_major_formatter(LogFormatter(base=2))
diff --git a/scripts/test methods/compare_methods.py b/scripts/test methods/compare_methods.py
index c4a5fbb..fca81c9 100644
--- a/scripts/test methods/compare_methods.py	
+++ b/scripts/test methods/compare_methods.py	
@@ -31,7 +31,7 @@ a = 1.0  # in nm
 phi = pi/4
 numcore = False
 padding = 10
-density = 10
+gain = 10
 dim = (128, 128, 128)  # in px (z, y, x)
 
 # Create magnetic shape:
@@ -55,7 +55,6 @@ elif geometry == 'sphere':
 
 # Create MagData object and projector:
 mag_data = MagData(a, mc.create_mag_dist_homog(mag_shape, phi))
-mag_data.quiver_plot()
 projector = SimpleProjector(dim)
 # Construct PhaseMapper objects:
 pm_adap = PMAdapterFM(a, projector, b_0)
@@ -78,11 +77,11 @@ phase_map_four = pm_four(mag_data)
 print 'Time for PMFourier:    ', time.time() - start_time
 
 # Display the combinated plots with phasemap and holography image:
-phase_map_ana.display_combined('Analytic Solution', density=density)
-phase_map_adap.display_combined('PMAdapterFM', density=density)
-phase_map_real.display_combined('PMReal', density=density)
-phase_map_conv.display_combined('PMConvolve', density=density)
-phase_map_four.display_combined('PMFourier', density=density)
+phase_map_ana.display_combined('Analytic Solution', gain=gain)
+phase_map_adap.display_combined('PMAdapterFM', gain=gain)
+phase_map_real.display_combined('PMReal', gain=gain)
+phase_map_conv.display_combined('PMConvolve', gain=gain)
+phase_map_four.display_combined('PMFourier', gain=gain)
 
 # Plot differences to the analytic solution:
 phase_map_diff_adap = phase_map_adap - phase_map_ana
-- 
GitLab