LiberTEM/LiberTEM

View on GitHub
examples/binning.ipynb

Summary

Maintainability
Test Coverage
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "763f597e",
   "metadata": {},
   "source": [
    "# Binning\n",
    "\n",
    "This example shows how LiberTEM can be used for fast binning of a large dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3f022ae6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:14.933683Z",
     "iopub.status.busy": "2023-06-29T12:46:14.933552Z",
     "iopub.status.idle": "2023-06-29T12:46:15.233209Z",
     "shell.execute_reply": "2023-06-29T12:46:15.232606Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a7990d5f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:15.235565Z",
     "iopub.status.busy": "2023-06-29T12:46:15.235364Z",
     "iopub.status.idle": "2023-06-29T12:46:15.797267Z",
     "shell.execute_reply": "2023-06-29T12:46:15.796642Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import sparse\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from libertem.api import Context\n",
    "from libertem.udf.masks import ApplyMasksUDF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5a0f3575",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:15.799811Z",
     "iopub.status.busy": "2023-06-29T12:46:15.799666Z",
     "iopub.status.idle": "2023-06-29T12:46:17.204923Z",
     "shell.execute_reply": "2023-06-29T12:46:17.204293Z"
    }
   },
   "outputs": [],
   "source": [
    "ctx = Context()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76f4c9d7",
   "metadata": {},
   "source": [
    "## Generate test data\n",
    "Just a folded linear gradient for illustration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c7b3bbd1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:17.207184Z",
     "iopub.status.busy": "2023-06-29T12:46:17.207041Z",
     "iopub.status.idle": "2023-06-29T12:46:17.210133Z",
     "shell.execute_reply": "2023-06-29T12:46:17.209666Z"
    }
   },
   "outputs": [],
   "source": [
    "shape = (17, 19, 23, 29)\n",
    "data = np.linspace(0, 1, np.prod(shape, dtype=np.int64)).reshape(shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "09b0a029",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:17.211781Z",
     "iopub.status.busy": "2023-06-29T12:46:17.211498Z",
     "iopub.status.idle": "2023-06-29T12:46:17.230883Z",
     "shell.execute_reply": "2023-06-29T12:46:17.230376Z"
    }
   },
   "outputs": [],
   "source": [
    "ds = ctx.load('memory', data=data)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "49d56fc5",
   "metadata": {},
   "source": [
    "## Define the binning factor and determine target shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8d7edcb0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:17.232810Z",
     "iopub.status.busy": "2023-06-29T12:46:17.232367Z",
     "iopub.status.idle": "2023-06-29T12:46:17.235307Z",
     "shell.execute_reply": "2023-06-29T12:46:17.234759Z"
    }
   },
   "outputs": [],
   "source": [
    "bin_factor = 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5cb59344",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:17.237056Z",
     "iopub.status.busy": "2023-06-29T12:46:17.236661Z",
     "iopub.status.idle": "2023-06-29T12:46:17.239563Z",
     "shell.execute_reply": "2023-06-29T12:46:17.239026Z"
    }
   },
   "outputs": [],
   "source": [
    "# ceil() to include output bins that only fit partially into the\n",
    "# source frame\n",
    "size_y = int(np.ceil(ds.shape.sig[0] / bin_factor))\n",
    "size_x = int(np.ceil(ds.shape.sig[1] / bin_factor))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "698b2e6b",
   "metadata": {},
   "source": [
    "## Create a sparse matrix for binning\n",
    "Each layer corresponds to an output bin. We calculate which pixels are in each output bin."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "2000c674",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:17.241269Z",
     "iopub.status.busy": "2023-06-29T12:46:17.240945Z",
     "iopub.status.idle": "2023-06-29T12:46:17.250929Z",
     "shell.execute_reply": "2023-06-29T12:46:17.250457Z"
    }
   },
   "outputs": [],
   "source": [
    "bin_matrix_layers = []\n",
    "for y in range(size_y):\n",
    "    for x in range(size_x):\n",
    "        layer = np.zeros(ds.shape.sig)\n",
    "        start_y = y * bin_factor\n",
    "        stop_y = (y + 1) * bin_factor\n",
    "        start_x = x * bin_factor\n",
    "        stop_x = (x + 1) * bin_factor\n",
    "        layer[start_y:stop_y, start_x:stop_x] = 1\n",
    "        layer /= np.sum(layer)\n",
    "        bin_matrix_layers.append(sparse.COO(layer))\n",
    "bin_matrix = sparse.stack(bin_matrix_layers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "415eeb91",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:17.253089Z",
     "iopub.status.busy": "2023-06-29T12:46:17.252951Z",
     "iopub.status.idle": "2023-06-29T12:46:17.255326Z",
     "shell.execute_reply": "2023-06-29T12:46:17.254893Z"
    }
   },
   "outputs": [],
   "source": [
    "def mask_factory():\n",
    "    return bin_matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb27f219",
   "metadata": {},
   "source": [
    "## Apply the matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "aeac970e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:17.257126Z",
     "iopub.status.busy": "2023-06-29T12:46:17.256736Z",
     "iopub.status.idle": "2023-06-29T12:46:18.212280Z",
     "shell.execute_reply": "2023-06-29T12:46:18.211826Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "724fca5615884e04b6206e01e238ee21",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Partitions 0/24, Frames:   0%|          | 0/323 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "udf = ApplyMasksUDF(mask_factories=mask_factory)\n",
    "result = ctx.run_udf(dataset=ds, udf=udf, progress=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aee221ec",
   "metadata": {},
   "source": [
    "## Reshape and show result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f72bf444",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:18.213980Z",
     "iopub.status.busy": "2023-06-29T12:46:18.213843Z",
     "iopub.status.idle": "2023-06-29T12:46:18.216490Z",
     "shell.execute_reply": "2023-06-29T12:46:18.216079Z"
    }
   },
   "outputs": [],
   "source": [
    "reshaped_result = result['intensity'].raw_data.reshape(*ds.shape.nav, size_y, size_x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "87587e92",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-06-29T12:46:18.218207Z",
     "iopub.status.busy": "2023-06-29T12:46:18.217849Z",
     "iopub.status.idle": "2023-06-29T12:46:18.412926Z",
     "shell.execute_reply": "2023-06-29T12:46:18.412518Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f9da468b250>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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iq80AADAViQfAADAVq5PPuJxoI0daLfhod0AwHojIvl47LHH+M9giGi34aHdRpfa2lpdfPHFSk1NVWFhoT744AOnQ4qZ6upqFRQUKC0tTZmZmVq8eLFaW1udDssyTz31lDwejyoqKpwOJab++c9/6p577tHEiRM1ZswYXX311dq7d6/TYZnm+uQDAKzw2muvqbKyUqtXr9aHH36omTNnqqSkREePHnU6tJhoamqS3+9Xc3Oz3n33XZ0+fVoLFy5UT0+P06HF3J49e/TCCy9oxowZTocSU//61780f/58JScn65133tHHH3+sX/7yl7rgggucDs001021BQA7FBYWqqCgQM8995ykr6b55+bmauXKlXrkkUccji72jh07pszMTDU1NemGG25wOpyY6e7u1uzZs/X888/riSee0KxZs1RTU+N0WDHxyCOP6P3339ef//xnp0OJOXo+AIw6p06dUktLi4qLiyPrEhISVFxcrF27djkYmXW6urokSRkZGQ5HElt+v1+33HJL1GcZL37/+99r7ty5uuOOO5SZmalrrrlG69evdzqsmCD5ADDqfPHFF+rt7VVWVlbU+qysLAUCAYeisk44HFZFRYXmz5+v6dOnOx1OzGzZskUffvihqqurnQ7FEv/4xz9UV1enqVOnatu2bVqxYoV+9KMfadOmTU6HZprrk494HhAWCzt37tSiRYuUk5Mjj8ejN954I+p9wzC0atUqTZ48WWPGjFFxcbE+/fRTZ4J1ifMZiHfy5En5/X5NnDhR48eP15IlS9TR0eFQxIA5fr9fH330kbZs2eJ0KDHT3t6uBx54QK+88opSU1OdDscS4XBYs2fP1pNPPqlrrrlG999/v+677z6tW7fO6dBMc3XyEe8DwmKhp6dHM2fOVG1tbZ/vP/3003rmmWe0bt067d69W+PGjVNJSYlOnjxpc6TucT4D8R588EH94Q9/0NatW9XU1KTDhw/r9ttvdzBqxNKkSZOUmJh4TkLZ0dGh7Oxsh6KyRnl5ud566y1t3769z+rRI1VLS4uOHj2q2bNnKykpSUlJSWpqatIzzzyjpKQk9fb2Oh2iaZMnT9aVV14Zte6KK67QoUOHHIoohgwXmzdvnuH3+yOve3t7jZycHKO6utrBqNxLklFfXx95HQ6HjezsbGPt2rWRdZ2dnYbX6zVeffVVByJ0p6NHjxqSjKamJsMwvmqj5ORkY+vWrZFtPvnkE0OSsWvXLqfCRIzNmzfPKC8vj7zu7e01vvGNb8TN35dwOGz4/X4jJyfH+Pvf/+50ODEXDAaN/fv3Ry1z58417rnnHmP//v1OhxcTS5cuNa677rqodRUVFUZRUZFDEcWOa3s+RuOAsFhra2tTIBCIakOfz6fCwkLa8L98fSBeS0uLTp8+HdVul19+ufLy8mi3OFJZWan169dr06ZN+uSTT7RixQr19PRo+fLlTocWE36/Xy+//LI2b96stLQ0BQIBBQIBnThxwunQYiItLU3Tp0+PWsaNG6eJEyfGzbiWBx98UM3NzXryySd18OBBbd68Wb/97W/l9/udDs001z1Y7qyBBoQdOHDAoahGlrMD50bLoLrh6GsgXiAQUEpKiiZMmBC1Le0WX+68804dO3ZMq1atUiAQ0KxZs9TQ0HDO78tIVVdXJ0lasGBB1PoNGzZo2bJl9geEISsoKFB9fb2qqqr0+OOPKz8/XzU1Nbr77rudDs001yYfgB3ODsT7y1/+4nQocEB5ebnKy8udDsMSxigs4bRjxw6nQ4i5W2+9VbfeeqvTYcSca2+7jKYBYVY52060Yd/6G4iXnZ2tU6dOqbOzM2p72g0AYsO1yUdKSormzJmjxsbGyLpwOKzGxkYVFRU5GNnIkZ+fr+zs7Kg2DAaD2r1796huQ8MwVF5ervr6ev3pT39Sfn5+1Ptz5sxRcnJyVLu1trbq0KFDo7rdACBWXH3bpbKyUmVlZZo7d67mzZunmpqauBoQFgvd3d06ePBg5HVbW5v27dunjIwM5eXlqaKiQk888YSmTp2q/Px8Pfroo8rJydHixYudC9phfr9fmzdv1ptvvhkZiCd9NRh3zJgx8vl8uvfee1VZWamMjAylp6dr5cqVKioq0rXXXutw9AAQB5yebjOYZ5991sjLyzNSUlKMefPmGc3NzU6H5Crbt283JJ2zlJWVGYbx1XS7Rx991MjKyjK8Xq9x0003Ga2trc4G7bC+2kuSsWHDhsg2J06cMH74wx8aF1xwgTF27FjjO9/5jnHkyBHnggaAOMKD5QAAgK1cO+YDAADEJ5IPAABgK5IPAABgK5IPAABgK5IPAABgK5IPAABgK5IPAABgK5IPAABgK5IPAABgK5IPAABgK5IPAABgK5IPAABgq/8PX2sSVbdRmEcAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1, 2)\n",
    "axes[0].imshow(data[0, 0])\n",
    "axes[1].imshow(reshaped_result[0, 0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e482d845",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (libertem39)",
   "language": "python",
   "name": "libertem39"
  },
  "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.10.8"
  },
  "vscode": {
   "interpreter": {
    "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1"
   }
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "015426d25bbb457aa96e88ef011eb255": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "12abef09eef04b77af778d45e2cdf333": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_1e4e85d4e474496fbe8993128c43336b",
       "placeholder": "​",
       "style": "IPY_MODEL_42d3a586561c42908f593f90a2d63398",
       "tabbable": null,
       "tooltip": null,
       "value": " 323/323 [00:00&lt;00:00, 534.15it/s]"
      }
     },
     "1e4e85d4e474496fbe8993128c43336b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "2647c492540441c6b5c3d285ac72095e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_99d525bc00a749ff92c255b2e03f3707",
       "max": 323.0,
       "min": 0.0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_37f6bc1b92bb4aa0849b344b56bcbea6",
       "tabbable": null,
       "tooltip": null,
       "value": 323.0
      }
     },
     "37f6bc1b92bb4aa0849b344b56bcbea6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "42d3a586561c42908f593f90a2d63398": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "724fca5615884e04b6206e01e238ee21": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_afbc0d9f52d64859970db0df110ecbfe",
        "IPY_MODEL_2647c492540441c6b5c3d285ac72095e",
        "IPY_MODEL_12abef09eef04b77af778d45e2cdf333"
       ],
       "layout": "IPY_MODEL_015426d25bbb457aa96e88ef011eb255",
       "tabbable": null,
       "tooltip": null
      }
     },
     "960dce948944407b967890c6c8b01770": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "99d525bc00a749ff92c255b2e03f3707": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "a08d900a08bd4a088369699bb72cbe24": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "afbc0d9f52d64859970db0df110ecbfe": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_a08d900a08bd4a088369699bb72cbe24",
       "placeholder": "​",
       "style": "IPY_MODEL_960dce948944407b967890c6c8b01770",
       "tabbable": null,
       "tooltip": null,
       "value": "Partitions 24/24, Frames: 100%"
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}