{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import torch\n",
    "from torchvision.transforms.functional import rotate\n",
    "from pytomography.utils import rotate_detector_z\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "PyTomography is built around PyTorch, which uses the data type `torch.tensor` (very analogous to the `numpy.array`)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 4,  9, 16])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.tensor([2,3,4])\n",
    "x**2"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All objects and images are stored using `torch.tensor`s. The shape of the tensor depends on the imaging modality\n",
    "\n",
    "* For SPECT, objects have shape `[batch_size, Lx, Ly, Lz]` and images have shape `[batch_size, Ltheta, Lr, Lz]`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 128, 128, 128])"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.ones((1,128,128,128))\n",
    "x.shape"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can create a simple cylinder using a meshgrid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([128, 128, 128])"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.linspace(-1,1,128)\n",
    "xv, yv, zv = torch.meshgrid(x,x,x, indexing='ij')\n",
    "obj = (xv**2 + 0.9*zv**2 < 0.5) * (torch.abs(yv)<0.8)\n",
    "obj = obj.to(torch.float)\n",
    "obj.shape"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We need to ensure we have the `batch_size` dimension"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 128, 128, 128])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "obj = obj.unsqueeze(dim=0)\n",
    "obj.shape"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's plot from a coronal, sagital, and axial perspective"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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/35z8uRJ07hxY9O5c2dTWFjo6JORkXFRHiwt/7377rtGklm/fr2jbf78+UaSycjIqNLzQ/VjejncSm5uriSpbt265fb99NNPJUkTJ050an/00Ucl6aIp4nFxcUpKSrroGF26dNGNN97oaAsKCtLo0aP1008/adeuXU79R4wY4XTzoJKRmx9//NHR9uvrxPPy8nT8+HF17dpVxhht3bq13PMCgIq45ZZblJaWpjvuuEPffvutZsyYoaSkJDVu3Fgffviho9+vc1JOTo6OHz+ubt266ccff1ROTo4kKTU1VefPn9fDDz/s9BquuhnbhXGRKwG4k0WLFik8PFw9evSQ9Mt12YMGDdKSJUtUVFTk6Ne2bVtNnTpV//d//6ekpCQdP35cCxculL//pScT/zr/nTt3TsePH9f1118vSdqyZYsLzghWo+iGWwkODpYknTp1qty+Bw4ckJ+f30V3koyIiFBoaKgOHDjg1B4XF1fqMVq0aHFRe6tWrRzbf61JkyZO6/Xq1ZMknTx50tF28OBBDR8+XGFhYQoKClLDhg3VrVs3SXL8gQsAVeG6667T8uXLdfLkSW3cuFHJyck6deqUBgwY4PjQ8KuvvlJiYqLq1Kmj0NBQNWzYUH/+858l/S8nleS6C/NpWFiYI89VNXIlAHdUVFSkJUuWqEePHsrIyNC+ffu0b98+xcfHKysr66JruB977DF16NBBGzdu1JQpU9S6detyX+PEiRMaN26cwsPDVatWLTVs2NDxdyr5zztxTTfcSnBwsKKiorRjx44K71PR616q4k7lNWrUKLXdGCPpl0R9yy236MSJE3riiSfUsmVL1alTR4cPH9bw4cNVXFx8xTEAwIXsdruuu+46XXfddfrNb36jESNGaNmyZfrDH/6gnj17qmXLlpo5c6aio6Nlt9v16aef6uWXX7YsJ5ErAbir1atX6+jRo1qyZImWLFly0fZFixbpd7/7nWP9xx9/1N69eyVJ27dvr9Br3H333dqwYYMee+wxdezYUUFBQSouLtatt95K/vNSFN1wO7fffrvefPNNpaWlKSEhocx+MTExKi4u1t69ex0j05KUlZWl7OxsxcTElPtaMTEx2rNnz0Xt33//vWP75di+fbt++OEHLVy4UEOHDnW0r1q16rKOAwCV1blzZ0nS0aNH9dFHHyk/P18ffvih00ydNWvWOO1Tkuv27dvnNCvov//9r9NMnrKU9eFnWe3kSgDuatGiRWrUqJHmzp170bbly5fr/fff17x581SrVi0VFxdr+PDhCg4O1vjx4/X8889rwIABuuuuu8o8/smTJ5WamqqpU6dq8uTJjvaSwh3eienlcDuPP/646tSpo/vvv19ZWVkXbd+/f79eeeUV9erVS5I0a9Ysp+0zZ86UJPXu3bvc1+rVq5c2btyotLQ0R1teXp7efPNNxcbGVmiK0K+VjISXjHyX/P+VV165rOMAQHnWrFnjlGtKlNzvokWLFqXmpJycHM2fP99pn549e8rf3/+iR4m9+uqrFYqlTp06pU6JrFOnjiQpOzvbqZ1cCcAdnT17VsuXL9ftt9+uAQMGXLSMHTtWp06dctw3Y+bMmdqwYYPefPNNPfPMM+rataseeughHT9+vMzXKC3/SRf/PQvvwkg33M7VV1+txYsXa9CgQWrVqpWGDh2qtm3bqqCgQBs2bNCyZcs0fPhwjRs3TsOGDdObb76p7OxsdevWTRs3btTChQvVr18/x80vLuXJJ5/Uu+++q9tuu01//OMfFRYWpoULFyojI0P//Oc/5ed3eZ9LtWzZUldffbX+9Kc/6fDhwwoODtY///nPCo0UAcDleOSRR3TmzBndeeedatmypSNHLl26VLGxsRoxYoSysrJkt9vVp08fPfDAAzp9+rTeeustNWrUSEePHnUcKzw8XOPGjdNLL72kO+64Q7feequ+/fZbffbZZ2rQoEG5l/F06tRJS5cu1cSJE3XdddcpKChIffr00dVXX63Q0FDNmzdPdevWVZ06dRQfH0+uBOCWPvzwQ506dUp33HFHqduvv/56NWzYUIsWLVL79u01adIkDR8+XH369JEkLViwQB07dtTDDz+s9957r9RjBAcH66abbtKMGTNUWFioxo0b61//+pcyMjJcdl5wA1bdNh0ozw8//GBGjRplYmNjjd1uN3Xr1jU33HCDmTNnjjl37pwxxpjCwkIzdepUExcXZ2rWrGmio6NNcnKyY3uJmJgY07t371JfZ//+/WbAgAEmNDTUBAYGmi5dupiPP/7YqU/JI3KWLVvm1F7aYyB27dplEhMTTVBQkGnQoIEZNWqU+fbbby/qx2NwAFyJzz77zNx3332mZcuWJigoyNjtdtOsWTPzyCOPmKysLEe/Dz/80LRv394EBgaa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",
      "text/plain": [
       "<Figure size 1000x300 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, _ = plt.subplots(1,3,figsize=(10,3))\n",
    "plt.subplot(131)\n",
    "plt.pcolormesh(x,x,obj[0].sum(axis=0).T, cmap='Greys_r')\n",
    "plt.xlabel('y')\n",
    "plt.ylabel('z')\n",
    "plt.title('Coronal')\n",
    "plt.subplot(132)\n",
    "plt.pcolormesh(x,x,obj[0].sum(axis=1).T, cmap='Greys_r')\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('z')\n",
    "plt.title('Sagittal')\n",
    "plt.subplot(133)\n",
    "plt.pcolormesh(obj[0].sum(axis=2).T, cmap='Greys_r')\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.title('Axial')\n",
    "fig.tight_layout()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fundamental Operations"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that we have a 3D object $f$, we may want to turn this into projections $g$ using\n",
    "\n",
    "$$g = Hf$$\n",
    "\n",
    "Assuming no attenuation, PSF modeling, scattering, we can model this by projecting the object at different angles (think of it like taking an X-Ray at a number of different angles)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Idea\n",
    "\n",
    "Rotate the object first, always project along the x-axis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 128, 128])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "proj = obj.sum(axis=1)\n",
    "proj.shape"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is an projection"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The Rotate Function"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The object is a tensor with 4 dimensions (including batch size). We can use the rotate function, which rotates the object in the $xy$-plane so long as $x$ and $y$ are the final two dimensions\n",
    "\n",
    "* Right now $z$ is the last dimension\n",
    "\n",
    "So we need to transpose the array then rotate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "beta = 45\n",
    "phi = 270 - beta\n",
    "obj_rotated = rotate(obj.permute(0,3,1,2), -phi).permute(0,2,3,1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We rotate by $-\\phi$ so that the detector angle is $\\phi$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 128, 128])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "proj_45 = obj_rotated.sum(axis=1)\n",
    "proj_45.shape"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All this functionality is contained in the `rotate_detector_z` function [here](https://pytomography.readthedocs.io/en/latest/_modules/pytomography/utils/helper_functions.html#rotate_detector_z)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.QuadMesh at 0x7fb33e5c2e80>"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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uvQnf/Ineumll/TFL35RkvT+++9r6tSpam5u1qc//WnfPpPJpMrKytTV1aXS0tIoh59z7n8evx0k7rLX8/2e29fXZ1RvUg7yXOniJR132au9aV/uJR5gOHIv4biXVYIkSzPtK0g56JJNkN1NYe5GGq5M/n5HvsDV1dUlSaqoqJAktba2qre3V7W1tak2U6ZM0aRJk9Tc3Bz1cAAAQB6I9Euy/f39WrZsmebOnavrrrtOkpRIJFRcXKzy8vKMtvF4XIlEIms/3d3d6u7uTpWTyWRkYwYAALkXaYBSX1+vd955R/v27QvUT0NDg9auXRvSqPKL37k+fgnKvHbqhJ0czT22KJd4/G4hu5dp0tv79VVSUiIAmUyWeKJcwvErR7mEI3kv47CEE67IlniWLl2q7du3a/fu3br66qtTj1dWVqqnp0ednZ0Z7Ts6OlRZWZm1r1WrVqmrqyv1097eHtWwAQCABUK/g+I4jh588EFt3bpVb7zxhqqrqzPqZ82apaKiIjU1NWnBggWSpMOHD+v48eOqqanJ2mdJSQn/V3sJfndYvNK0B/3CrWkK+DDvoJh+YdcvfwyAYExyDXGiMAYi9AClvr5eL730kn7yk59o7Nixqe+VlJWVadSoUSorK9PixYu1YsUKVVRUqLS0VA8++KBqamoGtIMHAAAMf6EHKJs3b5YkfeYzn8l4/Pnnn9ff/M3fSJK+853vqKCgQAsWLFB3d7fmzZun733ve2EPBQAA5KnI86BE4XLKgzKUosy54i6HnXMFQP6IMjdJlCclIzir8qAAAACYIkABAADW4TRjpJjuCAIAICrcQQEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANYhQAEAANbJaYCyadMmXXvttRo5cqTmzJmj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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pcolormesh(proj_45[0].T, cmap='Greys')"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is equivalent to what we would call $g_{45^{\\circ}}$ in the SPECT example of the manual [here](https://pytomography.readthedocs.io/en/latest/notebooks/conventions.html#Mappings). We can the compute $g = \\sum_{\\theta} g_{\\theta} \\otimes \\hat{\\theta}$ by computing these projections for a number of angles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "angles = np.arange(0,360.,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [],
   "source": [
    "image = torch.zeros((1,len(angles),128,128))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 128, 128])"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "image[:,2].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "image = torch.zeros((1,len(angles),128,128))\n",
    "for i,angle in enumerate(angles):\n",
    "    object_i = rotate_detector_z(obj,angle)\n",
    "    image[:,i] = object_i.sum(axis=1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can look at the image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'r')"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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+42NjX57e3u5d62iXXLJJX5DQ4P/9NNP+2+//Xb2r7e3N7vMv/7rv/rTp0/3n3zySf/555/358yZ48+ZM6eMe10d9q9i830dx3xt3LjRj0aj/o033uhv27bNv/fee/1x48b5//Vf/5Vd5qabbvIbGxv9X/ziF/5LL73kn3nmmf6MGTP8vr6+Mu555Vm4cKH//ve/33/sscf87du3+z//+c/9973vff6VV16ZXUbH0rZnzx7/hRde8F944QUfgH/rrbf6L7zwQrayKp9j9qlPfco/+uij/Q0bNvjPPvusf8ghh/jnnntuuX5S2eQ6lolEwv/sZz/rH3jggf6LL75o/D9oYGAgu45SHMsxfYPk+75/++23+9OnT/dramr8448/3n/uuefKvUsVD0Dg35133pldpq+vz//KV77iT5o0yR83bpz/uc99zn/77bfLt9NVgm+QdBzz9+ijj/qHH364H4/H/ZkzZ/o//vGPjfme5/nLli3zm5ub/Xg87p966qn+1q1by7S3laurq8u/7LLL/OnTp/u1tbX+Bz/4Qf+b3/ym8T8fHUvbU089Ffjv4sKFC33fz++YvfPOO/65557rT5gwwZ84caJ//vnn+3v27CnDrymvXMdy+/btg/4/6KmnnsquoxTHMuT7+3WPKiIiIiJj9x0kERERkcHoBklERESE6AZJREREhOgGSURERIToBklERESE6AZJREREhOgGSURERIToBklERESE6AZJRMa0L33pS5g3b165d0NEKoxukESkoq1fvx6RSASnn356uXdFRMYQ3SCJSEVbvXo1Lr30Uqxbtw5vvfVWuXdHRMYI3SCJSMXq7u7Ggw8+iEsuuQSnn3467rrrruy8p59+GqFQCGvXrsWsWbMwbtw4nHDCCdi6dauxjhtuuAFTpkxBfX09vvzlL+Pqq6/GUUcdNeg2Pc9DW1sbZsyYgbq6Ohx55JH47//+72H6hSJSqXSDJCIV62c/+xlmzpyJD3/4wzjvvPPw05/+FDy+9je/+U18//vfx/PPP49oNIoLLrggO+/ee+/FjTfeiJtvvhmbN2/G9OnTsXLlypzbbGtrwz333INVq1bhT3/6E6644gqcd955eOaZZ4blN4pIZQr5/K+NiEiFOPHEE3H22WfjsssuQyqVwtSpU/HQQw/h5JNPxtNPP41TTjkFTzzxBE499VQAwK9//Wucfvrp6OvrQ21tLT72sY9h1qxZuOOOO7LrPOmkk9Dd3Y0XX3wRQOYl7Y6ODjzyyCMYGBhAU1MTnnjiCcyZMyf7nS9/+cvo7e3FfffdN6K/X0TKRxkkEalIW7duxcaNG3HuuecCAKLRKL7whS9g9erVxnIf/ehHs/89depUAMCuXbuy6zj++OON5Xl6f3/5y1/Q29uLT3ziE5gwYUL275577sH//u//luR3iUh1iJZ7B0REgqxevRqpVArTpk3Lfub7PuLxuJERisVi2f8OhUIAMu8RFaO7uxsA8Ktf/Qrvf//7jXnxeLyodYpIddINkohUnFQqhXvuuQff//738clPftKYN2/ePNx///2YOXOmcz0f/vCHsWnTJnzxi1/MfrZp06ZBlz/ssMMQj8fx5ptv4h//8R+L/wEiUvV0gyQiFeexxx7Du+++iwsvvBANDQ3GvPnz52P16tX47ne/61zPpZdeiosuugizZs3CCSecgAcffBAvvfQSPvjBDwYuX19fj6997Wu44oor4HkeTjrpJHR2duJ3v/sdJk6ciIULF5bk94lI5dMNkohUnNWrV6O1tdW6OQIyN0i33HILXnrpJed6FixYgNdffx1f+9rX0N/fj7PPPhtf+tKXsHHjxkG/8+1vfxsHHHAA2tra8Prrr6OxsRHHHHMMvvGNbwzpN4lIdVEVm4iMKZ/4xCfQ0tKC//zP/yz3rohIBVMGSURGrd7eXqxatQpz585FJBLB/fffjyeeeAJr1qwp966JSIVTBklERq2+vj6cccYZeOGFF9Df348Pf/jDuOaaa3DWWWeVe9dEpMLpBklERESEqKNIEREREaIbJBERERGiGyQRERERohskEREREaIbJBERERGiGyQRERERohskEREREaIbJBERERHy/wNb4VRYqFFsWgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pcolormesh(image[0,:,:,64].T)\n",
    "plt.xlabel('Angle')\n",
    "plt.ylabel('r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytomographytest",
   "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.9.16"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
