{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "6269c1d6-fa76-4919-ae26-f150d7d9f536", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "np.float = float\n", "\n", "import defdap.hrdic as hrdic\n", "import defdap.ebsd as ebsd\n", "from defdap.quat import Quat\n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "id": "d7025973-752f-4f75-a66e-b12e875c3749", "metadata": {}, "outputs": [], "source": [ "ebsd_map = ebsd.Map('../tests/data/testDataEBSD')\n", "ebsd_map.buildQuatArray()\n", "ebsd_map.findBoundaries(boundDef=8)\n", "ebsd_map.findGrains(minGrainSize=10)\n", "ebsd_map.calcGrainAvOris()\n", "ebsd_map.buildNeighbourNetwork()\n", "ebsd_map.homogPoints = [\n", " (68, 95),\n", " (308, 45),\n", " (191, 187),\n", " (89, 174)\n", "]\n", "\n", "dic_map = hrdic.Map('../tests/data/', 'testDataDIC.txt')\n", "dic_map.setScale(20 / 2048)\n", "dic_map.homogPoints = [\n", " (36, 72),\n", " (279, 27),\n", " (162, 174),\n", " (60, 157)\n", "]\n", "dic_map.linkEbsdMap(ebsd_map, transformType=\"affine\")\n", "dic_map.findGrains(minGrainSize=10)" ] }, { "cell_type": "code", "execution_count": null, "id": "976b7e11-6909-4f57-9f7a-6cf73499ec7b", "metadata": {}, "outputs": [], "source": [ "# find twin boundaries\n", "misori_twin = Quat.fromAxisAngle([1, 1, 1], 60*np.pi/180)\n", "misori_twin_tol = 5*np.pi/180\n", "\n", "# create all symmetric equivalent misorientations\n", "misori_twin_all = []\n", "syms = ebsd_map.primaryPhase.crystalStructure.symmetries\n", "for sym_i in syms:\n", " for sym_j in syms:\n", " misori_twin_all.append(sym_i.conjugate * misori_twin * sym_j)\n", "# get rid of any duplicates\n", "misori_twin_all = list(set(misori_twin_all))\n", "\n", "# loop over all grain boundary segments and check if the misorientation between\n", "# the two grains is within tolerance of the twin misorientation\n", "twin_lines = []\n", "for grain1, grain2, b_seg in ebsd_map.neighbourNetwork.edges.data('boundary'):\n", " twin = False\n", " misori = grain2.refOri * grain1.refOri.conjugate\n", " for misori_twin in misori_twin_all:\n", " if 2 * np.arccos(misori_twin.dot(misori)) < misori_twin_tol:\n", " twin = True\n", " break\n", " \n", " if not twin:\n", " continue\n", " \n", " twin_lines += b_seg.boundaryLines" ] }, { "cell_type": "code", "execution_count": null, "id": "0c76eb93-44fe-493a-9d94-3411475e1bf6", "metadata": {}, "outputs": [], "source": [ "plot = ebsd_map.plotEulerMap(plotGBs='line')\n", "plot.addGrainBoundaries(boundaries=twin_lines, kind='line', colour='limegreen')" ] }, { "cell_type": "code", "execution_count": null, "id": "04770a4f-a267-4060-acbe-53cf89525d5b", "metadata": {}, "outputs": [], "source": [ "plot = dic_map.plotMaxShear(vmin=0, vmax=0.05, plotGBs='line')\n", "plot.addGrainBoundaries(\n", " boundaries=dic_map.warp_lines_to_dic_frame(twin_lines), \n", " kind='line', colour='limegreen', lw=3\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "aa26f342-2ec4-4263-bb01-0fbe9224051d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "097ab2f9-2389-4b3e-86b9-de996d9b59c7", "metadata": {}, "source": [ "## Colour grain boundaries by misorientation" ] }, { "cell_type": "code", "execution_count": null, "id": "6ed39a19-6470-4705-9a8e-cbe3db042ba0", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import matplotlib as mpl\n", "import defdap.plotting" ] }, { "cell_type": "code", "execution_count": null, "id": "64370d47-86fa-431d-9b0f-93e693e9e95f", "metadata": {}, "outputs": [], "source": [ "def oris_to_col(ori_1: Quat, ori_2: Quat, sym_group: str) -> float:\n", " return ori_1.misOri(ori_2, sym_group)\n", "\n", "sym_group = ebsd_map.primaryPhase.crystalStructure.name\n", "gb_lines = []\n", "gb_cols = []\n", "for grain1, grain2, b_seg in ebsd_map.neighbourNetwork.edges.data('boundary'):\n", " line_col = oris_to_col(grain1.refOri, grain2.refOri, sym_group)\n", " gb_lines += b_seg.boundaryLines\n", " gb_cols += [line_col] * len(b_seg.boundaryLines)\n", "\n", "# Convert values to colours\n", "gb_cols = 2 * np.arccos(gb_cols)" ] }, { "cell_type": "code", "execution_count": null, "id": "aa49a105-def4-4d04-937a-b5d9f0dd4975", "metadata": {}, "outputs": [], "source": [ "plot = ebsd_map.plotEulerMap()\n", "img = plot.addGrainBoundaries(\n", " kind='line',\n", " boundaries=gb_lines,\n", " colour=gb_cols,\n", " cmap=mpl.colormaps['gray'],\n", " norm=mpl.colors.Normalize(vmin=gb_cols.min(), vmax=gb_cols.max()),\n", ")\n", "plt.colorbar(mappable=img, label=\"Boundary misorientation\")" ] }, { "cell_type": "code", "execution_count": null, "id": "d95f6f54-c177-48ec-9608-949c2643e200", "metadata": {}, "outputs": [], "source": [ "plot = defdap.plotting.MapPlot.create(dic_map, np.zeros(dic_map.shape))\n", "img = plot.addGrainBoundaries(\n", " kind='line',\n", " boundaries=dic_map.warp_lines_to_dic_frame(gb_lines),\n", " colour=gb_cols,\n", " cmap=mpl.colormaps['viridis'],\n", " norm=mpl.colors.Normalize(vmin=gb_cols.min(), vmax=gb_cols.max()),\n", ")\n", "plt.colorbar(mappable=img, label=\"Boundary misorientation\")" ] }, { "cell_type": "code", "execution_count": null, "id": "e6cd018a-b87a-48bd-9344-5e6516fb9a4d", "metadata": {}, "outputs": [], "source": [ "plot = dic_map.plotMaxShear(vmin=0, vmax=0.05)\n", "img = plot.addGrainBoundaries(\n", " kind='line',\n", " boundaries=dic_map.warp_lines_to_dic_frame(gb_lines),\n", " colour=gb_cols,\n", " cmap=mpl.colormaps['gray'],\n", " norm=mpl.colors.Normalize(vmin=gb_cols.min(), vmax=gb_cols.max()),\n", ")\n", "plt.colorbar(mappable=img, label=\"Boundary misorientation\")" ] }, { "cell_type": "code", "execution_count": null, "id": "4366d01f-1c8a-4dc2-b589-e8055aa7d01d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "61fe241b-2178-4f39-998d-ac3f6e13b070", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:defdap]", "language": "python", "name": "conda-env-defdap-py" }, "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.11.0" } }, "nbformat": 4, "nbformat_minor": 5 }