From 6461da37c1da1b0ecff2271b6164d1cedc5876a4 Mon Sep 17 00:00:00 2001 From: Jan Caron <j.caron@fz-juelich.de> Date: Tue, 30 Dec 2014 16:58:12 +0100 Subject: [PATCH] Added diagnostics class! --- pyramid/__init__.py | 4 + pyramid/costfunction.py | 19 +++ pyramid/diagnostics.py | 96 ++++++++++++++ pyramid/fft.py | 14 +- pyramid/forwardmodel.py | 2 +- pyramid/magdata.py | 4 +- pyramid/phasemap.py | 4 +- pyramid/reconstruction.py | 6 +- pyramid/regularisator.py | 4 - ...rick_nanowire_reconstruction_simulation.py | 121 ++++++++++++++++++ .../vtk_conversion_nanowire_full.py | 3 +- .../vtk_conversion_nanowire_full_90deg.py | 83 ++++++------ .../vtk_conversion_nanowire_segment.py | 2 +- .../create_multiple_samples.py | 2 +- .../reconstruction_linear_test.py | 32 ++++- 15 files changed, 329 insertions(+), 67 deletions(-) create mode 100644 pyramid/diagnostics.py create mode 100644 scripts/collaborations/patrick_nanowire_reconstruction_simulation.py diff --git a/pyramid/__init__.py b/pyramid/__init__.py index ad35b5a..ad7b174 100644 --- a/pyramid/__init__.py +++ b/pyramid/__init__.py @@ -28,6 +28,10 @@ costfunction Class for the evaluation of the cost of a function. reconstruction Reconstruct magnetic distributions from given phasemaps. +regularisator + Class to instantiate different regularisation strategies. +fft + Class for custom FFT functions using numpy or FFTW. Subpackages ----------- diff --git a/pyramid/costfunction.py b/pyramid/costfunction.py index b177e05..50c41ff 100644 --- a/pyramid/costfunction.py +++ b/pyramid/costfunction.py @@ -132,8 +132,27 @@ class Costfunction(object): def hess_diag(self, _): # TODO: Docstring! + # TODO: What for again? return np.ones(self.n) + def estimate_lambda(self): + # TODO: Docstring! + # TODO: Not very efficient? Is this even correct? + + def unit_vec(length, index): + result = np.zeros(length) + result[index] = 1 + return result + + fwd, reg = self.fwd_model, self.regularisator + trace_fwd = np.sum([fwd.jac_T_dot(None, fwd.jac_dot(None, unit_vec(self.n, i))) + for i in range(self.n)]) + trace_reg = np.sum([reg(unit_vec(self.n, i)) for i in range(self.n)]) + print 'fwd:', trace_fwd + print 'reg:', trace_reg + import pdb; pdb.set_trace() + return trace_fwd / trace_reg + class CFAdapterScipyCG(LinearOperator): diff --git a/pyramid/diagnostics.py b/pyramid/diagnostics.py new file mode 100644 index 0000000..fbec1ff --- /dev/null +++ b/pyramid/diagnostics.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +""" +Created on Thu Dec 11 17:20:27 2014 + +@author: Jan +""" + + +import numpy as np + +import jutil + +from pyramid import fft +from pyramid.magdata import MagData +from pyramid.phasemap import PhaseMap + +class Diagnostics(object): + + # TODO: Docstrings and position of properties! + + def __init__(self, x_rec, cost, max_iter=100): + self.x_rec = x_rec + self.cost = cost + self.max_iter = max_iter + self.fwd_model = cost.fwd_model + self.Se_inv = self.cost.Se_inv + self.dim = self.cost.data_set.dim + self.row_idx = None + self.set_position(0)#(0, self.dim[0]//2, self.dim[1]//2, self.dim[2]//2)) + self._A = jutil.operator.CostFunctionOperator(self.cost, self.x_rec) + self._P = jutil.preconditioner.CostFunctionPreconditioner(self.cost, self.x_rec) + + def set_position(self, pos): + # TODO: Does not know about the mask... thus gives wrong results or errors +# m, z, y, x = pos +# row_idx = m*np.prod(self.dim) + z*self.dim[1]*self.dim[2] + y*self.dim[2] + x + row_idx = pos + if row_idx != self.row_idx: + self.row_idx = row_idx + self._updated_std = False + self._updated_gain_row = False + self._updated_avrg_kern_row = False + self._updated_measure_contribution = False + + @property + def std(self): + if not self._updated_std: + e_i = fft.zeros(self.cost.n, dtype=fft.FLOAT) + e_i[self.row_idx] = 1 + row = jutil.cg.conj_grad_solve(self._A, e_i, P=self._P, max_iter=self.max_iter) + self._m_inv_row = row + self._std = np.sqrt(self._m_inv_row[self.row_idx]) + self._updated_std = True + return self._std + + @property + def gain_row(self): + if not self._updated_gain_row: + self.std # evoke to update self._m_inv_row if necessary # TODO: make _m_inv_row checked! + self._gain_row = self.Se_inv.dot(self.fwd_model.jac_dot(self.x_rec, self._m_inv_row)) + self._updated_gain_row = True + return self._gain_row + + @property + def avrg_kern_row(self): + if not self._updated_avrg_kern_row: + self._avrg_kern_row = self.fwd_model.jac_T_dot(self.x_rec, self.gain_row) + self._updated_avrg_kern_row = True + return self._avrg_kern_row + + @property + def measure_contribution(self): + if not self._updated_measure_contribution: + cache = self.fwd_model.jac_dot(self.x_rec, fft.ones(self.cost.n, fft.FLOAT)) + cache = self.fwd_model.jac_T_dot(self.x_rec, self.Se_inv.dot(cache)) + mc = jutil.cg.conj_grad_solve(self._A, cache, P=self._P, max_iter=self.max_iter) + self._measure_contribution = mc + self._updated_measure_contribution = True + return self._measure_contribution + + def get_avg_kernel(self, pos=None): + if pos is not None: + self.set_position(pos) + mag_data_avg_kern = MagData(self.cost.data_set.a, fft.zeros((3,)+self.dim)) + mag_data_avg_kern.set_vector(self.avrg_kern_row, mask=self.cost.data_set.mask) + return mag_data_avg_kern + + def get_gain_maps(self, pos=None): + if pos is not None: + self.set_position(pos) + hp = self.cost.data_set.hook_points + result = [] + for i, projector in enumerate(self.cost.data_set.projectors): + gain = self.gain_row[hp[i]:hp[i+1]].reshape(projector.dim_uv) + result.append(PhaseMap(self.cost.data_set.a, gain)) + return result diff --git a/pyramid/fft.py b/pyramid/fft.py index e595437..1c7733d 100644 --- a/pyramid/fft.py +++ b/pyramid/fft.py @@ -171,7 +171,15 @@ def load_wisdom(fname): # Array setups: -def zeros(shape, dtype): +def empty(shape, dtype=FLOAT): + # TODO: Docstring! + result = np.empty(shape, dtype) + if pyfftw is not None: + result = pyfftw.n_byte_align(result, pyfftw.simd_alignment) + return result + + +def zeros(shape, dtype=FLOAT): # TODO: Docstring! result = np.zeros(shape, dtype) if pyfftw is not None: @@ -179,9 +187,9 @@ def zeros(shape, dtype): return result -def empty(shape, dtype): +def ones(shape, dtype=FLOAT): # TODO: Docstring! - result = np.empty(shape, dtype) + result = np.ones(shape, dtype) if pyfftw is not None: result = pyfftw.n_byte_align(result, pyfftw.simd_alignment) return result diff --git a/pyramid/forwardmodel.py b/pyramid/forwardmodel.py index eacc079..f2758b9 100644 --- a/pyramid/forwardmodel.py +++ b/pyramid/forwardmodel.py @@ -93,7 +93,7 @@ class ForwardModel(object): `vector`. ''' - self.mag_data.magnitude[:] = 0 + self.mag_data.magnitude[...] = 0 self.mag_data.set_vector(vector, self.data_set.mask) result = np.zeros(self.m) hp = self.hook_points diff --git a/pyramid/magdata.py b/pyramid/magdata.py index 9b64f6d..7fe3e6c 100644 --- a/pyramid/magdata.py +++ b/pyramid/magdata.py @@ -498,9 +498,9 @@ class MagData(object): # Setup quiver: dim_uv = plot_u.shape ad = ar_dens - xx, yy = np.meshgrid(np.arange(dim_uv[0]), np.arange(dim_uv[1])) + xx, yy = np.meshgrid(np.arange(dim_uv[1]), np.arange(dim_uv[0])) axis.quiver(xx[::ad, ::ad], yy[::ad, ::ad], plot_u[::ad, ::ad], plot_v[::ad, ::ad], - pivot='middle', units='xy', angles=angles[::ad, ::ad], + pivot='middle', units='xy', angles=angles[::ad, ::ad], minlength=0.25, scale_units='xy', scale=1./ad, headwidth=6, headlength=7) axis.set_xlim(-1, dim_uv[1]) axis.set_ylim(-1, dim_uv[0]) diff --git a/pyramid/phasemap.py b/pyramid/phasemap.py index 4b962dd..d60b410 100644 --- a/pyramid/phasemap.py +++ b/pyramid/phasemap.py @@ -344,8 +344,8 @@ class PhaseMap(object): axis.set_ylim(0, self.dim_uv[0]) axis.xaxis.set_major_locator(MaxNLocator(nbins=9, integer=True)) axis.yaxis.set_major_locator(MaxNLocator(nbins=9, integer=True)) - axis.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: '{:.3g}'.format(x*self.a))) - axis.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: '{:.3g}'.format(x*self.a))) + axis.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: '{:g}'.format(x*self.a))) + axis.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: '{:g}'.format(x*self.a))) axis.tick_params(axis='both', which='major', labelsize=14) axis.set_title(title, fontsize=18) axis.set_xlabel('u-axis [nm]', fontsize=15) diff --git a/pyramid/reconstruction.py b/pyramid/reconstruction.py index 4da85c7..d9386ee 100644 --- a/pyramid/reconstruction.py +++ b/pyramid/reconstruction.py @@ -83,7 +83,7 @@ class PrintIterator(object): return self.iteration -def optimize_linear(data, regularisator=None, max_iter=None, info=None): +def optimize_linear(data, regularisator=None, max_iter=None): '''Reconstruct a three-dimensional magnetic distribution from given phase maps via the conjugate gradient optimizaion method :func:`~.scipy.sparse.linalg.cg`. Blazingly fast for l2-based cost functions. @@ -114,9 +114,7 @@ def optimize_linear(data, regularisator=None, max_iter=None, info=None): # Create and return fitting MagData object: mag_opt = MagData(data.a, np.zeros((3,) + data.dim)) mag_opt.set_vector(x_opt, data.mask) - if info is not None: - info[:] = cost.chisq, cost.chisq_m, cost.chisq_a - return mag_opt + return mag_opt, cost def optimize_nonlin(data, first_guess=None, regularisator=None): diff --git a/pyramid/regularisator.py b/pyramid/regularisator.py index 03cdaaa..5c115bb 100644 --- a/pyramid/regularisator.py +++ b/pyramid/regularisator.py @@ -52,12 +52,10 @@ class Regularisator(object): def jac(self, x): # TODO: Docstring! - self._log.debug('Calling jac') return self.lam * self.norm.jac(x) def hess_dot(self, x, vector): # TODO: Docstring! -# self._log.debug('Calling hess_dot') # TODO: Profiler says this was slow... return self.lam * self.norm.hess_dot(x, vector) def hess_diag(self, x, vector): @@ -85,12 +83,10 @@ class NoneRegularisator(Regularisator): def jac(self, x): # TODO: Docstring! - self._log.debug('Calling jac') return np.zeros_like(x) def hess_dot(self, x, vector): # TODO: Docstring! - self._log.debug('Calling hess_dot') return np.zeros_like(vector) def hess_diag(self, x, vector): diff --git a/scripts/collaborations/patrick_nanowire_reconstruction_simulation.py b/scripts/collaborations/patrick_nanowire_reconstruction_simulation.py new file mode 100644 index 0000000..3c1edba --- /dev/null +++ b/scripts/collaborations/patrick_nanowire_reconstruction_simulation.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Nov 14 14:17:56 2014 + +@author: Jan +""" + +from PIL import Image +import numpy as np + +from jutil.taketime import TakeTime +from pyramid import * # analysis:ignore + +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) + +################################################################################################### +gain = 5 +b_0 = 1 +lam = 1E-3 +length = 300 +cutoff = 50 +trans = 40 +pads = [100, 250, 500, 800] +INPATH = '../../output/vtk data\longtube_withcap/' +OUTPATH = '../../output/patrick/' +FILE = 'CoFeB_tube_cap_4nm_lying_down' +################################################################################################### + +# Read in big 3D files: +mag_data_3d = MagData.load_from_netcdf4(INPATH+FILE+'.nc') +a = mag_data_3d.a +dim_3d = mag_data_3d.dim + +# Make 2D projection: +dim_uv_big = (dim_3d[1]+200, dim_3d[2]+200) +projector = SimpleProjector(dim_3d, dim_uv=dim_uv_big) +mag_data_big = projector(mag_data_3d) +phase_map_big = pm(mag_data_big, dim_uv=dim_uv_big) +phase_map_big.display_combined(gain=gain) +mask_big = mag_data_big.get_mask() +dim_big = mag_data_big.dim +dim_uv_big = phase_map_big.dim_uv + +# Reconstruction of complete wire: +data_set = DataSet(a, dim_big, b_0, mask_big) +data_set.append(phase_map_big, SimpleProjector(dim_big)) +regularisator = FirstOrderRegularisator(mask_big, lam, p=2) +with TakeTime('reconstruction time'): + mag_data_big_rec = rc.optimize_linear(data_set, regularisator=regularisator, max_iter=50)[0] +phase_map_big_rec = pm(mag_data_big_rec) +axis_p, axis_h = phase_map_big.display_combined('Reconstruction (complete wire)', gain=gain) +axis_p.axhline(y=length, linewidth=1, color='b', linestyle='-') +axis_h.axhline(y=length, linewidth=1, color='b', linestyle='-') +plt.savefig(OUTPATH+FILE+'RECON_COMPLETE.png'.format(pad), dpi=500) +plt.close('all') + +for pad in pads: + # Make smaller cutout with optional padding: + mask = mask_big[:, :length+pad, :].copy() + mask[:, mask.shape[1]-cutoff:, :] = False + dim = mask.shape + dim_uv = (dim[1], dim[2]) + phase = np.zeros(dim_uv) + phase[:length, :] = phase_map_big.phase[:length, :] + phase_map = PhaseMap(a, phase) + phase_map_orig = PhaseMap(a, phase[:length, :]) + + # Create DataSet and regularisator: + data_set = DataSet(a, dim, b_0, mask) + data_set.append(phase_map, SimpleProjector(dim)) + + # Create Se_inv + mask_Se = np.ones(dim_uv) + mask_Se[length:length+pad, :] = 0 + ramp = np.tile(np.linspace(1, 0, trans), mask_Se.shape[1]).reshape((mask_Se.shape[1], trans)).T + mask_Se[length-trans:length, :] = ramp + data_set.set_Se_inv_diag_with_masks([mask_Se]) + + # Create regularisator: + regularisator = FirstOrderRegularisator(mask, lam, p=2) + + # Reconstruct: + with TakeTime('reconstruction time'): + mag_data_rec = rc.optimize_linear(data_set, regularisator=regularisator, max_iter=50)[0] + + # Calculate additional PhaseMaps: + phase_map_rec = pm(mag_data_rec) + phase_map_cut = PhaseMap(a, phase_map_rec.phase[:length, :]) + phase_map_diff = phase_map_orig - phase_map_cut + + # Plotting: + phase_map_orig.display_combined('Original distribution', gain=gain) + plt.savefig(OUTPATH+FILE+'_{}pxpadding_ORIG.png'.format(pad), dpi=500) + axis_p, axis_h = phase_map.display_combined('Original Distribution (padded)', gain=gain) + axis_p.axhline(y=length, linewidth=1, color='b', linestyle='-') + axis_h.axhline(y=length, linewidth=1, color='b', linestyle='-') + axis_p.axhline(y=length-trans, linewidth=1, color='r', linestyle='--') + axis_h.axhline(y=length-trans, linewidth=1, color='r', linestyle='--') + plt.savefig(OUTPATH+FILE+'_{}ramp_{}pxpadding_ORIG_PAD.png'.format(trans, pad), dpi=500) + axis_p, axis_h = phase_map_rec.display_combined('Reconstr. Distribution (padded)', gain=gain) + axis_p.axhline(y=length, linewidth=1, color='b', linestyle='-') + axis_h.axhline(y=length, linewidth=1, color='b', linestyle='-') + axis_p.axhline(y=length-trans, linewidth=1, color='r', linestyle='--') + axis_h.axhline(y=length-trans, linewidth=1, color='r', linestyle='--') + plt.savefig(OUTPATH+FILE+'_{}ramp_{}pxpadding_RECON_PAD.png'.format(trans, pad), dpi=500) + phase_map_cut.display_combined('Reconstr. Distribution', gain=gain) + plt.savefig(OUTPATH+FILE+'_{}ramp_{}pxpadding_RECON.png'.format(trans, pad)) + phase_map_diff.display_combined('Difference') + plt.savefig(OUTPATH+FILE+'_{}ramp_{}pxpadding_DIFF.png'.format(trans, pad)) + axis = mag_data_rec.quiver_plot(ar_dens=4, log=True) + axis.axhline(y=length, linewidth=1, color='b', linestyle='-') + axis.axhline(y=length-trans, linewidth=1, color='r', linestyle='--') + plt.savefig(OUTPATH+FILE+'_{}ramp_{}pxpadding_MAG.png'.format(trans, pad), dpi=500) + plt.close('all') diff --git a/scripts/collaborations/vtk_conversion_nanowire_full.py b/scripts/collaborations/vtk_conversion_nanowire_full.py index 67f32b3..a6f3edb 100644 --- a/scripts/collaborations/vtk_conversion_nanowire_full.py +++ b/scripts/collaborations/vtk_conversion_nanowire_full.py @@ -170,6 +170,7 @@ for i in range(mag_data.magnitude.shape[1]): if i == 100: mag_data.quiver_plot(ax_slice=i) plt.savefig(PATH+'_quiver_500_post.png') +mag_data.save_to_netcdf4(PATH+'_90deg_around_z.nc') # Iterate over all angles: for angle in angles: angle_rad = angle * np.pi/180 @@ -199,7 +200,7 @@ for angle in angles: PM = PhaseMapperRDFC(Kernel(mag_data.a, projector.dim_uv)) phase_map_tip = PhaseMap(mag_data.a, PM(projector(mag_data_bot)).phase[50+shift:225+shift, :]) phase_map_tip.display_combined('Phase Map Nanowire Bottom', gain=gain, - interpolation='bilinear') + b interpolation='bilinear') plt.savefig(PATH+'_nanowire_bot_xtilt_{}_no_frame.png'.format(angle)) mag_data_bot.scale_down() mag_proj_bot = projector_scaled(mag_data_bot) diff --git a/scripts/collaborations/vtk_conversion_nanowire_full_90deg.py b/scripts/collaborations/vtk_conversion_nanowire_full_90deg.py index acf17b6..d1ab275 100644 --- a/scripts/collaborations/vtk_conversion_nanowire_full_90deg.py +++ b/scripts/collaborations/vtk_conversion_nanowire_full_90deg.py @@ -136,45 +136,46 @@ for i in range(mag_data.magnitude.shape[2]): magnitude_new[1, ..., i] = -z_rot magnitude_new[2, ..., i] = y_rot mag_data.magnitude = magnitude_new +mag_data.save_to_netcdf4(PATH+'_lying_down.nc') # Iterate over all angles: -for angle in angles: - angle_rad = angle * np.pi/180 - projector = YTiltProjector(dim, angle_rad, dim_uv) - projector_scaled = YTiltProjector((dim[0]/2, dim[1]/2, dim[2]/2), angle_rad, - (dim_uv[0]/2, dim_uv[1]/2)) - # Tip: - mag_data_tip = MagData(mag_data.a, mag_data.magnitude[:, :, 608:, :]) - PM = PhaseMapperRDFC(Kernel(mag_data.a, projector.dim_uv)) - phase_map_tip = PhaseMap(mag_data.a, PM(projector(mag_data_tip)).phase[350:530, :]) - 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() - mag_proj_tip = projector_scaled(mag_data_tip) - axis = mag_proj_tip.quiver_plot() -# axis.set_xlim(17, 55) -# axis.set_ylim(180-shift/2, 240-shift/2) - plt.savefig(PATH+'_nanowire_tip_mag_xtilt_{}.png'.format(angle)) - axis = mag_proj_tip.quiver_plot(log=True) -# axis.set_xlim(17, 55) -# axis.set_ylim(180-shift/2, 240-shift/2) - plt.savefig(PATH+'_nanowire_tip_mag_log_xtilt_{}.png'.format(angle)) - # Bottom: - mag_data_bot = MagData(mag_data.a, mag_data.magnitude[:, :, :300, :]) - PM = PhaseMapperRDFC(Kernel(mag_data.a, projector.dim_uv)) - phase_map_tip = PhaseMap(mag_data.a, PM(projector(mag_data_bot)).phase[50:225, :]) - phase_map_tip.display_combined('Phase Map Nanowire Bottom', gain=gain, - interpolation='bilinear') - plt.savefig(PATH+'_nanowire_bot_xtilt_{}_no_frame.png'.format(angle)) - mag_data_bot.scale_down() - mag_proj_bot = projector_scaled(mag_data_bot) - axis = mag_proj_bot.quiver_plot() -# axis.set_xlim(17, 55) -# axis.set_ylim(50+shift/2, 110+shift/2) - plt.savefig(PATH+'_nanowire_bot_mag_xtilt_{}.png'.format(angle)) - axis = mag_proj_bot.quiver_plot(log=True) -# axis.set_xlim(17, 55) -# axis.set_ylim(50+shift/2, 110+shift/2) - plt.savefig(PATH+'_nanowire_bot_mag_log_xtilt_{}.png'.format(angle)) - # Close plots: - plt.close('all') +#for angle in angles: +# angle_rad = angle * np.pi/180 +# projector = YTiltProjector(dim, angle_rad, dim_uv) +# projector_scaled = YTiltProjector((dim[0]/2, dim[1]/2, dim[2]/2), angle_rad, +# (dim_uv[0]/2, dim_uv[1]/2)) +# # Tip: +# mag_data_tip = MagData(mag_data.a, mag_data.magnitude[:, :, 608:, :]) +# PM = PhaseMapperRDFC(Kernel(mag_data.a, projector.dim_uv)) +# phase_map_tip = PhaseMap(mag_data.a, PM(projector(mag_data_tip)).phase[350:530, :]) +# 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() +# mag_proj_tip = projector_scaled(mag_data_tip) +# axis = mag_proj_tip.quiver_plot() +## axis.set_xlim(17, 55) +## axis.set_ylim(180-shift/2, 240-shift/2) +# plt.savefig(PATH+'_nanowire_tip_mag_xtilt_{}.png'.format(angle)) +# axis = mag_proj_tip.quiver_plot(log=True) +## axis.set_xlim(17, 55) +## axis.set_ylim(180-shift/2, 240-shift/2) +# plt.savefig(PATH+'_nanowire_tip_mag_log_xtilt_{}.png'.format(angle)) +# # Bottom: +# mag_data_bot = MagData(mag_data.a, mag_data.magnitude[:, :, :300, :]) +# PM = PhaseMapperRDFC(Kernel(mag_data.a, projector.dim_uv)) +# phase_map_tip = PhaseMap(mag_data.a, PM(projector(mag_data_bot)).phase[50:225, :]) +# phase_map_tip.display_combined('Phase Map Nanowire Bottom', gain=gain, +# interpolation='bilinear') +# plt.savefig(PATH+'_nanowire_bot_xtilt_{}_no_frame.png'.format(angle)) +# mag_data_bot.scale_down() +# mag_proj_bot = projector_scaled(mag_data_bot) +# axis = mag_proj_bot.quiver_plot() +## axis.set_xlim(17, 55) +## axis.set_ylim(50+shift/2, 110+shift/2) +# plt.savefig(PATH+'_nanowire_bot_mag_xtilt_{}.png'.format(angle)) +# axis = mag_proj_bot.quiver_plot(log=True) +## axis.set_xlim(17, 55) +## axis.set_ylim(50+shift/2, 110+shift/2) +# plt.savefig(PATH+'_nanowire_bot_mag_log_xtilt_{}.png'.format(angle)) +# # Close plots: +# plt.close('all') diff --git a/scripts/collaborations/vtk_conversion_nanowire_segment.py b/scripts/collaborations/vtk_conversion_nanowire_segment.py index 1f00810..9fac2fb 100644 --- a/scripts/collaborations/vtk_conversion_nanowire_segment.py +++ b/scripts/collaborations/vtk_conversion_nanowire_segment.py @@ -142,7 +142,7 @@ else: mag_data.quiver_plot() ################################################################################################### # Phasemapping: -phase_map = pm(mag_data) +phase_map = pm(mag_data, dim_uv=(300, 300)) (-phase_map).display_combined(title=r'Combined Plot (B$_0$={} T, Cos x {})'.format(b_0, gain), gain=gain) plt.savefig(PATH+'_{}T_cosx{}.png'.format(b_0, gain)) diff --git a/scripts/create distributions/create_multiple_samples.py b/scripts/create distributions/create_multiple_samples.py index 1c09a0e..e978e51 100644 --- a/scripts/create distributions/create_multiple_samples.py +++ b/scripts/create distributions/create_multiple_samples.py @@ -26,7 +26,7 @@ if not os.path.exists(directory): # Input parameters: filename = directory + '/mag_dist_multiple_samples.txt' a = 10.0 # nm -dim = (64, 128, 128) +dim = (64, 128, 256) # Slab: center = (32, 32, 32) # in px (z, y, x), index starts with 0! width = (48, 48, 48) # in px (z, y, x) diff --git a/scripts/reconstruction/reconstruction_linear_test.py b/scripts/reconstruction/reconstruction_linear_test.py index b26c728..7da8b7a 100644 --- a/scripts/reconstruction/reconstruction_linear_test.py +++ b/scripts/reconstruction/reconstruction_linear_test.py @@ -52,9 +52,9 @@ shape = mc.Shapes.disc(dim, center, radius_shell, height) magnitude = mc.create_mag_dist_vortex(shape) mag_data = MagData(a, magnitude) -#mag_data.quiver_plot('z-projection', proj_axis='z') -#mag_data.quiver_plot('y-projection', proj_axis='y') -#mag_data.quiver_plot3d('Original distribution') +mag_data.quiver_plot('z-projection', proj_axis='z') +mag_data.quiver_plot('y-projection', proj_axis='y') +mag_data.quiver_plot3d('Original distribution') tilts_full = np.linspace(-pi/2, pi/2, num=count/2, endpoint=False) tilts_miss = np.linspace(-pi/3, pi/3, num=count/2, endpoint=False) @@ -90,15 +90,33 @@ if noise != 0: print('--Reconstruction') reg = FirstOrderRegularisator(mask, lam, p=2) -info = [] with TakeTime('reconstruction'): - mag_data_opt = rc.optimize_linear(data, regularisator=reg, max_iter=100, info=info) + mag_data_opt, cost = rc.optimize_linear(data, regularisator=reg, max_iter=100) +print 'Cost:', cost.chisq ################################################################################################### print('--Plot stuff') mag_data_opt.quiver_plot3d('Reconstructed distribution') -#(mag_data_opt - mag_data).quiver_plot3d('Difference') -#phase_maps_opt = data.create_phase_maps(mag_data_opt) +(mag_data_opt - mag_data).quiver_plot3d('Difference') +phase_maps_opt = data.create_phase_maps(mag_data_opt) # TODO: iterations in jutil is one to many! + +from pyramid.diagnostics import Diagnostics + +diag = Diagnostics(mag_data_opt.mag_vec, cost) + +print 'std:', diag.std +gain_maps = diag.get_gain_maps() +gain_maps[count//2].display_phase() +diag.get_avg_kernel().quiver_plot3d() +measure_contribution = diag.measure_contribution + +diag.set_position(cost.data_set.mask.sum()//2) + +print 'std:', diag.std +gain_maps = diag.get_gain_maps() +gain_maps[count//2].display_phase() +diag.get_avg_kernel().quiver_plot3d() +measure_contribution = diag.measure_contribution -- GitLab