{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "vEAgyh52VBxd" }, "source": [ "# Customized 3D imaging pipeline\n", "\n", "With SPCSim user can create a customized 3D imaging pipeline with fine control over\n", "\n", "* The simualted 3D scene properties\n", "* Active illumination (laser) properties\n", "* Intrinsic properties of the imaging sensor/camera\n", "* Histogramming methods to compress the data captured by the imaging sensor\n", "* Post-processing pipelines to obtain 3D scene distance from sensor measurements" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "id": "UkjzMjfDVBRe" }, "outputs": [], "source": [ "from SPCSim.data_loaders.perpixel_loaders import PerPixelLoader\n", "from SPCSim.data_loaders.transient_loaders import TransientGenerator\n", "from SPCSim.utils.plot_utils import plot_transient, plot_ewh, plot_edh, plot_edh_traj\n", "import matplotlib.pyplot as plt\n", "from SPCSim.sensors.dtof import RawSPC, BaseEWHSPC, BaseEDHSPC, HEDHBaseClass, PEDHBaseClass, PEDHOptimized\n", "from SPCSim.postproc.ewh_postproc import PostProcEWH\n", "from SPCSim.postproc.edh_postproc import PostProcEDH\n", "from mpl_toolkits.axes_grid1 import make_axes_locatable\n", "import torch\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Set the 3D scene properties" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "cellView": "form", "id": "pdX-z1ZLZCj4" }, "outputs": [], "source": [ "num_unique_distance_values = 10 # @param {type:\"slider\", min:1, max:1000, step:1}\n", "min_distance_fraction = 0.25 # @param {type:\"slider\", min:0, max:0.9, step:0.05}\n", "max_distance_fraction = 1 # @param {type:\"slider\", min:0.2, max:1, step:0.05}\n", "signal_bkg_illumination_combinations = [[1,5]] # @param {type:\"raw\"}\n", "num_independent_simulation_runs_per_combination = 11 # @param {type:\"slider\", min:1, max:1000, step:1}\n", "device = 'cpu' # @param [\"cpu\", \"cuda\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Set laser properties" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "cellView": "form", "id": "kwazhaG0h8ru" }, "outputs": [], "source": [ "laser_time_period_ns = 100.0 # @param {type:\"number\"}\n", "num_time_bins = 1000 # @param {type:\"integer\"}\n", "laser_FWHM_ns = 2 # @param {type:\"number\"}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Select the sensor properties" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "cellView": "form", "id": "j0QzKq4DlkW8" }, "outputs": [], "source": [ "sensor_id = \"BaseEWHSPC\" # @param [\"RawSPC\", \"BaseEWHSPC\", \"BaseEDHSPC\", \"HEDHBaseClass\", \"PEDHBaseClass\", \"PEDHOptimized\"]\n", "num_laser_pulses = 3000 # @param {type:\"number\"}\n", "num_histogram_bins = 8 # @param {type:\"number\"}\n", "num_output_timestamps = 1000 # @param {type:\"number\"}\n", "\n", "sensor_id_dict = {\n", " \"RawSPC\": RawSPC,\n", " \"BaseEWHSPC\": BaseEWHSPC,\n", " \"BaseEDHSPC\": BaseEDHSPC,\n", " \"HEDHBaseClass\": HEDHBaseClass,\n", " \"PEDHBaseClass\": PEDHBaseClass,\n", " \"PEDHOptimized\": PEDHOptimized\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Select experiment index to plot results" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "cellView": "form", "id": "ig0QQ2fGyVrN" }, "outputs": [], "source": [ "illumination_condition_index = 0 # @param {type:\"integer\"}\n", "distance_value_index = 0 # @param {type:\"integer\"}\n", "independent_run_index = 0 # @param {type:\"integer\"}\n", "\n", "ROW = PixLdr.get_row(sbr_idx = illumination_condition_index,\n", " dist_idx = distance_value_index)\n", "COL = independent_run_index" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "BakQ4KBVZA-J", "outputId": "e32c5d4b-63ce-4a7a-d0d9-f80010e61ed2" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 3000/3000 [00:15<00:00, 192.65it/s]\n", ":135: UserWarning: Adding colorbar to a different Figure
than
which fig.colorbar is called on.\n", " cbar = fig.colorbar(im, cax=cax, orientation='vertical')\n", ":143: UserWarning: Adding colorbar to a different Figure
than
which fig.colorbar is called on.\n", " cbar = fig.colorbar(im, cax=cax, orientation='vertical')\n" ] }, { "data": { "image/png": "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zJ07F/PmzZPK582bh++//x4pKSm4du0aPD09cerUKbRs2VJt39pIXn///XcYGxtXqC2T5fIxAaZaRRcjC0REpDlvb2+0bt1a12GUqXfv3li/fr1amampKQCge/fumDp1Kh49egQjo6JUad++fXBzc8P+/fvVttm3bx+6d+9eLTHb2tpWy3E0VVBQABMTE12HoREmwFSrVPfIQm0RERGB2bNn6zoMIqJaw9TUFM7OzqXWde/eHdnZ2Thx4gTat28PANi/fz9mzpyJ9957D3l5eTAzM0NeXh5iY2MxfPhwrcX1ww8/YPbs2bh//z769OmDb775BtbW1gBKjuquWbMGy5Ytw40bN6BQKNC5c2f8+uuvGDZsGA4cOIADBw5gxYoVAIDk5GTUr18fBw4cwLRp03D69GnY2toiODgYH3/8sZToP3jwAGPHjsX27dshl8sxffp0/PHHH2rHrV+/PkaOHIlLly5h+/bteP311xEeHo4ZM2Zg27ZtuHnzJpydnTF48GDMmTNHGrUunuYxadIkzJs3D+np6Xj33XexcuVKLF26FF988QVUKhUmT56MDz74QGvXtDRMgKlWqukjC9WNUyCIiLSncePGcHV1xb59+9C+fXs8ePAAJ0+exI4dO7By5UrExMSge/fuiI6ORn5+vtZGgK9cuYLt27djx44duH//Pt566y0sWrQIn3zySYm2J06cwKRJk/DDDz+gQ4cOSE9Px6FDhwAAK1aswMWLF/HCCy9gwYIFAAAHBwf8+++/6Nu3L4YNG4aNGzfiwoULGD16NMzMzKRpHVOmTMGRI0fw559/wsnJCXPmzMHJkydLTOn4/PPPMWfOHMydO1cqs7a2Rnh4OFxdXXH27FmMHj0a1tbWmD59uto57tq1C5GRkbhy5QreeOMNXL16FY0bN8aBAwcQHR2NESNGICAgAH5+flq5rqVhAkxERER6Z8eOHbCyslIre//99/H+++8DKBoF3r9/P2bNmoVDhw6hcePGcHBwQJcuXbB//36p3tPTEx4eHmr76dChAwwM1Feazc3NLZFEPkmlUiE8PFwa8R06dCj27t1bagKckpICS0tLvPzyy7C2toaHhwdatWoFAFAoFDAxMYGFhYXaKPeaNWvg5uaGVatWQSaToWnTprh16xZmzJiBOXPm4OHDh9iwYQM2b96Mnj17AgDWr18PV1fXEsfv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3MKFC6FQKKSXm5ubFs6WiIiIiGoCnSbAKpUKrVu3xqeffopWrVphzJgxGD16NNatW6fLsDBr1ixkZmZKrxs3bug0HiIiIiLSHp0mwC4uLvDx8VEr8/b2RkpKCgDA2dkZAJCWlqbWJi0tTapzdnbGnTt31OofPXqE9PR0tTal7ePxYzzO1NQUcrlc7UVEREREzwedJsAdO3ZEUlKSWtnFixfh4eEBoOiGOGdnZ+zdu1eqz8rKQmxsLPz9/QEA/v7+yMjIQFxcnNTmn3/+gUqlgp+fn9Tm4MGDKCwslNpERUWhSZMmaitOEBEREdHzT6cJcFhYGI4ePYpPP/0Uly9fxubNm/H1118jJCQEQNEzxkNDQ/Hxxx/jzz//xNmzZ/Huu+/C1dUV/fv3B1A0Yty7d2+MHj0ax44dw5EjRzBhwgQMHDgQrq6uAIBBgwbBxMQEI0eOxLlz5/Dzzz9jxYoVmDJliq5OnYiIiIh0RKfLoLVr1w7btm3DrFmzsGDBAnh6emL58uUYPHiw1Gb69Ol4+PAhxowZg4yMDHTq1AmRkZFqj1zctGkTJkyYgJ49e8LAwAADBgzAl19+KdUrFArs2bMHISEhaNOmDezt7TFnzhwugUZERESkh3SaAAPAyy+/jJdffrnMeplMhgULFmDBggVltrG1tcXmzZvLPY6vry8OHTpU6TiJiIiI6Pmg80chExERERFVJybARERERKRXmAATERERkV5hAkxEREREeoUJMBERERHpFSbARERERKRXmAATERERkV5hAkxEREREeoUJMBERERHpFSbARERERKRXmAATERERkV5hAkxEREREeoUJMBERERHpFSbARERERKRXmAATERERkV5hAkxEREREeoUJMBERERHpFSbARERERKRXmAATERERkV5hAkxEREREeoUJMBERERHpFSbARERERKRXmAATERERkV5hAkxEREREeoUJMBERERHpFSbARERERKRXmAATERERkV5hAkxEREREeoUJMBERERHpFSbARERERKRXdJoAz5s3DzKZTO3VtGlTqT4vLw8hISGws7ODlZUVBgwYgLS0NLV9pKSkICgoCBYWFnB0dMS0adPw6NEjtTb79+9H69atYWpqCi8vL4SHh1fH6RERERFRDaTzEeBmzZrh9u3b0uvw4cNSXVhYGP766y9s3boVBw4cwK1bt/D6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b7+hfv36MDKq2K/4li1bAgDOnz8vvb9w4QL+++8/LFq0CG5ubgCAEydOPHVfDg4OuH37tvT50qVLFRrVTUhIQL169WBvb1+hmImIngWnQBARPUdCQkKQnp6Od955B8ePH8eVK1ewe/duDB8+HEqlstRtHBwc0Lp1axw+fFgqc3d3h4mJCVauXImrV6/izz//xEcffVRi26ZNm2Lbtm3S5x49emDVqlU4deoUTpw4gbFjx5YYxe7ZsydWrVqlVnbo0CH06tXrWU6diKjCmAATET1HXF1dceTIESiVSvTq1QvNmzdHaGgobGxsYGBQ9q/8UaNGYdOmTdJnBwcHhIeHY+vWrfDx8cGiRYvw+eefl9guKSkJmZmZ0uelS5fCzc0NnTt3xqBBgzB16lRYWFiobXPlyhW1Zdny8vKwfft26cY+IqKqxgdhEBERcnNz0aRJE/z888/w9/ev1mOvXbsW27Ztw549e6r1uESkvzgCTEREMDc3x8aNG8t9YEZVMTY2xsqVK6v9uESkvzgCTERERER6hSPARERERKRXmAATERERkV5hAkxEREREeoUJMBERERHpFSbARERERKRXmAATERERkV5hAkxEREREeoUJMBERERHpFSbARERERKRX/h/5zBToDYN79gAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqsAAAITCAYAAAAgglXpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAARudJREFUeJzt3Wl4FFX+9vG7kxCSAAkQtgRC2PdFAWVkkaBBFkEdBURZIsoICmZQQcZxVERkEUdxQRRUELd5REVRQEBFUREGCMgmyBJA2VEWE5YknfO84J8e2ix0p7vSleT7ua6+Zrr6dPWpKvnl7lOnqxzGGCMAAADAhoIC3QEAAAAgP4RVAAAA2BZhFQAAALZFWAUAAIBtEVYBAABgW4RVAAAA2BZhFQAAALZFWAUAAIBtEVYBAABgW4RVAAAA2BZhtQBz586Vw+HQ3r17A92VEq807+u1a9eqQ4cOKleunBwOhzZu3BjoLgGAx0pz/UbRKFVhNecfVM4jLCxMsbGx6t69u1544QX98ccffvmcVatWafz48Tp58qRf1ldS2HW/BLJfmZmZ6tevn37//Xc999xzeuuttxQfH19kn5/zb2LdunVF9plWSUtL0+OPP64ePXqocuXKcjgcmjt3rlfrOH/+vMaNG6fY2FiFh4erffv2Wr58eaHbFVZJOi55+frrr91q8cWP1atXe7SOQB6rrVu3ql+/fqpXr54iIiJUpUoVXX311fr00099+ny7/PcH2I4pRebMmWMkmQkTJpi33nrLvPHGG2bSpEnmuuuuMw6Hw8THx5sff/zR1T4rK8ucPXvWZGdne/U506ZNM5JMamqqn7egeCtovxR2X1vdL6v99NNPRpKZPXt2kX7u6dOnzfz5802vXr2MJHPXXXeZzz77zJw7d65I++FPqampRpKpXbu2SUhIMJLMnDlzvFrHgAEDTEhIiBkzZox59dVXzVVXXWVCQkLMt99+W6h23iqJxyUvK1asMJJMcnKyeeutt9wex44d82gdgTxWixYtMt27dzfjx483s2bNMtOnTzedO3c2ksyrr75a6M8P9H9/hZXzt5W/ebBKqQyra9euzfXal19+acLDw018fLw5c+aMT59DWM2bXfdLIPv1zTffGElm/vz5fltnWlpaga8vXrzY1KxZ00gyERERbv/bsGFD88033/itL0Xp3Llz5tChQ8YYY9auXet1WF2zZo2RZKZNm+ZadvbsWVO/fn1z1VVXed3OWyX1uOQlJ6wW9r/7QB+rvGRlZZnWrVubxo0bF+rz7bhNniKswmqE1YtMmjTJSDKzZs1ya3/xP8DTp0+bv//97yY+Pt6EhoaaqlWrmsTERLN+/XpjjDGPP/64kZTrkZqaavbu3Wvuuece06hRIxMWFmYqV65s+vbtm+sfeM46du7caZKSkkxUVJSJjIw0d9xxh0lPT8/V719//dXceeedJiYmxoSGhpo6deqYESNGmPPnz7u1GTp0qKlWrZoJDQ01zZo1M6+//rpH+83T9xa0bwraL/nt65z37NixwwwcONBERkaaKlWqmH/9618mOzvb7N+/39xwww2mQoUKpnr16uaZZ55x648n+/tS/fLHtucnKSkp1+d26dLFGGNMSkqK6dGjh6lQoYIpV66cueaaa8wPP/yQax05/d+6dau57bbbTMWKFc1ll12W72d+++23JiQkxNSrV8+sXLnStd/XrFljFi9ebOLi4kxYWJhZt25dvusoDgoTVseOHWuCg4PNqVOn3Jbn1IX9+/d71c4bpeW45Lg4rJ4+fdpkZmZ69f5AHquC9O7d21SvXt3rfhblNuXUjJ9++sn069fPVKhQwVSuXNkkJyebs2fPurVNSkoy8fHx+a4jR2H+VubwpMYWpr6iZAkp9PyBEmjw4MH65z//qWXLlulvf/tbnm1GjBihDz74QKNGjVKzZs3022+/6bvvvtNPP/2kNm3a6Oabb9bPP/+s9957T88995yqVKkiSapataqWLFmiVatWacCAAapVq5b27t2rmTNnKiEhQdu2bVNERITbZ/Xv319169bV5MmTlZKSotdee03VqlXT1KlTXW0OHjyoK6+8UidPntTdd9+tJk2a6MCBA/rggw905swZhYaG6siRI/rLX/4ih8OhUaNGufpy11136fTp0xo9enS++8Sb9xa0bwraL5dy6623qmnTppoyZYoWLVqkiRMnqnLlynr11Vd1zTXXaOrUqXrnnXc0ZswYXXHFFbr66qslXfjh0qX2d0H98te2t2nTJs/tGj58uGrWrKlJkyYpOTlZV1xxhapXr66tW7eqc+fOioyM1EMPPaQyZcro1VdfVUJCgr755hu1b98+17r69eunhg0batKkSTLG5LsvH3nkEUnS4sWL1bhxY+3evVuSFBQUpJ49e2rRokW6/PLL9Y9//MPyOXCZmZk6deqUR20rV66soCBrp9hv2LBBjRo1UmRkpNvyK6+8UpK0ceNGxcXFedzOG3Y6Lvmx4ngNHTpUaWlpCg4OVufOnTVt2jS1a9fuku8L5LG6WHp6us6ePatTp05p4cKFWrJkiW699Vav+xmIberfv7/q1KmjyZMna/Xq1XrhhRd04sQJzZs3z8u9kDdPaqKnNbYw9RUlTKDTclG61MiqMcZERUWZyy+/3K39xd8Wo6KizMiRIwv8nPxOK+c1veCHH34wksy8efNcy3K+td55551ubf/617+a6Ohot2VDhgwxQUFBeW5TzvzPu+66y8TExJjjx4+7vT5gwAATFRVV4LQHb957qX1T0On2gkZW7777bteyrKwsU6tWLeNwOMyUKVNcy0+cOGHCw8NNUlKSa5mn+zu/fvlz2/OT1+nQm266yYSGhprdu3e7lh08eNBUqFDBXH311W7vz9lHt9122yU/68yZMyY4ONgkJCS4luX1b6Jz584mJCTE8nmSOdvuycPb04uFGVlt3ry5ueaaa3It37p1q5FkXnnlFa/aecpuxyU//jxe33//vbnlllvM66+/bj755BMzefJkEx0dbcLCwkxKSsol+xKoY/Vnw4cPd21zUFCQ6du3r/n999+97mdRblNOzbjhhhvclt97771GktvvNnwZWfWkJnpaYwtbX1FyMLL6J+XLly/wqgAVK1bUmjVrdPDgQcXGxnq17vDwcNf/z8zM1OnTp9WgQQNVrFhRKSkpGjx4sFv7ESNGuD3v3LmzFixYoNOnTysyMlLZ2dn6+OOP1adPnzxHIxwOh4wx+vDDD9W/f38ZY3T8+HHX6927d9d//vMfpaSkqGPHjrne7+17fdk3BRk2bJjr/wcHB6tdu3b69ddfddddd7mWV6xYUY0bN9aePXtcy7zd3xcL1LY7nU4tW7ZMN910k+rVq+daHhMTo9tvv12zZ892Hf+L/fm/lbycOHFCTqdTNWvWLLBdrVq1lJWVpd9//10xMTH5tjt//rxq166tnTt35uqPJ1q3bu3xKGGNGjW8Xr+3zp49q7Jly+ZaHhYW5nrdm3ae8vW4REVFadu2bbneb4xRhQoVtGfPHlWrVs2rPuXFn8erQ4cO6tChg+v5DTfcoL59+6pVq1Z6+OGH9fnnnxf4/kAdqz8bPXq0+vbtq4MHD+r999+X0+lURkaG1/30pq2/tmnkyJFuz++77z69/PLLWrx4sVq1auXROgpyqZroTY216m8Lig/C6p+kpaUVWNiffvppJSUlKS4uTm3btlWvXr00ZMgQt2CRn7Nnz2ry5MmaM2eODhw44Ha6Nq/Ta7Vr13Z7XqlSJUkX/rhFRkbq2LFjOn36tFq0aJHvZx47dkwnT57UrFmzNGvWrDzbHD161C/v9WXfFOTP+yEqKkphYWGuU/YXL//tt99cz73d3xcL1LYfO3ZMZ86cUePGjXO91rRpU2VnZ+uXX35R8+bN3V6rW7fuJdddsWJFBQUF6eDBgwW2O3DggIKCglz/veWnbNmyOnLkyCU/Nz+VKlVSYmJiod/vb+Hh4Tp//nyu5efOnXO97k07T/lyXPbv3y9JeQbd1NRURURE+CWoStYfrwYNGujGG2/URx99JKfTqeDg4HzbBupY/VmTJk3UpEkTSdKQIUN03XXXqU+fPlqzZo0cDodXn1/U29SwYUO35/Xr11dQUJDfrpV6qZroTY216m8Lig/C6kV+/fVXnTp1Sg0aNMi3Tf/+/V0jnMuWLdO0adM0depUffTRR+rZs2eB67/vvvs0Z84cjR49WldddZWioqLkcDg0YMAAZWdn52qfX7E2BcxJ/LOc9Q4aNEhJSUl5tsnvW7S37/Vl3xQkr/3gyb7xdn9fzC7b7ilP/kBFREToqquu0rfffquff/5ZjRo1ytVmy5Yt+v7779WpUyfXSI1VMjIy9Pvvv3vUtmrVqgWGF3+IiYnRgQMHci0/dOiQJLlGdDxt5ylfjsuWLVtcYSmv9/z5S40viuJ4xcXFKSMjQ+np6QWO1gfqWF1K3759NXz4cP38889q3LixV58f6G1yOBweLZMunAG6lEvVRG9qbKDrKwKPsHqRt956S9KFUxAFiYmJ0b333qt7771XR48eVZs2bfTUU0+5/tHk9w/8gw8+UFJSkv7973+7lp07d67QF6OvWrWqIiMjtWXLlgLbVKhQQU6n0+tRkcK8t6B9k99+sYqn+zuvfvl72z1VtWpVRUREaMeOHble2759u4KCgnz6QcjEiROVmJioXr16uf2QwhijZcuWadiwYQoKCtLkyZPdPnfUqFFKSUmRMUaDBw/WCy+8oOeff16bNm3S66+/rqysLD388MOaPXu2qlSpojFjxui5557LcztyrFq1Sl27dvWo36mpqapTp06ht9sTl112mVasWJFrmsWaNWtcr3vTzhuFOS7ShUBas2ZN3X777Vq0aJGaNm2q//f//p/i4+PdwurRo0d1yy23KCEhQRMmTJDT6bTl8dqzZ4/CwsJUvnz5AtsF8lgVJOcUfM6ZG28+v6i3aefOnW5nZHbt2qXs7Gy341apUqU8/z7t27fPo88oqCZ6W2P9UV9RfJWqO1gV5KuvvtKTTz6punXrauDAgXm2cTqduU4fV6tWTbGxsW6nZcqVKydJuf6RBwcH5xoVffHFFz36lpqXoKAg3XTTTfr000/zvNONMUbBwcG65ZZb9OGHH+YZao8dO5bv+r15ryf7Jr/9YhVP93de/fL3tnvT5+uuu06ffPKJ2+m4I0eO6N1331WnTp0KNT80R0JCgj788EOlpaWpY8eOuu+++yRJ1157retL2sKFC93mEw4cOFB33323fvvtN+3bt881CrJp0ybXyMfYsWO1fft27d69WytWrNDEiRMLnJ4i/W8OpCcPf85ZPXPmjLZv3+42R066MCrmdDrdTkmeP39ec+bMUfv27V1fEjxt543CHBfpfyOuo0aN0vHjx1W3bl09/vjjrteaN2+uDRs2qFOnTrrnnnv05JNPyuFwBPx45VV3fvzxRy1cuFDXXXed25UE8jpegTxWUt5TpzIzMzVv3jyFh4erWbNmXn9+UW/TjBkz3J6/+OKLkuQW/urXr69Tp05p06ZNrmWHDh3SggULCly3JzXR0xrrz/qK4qtUjqwuWbJE27dvV1ZWlo4cOaKvvvpKy5cvV3x8vBYuXJjv6c8//vhDtWrVUt++fdW6dWuVL19eX3zxhdauXes2ete2bVtJFy5HM2DAAJUpU0Z9+vRR79699dZbbykqKkrNmjXTDz/8oC+++ELR0dGF3pZJkyZp2bJl6tKli+6++241bdpUhw4d0vz58/Xdd9+pYsWKmjJlilasWKH27dvrb3/7m5o1a6bff/9dKSkp+uKLLwo8tefpez3ZN/ntl5yw6G+e7u/8+uXPbffGxIkTtXz5cnXq1En33nuvQkJC9Oqrr+r8+fN6+umnfd4vN954o7p06aLFixdr3rx5Wrp0qW688Ub17t1bvXv3znU8du/erYyMDGVnZysyMtK1vzZt2qRBgwbp4MGDeuONN7Rjxw5FR0crOjpa7du3v2T4sWIO5EsvvaSTJ0+65n9++umn+vXXXyVdmBYSFRWl//73v+ratasef/xxjR8/3vXe9u3bq1+/fnr44Yd19OhRNWjQQG+++ab27t2r119/3et2ORwOh7p06aKvv/66wL57e1ykC4H00UcfdYXYwYMHu4XVypUra9q0aXr33Xf1l7/8RZJscbxuvfVWhYeHq0OHDqpWrZq2bdumWbNmKSIiQlOmTHFrm9fxCvSxGj58uE6fPq2rr75aNWvW1OHDh/XOO+9o+/bt+ve//+0aGfbm863apvykpqbqhhtuUI8ePfTDDz/o7bff1u23367WrVu72gwYMEDjxo3TX//6VyUnJ+vMmTOaOXOmGjVqpJSUlHzX7WlN9KTG+ru+opgq4qsPBFTO5TVyHqGhoaZGjRqmW7du5vnnnzenT5/Os33O5TjOnz9vxo4da1q3bu26WHvr1q3Nyy+/nOuznnzySVOzZk0TFBTkWseJEyfM0KFDTZUqVUz58uVN9+7dzfbt2018fLzbJZdyLgvy59sO5neXkH379pkhQ4aYqlWrmrJly5p69eqZkSNHut0U4MiRI2bkyJEmLi7OlClTxtSoUcNce+21rhsgFMST93q6b/LaL/ltW377ISkpyZQrVy5XP7t06WKaN2/ueu7p/i6oX/7c9rzkdyeflJQU0717d1O+fHkTERFhunbtalatWpXr/fntI095cjm3xYsXm44dO5rq1aubsWPHmszMTON0Ok1ERIQ5fvy4mTdvXq5LaiUkJJj333+/UH3yRXx8/CUvp5Szzx9//PFc7z979qwZM2aMqVGjhilbtqy54oorzOeff17odn/88YeRZAYMGODVdnhyXJxOpwkLCzMHDhxwLZs7d67p3r27yczMdF08/eLLtBljbHG8nn/+eXPllVeaypUrm5CQEBMTE2MGDRpkdu7cmattfscrkMfqvffeM4mJiaZ69eomJCTEVKpUySQmJppPPvmk0J9vxTblJadmbNu2zfTt29dUqFDBVKpUyYwaNSrXTQGMMWbZsmWmRYsWJjQ01DRu3Ni8/fbbl7x0lTc18VI11pf6ipKjVIVVAIW3d+9eU7t2bbN06VKzY8cOExMTY4wx5rnnnjP9+/d3tTt27JiJiIgw27ZtC1RXbWPRokXG4XCYTZs2+X3dO3bsMJJMRkaGa9lNN91kpk+fbrZu3WpiY2PNd999Z2JiYszevXtdbTheebPyWNmJr19wgUBgziqAfH344YdKTU2VdOGSaRkZGWrSpInbfNXGjRtr5cqVOnDggI4dO6Y777xTTqcz16VxSqMVK1ZowIABatmypd/XvWXLFoWEhOi9995TVlaWZs+erc2bN2vYsGHasmWLWrZsqY4dO+qf//ynbr75ZteljTheebPyWAHwTamcswrAM998841GjhyptLQ01a9fX6+99ppq166t119/3RVWe/TooZ49e6pJkyaqU6eOBg0apEOHDikkhPIybdo0y9a9ZcsW3X333frPf/6j5ORktWvXTsuXL1e5cuW0ZcsW1/EZNWqU1q5dq+HDh+vNN9/keOXDymMFwDcOY7y4aCcAXMKYMWMUFhamiRMnBror8ADHq3QZP368nnjiCR07dizXjVUAuyKsAvDJqlWrFB8fr+rVq2vBggUaNWqUNm7cWOCtWhE4HC8AxU3pPu8DwGfr16/X9ddfr+zsbLVu3VqfffYZwcfGOF4AihtGVgEAAGBbXA0AAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEAAGBbhFUAAADYFmEVAAAAtkVYBQAAgG0RVgEA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Z23toXXr1jpw4IBOnjypihUrupbfeuutgesUgFKLOso0AAAWylRZZXj4yFTZQHfXzcUFVpKOHz+uunXrBqYzAEot6ihhFYCFiuMlVz777DM1btxYZcuWVVBQkOtRrVo17d+/3/UcAIoCdZRpAAAslPPDAM/a2uOe1g8++KC6deuma6+9VsHB/+v7qVOnlJSUxG1WARQpf9XRlStXatq0aVq/fr0OHTqkBQsW6KabbnK9bozR448/rtmzZ+vkyZPq2LGjZs6cqYYNG3rdZ3/XUcIqAMt4N9fKHmF17969evTRR1W9enW35UePHpXk2W0EAcBf/FVH09PT1bp1a9155526+eabc73+9NNP64UXXtCbb76punXr6tFHH1X37t21bds2hYWFedVnf9dRzmUBsMyF6wN6/sjPypUr1adPH8XGxsrhcOT6Vm6M0WOPPaaYmBiFh4crMTFRO3fuLFSfa9asqbJlc8/7Cg4OVp06dQq1TgAoLH/V0Z49e2rixIn661//mus1Y4ymT5+uf/3rX7rxxhvVqlUrzZs3TwcPHizU2SR/11HCKgDLZHsxzyq7gJGDnBGBGTNm5Pl6zojAK6+8ojVr1qhcuXLq3r27zp0753Wf9+zZk+tHAZIUHR2tPXv2eL0+APCFv+poQVJTU3X48GElJia6lkVFRal9+/b64YcfvF6fv+soYRWAZfz1w4CiHBHYt2+fbrnlFrVq1UojRoxQenq6JGnTpk2EVQBFrih+YHX48GFJynXavnr16q7XvOHvOkpYBWCZLAV5fE/rrEKWI3+PCNx1113au3evbr31Vn355Zd6/PHHJUlr1qzRAw88UKg+AkBhFUUd9Td/11F7bBWAEslfc60K4u8RgdWrV+uNN97QI488on//+99avHixJKlTp05avXp1ofoIAIVVFHU05xaoR44ccVt+5MiRQt0e1d91lLAKwDLF8fqAVapUcf3/+vXr69ChQ5Kk0NBQ16ksACgqRVFH69atqxo1aujLL790LTt9+rTWrFmjq666yuv1+buOElYBWKYoiqy/RwTGjRunxx57TGlpaQoPD1dW1oUbGM6bN09NmzYtVB8BoLD8VUfT0tK0ceNGbdy4UdKFKVQbN27U/v375XA4NHr0aE2cOFELFy7U5s2bNWTIEMXGxrpdi9VT/q6jXGcVgGWcXlwf0KnsQn3GxSMCl112maT/jQjcc889Xq9v/vz5SklJUVxcnOrUqaNz586pZcuW2rNnjxYuXFioPgJAYfmrjq5bt05du3Z1Pc+ZO5qUlKS5c+fqoYceUnp6uu6++26dPHlSnTp10ueff+71NVYl/9dRwioAy3gzh6qgO6+kpaVp165druc5IwKVK1dW7dq1XSMCDRs2dF3MurAjApdddpkr9EpS9+7dVbt2bd1www2qVauW1+sDAF/4q44mJCTImPxfdzgcmjBhgiZMmOB1H//M33WUsArAMt7dJtCZ72tFOSLw7LPPev0eALCKv+poUfJ3HSWsArCMN3NRC2pXlCMCAGAn/qqjxRlhFYBlMhSqIIV62NYe6tWrV2AwTk1NLcLeACjtqKOEVQAW8m6uVeF+YOVvo0ePdnuemZmpzZs3a9GiRdwUAECRo44SVgFYqDievkpOTs5z+SuvvKK1a9cWcW8AlHbUUa6zCsBCOT8M8Oxh73J03XXXaf78+YHuBoBShjrKyCoAC+Xcr9rTtnY2f/58VapUKdDdAFDKUEcJqwAs5N1cK3tccqVNmzZuPwwwxujw4cM6fvy4Zs6cGcCeASiNqKOEVQAWyvZirlW2TUYE/nwjgaCgIFWrVk1du3ZVw4YNA9MpAKUWddSLsDpE87xeOYDSol+eS4vjDwMee+wxy9b9tgZZtm4Axd22PJdSRxlZBWAh7+68Yp8fBmRmZuq9997Tpk2bdPbsWbVu3VoDBw5UuXLlAt01AKUMdZSwCsBCWQpWcDH7YcAvv/yibt266ciRI657W7/zzjuaOnWqVq5cqZo1awa2gwBKFeool64CYKGcHwZ4+rCDBx98UDVq1FBqaqpWrFihFStWaN++fYqLi9OYMWMC3T0ApQx1lJFVABYqjj8MWL58uRYtWqSKFSu6lkVFRWny5Mnq3bt34DoGoFSijhJWAVioOP4wICsrSzExMbmWV69eXefPnw9AjwCUZtRRpgEAsFDOxaw9fdhBs2bNtGHDhlzLU1JS1KxZswD0CEBpRh1lZBWAhTIUKqmsh22zre2Mh2bMmCGnM/eFtePi4jRjxowA9AhAaUYdJawCsFBxPH3Vrl27PJe3b9++iHsCANRRiWkAACyU88MATx52+WGAJC1btkydOnVSRESEqlWrpm7duunbb78NdLcAlELUUcIqAAsVx7lWy5cvV58+fdS0aVNNmDBB6enpSkxMVJ8+ffTJJ58EunsAShnqKGEVgIUufNv39PqA9iiyEyZM0COPPKLZs2fr5ptvVlBQkMaNG6eXXnpJEyZMCHT3AJQy1FHCKgALeXrqyps5WVbbsGGD+vbtm2t5586dtW1b3vfuBgCrUEf5gRUACzkVrKBi9sOAMmXKKCgo9/f4Xbt2catVAEWOOsrIKgALFce5Vk2aNNGPP/7oeu50OvXOO+/o7rvv1pAhQwLYMwClEXWUsArAQtle3M862yYneoYNG6YtW7a4nmdkZOihhx7SHXfcoX/9618B7BmA0og6yjQAABZyKliOYnb66q677nL9/3r16iktLU1hYWEB7BGA0ow6SlgFYCGngrwosvY80UNQBRBI1FHCKgALXZg/5VmRtctcKwCwE+ooYRWAhZwKkcPDMuOkHAFALtRRwioAC+XcJtDTtgAAd9RRwioACzm9OH1llx8GAICdUEcJqwAsdF5lFKxQj9o6lWFxbzz3+++/a8WKFdqwYYOOHz+u8PBwxcfHq1OnTmrXrl2guwegFKGOcp1VABby/H7WIbaYa7V582bddtttio2N1fDhw/X111/rwIED2rJli2bPnq2rrrpKjRs31gsvvKDMzMxAdxdAKUAd9WJktd/BzwrdcQAlXGzei4vT6at58+Zp3LhxGjp0qFJSUtSsWbNcbdLT07V48WK99tprevHFF7Vz584A9DRw2oz4KdBdsLWUV5paun72fwn3St6LqaNMAwBgoWwvimxBPwxwOp0aP3683n77bR0+fFixsbGuO6E4HA6/9LVt27bavXu3IiIi8m1Trlw59evXT/369dPq1av98rkAUBB/1dGiYFUdJawCsEyWghXkhyI7depUzZw5U2+++aaaN2+udevWaejQoYqKilJycrJf+tq8eXOv2v/lL3/xy+cCQEH8VUeLglV1lLAKwDJOBct4WGYKKrKrVq3SjTfeqOuvv16SVKdOHb333nv673//65d+Xmzfvn0Fvh4fH+/3zwSA/PirjhYlf9dRwioAy1wosr6PCHTo0EGzZs3Szz//rEaNGunHH3/Ud999p2effdZfXXWpV6+ejDFyOBwyxuTuZ3a23z8TAPLjrzpalPxdRwmrACzjryL7j3/8Q6dPn1aTJk0UHBwsp9Opp556SgMHDvRXV102bNjg9jwzM1ObN2/WtGnTNH78eL9/HgAUpDiGVX/XUcIqAMs4s4Nlsj0ssgW0e//99/XOO+/o3XffVfPmzbVx40aNHj1asbGxSkpK8ld3JUmtWrXKtaxt27aqVauWJkyYoH79+vn18wCgIP6qo0XJ33WU66wCsIwzK1hZHj6cWfkX2bFjx+of//iHBgwYoJYtW2rw4MG6//77NXny5CLblri4OK1bt67IPg8AJP/VUafTqUcffVR169ZVeHi46tevryeffDLP0/RWKWwdZWQVgGWcWSFyZHlWZkwB7c6cOaOgIPfv1sHBwZbMH/3mm2/c+2WMjhw5oueff14tWrTw++cBQEH8VUeL4qoqOfxdRwmrACzjzAqSo4Bv+hczWfmf6OnTp4+eeuop1a5dW82bN9eGDRv07LPP6s477/RXV12uueYa1w8DLtamTRu9++67fv88ACiIv+poUV5Vxd91lGkAACzj/L/TUp4+8vPiiy+qb9++uvfee9W0aVONGTNGw4cP15NPPun3Pp84cUInT57UiRMndOLECR09elRfffWVIiMjdfLkSb9/HgAUxF91tEOHDvryyy/1888/S5Lrqio9e/b0e5/9XUcZWQVgmaysYDkyPR0RyL9dhQoVNH36dE2fPt1PPctfZGRkrmVdunTRU089pXvvvVdr1661vA8AkMNfdbQor6ri7zpKWAVgGeMMkXF6WGY8bRcg4eHh2r59e6C7AaCU8VcdLcqrquSnsHXU3n8dABRv50KlMqGet7WBN9980+15zg8DXn/9dXXu3DlAvQJQavmpjl58VRVJatmypfbt26fJkyf7Paz6u44SVgFYx+mQshyXbpfT1gbuv/9+t+dBQUGqVq2aunXrpgkTJgSoVwBKLT/V0aK8qoq/6yhhFYB1sv7v4WlbG/j9998D3QUA+B8/1dGivKqKv+soYRWAdYphWAUAW/FTHX3xxRf16KOP6t5779XRo0cVGxur4cOH67HHHvNHLy3FpasAWCfLy0cAffTRR/r88889avvbb7/p4YcftrhHACC/1dGcq6rs27dPZ8+e1e7duzVx4kSFhvrv9wJW1VHCKgDrZEnK9PAR4LAaFxenMWPGqGnTpnriiSf01Vdf6ejRo8rKytIff/yhHTt26K233lL//v1Vr149paenB7bDAEoH6ijTAABYyPl/D0/bBtAVV1yhTZs26cMPP9SsWbM0efJkZWRk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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "################################################################################\n", "########## Setting the 3D scene parameters #####################################\n", "################################################################################\n", "\n", "# Simulating results for distance = 0.1*dmax\n", "PixLdr = PerPixelLoader(\n", " num_dists=num_unique_distance_values,\n", " min_dist = min_distance_fraction,\n", " max_dist = max_distance_fraction,\n", " tmax = laser_time_period_ns,\n", " sig_bkg_list = signal_bkg_illumination_combinations,\n", " num_runs=num_independent_simulation_runs_per_combination,\n", " device = device)\n", "\n", "# Generate the per pixel data\n", "data = PixLdr.get_data()\n", "\n", "\n", "################################################################################\n", "### Generating the transient for set scene conditions and laser parameters #####\n", "################################################################################\n", "\n", "# Creating transient generator with laser time period of 100ns, FWHM 1 and with\n", "# laser time period divided into 1000 equal time-bins\n", "tr_gen = TransientGenerator(Nr = PixLdr.Nr,\n", " Nc = PixLdr.Nc,\n", " N_tbins = num_time_bins,\n", " tmax = PixLdr.tmax,\n", " FWHM = laser_FWHM_ns)\n", "\n", "\n", "# Using the get function to generate the transient\n", "# for a given distance, albedo, intensity, and illumination condition\n", "phi_bar = tr_gen.get_transient(data[\"gt_dist\"],\n", " data[\"albedo\"],\n", " data[\"albedo\"],\n", " data[\"alpha_sig\"],\n", " data[\"alpha_bkg\"])\n", "\n", "Nr, Nc, N_tbins = phi_bar.shape\n", "device = PixLdr.device\n", "\n", "\n", "################################################################################\n", "########## Initialize object for selected sensor class #########################\n", "################################################################################\n", "\n", "\n", "SensorClass = sensor_id_dict[sensor_id]\n", "\n", "if sensor_id == \"RawSPC\":\n", " spc1 = SensorClass(\n", " Nr,\n", " Nc,\n", " num_laser_pulses,\n", " device,\n", " num_time_bins,\n", " num_output_timestamps)\n", "else:\n", " spc1 = SensorClass(\n", " Nr,\n", " Nc,\n", " num_laser_pulses,\n", " device,\n", " num_time_bins,\n", " num_histogram_bins)\n", "\n", "\n", "################################################################################\n", "########## Capture the dToF data for given exposure time #######################\n", "################################################################################\n", "\n", "\n", "captured_data = spc1.capture(phi_bar)\n", "\n", "fig, ax1 = plt.subplots(1,1,figsize=(8,4))\n", "\n", "\n", "################################################################################\n", "########## Plot the data captured by the sensor data ###########################\n", "########## & ############################################################\n", "######## Reconstr 3D distance estimates using post-processing pipeline #########\n", "################################################################################\n", "\n", "\n", "if sensor_id == \"RawSPC\":\n", "\n", " raw_data = captured_data[\"time_stamps\"]\n", " ewh_data = captured_data[\"ewh\"]\n", "\n", " phi_bar1 = phi_bar[ROW, COL, :].cpu().numpy()\n", " ts = raw_data[ROW, COL, :].cpu().numpy().flatten()\n", "\n", " xaxis = torch.arange(0.5,1+N_tbins).to(torch.float)\n", " hist,_ = torch.histogram(raw_data[ROW,COL,:], xaxis)\n", " hist2 = ewh_data[ROW,COL,:]\n", " plot_transient(ax1, hist2.cpu().numpy(), plt_type = '-b', label=\"Captured EW histogram\")\n", " plot_transient(ax1, hist.cpu().numpy(), plt_type = '--r', label=\"Timestamps histogram\")\n", " plot_transient(ax1, phi_bar[ROW,COL,:].cpu().numpy()*spc1.N_output_ts/np.mean(np.sum(phi_bar.cpu().numpy(), axis=-1)), plt_type = '-g', label=\"True Transient\")\n", " ax1.set_xlabel('Bins')\n", " ax1.set_ylabel('Frequency')\n", " ax1.set_title(r'Histogram of raw data for $\\Phi_{sig}$ = %.2f, $\\Phi_{bkg}$ = %.2f'%(data[\"alpha_sig\"][ROW, COL], data[\"alpha_bkg\"][ROW, COL]))\n", " ax1.legend()\n", "\n", "\n", "elif sensor_id == \"BaseEWHSPC\":\n", "\n", " ewh_data = captured_data[\"ewh\"].cpu().numpy()\n", " phi_bar = phi_bar.cpu().numpy()\n", "\n", " ewh_bins_axis = torch.linspace(0,N_tbins-N_tbins//num_histogram_bins,num_histogram_bins)\n", "\n", " plot_ewh(ax1, ewh_bins_axis, ewh_data[ROW, COL,:], label = \"EWH histogram\", color = 'w')\n", " plot_transient(ax1, phi_bar[ROW, COL,:]*spc1.N_pulses, plt_type = '-r', label=\"True Transient\")\n", " ax1.set_xlabel(\"Time (a.u.)\")\n", " ax1.set_ylabel(\"Photon counts\")\n", " ax1.set_title(r'%d-bin Equi-depth histogram for $\\Phi_{sig}$ = %.2f, $\\Phi_{bkg}$ = %.2f'%(num_histogram_bins, data[\"alpha_sig\"][ROW, COL], data[\"alpha_bkg\"][ROW, COL]))\n", " plt.legend()\n", "\n", " postproc_ewh = PostProcEWH(\n", " Nr,\n", " Nc,\n", " num_time_bins,\n", " laser_time_period_ns,\n", " device\n", " )\n", "\n", " dist_idx, pred_dist = postproc_ewh.ewh2depth_t(captured_data[\"ewh\"])\n", " fig2, ax2 = plt.subplots(1,2, figsize=(8,8))\n", " im = ax2[0].imshow(data[\"gt_dist\"].cpu().numpy(), cmap = 'jet')\n", " ax2[0].axis('off')\n", " ax2[0].set_title(\"True Dist\")\n", " divider = make_axes_locatable(ax2[0])\n", " cax = divider.append_axes('right', size='5%', pad=0.05)\n", " cbar = fig.colorbar(im, cax=cax, orientation='vertical')\n", " cbar.ax.tick_params(length=0)\n", " cbar.set_label('Distance (m)', rotation=270, labelpad=15)\n", " im = ax2[1].imshow(pred_dist, cmap = 'jet')\n", " ax2[1].axis('off')\n", " ax2[1].set_title(\"Pred. Dist\")\n", " divider = make_axes_locatable(ax2[1])\n", " cax = divider.append_axes('right', size='5%', pad=0.05)\n", " cbar = fig.colorbar(im, cax=cax, orientation='vertical')\n", " cbar.ax.tick_params(length=0)\n", " cbar.set_label('Distance (m)', rotation=270, labelpad=15)\n", "\n", " fig2.suptitle(r'Distance estimates for $\\Phi_{sig}$ = %.2f, $\\Phi_{bkg}$ = %.2f, %d pulses'%(data[\"alpha_sig\"][ROW,RUN], data[\"alpha_bkg\"][ROW,RUN], spc1.N_pulses))\n", " fig2.savefig(\"DistanceOutput.png\")\n", "\n", "\n", "elif sensor_id == \"BaseEDHSPC\":\n", " oedh_data = captured_data[\"oedh\"].cpu().numpy()\n", " gtedh_data = captured_data[\"gtedh\"].cpu().numpy()\n", " ewh_data = captured_data[\"ewh\"].cpu().numpy()\n", " phi_bar = phi_bar.cpu().numpy()\n", "\n", " ymax = ((np.sum(ewh_data[ROW,COL,:])/num_histogram_bins)).item()\n", "\n", " plot_edh(oedh_data[ROW,COL,:],\n", " ax1,\n", " ymax = ymax)\n", "\n", " plot_edh(gtedh_data[ROW,COL,:], ax1,\n", " tr = phi_bar[ROW, COL,:]*spc1.N_pulses,\n", " # crop_window= tr_gen.FWHM*1.5*tr_gen.N_tbins*1.0/tr_gen.tmax, # uncoment this line to zoom into peak\n", " ymax = ymax, ls='--')\n", " ax1.set_title(r'Final %d-bin Oracle EDH boundaries for $\\Phi_{sig}$ = %.2f, $\\Phi_{bkg}$ = %.2f, %d pulses'%(num_histogram_bins,\n", " data[\"alpha_sig\"][ROW,COL],\n", " data[\"alpha_bkg\"][ROW,COL],\n", " spc1.N_pulses))\n", "\n", "\n", "elif sensor_id in [\"HEDHBaseClass\",\"PEDHBaseclass\", \"PEDHOptimized\"]:\n", " pedh_data = captured_data[\"edh\"].cpu().numpy()\n", " gtedh_data = captured_data[\"gtedh\"].cpu().numpy()\n", " ewh_data = captured_data[\"ewh\"].cpu().numpy()\n", " edh_list = captured_data[\"traj\"]\n", " phi_bar = phi_bar.cpu().numpy()\n", " edh_list = np.array(edh_list)\n", "\n", " ymax = ((np.sum(ewh_data[ROW,COL,:])/num_histogram_bins)).item()\n", " plot_edh(pedh_data[ROW,COL,:],\n", " ax1,\n", " ymax = ymax)\n", " plot_edh(gtedh_data[ROW,COL,:], ax1,\n", " tr = phi_bar[ROW, COL,:]*spc1.N_pulses,\n", " # crop_window= tr_gen.FWHM*1.5*tr_gen.N_tbins*1.0/tr_gen.tmax,\n", " ymax = ymax, ls='--')\n", " ax1.set_title(r'Final EDH boundaries for $\\Phi_{sig}$ = %.2f, $\\Phi_{bkg}$ = %.2f, %d pulses'%(data[\"alpha_sig\"][ROW,COL], data[\"alpha_bkg\"][ROW,COL], spc1.N_pulses))\n", " # fig.savefig(\"Temp.png\")\n", "\n", " fig_, ax_ = plt.subplots(1,1, figsize=(8,4))\n", " plot_edh_traj(ax_, edh_list, gtedh_data[ROW,COL,1:-1], ewh_data[ROW,COL,:])\n", " ax1.set_title(r'EDH CV trajectories for $\\Phi_{sig}$ = %.2f, $\\Phi_{bkg}$ = %.2f, %d pulses'%(data[\"alpha_sig\"][ROW,COL], data[\"alpha_bkg\"][ROW,COL], spc1.N_pulses))\n", " plt.plot()\n", "\n", "else:\n", " print(\"Incorrect Sensor choice\")" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }