{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " **Chapter 2: [Diffraction](CH2_00-Diffraction.ipynb)** \n", "\n", "
\n", "\n", "# Basic Crystallography\n", "[Download](https://raw.githubusercontent.com/gduscher/MSE672-Introduction-to-TEM//main/Diffraction/CH2_03-Basic_Crystallography.ipynb)\n", " \n", "[![OpenInColab](https://colab.research.google.com/assets/colab-badge.svg)](\n", " https://colab.research.google.com/github/gduscher/MSE672-Introduction-to-TEM/blob/main//Diffraction/CH2_03-Basic_Crystallography.ipynb)\n", " \n", "part of\n", "\n", " **[MSE672: Introduction to Transmission Electron Microscopy](../_MSE672_Intro_TEM.ipynb)**\n", "\n", "**Spring 2026**
\n", "by Gerd Duscher\n", "\n", "Microscopy Facilities
\n", "Institute of Advanced Materials & Manufacturing
\n", "Materials Science & Engineering
\n", "The University of Tennessee, Knoxville\n", "\n", "Background and methods to analysis and quantification of data acquired with transmission electron microscopes.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Load relevant python packages\n", "### Check Installed Packages" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "done\n" ] } ], "source": [ "import sys\n", "import importlib.metadata\n", "def test_package(package_name):\n", " \"\"\"Test if package exists and returns version or -1\"\"\"\n", " try:\n", " version = importlib.metadata.version(package_name)\n", " except importlib.metadata.PackageNotFoundError:\n", " version = '-1'\n", " return version\n", "\n", "if test_package('pyTEMlib') < '0.2026.1.2':\n", " print('installing pyTEMlib')\n", " !{sys.executable} -m pip install --upgrade pyTEMlib -q\n", "print('done')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Load the plotting and figure packages\n", "Import the python packages that we will use:\n", "\n", "Beside the basic numerical (numpy) and plotting (pylab of matplotlib) libraries,\n", "* ase structure plotting\n", "\n", "and some libraries from the pyTEMlib\n", "\n", "* kinematic scattering from the diffraction_tools library.\n", "* structures from the crystal_tools library\n", "> Note for Google Colab\n", ">\n", "> **Restart Session** in the **Runtime Menu**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pyTEM version: 0.2026.1.2\n" ] } ], "source": [ "%matplotlib widget\n", "import matplotlib.pylab as plt\n", "import numpy as np\n", "import sys\n", "if 'google.colab' in sys.modules:\n", " from google.colab import output\n", " output.enable_custom_widget_manager()\n", "\n", "import ase\n", "import ase.visualize\n", "import ase.visualize.plot\n", "\n", "# Import libraries from the pyTEMlib\n", "import pyTEMlib\n", "\n", "# it is a good idea to show the version numbers at this point for archiving reasons.\n", "print('pyTEM version: ',pyTEMlib.__version__)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "\n", "## Define Crystal\n", "\n", "A crystal is well defined by its unit cell and the atom positions within, the so called base.\n", "The base consists of which element sits where within the unit cell\n", "\n", "\n", "The unit cell fills the volume completely when translated in all three directions. Placing the unit cell in a global carthesian coordination system, we need the length of the sides and their angles for a complete description. This is depicted in the graph below.\n", "![unitcell_angles](images/unit_cell_angles.png)\n", "\n", "Figure taken from the wikipedia page on lattice constants.\n", "\n", "Mathematically it is more advantageous to describe the unit cell as matrix, the\n", "### Structure Matrix\n", "\n", "This matrix consists of rows of vectors that span the unit cell:\n", "$\\begin{bmatrix}\n", " a_1 & a_2 & a_3 \\\\\n", " b_1 & b_2 & b_3 \\\\\n", " c_1 & c_2 & c_3 \\\\\n", "\\end{bmatrix} =\\left[\\vec{a},\\vec{b},\\vec{c}\\right]$.\n", "\n", "This structure matrix is also used to describe the super cells in materials simulations for example density functional theory.\n", "\n", "The representation of unit cells as structure matrices allows also for easy conversions as we will see in the following.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "structure matrix \n", " [[ 2.46 0. 0. ]\n", " [-1.23 2.13 0. ]\n", " [ 0. 0. 6.71]]\n", "elements: ['C', 'C', 'C', 'C']\n", "base \n", " [[0. 0. 0. ]\n", " [0. 0. 0.5 ]\n", " [0.333 0.667 0. ]\n", " [0.667 0.333 0.5 ]]\n" ] } ], "source": [ "# Create graphite unit cell (or structure matrix)\n", "a = b = 2.46 # Angstrom\n", "c = 6.71 # Angstrom\n", "gamma = 120\n", "alpha = beta = 90\n", "\n", "## Create the structure matrix for a hexagonal system explicitly:\n", "structure_matrix = np.array([[a, 0.0, 0.0], ## also called the structure matrix\n", " [np.cos(np.radians(gamma))*a, np.sin(np.radians(gamma))*a, 0.0 ],\n", " [0.0, 0.0, c]\n", " ])\n", "print('structure matrix \\n', np.round(structure_matrix, 3))\n", "\n", "elements = ['C']*4\n", "base = [[0, 0, 0], [0, 0, 1/2], [1/3, 2/3, 0], [2/3, 1/3, 1/2]]\n", "print('elements:', elements)\n", "print('base \\n',np.round(base,3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Store Information in [ASE (atomic simulation environment)](https://wiki.fysik.dtu.dk/ase/) format" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Atoms(symbols='C4', pbc=False, cell=[[2.46, 0.0, 0.0], [-1.2299999999999995, 2.130422493309719, 0.0], [0.0, 0.0, 6.71]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "atoms = ase.Atoms(elements, cell=structure_matrix, scaled_positions=base)\n", "atoms" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "structure matrix [\\\\AA$]\n" ] } ], "source": [ "print(r'structure matrix [\\\\AA$]')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can retrieve the information stored" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "structure matrix [$\\AA$]\\n [[ 2.46 0. 0. ]\n", " [-1.23 2.13 0. ]\n", " [ 0. 0. 6.71]]\n", "elements \n", " C4\n", "base \n", " [[0. 0. 0. ]\n", " [0. 0. 0.5 ]\n", " [0.333 0.667 0. ]\n", " [0.667 0.333 0.5 ]]\n" ] } ], "source": [ "print(r'structure matrix [$\\AA$]\\n',np.round(atoms.cell.array,3))\n", "print('elements \\n',atoms.get_chemical_formula())\n", "print('base \\n',np.round(atoms.get_scaled_positions(), 3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A convenient function is provided by the kinematic_scttering library (loaded with name ks)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Cell([[2.46772414, 0.0, 0.0], [-1.2338620699999996, 2.1371117947721068, 0.0], [0.0, 0.0, 6.711]]),\n", " array([[0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", " [0.00000000e+00, 0.00000000e+00, 3.35550000e+00],\n", " [1.23386207e+00, 7.12370598e-01, 0.00000000e+00],\n", " [3.04714108e-16, 1.42474120e+00, 3.35550000e+00]]))" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "atoms = pyTEMlib.crystal_tools.structure_by_name('Graphite')\n", "atoms.cell, atoms.positions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Volume of Unit Cell\n", "We will need the volume of the unit cell for unit conversions later.\n", "\n", "Volume of the parallelepiped (https://en.wikipedia.org/wiki/Triple_product) : \n", "$\\vec{a} \\cdot \\vec{b} \\times \\vec{c} = \\det \\begin{bmatrix}\n", " a_1 & a_2 & a_3 \\\\\n", " b_1 & b_2 & b_3 \\\\\n", " c_1 & c_2 & c_3 \\\\\n", "\\end{bmatrix} ={\\rm det}\\left(\\vec{a},\\vec{b},\\vec{c}\\right)$\n", "\n", "We see that the structure matrix comes in handy for that calculation." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "volume of unit cell: 35.1660 Ang^3\n" ] } ], "source": [ "volume = v = np.linalg.det(structure_matrix)\n", "print(f\"volume of unit cell: {volume:.4f} Ang^3\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The same procedure is provided by ase" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "volume of unit cell: 35.3925 Ang^3\n" ] } ], "source": [ "print(f\"volume of unit cell: {atoms.cell.volume:.4f} Ang^3\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Vector Algebra in Unit Cell \n", "We will use the linear algebra package of numpy (np.linalg) for our vector calculations.\n", "\n", "The length of a vector is called its norm.\n", "\n", "And the angle between two vectors is calculated by the dot product: $\\vec{a} \\cdot \\vec{b} = \\left\\| \\vec{a} \\right\\| \\left\\| \\vec{b} \\right\\| \\cos (\\theta) $\n", "\n", "> Note that python starts couting at 0 and so the second vector has index 1" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "length of second unit cell vector is 2.460 Ang\n", "angle between a and b is 120.0 degree\n" ] } ], "source": [ "length_b = np.linalg.norm(structure_matrix[1])\n", "print(f'length of second unit cell vector is {length_b:.3f} Ang' ) \n", "\n", "gamma = np.arccos(np.dot(structure_matrix[0]/length_b, structure_matrix[1]/length_b))\n", "print(f'angle between a and b is {np.degrees(gamma):.1f} degree')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Plot the unit cell\n", "\n", "We use the visualization library of ase to plot structures." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b2b7c24ade9f4f9ab0cbdd13e1d2af0b", "version_major": 2, "version_minor": 0 }, "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAX3BJREFUeJzt3WdYFAf7NfCzsDQVEEERBVusWHFFxBJrsMVEjbElUWPsDUREwF5RVARjI4klRhP9xx6jiRjF3kCsoBIrIAQrINLZ98PzyvMYARnYYWDm/K6LD+7OzZ7JbJzjzOysSqvVakFEREREiqEndQAiIiIiKlksgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDAsgEREREQKwwJIREREpDBqqQOUZTk5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c3m1Wg1LS0vRsupSUdY7L23atEFUVJSu45UactjWulJWt/XkyZNx4MABHD9+HLa2tgUuK6ftLWS981IWt7ehoSHq1q2LVq1awdfXF82bN0dgYGCey8ppWwtZ77yUxW0dFhaGhIQEaDQaqNVqqNVqnDhxAqtXr4ZarUZ2dvY7M3La5kKwAObD0NAQGo0GwcHBbz0eHByMtm3b5jnj7Oz8zvJHjhxBq1atYGBgIFpWXSrKeuclPDwcNjY2uo5XashhW+tKWdvWWq0WkyZNwp49e3Ds2DHUrl37vTNy2N5FWe+8lLXtnRetVov09PQ8n5PDts5PQeudl7K4rbt27Yrr16/jypUruT+tWrXCF198gStXrkBfX/+dGTlv8wJJ8tGTMmLHjh1aAwMD7caNG7URERFaNzc3bfny5bUPHjzQarVarZeXl/arr77KXf7evXvacuXKaadOnaqNiIjQbty4UWtgYKDdtWuXVKtQJELXe9WqVdq9e/dq79y5o71x44bWy8tLC0C7e/duqVZBsOTkZG14eLg2PDxcC0Dr7++vDQ8P1z58+FCr1cp3Wwtdbzls6/Hjx2vNzc21ISEh2ri4uNyf169f5y4jx+1dlPWWw/b29vbWnjx5Unv//n3ttWvXtD4+Plo9PT3tkSNHtFqtPLe1Vit8veWwrfPz708By3WbC8UC+B5r167V1qxZU2toaKht2bLlW7dMGD58uLZjx45vLR8SEqJ1cHDQGhoaamvVqqVdv359CSfWDSHrvWzZMu0HH3ygNTY21lpYWGjbt2+v/f333yVIXXRvboHw75/hw4drtVr5bmuh6y2HbZ3X+gLQbt68OXcZOW7voqy3HLb3yJEjc/8uq1y5srZr1665JUirlee21mqFr7cctnV+/l0A5brNhVJptf//SkciIiIiUgReA0hERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArz/wDlhUyZgLN21wAAAABJRU5ErkJggg==", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "ase.visualize.plot.plot_atoms(atoms, radii=0.3, rotation=('0x,1y,0z'));\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This does not work in Google Colab\n", "\n", "ase.visualize.view(atoms*(1,1,1))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " ASE atomic visualization\n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from ase.visualize import view\n", "view(atoms*(4,4,4), viewer = 'x3d')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reciprocal Lattice \n", "The unit cell in reciprocal space\n", "\n", "The structure matrix (in ase: atoms.cell) helps with that." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "reciprocal lattice [1/Ang.]:\n", "[[0.4052 0.234 0. ]\n", " [0. 0.4679 0. ]\n", " [0. 0. 0.149 ]]\n" ] } ], "source": [ "reciprocal_lattice = np.linalg.inv(atoms.cell.array).T # transposed of inverted unit_cell\n", "\n", "print('reciprocal lattice [1/Ang.]:')\n", "print(np.round(reciprocal_lattice,4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The same function is provided in ase package of Cell." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "reciprocal lattice [1/Ang.]:\n", "[[ 0.4052 0.234 0. ]\n", " [-0. 0.4679 0. ]\n", " [ 0. 0. 0.149 ]]\n" ] } ], "source": [ "print('reciprocal lattice [1/Ang.]:')\n", "print(np.round(atoms.cell.reciprocal(),4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reciprocal Lattice Vectors\n", "From your crystallography book and lecture you are probably used to the following expression for the reciprocal lattice vectors ($\\vec{a}^*, \\vec{b}^*, \\vec{c}^*$)\n", "\n", "$$\\vec{a}^* = \\frac{\\vec{b} \\times \\vec{c}}{\\vec{a} \\cdot \\left(\\vec{b} \\times \\vec{c}\\right)} $$\n", "$$ \\vec{b}^* = \\frac{\\vec{c} \\times \\vec{a}}{\\vec{b} \\cdot \\left(\\vec{c} \\times \\vec{a}\\right)} $$\n", "$$ \\vec{c}^* = \\frac{\\vec{a} \\times \\vec{b}}{\\vec{c} \\cdot \\left(\\vec{a} \\times \\vec{b}\\right)}$$\n", "\n", "Where we see that the denominators of the above vector equations are the volume of the unit cell.\n", "\n", "In physics book, you will see an additional factor of 2$\\pi$, which is generally omitted in materials science and microscopy." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.405 0.234 -0. ]\n", "[0. 0.468 0. ]\n", "[ 0. -0. 0.149]\n", "Compare to:\n", "[[0.405 0.234 0. ]\n", " [0. 0.468 0. ]\n", " [0. 0. 0.149]]\n" ] } ], "source": [ "## Now let's test whether this is really equivalent to the matrix expression above.\n", "a,b,c = atoms.cell\n", "\n", "a_recip = np.cross(b, c)/np.dot(a, np.cross(b, c))\n", "print (np.round(a_recip, 3))\n", "b_recip = np.cross(c, a)/np.dot(a, np.cross(b, c))\n", "print (np.round(b_recip, 3))\n", "c_recip = np.cross(a, b)/np.dot(a, np.cross(b, c))\n", "print (np.round(c_recip, 3))\n", "\n", "print('Compare to:')\n", "print(np.round(reciprocal_lattice, 3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "\n", "With these definitions we have everything to define a crystal and to analyse diffraction and imaging data of crystalline specimens.\n", "\n", "Crystallography deals with the application of symmetry and group theory of symmetry to crystal structures.\n", "If you want to play around with symmetry and space groups, you can install the [spglib](http://atztogo.github.io/spglib/python-spglib.html#python-spglib). The spglib is especially helpfull for determination of reduced unit cells (the smallest possible ones, instead of the ones with the full symmetry).\n", "\n", "A number of common crystal structures are defined in the kinematic_scattering libary of the pyTEMlib package under the function ''structure_by_name''. Try them out in this notebook." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function structure_by_name in module pyTEMlib.crystal_tools:\n", "\n", "structure_by_name(crystal_name: str) -> ase.atoms.Atoms | None\n", " Provides crystal structure in ase.Atoms format.\n", " Additional information is stored in the info attribute as a dictionary\n", "\n", " Parameter\n", " ---------\n", " crystal_name: str\n", " Please note that the chemical expressions are not case-sensitive.\n", "\n", " Returns\n", " -------\n", " atoms: ase.Atoms\n", " structure\n", "\n", " Example\n", " -------\n", " >> # for a list of pre-defined crystal structures\n", " >> import pyTEMlib.crystal_tools\n", " >> print(pyTEMlib.crystal_tools.crystal_data_base.keys())\n", " >>\n", " >> atoms = pyTEMlib.crystal_tools.structure_by_name('Silicon')\n", " >> print(atoms)\n", " >> print(atoms.info)\n", "\n" ] } ], "source": [ "# As ususal the help function will show you the usage of a function:\n", "help(pyTEMlib.crystal_tools.structure_by_name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are all the predifined crystal structures.\n", "\n", "> Check out the [building tutorial of ase](https://wiki.fysik.dtu.dk/ase/ase/build/build.html) for more fun structures like nanotubes " ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['aluminum', 'al', 'aluminium', 'theta_prime', 'gold', 'au', 'silver', 'ag', 'copper', 'cu', 'diamond', 'germanium', 'ge', 'silicon', 'si', 'gaas', 'fcc fe', 'iron', 'bcc fe', 'alpha iron', 'srtio3', 'strontium titanate', 'graphite', 'cscl', 'cesium chlorid', 'mgo', 'titanium nitride', 'zno wurzite', 'zno', 'wzno', 'gan', 'gan wurzite', 'wgan', 'gallium nitride', 'tio2', 'mos2', 'ws2', 'wse2', 'mose2', 'zno hexagonal', 'pdse2'])\n" ] } ], "source": [ "print(pyTEMlib.crystal_tools.crystal_data_base.keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now use one name of above structures and redo this notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Navigation\n", "\n", "- **Back: [Basic Crystallography](CH2_03-Basic_Crystallography.ipynb)** \n", "- **Next: [Structure Factors](CH2_04-Structure_Factors.ipynb)** \n", "- **Chapter 2: [Diffraction](CH2_00-Diffraction.ipynb)** \n", "- **List of Content: [Front](../_MSE672_Intro_TEM.ipynb)** " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Appendix: Read POSCAR\n", "\n", "Load and draw a crystal structure from a POSCAR file\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The function " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from ase.io import read, write\n", "import pyTEMlib.file_tools as ft\n", "import os\n", "\n", "def read_poscar(): # open file dialog to select poscar file\n", " file_name = ft.open_file_dialog_qt('POSCAR (POSCAR*.txt);;All files (*)')\n", " #use ase package to read file\n", " \n", " base = os.path.basename(file_name)\n", " base_name = os.path.splitext(base)[0]\n", " crystal = read(file_name, format='vasp', parallel=False)\n", " \n", " return crystal" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "atoms = read_poscar()\n", "atoms" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" }, "toc": { "base_numbering": "3", "nav_menu": { "height": "318px", "width": "307px" }, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "288px" }, "toc_section_display": true, "toc_window_display": false }, "vscode": { "interpreter": { "hash": "838e0debddb5b6f29d3d8c39ba50ae8c51920a564d3bac000e89375a158a81de" } } }, "nbformat": 4, "nbformat_minor": 4 }