{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "f17fa3bf", "metadata": {}, "source": [ "# Ray Data" ] }, { "attachments": {}, "cell_type": "markdown", "id": "1e82f2f5", "metadata": {}, "source": [ "There is research about using 1D rays to explore CSDs rather than taking a full\n", "2D CSD scan.\n", "\n", "QDFlow contains built-in functions for generating data along 1D rays for these\n", "applications." ] }, { "cell_type": "code", "execution_count": 1, "id": "7fbd2fed", "metadata": {}, "outputs": [], "source": [ "from qdflow import generate\n", "import tutorial_helper\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.stats import qmc" ] }, { "cell_type": "code", "execution_count": 2, "id": "35bb864a", "metadata": {}, "outputs": [], "source": [ "# Generate a full CSD to aid in visualization, this may take ~ 20 seconds\n", "phys = generate.default_physics(n_dots=2)\n", "V_x = np.linspace(0., 15., 80)\n", "V_y = np.linspace(0., 15., 80)\n", "csd = generate.calc_2d_csd(phys, V_x, V_y)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "01cdec91", "metadata": {}, "source": [ "Rays are generated starting from a central point, and extending outward in\n", "various directions.\n", "\n", "First we will create a list of central points from which to build the rays.\n", "We will use a sample of quasirandom points; however, points can be selected in\n", "any manner you choose.\n", "\n", "Then we will define the rays as an array of displacement vectors\n", "`[delta_x, delta_y]` that will all be added to each central point." ] }, { "cell_type": "code", "execution_count": 3, "id": "8a8deb79", "metadata": {}, "outputs": [], "source": [ "# Generate quasirandom points inside a given area\n", "v_min, v_max = 3., 12.\n", "num_points = 10\n", "point_generator = qmc.Halton(d=2, scramble=False)\n", "initial_points = qmc.scale(point_generator.random(n=num_points), v_min, v_max)\n", "\n", "# Define a list of rays that will extend out from each point\n", "ray_length = 3. # length of rays in mV\n", "num_rays = 8\n", "rays = ray_length * np.array([[np.cos(2*np.pi*i/num_rays),\n", " np.sin(2*np.pi*i/num_rays)] for i in range(num_rays)])" ] }, { "attachments": {}, "cell_type": "markdown", "id": "60f5a7ab", "metadata": {}, "source": [ "Now the ray data can be generated using `generate.calc_rays()`.\n", "\n", "The results will be returned in an instance of the `RaysOutput` dataclass,\n", "which is similar to the `CSDOutput` dataclass we have been using so far." ] }, { "cell_type": "code", "execution_count": 4, "id": "add009c7", "metadata": {}, "outputs": [], "source": [ "resolution = 50 # points per ray\n", "\n", "# Generate ray data, this may take ~ 10 seconds\n", "ray_output = generate.calc_rays(phys, initial_points, rays, resolution)" ] }, { "cell_type": "code", "execution_count": 5, "id": "d1abf665", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnkAAAEiCAYAAACFqMQIAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAV9ZJREFUeJztnQm8TPX7xx+7a8++ryWKEFnSQmTJT4SWX/YkSipR4o8sISmJRLKlSCUUPxVSKFSIsoZsuZaQ3bXd+b8+j850Zu7M3Jl7z9w5Z+bzfr3OvTNnzpzznTMz3/mcZ03ncrlcQgghhBBCoor0kR4AIYQQQgixHoo8QgghhJAohCKPEEIIISQKocgjhBBCCIlCKPIIIYQQQqIQijxCCCGEkCiEIo8QQgghJAqhyCOEEEIIiUIySpSTmJgo8fHxkjNnTkmXLl2kh0NIzIK662fOnJGiRYtK+vS8vow0nBsJif75NOpFHgReiRIlIj0MQsg/HDhwQIoXL87zEWE4NxIS/fNp1Is8WPDAww8/LJkzZxankCdPnjQ5jtm6GcoxQ7GKXnfddRIukhuzeZzmDn7+xh+u8271fq3YX1qP6fTp03rBZXwnSWQx3gf8SOTKlYtvByEOItj5NOpFnvFjDoHnJJGXJUuWNDmOWexkzZo1Rc9Ljri4OAkX2bJls1TkZc+eXcJBjhw5LN2fFULJ6h/2YPfHsAl7YLwPeN8o8ghxJsnNp1Ev8pzK33//neo3159lxd/zjGMGY90LRjAZnDhxwue2Vlj4zOcpuf0FIy5C2V8ohGu/dhqTHV8jIYTEMox+JoQQQgiJQijyCCGEEEKiELpro5iTJ0/6XJ+cK83sik3pPiLtLsybN2/IbmV/+7Pa9WjF67a7q5WuW0IIiTy05BFCCCGERCEUeYQQQgghUQjdtQ7DivITVrsLzfjaXySyWo2MXsNtmxpCea2x7Lr19z4bLn/UdSLO48gRkalT/71vfpuN2/7+e99G9AQ+BvhI4GOG/1euoIzLvwuqDWXIEHhMKPCPykyoeIQqSlgyZfr3eMmNy9gGxz537t/l/HmRq1cDHxvPw3G9x2yMA4+hKEEy1Z0ISRMo8gghhPjl8GGR//s/nqBQQJnTxYtF7rmH541EFoo8BxDO4rFW79uX1StUa1pyCQ+hFDi2uxXO6v1Z/XqZQEHw9X388WvnwfR1c9/299/fOtTxxscR1i78z5hR5MyZaxY+LLjtax9mEhNFLly4ZnkzrHCwwGHb5MZl3gYWQVjeYIkzrIK+rIjmqQXHxvGM8WIxWwLPnhW5eFHk++8p8kiMi7yVK1fK6NGjZf369XLo0CGZP3++tGzZ0ue23bt3l3fffVfefPNNee6559J8rIQQEoug9fd770V6FM6hd2+RMWOuiT5CYjrx4ty5c1KlShWZMGFCwO0g/tauXStFixZNs7ERQgghoWJ0RoRFj5CYtuQ1bdpUl0AcPHhQevbsKV9//bU0a9ZMYgX29wzOVZjS82RHV2ta7C81+wpX3UBColHk0ZJH7ICtY/ISExOlffv28sILL8jNN98c1HMuXryoiwEz+gghhKQVFHnETti6Tt6oUaMkY8aM8swzzwT9nJEjR0ru3LndSwkElBBCCCFpAEUesRO2teQhGeOtt96SDRs2hOSS69evnzz//PMeljwIPdTqymQUUgqSWHBLGfXkrKopF65j+HNf2qVuYFrszy5jY8YtIf6hyCN2wraWvFWrVsnRo0elZMmSas3Dsm/fPundu7eULl3a7/OyZMkiuXLl8lgIIYSQtADlWABj8ogdsK0lD7F4DRs29FjXuHFjXd+5c+eIjYsQQgjxBy15xE5EVOSdPXtWdu3a5b6/Z88e2bhxo7r0YMHLly+fx/ZwtxYuXFhuvPHGNBmfv8KyVme+5kFVUGbUpuh9sdrFHO2uVqv3R9etf/bu3SvDhg2T5cuXy+HDh7UEVLt27eT//u//JHPmzH6fV69ePVmxYoXHum7dusmkSZPc9/fv3y9PPvmkfPvtt5IjRw7p2LGjxiPD40EiC0UesRMRnRHWrVsn9evXd983YukwYc2YMSOCIyOEkNSxfft2rRCAIu7XX3+9bN68Wbp27ar1QV9//fWAz8V2Q4cOdd/PZmqEevXqVS0nhQve1atXayH5Dh066EXwiBEj+LZFGNbJI3YioiIPV6zmtlTBXBkTQogTaNKkiS4GZcuWlR07dsjEiROTFXkQdRBxvliyZIls3bpVli1bJoUKFZKqVauqxbBv374yePDggFZCEn5oySN2grZ9G4DMX6uwotitVftzenZwtLtard4fXbfJc+rUqaA+p7NmzZIPP/xQhV7z5s1l4MCBbmvemjVrpHLlyirwzPHKcN9u2bJFqlWrlqL3j1gr8i5dErly5VpvXkIiBT9+hBCSBiD+ePz48cla8R599FEpVaqUxvD9+uuvaqGDBXDevHn6OOL7zAIPGPfxmD9YKD5tRZ6RYZs7dxodmBAnlVAhhBA78tJLL2nyVaAF8Xje7Rnhun3wwQc13i4QTzzxhFrmYK1r27atzJw5U/t37969O1XjZqH4tCFLFpH0//yysowKiTS05KUAcxyh3XrM+ssITmnv11D3Zwf3qhm7uDJjbX/R7LpFrc5OnToF3Abxdwbx8fGaYHb77bfL5MmTQz5erVq13JbAcuXKqQv3p59+8tjmyJEj+t9fHF+gQvHEWjClolbe6dMUeSTyUOQRQkgIFChQQJdggAUPAq969eoyffp0SW+YeEIAZaVAkSJF9H+dOnVk+PDhWiy+YMGCum7p0qVa+P2mm24KWCgeC0kbly1FHrEDFHkxgj+LnBVtxlJqObTaSpgW2NFqZvf9Gfs4c+aMxBIQeKgggPg6xOH99ddf7scMixu2adCggbpka9asqS7Z2bNny3333ad1QhGT16tXL7nrrrvklltu0ec0atRIxRwKw7/22msahzdgwADp0aMHRZxNYIYtsQsUeYQQEgZgXYOLFUvx4sV9hnxcvnxZkyrOnz+v91H+BKVRxo4dq/X04E5t3bq1ijiDDBkyyKJFizSbFla97Nmza21Rc109EllYK4/YBYo8QggJA4jbSy52D324zTG+EHXe3S58Aevg4sWLLRknsR5a8ohdoMizYfJErLceC6U+XVonjvjbdyztz87udELsAEUesQssoUIIIYRYCEUesQsUeYQQQoiFUOQRu0B3LQk7Ka2NlxqXb7S4Rq3enx3HRki0gTp5gMWQSaShJY8QQgixEFryiF2gyCOEEEIshCVUiF2gu9bmbcrCTTjbjFlJWrVDs6M7k65WQpwFLXnELtCSRwghhFgIRR6xCxR5hBBCiIVQ5BG7EDPu2lOnTknGjNa8XGYURhYnum7t7AZOzf6YaUtIUijyiF2gJY8QQgixEIo8YhciKvJWrlwpzZs3l6JFi2rCw4IFC9yPoXF33759pXLlytqAG9t06NBB4uPjIzlkQgghJCCsk0fsQkTdtefOnZMqVarIY489Jq1atfJ47Pz587JhwwYZOHCgbgO30LPPPiv333+/rFu3TiKJv36oVhKtLmGrXa1p0ZvWLq5Ru++PrltCrkFLHrELERV5TZs21cUXuXPnlqVLl3qse/vtt6VmzZqyf/9+KVmyZBqNkhBCCAke1skjdiGj05In4NbNkyeP320uXryoi8Hp06fFiaTUWpgaq05yx4xW66ITrWZ235+vz9LZs2dTNS5CnAItecQuOCbxIiEhQWP0/vvf/0quXLn8bjdy5Ei1AhpLiRIl0nSchBBCYhtD5F26JHLlSqRHQ2IZR4g8JGE89NBD2pli4sSJAbft16+fWvyM5cCBA2k2TkIIIcQQeeDcOZ4PEjkyOkXg7du3T5YvXx7QigeyZMmiS6xy8uTJkLYPxR1ndZJDOAP1fY3VLq7MWN4fIbEAfoLSpxdJTLwm8nLnjvSISKwSksjbtm2bzJkzR1atWqWiCxmwBQoUkGrVqknjxo2ldevWlgosQ+Dt3LlTvv32W8mXL59l+yaEEELCAVqgw5p35gwtecQB7lqUMmnYsKGKue+//15q1aolzz33nAwbNkzatWunbtT/+7//01p2o0aN8kh8CAQCsTdu3KgL2LNnj95G9iwEXps2bbRcyqxZs+Tq1aty+PBhXS4h0IEQQgixKayVRxxjyYOFrk+fPjJ37tyAma1r1qyRt956S9544w3p379/svuFgKtfv777/vPPP6//O3bsKIMHD5YvvvhC71etWtXjebDq1atXT2IdZBrbgVCycv2N2Yp9ON2V6ZT90W1LSPIww5Y4RuT9/vvvkilTpmS3q1Onji6wwgUDhBqsgP4I9BghhNiZvXv3qrcDscTwQMDTAc8HvB6ZM2f2+5wyZcr4fOyTTz6RBx980O+FzkcffSSPPPKIxa+CpBTWyiOOEXkQeChEjAkqkCXPvD0hhMQy27dvl8TERHn33Xfl+uuvl82bN0vXrl2108/rr7/u8zko+XTo0CGPdZMnT5bRo0cnKRw/ffp0adKkift+MHMzSTtoySOOSrzA1eeLL74oLVu2lMcff1zuueee8I6MRA1mt2FKW5lZsQ8nukat3p8dxxatQICZRVjZsmVlx44dWgbKn8jLkCGDFC5c2GPd/PnzNQEthxHk9Q8Qdd7bEvtAkUccVScP7oZJkybpVea9996rLgW4IliHjhBCggO1O0O5SFm/fr0mo3Xp0iXJYz169JD8+fNrq8dp06YlG96ChDh0ADIvJHxQ5BFHiby4uDjp0KGDJj2gpEn79u1l6tSpKvZwtfrpp58GHYtHCCGxxq5du2T8+PHSrVu3oJ+DObZixYpy++23e6wfOnSoxuihvzcS45566inddyDYDShtocgjju14AbcDJhmUPPnyyy+1fl2nTp2kWLFi1o+QeICAa2OxArjejCVWsfochGt/Vu7LrvtzAi+99JLH99DXgng8MwcPHtSLYSROIC4vGC5cuCCzZ8/2acUbOHCg1K1bV8taod0jQmkQtxcIdgNKW1hChTi+4wUms4wZM+p/uApoySOERDu9e/fWi9rkLoQN4uPjtVQUrHFIoggWlKxCwXl4UJIDtUsRPgOXrL+C9LHeDSitoSWPOFbkIQ4PmV0zZszQwsV33XWXvPfee+o2IISQaAZdfrAEAyx4EHjVq1fXOTM9el2F4Kq9//77gzoW4vaQBEMRZx8o8oijRB66TMybN08DfFH3qUiRIlq0+LHHHvO4aiUkECdOnEh1lqwV+/BHLGW12n1/TgcCD7VAS5Uqpdm0f/31l/sxIysW2zRo0EBmzpypCRTm+L2VK1fK4sWLk+x34cKFcuTIEaldu7ZkzZpV4/JGjBihBeuJfWCdPOIokYdJCa6D//znPzrJoFdtKFelhBASKXAxim48OXPm9FiPmnU9e/bUi1ergfiCWMNSvHhxj8eMTFiEuKCsCuZWMxgPntOoUSOfdUgnTJggvXr10v2gBt+YMWOCjvUjaQMtecQOpHMF2VYCkwgyaoN1U9gFlAnInTu33HLLLVqDygoiaaVIi1ZmafX6rLbCWb2/cJ2PWN0felXffffdWkYkV65ckpbgu4/yTwULFvRYf+zYMb2AvXLlisQaxtwYifcjFpg+HRcXIqhh7cMgS0iafH+DtuQZfWXNYNJGRXcznCwIIXaaCHEdi+XMmTPq3jS4evWqukO9hR8hVkBLHnFk4gXKpjz99NPy3XffSUJCgns9JlFYmTBxEkKIHUBXCKOsSfny5ZM8jvVDhgyJyNhIdEORRxwp8tC/FoIOMSOFChVKE/eh3fBVE8zq8+CvD6XZux6L5z4SCRl2T1Bwyv4Q/5bWoHg7vjNow/jZZ595fC4yZ86sSRFFixZN83GR6Id18ogjRd6mTZu01c6NN94YnhERQohFIAbQ8ECULFmSF0YkzaAljzhS5N12221aJ48ijxDiFPbt26eLP1DrkxArYQkV4kiRN2XKFOnevbvWd6pUqZKm85tBFquTsYsL9OTJk6neR0pdbf5aVFmddRnOumq+XoOdXZmxsr9IgXp1gb7rjCUmVkNLHnGkyENBz927d0vnzp3d64y2Zky8IITYEW/Rj/p0v/zyi/aAHT58eMTGRaJf5F26JIIKPRlT1USUkJSRMSVFRdEU+6OPPorZxAtCiLNAPSlv7r33Xk2+QHkoxBkTEg6RB5Bz5OMjSIj9RB7iWr744gutsk7sjT+3q5lQXHDB7C+5/fq7KAiXe9VJrkyn7M/JbltvcKGKjhOEWE2WLCJoCoVSshR5JFKE3JcMpQiQYWsF6M3YvHlzLWGAH/8FCxZ4PA4X8KBBg7RPblxcnDRs2FB27txpybEJIbHDr7/+6rFgDvvqq680vrhq1aqRHh6JQnA9y7g84jhLHkQZeib+9ttvUrly5SSJF/fff3/Q+0LdrCpVqqgLuFWrVkkef+2112TcuHHy/vvvS5kyZTR+Bj1zt27d6lG5nhBCAgEhZ8QOm6ldu3ZY+tYSYtTKO3PmmiWPEFv3rjVID/uzv52louMFnjt//nxp2bKl3sewYOHr3bu39OnTR9ehRxvcKzNmzJBHHnkk7L1rYyHeMFyuN3/nzorjhbKPYN5Dp/R+tdu+Qt0fLupatGgRkV6p3uVTMI+hD3csXyyyd234ueEGkV27RL7/XqRu3TQ4IIkZTlvdu9bAu1dtuEDx0sOHD6uL1gAvqFatWrJmzRq/Iu/ixYu6mE8EISS2QWcLQtIa1sojjovJSysg8AAsd2Zw33jMFyNHjlQxaCwlSpQI+1gJIfZnxYoVGm6CpDEsCC1ZtWpVpIdFohjG5BFHiLw5c+YEvUN0w/jhhx8kUvTr10/Nl8aC8aQUuIyNhdgHZHkmt6R0f1aPz8r9Wbkvu+4vXHz44YfqFciWLZs888wzuiCZq0GDBjJ79uxID49EKRR5xBEib+LEiVKxYkVNhNi2bVuSxyGmFi9eLI8++qjceuutcvz48VQPrHDhwvr/yJEjHutx33jMF1myZFH/tHkhhMQ2KHiM+evjjz92izzcfvXVV2XYsGGRHh6JUijyiCNEHtwco0aNkqVLl2orMwinG264QbNrixcvLvny5dMMWTQA37x5c0gZtv5ANi3E3DfffOMRX/fjjz9KnTp1JC1A0L6xRCvhssT4s4KmteUnVGssrXDRyR9//KGuWm8wVyH+l5BwQJFHIk3QiReYDLEcO3ZMvv/+e81Wu3DhguTPn187YGAJlHnri7Nnz8oupB79AybbjRs3St68eVUwPvfcc/LKK6+ooDRKqCDj1sjAJYSQYEBsLi4YvYu4L1u2jHG7JGxQ5JFIE3J2LUSdVSJr3bp1Ur9+ffd9tBcCHTt21DIpL774opZdeOKJJ+TkyZNyxx13aAHTWC57QAgJHZRigosWF5G33367rkPsMOaZt956i6eUhK1OHmCdPBIpItoyuV69egHdaHCTDh06VJfUEu1uVztjfo+d9B5Y2cbLKS3LUrM/q8dkJU8++aSGf7zxxhvyySef6DrEGSMuD7X7CAkHtOSRmBZ5hBCSVjzwwAO6EJJWsE4eiTS2rZNHCCFOB3HMiC9GiAl6cLdv317i4+MDPichIUF69OihCW05cuSQ1q1bJ6kysH//fmnWrJmWhClYsKC88MILcuXKlTC/GhIqtOSRSBMzljzE9HknhuTJk8dxLkQ7uidTev7C6d7z9VpS6ja2o2vU7vuzg+sWxw32fT5x4kRYxoCY4/79+6vAO3jwoLZobNOmjaxevdrvc9Ab/H//+598+umnWtD96aef1t7eRv1RtI6EwIP7Gfs5dOiQdOjQQfuIjxgxIiyvg6QMijziKJF3+fJlqVChgixatEjjWQghxK6MHTvWfRu1O5Gp37hxY3cJJrRH/PrrrzVrP1xAsJlbq7300kuauIa5FKLMV83RqVOnaoHme+65R9dNnz5d59u1a9dK7dq1ZcmSJbJ161bNDEYHoKpVq2qtv759+8rgwYMlc+bMYXs9JDQo8oijRB4mJbgSCCHE7iBL3wAuTyRwwSpmgGzbt99+W8WSWYyFC1gLZ82apdm9vgQeWL9+vQpAc89uXFjD5QtRCpGH/6hRam75CPGK5JItW7ZoOStfsK932kORRxznrkWsCAojT5kyRTJmzOh4F25aYreMQ6vwlSEdrS5wO7pG7b4/Yx/nz5+XSAGLHeYtb5o0aaLWtXACCxvEJF4/RBo8If5AX25Y4oxQEl89u/HfV09v47FAfb2HDBmSyldDQoEijzgu8eLnn3+WefPm6ZUlrh4RK2JeCLEUl0uyXLmiC24TkhKQxPD5558nWY91eCwUIArN3XB8Ldu3b3dvj6SIX375Rd2sGTJk0Pi5SPTDtrKvNwkO1skjkSZkUxyuMOH6ICQtyHL1qnwwf77ebv/AA3LR4dZjEhlgwXr88cflu+++k1q1auk6tEhEcfX33nsv5MLKnTp1CrhN2bJlPQrIYylfvrzG1qH7BuLrfLVnRDLFpUuX1MtgtuaZe3bj/08//eTxPCP7Nrm+3lhI2kFLHok0If9iIgiYpIxw9mu10hVsHqfZ7ertQvKFsb1dCiD7czdaMT47ukbTYn9ODDuAKIPAGjdunHoiAO6jRaMh+oKlQIECuqSExMREd3ycL6pXr67xemjBZlxM79ixQ0umGKIQ/4cPHy5Hjx7V8ikAfcXRU/ymm25K0bhIeGCdPBJpUmQWQT0mXBHv3r1bHn30UcmZM6fWfsIkg7pOhBBiNyDmkPiQVsBSiPAWtGOEMMZ8iUzecuXKuQUbyqo0aNBAZs6cKTVr1tSSKV26dNEWj+jhjTm1Z8+euj3i+UCjRo1UzKHm3muvvaZxeAMGDNB4aVrq7CnyLl3C76YIHRHE9iJv3759GqyMK0tcjd57770q8hDUjPuTJk0Kz0gJIcQCUCEALlEzEFNWg0LFsBq+/PLL2oMbtfIwd0KQGWIMmbSw1JmTUt58802t6QlLHuZUxD6/88477scR14fkDWTTQvxlz55dM4mtaP9IwiPyjP61uXPzDBObi7xnn31WatSoIZs2bfIIWEa7oK5du1o9PhIGV3Ao7jazWzOYbGQriuemdl+h4i8IPhoLJkdibMb5jUSygQFE1Isvvqh9a1EzzxsUGLYalDlZvnx5wG1Kly6d5LygO8aECRN08Qdq7i1evNiysZLwAC2PGvzw0lPkEUdk165atUqvRL0LbmKyguuBEELsBjJcIbgmTpyoVjSUgEIyRtGiRdVVSkg4wHUiky+Ioyx5CBz2ddX7559/qtuW2J+UWomCsXglZ1EM5XjYV1bTZw2WxIQMGVK1v1DGlNL6f3a2woUTf8ksxu1IJuAsXLhQxVy9evWkc+fOcuedd8r111+vFjHE6bVt2zZiYyPRDUTemTPXLHmE2N6Sh6Bfc7sgTNxnz57VuJP77rvP6vERQogl3SaMsiaIvzN61SIpYuXKlTzDJGywVh5xlMh74403tFE2srsQwIzsWsNV66uiPCGERBoIvD179rjbhCE2z7DwBVMaiJCUwjIqxFHu2uLFi2vSxZw5c+TXX39VKx5S/uHuiIuLC88oSdjw5VoMp1stnAkKaeHGtSJJI5JYcb7MGBYxgJIfgc5TJBMv4KLFvHX33Xdrx4rmzZtrqzFkt44ZMyZi4yLRD2PyiOPq5KFnbbt27awfDSGEhIFevXq5bzds2FDbjq1fv17j8m655RaecxI2KPKIo0TeF1984deSgdR/TJplypSxYmya4DF48GD58MMPteAnMuFQuR7ZvU6xnBBC7AXCTJBwgYWQcEORRxwl8lq2bKkCy9v1YqzDfwQzL1iwINXuOMT4oeTB+++/LzfffLOsW7dO3S6oCv/MM8+kat8ktCzJUgkJsi9rVsecNisyUo19XLhwnWTMeEEyZUrweNxfmzRf7kyzKzO14/HGLlm3ZtetXcZkvmAcMWKEFmtHn9fff/9d4/TQgQIxxQg5ISQcUOQRRyVeoEfibbfdpv9PnTqlC26jZRCqsCNTDcVG+/Tpk+rBrV69Wlq0aCHNmjXTibhNmzaa3evdnJuEl7tPnpSPt2yRx+PjY+5Unz+fV777brCsWtVfLl92jsglnqDX64wZM7QNmLnGZ6VKlbRmHiHhgiKPOErkoeMFApXRbxF18bDg9ujRo7XgaN26dbXECoRfarn99tu1UTeuugECp9FQvGnTpqneNwmeEgkJavLtfuhQTAk9CLwVK16Ws2eLSELCdXL5sqlHEXEUqJE3efJkTRBDWzCDKlWqaHweIeGCIo84yl2LJtu++jxi3R9//KG3b7jhBjl27FiqB4csuNOnT2vJA0zMcLngijxQ4VL0esRigOeTlAM35AeFCkk6l0uejY9XoQemFC1qu0zbcAm87NmPyN13D5Fs2ZK2w0ptFmpak5xbOZjxBZMla7f3FiWeEC/sq7g7MmwJCResk0ccZcmrXr26Wuz++usv9zrcRl9IuHHBzp07pUSJEqkeHGpZoRr97NmzZcOGDRqb9/rrr+t/f4wcOVJj9ozFinEQkZmFC8u4YsX0VES7Rc+XwMuePfUXLSRyoK4nWjJ6M3fuXKlWrVpExkRiA9bJI46y5E2dOlXj5FAvzxBQBw4c0CDmzz//XO+jdh4yYFMLxCSseY888oi74fe+fftUyHXs2NHnc/r16yfPP/+8hyWPQs86oQeeOXjQUouenaDAi04GDRqkcwYserDezZs3T3bs2KFuXMQSExIu6K4ljhJ5N954o2zdulWWLFnijpXDunvvvVfSp0/vzsC1gvPnz7v3aQC3LSZpf6D5OBYSOoaLLZC7zmlCLxS3YVoJvFBdt8m5R4PZXyiFiP1lyfrqQRuK6/bChQsSKXBhiu4WQ4cOlezZs6vou/XWW3Ud5i5CwgVFHnFcMWQIryZNmugSTlCVHjF4JUuW1BIqv/zyiyZ9PPbYY2E9LgmM04ReMNCCF71cuXJFy6dg3rAiIYyQUKDII44Tech4xXL06NEkVrVp06ZZNTYZP3681rF66qmn9FgohtytWze9CieRJZqEHgVedIMOPSid0qFDh0gPhcQgFHnEUSJvyJAh6vKoUaOGFClSJKydJ1CeBeVYsBD7EQ1CLzUCz4oMUrNrNJy9ZFOK3bJkUwrKPK1YsULrbRISTSLPV8QEG0KRFIs8VIxHUdH27duH+lQShThZ6NGCFzugtiaSuH777TetEIC4PDP3339/xMZGohvjo7Z7t8itt14TYOYFYefe6wyR5v04OHtW5ORJkVOnrv2/dCn5MeTMKYLrG3QcxYKcSdQEN+/7zBlUyhA5evTa/7g4kffew8ViGE8OsZ/Iu3TpkhYpdhonT54Mi9XRydYNq6xBVgi9tLYY2V3gWW0ltOKcWtEqLlIg5AMgptcbzAuowUlIOIC4gqCCGPvll8icYwi43367toRCixYijHKIMZH3+OOPa906xMoR4kSLnt0FHrGeQBn5hISTAgVEtm1D/dhrrlVfCz6e/h4zL0Zx5dy5RfLkufYfFjez/cLbfYv7x4+L7N0rsmfPteXgQfRz/ve4+A9rH8aK5dNPRdavRwkyfjZiTuQlJCRoe6Bly5bJLbfcIpkyZfJ43NeVMokNnCD0KPAIIWlN2bLXlkhRsKBIxYrBbw9RCpEXrjhCYmOR9+uvv0rVqlX19ubNmz0eC2cShl0xu9UiiZUuNPP7GKrb0M5C79ChDLJ+/UC5cMF6C57dExSsdLXa/bXaCcT6bdy4UasD4Fw1bNhQRo0apZUC/LnYX375Za1Dun//filQoIDWHR02bJh28Ak013700UfuwvGEWNGKDfF/JMZE3rfffhuekZCowY5CLyEhv6xf/7pcuFBM4uIOyd13D6OLloSd+vXrS//+/bUSAbpt9OnTR9q0aSOrV6/2uX18fLwuaN+IVmzo8NO9e3ddhxZsZqZPn+5RqzQP/HeEWADLvsR4nTxCnCT0vAXerbf2kezZ2ZSehJ9evXq5b5cqVUozfGGZu3z5cpJQF1CpUiX57LPP3PfLlSunBeHbtWunRZ1R888s6gr/8z0jxEoo8mJY5OHKNJBbdvny5akdEwmz29ifiy05d3swxzDvO6VCz3ycrKnMevQl8OLijmKkEotY7Wp1gusW4gjJYo0bN5ZChQpFbBxwxc6aNUurE/gSeP44deqU5MqVy0PggR49emgiHPqGw9rXuXPngN/hixcv6mLu602ILyjyogfPxrBBgHi8KlWquBe4FFBWZcOGDVK5cuXwjJI4Fgi9ccWK6W0Ivcfj49Ps2P4FHoklII4ggpA0Fgn69u2rdfny5cuncXaff/550M89duyYxuM98cQTHutRkP6TTz7RNm2tW7fWEjHoEBSIkSNHalyfsZRAsTRCAsTkMfEiBi15b775ps/1gwcPlrOM0iQ2cd1S4BEzNWvW1AQIuExTC1yuSJ4IxLZt26RChQp6+4UXXpAuXbpofB06BqG92qJFi5K1nMPS1qxZM72QxvxqxlzCqlq1anLu3DkZPXq0PPPMM373169fP3n++ec99k+hRwJZ8viT7nwsi8lDzAgmUgQME3vjz+1qdRssM29lySIX8uaVvidOqNC7kJAgs0KsKYB9J2TI4Pdxw10YjMAL1fUc6jhTuw9f+7OrO9QJrltYuiBwDhw44LPjBcpBBUvv3r2lU6dOAbeBC9Ugf/78upQvX14qVqyowmrt2rVSp04dv88/c+aMJlWgteP8+fOTde/WqlVLLX5wx2bJksXnNljv7zFCzNBdGz1YJvLWrFkjWbNmtWp3JAqZ/E/2H4Rer7//lrj4eMsterTgEV8YpUXMli5Y0lwuV8gdL1DWBEtqijKbY+O8gYUN8YMQZF988UVQ8yqslBDWFHHECijyYljktWrVyuM+JslDhw7JunXr2AWDhCT0rHbdUuARf+xBmf805scff5Sff/5Z7rjjDhVgu3fv1jkSGbOGFQ9lVRo0aCAzZ85UTwgEXqNGjeT8+fPy4Ycf6n0jQQLCMkOGDLJw4UI5cuSI1K5dWwUg4vJGjBih5VkIsQKKvBgWeeaCnCB9+vRy4403aiAwJidCQhV6KXHdenPpUkHZvHmUXLxYTDJn/lPKlUOg/WGJi0u529CXSzcYNyQufHz1j02pi9zYn799pdTNHmqPYie7bq2IxQuVbNmyybx587S4MWLmUCsPLtgBAwa4LW4opbJjxw4VdQAJbBCH4Prrr08iVEuXLq2u2wkTJmh5Fnw2sB06DXXt2jXNXyOJTph4EcMiDwU4CbGT6xYC7/ffJ8nFiyVV4JUv312yZDnMN4l4AEva2LFjNSkCIKHh2WefVctaOEC1geRKSkG0mS8K6tWr53HfFxCK5iLIhFgNEy9iuIQKIVYKvVH/WJBSWl6FAo8Ew9dff62i7qefftIkCyywmN18883q7iSE+HbXJnPNQaLBkgd3S7B9aZNzTxFiVYxeMAIvNW5Dw6Lir5evmZS2lPL3fQllrMF85wx3rD8rUSj78EdyFqhIgrIncG+++uqrSdajjt29994bsbERYleRh680ykvGxUV6RCSsIg8uDkLCKfTi4uJCqqNHCx4JBbhoUTzYm8cee4zzGyFemCsMwZpHkRflIq9jx47hHwmJOIY1x+ogfKsLJqdU4PmzNCVnpTY/L1iLtt0SF4z3NjX78mXtC2Z/xvMi1XHCyExFmZEbbrjBYz3WFSxYMGLjIsSOoBwpKvfgKwuRlz9/pEdEwp54gfpOqKiOuk1oY4a0f2SNwQITTlBiAO6UL7/8UjPQkEmG5I8aNWqE9bhEbCH0PihYRL6Tu+WQFJFTZ7KLxB2WnTvfYZIFCQlknqI12B9//KG9Y8EPP/ygnSvMXSAIIf9a8yDy2PUiRkTe8OHDtbVOw4YNVdi99dZbcvToUZk2bVpYrRl169aV+vXrq8jD1fjOnTttUZKBhF/oFTxUW7YdeVvqyz8Wvd34c0U/tsyiJaGA+nToHvHGG29oey9QtGhRndMCtQIjJJZF3vHj7F8bMyIPxTrfeecd6datm95ftmyZ9lWcMmWK1soLB7jKRgsgc9mWMmXKhOVYxF5Cb9OFpjL9xLviutYgwOsj65JChd4PuUyKP1drKO5Yfy5fu9WF84dTxmk1eF+ReIEFLcMARB8hxDcsiBxjIm///v1y3333ue/DooeJMz4+XooXLx6WwcE1jPY+Dz74oKxYsUKKFSumPShZ9DOFuFySLYjN4v5pvZSWZDW1lXK50suHZ4bJNTnl6wLCJUcOd5ESeedJunSJKTpGMCIvpdmiWa7A2niNiwhuSaM4PuKfCxcu6PuJAsUQd/v27ZOpU6dqWRUWcSckKRR5MSbyrly5kqSHIiqvo2J7uED8zMSJEzVmpn///toiCK6VzJkz+00GQU9Ic19IoyUQERV4B0+dSv5UBLNNGEEMXn255rb1TXq5dLmwDN+UU+rJCrEz7Vq2lIsZLWsRTVJIixYttCVj9+7d5eTJk9pCDPPIsWPHtFvEk08+yXNLiAl2vYgOgv71wVVwp06dPBpgI1sOk2Z2U7412vhYBZI9kGCBvoygWrVqsnnzZpk0aZJfkTdy5EgZMmSIZWMgaQ+SLKzcjoQPp7h/0S7szTff1Ntz586VwoULyy+//CKfffaZDBo0iCKPEC/Y9SLGRJ4vUdWuXTsJJ+j1CHeKmYoVK+rE7A8EVZuz5WDJQ1wfEUF3zGJevYd9Eekf63QZsv+TZBGYEeWyy4ScVVN0DH/Fi61w15r3re5aEnGQmW/E4C1ZskSteoglrl27trpuCSGe0F0bYyIvEj1rkVmL5t1mfv/994DNxmFpNFsbiYl06VToJUfWMCXSBMsNcevkuPwph6WouHzE5KWTRMmT/pBkzv2rJKRLmYhK8CO+rBB5dM/aD5ReWrBggTzwwAPa4gwJGAAVAnLlyhXp4RFiOyjyogNb967FRLx27Vp11+7atUtmz54tkydPlh49ekR6aFHvgjOWtKbQlSsyeed2eVuMshbeiRXX7k9J7CmPHz6Y7P4g1IwlGELdPi2I1HuRGux2HuGS7dOnj5QuXVpq1aolderUcVv1EAZCCPGEMXnRga0jwm+77TaZP3++umCHDh2q5VPQYq1t27aRHhoJk8CbHR8vJa9ckQyZ/yfVCj0vmw+/pEkWBpkyHZUOOQdKqxPzReKvrZtahLF5JDBt2rSRO+64Qw4dOiRVqlRxr0dRd1j3CCGe0JIXHdha5IH//Oc/upDYEHilr1yRg5kzS7fy5SVdlu+lRt5mmkWLJAvE4MFFuzFdooyPKyY9Dx6UJ+OvKT0KPZIcSLbAYgZZtoSQpDDxIjqwvcgjaUda9WUNJPAOZMwoT5YvL4f/iatEHTyjTAqSLIwYvPf/+bGm0LNPZqx5f+bkE8NlG0nX7blz5+TVV1+Vb775RuPwkLnvXa6JEPIvtOTFqMhbuXKl9n7M6FX7C3X0Vq9eLXfddZeV4yNRjrfAe7RIEbkQZOIMhR4Jlscff1wLqrdv316z9iN1QUOIU6DIi1GRhz6yiGspWLCgx/pTp07pY1f9dBUgJBiBF58pk4RiU6LQI8GA3tf/+9//NGOfEJI8TLyIUZEHl4uvq+Djx497FEW2GxCh4cBfvTWnYBcXrSHwzG6/YFyI+DzOKFRI/z8THx8wRs/sLkTXg3C9h+EqEOyUwsN2BOcrb968kR4GIY6BlrwYE3koHmqIAu/OF7De/frrr+rGJSQ1Ai+lwKKHzyZj9Igvhg0bpmVU3n//fe1fSwgJDBMvYkzk5f6nUwKsIagcHxcX534MPSBROb5r164Sa5gtQpEkFGtUKNa7YOqzhWJVCkXgnThxQuK8AuQD4cuiN8Urm9LALvXb7EJKrYT+zmM4LaUp4Y033pDdu3dLoUKFtFYe+m57tz0jhPwLLXkx2vECEySKitrZNUtix4LnL0bPLfRcLpnCOnoxT8uWLSNyDu6//37ZuHGjZvRCPDds2FBGjRolRYsW9fucevXqaZKImW7dumnPboP9+/drv91vv/1WcuTIoW0n0bfbOyGOkJRCkRcdhDwjvPzyy+EZCYlq0kLg+XTdHjqk6yj0YptIzVtIRuvfv79m9B48eFAvkFGYGZUIAgGvCArAG5hdzAiPadasmdb8w36QCNehQwe1TqI7ECFWwMSLGBV5R44c0YnKqDfl7a5hdq393cZWBO2b33e4VQNRMVeukASePxcgXIoXvPrq+nstHq7bZISeP5e01bXjrNyv3bGjOxzfkblz56rb9oUXXtBEDLhp4cItVqxYWI5p9MgF6Ln90ksvqVXx8uXLSVzGZiDqvAs3G6AV29atW2XZsmU69qpVq2rMYd++fWXw4MEaPkOIVZa88+dFEDUT4ZbmJK1EHpIu4CoYOHAg602RZCmSmJhmFryArlta9GIaJIbBVYrY4r1796qlDCJv3rx5Op/NnDkz7GPAxdCsWbM0QS2QwAPY7sMPP1Sh17x5c51vDWvemjVrpHLlyirwDBo3bqzu2y1btvjtxXvx4kVdDE6fPm3ZayPRK/JwvXbhwr/3SZSLvO+//15WrVqlV4+EJCfwFp49K6UTE9Nc4BlQ6BHw/PPP6wXqa6+9poljBvfdd588+uijYT1JsLC9/fbbcv78eU1QW7RoUcDtMR5Y/RC3B3GK5+/YsUMFKTh8+LCHwAPGfTzmD8TsDRkyxJLXRKIfcxL6uXMUeTEj8kqUKGFLVwwJnpS6J0N53w2BVy4xUfalTy/Ns2WTA2fO+N0+pS7M5LJ/sd+UCr1wuVqtOP/JuchBKHXhgtl3SuvMGa/XbEVKa37++Wd59913k6yHmzaQMPIFXK5IngjEtm3bpEKFCnobruEuXbrIvn37VGQhfg5Cz1+W+xNPPOG+DYsd4vkaNGigbuZy5cpJSunXr5+KXbMlD/M5Ib6AexZFNGDFg8gjMSLyxo4dq5McJkxk2hKSrMDLkUMORDiggxa92AZ1PX25J3///XcpUKBASPvq3bu3WgUDUbZsWfft/Pnz61K+fHmpWLGiCqu1a9dKnTp1gjperVq19P+uXbtU5MGF+9NPPyWJlQb+4viMc2Cub0pIMMkXFHkxIPJgYTBfdaLZNyYbxIh4x5YEY2Eg0YsdBZ4BhV7sglImyFb95JNP9D7mM8TiwRXaunXrkPYFURiqMDRI/KfuYyhWTZRgAbDoAYjD4cOHa+Kb0V5y6dKlkitXLrnppptSNC5CfIE4vL/+oiUv6kUerHckNkmVi9YGAs+7yG9qhZ7VxaFD2XeoRYWTu+AKdZwp3Z/xGYpkmAeKIaN0CUTRhQsX5O6771Y3rSGYwsGPP/6obuI77rhDzw3crUigwAWyYcVDWRW4YpH4UbNmTd1m9uzZGiuYL18+jclDhu5dd90lt9xyiz6nUaNGKubat2+vMYZ4HQMGDJAePXrQUkcshV0vYkTkodAmIU4TeP6gRS/2QFYtrF0//PCDbNq0Sc6ePSu33nqrZtyGC3g6kCyBGn3wfsAS16RJExVkhtsUpVSQVIGkDIDyJyiNggtrPAeuXVga8RyDDBkyaEwfsmkhFlGYHnO0ua4eIVbAgsgxGJPnL+0e7g9MXKzRFHs4SeAZUOjFJnXr1tUlLUDSxPLlywNug7hms4UTos6724UvkH27ePFiS8ZJiD9YENn5hPxLDJcRXA/eC9ajny0mH1y5GrEnxDnAXYgFPzrGklYCzzh2MO7QlOJ9DAi9cf+0l4Lr9vF/3Lck9ec3lM9QOEFNOe+SJXCNlilTRl23yGSNZNYvIXaGljznE/Kv8YwZM7R+E1r1LFiwQBfcRimCiRMn6qQ5btw4efXVV8MzYmIbnGjB84ZCL7qBCxMFgg1+++03LWcCNy2qBCxcuFDrxxFCkkKRF4Pu2vfff1+DmB966CH3OlRkh2sCZVXQ7qxkyZIazAzxZyUQjqj19OyzzzIZJMJEg8AzoOs2ekFmKlp+GcyZM0dLkrz33ntu9yg8D2gHRgjxhIkXzifkX2U0xPbVNgfr4BoByCZDeYJwFDM1MsxI5IgmgRfLFr20cJFHGrw2c3cIxLs1bdrUff+2226TAwcORGh0hNgbWvKcT8i/zLjynTp1apL1WGdUTz9+/LilTdiRCde2bVu9+o6F5u52JhoFXiwLvWgHAm/Pnj16+9KlS7JhwwZtLWZw5syZZPvIEhKrMPEiBt21r7/+ujz44IPy5Zdf6lUwWLdunWzfvl3mzp3rtro9/PDDlg0S9Z+aNWumcTSvvPKKZfsloRHNAs9K1613bb5Y5OTJkymu72clqDdntCFD/DDKmtx5553ux1GHLjWtwgiJZmjJi0GRh8rxEHSTJ0/W+k4A7g9MoEabM9RvsgrE0ODqG8IxGJApZ86W81fyhYRGLAg8A8boRQ+Ix2vVqpUWP86RI4fGFJvLPE2bNk2LCxNCkkKRF4MiD6D8QFpkpCFWBkkWKGKaNWvWoJ6DcaEJOLGOWBJ4BhR60QF6xq5cuVJOnTqlIg+FhM18+umnup4QkhQmXsSIyINLo1KlSpI+fXq9HQgrEyPWr1+v/RlRmd7g6tWrOmm//fbbarHznrSRffv88897WPKMWEGSMvonJMSUwPMl9LoeOiTL8uSRvXFxaT4Oo9ZcON3A0e5iRscLX+TNmzfNx0KIU6AlL0ZEXtWqVbU/IoqH4ja6W/gqcor1EGFWgZ6OqGtlpnPnzlKhQgVtLO4t8AC6bhgtg4g19I2Lkwwul4yMi4sZgWcWeonp0smhzJkjIvAIISRSMPEiRkQestMKFCjgvp1W5MyZUy2IZtCnEY27vdeT8HE+XTp5yriki0E+MJXgIISQWIGWvBgReWhV5uu2NxcuXLBmVCSmMyMN12E43YbR7p4khJDUQpEXo4kX3iA2DjFyo0ePVrduOPnuu+/Cun9CCCGEMPEiGkgfipBDUkONGjXk9ttv15IpYPr06ZptO3bsWOnVq1c4x0oIIYSQNIKWvBiy5A0aNEjbiqEgMVqboSAykiDWrl0rY8aM0fu+EiEIiWWMBCUkJQW7rVNx+vgJIb4TLxCJlZgoEmN5d7El8lBPaubMmVoMefPmzVoq5cqVK7Jp06agfsAIIYQQ4hzM+Xbnz/8r+ohzCFqX//nnn1K9enW9jcxWlCmBe5YCjxBCCIk+UDXKsOGcOxfp0ZCwijzUvzO3A8qYMSMrxRMSgiszucWJOH38hBD/QOBly3bt9tmzPFNR7a7FJN6pUyd3oeGEhATp3r271q0zM2/ePOtHSQghhJA0By5aWPFoyYtykdexY0eP++3atQvHeAghhBBiE5hhGyMiD6VSCCGErllCYgeKPGfDhGhCCAkTqEZQsmRJyZo1qxQpUkTat28v8fHxfrffu3evJrP5WlDhwMDX43PmzOH7SCyHIs/ZWNLxghASuEWc1e3h0qotmxVWO2Osly5dklijfv360r9/fxV4Bw8elD59+kibNm201qgvSpQoIYcOHfJYN3nyZO0m1LRp0yTelSZNmkS0BSGJHZHHxAtnQpFHbM2FdOnk5n/6JeM2IU7C3AUIfb9feukladmypVy+fFkyZcqUZHsUlC9cuLDHuvnz58tDDz2UpJoBRJ33toRYjfGxY+KFM6G7ltibdOnkQvr0urgLNhHiQE6cOCGzZs3StpC+BJ4v1q9fLxs3bpQuXbokeaxHjx6SP39+qVmzpkybNi1ZqytaU54+fdpjISQ56K51NhR5hBAPWPvOWvr27aulpvLlyyf79++Xzz//POjnTp06VSpWrKjC0MzQoUPlk08+kaVLl0rr1q3lqaeekvHjxwfc18iRIyV37tzuBa5hQpKDIs/ZUOQRQkgIwOXqLznCWLZv3+7e/oUXXpBffvlFlixZou7YDh06BBXreOHCBZk9e7ZPK97AgQOlbt26Uq1aNRWRL774osbtBaJfv35y6tQp93LgwAG+7yRZKPKcDWPyCCEkBHr37q2F4QNRtmxZ9224VLGUL19erXKwoK1du1bq1KkTcB9z586V8+fPqyhMjlq1asmwYcPUJWsUrPcG6/09Rog/mHjhbCjyCCE+M4IBMzaTUqBAAV1SQmJiov6HGAvGVYsSLMEcC3F7yLKmiCNWw8QLZ0ORRwghYeDHH3+Un3/+We644w4VYLt371Y3a7ly5dxWPJRVadCggcycOVMTKAx27dolK1eulMWLFyfZ78KFC+XIkSNSu3Ztrb+HuLwRI0ZoeRZCrIbuWmdDkUcIIWEgW7Zs2sv75ZdflnPnzmmtPNS1GzBggNvihlIqO3bsULesGWTLFi9eXBo1apRkv8jMnTBhgpZnQWzf9ddfL2PGjJGuXbvyfSSWQ5HnbCjyCCEkDFSuXFmWL18ecJvSpUv7TMKAZQ6LLyAUzUWQCQknFHnOxtbZtUj5v+222yRnzpxSsGBBLSKKq15CCCGEhB8mXjgbW4u8FStWaMFPZKIh7gSuDbgv4PoghBBCSHhh4oWzsbW79quvvvK4P2PGDLXooQr8XXfdFbFxkegirfrAEkKI06C71tnYWuR5gwKeIG/evH63QWkCc3kCtu4hhBBCUgZFnrOxtbvWu77Uc889p1XeK1Wq5Hc7tu4hhBBCrIEiz9k4RuQhNm/z5s0yZ86cgNuxdQ8hhBBibUxeQoLI1as8q07DEe7ap59+WhYtWqTFQVE7KhBs3UMIIYRYa8kDyHnMlYtn1knY2pKH+lEQePPnz9d6U2XKlIn0kAghhJCYAXW70/+jFFjYwnlktLuLdvbs2fL5559rrbzDhw/r+ty5c0tcXFykh0cIIYRENenSXbPmnTlDkedEbG3JmzhxombU1qtXT1sCGcvHH38c6aERQgghMQGTL5yLrS15vtr9EOIk+BkmhERL8sXZs5EeCYkqSx4hhBBCIgstec6FIo8QQgghfqHIcy62dteSyHPy5En37Tx58qTpsdluLO3cx+kQXU0IIT6gyHMutOQRQgghxC8Uec6FIo8QQgghfmHihXOhu5YQh7uerdg3s4AJIf6gJc+50JJHCCGEEL9Q5DkXijxCCCGE+IUiz7nQXUtICt2azEglhMQCFHnOhZY8QggJMxcvXpSqVavqhcHGjRsDbpuQkKB9u/Plyyc5cuSQ1q1by5EjRzy22b9/vzRr1kyyZcsmBQsWlBdeeEGuXLkS5ldBYhUmXjgXijxCCAkzL774ohQtWjSobXv16iULFy6UTz/9VFasWCHx8fHSqlUr9+NXr15VgXfp0iVZvXq1vP/++zJjxgwZNGhQGF8BiWVoyXMudNcSksLM01hw3bIgder58ssvZcmSJfLZZ5/p7UCcOnVKpk6dKrNnz5Z77rlH102fPl0qVqwoa9euldq1a+u+tm7dKsuWLZNChQqphXDYsGHSt29fGTx4sGTOnNmCUROSVOTFx4usWHHttjHlJfffe1369CK5c4vky4cC+yIZqULCCk8vIYSECbhZu3btKgsWLFDXanKsX79eLl++LA0bNnSvq1ChgpQsWVLWrFmjIg//K1eurALPoHHjxvLkk0/Kli1bpFq1anw/iaXkzHnt/6ZNIvXqWbtvCD0IvoIFRQoUuPYf9yH+DFGIxXzbe12g7dKZtsmQQSRXrmv7Ny/BXhehWtWWLSJ//CGSmHhtn+YFGLcxflS0ypv32n8sWbJ4jgfb4HY4ocgjxALsUmcuFqyLTgHvRadOnaR79+5So0YN2bt3b7LPOXz4sFrivFsIQtDhMWMbs8AzHjceCxQXiMXg9OnTIb8mEpvccYdIkyYi+/bhc/3veuO2v/++1l29inaZsFpfu4/bWHbvloiRO/e/IjN//mtiDOILohALvlYQd7BkWgmmaIhMHBPHxlKzpkjfvtYdgyKPEEJC4KWXXpJRo0YF3Gbbtm3qVj1z5oz069fPFud35MiRMmTIkEgPgzg08SKZSIOQQZ4QLGPHj4scOyZy9KjIX39d+3/ixDUxCGEIi5lx27iP/+bHzfeNdcbiMq0zBCaOiQXHx3oITiw7dyY/7hIlRMqXv2b9M/ZtLMC4fenStWPhGHg9588n3Re2w2vHsn37tXUXLlDkEUJIxOjdu7da6AJRtmxZWb58ubpWs8AsYAJWvbZt22rChDeFCxfWhIqTJ096WPPg9sVjxjY//fSTx/OM7FtjG19AbD7//PMelrwS+MUiJALAVWlYryJFYuI1EWaIS/yH4IIAhSA0FnwVK1USuemma+7elAAj+uXLnsI0IeHfY+I/liDzs4KGljxCotTdaRcXcrRRoEABXZJj3Lhx8sorr7jvI0sWsXMff/yx1KpVy+dzqlevLpkyZZJvvvlGS6eAHTt2aMmUOnXq6H38Hz58uBw9elTLp4ClS5dKrly55Cb8CvkBYtNbcBISy6RP/29cXoUK4T0Wvnq+vn4BrsssgSKPEELCAJIlzKDmHShXrpwUL15cbx88eFAaNGggM2fOlJo1a0ru3LmlS5cuanHLmzevCreePXuqsEPSBWjUqJGKufbt28trr72mcXgDBgzQ2noUcYQQMxR5hBASIZBJC0vdeVPAzptvvinp06dXSx4SJWD9e+edd9yPZ8iQQRYtWqTZtBB/2bNnl44dO8rQoUMj9CoIIXYlncsBPp0JEybI6NGj9Yq1SpUqMn78eL3qDQbEneDqmKQe74y/tOQ65J9H6JhWf0XC+VrC+R6ldtyINfvggw+0FhwsVCSyGHMj3w9Covf7a/uOF4hfgevi5Zdflg0bNqjIw5Ut4lEIIYQQQohDRd6YMWO0mGjnzp01DmXSpElaVHTatGmRHhohhBBCiG2xtciDewcV4M3V3xGrgvsoTeALxLDAjGleCCGEEEJiDVuLvGPHjmkzbl/V3f1VdkfBT/ipjYV1oAghhBASi0Rddq13wU8EJXqXMiApI5I5OomoHpnG4AIjHK/7CipthjFbM5yWdSue74Bcr5jAeB/o7SDEeRjf2+TmU1uLvPz582u5AKOau6/q78kV/OQEZh0QzLF07H1o1EgsB62+mPFuj/cB0NtBSPTOp7YWeWjUjQrwqP7esmVLt0UH959++umg9lG0aFHZunWrJm0cOHCApRuSwWh1xHOVPDxXoZ0ndG1AFxF8J0nkwfuA73nOnDmT7e7Cz3pgeH6Sh+fI2nMECx4EXnLzqa1FHoDrFYU+0e8RtfHGjh0r586d02zbYECiRrFixfQ2ThrrcwUHz1Xw8FwFB642+f2zD5gbjc4bwcLPOs9PauFnyLpzFIxHxPYi7+GHH5a//vpLBg0apMkWVatWla+++ipJMgYhhBBCCHGQyANwzQbrniWEEEIIITYvoWIVSMRAxww27+a54ueK3z/COZS/MZwHYkWrOKJ3LSGEEEIICY2YsOQRQgghhMQaFHmEEEIIIVEIRR4hhBBCSBQSEyJvwoQJUrp0acmaNavUqlVLfvrpp0gPyXYMHjxYC6KalwoVKkiss3LlSmnevLkWnMQ5WbBggcfjCGlFeZ8iRYpIXFycNGzYUHbu3CmxSHLnqlOnTkk+Y02aNInYeElwcP5M3ec+1kE/+dtuu02LbhcsWFAbG+zYsSPSw7INEydOlFtuucVdG69OnTry5ZdfWrb/qBd5H3/8sRZURsbKhg0bpEqVKtK4cWM5evRopIdmO26++WY5dOiQe/n+++8l1kHhbXxm8EPni9dee03GjRsnkyZNkh9//FGyZ8+un6+EhASJNZI7VwCizvwZ++ijj9J0jCQ0OH9a87mPZVasWCE9evSQtWvXytKlS7W/dqNGjfS8EdGC5K+++qqsX79e1q1bJ/fcc4+0aNFCtmzZYs3pcUU5NWvWdPXo0cN9/+rVq66iRYu6Ro4cGdFx2Y2XX37ZVaVKlUgPw9bg6zJ//nz3/cTERFfhwoVdo0ePdq87efKkK0uWLK6PPvrIFct4nyvQsWNHV4sWLSI2JhI6nD9T/7knnhw9elTP04oVK3hq/HDddde5pkyZ4rKCqLbkXbp0SdUxXGjmVj64v2bNmoiOzY7AzQiXQ9myZaVt27baa5T4Z8+ePdqFxfz5QpsZhATw8+Wb7777Tl02N954ozz55JNy/PhxfsRsCudPEg5OnTql//PmzcsT7MXVq1dlzpw5auWE2zZmOl6klGPHjulJ826Bhvvbt2+P2LjsCITJjBkz9McXbrQhQ4bInXfeKZs3b9ZYCpIUCDzg6/NlPEY8XbWtWrWSMmXKyO7du6V///7StGlTFcQZMmTgqbIZnD+J1SQmJspzzz0ndevWlUqVKvEE/8Nvv/2mog5hPjly5JD58+fLTTfdJFYQ1SKPBA9+bA0QBArRV6pUKfnkk0+kS5cuPJUk1TzyyCPu25UrV9bPWbly5dS616BBA55hQqIcxObBcMB4b09gXNm4caNaOefOnSsdO3bUWEYrhF5Uu2vz58+vFoIjR454rMf9woULR2xcTiBPnjxSvnx52bVrV6SHYluMzxA/XykDYQH4jvIzZk84fxIrQf/5RYsWybfffqvJBuRfMmfOLNdff71Ur15ds5GRyPPWW2+JFaSP9hOHk/bNN994mItx3yp/d7Ry9uxZdamhNAjxDdyOEHrmz9fp06c1y5afr+T5888/NSaPnzF7wvmTWAHyUSDw4IJcvny5zpskMNApFy9eFCuIenctyqfA9FmjRg2pWbOmjB07VoMaO3fuHOmh2Yo+ffporSe4aOPj47XkDKyg//3vfyXWxa7Z0oRkC5jVETRcsmRJjS955ZVX5IYbbtDJa+DAgZq8glpQsUagc4UFcZ6tW7dWYYwLiBdffFGvXlFyhtgTzp+pnyNiHbhoZ8+eLZ9//rnGdxvxykhSQ23RWKdfv34aLoXPypkzZ/RcIYTl66+/tuYArhhg/PjxrpIlS7oyZ86sJQHWrl0b6SHZjocffthVpEgRPUfFihXT+7t27XLFOt9++62m+3svKAdilFEZOHCgq1ChQlo6pUGDBq4dO3a4YpFA5+r8+fOuRo0auQoUKODKlCmTq1SpUq6uXbu6Dh8+HOlhk2Tg/Jm6OSLW8XVusEyfPj3SQ7MFjz32mM6H+O3F/IjfkCVLlli2/3T4Y41cJIQQQgghdiGqY/IIIYQQQmIVijxCCCGEkCiEIo8QQgghJAqhyCOEEEIIiUIo8gghhBBCohCKPEIIIYSQKIQijxBCCCEkCqHII4QQQgiJQijyYhTUwH7iiSe09U66dOm0DY9V1KtXT9t9OZ0dO3ZoCy60mgk3X331lVStWlV7FhJCkgfz1oIFC2LyVMXqa7906ZK2Qly9enXYj3Xs2DEpWLCg9th2MhR5DqVTp06p6o8KUTFjxgxZtGiRHDp0SCpVqhT0xIHtjAX9B+vWrauNp6Oxp2DPnj2132JKqVy5snTv3t3nYx988IFkyZJFJ5MmTZpIpkyZZNasWakYMSHOn9eMuQXfh0KFCsm9994r06ZNS3IBhHkLPT+DIVZFUbQxadIk7RF+++23p3gfPXv2lIoVK/p8bP/+/dqz/YsvvpD8+fNLhw4dtI+7k6HIi1HQIL5IkSL6ZYG1KmPGjCE9f/r06TrJ/vDDD/pl+M9//iN//PGHOI3Lly/7/bJDAONHJzV06dJF5syZIxcuXPB5Du+//349fwDHGjduXKqOR4jTwQUP5pa9e/fKl19+KfXr15dnn31W55grV664t8O8hYskYi9LWzi9T2+//bbOqamhS5cusn37dp/WQBg+YL2777779H7nzp31wvvEiRPiVCjyopTNmzfrVW6OHDn0arh9+/ZqMTLEBK5mIGRwhVu6dGldwAMPPOBeF4g8efLoJAsL4MSJE1XELF26NOiraDwfXyiAyRzbzJs3Tyf0bNmySZUqVWTNmjUez3nvvfekRIkS+jjGOWbMGN2Pmc8//1xuvfVWyZo1q5QtW1aGDBni8cOA42C8EFfZs2eX4cOH+xzzJ598omMoVqyYex3Gi+NB/N144406jjZt2sj58+fl/fff13N23XXXyTPPPCNXr17V57Rr107PzWeffeax/z179sh3333nMWE1b95c1q1bpwKckFgFwg1zC757+C73799fv9cQfMac4T2vQFw8/fTTeuGK736pUqVk5MiR+pi/uQ3fsxYtWuj8iHnytttuk2XLlnmMBduOGDFCHnvsMbXolyxZUiZPnuyxDdx5//3vfzX0BXNKjRo15Mcffwx6TvLm559/VuslLv7gKbn77rtlw4YNAc/Zb7/9Jvfcc4/ExcVJvnz5NBTn7NmzSTw/r7/+up4jbNOjRw+Pi1wI62bNmuk+YC2bPXu2vv6xY8f6Pa6xX8yjRYsW1XnR8FLgPOCc4b189NFH5ejRo26xBpcrxmIGIUN4f3bt2uXzWOvXr9f3DGM0MH47MF/feeedOna8j7///ruexxo1auh7i9/Cv/76S5+DsBi8H7AOm8G48Pnq2LGj2+hx88036+uaP3++OBYXcSQdO3Z0tWjRwudjf//9t6tAgQKufv36ubZt2+basGGD695773XVr19fHz958qRr6NChruLFi7sOHTrkOnr0qC74OEyfPt29zh/Ybv78+e77J06c0HXjxo3T+3fffbfr2Wef9bs9yJ07tx4L7NmzR7epUKGCa9GiRa4dO3a42rRp4ypVqpTr8uXLus3333/vSp8+vWv06NH6+IQJE1x58+bV/RisXLnSlStXLteMGTNcu3fvdi1ZssRVunRp1+DBgz3GUrBgQde0adN0m3379vl8jffff7+re/fuHusw3kyZMum5xDldsWKFK1++fK5GjRq5HnroIdeWLVtcCxcudGXOnNk1Z84c9/MefPBB97k3GDRokKtEiRKuq1eveqwvVKiQ+7wQEmsEmteqVKniatq0qc95BfMCvk+YA/bu3etatWqVa/bs2fqYv7lt48aNrkmTJrl+++031++//+4aMGCAK2vWrB5zAuYgzDOYb3bu3OkaOXKkzkPbt2/Xx8+cOeMqW7as684779RjYpuPP/7YtXr16qDnJG+++eYb1wcffKBz99atW11dunTReeH06dM+X/vZs2ddRYoUcbVq1UpfC55fpkwZPZfm84pxYE7DfjFPZcuWzTV58mT3Ng0bNnRVrVrVtXbtWtf69et1Ho+Li3O9+eabAd+vHDlyuNq3b+/avHmzLmDq1KmuxYsX62tes2aNq06dOh7v3fDhw1033XSTx76eeeYZ11133eX3WGPGjNHfCDPm346vvvpKz1ft2rVd1atXd9WrV09/NzBXX3/99R7zOd7PnDlz6rkzWL58ue4Lvy9mHn74YY9z6TQo8qJwMhw2bJgKDzMHDhzw+ADji4sJzIwvMeYL83bnzp1zPfXUU64MGTK4Nm3alCqRN2XKFPfjEExYhwnJ+KI1a9bMYx9t27b1EHkNGjRwjRgxwmMbTJaYAM1jee6555J9jfhBgRA2g/Hi+bt27XKv69atm06WmOwNGjdurOsNMPmkS5fO9ccff+j9xMREPff4UfGmWrVqAX8ACInVeQ1zQMWKFX3OKz179nTdc889+t3yRbBz28033+waP368+z6+p+3atXPfx/5xkThx4kS9/+6776pYOH78uM/9BTMnJQcuBHEMCDNfrwdC7brrrvMQLP/7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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Change these to show different plots\n", "point_num_to_plot = 1 # Must be between 0 and num_points (10)\n", "ray_num_to_plot = 1 # Must be between 0 and num_rays (8)\n", "\n", "ray_data = ray_output.sensor[point_num_to_plot, ray_num_to_plot, :, 0]\n", "\n", "# Plot the results\n", "fig, ax = plt.subplots(1, 2, figsize=(6.5,3))\n", "tutorial_helper.plot_csd_data(fig, ax[0], csd.sensor[:,:,0], x_y_vals=(csd.V_x, csd.V_y))\n", "tutorial_helper.overlay_rays(fig, ax[0], ray_output.centers[point_num_to_plot],\n", " ray_output.rays, ray_num_to_plot)\n", "ax[1].plot(np.linspace(0, np.linalg.norm(ray_output.rays[ray_num_to_plot]),\n", " ray_output.resolution), ray_data, color=\"blue\")\n", "ax[1].set_xlabel(\"Distance along ray (mV)\")\n", "ax[1].set_ylabel(\"Sensor readout\")\n", "fig.tight_layout()" ] } ], "metadata": { "kernelspec": { "display_name": "qdflow_venv", "language": "python", "name": "qdflow_venv" }, "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.2" } }, "nbformat": 4, "nbformat_minor": 5 }