#!/usr/bin/env python # -*- coding: UTF-8 -*- # # Copyright (C) 2016 Paul Müller (paul.mueller [at] biotec.tu-dresden.de) # # This file is part of scattnlay # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # The only additional remark is that we expect that all publications # describing work using this software, or all commercial products # using it, cite the following reference: # [1] O. Pena and U. Pal, "Scattering of electromagnetic radiation by # a multilayered sphere," Computer Physics Communications, # vol. 180, Nov. 2009, pp. 2348-2354. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This test case calculates the phase retardation that is introduced # by a weak dielectric sphere to an incident plane wave. Only the # x-polarized light is considered. # Note: This example computes the phase behind the sphere. In microscopy, # the focal plane during imaging is close to the center of the sphere. # To compute the phase image that corresponds to that imaged with a focal # plane at the center of the bead, numerical refocusing of the computed # field `Ex` would be required (e.g. python package nrefocus). import numpy as np import scattnlay import matplotlib.pylab as plt # weak dielectric sphere, e.g. a PMMA gel bead n1 = 1.335 # refractive index of the surrounding medium (water) nm = 1.333 # radius of the sphere in vacuum wavelengths radius = 0.3 # extent of the simulation size in vacuum wavelengths extent = 2.0 # distance where we want to have the measured field behind the sphere # in vacuum wavelengths measured from the center of the sphere distance = 0.5 # pixels per vacuum wavelength in the output image resolution = 20.0 # size parameters need to be multiplied by (2 PI nm) for the computation twopi = 2*np.pi*nm # There is only one sphere, no layers x = np.ones((1, 1), dtype = np.float64) x[0, 0] = radius*twopi # Set the refractive index of the sphere, normalized to that of the medium m = np.ones((1, 1), dtype = np.complex128) m[0, 0] = n1/nm nptsx = extent*resolution nptsy = extent*resolution scanx = np.linspace(-extent/2, extent/2, nptsx, endpoint=True)*twopi scany = np.linspace(-extent/2, extent/2, nptsy, endpoint=True)*twopi coordX, coordY = np.meshgrid(scanx, scany) coordX.resize(nptsx*nptsy) coordY.resize(nptsx*nptsy) coordZ = np.ones(nptsx*nptsy, dtype=np.float64)*distance*twopi coord = np.vstack((coordX, coordY, coordZ)).transpose() terms, E, H = scattnlay.fieldnlay(x, m, coord) # take the x-component of the electric field Ex = E[:,:,0].reshape(nptsx, nptsy) # normalize by the background field (free space propagation) Ex /= np.exp(1j*2*np.pi*distance*nm) # plot the phase (np.angle) of the x-component of the electric field ax = plt.subplot(111) mapper = plt.imshow(np.angle(Ex)) plt.colorbar(mapper, ax=ax, label="phase [rad]") plt.title("phase retardation introduced by a dielectric sphere") plt.show()