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