{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Calculating structural properties\n", "=================================\n", "\n", "Quite often you want to calculate some geometric, structural properties of a structure or set of structures, for example the mean bond angles between certain species, or the polyhedral strain. This tutorial goes through various ways to easily extract such quantities from `.magres` files.\n", "\n", "As usual, we start by importing the `MagresAtoms` Python class and reading in a `.magres` and naming it `atoms`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "from __future__ import print_function\n", "import warnings\n", "warnings.filterwarnings(\"ignore\") \n", "%pylab inline\n", "\n", "from magres.atoms import MagresAtoms" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "atoms = MagresAtoms.load_magres('../samples/T1Si0.magres')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bond lengths\n", "------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can calculate the distance between two atoms, for example between the Al1 atom and its neighbour, the O1 atom." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.7623362335263948" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "atoms.dist(atoms.Al1, atoms.O1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We might then calculate the distance between Al1 and the Si1 atom bonded to the bridging O1 atom." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2.9562849997928144" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "atoms.dist(atoms.Al1, atoms.Si1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's loop over the first two aluminium atoms (for sake of space) and print out the Al-O bond length." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "27Al1 17O1 1.7623362335263948\n", "27Al1 17O18 1.7541994014367361\n", "27Al1 17O31 1.7632462822875878\n", "27Al1 17O44 1.7565585985107373\n", "27Al2 17O5 1.752370109309104\n", "27Al2 17O6 1.7287666123569134\n", "27Al2 17O7 1.7787802000247248\n", "27Al2 17O8 1.761199875085165\n" ] } ], "source": [ "for atom_Al in atoms.species('Al')[:2]:\n", " for atom_O in atoms.species('O').within(atom_Al, 3.0):\n", " print(atom_Al, atom_O, atoms.dist(atom_Al, atom_O))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We could take a mean to find out the average Al-O bond length, with a standard deviation." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mean bond length = 1.75230470421 +- 0.0209888992786\n" ] } ], "source": [ "dists = []\n", "\n", "for atom_Al in atoms.species('Al'):\n", " for atom_O in atoms.species('O').within(atom_Al, 3.0):\n", " dists.append(atoms.dist(atom_Al, atom_O))\n", " \n", "print(\"Mean bond length =\", mean(dists), \"+-\", std(dists))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we could even plot a histogram of the Al-O bond length distribution." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(array([ 4., 2., 4., 10., 12., 12., 20., 16., 11., 15., 12.,\n", " 23., 12., 14., 11., 3., 3., 2., 3., 3.]),\n", " array([ 1.70591764, 1.71088507, 1.7158525 , 1.72081992, 1.72578735,\n", " 1.73075478, 1.7357222 , 1.74068963, 1.74565706, 1.75062449,\n", " 1.75559191, 1.76055934, 1.76552677, 1.7704942 , 1.77546162,\n", " 1.78042905, 1.78539648, 1.7903639 , 1.79533133, 1.80029876,\n", " 1.80526619]),\n", " )" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "hist(dists, bins=20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bond angles\n", "-----------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the angle function to calculate the X-Y-Z bond angle of three atoms, X, Y and Z. For example, the Al1-O1-S1 bond angle is" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2.1049612709736554" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "atoms.angle(atoms.Al1, atoms.O1, atoms.Si1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's in radians. If we want it in degrees, we can either do the maths or specify the degrees option." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "120.60539686528409" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "atoms.angle(atoms.Al1, atoms.O1, atoms.Si1, degrees=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We could do a similar thing as we did with bond lengths to look at the Al-O-X bond angle distribution, where X is any second nearest neighbour." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mean bond angle = 119.244646177 +- 5.4306395789\n" ] } ], "source": [ "angles = []\n", "\n", "# Loop over every aluminium atom\n", "for atom_Al in atoms.species('Al'):\n", " \n", " # Find all oxygens within 2.0 A of the Al atom, i.e. ones bonded\n", " for atom_O in atoms.species('O').within(atom_Al, 2.0):\n", " \n", " # Find all Si and Al within 2.0 of the bonded oxygen\n", " for atom_X in atoms.species('Si', 'Al').within(atom_O, 2.0):\n", " \n", " # Check that we haven't found the original Al atom! Otherwise angle will equal zero\n", " if atom_Al != atom_X:\n", " angle = atoms.angle(atom_Al, atom_O, atom_X, degrees=True)\n", " \n", " # Append it to our list\n", " angles.append(angle)\n", " \n", "print(\"Mean bond angle =\", mean(angles), \"+-\", std(angles))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plotting this distribution as a histogram we can see that there are two populations of bond angles, corresponding to the T1 (four-coordinated) and T2 (three-coordinated) sites." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(array([ 6., 20., 22., 26., 16., 16., 8., 13., 14., 3., 0.,\n", " 0., 0., 6., 4., 4., 3., 1., 4., 2.]),\n", " array([ 112.17244747, 113.33907751, 114.50570755, 115.67233759,\n", " 116.83896763, 118.00559767, 119.17222771, 120.33885775,\n", " 121.5054878 , 122.67211784, 123.83874788, 125.00537792,\n", " 126.17200796, 127.338638 , 128.50526804, 129.67189808,\n", " 130.83852812, 132.00515816, 133.1717882 , 134.33841824,\n", " 135.50504828]),\n", " )" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "hist(angles, bins=20)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }