Calculation of Atom Plane Curvature
This tutorial follows the python scripts and jupyter notebooks found in the “publication_examples/PTO_supercrystal_hadjimichael” folder in the TEMUL repository. The data and scripts used below can be downloaded from there. You can also interact with the data without needing any downloads. Just click this button and navigate to that same folder, where you will find the python scripts and interactive python notebooks:
The temul.topotem.lattice_structure_tools.calculate_atom_plane_curvature()
function has been adapted from the
MATLAB script written by Dr. Marios Hadjimichael for the publication
M. Hadjimichael, Y. Li et al, Metal-ferroelectric supercrystals with periodically
curved metallic layers, Nature Materials 2020.
This MATLAB script can also be found in the same folder.
The temul.topotem.lattice_structure_tools.calculate_atom_plane_curvature()
function in the
temul.topotem.lattice_structure_tools
module can be used to find the curvature of the
displacement of atoms along an atom plane in a sublattice. Using the default
parameter func='strain_grad'
, the function will approximate the
curvature as the strain gradient, as in cases where the first derivative is
negligible. See “Landau and Lifshitz, Theory of Elasticity, Vol 7, pp 47-49, 1981”
for more details. One can use any func
input that can be used by
scipy.optimize.curve_fit
.
Import the Modules and Load the Data
>>> import temul.api as tml
>>> import atomap.api as am
>>> import hyperspy.api as hs
>>> import os
>>> path_to_data = os.path.join(os.path.abspath(''),
... "publication_examples/PTO_supercrystal_hadjimichael/data")
>>> os.chdir(path_to_data)
Open the PTO/SRO dataset
>>> image = hs.load('Cropped_PTO-SRO_Aligned.hspy')
>>> sampling = image.axes_manager[-1].scale # nm/pix
>>> units = image.axes_manager[-1].units
>>> image.plot()

Open the pre-made PTO-SRO atom lattice.
>>> atom_lattice = am.load_atom_lattice_from_hdf5("Atom_Lattice_crop.hdf5")
>>> sublattice1 = atom_lattice.sublattice_list[0] # Pb-Sr Sublattice
>>> sublattice2 = atom_lattice.sublattice_list[1] # Ti-Ru Sublattice
>>> atom_lattice.plot()

Set up the Parameters
Plot the sublattice planes to see which zone_vector_index
we use
>>> sublattice2.construct_zone_axes(atom_plane_tolerance=1)
>>> # sublattice2.plot_planes()
Set up parameters for calculate_atom_plane_curvature
>>> zone_vector_index = 0
>>> atom_planes = (2, 6) # chooses the starting and ending atom planes
>>> vmin, vmax = 1, 2
>>> cmap = 'bwr' # see matplotlib and colorcet for more colormaps
>>> title = 'Curvature Map'
>>> filename = None # Set to a string if you want to save the map
Set the extra initial fitting parameters
>>> p0 = [14, 10, 24, 173]
>>> kwargs = {'p0': p0, 'maxfev': 1000}
Calculate the Curvature of Atom Planes
We want to see the curvature in the SRO Sublattice
>>> curvature_map = tml.calculate_atom_plane_curvature(sublattice2, zone_vector_index,
... sampling=sampling, units=units, cmap=cmap, title=title,
... atom_planes=atom_planes, **kwargs)

When using plot_and_return_fits=True
, the function will return the curve
fittings, and plot each plane (plots not displayed).
>>> curvature_map, fittings = tml.calculate_atom_plane_curvature(sublattice2,
... zone_vector_index, sampling=sampling, units=units,
... cmap=cmap, title=title, atom_planes=atom_planes, **kwargs,
... plot_and_return_fits=True)