From 2bc67f65bdece16b2b9d2d7b007ad41df7c61381 Mon Sep 17 00:00:00 2001 From: Jacob Cain Date: Fri, 21 Feb 2025 17:59:01 -0800 Subject: [PATCH 1/6] Added csm sandbox --- .../csm-stack/csm-sandbox.ipynb | 247 ++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 docs/getting-started/csm-stack/csm-sandbox.ipynb diff --git a/docs/getting-started/csm-stack/csm-sandbox.ipynb b/docs/getting-started/csm-stack/csm-sandbox.ipynb new file mode 100644 index 00000000..8b39bae3 --- /dev/null +++ b/docs/getting-started/csm-stack/csm-sandbox.ipynb @@ -0,0 +1,247 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CSM Sandbox\n", + "\n", + "## 1. Prerequisites\n", + "\n", + "### Install Knoten\n", + "This tutorial requires Knoten version 0.4 or higher.\n", + "\n", + "`conda install -c conda-forge knoten=0.4`\n", + "\n", + "### Install Matplotlib\n", + "This tutorial requires matplotlib.\n", + "\n", + "`conda install -c conda-forge matplotlib`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "import os # File Path Joining\n", + "import json # Read ISD as python dictionary\n", + "import copy # Important to be able to modify the ISD\n", + "\n", + "from knoten import csm # Knoten CSM\n", + "\n", + "import shapely.wkt # Math and Plotting Tools\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create CSM Camera from existing ISD" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "data_dir = '../data/image_to_ground'\n", + "isd_file = os.path.join(data_dir, 'isd_file.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Methods for reading/printing stats" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "def full_keys(dict, partial_key):\n", + " return [key for key,value in dict.items() if partial_key in key.lower()]\n", + "\n", + "def print_stats(dict, search_keys):\n", + " for search_key in search_keys:\n", + " full_key = full_keys(dict, search_key)[0]\n", + " print(f\"{full_key+\": \":<25}\" + str(dict[full_key]))\n", + "\n", + "def plot_footprint(lons, lats, aspect):\n", + " plt.rcParams[\"figure.figsize\"] = aspect\n", + " plt.axes().set_aspect('equal','datalim')\n", + " plt.plot(lons, lats)\n", + " plt.xlabel(\"Longitude (deg)\")\n", + " plt.ylabel(\"Latitude (deg)\")\n", + " plt.title(\"CSM footprint\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Stats/Footprint of original ISD" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INS-74021_CCD_CENTER: [2500.5, 0.5]\n", + "INS-74021_IFOV: [2e-05, 2e-05]\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Load Dict from JSON-style ISD File\n", + "with open(isd_file) as json_file:\n", + " isd_dict = json.load(json_file)\n", + "\n", + "# Print selected values from ISD\n", + "print_stats(isd_dict['naif_keywords'], ('ccd_center', 'ifov'))\n", + "\n", + "# Create Camera Model\n", + "camera = csm.create_csm(isd_file)\n", + "\n", + "# Get the footprint using the model\n", + "boundary = csm.generate_boundary((isd_dict[\"image_lines\"], isd_dict[\"image_samples\"]))\n", + "lons, lats, alts = csm.generate_latlon_boundary(camera, boundary)\n", + "\n", + "# Plot it\n", + "plot_footprint(lons, lats, [5,1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modify ISD/write to file" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "# New values\n", + "\n", + "new_ccd_center = [1250.5, 1] # Original = [2500.5, 0.5]\n", + "new_ifov = [.00002, .00002] # Original = [.00002, .00002]\n", + "\n", + "\n", + "# Create new ISD Dictionary and modify values\n", + "\n", + "isd_dict_mod = copy.deepcopy(isd_dict)\n", + "\n", + "ccd_center_key = full_keys(isd_dict['naif_keywords'], 'ccd_center')[0]\n", + "isd_dict_mod['naif_keywords'][ccd_center_key] = new_ccd_center\n", + "\n", + "ifov_key = full_keys(isd_dict['naif_keywords'], 'ifov')[0]\n", + "isd_dict_mod['naif_keywords'][ifov_key] = new_ifov\n", + "\n", + "# Write ISD to file\n", + "isd_file_mod = os.path.join(data_dir, 'isd_file_mod.json')\n", + "\n", + "with open(isd_file_mod, 'w') as json_file:\n", + " json.dump(isd_dict_mod, json_file, indent=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INS-74021_CCD_CENTER: [1250.5, 1]\n", + "INS-74021_IFOV: [2e-05, 2e-05]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf8AAACgCAYAAAACXmUoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJgElEQVR4nO3dd1hT1xsH8G8YCQkjMoQAIogDRMRVB1oFtYJ1j1/rHq21ta5arVVrVdyorbbaWkedVWuHo+6qdQtOQIYTBUUBByAgMyTv7w8gEpYJsnk/z5PnCfeee885EXlz5hUQEYExxhhjNYZORReAMcYYY+WLgz9jjDFWw3DwZ4wxxmoYDv6MMcZYDcPBnzHGGKthOPgzxhhjNQwHf8YYY6yG4eDPGGOM1TAc/BljjLEahoM/Y9VYcHAwPvroI9SrVw8GBgYwMjJCy5YtsXz5csTHx6vSyeVyrF+/Hq1bt4aZmRkkEgns7e3Rt29f7Nu3T5UuMjISAoEAAoEAPj4+heb58ccfq9JoYs2aNWjQoAGEQiEEAgFevnz5NlUulJ+fH3x8fMrk3gBw5swZCAQCnDlzRutrU1NT4ePjU6JrGSspAW/vy1j1tHHjRowfPx5OTk4YP348XFxcIJfLce3aNWzcuBHNmjVTBfbBgwdj7969mDJlCjw9PSESifDgwQMcO3YMtWvXxrp16wBkB/969erB2NgYZmZmePDgAXR0XrchXr16BWtra+jo6CApKQlv+vMSFBSEFi1a4JNPPsGoUaOgp6eH1q1bQ1dXt1Q/i++++w7Tp09HREQEHBwcSvXeAJCUlISbN2/CxcUFJiYmWl374sUL1K5dG/PmzSvyCxVjpY4YY9WOn58f6erqUvfu3Sk9Pb3A+YyMDPrnn3+IiOjBgwcEgObOnVvovRQKhep9REQEAaBPPvmEANDx48fV0v76668kFotp+PDhpMmflx07dhAAunz5sjbV09qKFSsIAEVERJTqfTMzM0kul7/VPZ4/f04AaN68eaVTKMY0wN3+jFVDS5YsgUAgwIYNGyASiQqcFwqF6NOnDwAgLi4OAGBtbV3ovfK27HM5OTmhffv22Lx5s9rxzZs3Y8CAAZBKpW8so6enJ4YPHw4AaNu2LQQCAUaPHq12r2bNmsHAwABmZmbo378/bt26VeA+Bw4cgLu7OyQSCYyNjdGtWzf4+/urzvv4+GD69OkAgHr16qmGJHK72R0cHNCrVy/s27cPbm5uMDAwgKOjI1avXq2WT27X/m+//YZp06bB1tYWIpEI4eHhhXb7jx49GkZGRggPD0ePHj1gZGQEOzs7TJs2DRkZGQCye1Jq164NAJg/f76qbHk/B8bKREV/+2CMla6srCySSCTUtm1bjdK/evWKatWqRTKZjNavX19s6zi35b9ixQratGkTGRgYUHx8PBER3b59mwDQqVOnaMKECW9s+YeFhdG3335LAGjLli3k7+9P4eHhRES0ZMkSAkBDhgyhw4cP0/bt28nR0ZGkUindvXtXdY+dO3cSAPLy8qL9+/fTH3/8Qa1atSKhUEjnz58nIqKoqCiaNGkSAaC9e/eSv78/+fv7U2JiIhER2dvbk62tLdWtW5c2b95MR44coWHDhqnqmev06dMEgGxtbel///sfHThwgA4dOkRxcXGqc6dPn1alHzVqFAmFQmrcuDF99913dPLkSZo7dy4JBAKaP38+ERGlp6fTsWPHCACNGTNGVbbcz4GxssLBn7FqJjY2lgDQ4MGDNb7m8OHDZGFhQQAIAJmbm9MHH3xABw4cUEuXN/gnJyeTkZER/fTTT0RENH36dKpXrx4plUqNgj8R0ZYtWwgAXb16VXUsISGBxGIx9ejRQy3to0ePSCQS0dChQ4koezjCxsaGmjZtqjY0kZycTJaWltS+fXvVseK6/e3t7UkgEFBQUJDa8W7dupGJiQmlpKQQ0evg36lTpwL3KCr4A6A///xTLW2PHj3IyclJ9TN3+7OKwN3+NcDdu3fRt29fWFhYwMTEBB06dMDp06eLvYaI4OPjAxsbG4jFYnh6eiIsLEx1Pj4+HpMmTYKTkxMkEgnq1q2LyZMnIzExUeu8v/jiC7Rq1QoikQjNmzcvUR337t0Lb29vWFhYQCAQICgoqET3qal69OiBR48eYd++ffjqq6/QpEkT7N+/H3369MHEiRMLvcbIyAgffPABNm/ejKysLGzfvh0fffSRxrP8i+Lv74+0tLQCXd92dnbo0qUL/vvvPwDAnTt3EB0djREjRqgNTRgZGWHgwIG4dOkSUlNTNcqzSZMmaNasmdqxoUOHIikpCQEBAWrHBw4cqHFdBAIBevfurXbMzc0NDx8+1PgejJUFDv41QM+ePZGVlYVTp07h+vXraN68OXr16oXY2Ngir1m+fDlWrlyJn376CVevXoVMJkO3bt2QnJwMAIiOjkZ0dDS+++47hISEYOvWrTh27BjGjBmjdd5EhI8//hiDBg0qcR1TUlLQoUMH+Pr6lvge1YWFhQUkEgkiIiK0uk4sFqNfv35YsWIFzp49i/DwcLi4uODnn39W++KX15gxYxAQEIDFixfj+fPnpTJWXdwcBBsbG9X5N6VTKpVISEjQKE+ZTFbksdx8chU1N6IwEokEBgYGasdEIhHS09M1vgdjZYGDfzX34sULhIeHY+bMmXBzc0PDhg3h6+uL1NTUIv+gExF++OEHzJ49GwMGDICrqyu2bduG1NRU7Nq1CwDg6uqKPXv2oHfv3qhfvz66dOmCxYsX4+DBg8jKytIq79WrV2PChAlwdHQssh5+fn7o1KkTxGIx7OzsMHnyZKSkpKjOjxgxAnPnzsV7771XGh9blaarq4uuXbvi+vXrePz4cYnvU7duXXz66acAUOTvSocOHeDk5IQFCxagW7dusLOzK3F+uczNzQEAMTExBc5FR0fDwsJCo3Q6OjowNTXVKM/CvgjnHsvNJ9fb9mwwVhlw8K/mzM3N0bhxY2zfvh0pKSnIysrC+vXrYWVlhVatWhV6TUREBGJjY+Hl5aU6JhKJ4OHhAT8/vyLzSkxMhImJCfT09Eqcd2FCQkLg7e2NAQMGIDg4GH/88QcuXLhQZHc0A2bNmgUiwtixY5GZmVngvFwux8GDBwEAycnJePXqVaH3yZ1db2NjU2Re3377LXr37o1p06aVQskBd3d3iMVi7NixQ+3448ePcerUKXTt2hVA9ooDW1tb7Nq1S20/gZSUFOzZs0e1AgCAasVDWlpaoXmGhYXhxo0basd27doFY2NjtGzZslTqVZQ3lY2xsqBX0QVgZUsgEODEiRPo27cvjI2NoaOjAysrKxw7dgy1atUq9JrcFo+VlZXacSsrqyLHKuPi4rBw4UJ89tlnb5V3YVasWIGhQ4diypQpAICGDRti9erV8PDwwC+//FKgW5VlB9BffvkF48ePR6tWrfD555+jSZMmkMvlCAwMxIYNG+Dq6orevXvjzp078Pb2xuDBg+Hh4QFra2skJCTg8OHD2LBhAzw9PdG+ffsi8xo+fLhqyV5pqFWrFubMmYNvvvkGI0eOxJAhQxAXF4f58+fDwMAA8+bNA5C9BHH58uUYNmwYevXqhc8++wwZGRlYsWIFXr58qTYE1LRpUwDAjz/+iFGjRkFfXx9OTk4wNjYGkP3lpk+fPvDx8YG1tTV27NiBEydOYNmyZaovEGXF2NgY9vb2+Oeff9C1a1eYmZnBwsKiTDYjYiyXVsGfiHD27FmcP38ekZGRSE1NRe3atdGiRQu89957pdLlxzTj4+OD+fPnF5vm6tWraNWqFcaPHw9LS0ucP38eYrEYv/76K3r16oWrV68WO36Zv3uTiArt8kxKSkLPnj3h4uKi+sOcm76keed1/fp1hIeHY+fOnWr3ViqViIiIQOPGjTW6T00zduxYtGnTBqtWrcKyZcsQGxsLfX19NGrUCEOHDlX1nDRo0ABTp07FqVOn8M8//+D58+fQ19dHw4YNsWjRIkydOrXQtf5ladasWbC0tMTq1avxxx9/qCadLlmyBA0bNlSlGzp0KAwNDbF06VIMGjQIurq6aNeuHU6fPq32hcXT0xOzZs3Ctm3bsHHjRiiVSpw+fRqenp4AgObNm+Ojjz7CvHnzcO/ePdjY2GDlypX48ssvy6W+mzZtwvTp09GnTx9kZGRg1KhR2Lp1a7nkzWomjbb3TUtLw6pVq7B27VrExcWhWbNmsLW1hVgsRnx8PEJDQxEdHQ0vLy/MnTsX7dq1K4+y12gvXrzAixcvik3j4OCAixcvwsvLCwkJCWrbjjZs2BBjxozBzJkzC1z34MED1K9fHwEBAWjRooXqeN++fVGrVi1s27ZNdSw5ORne3t6QSCQ4dOiQWiv8v//+0ypvHx8f7N+/v8BM/caNG6Nbt26YPHlygbLWrVsXQqFQ9XPu9rOBgYElXjnAahYHBwe4urri0KFDFV0UxsqNRi3/Ro0aoW3btli3bh28vb2hr69fIM3Dhw+xa9cuDBo0CN9++y3Gjh1b6oVlr1lYWKgmPhUnd6lT/pabjo4OlEplodfUq1cPMpkMJ06cUAX/zMxMnD17FsuWLVOlS0pKgre3N0QiEQ4cOFCg+70keRemZcuWCAsLQ4MGDTS+hjHGWNE06ss7evQo/v77b/Tq1avQwA8A9vb2mDVrFu7du6fqSmMVz93dHaamphg1ahRu3LiBu3fvqh5w0rNnT1U6Z2dn1UNeBAIBpkyZgiVLlmDfvn0IDQ3F6NGjIZFIMHToUADZLX4vLy+kpKRg06ZNSEpKQmxsLGJjY6FQKLTKOzw8HEFBQYiNjUVaWhqCgoIQFBSkmqg2Y8YM+Pv7Y8KECQgKCsK9e/dw4MABTJo0SXWP+Ph4BAUF4ebNmwCy14Dn3pMxxlg+FbS5ECtHV69eJS8vLzIzMyNjY2Nq164dHTlyRC0NcrZYzaVUKmnevHkkk8lIJBJRp06dKCQkRHU+d0ezwl55d1HTJG8PD4833ufKlSvUrVs3MjIyIkNDQ3Jzc6PFixerzufuFJf/xbumMcZYQVo/0jc4OLjQ4wKBAAYGBqhbt26hDxJhjDHGWOWgdfDX0dEpdpMLfX19DBo0COvXr+clWIwxxlglpPX6nX379qFhw4bYsGEDgoKCVGuGnZycsGvXLmzatAmnTp3Ct99+WxblZYwxxthb0rrl36ZNGyxcuBDe3t5qx//991/MmTMHV65cwf79+zFt2jTcv3+/VAvLAKVSiejoaBgbG/M2o4wxVkMREZKTk2FjY1OifTi03uEvJCQE9vb2BY7b29sjJCQEQPaGGYXtt83eXnR0NG+mxBhjDAAQFRWFOnXqaH2d1sHf2dkZvr6+2LBhg2pzFblcDl9fXzg7OwMAnjx5UmBrWFY6crcjjYqKUts4hzHGWM2RlJQEOzs7VUzQltbB/+eff0afPn1Qp04duLm5QSAQIDg4GAqFQrVD1oMHDzB+/PgSFYgVL7er38TEhIM/Y6xYSiUhTa5AaqYCaZkKpGRmqd6n5rxPzXmffV6BtHzHUzMVSJMrYCoRYrq3E1xtpRVdLZZHSYd/tR7zB4BXr15hx44duHv3LogIzs7OGDp0aIm/gTDNJSUlQSqVqp6gxxir2ogIGVnKAkE4931qvkCdG8Rfn8sTpPOdS5MrSrWsujoCjO3oiCnvNYSBvm6p3ptp521jQYmCP6s4HPwZqxiZWcrsoCrPQkpGntazXIHUjJxgndPKTs3ICdbynICckedcvmCdmpkFZTn8FRbr68JQpAuxUBcSfT2IhTk/6+tBku+9WKgLQ6EuJMLsdGJ9XewPeoJDwdlzuepZGMJ3QFO0dTQv+4KzQlVI8P/tt9+wfv16PHjwAP7+/rC3t8eqVavg6OiIvn37al0IpjkO/owVTaGkfC3mgt3br4NuvhZ13qAuz8oJ6K+DulxR9hFaqKeTHYhzgq4kJ/AainJ+zvc+O4DrqdJJhHqQiLKvk+i/fm+gpwsdnbdfHXQ8LBZz/gnF06QMAMDwdnUxo7szjA0K3/adlZ23jQVaj/n/8ssvmDt3LqZMmYJFixap9nE3NTXFDz/8wMGfMVYsIvVx6NQC3dh5u7gLD9xFdXtnZGn+wKiS0tMRZAdXYXbQlYhet6TVjqta0HnPvT4vznlvmPNerK8LPd3yfXSytryayNDW0Ry+R2/h9ytR2HHpEf679QyL+7uiizNP8q5KtG75u7i4YMmSJejXrx+MjY1x48YNODo6IjQ0FJ6enm98zCx7O9zyZ+Uhdxw6LafrWtWNnb+FrNbtnX0uNVORfV5e9Dh0WQ826gig6rLODq56eYLv6+5sib4uJKI8wTpfyzp/S1os1IVQr3IH6PLid/8FZu0NwcO47Kd39m1ug7m9XGBuxNu7l4dyb/lHRESoPeM9l0gkQkpKitYFYIyVnFyhLLQ7Wy3YZmblTCArriX9+lxusC6vcejCW8iat54N87WkJUJdiPSK34acvb329S1w7ItOWHXyLn49/wD/BEXj/L0XmNfbBX2a2fDnX8lpHfzr1auHoKCgAhv9HD16FC4uLqVWMMaqC6WSslvHuTO5M4ppIWdkjzfnT1fUeHV5jkPnHWPODdrqQVqvQHBWa2UXMpZdGuPQrOKIhbr4pkdj9GxqjRl7gnE7Nhlf7A7CgaBoLOrvCmupuKKLyIqgdfCfPn06JkyYgPT0dBARrly5gt9//x1Lly7Fr7/+WhZlZKzMERHS5cpC1z4XaEnLs2dvqwJx3m5xeU5LO0ORM66dhXR52Y9D66rGofMF2DxjyoUGa9UM8NeTxlQTyHICfmUfh2YVr5ldLRyY+C7Wnb2Pn06F47/bz3B55TnMfN8ZQ9vU5S95lVCJZvtv3LgRixYtQlRUFADA1tYWPj4+GDNmTKkXkKmryWP+RIRMhbLYzUg0WQetHuBz7lMO49ACAXJaz4WPPxccmy6qa7tgy5rHoVllce9pMmbsCUbAo5cAgDb1zLBsoBvqWRhWbMGqmQpd5//ixQsolUpYWlqW9BZMS1Uh+OeOQxe1i1jBJVY566Bzz+VpSee2nlMzso8rymEg2kBfJzsg53Zti/RyJn9pN3s7f4A20OdxaFYzKJSE7f6RWH7sDtLkCoj0dPBlt0b45N163JNUSniTnxqmtIJ/3m0/NV0Hnb/1nFJIgE/LVCBTUfbd3EJdnQIBWLMJYfm6vvX1Xm98khPwdbmLkrFSERWfim/2heD8vexVYK62Jlg+sBlcbCpnw6UqKZfg36JFC41bLAEBAVoXgmlOm3/w9Wfv4+zd54WukS63cWj9nHXQxbWk1SaQFWxJFxbg9bn1wFiVQETYE/AECw/dRGKaHHo6Anzm4YhJXXiL4LdRLkv9+vXrp3qfnp6OtWvXwsXFBe7u7gCAS5cuISwsjB/mU4kolYRfzt7Hy1T5G9MW1Vousms739ro/JPIcru9hbrczc1YTScQCPC/VnXQqZEFfA6E4UhILH4+fR9HQ2OxfKAb3nEwq+gi1khad/t/8sknsLa2xsKFC9WOz5s3D1FRUdi8eXOpFpCp0+bb3uUHcfjq7xuIik8DADhZGWN+3yawrSVWBXgeh2aMladjodlbBD9PzoBAAIxsZ4/p3Z1hJNJ68VmNVu5j/lKpFNeuXUPDhg3Vjt+7dw/vvPMOEhMTtS4E05y2/+CpmVlYefwuNl+MgJIAc0MhfPo0QS83aw76jLEKkZgqx5Ijt/DHtZwVY7XEWNzfFZ5OPHlcU28b/LUeOBWLxbhw4UKB4xcuXICBgYHWBWBlSyLUw7e9XLDn8/ZoZGWEuJRMTPo9EGO3X0dsYnpFF48xVgNJJfpY9j837BjTFnZmYjx5mYbRW65i6h9BSEjJrOji1Qhat/x9fX3h4+ODTz75BO3atQOQPea/efNmzJ07FzNnziyTgrJsb/NtLzNLibVnwvHz6XDIFQRjkR5m9WiMwa3teBMOxliFSM3Mwvc5vZOU0zs5v28T9GzKvZPFqZClfn/++Sd+/PFH3Lp1CwDQuHFjfPHFF/jwww+1LgDTTmks9bv7NBlf/x2MoKiXAIB2jmbwHeAGB96EgzFWQQIeJWDG38G49+wVAOC9xlZY1M8VMin3KBeG1/nXMKW1zl+hJGz1i8R3/77ehGOaVyN83IE34WCMVYyMLAXWnr6PtWde905+0zO7d5J7AdRVyuBPRPwPVUZKe4e/R3GpmLUvGBfD4wAAbnWkWDbQDY2teRMOxljFuBObjK/3BONGTu+ku6M5lg5oyr2TeZTLhL/GjRtj165dyMwsfiLGvXv38Pnnn2PZsmVaF4RVjLrmEuwY0xbLB7rB2EAPwY8T0XvNBXx//A4yshQVXTzGWA3kJDPG3s/b49uejWGgrwP/B3Ho/uM5bDz3AFnlsINoTaBR8P/555+xatUqWFlZYdCgQVixYgV27tyJPXv24Ndff8XUqVPRpk0btGjRAlKptEw2+0lISMCIESMglUohlUoxYsQIvHz5sthriAg+Pj6wsbGBWCyGp6cnwsLC1NJkZGRg0qRJsLCwgKGhIfr06YPHjx9rnbdAICjwWrdunVqakJAQeHh4QCwWw9bWFgsWLEBlGHURCAT4sLUdTk71gJeLFbKUhDWnwtFz9QVcfxhf0cVjjNVAujoCfNLREceneKB9fXOky5VYfOQWBv7ih9uxSRVdvKqPtHDx4kWaPHkyNW/enGrVqkUikYhsbW2pV69etGbNGkpISNDmdlrp3r07ubq6kp+fH/n5+ZGrqyv16tWr2Gt8fX3J2NiY9uzZQyEhITRo0CCytrampKQkVZpx48aRra0tnThxggICAqhz587UrFkzysrK0ipvALRlyxaKiYlRvVJTU1XnExMTycrKigYPHkwhISG0Z88eMjY2pu+++06rzyExMZEAUGJiolbXaUqpVNLh4GhqtfA42c84RA4zD9G8f0LpVbq8TPJjjLE3USqVtPvKQ3Kdd4zsZxyi+rMO0/f/3qZ0edabL66m3jYWaBX8K8rNmzcJAF26dEl1zN/fnwDQ7du3C71GqVSSTCYjX19f1bH09HSSSqW0bt06IiJ6+fIl6evr0+7du1Vpnjx5Qjo6OnTs2DGt8gZA+/btK7IOa9euJalUSunp6apjS5cuJRsbG1IqlRp+EmUf/HMlpGTQ1D+CyH7GIbKfcYjaL/2Pzt55VqZ5MsZYcWIT02jstquqv0tdvz9D1yLjK7pYFeJtY0GVmNbt7+8PqVSKtm3bqo61a9cOUqkUfn5+hV4TERGB2NhYeHl5qY6JRCJ4eHiorrl+/TrkcrlaGhsbG7i6uqrSaJP3xIkTYWFhgdatW2PdunVQKl+PTfn7+8PDwwMikUh1zNvbG9HR0YiMjCyy7hkZGUhKSlJ7lYdaEiG+/7AZtn3cBra1sjfhGLn5Cqb9eQMvU3kTDsZY+bMyMcD6Ea2wdlhLWBgJEf7sFf63zg/zD4YhJSOrootXpVSJ4B8bGwtLy4LbPlpaWiI2NrbIawDAyspK7biVlZXqXGxsLIRCIUxNTYtNo0neCxcuxF9//YWTJ09i8ODBmDZtGpYsWaJWnsLKkreshVm6dKlqroFUKoWdnV2RacuCR6PaOP5lJ4xu7wCBANgT8BjvrTyHoyEx5VoOxhgDsuco9WhqjZNTPfC/VnVABGy5GAmvVedw7u7zii5elVGhwd/Hx6fQiXJ5X9euXQOAQpcOkgZLCvOf1+Sa/Gk0yfvbb7+Fu7s7mjdvjmnTpmHBggVYsWLFG8tS1P1zzZo1C4mJiapXVFRUsWUvC4YiPfj0aYK/x7VHA0sjvHiVgc93BuCz367hWRJvEcwYK3+1JEJ890EzbM/XO/nVX9w7qYkKDf4TJ07ErVu3in25urpCJpPh6dOnBa5//vx5gdZ0LplMBqBgq/rZs2eqa2QyGTIzM5GQkFBsGm3zBrKHBpKSklTXymSyQssCFOydyEskEsHExETtVVFa2Zvi8OR3MblLA+jpCPBv2FO8t/Is/rwaVSlWLTDGap5O+Xon/77OvZOaqNDgb2FhAWdn52JfBgYGcHd3R2JiIq5cuaK69vLly0hMTET79u0LvXe9evUgk8lw4sQJ1bHMzEycPXtWdU2rVq2gr6+vliYmJgahoaGqNCXJGwACAwNhYGCAWrVqqe5z7tw5tb0Sjh8/DhsbGzg4OGj+oVUwkZ4upno54eCkd+FWR4qk9Cx8vScYIzZdwaO41IouHmOsBnrdO+mO+rUNVb2T4367zr2TRSnJLMHw8HCaPXs2DR48mJ4+fUpEREePHqXQ0NASzTrURPfu3cnNzY38/f3J39+fmjZtWmC5nZOTE+3du1f1s6+vL0mlUtq7dy+FhITQkCFDCl3qV6dOHTp58iQFBARQly5dCl3qV1zeBw4coA0bNlBISAiFh4fTxo0bycTEhCZPnqxK8/LlS7KysqIhQ4ZQSEgI7d27l0xMTCrdUj9tyLMUtP5sODWafYTsZxwi52+P0sZz9ylLofnqBcYYK03p8iz6/t/bVH/WYbKfcYiazjtGf1x9pNWqqqqg3Jf6nTlzhsRiMb333nskFArp/v37RES0bNkyGjhwYIkKoYm4uDgaNmwYGRsbk7GxMQ0bNqzAvgLIWWufS6lU0rx580gmk5FIJKJOnTpRSEiI2jVpaWk0ceJEMjMzI7FYTL169aJHjx5plffRo0epefPmZGRkRBKJhFxdXemHH34guVx9bXxwcDB17NiRRCIRyWQy8vHx0foXsjIF/1wRz1/RoPV+quU3fX+6QLdjkt58IWOMlZGwJ4nUa/V51d+lYRsv0aO4lIouVql521ig9d7+7u7u+OCDDzB16lQYGxvjxo0bcHR0xNWrV9GvXz88efKkDPonWK7S3tu/tCiVhD+uRWHJ4VtIzsiCvq4AEzo3wHjPBhDqVYlFJYyxaiZLocSmCxFYeeIuMrKUEOvr4itvJ4xu7wDdKv4Y83LZ2z+vkJAQ9O/fv8Dx2rVrIy4uTusCsOpBR0eAIW3q4sRUD7zX2ApyBeGHk/fQe80FBD5KePMNGGOslOnp6uAzj/o4NqUT2tYzQ5pcgYWHbmLgL364+zS5ootXobQO/rVq1UJMTMFZlIGBgbC1tS2VQrGqSyY1wMaRrfDT0BYwNxTiztNkDPjFDwsP3URqJm/CwRgrf/UsDPH72HZY3N8VRiI9BEW9RM/V5/HjyXvIzKqZDwrSOvgPHToUM2bMQGxsLAQCAZRKJS5evIivvvoKI0eOLIsysipGIBCgl5sNTk71wIAWtiACNl2IgPcP53Ax/EVFF48xVgPp6AgwrK09TkzthK7OlpArCKtO3kXvNRcQlPPo4JpE6zF/uVyO0aNHY/fu3SAi6OnpQaFQYOjQodi6dSt0dXXLqqwMlXfMvzin7zzD7L0hiE7MXnLz4Tt1MLuHC6QS/QouGWOsJiIiHAyOgc+BMMSnZEJHAHzcoR6meTlBLKwaMextY4HWwT/X/fv3ERgYCKVSiRYtWqBhw4YluQ3TUlUM/gDwKiMLy4/dxnb/hwCA2sYiLOzriu6usgouGWOspopPycSCg2HYHxQNAKhrJoHvgKZo38Cigkv2ZhUW/FnFqKrBP9fVyHjM2BOMB89TAAA9msrg06cJLI0NKrhkjLGa6vTtZ5i973Xv5ODWdpjVozGk4srbO1kuwX/q1Kka33DlypVaF4JprqoHfwBIlyuw5tQ9rDv7AAolQSrWx5xeLhjY0vaNz11gjLGykJwux/Jjd/DbpezeSUtjERb1c4VXk8rZO1kuwb9z585qP1+/fh0KhQJOTk4AgLt370JXVxetWrXCqVOntC4E01x1CP65wqIT8fXfwQiLzn5McceGFljSvynszCQVXDLGWE11JSIeM/cE48GL7N7Jnm7W8OndBLWNRW+4snyVe7f/ypUrcebMGWzbtk31KNyEhAR89NFH6NixI6ZNm6Z1IZjmqlPwB7I34dh4PgKrTt5FZpYSEqEuvvZ2wgj3qr8JB2OsakqXK7D6v3tYf+517+TcXi4YUIl6J8s9+Nva2uL48eNo0qSJ2vHQ0FB4eXkhOjpa60IwzVW34J/rwfNXmLknBFci4wEALevWwrKBbmhoZVzBJWOM1VShTxIxY8/r3slOjWpjSX9X1DGt+N7Jct/hL+9javN69uwZkpNr9o5JrOQcaxth96ftsLBf9iYcAY9eoufqC1jzX83dhIMxVrFcbaXYP6EDZnR3hlBPB+fuPofXqnPYejECSmXVniuvdct/5MiROHv2LL7//nu0a9cOAHDp0iVMnz4dnTp1wrZt28qkoCxbdW355xX9Mg2z94Xg9J3nAABnmTGW/88NbnVqVWzBGGM11v3nrzArT+9kK3tTLBvYFA0sK6Z3sty7/VNTU/HVV19h8+bNkMvlAAA9PT2MGTMGK1asgKGhodaFYJqrCcEfyN6E48CNaPgcCENCqhw6AuCTjo748r1GVWYTDsZY9aJUEnZeeQTfI7eQkqmAUFcHk7o0wDjP+tDXLd8HmFXYOv+UlBTcv38fRIQGDRpw0C8nNSX454p7lYH5B2/iwI3suST25hL4DnCDe33zCi4ZY6ymepLTO3mmAnsneZOfGqamBf9c/916itn7QhGblL0Jx5A2dTGrhzNMDCrvJhyMseqLiLA/6AkWHLyp6p0c29ERU8qpd7Lcg3/nzp2LXerA6/zLVk0N/gCQlC7HsqO3sfPyIwCAlYkIi/s1xXsuVhVcMsZYTfUip3fyYE7vpIO5BEvLoXey3Gf7N2/eHM2aNVO9XFxckJmZiYCAADRt2lTrAjCmKRMDfSzu3xS7P20HB3MJniZl4JPt1zDp90C8eJVR0cVjjNVAFkYirBnSAr+OfAcyEwNExqViyMZL+GZfCJLS5RVdvCKVWre/j48PXr16he+++640bseKUJNb/nmlyxX44eQ9bDyfvQmHqUQf83o3Qd/mNpVmEw7GWM2SlC6H79Hb2JXTOykzMcCifq5l0jtZacb8w8PD0aZNG8THx5fG7VgROPirC3mciK/3BONWTPYmHJ5OtbG4f1PY1hJXcMkYYzWV//04zNobjMi4VABA72Y28OntAnOj0tsiuNy7/Yvi7+8PA4OyezJbQkICRowYAalUCqlUihEjRuDly5fFXkNE8PHxgY2NDcRiMTw9PREWFqaWJiMjA5MmTYKFhQUMDQ3Rp08fPH78WOu8BQJBgde6detU5yMjIwtNc+zYsbf6XGq6pnWkODCxA6Z7O0Gop4Mzd57Da+VZ/OYfWeU34WCMVU3u9c1xbEonfObhCB0BcPBGNN5beRb7A5+gssyx17rlP2DAALWfiQgxMTG4du0a5syZg3nz5pVqAXO9//77ePz4MTZs2AAA+PTTT+Hg4ICDBw8Wec2yZcuwePFibN26FY0aNcKiRYtw7tw53LlzB8bG2RszfP755zh48CC2bt0Kc3NzTJs2DfHx8bh+/Tp0dXU1zlsgEGDLli3o3r276phUKoVYnN0CjYyMRL169XDy5Em1rZHNzMwgFAo1/hy45V+08GevMHNPMK49TAAAtHYwhe9AN9SvbVTBJWOM1VTBj1/i67+DcTs2ewfczjm9kzZv2TtZ7t3+o0ePVhtT1dHRQe3atdGlSxd4eXlpXQBN3Lp1Cy4uLrh06RLatm0LIHtXQXd3d9y+fVv1dMG8iAg2NjaYMmUKZsyYASC7lW9lZYVly5bhs88+Q2JiImrXro3ffvsNgwYNAgBER0fDzs4OR44cgbe3t8Z5CwQC7Nu3D/369Su0DrnBPzAwEM2bNy/xZ8HBv3hKJWHH5YdYdvR29iYcejr4omtDfNrJsdw34WCMMQCQK5RYf/Y+Vv8XjkyFEkYiPcx43xnD2tSFTgkfYPbWsYCqgE2bNpFUKi1wXCqV0ubNmwu95v79+wSAAgIC1I736dOHRo4cSURE//33HwGg+Ph4tTRubm40d+5crfIGQLa2tmRubk7vvPMO/fLLL6RQKFTnIyIiCADZ2dlR7dq1qX379vTXX3+9se7p6emUmJioekVFRREASkxMfOO1NVlUfAqN3HSZ7GccIvsZh+j9H85RyOOXFV0sxlgNdu9pEg1Ye1H1d+mDX/zo/rPkEt0rMTHxrWKB1k0hR0dHxMXFFTj+8uVLODo6av/tQwOxsbGwtLQscNzS0hKxsbFFXgMAVlbqsyytrKxU52JjYyEUClWPJi4qjSZ5L1y4EH/99RdOnjyJwYMHY9q0aViyZInqvJGREVauXIm///4bR44cQdeuXTFo0CDs2LGj2LovXbpUNddAKpXCzs6u2PQsWx1TCbZ+1BorP2yGWhJ93IxJQt+fL8L36G2kyxUVXTzGWA3UwNIYf33mjvl9mkAi1MWVyHh0//E81p4Jh1xRvg8w0zr4R0ZGQqEo+MczIyMDT5480epePj4+hU6Cy/u6du0aABS6fIuI3risK/95Ta7Jn0aTvL/99lu4u7ujefPmmDZtGhYsWIAVK1aozltYWODLL79EmzZt8M4772DBggUYP348li9fXmxZZs2ahcTERNUrKiqq2PTsNYFAgAEt6+DElx7o6WYNhZKw7ux9vP/jeVx+UPALLGOMlTUdHQFGtXfA8S87oVOj2sjMUmL5sTvo9/NFhD5JLLdy6Gma8MCBA6r3//77L6RSqepnhUKB//77Dw4ODlplPnHiRAwePLjYNA4ODggODi70McLPnz8v0LLPJZPJAGS33K2trVXHnz17prpGJpMhMzMTCQkJaq3/Z8+eoX379qo02uYNAO3atVM9/riodO3atcOvv/5a5D0AQCQSQSQqveUhNVFtYxF+HtoSfZrFYs7+UES8SMGgDZcwvF1dzOjuDGPeIpgxpiWlkpAmVyA1U4G0TAVSMrNU71Nz3qfme5+W73iGXAF9XQHkCkJYdHbv5IYRrdC1cdnvWqpx8M+dyCYQCDBq1Ci1c/r6+nBwcMD333+vVeYWFhawsLB4Yzp3d3ckJibiypUraNOmDQDg8uXLSExMVAXp/OrVqweZTIYTJ06gRYsWAIDMzEycPXsWy5YtAwC0atUK+vr6OHHiBD788EMAQExMDEJDQ1Ut8pLkDQCBgYEwMDBArVq1ik2T94sJK1veTWRo52gO36O38PuVKOy49Aj/3XqGJf2borNzwaEdxljVRkTIyFIWCMKpmVk5AbtgQH4dwPMH7uwAn3surQyGDxVKQnRieqnftzBaz/avV68erl69qlHQLk3vv/8+oqOjsX79egDZy+3s7e3Vlts5Oztj6dKl6N+/P4DspX5Lly7Fli1b0LBhQyxZsgRnzpwpsNTv0KFD2Lp1K8zMzPDVV18hLi6uwFK/4vI+ePAgYmNj4e7uDrFYjNOnT2PatGkYPXo0fvzxRwDAtm3boK+vjxYtWkBHRwcHDx7EN998g2XLluHLL7/U+HPg2f6lwy/8BWbuDcGj+OxNOPo1t8Hc3k1gZqj5skvGWOnIzFK+sfWcJlcgJSNPsJYrkJqRpQrEqZkKpGRkqbXGUzOzUNbbfQgEgFhfFxKhHiRCXUiEuhALdWEo1IM45+fsl57qnERfFxJRnvT6ejAU6cJUIoSdmUSjfN82Fmjc8s8VERGhdSalYefOnZg8ebJqOWGfPn3w008/qaW5c+cOEhNfj5l8/fXXSEtLw/jx45GQkIC2bdvi+PHjqsAPAKtWrYKenh4+/PBDpKWloWvXrti6dasq8GuSt76+PtauXYupU6dCqVTC0dERCxYswIQJE9TKt2jRIjx8+BC6urpo1KgRNm/ejOHDh5feh8Q01r6BBf6d0gkrT9zBpgsR2B8UjXP3XsCnTxP0drPmLYIZyydLoUSqvKhWcfb7vC3pgsG8YMs6tyWdVQ4bcon0dGAo0ssJ1AUDcrHBWqgHwzzv86Yx0Nepkn8vNGr5r169Gp9++ikMDAywevXqYtNOnjy51ArHCuKWf+m7EfUSM/a83oTjvcaWWNjPFdZS3iKYVS1KJSE9K7eFrECqPCdAZ6i3nnO7vfO2ngtrSadmZGUfz1QgM6vsZ6Pr6wrUW9EiXUj0s4OyoSi7hZz3uCpw5zmnlk6Y3cIW6+tCt4Tr6Surctnkp169erh27RrMzc1Rr169om8mEODBgwdaF4JpjoN/2cjMUmLd2ftYc+oe5AqCsUgPM3s4Y0jrkm/CwVhh8o9Dv24V528ZZ+W0pHPHmLNyAvfr97kBPi0zJ+CXwzJWHQHydXHnbQlnB+7slnT+c+rd3oaiPC3tnAAv1OONuDRVaR7sw8oHB/+ydfdpMmbsCUbgo5cAgHaOZvAd4AYHC8OKLRgrd7nj0Lmt57ScMeXiur5TMgsbry54rjweO5F3/Fmir5fdWhYW3kLODdYSta7vwsewRXpVs5u7uin34L9gwQJ89dVXkEjUJyWkpaVhxYoVmDt3rtaFYJrj4F/2FErCNr9IrPj3DtLkCoj0dDC1WyOMebce9HiL4EpFoSS1mdvqLemiZ2oX1nrO3z0uV5TPOHTB1nLBceU3tqTzjVkb6Olyj1U1V+7BX1dXFzExMQV2vYuLi4OlpWWhGwCx0sPBv/xExadi1t4QXAh/AQBoaivFsoFucLHhz10bRJRvBnb+QFx06znv+9dLs15fk1EO49B6OoICATZvoM39WZOJY4b5JpFVt3FoVn7KfbZ/UTvk3bhxA2ZmZloXgLHKys5Mgt/GtMFf1x9j0aGbCHmSiD4/XcDnnvUxsUsDiPR033yTKiJ3HDp3Elhapvr4ct5WcW63d/YYc+FrpPOvhy7rwUWBAOoBOWdMOfd97sQvif7rcersbu/CW9l5Az2PQ7PqSOPgb2pqqtpyt1GjRmpfABQKBV69eoVx48aVSSEZqygCgQAfvmMHT6famPdPGI6GxmLNqXAcCYnBsoFueMehfL/wyhXKIrqx33LZlVwBRTkMRBvo6+RrGatPHHvd7V3cuYJd3zwOzZh2NO7237ZtG4gIH3/8MX744Qe17X2FQiEcHBzg7u5eZgVl2bjbv2IdDYnBnH/C8OJVBgQCYJS7A6Z7O8FQ9Pp7tEK17WdWTmv5dQs5b2s5t/WcO1v7zePUWeUyDi3U1Skw/vymCWH5x58LPafP49CMlZZyH/M/e/Ys2rdvD3193g+9InDwr3iJqXIsOnwTf11/rHbczFCIlIyschmH1tURFAiuqmVX+rqqmd0SoV5OF3iec6q10Xk3PMmZDa6vy5MaGasCKnSpX1paGuRyudoxDkhli4N/5XH+3nOM2HSlyPMCASDRL+E66DdMHBPqcjc3YzVZuU/4S01Nxddff40///wTcXEFH4vKs/1ZTdGxYW38Nc4d688+wOee9WFsoN6SrqrbfjLGqj+tg//06dNx+vRprF27FiNHjsTPP/+MJ0+eYP369fD19S2LMjJWabV2MEPrcp70xxhjb0vr4H/w4EFs374dnp6e+Pjjj9GxY0c0aNAA9vb22LlzJ4YNG1YW5WQ5ckdpkpKSKrgkjDHGKkpuDCjpyL3WwT8+Pl61v7+JiQni4+MBAO+++y4+//zzEhWCaS45OfvhM3Z2dhVcEsYYYxUtOTlZbfWdprQO/o6OjoiMjIS9vT1cXFzw559/ok2bNjh48CBq1aqldQGYdmxsbBAVFQVjY+NCx5OTkpJgZ2eHqKioaj8hkOtaPXFdqyeua+kiIiQnJ8PGxqZE12sd/D/66CPcuHEDHh4emDVrFnr27Ik1a9YgKysLK1euLFEhmOZ0dHRQp06dN6YzMTGp9v/BcnFdqyeua/XEdS09JWnx59I6+H/55Zeq9507d8bt27dx7do11K9fH82aNStxQRhjjDFWPt56N4+6detiwIABMDMzw8cff1waZWKMMcZYGSq1rbzi4+Oxbdu20rodKyGRSIR58+ZBJBJVdFHKHNe1euK6Vk9c18rlrXb4y+vGjRto2bIlb/LDGGOMVXK8iTdjjDFWw3DwZ4wxxmoYjWf7DxgwoNjzL1++fNuyMMYYY6wcaBz837SeUCqVYuTIkW9dIMYYY4yVMWKVSnx8PA0fPpxMTEzIxMSEhg8fTgkJCcVeo1Qqad68eWRtbU0GBgbk4eFBoaGhamnS09Np4sSJZG5uThKJhHr37k1RUVFqaRYtWkTu7u4kFotJKpUWm+eLFy/I1taWALyxfEWpzHV98eIFeXt7k7W1NQmFQqpTpw5NmDCBEhMTq11dg4KCaPDgwVSnTh0yMDAgZ2dn+uGHH0pUz8peVyKiyZMnU8uWLUkoFFKzZs1KXE+iyl/Xhw8fUq9evUgikZC5uTlNmjSJMjIyqlxdNcn75MmT5O7uTkZGRiSTyejrr78muVxeLet65coV6tKlC0mlUqpVqxZ169aNAgMDtaojB/9Kpnv37uTq6kp+fn7k5+dHrq6u1KtXr2Kv8fX1JWNjY9qzZw+FhITQoEGDyNrampKSklRpxo0bR7a2tnTixAkKCAigzp07U7NmzSgrK0uVZu7cubRy5UqaOnXqG4N/37596f3333+r4F+Z6xofH09r166lq1evUmRkJJ08eZKcnJxoyJAh1a6umzZtokmTJtGZM2fo/v379Ntvv5FYLKY1a9ZUu7oSEU2aNIl++uknGjFixFsH/8pc16ysLHJ1daXOnTtTQEAAnThxgmxsbGjixIlVrq5vyvvGjRskFApp/vz5dO/ePTpz5gw5OzvTtGnTql1dk5KSyNTUlEaPHk23b9+m0NBQGjhwIFlaWlJmZqbGdeTgX4ncvHmTANClS5dUx/z9/QkA3b59u9BrlEolyWQy8vX1VR1LT08nqVRK69atIyKily9fkr6+Pu3evVuV5smTJ6Sjo0PHjh0rcM8tW7YUG/zXrl1LHh4e9N9//5U4+FeVuub1448/Up06dTRKm1dVrOv48eOpc+fOGqXNqyrVdd68eW8V/Ct7XY8cOUI6Ojr05MkT1bHff/+dRCKR1j1YFVlXTfKeNWsWvfPOO2r579u3jwwMDNSCb3Wo69WrVwkAPXr0SJUmODiYAFB4eLjG9eTZ/pWIv78/pFIp2rZtqzrWrl07SKVS+Pn5FXpNREQEYmNj4eXlpTomEong4eGhuub69euQy+VqaWxsbODq6lrkfYty8+ZNLFiwANu3b4eOTsl/fapCXfOKjo7G3r174eHhofW1Va2uAJCYmAgzMzOtr6uKdS2pyl5Xf39/uLq6qj34xdvbGxkZGbh+/brG98m9V0XVVZO8MzIyYGBgoJa/WCxGenp6taurk5MTLCwssGnTJmRmZiItLQ2bNm1CkyZNYG9vr3E9OfhXIrGxsbC0tCxw3NLSErGxsUVeAwBWVlZqx62srFTnYmNjIRQKYWpqWmQaTWRkZGDIkCFYsWIF6tatq/F1RZW7Mtc115AhQyCRSGBrawsTExP8+uuvWt+jqtQ1l7+/P/7880989tlnWl9b1er6Nip7XWNjYwvkY2pqCqFQqPVnVpF11SRvb29v+Pn54ffff4dCocCTJ0+waNEiAEBMTIw2Va30dTU2NsaZM2ewY8cOiMViGBkZ4d9//8WRI0egp6f543o4+JcDHx8fCASCYl/Xrl0DgEIf00tEhR7PK/95Ta7RJE1es2bNQuPGjTF8+PAi01SXuuZatWoVAgICsH//fty/fx9Tp05VnatudQWAsLAw9O3bF3PnzkW3bt1Ux6tjXYtSner6pvJVlbq+KW8vLy+sWLEC48aNg0gkQqNGjdCzZ08AgK6ubrWqa1paGj7++GN06NABly5dwsWLF9GkSRP06NEDaWlpxeaVl9ZP9WPamzhxIgYPHlxsGgcHBwQHB+Pp06cFzj1//rzAN8pcMpkMQPY3Rmtra9XxZ8+eqa6RyWTIzMxEQkKC2rfOZ8+eoX379hrX49SpUwgJCcHff/8NIPsXEgAsLCwwe/ZszJ8/v9rUNW+eMpkMzs7OMDc3R8eOHTFnzhxYW1tXu7revHkTXbp0wdixY/Htt9+qnatudS1OdamrTCbD5cuX1Y4lJCRALper8qoKdZXJZBrlPXXqVHz55ZeIiYmBqakpIiMjMWvWLNSrV69a1XXXrl2IjIyEv7+/auh1165dMDU1xT///PPGOqpoPDuAlbncyR6XL19WHbt06ZJGE02WLVumOpaRkVHoRJM//vhDlSY6OlrrCUTh4eEUEhKiem3evJkAkJ+fHz19+rRa1bUw586dIwAUERGhUfpcVaGuoaGhZGlpSdOnT9eqbvlVhbrmKq0Jf5W1rrkT/qKjo1XHdu/e/VYT/iqiriXJm4hozpw5ZGdnpzaTvjrUdfXq1SSTyUipVKrSyOVyMjQ0pJ07d2pcTw7+lUz37t3Jzc2N/P39yd/fn5o2bVpgiYmTkxPt3btX9bOvry9JpVLau3cvhYSE0JAhQwpdYlKnTh06efIkBQQEUJcuXQosMXn48CEFBgbS/PnzycjIiAIDAykwMJCSk5MLLevp06ffeqlfZa3r4cOHafPmzRQSEkIRERF0+PBhatKkCXXo0KHa1TU0NJRq165Nw4YNo5iYGNXr2bNn1a6uRET37t2jwMBA+uyzz6hRo0aqNCVZ/16Z65q71K9r164UEBBAJ0+epDp16rzVUr+KqqsmeS9fvpyCg4MpNDSUFixYQPr6+rRv375qV9dbt26RSCSizz//nG7evEmhoaE0fPhwkkqlal/03oSDfyUTFxdHw4YNI2NjYzI2NqZhw4YVCK4AaMuWLaqfczeXkMlkJBKJqFOnThQSEqJ2TVpaGk2cOJHMzMxILBZTr1691JaKEBGNGjWKABR4nT59utCyvm3wr8x1PXXqFLm7u5NUKiUDAwNq2LAhzZgxo1rWdd68eYWet7e3r3Z1JSLy8PAoNI22PTpVoa4PHz6knj17klgsJjMzM5o4cSKlp6drXc+KrqsmeXfu3Fn1/7Vt27Z05MiREtWzKtT1+PHj1KFDB5JKpWRqakpdunQhf39/repYao/0ZYwxxljVwLP9GWOMsRqGgz9jjDFWw3DwZ4wxxmoYDv6MMcZYDcPBnzHGGKthOPgzxhhjNQwHf8YYY6yG4eDPGGOsylm8eDHat28PiUSCWrVqaXRNUQ/0WbFiBQAgPj4ekyZNgpOTEyQSCerWrYvJkycjMTFRq7xv3LiBIUOGwM7ODmKxGI0bN8aPP/6oVf3kcjlmzJiBpk2bwtDQEDY2Nhg5ciSio6O1uk9ROPgzxspUZGQkBAIBgoKCyuT+AoEA+/fvf+v7zJkzB59++mmxaTw9PTFlypS3ziuvn376CX369CnVe9YEmZmZ+OCDD/D5559rfE1MTIzaa/PmzRAIBBg4cCAAIDo6GtHR0fjuu+8QEhKCrVu34tixYxgzZoxWeV+/fh21a9fGjh07EBYWhtmzZ2PWrFn46aefNC5ramoqAgICMGfOHAQEBGDv3r24e/du6f2uaLUfIGOsShk1ahT17du3QsuQlZVFMTExJJfLiejtt4XOD0CJ93DPFRsbS8bGxm/c4tfDw4O++OKLt8orv/T0dJLJZHT+/PlSvW9Noc3DufLr27cvdenSpdg0f/75JwmFQtXvb0nzHj9+PHXu3Fnt2MWLF6ljx45kYGBAderUoUmTJtGrV6+KvMeVK1cIAD18+FCjPIvDLX/GWJnS1dWFTCaDnl7lfYL4pk2b4O7uDgcHh3LPWyQSYejQoVizZk25512TPX36FIcPHy7Qqs8vMTERJiYmb/37m5iYCDMzM9XPISEh8Pb2xoABAxAcHIw//vgDFy5cwMSJE4u9h0Ag0HiYozgc/Bmrwc6ePYs2bdpAJBLB2toaM2fORFZWluq8p6cnJk+ejK+//hpmZmaQyWTw8fFRu8ft27fx7rvvwsDAAC4uLjh58qRaV3zebv/IyEh07twZAGBqagqBQIDRo0cDyH6W+g8//KB27+bNm6vld+/ePXTq1EmV14kTJwrU6cmTJxg0aBBMTU1hbm6Ovn37IjIystjPYffu3QW6U1NSUjBy5EgYGRnB2toa33//fYHrMjMz8fXXX8PW1haGhoZo27Ytzpw5o5Zm48aNsLOzg0QiQf/+/bFy5coCf7z79OmD/fv3Iy0trdhystKzbds2GBsbY8CAAUWmiYuLw8KFC/HZZ5+9VV7+/v74888/1e6zYsUKDB06FFOmTEHDhg3Rvn17rF69Gtu3b0d6enqBe6Snp2PmzJkYOnQoTExM3qo8AAd/xmqsJ0+eoEePHmjdujVu3LiBX375BZs2bcKiRYvU0m3btg2Ghoa4fPkyli9fjgULFqiCrlKpRL9+/SCRSHD58mVs2LABs2fPLjJPOzs77NmzBwBw584dxMTEaDwRSqlUYsCAAdDV1cWlS5ewbt06zJgxQy1NamoqOnfuDCMjI5w7dw4XLlyAkZERunfvjszMzELvm5CQgNDQULzzzjtqx6dPn47Tp09j3759OH78OM6cOYPr16+rpfnoo49w8eJF7N69G8HBwfjggw/QvXt33Lt3DwBw8eJFjBs3Dl988QWCgoLQrVs3LF68uEAZ3nnnHcjlcly5ckWjz6K68vHxKXJSXu7r2rVrpZLX5s2bMWzYMBgYGBR6PikpCT179oSLiwvmzZtX4nzCwsLQt29fzJ07F926dVMdv379OrZu3QojIyPVy9vbG0qlEhEREWr3kMvlGDx4MJRKJdauXVvisqh564EDxlilVdyY/zfffENOTk6kVCpVx37++WcyMjIihUJBRNlj3O+++67ada1bt6YZM2YQEdHRo0dJT0+PYmJiVOdPnDihNg4fERFBACgwMJCIih7zt7e3p1WrVqkda9asGc2bN4+IiP7991/S1dWlqKgo1fmjR4+q5bVp06YCdcrIyCCxWEz//vtvoZ9DYGAgAVB7tGpycjIJhULavXu36lhcXByJxWLVmH94eDgJBAJ68uSJ2v26du1Ks2bNIiKiQYMGUc+ePdXODxs2rNBxYlNTU9q6dWuhZawpnj9/Trdu3Sr2lZaWpnZNScb8z507RwAoKCio0PNJSUnk7u5OXbt2LZCfNnmHhYWRpaUlffPNNwXOOTs706RJk+jevXsFXhkZGap0mZmZ1K9fP3Jzc6MXL15oXsk3qLyDcIyxMnXr1i24u7tDIBCojnXo0AGvXr3C48ePUbduXQCAm5ub2nXW1tZ49uwZgOzWu52dHWQymep8mzZtyqy8devWRZ06dVTH3N3d1dJcv34d4eHhMDY2Vjuenp6O+/fvF3rf3K72vC3A+/fvIzMzU+3+ZmZmcHJyUv0cEBAAIkKjRo3U7peRkQFzc3MA2Z9P//791c63adMGhw4dKlAOsViM1NTUQstYU1hYWMDCwqLM89m0aRNatWqFZs2aFTiXlJQEb29viEQiHDhwoMiegTcJCwtDly5dMGrUqEJ7e1q2bImwsDA0aNCgyHvI5XJ8+OGHuHfvHk6fPq36vSoNHPwZq6GISC3w5x4DoHZcX19fLY1AIIBSqSzyHiWlo6Ojyj+XXC4vULb8ZclLqVSiVatW2LlzZ4G0tWvXLjTf3GCTkJCgSlNYXvkplUro6uri+vXr0NXVVTtnZGSkuk9Rn3F+8fHxRZaRFfTo0SPEx8fj0aNHUCgUqqWkDRo0UH3+zs7OWLp0qdoXsKSkJPz111+FzuFITk6Gl5cXUlNTsWPHDiQlJSEpKQlA9u9P7r/zm/IOCwtD586d4eXlhalTpyI2NhZA9uTX3H/jGTNmoF27dpgwYQLGjh0LQ0ND3Lp1CydOnMCaNWuQlZWF//3vfwgICMChQ4egUChU9zEzM4NQKHyrz4+DP2M1lIuLC/bs2aMWoPz8/GBsbAxbW1uN7uHs7IxHjx7h6dOnsLKyAgBcvXq12Gty/2gpFAq147Vr10ZMTIzq56SkJLWxTxcXFzx69AjR0dGwsbEBkD2RKq+WLVvijz/+gKWlpcaTourXrw8TExPcvHlT1Ypv0KAB9PX1cenSJVUPSEJCAu7evQsPDw8AQIsWLaBQKPDs2TN07Nix0Hs7OzsXGMcvbMz6/v37SE9PR4sWLTQqMwPmzp2Lbdu2qX7O/exOnz4NT09PANk9L/k36Nm9ezeICEOGDClwz+vXr+Py5csAUKBFHhERoVoN8qa8//rrLzx//hw7d+5U+yJqb2+vmnzq5uaGs2fPYvbs2ejYsSOICPXr18egQYMAAI8fP8aBAwcAZE98zStvHUus1AYQGGOVzqhRo8jT05MCAwPVXg8fPqTHjx+TRCKhCRMm0K1bt2j//v1kYWGhGmMnKnxde9++fWnUqFFElL2G38nJiby9venGjRt04cIFatu2LQGg/fv3E1HBMf/Hjx+TQCCgrVu30rNnzyg5OZmIiGbOnEkymYzOnTtHISEh1K9fPzIyMlKVR6FQkIuLC3Xt2pWCgoLo3Llz1KpVK7Ux/5SUFGrYsCF5enrSuXPn6MGDB3TmzBmaPHmy2lyB/AYMGEDTpk1TOzZu3DiqW7cunTx5kkJCQqhPnz5kZGSk9nkMGzaMHBwcaM+ePfTgwQO6cuUK+fr60uHDh4mI6MKFC6Sjo0Pff/893b17l9atW0fm5uZUq1Yttby2bNlCjo6Ob/rnZKzUcPBnrBobNWoUASjwyg3eZ86codatW5NQKCSZTEYzZsxQ28zkTcGfiOjWrVvUoUMHEgqF5OzsTAcPHiQAdOzYMSIqGPyJiBYsWEAymYwEAoHqXomJifThhx+SiYkJ2dnZ0datW9Um/BER3blzh959910SCoXUqFEjOnbsWIFNfmJiYmjkyJFkYWFBIpGIHB0daezYsZSYmFjk53Ts2DGytbVVTXQkyp70N3z4cJJIJGRlZUXLly8v8HlkZmbS3LlzycHBgfT19Ukmk1H//v0pODhYlWbDhg1ka2tLYrGY+vXrR4sWLSKZTKaWv5eXFy1durTI8jFW2gREGgxuMcaYhi5evIh3330X4eHhqF+/fkUXRyNEhHbt2mHKlCmFdgeXprFjx+L27ds4f/48ACA0NBRdu3bF3bt3IZVKyzRvxnLxmD9j7K3s27cPRkZGaNiwIcLDw/HFF1+gQ4cOVSbwA9kTBzds2IDg4OBSv/d3332Hbt26wdDQEEePHsW2bdvU1mpHR0dj+/btHPhZueKWP2PsrWzfvh0LFy5EVFQULCws8N577+H7778v1WVJVdmHH36IM2fOIDk5GY6Ojpg0aRLGjRtX0cViNRwHf8YYY6yG4e19GWOMsRqGgz9jjDFWw3DwZ4wxxmoYDv6MMcZYDcPBnzHGGKthOPgzxhhjNQwHf8YYY6yG4eDPGGOM1TD/ByVguQ4/0ZpGAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Print selected values from ISD\n", + "print_stats(isd_dict_mod['naif_keywords'], ('ccd_center', 'ifov'))\n", + "\n", + "# Create Camera Model\n", + "camera = csm.create_csm(isd_file_mod)\n", + "\n", + "# Get the footprint using the model\n", + "boundary = csm.generate_boundary((isd_dict_mod[\"image_lines\"], isd_dict_mod[\"image_samples\"]))\n", + "lons, lats, alts = csm.generate_latlon_boundary(camera, boundary)\n", + "\n", + "# Plot it\n", + "plot_footprint(lons, lats, [5,1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "knoten", + "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.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From db0baf557d04ddbdb1cee84a5781f27d89577789 Mon Sep 17 00:00:00 2001 From: Jacob Cain Date: Wed, 26 Feb 2025 14:11:42 -0800 Subject: [PATCH 2/6] using non-naif values, added test slider --- .../csm-stack/csm-sandbox.ipynb | 132 ++++++++++-------- 1 file changed, 72 insertions(+), 60 deletions(-) diff --git a/docs/getting-started/csm-stack/csm-sandbox.ipynb b/docs/getting-started/csm-stack/csm-sandbox.ipynb index 8b39bae3..e3b82750 100644 --- a/docs/getting-started/csm-stack/csm-sandbox.ipynb +++ b/docs/getting-started/csm-stack/csm-sandbox.ipynb @@ -14,9 +14,9 @@ "`conda install -c conda-forge knoten=0.4`\n", "\n", "### Install Matplotlib\n", - "This tutorial requires matplotlib.\n", + "This tutorial requires matplotlib, ipywidgets, and ipympl.\n", "\n", - "`conda install -c conda-forge matplotlib`" + "`conda install -c conda-forge matplotlib ipywidgets ipympl`" ] }, { @@ -28,10 +28,11 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ + "# %matplotlib widget\n", "import os # File Path Joining\n", "import json # Read ISD as python dictionary\n", "import copy # Important to be able to modify the ISD\n", @@ -40,7 +41,8 @@ "\n", "import shapely.wkt # Math and Plotting Tools\n", "import numpy as np\n", - "import matplotlib.pyplot as plt" + "import matplotlib.pyplot as plt\n", + "import ipywidgets as widgets" ] }, { @@ -52,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -82,12 +84,28 @@ " print(f\"{full_key+\": \":<25}\" + str(dict[full_key]))\n", "\n", "def plot_footprint(lons, lats, aspect):\n", + " plt.close()\n", " plt.rcParams[\"figure.figsize\"] = aspect\n", " plt.axes().set_aspect('equal','datalim')\n", " plt.plot(lons, lats)\n", " plt.xlabel(\"Longitude (deg)\")\n", " plt.ylabel(\"Latitude (deg)\")\n", - " plt.title(\"CSM footprint\")" + " plt.title(\"CSM footprint\")\n", + " plt.show()\n", + "\n", + "def plot_footprint_comparison(fp1, fp2, aspect):\n", + " plt.close()\n", + " plt.rcParams[\"figure.figsize\"] = aspect\n", + " plt.axes().set_aspect('equal','datalim')\n", + " fp1_plot, = plt.plot(fp1[0], fp1[1], 'b')\n", + " fp2_plot, = plt.plot(fp2[0], fp2[1], 'r')\n", + " plt.title(\"Original vs. Modified Footprint\")\n", + " plt.xlabel(\"Longitude (deg)\")\n", + " plt.ylabel(\"Latitude (deg)\")\n", + " fp1_plot.set_label(fp1[2])\n", + " fp2_plot.set_label(fp2[2])\n", + " plt.legend()\n", + " plt.show()" ] }, { @@ -99,15 +117,16 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "INS-74021_CCD_CENTER: [2500.5, 0.5]\n", - "INS-74021_IFOV: [2e-05, 2e-05]\n" + "focal_length_model: {'focal_length': 352.9271664}\n", + "detector_center: {'line': 0.430442527, 'sample': 2542.96099}\n", + "optical_distortion: {'radial': {'coefficients': [-0.0073433925920054505, 2.8375878636241697e-05, 1.2841989124027099e-08]}}\n" ] }, { @@ -127,7 +146,7 @@ " isd_dict = json.load(json_file)\n", "\n", "# Print selected values from ISD\n", - "print_stats(isd_dict['naif_keywords'], ('ccd_center', 'ifov'))\n", + "print_stats(isd_dict, ('focal_length_model', 'detector_center', 'optical_distortion'))\n", "\n", "# Create Camera Model\n", "camera = csm.create_csm(isd_file)\n", @@ -149,51 +168,18 @@ }, { "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [], - "source": [ - "# New values\n", - "\n", - "new_ccd_center = [1250.5, 1] # Original = [2500.5, 0.5]\n", - "new_ifov = [.00002, .00002] # Original = [.00002, .00002]\n", - "\n", - "\n", - "# Create new ISD Dictionary and modify values\n", - "\n", - "isd_dict_mod = copy.deepcopy(isd_dict)\n", - "\n", - "ccd_center_key = full_keys(isd_dict['naif_keywords'], 'ccd_center')[0]\n", - "isd_dict_mod['naif_keywords'][ccd_center_key] = new_ccd_center\n", - "\n", - "ifov_key = full_keys(isd_dict['naif_keywords'], 'ifov')[0]\n", - "isd_dict_mod['naif_keywords'][ifov_key] = new_ifov\n", - "\n", - "# Write ISD to file\n", - "isd_file_mod = os.path.join(data_dir, 'isd_file_mod.json')\n", - "\n", - "with open(isd_file_mod, 'w') as json_file:\n", - " json.dump(isd_dict_mod, json_file, indent=4)" - ] - }, - { - "cell_type": "code", - "execution_count": 58, + "execution_count": 10, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INS-74021_CCD_CENTER: [1250.5, 1]\n", - "INS-74021_IFOV: [2e-05, 2e-05]\n" - ] - }, { "data": { - "image/png": "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", + "application/vnd.jupyter.widget-view+json": { + "model_id": "497f0a7ec5ad4d9dbc508f5c2dae97bd", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - "
" + "interactive(children=(FloatSlider(value=0.0, description='focal_length_add', max=0.5, min=-0.5, step=0.005), O…" ] }, "metadata": {}, @@ -201,18 +187,44 @@ } ], "source": [ - "# Print selected values from ISD\n", - "print_stats(isd_dict_mod['naif_keywords'], ('ccd_center', 'ifov'))\n", "\n", - "# Create Camera Model\n", - "camera = csm.create_csm(isd_file_mod)\n", + "@widgets.interact(focal_length_add=(-0.5, .5, 0.005))\n", + "def exec_widget_function(focal_length_add):\n", + " # Original Values:\n", + " # 'focal_length_model': {'focal_length': 352.9271664},\n", + " # 'detector_center': {'line': 0.430442527, 'sample': 2542.96099},\n", + " # 'optical_distortion': {'radial': {'coefficients': [-0.0073433925920054505, 2.8375878636241697e-05, 1.2841989124027099e-08]}}\n", "\n", - "# Get the footprint using the model\n", - "boundary = csm.generate_boundary((isd_dict_mod[\"image_lines\"], isd_dict_mod[\"image_samples\"]))\n", - "lons, lats, alts = csm.generate_latlon_boundary(camera, boundary)\n", + " new_values = {\n", + " 'focal_length_model': {'focal_length': 352.9271664 + focal_length_add},\n", + " 'detector_center': {'line': 0.430442527, 'sample': 2542.96099},\n", + " 'optical_distortion': {'radial': {'coefficients': [-0.007343, 2.838e-05, 1.284e-08]}}}\n", "\n", - "# Plot it\n", - "plot_footprint(lons, lats, [5,1])" + " # Ranges:\n", + " # focal_length: 0-1\n", + " # detector_center line: 0-50000\n", + " # detector_center sample: 0-50000\n", + " # optical_distortion: \n", + "\n", + " # Create new ISD Dictionary and modify values\n", + " isd_dict_mod = copy.deepcopy(isd_dict)\n", + " for key,value in new_values.items(): \n", + " isd_dict_mod[key] = new_values[key]\n", + "\n", + " # Write ISD to file\n", + " isd_file_mod = os.path.join(data_dir, 'isd_file_mod.json')\n", + " with open(isd_file_mod, 'w') as json_file:\n", + " json.dump(isd_dict_mod, json_file, indent=4)\n", + "\n", + " # Create Camera Model\n", + " camera = csm.create_csm(isd_file_mod)\n", + "\n", + " # Get the footprint using the model\n", + " boundary_mod = csm.generate_boundary((isd_dict_mod[\"image_lines\"], isd_dict_mod[\"image_samples\"]))\n", + " lons_mod, lats_mod, alts_mod = csm.generate_latlon_boundary(camera, boundary_mod)\n", + "\n", + " # Plot it\n", + " plot_footprint_comparison((lons, lats, \"Original\"),(lons_mod, lats_mod, \"Modified\"), [5,2])" ] }, { From 2c422a36bfe177df28bf318a9719b7bb3a93744d Mon Sep 17 00:00:00 2001 From: Jacob Cain Date: Wed, 26 Feb 2025 16:17:59 -0800 Subject: [PATCH 3/6] better sliders, optical distortion x y z --- .../csm-stack/csm-sandbox.ipynb | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/docs/getting-started/csm-stack/csm-sandbox.ipynb b/docs/getting-started/csm-stack/csm-sandbox.ipynb index e3b82750..3104c5ca 100644 --- a/docs/getting-started/csm-stack/csm-sandbox.ipynb +++ b/docs/getting-started/csm-stack/csm-sandbox.ipynb @@ -28,11 +28,11 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "# %matplotlib widget\n", + "%matplotlib widget\n", "import os # File Path Joining\n", "import json # Read ISD as python dictionary\n", "import copy # Important to be able to modify the ISD\n", @@ -42,7 +42,8 @@ "import shapely.wkt # Math and Plotting Tools\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", - "import ipywidgets as widgets" + "import ipywidgets as widgets\n", + "from ipywidgets import Layout as css" ] }, { @@ -94,10 +95,18 @@ " plt.show()\n", "\n", "def plot_footprint_comparison(fp1, fp2, aspect):\n", - " plt.close()\n", + " plt.clf()\n", " plt.rcParams[\"figure.figsize\"] = aspect\n", " plt.axes().set_aspect('equal','datalim')\n", " fp1_plot, = plt.plot(fp1[0], fp1[1], 'b')\n", + " \n", + " # boundaries centered on footprint 1\n", + " margin = 0.001\n", + " fp1_lim_x = plt.xlim()\n", + " fp1_lim_y = plt.ylim()\n", + " fp1_lim_x = (fp1_lim_x[0] - margin, fp1_lim_x[1] + margin)\n", + " fp1_lim_y = (fp1_lim_y[0] - margin, fp1_lim_y[1] + margin)\n", + "\n", " fp2_plot, = plt.plot(fp2[0], fp2[1], 'r')\n", " plt.title(\"Original vs. Modified Footprint\")\n", " plt.xlabel(\"Longitude (deg)\")\n", @@ -105,6 +114,8 @@ " fp1_plot.set_label(fp1[2])\n", " fp2_plot.set_label(fp2[2])\n", " plt.legend()\n", + " plt.xlim(fp1_lim_x)\n", + " plt.ylim(fp1_lim_y)\n", " plt.show()" ] }, @@ -168,18 +179,18 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "497f0a7ec5ad4d9dbc508f5c2dae97bd", + "model_id": "e2274228c2d34a618445f3fdbe2758da", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='focal_length_add', max=0.5, min=-0.5, step=0.005), O…" + "interactive(children=(FloatSlider(value=0.0, description='Focal Length', layout=Layout(width='600px'), max=0.2…" ] }, "metadata": {}, @@ -188,23 +199,25 @@ ], "source": [ "\n", - "@widgets.interact(focal_length_add=(-0.5, .5, 0.005))\n", - "def exec_widget_function(focal_length_add):\n", - " # Original Values:\n", - " # 'focal_length_model': {'focal_length': 352.9271664},\n", - " # 'detector_center': {'line': 0.430442527, 'sample': 2542.96099},\n", - " # 'optical_distortion': {'radial': {'coefficients': [-0.0073433925920054505, 2.8375878636241697e-05, 1.2841989124027099e-08]}}\n", + "plt.close()\n", "\n", - " new_values = {\n", - " 'focal_length_model': {'focal_length': 352.9271664 + focal_length_add},\n", - " 'detector_center': {'line': 0.430442527, 'sample': 2542.96099},\n", - " 'optical_distortion': {'radial': {'coefficients': [-0.007343, 2.838e-05, 1.284e-08]}}}\n", + "wide_lay = css(width='600px')\n", + "wide_desc = {'description_width': '150px'}\n", "\n", - " # Ranges:\n", - " # focal_length: 0-1\n", - " # detector_center line: 0-50000\n", - " # detector_center sample: 0-50000\n", - " # optical_distortion: \n", + "@widgets.interact(\n", + " fl_add=widgets.FloatSlider(min=-0.25, max=.25, step=0.001, description='Focal Length', layout=wide_lay, style=wide_desc), \n", + " dcl_add=widgets.FloatSlider(min=-4, max=4, step=0.05, description='Detector Center Line', layout=wide_lay, style=wide_desc),\n", + " dcs_add=widgets.FloatSlider(min=-2.5, max=2.5, step=0.02, description='Detector Center Sample', layout=wide_lay, style=wide_desc),\n", + " opt_x=widgets.FloatSlider(min=-0.001, max=0.001, step=0.00001, description='Optical Distortion X', layout=wide_lay, style=wide_desc, readout_format='.5f'),\n", + " opt_y=widgets.FloatSlider(min=-2e-6, max=2e-6, step=2e-8, description='Optical Distortion Y', layout=wide_lay, style=wide_desc, readout_format='.8f'),\n", + " opt_z=widgets.FloatSlider(min=-1e-8, max=1e-8, step=1e-10, description='Optical Distortion Z', layout=wide_lay, style=wide_desc, readout_format='.10f')\n", + " )\n", + "def exec_widget_function(fl_add, dcl_add, dcs_add, opt_x, opt_y, opt_z):\n", + "\n", + " new_values = {\n", + " 'focal_length_model': {'focal_length': 352.9271664 + fl_add},\n", + " 'detector_center': {'line': 0.430442527 + dcl_add, 'sample': 2542.96099 + dcs_add},\n", + " 'optical_distortion': {'radial': {'coefficients': [-0.007343 + opt_x, 2.838e-05 + opt_y, 1.284e-08 + opt_z]}}}\n", "\n", " # Create new ISD Dictionary and modify values\n", " isd_dict_mod = copy.deepcopy(isd_dict)\n", @@ -216,6 +229,8 @@ " with open(isd_file_mod, 'w') as json_file:\n", " json.dump(isd_dict_mod, json_file, indent=4)\n", "\n", + " print_stats(isd_dict_mod, ('focal_length_model', 'detector_center', 'optical_distortion'))\n", + "\n", " # Create Camera Model\n", " camera = csm.create_csm(isd_file_mod)\n", "\n", @@ -224,7 +239,7 @@ " lons_mod, lats_mod, alts_mod = csm.generate_latlon_boundary(camera, boundary_mod)\n", "\n", " # Plot it\n", - " plot_footprint_comparison((lons, lats, \"Original\"),(lons_mod, lats_mod, \"Modified\"), [5,2])" + " plot_footprint_comparison((lons, lats, \"Original\"),(lons_mod, lats_mod, \"Modified\"), [7,3])" ] }, { From 732802d980741a2d5593abcc88e15c44f0fa3454 Mon Sep 17 00:00:00 2001 From: Jacob Cain Date: Thu, 27 Feb 2025 15:49:31 -0800 Subject: [PATCH 4/6] Exposure Ephem Center Time, sci notation sliders --- .../csm-stack/csm-sandbox.ipynb | 137 ++++++++---------- 1 file changed, 60 insertions(+), 77 deletions(-) diff --git a/docs/getting-started/csm-stack/csm-sandbox.ipynb b/docs/getting-started/csm-stack/csm-sandbox.ipynb index 3104c5ca..c688a871 100644 --- a/docs/getting-started/csm-stack/csm-sandbox.ipynb +++ b/docs/getting-started/csm-stack/csm-sandbox.ipynb @@ -28,39 +28,20 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib widget\n", - "import os # File Path Joining\n", - "import json # Read ISD as python dictionary\n", - "import copy # Important to be able to modify the ISD\n", + "import os # File Path Joining\n", + "import json # Read ISD as python dictionary\n", + "import copy # Important to be able to modify the ISD\n", "\n", - "from knoten import csm # Knoten CSM\n", + "from knoten import csm # Knoten CSM\n", "\n", - "import shapely.wkt # Math and Plotting Tools\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", + "import matplotlib.pyplot as plt # Math and Plotting Tools\n", "import ipywidgets as widgets\n", - "from ipywidgets import Layout as css" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create CSM Camera from existing ISD" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data_dir = '../data/image_to_ground'\n", - "isd_file = os.path.join(data_dir, 'isd_file.json')" + "from ipywidgets import Layout" ] }, { @@ -72,17 +53,13 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "def full_keys(dict, partial_key):\n", - " return [key for key,value in dict.items() if partial_key in key.lower()]\n", - "\n", "def print_stats(dict, search_keys):\n", " for search_key in search_keys:\n", - " full_key = full_keys(dict, search_key)[0]\n", - " print(f\"{full_key+\": \":<25}\" + str(dict[full_key]))\n", + " print(f\"{search_key+\": \":<25}\" + str(dict[search_key]))\n", "\n", "def plot_footprint(lons, lats, aspect):\n", " plt.close()\n", @@ -95,28 +72,27 @@ " plt.show()\n", "\n", "def plot_footprint_comparison(fp1, fp2, aspect):\n", - " plt.clf()\n", - " plt.rcParams[\"figure.figsize\"] = aspect\n", - " plt.axes().set_aspect('equal','datalim')\n", - " fp1_plot, = plt.plot(fp1[0], fp1[1], 'b')\n", - " \n", - " # boundaries centered on footprint 1\n", - " margin = 0.001\n", + " plt.clf() # clear previous figure\n", + " plt.rcParams[\"figure.figsize\"] = aspect # set aspect ratio of plot\n", + " plt.axes().set_aspect('equal','datalim') \n", + " fp1_plot, = plt.plot(fp1[0], fp1[1], 'b') # Plot footprint 1 in blue\n", + "\n", + " margin = 0.001 # boundaries centered on footprint 1\n", " fp1_lim_x = plt.xlim()\n", " fp1_lim_y = plt.ylim()\n", " fp1_lim_x = (fp1_lim_x[0] - margin, fp1_lim_x[1] + margin)\n", " fp1_lim_y = (fp1_lim_y[0] - margin, fp1_lim_y[1] + margin)\n", "\n", - " fp2_plot, = plt.plot(fp2[0], fp2[1], 'r')\n", - " plt.title(\"Original vs. Modified Footprint\")\n", + " fp2_plot, = plt.plot(fp2[0], fp2[1], 'r') # Plot footprint 2 in red\n", + " plt.title(\"Original vs. Modified Footprint\") # Title and axis labels\n", " plt.xlabel(\"Longitude (deg)\")\n", " plt.ylabel(\"Latitude (deg)\")\n", - " fp1_plot.set_label(fp1[2])\n", + " fp1_plot.set_label(fp1[2]) # Labels/Legend\n", " fp2_plot.set_label(fp2[2])\n", " plt.legend()\n", - " plt.xlim(fp1_lim_x)\n", + " plt.xlim(fp1_lim_x) # Set Size\n", " plt.ylim(fp1_lim_y)\n", - " plt.show()" + " plt.show() # Show plot" ] }, { @@ -128,7 +104,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -137,27 +113,21 @@ "text": [ "focal_length_model: {'focal_length': 352.9271664}\n", "detector_center: {'line': 0.430442527, 'sample': 2542.96099}\n", - "optical_distortion: {'radial': {'coefficients': [-0.0073433925920054505, 2.8375878636241697e-05, 1.2841989124027099e-08]}}\n" + "optical_distortion: {'radial': {'coefficients': [-0.0073433925920054505, 2.8375878636241697e-05, 1.2841989124027099e-08]}}\n", + "center_ephemeris_time: 297088762.2425226\n" ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ "# Load Dict from JSON-style ISD File\n", + "data_dir = '../data/image_to_ground'\n", + "isd_file = os.path.join(data_dir, 'isd_file.json')\n", + "\n", "with open(isd_file) as json_file:\n", " isd_dict = json.load(json_file)\n", "\n", "# Print selected values from ISD\n", - "print_stats(isd_dict, ('focal_length_model', 'detector_center', 'optical_distortion'))\n", + "print_stats(isd_dict, ('focal_length_model', 'detector_center', 'optical_distortion', 'center_ephemeris_time'))\n", "\n", "# Create Camera Model\n", "camera = csm.create_csm(isd_file)\n", @@ -166,8 +136,8 @@ "boundary = csm.generate_boundary((isd_dict[\"image_lines\"], isd_dict[\"image_samples\"]))\n", "lons, lats, alts = csm.generate_latlon_boundary(camera, boundary)\n", "\n", - "# Plot it\n", - "plot_footprint(lons, lats, [5,1])" + "# # This line can plot the footprint of the original ISD\n", + "# plot_footprint(lons, lats, [5,1])" ] }, { @@ -182,10 +152,17 @@ "execution_count": null, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adjust Sliders to add or subtract from the values at the following ISD Keys:\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e2274228c2d34a618445f3fdbe2758da", + "model_id": "99f757a292504ab19d2b8db31cbd9cd3", "version_major": 2, "version_minor": 0 }, @@ -198,29 +175,42 @@ } ], "source": [ - "\n", + "# clear the plot from any previous footprints/plots\n", "plt.close()\n", "\n", - "wide_lay = css(width='600px')\n", - "wide_desc = {'description_width': '150px'}\n", + "# Copy the ISD Dictionary, we will modify it and compare to the original.\n", + "isd_dict_mod = copy.deepcopy(isd_dict)\n", "\n", + "print('Adjust Sliders to add or subtract from the values at the following ISD Keys:')\n", + "\n", + "# Slider Widgets\n", + "wide_lay = Layout(width='600px')\n", + "wide_desc = {'description_width': '150px'}\n", "@widgets.interact(\n", " fl_add=widgets.FloatSlider(min=-0.25, max=.25, step=0.001, description='Focal Length', layout=wide_lay, style=wide_desc), \n", " dcl_add=widgets.FloatSlider(min=-4, max=4, step=0.05, description='Detector Center Line', layout=wide_lay, style=wide_desc),\n", " dcs_add=widgets.FloatSlider(min=-2.5, max=2.5, step=0.02, description='Detector Center Sample', layout=wide_lay, style=wide_desc),\n", " opt_x=widgets.FloatSlider(min=-0.001, max=0.001, step=0.00001, description='Optical Distortion X', layout=wide_lay, style=wide_desc, readout_format='.5f'),\n", - " opt_y=widgets.FloatSlider(min=-2e-6, max=2e-6, step=2e-8, description='Optical Distortion Y', layout=wide_lay, style=wide_desc, readout_format='.8f'),\n", - " opt_z=widgets.FloatSlider(min=-1e-8, max=1e-8, step=1e-10, description='Optical Distortion Z', layout=wide_lay, style=wide_desc, readout_format='.10f')\n", + " opt_y=widgets.FloatSlider(min=-2e-6, max=2e-6, step=2e-8, description='Optical Distortion Y', layout=wide_lay, style=wide_desc, readout_format='.1e'),\n", + " opt_z=widgets.FloatSlider(min=-1e-8, max=1e-8, step=1e-10, description='Optical Distortion Z', layout=wide_lay, style=wide_desc, readout_format='.1e'),\n", + " ect_add=widgets.FloatSlider(min=-1e-2, max=1e-2, step=1e-4, description='Exposure (Center) Time', layout=wide_lay, style=wide_desc, readout_format='.4f')\n", " )\n", - "def exec_widget_function(fl_add, dcl_add, dcs_add, opt_x, opt_y, opt_z):\n", + "# This function executed whenever one of the slider widgets is adjusted\n", + "def exec_widget_function(fl_add, dcl_add, dcs_add, opt_x, opt_y, opt_z, ect_add):\n", + "\n", + " # If you're curious where the ISD values came from, \n", + " # Detector Center was from NAIF Boresight Line/Sample\n", + " # Optical Distortion was from NAIF OD_K\n", + " # ISIS uses the NAIF Keywords, but Knoten CSM uses other derived ISD values.\n", "\n", " new_values = {\n", " 'focal_length_model': {'focal_length': 352.9271664 + fl_add},\n", " 'detector_center': {'line': 0.430442527 + dcl_add, 'sample': 2542.96099 + dcs_add},\n", - " 'optical_distortion': {'radial': {'coefficients': [-0.007343 + opt_x, 2.838e-05 + opt_y, 1.284e-08 + opt_z]}}}\n", + " 'optical_distortion': {'radial': {'coefficients': [-0.007343 + opt_x, 2.838e-05 + opt_y, 1.284e-08 + opt_z]}},\n", + " 'center_ephemeris_time': 297088762.2425226 + ect_add\n", + " }\n", "\n", - " # Create new ISD Dictionary and modify values\n", - " isd_dict_mod = copy.deepcopy(isd_dict)\n", + " # Modify Values in Dictionary\n", " for key,value in new_values.items(): \n", " isd_dict_mod[key] = new_values[key]\n", "\n", @@ -229,7 +219,7 @@ " with open(isd_file_mod, 'w') as json_file:\n", " json.dump(isd_dict_mod, json_file, indent=4)\n", "\n", - " print_stats(isd_dict_mod, ('focal_length_model', 'detector_center', 'optical_distortion'))\n", + " print_stats(isd_dict_mod, ('focal_length_model', 'detector_center', 'optical_distortion', 'center_ephemeris_time'))\n", "\n", " # Create Camera Model\n", " camera = csm.create_csm(isd_file_mod)\n", @@ -241,13 +231,6 @@ " # Plot it\n", " plot_footprint_comparison((lons, lats, \"Original\"),(lons_mod, lats_mod, \"Modified\"), [7,3])" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From e2d1b0ae47723302233a620527a4026596b422b1 Mon Sep 17 00:00:00 2001 From: Jacob Cain Date: Fri, 7 Mar 2025 13:38:58 -0800 Subject: [PATCH 5/6] add to toc --- mkdocs.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 250c3b22..9f1b8f61 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -41,7 +41,8 @@ nav: - Home: getting-started/index.md - CSM Stack: - Generating an ISD, creating a CSM model, and converting coordinates: getting-started/csm-stack/image-to-ground-tutorial.ipynb - - Knoten - Basic Camera Operations: getting-started/csm-stack/knoten-camera-tutorial.ipynb + - Knoten - Basic Camera Operations: getting-started/csm-stack/knoten-camera-tutorial.ipynb + - CSM Sandbox: getting-started/csm-stack/csm-sandbox.ipynb - "Using ISIS: First Steps": - Introduction to ISIS: getting-started/using-isis-first-steps/introduction-to-isis.md - Locating and Ingesting Image Data: getting-started/using-isis-first-steps/locating-and-ingesting-image-data.md From 6d230e6bd57f895dc8452d8a08d384bd402862e6 Mon Sep 17 00:00:00 2001 From: Jacob Cain Date: Tue, 13 May 2025 18:18:35 -0700 Subject: [PATCH 6/6] move data, download button, conda -> mamba, ipympl 0.9.6 --- .../csm-stack/csm-sandbox.ipynb | 20 +++++++----------- .../csm-stack/image-to-ground-tutorial.ipynb | 8 +++---- .../B10_013341_1010_XN_79S172W.cub | Bin .../B10_013341_1010_XN_79S172W_0.bsp | Bin .../B10_013341_1010_XN_79S172W_1.bsp | Bin .../image-to-ground}/image-to-ground.zip | Bin .../image-to-ground}/isd_file.json | 0 .../image-to-ground}/mro_B10_72W.tm | 0 .../image-to-ground}/mro_ctx_v11.ti | 0 ...ro_sc_psp_090526_090601_0_sliced_-74000.bc | Bin ...ro_sc_psp_090526_090601_1_sliced_-74000.bc | Bin .../mro_sclkscet_00082_65536.tsc | 0 .../image-to-ground}/mro_v16.tf | 0 .../image-to-ground}/naif0012.tls | 0 .../image-to-ground}/pck00008.tpc | 0 .../csm-stack/knoten-camera-tutorial.ipynb | 6 +++--- .../getting-started/using-ale/isd-generate.md | 8 +++---- 17 files changed, 19 insertions(+), 23 deletions(-) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/B10_013341_1010_XN_79S172W.cub (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/B10_013341_1010_XN_79S172W_0.bsp (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/B10_013341_1010_XN_79S172W_1.bsp (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/image-to-ground.zip (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/isd_file.json (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/mro_B10_72W.tm (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/mro_ctx_v11.ti (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/mro_sc_psp_090526_090601_0_sliced_-74000.bc (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/mro_sc_psp_090526_090601_1_sliced_-74000.bc (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/mro_sclkscet_00082_65536.tsc (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/mro_v16.tf (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/naif0012.tls (100%) rename docs/getting-started/{data/image_to_ground => csm-stack/image-to-ground}/pck00008.tpc (100%) diff --git a/docs/getting-started/csm-stack/csm-sandbox.ipynb b/docs/getting-started/csm-stack/csm-sandbox.ipynb index c688a871..bff7cf5c 100644 --- a/docs/getting-started/csm-stack/csm-sandbox.ipynb +++ b/docs/getting-started/csm-stack/csm-sandbox.ipynb @@ -6,17 +6,13 @@ "source": [ "# CSM Sandbox\n", "\n", - "## 1. Prerequisites\n", + "[Download This Notebook :octicons-file-code-16:](https://raw.githubusercontent.com/DOI-USGS/asc-public-docs/refs/heads/main/docs/getting-started/csm-stack/csm-sandbox.ipynb){ .md-button .md-button--primary } \n", + "[Download Example Data :material-folder-arrow-down:](https://raw.githubusercontent.com/DOI-USGS/asc-public-docs/refs/heads/main/docs/getting-started/csm-stack/image-to-ground/image-to-ground.zip){ .md-button .md-button--primary }\n", "\n", - "### Install Knoten\n", - "This tutorial requires Knoten version 0.4 or higher.\n", - "\n", - "`conda install -c conda-forge knoten=0.4`\n", - "\n", - "### Install Matplotlib\n", - "This tutorial requires matplotlib, ipywidgets, and ipympl.\n", - "\n", - "`conda install -c conda-forge matplotlib ipywidgets ipympl`" + "### Install Knoten & Prerequisites\n", + "```sh\n", + "mamba install -c conda-forge knoten=0.4 conda-forge matplotlib ipywidgets ipympl>=0.9.6\n", + "```" ] }, { @@ -104,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -120,7 +116,7 @@ ], "source": [ "# Load Dict from JSON-style ISD File\n", - "data_dir = '../data/image_to_ground'\n", + "data_dir = 'image-to-ground'\n", "isd_file = os.path.join(data_dir, 'isd_file.json')\n", "\n", "with open(isd_file) as json_file:\n", diff --git a/docs/getting-started/csm-stack/image-to-ground-tutorial.ipynb b/docs/getting-started/csm-stack/image-to-ground-tutorial.ipynb index 901a7506..ac5dd4b6 100644 --- a/docs/getting-started/csm-stack/image-to-ground-tutorial.ipynb +++ b/docs/getting-started/csm-stack/image-to-ground-tutorial.ipynb @@ -51,7 +51,7 @@ "metadata": {}, "source": [ "### 2. Generate an ISD from a Cube\n", - "We will use MRO data located in the `data/image_to_ground` folder containing a cube and necessary kernels for ISD (Image Support Data) generation. \n", + "We will use MRO data located in the `image-to-ground` folder containing a cube and necessary kernels for ISD (Image Support Data) generation. \n", "*Note*: If your cube already has attached spice data, do you not have to specify kernels in the `props` param and can pass in an empty dict `{}` instead." ] }, @@ -68,7 +68,7 @@ "import os\n", "\n", "# Set local data directory and paths\n", - "data_dir = '../data/image_to_ground'\n", + "data_dir = 'image-to-ground'\n", "cube_file = os.path.join(data_dir, 'B10_013341_1010_XN_79S172W.cub')\n", "isd_file = os.path.join(data_dir, 'isd_file.json')\n", "\n", @@ -194,7 +194,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "knoten", "language": "python", "name": "python3" }, @@ -208,7 +208,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.0" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/docs/getting-started/data/image_to_ground/B10_013341_1010_XN_79S172W.cub b/docs/getting-started/csm-stack/image-to-ground/B10_013341_1010_XN_79S172W.cub similarity index 100% rename from docs/getting-started/data/image_to_ground/B10_013341_1010_XN_79S172W.cub rename to docs/getting-started/csm-stack/image-to-ground/B10_013341_1010_XN_79S172W.cub diff --git a/docs/getting-started/data/image_to_ground/B10_013341_1010_XN_79S172W_0.bsp b/docs/getting-started/csm-stack/image-to-ground/B10_013341_1010_XN_79S172W_0.bsp similarity index 100% rename from docs/getting-started/data/image_to_ground/B10_013341_1010_XN_79S172W_0.bsp rename to docs/getting-started/csm-stack/image-to-ground/B10_013341_1010_XN_79S172W_0.bsp diff --git a/docs/getting-started/data/image_to_ground/B10_013341_1010_XN_79S172W_1.bsp b/docs/getting-started/csm-stack/image-to-ground/B10_013341_1010_XN_79S172W_1.bsp similarity index 100% rename from docs/getting-started/data/image_to_ground/B10_013341_1010_XN_79S172W_1.bsp rename to docs/getting-started/csm-stack/image-to-ground/B10_013341_1010_XN_79S172W_1.bsp diff --git a/docs/getting-started/data/image_to_ground/image-to-ground.zip b/docs/getting-started/csm-stack/image-to-ground/image-to-ground.zip similarity index 100% rename from docs/getting-started/data/image_to_ground/image-to-ground.zip rename to docs/getting-started/csm-stack/image-to-ground/image-to-ground.zip diff --git a/docs/getting-started/data/image_to_ground/isd_file.json b/docs/getting-started/csm-stack/image-to-ground/isd_file.json similarity index 100% rename from docs/getting-started/data/image_to_ground/isd_file.json rename to docs/getting-started/csm-stack/image-to-ground/isd_file.json diff --git a/docs/getting-started/data/image_to_ground/mro_B10_72W.tm b/docs/getting-started/csm-stack/image-to-ground/mro_B10_72W.tm similarity index 100% rename from docs/getting-started/data/image_to_ground/mro_B10_72W.tm rename to docs/getting-started/csm-stack/image-to-ground/mro_B10_72W.tm diff --git a/docs/getting-started/data/image_to_ground/mro_ctx_v11.ti b/docs/getting-started/csm-stack/image-to-ground/mro_ctx_v11.ti similarity index 100% rename from docs/getting-started/data/image_to_ground/mro_ctx_v11.ti rename to docs/getting-started/csm-stack/image-to-ground/mro_ctx_v11.ti diff --git a/docs/getting-started/data/image_to_ground/mro_sc_psp_090526_090601_0_sliced_-74000.bc b/docs/getting-started/csm-stack/image-to-ground/mro_sc_psp_090526_090601_0_sliced_-74000.bc similarity index 100% rename from docs/getting-started/data/image_to_ground/mro_sc_psp_090526_090601_0_sliced_-74000.bc rename to docs/getting-started/csm-stack/image-to-ground/mro_sc_psp_090526_090601_0_sliced_-74000.bc diff --git a/docs/getting-started/data/image_to_ground/mro_sc_psp_090526_090601_1_sliced_-74000.bc b/docs/getting-started/csm-stack/image-to-ground/mro_sc_psp_090526_090601_1_sliced_-74000.bc similarity index 100% rename from docs/getting-started/data/image_to_ground/mro_sc_psp_090526_090601_1_sliced_-74000.bc rename to docs/getting-started/csm-stack/image-to-ground/mro_sc_psp_090526_090601_1_sliced_-74000.bc diff --git a/docs/getting-started/data/image_to_ground/mro_sclkscet_00082_65536.tsc b/docs/getting-started/csm-stack/image-to-ground/mro_sclkscet_00082_65536.tsc similarity index 100% rename from docs/getting-started/data/image_to_ground/mro_sclkscet_00082_65536.tsc rename to docs/getting-started/csm-stack/image-to-ground/mro_sclkscet_00082_65536.tsc diff --git a/docs/getting-started/data/image_to_ground/mro_v16.tf b/docs/getting-started/csm-stack/image-to-ground/mro_v16.tf similarity index 100% rename from docs/getting-started/data/image_to_ground/mro_v16.tf rename to docs/getting-started/csm-stack/image-to-ground/mro_v16.tf diff --git a/docs/getting-started/data/image_to_ground/naif0012.tls b/docs/getting-started/csm-stack/image-to-ground/naif0012.tls similarity index 100% rename from docs/getting-started/data/image_to_ground/naif0012.tls rename to docs/getting-started/csm-stack/image-to-ground/naif0012.tls diff --git a/docs/getting-started/data/image_to_ground/pck00008.tpc b/docs/getting-started/csm-stack/image-to-ground/pck00008.tpc similarity index 100% rename from docs/getting-started/data/image_to_ground/pck00008.tpc rename to docs/getting-started/csm-stack/image-to-ground/pck00008.tpc diff --git a/docs/getting-started/csm-stack/knoten-camera-tutorial.ipynb b/docs/getting-started/csm-stack/knoten-camera-tutorial.ipynb index 9f433845..e963b356 100644 --- a/docs/getting-started/csm-stack/knoten-camera-tutorial.ipynb +++ b/docs/getting-started/csm-stack/knoten-camera-tutorial.ipynb @@ -60,7 +60,7 @@ "metadata": {}, "outputs": [], "source": [ - "data_dir = '../data/image_to_ground'\n", + "data_dir = 'image-to-ground'\n", "filename = os.path.join(data_dir, \"B10_013341_1010_XN_79S172W.IMG\")\n", "\n", "downloader = urllib.request.URLopener()\n", @@ -315,7 +315,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "knoten", "language": "python", "name": "python3" }, @@ -329,7 +329,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/docs/getting-started/using-ale/isd-generate.md b/docs/getting-started/using-ale/isd-generate.md index deb812a6..8552ca64 100644 --- a/docs/getting-started/using-ale/isd-generate.md +++ b/docs/getting-started/using-ale/isd-generate.md @@ -70,7 +70,7 @@ isd_generate [--arguments] [your-image-name] !!! example "isd_generate default run, no arguments" - To run isd_generate with no arguments on a .cub named [B10_013341_1010_XN_79S172W.cub](../../getting-started/data/image_to_ground/B10_013341_1010_XN_79S172W.cub): + To run isd_generate with no arguments on a .cub named [B10_013341_1010_XN_79S172W.cub](../../getting-started/csm-stack/image-to-ground/B10_013341_1010_XN_79S172W.cub): ```sh isd_generate B10_013341_1010_XN_79S172W.cub @@ -85,7 +85,7 @@ By default, this is your image's name, with a .json file extension (i.e. `B10_01 !!! example "Specifying Output" - [Example .cub](../../getting-started/data/image_to_ground/B10_013341_1010_XN_79S172W.cub) + [Example .cub](../../getting-started/csm-stack/image-to-ground/B10_013341_1010_XN_79S172W.cub) To output to a specified filename, use `--out` or `-o`. This example outputs a 'MyIsd.json' file: @@ -121,8 +121,8 @@ When using an NAIF SPICE Data, you can specify a metakernel using the `--kernel` !!! example "Using a NaifSpice Driver with a metakernel" Folder with example NAIF Data: - [[Download as .zip](../../getting-started/data/image_to_ground/image-to-ground.zip)] - [[View in GitHub](https://github.com/DOI-USGS/asc-public-docs/tree/main/docs/getting-started/data/image_to_ground)] + [[Download as .zip](../../getting-started/csm-stack/image-to-ground/image-to-ground.zip)] + [[View in GitHub](https://github.com/DOI-USGS/asc-public-docs/tree/main/docs/getting-started/csm-stack/image-to-ground)] This folder contains NAIF Data consisting of the various kernels necessary to generate an ISD for the `B10_013341_1010_XN_79S172W` image.