Last active
April 17, 2023 13:20
-
-
Save alisterburt/7cf4aa0985e85ab74bffb6e6d78f5d38 to your computer and use it in GitHub Desktop.
Decomposing a RELION projection matrix for James Hooker
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/latex": "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(\\beta \\right)} \\cos{\\left(\\gamma \\right)} & \\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\cos{\\left(\\gamma \\right)} - \\sin{\\left(\\gamma \\right)} \\cos{\\left(\\alpha \\right)} & \\sin{\\left(\\alpha \\right)} \\sin{\\left(\\gamma \\right)} + \\sin{\\left(\\beta \\right)} \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)} & dx + ox_{tilt} - ox_{tomo} \\cos{\\left(\\beta \\right)} \\cos{\\left(\\gamma \\right)} - oy_{tomo} \\left(\\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\cos{\\left(\\gamma \\right)} - \\sin{\\left(\\gamma \\right)} \\cos{\\left(\\alpha \\right)}\\right) - oz_{tomo} \\left(\\sin{\\left(\\alpha \\right)} \\sin{\\left(\\gamma \\right)} + \\sin{\\left(\\beta \\right)} \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)}\\right)\\\\\\sin{\\left(\\gamma \\right)} \\cos{\\left(\\beta \\right)} & \\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\sin{\\left(\\gamma \\right)} + \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)} & - \\sin{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)} + \\sin{\\left(\\beta \\right)} \\sin{\\left(\\gamma \\right)} \\cos{\\left(\\alpha \\right)} & dy - ox_{tomo} \\sin{\\left(\\gamma \\right)} \\cos{\\left(\\beta \\right)} + oy_{tilt} - oy_{tomo} \\left(\\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\sin{\\left(\\gamma \\right)} + \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)}\\right) - oz_{tomo} \\left(- \\sin{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)} + \\sin{\\left(\\beta \\right)} \\sin{\\left(\\gamma \\right)} \\cos{\\left(\\alpha \\right)}\\right)\\\\- \\sin{\\left(\\beta \\right)} & \\sin{\\left(\\alpha \\right)} \\cos{\\left(\\beta \\right)} & \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\beta \\right)} & ox_{tomo} \\sin{\\left(\\beta \\right)} - oy_{tomo} \\sin{\\left(\\alpha \\right)} \\cos{\\left(\\beta \\right)} + oz_{tilt} - oz_{tomo} \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\beta \\right)}\\\\0 & 0 & 0 & 1\\end{matrix}\\right]$" | |
| }, | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "from sympy.abc import alpha, beta, gamma\n", | |
| "from sympy import sin, cos\n", | |
| "from sympy import Matrix\n", | |
| "from sympy import symbols, trigsimp\n", | |
| "from sympy import init_printing\n", | |
| "\n", | |
| "init_printing()\n", | |
| "\n", | |
| "dx, dy = symbols('dx dy')\n", | |
| "ox_tomo, oy_tomo, oz_tomo = symbols('ox_tomo oy_tomo oz_tomo')\n", | |
| "ox_tilt, oy_tilt, oz_tilt = symbols('ox_tilt oy_tilt oz_tilt')\n", | |
| "\n", | |
| "Rx = Matrix(\n", | |
| " [[1, 0, 0, 0],\n", | |
| " [0, cos(alpha), -sin(alpha), 0],\n", | |
| " [0, sin(alpha), cos(alpha), 0],\n", | |
| " [0, 0, 0, 1]]\n", | |
| ")\n", | |
| "\n", | |
| "Ry = Matrix(\n", | |
| " [[cos(beta), 0, sin(beta), 0],\n", | |
| " [0, 1, 0, 0],\n", | |
| " [-sin(beta), 0, cos(beta), 0],\n", | |
| " [0, 0, 0, 1]]\n", | |
| ")\n", | |
| "\n", | |
| "Rz = Matrix(\n", | |
| " [[cos(gamma), -sin(gamma), 0, 0],\n", | |
| " [sin(gamma), cos(gamma), 0, 0],\n", | |
| " [0, 0, 1, 0],\n", | |
| " [0, 0, 0, 1]]\n", | |
| ")\n", | |
| "\n", | |
| "s0 = Matrix(\n", | |
| " [[1, 0, 0, -ox_tomo],\n", | |
| " [0, 1, 0, -oy_tomo],\n", | |
| " [0, 0, 1, -oz_tomo],\n", | |
| " [0, 0, 0, 1]]\n", | |
| ")\n", | |
| "\n", | |
| "s1 = Matrix(\n", | |
| " [[1, 0, 0, ox_tilt],\n", | |
| " [0, 1, 0, oy_tilt],\n", | |
| " [0, 0, 1, oz_tilt],\n", | |
| " [0, 0, 0, 1]]\n", | |
| ")\n", | |
| "\n", | |
| "s2 = Matrix(\n", | |
| " [[1, 0, 0, dx],\n", | |
| " [0, 1, 0, dy],\n", | |
| " [0, 0, 1, 0],\n", | |
| " [0, 0, 0, 1]]\n", | |
| ")\n", | |
| "\n", | |
| "\n", | |
| "M = s2 * s1 * Rz * Ry * Rx * s0\n", | |
| "M" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%%\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "general case..." | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%% md\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAE4AAAAVCAYAAADo49gpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAABJ0AAASdAHeZh94AAAEH0lEQVR4nO2Ye2jWZRTHP292GxmJGxUEOkWyIlK2jG6TRl7on0gCBbuQdtEKsywr//r67SpEBQWVYdAMQ4tVQ5FWYi0SzGauC2VUpkkJuspuS3Jj/fE8v/nz7fd7tzfeMRqdf877nvOc8xzO/fcUent7+R/Kh2OG2oD/Khw7FJfargW+BZok3TAI+puAK4Bxkv7I4J8ALAHmAhMi+UvgaUkvpM7VA+3AzZJWpXUMu4yzPQW4DliR47TjgbeAR4Bu4DmgCRgHrLI9MzkraTvwBvCg7ZFpPUPluO+Bs4Flg6D7YeBX4Nkc/mJgKrASqJN0l6SFwK2Rf2nR+UeB04E70sQhcZykw5J2StpXSb22zwSmAa9I+jPn2EKgC7hbUnoydkf8Y5Gt24CdwALbff6qaI+zfSUhoucAo6MRXwHrJD2TOldLUY9L04DlwAqCE0YCnwHLJW3ox4T5QAFYl2PfWGA8sD6jjGdHvDlDdG20aTrQChXMONu3AC0Ep60HHgc2AlXAvDJUjQW2AbXASwQnnAu02G7sR3Ya0ANszeGfH/EHKbsLthcDVwObJH2SIbcl4ukJoZIZtwD4C5gkaX+aYbumDD2XEbLLKfmXgTeBpcA7WUK2TwImA19kDYUI9RFvj0GYCzQAE4GPgWtz5D6MeGpCqHSP6wYOFxMldZahYw/wUJF8K/AdcEEJuTOAEUCpvpk4rp0Q6JsIToPQx0ZkCUn6BTgEjEloR2Wc7d2EUhkorJGURGkNoTw/t70WaAO2SDpQhj6ADkk9GfS9wEUl5Koj/rnEmXpgj6RO29cAtxPawCJgDqHNnJcj+xNwWvKnuFS/IXh2oPBD8kPSE7Y7gdsIo/tOoNd2G7BUUvsAdR7MoXdTukKSKXpiFjMOhmrg3WhvD2F4tQFttjuASbbHS9qVoaIqdcfRjpN0eQnD+gVJq4HVtkcBFwOzCJOu1fZZ/yL7yoGkr1bn8NNlmgVJpv5WzIhryCjC1AcG6ZNL0kHCRN0YL51PaKzNg3FfhH3AAY70rGLoGwzFDNujgUuAT3OCO5Gw5nQkhEquI422CxmsUyPuqtRdWRCX2feAGtsTMo4kjpuTtjN+gq0EjiP06Cy4MOK+iV7JjHsd+N32VmA3IUINwBRClDdV8K48aCbsYzOBr4t4ieNuBCbb3gycDMwgLMUvSmrK0TuDsB+2JIRKriP3E/adOsKAmEeI4n1Ao6R/rCmDAM2EXnd9mmh7DFADvA28SliulxC+FnYBsyVlLum2TwGuAjZI2pvQC8PtIdP2MsLLR52kHZE2C3gNuFfSY2XqWwQ8BTRIej+hD7tnJeBJwrL8QIqWlOlH5SiyXUV4wWlOOw2GoeMkHSK8x7XHzzA44rgdZaqrBZ4H7ilmDLtSzQLb+4EuSbWV0vk3V5VfKLHAvicAAAAASUVORK5CYII=\n", | |
| "text/latex": "$\\displaystyle - \\sin{\\left(\\beta \\right)}$" | |
| }, | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "M[2, 0]" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%%\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "therefore -1 * asin(M[2, 0]) == beta" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%% md\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/latex": "$\\displaystyle \\frac{\\sin{\\left(\\alpha \\right)}}{\\cos{\\left(\\alpha \\right)}}$" | |
| }, | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "M[2, 1] / M[2, 2]" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%%\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEEAAAAUCAYAAADStFABAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAABJ0AAASdAHeZh94AAAD00lEQVR4nOXYaaiVZRAH8J/aJkWaBhWBmlhGSLRg1AdTU7OIooWICFOjsmgxQik/jZNtEKUZpUWBYkVqEoZRhpBYSi6QLdBComULrWaYWmm3D+9z6Xh671Xzgkp/OMw5M2fmnZlnluecTi0tLf7v6Ly/HTgQcMj+dmBPkJmzcTFOiojf9sHO2ViDmyLi2VZ+p9Z2yMw+WI/ZETFmH3zuUGTmQKzEhIh4rAPsvYJzcXJEbOHgaIcH8CtmdJC9h3A87mxlHNBJyMxTMBzzImJbR9iMiFX4BOMyszNlJmTmZET53ujMHN2gNzYiZmXmGFyKM3EC/sSHmBERz9cE0EdpL0zGwyWgo/ARJkfEot34fAM6YW6dMDMPxW0Yg/74CfNxT4ltPZZExHVNqi8Vn0ZgcWslLMXj5f37yIbX2sKfgd5YhmnFUG/Mycwp7QTSG6vQB3NKQAOwMDOHtqNHlbSdeLdZkJk9sBxTsRHTsRl3qUr9FvTwz+E2YnmhIyiVEBFLM3MDxmNtREyuURwQEeuaHDkMr+PezJwZEV/X6A1RnXo26L2INzARb9XoyMwjcQY+bmMjzMVAjI+I6UXnEXyl2iSnYVZEfF6ju7rQ89mLmdCcgML7A0+qkjmsDdUvcH+T3mJ8iXPaeeSJ6IJvmwWZOVxVJW/jiQa7P2IDLsAxuK+NWDZjO3qxF/eEzOyl6rVhRblrjdN1WBsRO2v4G3FeO4/sWeimGtmoQqdFRPOVd3uhT0fExnbs/4zj2MMkZGZfVV8fo8r+m6r+26nq9dE4vA31X9rg79B+JbZugyNqZINVg/mNNnS34sF2bFMd4jb2vBLuVp3M2IiY1SjIzGtVSehofF9oz0ZmZnZVVeK6iNjaJOuLU7EiIr5ry3BZjd1V22OXk2gt2S41ev0KXVAjG9zWw/YR3+IH1eprRFfV2vyrRmeqqiJ37MZ2/2JjLbsmYRNalGHRhA2FDmlkZuZI3LibB/4nlF5fhmMzs1+DaBO2oF9mnt7gy624rHzsvhvz5xb6Fg3tEBFbMnMlBmXmC/hMVR2v4imMxfzMfBnfqHb9RZiHa/Y+zD3CAlyFkfi8+NmSmbNwO5Zk5nzVNfgKLEQ3DMnMmXguIlbX2L2wxLaQfw+mUXhNFVxgCs6KiA8wFCtwCW7F0bgSMzsm3losUM2G65v4E/EofsfNGKRqhatVG+xTjFNTEZnZDZdjUev26HSg/6mSmZNUk/6siHivA+zdobpdDoqIdzjAf0AVTFVdrGovPnuDslkmYUFrAjgIkhAR21VtuqZcpfcFffAMJjQy/wYAHz+f1eRfIwAAAABJRU5ErkJggg==\n", | |
| "text/latex": "$\\displaystyle \\tan{\\left(\\alpha \\right)}$" | |
| }, | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "trigsimp(M[2, 1] / M[2, 2])" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%%\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "therefore atan2(M[2, 1], M[2, 2]) == alpha\n" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%% md\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/latex": "$\\displaystyle \\frac{\\sin{\\left(\\gamma \\right)}}{\\cos{\\left(\\gamma \\right)}}$" | |
| }, | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "M[1, 0] / M[0, 0]" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%%\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEEAAAAVCAYAAAAZ6IOkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAABJ0AAASdAHeZh94AAAD6ElEQVR4nOWYW4iVVRTHfycHa+iOQUUxM4ZmhFBWhj1YSppFFF2o6KHG6YJUVBCWGdF//tntqRvUyBCkWFHWEIZR1kMyaeU41HQhp0jUtITpYoaVWTY97H2GPV/f+eaMR3CG/jCsYd32Wmuvvdf+Tqm/v5//Ow460AGMBNQd6ACqge2lwEXAeEm/7YP9mUA3cLOk57LyUvk42G4CNgFLJc2tIeb9CttTgXXAfEmP1+DndWAaMFHSrlQ2Go7Dw8CvQFuNfh4FjgPuyApGdBFsnwzMApZL+qMWX5K6gF5gnu1BedfFxVoBRV6z7eZEp0XSEttzgUuAKcDxwF/A50CbpBdyEmgiHi+gFXgsJnQY8AXQKmnlELHfAJSAVzK+LweWAx8DV0vakrO+gQeAeZLaI/vlGMtsYFVZt1yR1cBT8f9PASd/PZHfBjQCncCT0WEjsMz2ooJEGoEuoAlYFhOaDKywPbPADkLR9gIfZfh9wLvA2cA9WSPbJ0X+eiC9CNdGOjvVrwOQtNr2ZuBOoEdSa05AkyVtzCw2FngLuNf2Yknf5djNIOy6E7uXgLeBu4H3cmywfShwOrAhOxEkrY3d8BNwVo7508BY4FZJ/yT89ZGemypXfSdkCxB5e4BnCMU8v4LpFuChjN0q4FvCTlbCCcAYYHuFeP4EvgROSfm2LwUuBtoldWdsdgK7gYaUX/U7wXYDsICQbANQnxN0Hnok7c3hbwXOKVhyXKQ7CnR6gam2T5S0zXY94aj+CNxXweZn4NiUUVUR4hnrAo4G3gfeAXYSzmsT0AwcXMH8lwr8vynuxPI0OKRApzfSU4FtwEJgPHCjpErFq098A9V3wl2EnWmRtCQV2L6WUIT9jb5IxxXoDBTB9kbCZfgh8HyechyNRxGm1gDSIpRbdkyO/YRIO3Jk5xUEWQu2Az8Akwp00k6YRcjnNkmVvgonEUZuT8pM23EH0E/m0ojYHOmMlGl7DnBTQZD7jJhIJ3CM7QkV1L4hbN5VhMuwTdInBW6nRTpoIg10gqRdttcB022/CHwdF3gDeBZoAV61/RrwPWHWX0h4tFwzrAyrRwdwJTCHkPAgSNpjexOhU/uA+4fwdwEhpxUpM3sxXQe8SUhOwCLgDEmfATOBDwgVvwU4ArgCWDycrIaJDkJy1xfolI/EgjgCc2H7SOAyYKWkramsNNJ/VLG9EHiEsBn/aXXbawij9nBJvxf4uZ3wiJouaU0qG9EfUBFPEB5WD2YFtkvAacBXQxSgnjA+O7IFgFFQBEm7Cce0Oz6lU0wkfJAVXYYQ3jLtwPw84aj4ZUlSJ2FSZDEl0sIiSNpA+HrMxb/vM0jf3HKtgAAAAABJRU5ErkJggg==\n", | |
| "text/latex": "$\\displaystyle \\tan{\\left(\\gamma \\right)}$" | |
| }, | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "trigsimp(M[1, 0] / M[0, 0])" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%%\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "therefore atan2(M[1, 0], M[0, 0]) == alpha" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%% md\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "dealing with gimbal lock...\n", | |
| "if cos(beta) == 0, beta = pi / 2 and we are in a gimbal lock case\n" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%% md\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/latex": "$\\displaystyle \\frac{\\sin{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)} - \\sin{\\left(\\beta \\right)} \\sin{\\left(\\gamma \\right)} \\cos{\\left(\\alpha \\right)}}{\\sin{\\left(\\alpha \\right)} \\sin{\\left(\\beta \\right)} \\sin{\\left(\\gamma \\right)} + \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)}}$" | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "-1 * M[1, 2] / M[1, 1]" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%%\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "we know sin(pi/2) = 1" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%% md\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/latex": "$\\displaystyle \\frac{\\sin{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)} - \\sin{\\left(\\gamma \\right)} \\cos{\\left(\\alpha \\right)}}{\\sin{\\left(\\alpha \\right)} \\sin{\\left(\\gamma \\right)} + \\cos{\\left(\\alpha \\right)} \\cos{\\left(\\gamma \\right)}}$" | |
| }, | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "expr = (-1 * M[1, 2] / M[1, 1]).replace(sin(beta), 1)\n", | |
| "expr" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%%\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGUAAAAVCAYAAABfXiAOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAABJ0AAASdAHeZh94AAAE/ElEQVR4nO3ZbYydRRUH8N+Cgo0vIJiowbSFFDGkUUFr8EOlSBGJkYgEjFFs61tFVIwBEWM8PeJbYhSswdYGQglCgNqYGoygJJBCUdpG60ukGJoWixIrWDEVClrWDzNXnt4+995d3eXuJvyTzdk9M2fmzJw5/znP7Mjo6KjnMLVw0LAdeA4H4nnDdmAsyMxrcQaOjoh/DtufiUJmvgGb8ZGIuKqjH+nQV2bOxnZcGxGLh+BjKzJzHu7FRRHxrWH7M9HIzB/iJBwbEXuYHvT1FfwDK4btyCTha3gFPtVRTOmgZOarsRA3R8QTw/ZnMhARG7EVSzPzIOqdkpnLELXfosxc1LBbEhGrM3Mx3okT8Er8C7/Fioj4fvdkTTrEMnxd2eAX4XdYFhG3DPD5gxjBTW2Nmfl8XIDFOA6PYg0uqWvbjtsj4n0D5pkQZOZZuBm/xLkR8WBLn8QXsTQiVlX1jcoenYbbOplyJ75df/81svGzpepXYBbW44o60Cxcl5mX9fF1FjZiNq5TNngu1mXmKQPWuRD78IuWxR2BDbgcO7Ecj+HTChV8DEd45rA9G9iFn+FN+Gx3Y2YeU/WbcFWjaUOVp1EzJSLuzMwduBBbImJZy4RzI2Jb1ySH4Cf4XGaujIg/tdgtULIiG3Y34FZcjDvaVpeZL8TrcV+PiusmzMOFEbG82nwDDymV2vFYHREPtI0/GYiIDTVbHsUbW7osxyH4eEQ83dBvqvItjONO6Q5I1T2FK5XgntrD9EF8ucvuNvxROVG9cBQOxsPdDZm5UMmiu/CdxriPYAfeipfiS33GnxRExJP4PV7T1GfmmXgHVkXE5i6bx7AXMxnHd0pmzlS4+tRqPKOry1E9TLdExL4W/U68uc+UR1a5u6XtvCqviIjuJ4m9VX4vInb2GV9lh1n9+nTh+oh4/xj6bcW8zHxVRDyUmTMUyn8En+9h8ze8nDEGpXLhRuX03YWfKvy9T7krFuHQHuZ/76H/t/6Z2qm2XtDSdrJSaNzaw/ZxfLXP2B1s80wQx4I/j7Hf1iqPV+j0UhyND0VE2yGjHPInGHumfEY5uUsiYnWzITPfqwRlorGryiObynrqZmJbRDze1XaMQhv3RMRfBk0QEb0o9//Ff4OSmduUy/3nuKatcy2FD1eqxf2C0qGYg1vs5lS5tqXt5PH5O2Y8jL8qpW4TM5Qy+ekDLEoldqiShcNEM1MWKvt8QQvVdnCcsqYt7E8fuzGqXjZd2FHlgqYyM0/Hh8fv82DUBazHyzJzTqNpN/ZgTma+tuHL+Tiz/nn4ZPg0DjygHPJzlMt9RUT8qk//k6q8g0amRMSezLwX8zPzevyhDvwjfBdLsCYzf6Bw61y8XflYes9ErqiBtTgbpysLFRGjmbkan8DtmblGeaY4C+twGBZk5kpcHRGb2gaeTETEU5m5XWGYXfjCAJO3KXu9jgMv2vPwY2WzA5fhxIj4DU7BPUrkz8dL8G6snJCVtGOtsqgPdOkvxjfxJD6K+Qp1naNUiPdjqeFmTIfCLqklbysy8zC8C7d0qsWRqf5Prsy8VKmkThxAAVMKmXm3UvK/uLsg6er3SeWjcn5E3M0Uf5CsuFz50HzWPwT/V2TmCF6H+wcEZIZSLq/tBIRpEJSI2KvQ6ub69DIdcKzy8Doos2djFS5qKqfFfx4jYr1SiU0XnFBl36BExH3K6/B++A/PPqO3UiLH/QAAAABJRU5ErkJggg==\n", | |
| "text/latex": "$\\displaystyle \\tan{\\left(\\alpha - \\gamma \\right)}$" | |
| }, | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "trigsimp(expr)" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%%\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "therefore if we set gamma = 0, atan2(-1 * M[1, 2], M[1, 1]) == alpha\n" | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%% md\n" | |
| } | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "once we have alpha, beta, gamma we can solve directly for dx, dy\n", | |
| "you just need ox, oy, oz which are the center of the unbinned volume in x, y, z." | |
| ], | |
| "metadata": { | |
| "collapsed": false, | |
| "pycharm": { | |
| "name": "#%% md\n" | |
| } | |
| } | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 2 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython2", | |
| "version": "2.7.6" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Author
Hey James
-
no spec afaik, I actually made a small mistake in the matrices above, s1 should be made from the tilt-image center not the tomogram center: https://github.com/alisterburt/tomo_preprocessing/blob/4a47549a1e0bf350fd924820169d563adf78d5ca/tomography_preprocessing/tilt_series_alignment/_job_utils.py#L28-L69
You will also need to be careful, IMOD uses N+1 / 2 (zero indexed) as the image rotation center whilst RELION uses N / 2 -
yep - Euler angles are not a singular representation, there will always be multiple degenerate solutions
-
Another arbitrary point, same as above - you could fix alpha
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks Alister,
A few questions/comments:
I’ll take your word for it that the matrices are in the form you describe. Is there a specification somewhere that confirms this?
In the case that$\cos(\beta)$ is zero, $\beta$ could presumably be either $\pi / 2$ or $3 \pi / 2$ , and $\tan(\alpha - \gamma)$ or $\tan(\alpha + \gamma)$ . Whether $\beta$ is $\pi / 2$ or $3 \pi / 2$ could be told from
-M[1, 2] / M[1, 1]could be eitherM[2, 0].I don’t immediately see why in the case that$\cos(\beta)$ is zero, the choice of $\gamma$ should be arbitrary. Why not fix $\alpha$ ?