{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Obtaining Data for Single Cells " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This section will serve as an introduction to the Allen Cell Types database. We'll work with the AllenSDK to see what information we can gain about our cells.\n", "\n", "First, let's make sure you have an updated version of the Allen Institute Database installed. If you do not have the version below, this cell will install it for you. There is more information on installing the AllenSDK in the install guide. " ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "allensdk already installed.\n" ] } ], "source": [ "# This will ensure that the AllenSDK is installed.\n", "# If not, it will install it for you.\n", "try:\n", " import allensdk\n", " if allensdk.__version__ == '2.11.2':\n", " print('allensdk already installed.')\n", " else: \n", " print('incompatible version of allensdk installed')\n", " !pip install allensdk==2.11.2\n", "except ImportError as e:\n", " !pip install allensdk==2.11.2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we'll `import` the CellTypesCache module. This module provides tools to allow us to access information from the Allen Cell Types database. We're passing it a **manifest** filename as well. CellTypesCache will store the data in the path specified by the manifest filename. You can look under cell_types in your directory, and take a look at the file.\n", "\n", "If you're curious, you can see the full source documentation for the core package on the Allen Brain Atlas website" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Packages were successfully imported.\n" ] } ], "source": [ "# Import the \"Cell Types Cache\" from the AllenSDK core package\n", "from allensdk.core.cell_types_cache import CellTypesCache\n", "\n", "# Import CellTypesApi, which will allow us to query the database.\n", "from allensdk.api.queries.cell_types_api import CellTypesApi\n", "\n", "# Import packages \n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt \n", "%matplotlib inline \n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "# We'll then initialize the cache as 'ctc' (cell types cache)\n", "ctc = CellTypesCache(manifest_file='cell_types/manifest.json')\n", "\n", "print('Packages were successfully imported.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Get Available Cells" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `get_cells()` method downloads metadata for cells in the database. The database contains human cells and mouse cells. By default, `get_cells()` downloads metadata for *all* cells in the database. Alternatively, you can filter the database to only include cells collected from a certain species.\n", "Look through the documentation for the CellTypesCache for more information on the `get_cells` method." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of cells: 2333\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
reporter_statuscell_soma_locationspeciesnamestructure_layer_namestructure_area_idstructure_area_abbrevtransgenic_linedendrite_typeapicalreconstruction_typedisease_statedonor_idstructure_hemispherenormalized_depth
id
525011903None[273.0, 354.0, 216.0]Homo SapiensH16.03.003.01.14.02312113FroLspinyintactNoneepilepsy524848408rightNaN
565871768positive[8966.56330957526, 1429.52689052075, 8567.3896...Mus musculusOxtr-2A-Cre;Ai14-293837.03.01.025385VISpOxtr-T2A-CreaspinyNANone563340157left0.582057
469801138positive[7872.53138541818, 993.212032389272, 3127.1530...Mus musculusPvalb-IRES-Cre;Ai14-170927.05.02.014385VISpPvalb-IRES-CreaspinyNANone319194354right0.469578
528642047None[69.0, 254.0, 96.0]Homo SapiensH16.06.009.01.02.06.05512141MTGaspinyNANoneepilepsy528574320leftNaN
605889373positive[9400.0, 1520.74232706376, 2188.13845194139]Mus musculusVipr2-IRES2-Cre;Slc32a1-T2A-FlpO;Ai65-337419.0...2/3385VISpSlc32a1-T2A-FlpO|Vipr2-IRES2-CreaspinyNANone605622695rightNaN
\n", "
" ], "text/plain": [ " reporter_status cell_soma_location \\\n", "id \n", "525011903 None [273.0, 354.0, 216.0] \n", "565871768 positive [8966.56330957526, 1429.52689052075, 8567.3896... \n", "469801138 positive [7872.53138541818, 993.212032389272, 3127.1530... \n", "528642047 None [69.0, 254.0, 96.0] \n", "605889373 positive [9400.0, 1520.74232706376, 2188.13845194139] \n", "\n", " species name \\\n", "id \n", "525011903 Homo Sapiens H16.03.003.01.14.02 \n", "565871768 Mus musculus Oxtr-2A-Cre;Ai14-293837.03.01.02 \n", "469801138 Mus musculus Pvalb-IRES-Cre;Ai14-170927.05.02.01 \n", "528642047 Homo Sapiens H16.06.009.01.02.06.05 \n", "605889373 Mus musculus Vipr2-IRES2-Cre;Slc32a1-T2A-FlpO;Ai65-337419.0... \n", "\n", " structure_layer_name structure_area_id structure_area_abbrev \\\n", "id \n", "525011903 3 12113 FroL \n", "565871768 5 385 VISp \n", "469801138 4 385 VISp \n", "528642047 5 12141 MTG \n", "605889373 2/3 385 VISp \n", "\n", " transgenic_line dendrite_type apical \\\n", "id \n", "525011903 spiny intact \n", "565871768 Oxtr-T2A-Cre aspiny NA \n", "469801138 Pvalb-IRES-Cre aspiny NA \n", "528642047 aspiny NA \n", "605889373 Slc32a1-T2A-FlpO|Vipr2-IRES2-Cre aspiny NA \n", "\n", " reconstruction_type disease_state donor_id structure_hemisphere \\\n", "id \n", "525011903 None epilepsy 524848408 right \n", "565871768 None 563340157 left \n", "469801138 None 319194354 right \n", "528642047 None epilepsy 528574320 left \n", "605889373 None 605622695 right \n", "\n", " normalized_depth \n", "id \n", "525011903 NaN \n", "565871768 0.582057 \n", "469801138 0.469578 \n", "528642047 NaN \n", "605889373 NaN " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Download metadata for all cells in the database\n", "all_cells = ctc.get_cells()\n", "\n", "# Convert it to a dataframe with the cell id as the index\n", "all_cells_df = pd.DataFrame(all_cells).set_index('id')\n", "\n", "print('Number of cells:',len(all_cells_df))\n", "all_cells_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Allen Institute for Brain Science uses transgenic mouse lines that have Cre-expressing cells to mark specific types of cells in the brain. Lets find out what cre-lines are availabe in our mouse data under the column `transgenic_line`. \n", "\n", "We can take a look at how many different values are stored within a column using the `.unique()` method." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['', 'Oxtr-T2A-Cre', 'Pvalb-IRES-Cre',\n", " 'Slc32a1-T2A-FlpO|Vipr2-IRES2-Cre', 'Cux2-CreERT2',\n", " 'Scnn1a-Tg3-Cre', 'Htr3a-Cre_NO152', 'Rorb-IRES2-Cre',\n", " 'Ctgf-T2A-dgCre', 'Nkx2-1-CreERT2', 'Vip-IRES-Cre',\n", " 'Chrna2-Cre_OE25', 'Nos1-CreERT2|Sst-IRES-FlpO', 'Scnn1a-Tg2-Cre',\n", " 'Nos1-CreERT2', 'Ntsr1-Cre_GN220', 'Esr2-IRES2-Cre',\n", " 'Tlx3-Cre_PL56', 'Vipr2-IRES2-Cre',\n", " 'Chrna2-Cre_OE25|Pvalb-T2A-Dre', 'Nr5a1-Cre', 'Ndnf-IRES2-dgCre',\n", " 'Sst-IRES-Cre', 'Gad2-IRES-Cre', 'Chat-IRES-Cre-neo',\n", " 'Slc17a6-IRES-Cre', 'Sim1-Cre_KJ18', 'Glt25d2-Cre_NF107',\n", " 'Rbp4-Cre_KL100', 'Penk-IRES2-Cre-neo',\n", " 'Htr3a-Cre_NO152|Pvalb-T2A-Dre', 'Esr2-IRES2-Cre|PhiC31-neo',\n", " 'Gng7-Cre_KH71', 'Pvalb-T2A-FlpO|Vipr2-IRES2-Cre',\n", " 'Pvalb-T2A-CreERT2', 'Esr2-IRES2-Cre-neo|PhiC31-neo',\n", " 'Esr2-IRES2-Cre-neo', 'Vipr2-IRES2-Cre-neo'], dtype=object)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_cells_df['transgenic_line'].unique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For more information on the Allen Cell Types Cre lines, please visit the Allen Cell Types Cre Lines Glossary for a short description of the cortical expression patterns of the transgenic Cre lines available in the Allen Cell Types dataset." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Get Morphology data\n", "\n", "The dataframe above only contains metadeta about our cells and no information on the morphology or electrophysiology of our cells. In order to get information about the morphology of these cells, we need to use the `get_morphology_features()` method on our instance of the cell types cache. We will set the indices to be the `specimen_id` because these ids will align with those in `all_cells_df`." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Length of dataframe: 701\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
average_bifurcation_angle_localaverage_bifurcation_angle_remoteaverage_contractionaverage_diameteraverage_fragmentationaverage_parent_daughter_ratiohausdorff_dimensionidmax_branch_ordermax_euclidean_distance...overall_widthscale_factor_xscale_factor_yscale_factor_zsoma_surfacesupersededtagstotal_lengthtotal_surfacetotal_volume
specimen_id
47810719882.727781NaN0.8642670.34509220.7230770.964510NaN4911197436.099.779724...136.2675220.11440.11440.28435.740270False3D Neuron Reconstruction morphology1666.0829261803.875644167.343086
50236794182.506680NaN0.9038900.634047105.2777780.862183NaN5467813593.0432.383110...370.1700450.11440.11440.281446.587725False3D Neuron Reconstruction morphology2277.2593744543.139073921.571895
51577124477.536678NaN0.8631040.41792973.6666670.926633NaN5370422616.0373.630444...381.0151140.11440.11440.28287.118123False3D Neuron Reconstruction morphology3589.3390624704.910407582.285423
56143527976.583222NaN0.9005370.40039695.9791670.942049NaN68912360511.0943.382549...524.5501560.11440.11440.28180.994813False3D Neuron Reconstruction morphology5416.2287786814.933290740.722806
59126826872.019250NaN0.8735180.22762647.5357141.000000NaN6578793055.0186.218009...261.4590570.11440.11440.2855.055236False3D Neuron Reconstruction morphology1659.4658691185.77346269.144146
\n", "

5 rows × 29 columns

\n", "
" ], "text/plain": [ " average_bifurcation_angle_local \\\n", "specimen_id \n", "478107198 82.727781 \n", "502367941 82.506680 \n", "515771244 77.536678 \n", "561435279 76.583222 \n", "591268268 72.019250 \n", "\n", " average_bifurcation_angle_remote average_contraction \\\n", "specimen_id \n", "478107198 NaN 0.864267 \n", "502367941 NaN 0.903890 \n", "515771244 NaN 0.863104 \n", "561435279 NaN 0.900537 \n", "591268268 NaN 0.873518 \n", "\n", " average_diameter average_fragmentation \\\n", "specimen_id \n", "478107198 0.345092 20.723077 \n", "502367941 0.634047 105.277778 \n", "515771244 0.417929 73.666667 \n", "561435279 0.400396 95.979167 \n", "591268268 0.227626 47.535714 \n", "\n", " average_parent_daughter_ratio hausdorff_dimension id \\\n", "specimen_id \n", "478107198 0.964510 NaN 491119743 \n", "502367941 0.862183 NaN 546781359 \n", "515771244 0.926633 NaN 537042261 \n", "561435279 0.942049 NaN 689123605 \n", "591268268 1.000000 NaN 657879305 \n", "\n", " max_branch_order max_euclidean_distance ... overall_width \\\n", "specimen_id ... \n", "478107198 6.0 99.779724 ... 136.267522 \n", "502367941 3.0 432.383110 ... 370.170045 \n", "515771244 6.0 373.630444 ... 381.015114 \n", "561435279 11.0 943.382549 ... 524.550156 \n", "591268268 5.0 186.218009 ... 261.459057 \n", "\n", " scale_factor_x scale_factor_y scale_factor_z soma_surface \\\n", "specimen_id \n", "478107198 0.1144 0.1144 0.28 435.740270 \n", "502367941 0.1144 0.1144 0.28 1446.587725 \n", "515771244 0.1144 0.1144 0.28 287.118123 \n", "561435279 0.1144 0.1144 0.28 180.994813 \n", "591268268 0.1144 0.1144 0.28 55.055236 \n", "\n", " superseded tags total_length \\\n", "specimen_id \n", "478107198 False 3D Neuron Reconstruction morphology 1666.082926 \n", "502367941 False 3D Neuron Reconstruction morphology 2277.259374 \n", "515771244 False 3D Neuron Reconstruction morphology 3589.339062 \n", "561435279 False 3D Neuron Reconstruction morphology 5416.228778 \n", "591268268 False 3D Neuron Reconstruction morphology 1659.465869 \n", "\n", " total_surface total_volume \n", "specimen_id \n", "478107198 1803.875644 167.343086 \n", "502367941 4543.139073 921.571895 \n", "515771244 4704.910407 582.285423 \n", "561435279 6814.933290 740.722806 \n", "591268268 1185.773462 69.144146 \n", "\n", "[5 rows x 29 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Downloads the morphology features and sets up the dataframe all in one line\n", "morphology_df = pd.DataFrame(ctc.get_morphology_features()).set_index('specimen_id')\n", "print('Length of dataframe:',len(morphology_df))\n", "morphology_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we have two dataframes, one with the metadata for our cells, indexed by id, and another with the morphology data for all cells, also indexed by id. Usefully, these ids are unique to each cell, meaning we can match them across dataframes.\n", "\n", "We'll use [join](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html) to unite our dataframes. Since for the moment we're only interested in cells that have morphology data, we'll **join** the dataframes \"on the right,\" effectively dropping all of the cells that are not in the morphology dataframe.\n", "\n", "**Note**: Above, in get the `get_cells()` method, you can also restrict to experiments with morphology data by usnig the `require_morphology = True` argument." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of cells: 701\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
reporter_statuscell_soma_locationspeciesnamestructure_layer_namestructure_area_idstructure_area_abbrevtransgenic_linedendrite_typeapical...overall_widthscale_factor_xscale_factor_yscale_factor_zsoma_surfacesupersededtagstotal_lengthtotal_surfacetotal_volume
313861608positive[9349.44051500564, 1314.78991021449, 3245.6530...Mus musculusPvalb-IRES-Cre;Ai14-165874.04.02.015385VISpPvalb-IRES-CreaspinyNA...358.9942320.11440.11440.28514.500853False3D Neuron Reconstruction morphology3538.8767806041.095769945.093080
313862022positive[9489.24257509068, 1423.65239028148, 2785.4430...Mus musculusScnn1a-Tg2-Cre;Ai14-167081.03.02.014385VISpScnn1a-Tg2-Crespinyintact...287.1226280.11440.11440.28268.777679False3D Neuron Reconstruction morphology3498.0900313523.606841306.290931
313862167positive[9279.53948496313, 1831.03502009105, 2151.2443...Mus musculusSst-IRES-Cre;Ai14-167638.05.02.014409VISlSst-IRES-CreaspinyNA...327.1503830.11440.11440.28361.118559False3D Neuron Reconstruction morphology2644.8782983883.698604512.836253
313862167positive[9279.53948496313, 1831.03502009105, 2151.2443...Mus musculusSst-IRES-Cre;Ai14-167638.05.02.014409VISlSst-IRES-CreaspinyNA...327.1503830.11440.11440.28361.118559True3D Neuron Reconstruction morphology2644.8783473883.699514512.835043
313862306positive[8976.63502144556, 1878.14058922573, 8881.4968...Mus musculusSst-IRES-Cre;Ai14-167636.04.01.016a385VISpSst-IRES-CreaspinyNA...242.7812130.11440.11440.2894.306278False3D Neuron Reconstruction morphology2502.1605411994.902243141.878464
\n", "

5 rows × 44 columns

\n", "
" ], "text/plain": [ " reporter_status cell_soma_location \\\n", "313861608 positive [9349.44051500564, 1314.78991021449, 3245.6530... \n", "313862022 positive [9489.24257509068, 1423.65239028148, 2785.4430... \n", "313862167 positive [9279.53948496313, 1831.03502009105, 2151.2443... \n", "313862167 positive [9279.53948496313, 1831.03502009105, 2151.2443... \n", "313862306 positive [8976.63502144556, 1878.14058922573, 8881.4968... \n", "\n", " species name \\\n", "313861608 Mus musculus Pvalb-IRES-Cre;Ai14-165874.04.02.01 \n", "313862022 Mus musculus Scnn1a-Tg2-Cre;Ai14-167081.03.02.01 \n", "313862167 Mus musculus Sst-IRES-Cre;Ai14-167638.05.02.01 \n", "313862167 Mus musculus Sst-IRES-Cre;Ai14-167638.05.02.01 \n", "313862306 Mus musculus Sst-IRES-Cre;Ai14-167636.04.01.01 \n", "\n", " structure_layer_name structure_area_id structure_area_abbrev \\\n", "313861608 5 385 VISp \n", "313862022 4 385 VISp \n", "313862167 4 409 VISl \n", "313862167 4 409 VISl \n", "313862306 6a 385 VISp \n", "\n", " transgenic_line dendrite_type apical ... overall_width \\\n", "313861608 Pvalb-IRES-Cre aspiny NA ... 358.994232 \n", "313862022 Scnn1a-Tg2-Cre spiny intact ... 287.122628 \n", "313862167 Sst-IRES-Cre aspiny NA ... 327.150383 \n", "313862167 Sst-IRES-Cre aspiny NA ... 327.150383 \n", "313862306 Sst-IRES-Cre aspiny NA ... 242.781213 \n", "\n", " scale_factor_x scale_factor_y scale_factor_z soma_surface \\\n", "313861608 0.1144 0.1144 0.28 514.500853 \n", "313862022 0.1144 0.1144 0.28 268.777679 \n", "313862167 0.1144 0.1144 0.28 361.118559 \n", "313862167 0.1144 0.1144 0.28 361.118559 \n", "313862306 0.1144 0.1144 0.28 94.306278 \n", "\n", " superseded tags total_length \\\n", "313861608 False 3D Neuron Reconstruction morphology 3538.876780 \n", "313862022 False 3D Neuron Reconstruction morphology 3498.090031 \n", "313862167 False 3D Neuron Reconstruction morphology 2644.878298 \n", "313862167 True 3D Neuron Reconstruction morphology 2644.878347 \n", "313862306 False 3D Neuron Reconstruction morphology 2502.160541 \n", "\n", " total_surface total_volume \n", "313861608 6041.095769 945.093080 \n", "313862022 3523.606841 306.290931 \n", "313862167 3883.698604 512.836253 \n", "313862167 3883.699514 512.835043 \n", "313862306 1994.902243 141.878464 \n", "\n", "[5 rows x 44 columns]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Combine our metadata with our morphology data\n", "meta_morph_df = all_cells_df.join(morphology_df,how='right')\n", "print('Number of cells:',len(meta_morph_df))\n", "meta_morph_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Cell Types Database also contains 3D reconstructions of neuronal morphologies. You can create these single cell reconstructions by executing the `get_reconstruction()` method on your instance of the cells type cache. To do so, you must specify what cell you want to reconstruct by inputing a `specimen_id`. This method returns a class instance with methods for accessing morphology compartments. " ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'id': 0,\n", " 'type': 1,\n", " 'x': 396.0425,\n", " 'y': 368.9697,\n", " 'z': 26.6608,\n", " 'radius': 6.4254,\n", " 'parent': -1,\n", " 'tree_id': 0,\n", " 'children': [1, 487, 982, 1101, 1664, 1872, 2379, 3077]}" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get the cell_id for the first cell in our dataframe\n", "cell_id = meta_morph_df.index[0]\n", "\n", "# Call for recontruction of desired cell\n", "single_cell_morphology = ctc.get_reconstruction(specimen_id = cell_id)\n", "\n", "# Get summary of cell reconstruction \n", "single_cell_morphology.soma" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now have a dictionary of our cell reconstruction. Note that the type field refers to the type of neuronal compartment. The values can be 1 for the soma, 2 for the axon, 3 for dendrites, and 4 for apical dendrites (if present). The x, y, and z, represent the spatial location of the cell soma.\n", "\n", "Morphologies also come with marker files, which contain points of interest in the reconstruction. The marker file contains locations where dendrites have been truncated due to slicing and when axons were not reconstructed. The `name` field indicates the type of marker (10 for dendrite truncation, 20 for no reconstruction)." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'x': 417.1024, 'y': 252.13760000000002, 'z': 18.48, 'name': 10},\n", " {'x': 411.4968, 'y': 325.0104, 'z': 18.48, 'name': 10},\n", " {'x': 429.4576, 'y': 364.1352, 'z': 19.32, 'name': 10},\n", " {'x': 378.3208, 'y': 363.3344, 'z': 17.36, 'name': 10},\n", " {'x': 393.8792, 'y': 404.5184, 'z': 17.08, 'name': 10},\n", " {'x': 386.9008, 'y': 309.2232, 'z': 19.88, 'name': 10},\n", " {'x': 366.652, 'y': 503.5888, 'z': 24.08, 'name': 10},\n", " {'x': 546.2244999999999, 'y': 189.7084, 'z': 129.2262, 'name': 10},\n", " {'x': 529.3048, 'y': 413.3364, 'z': 99.47279999999999, 'name': 10},\n", " {'x': 442.8424, 'y': 473.616, 'z': 101.36, 'name': 10},\n", " {'x': 374.7744, 'y': 475.904, 'z': 86.24, 'name': 10},\n", " {'x': 541.3716999999999, 'y': 216.2698, 'z': 85.21379999999999, 'name': 10},\n", " {'x': 431.7868, 'y': 205.0448, 'z': 89.7428, 'name': 10},\n", " {'x': 614.0992, 'y': 300.9864, 'z': 83.44, 'name': 10},\n", " {'x': 383.09360000000004, 'y': 371.9785, 'z': 16.929599999999997, 'name': 20},\n", " {'x': 396.1077, 'y': 368.7706, 'z': 17.968999999999998, 'name': 30}]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Download and store markers for 3D reconstruction \n", "markers = ctc.get_reconstruction_markers(cell_id) \n", "markers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use this data to draw lines between each node and all its children to get a drawing of the cell. We'll reconstruct an image from the front and side view of our cell.\n", "\n", "**Note**: Since we're reconstructing what is likely to be a very complicated neuron, this might take a minute to plot." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Import necessary toolboxes\n", "from allensdk.core.swc import Marker\n", "\n", "# Set up our plot\n", "fig, ax = plt.subplots(1, 2, sharey=True, sharex=True, figsize=(10,10))\n", "ax[0].set_aspect('equal')\n", "ax[1].set_aspect('equal')\n", "\n", "# Make a line drawing of x-y and y-z views\n", "for n in single_cell_morphology.compartment_list:\n", " for c in single_cell_morphology.children_of(n):\n", " ax[0].plot([n['x'], c['x']], [n['y'], c['y']], color='black')\n", " ax[1].plot([n['z'], c['z']], [n['y'], c['y']], color='black')\n", "\n", "# Plot cut dendrite markers in red\n", "dm = [ m for m in markers if m['name'] == Marker.CUT_DENDRITE ]\n", "ax[0].scatter([m['x'] for m in dm], [m['y'] for m in dm], color='red')\n", "ax[1].scatter([m['z'] for m in dm], [m['y'] for m in dm], color='red')\n", "\n", "# Plot no reconstruction markers in blue\n", "nm = [ m for m in markers if m['name'] == Marker.NO_RECONSTRUCTION ]\n", "ax[0].scatter([m['x'] for m in nm], [m['y'] for m in nm], color='blue')\n", "ax[1].scatter([m['z'] for m in nm], [m['y'] for m in nm], color='blue')\n", "ax[0].set_ylabel('y')\n", "ax[0].set_xlabel('x')\n", "ax[1].set_xlabel('z')\n", "ax[0].set_title('Front View')\n", "ax[1].set_title('Side View')\n", "\n", "# Show the plot\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Get Electrophysiology Data\n", "\n", "Now that we know what our cell looks like, let's take a look at its action potentials. The `get_ephys_data()` method can download electrophysiology traces for a single cell in the database. This method returns a class instance with helper methods for retrieving stimulus and response traces out of an NWB file. If we take a look at `specimen_ephys_data` we can see that it is an NWBDataSet object. In order to use `get_ephys_data()`, you must specify the id of the cell specimen whose electrophysiology you would like to download.\n", "\n", "Below we go over methods that can be used to access the electrophysiology data for single cells, the source documentation for all the methods we cover can be found on the Allen Brain Atlas website. The `get_experiment_sweep_numbers()` method returns all of the sweep numbers for experiments in the file. Each sweep contains metadata and electrophysiology data." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[10, 100, 101, 102, 103, 104, 105, 108, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 4, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 5, 50, 51, 52, 53, 54, 55, 57, 58, 59, 6, 60, 61, 62, 63, 64, 65, 66, 68, 69, 7, 71, 72, 73, 74, 75, 76, 77, 78, 79, 8, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 9, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]\n" ] } ], "source": [ "# Get electrophysiological traces of our cell\n", "specimen_ephys_data = ctc.get_ephys_data(specimen_id = cell_id)\n", "\n", "# Retrieve sweep numbers for cell\n", "sweep_numbers = specimen_ephys_data.get_experiment_sweep_numbers()\n", "\n", "print(type(specimen_ephys_data))\n", "print(sweep_numbers)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have sweep numbers to choose from, we can take a look at a sweep's metadata by calling get_sweep_metadata(). This returns a dictionary containing information such as stimulus paramaters and recording quality." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'aibs_stimulus_amplitude_pa': 420.0, 'aibs_stimulus_name': 'Short Square - Triple', 'gain': 0.01, 'initial_access_resistance': 15.208168, 'seal': 1.4909363}\n" ] } ], "source": [ "# Select a sweep number \n", "sweep_number = sweep_numbers[-1]\n", "\n", "# Retrieve metadata for selected sweep\n", "specimen_metadata = specimen_ephys_data.get_sweep_metadata(sweep_number)\n", "print(specimen_metadata)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `get_sweep()` method returns a dictionary containing the stimulus, response, index_range, and sampling rate for a particular sweep." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'stimulus': array([0., 0., 0., ..., 0., 0., 0.], dtype=float32), 'response': array([-0.07440625, -0.0744375 , -0.074375 , ..., -0.07428125,\n", " -0.074375 , -0.07428125], dtype=float32), 'stimulus_unit': 'Amps', 'index_range': (150000, 618600), 'sampling_rate': 200000.0}\n" ] } ], "source": [ "sweep_data = specimen_ephys_data.get_sweep(sweep_number)\n", "print(sweep_data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that you've pulled down some data, chosen a cell, and chosen a sweep number, let's plot that data. We can look closer at the action potential by plotting the raw recording. Our `sweep_data` variable has all the data we need to plot our sweep; the stimulus current injected into our cell, the cell's response, and sampling rate of the sweep. " ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAImCAYAAABXQlBnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABLJklEQVR4nO3deZyddX33/9dnJpOEQMKWsAUwrCpaBIyIK25VxAUX3Ldbbam9tXWpWqztrd6/arHWpbbaSou3a7XWumARd8QVMKjsW9gJgYQlZF9m5vP747omOZnMTM6Qc13nzDWv5+Mxj5xzXdc53+81J5N557tGZiJJktRkfd2ugCRJUtUMPJIkqfEMPJIkqfEMPJIkqfEMPJIkqfEMPJIkqfEMPFKPiohFEZERMaN8/tOI+KNu10uSpiIDj1SxiHhlRCyJiLURsTwizo+IJ1Zc5ssj4rqIeCAiVkTE5yNiXsv5t5R12hQRnxv12mPKc/eXXz+KiGNazs+KiH+NiLsj4r6I+E5ELByj/GsiYl1E3BgRTyqPz4yIr0fELWWYe8oYdT8hIn5Wfr/ujoi3tpxbFBEXRMT6iLg2Ip7Rci4i4m8jYll53z+NiEdM4nv2xvI915Tlfjci5rb7+m4qP5OPR8Sd5Wf26YgYaDn/8Ij4Sfl9WRoRL+xmfaVuMPBIFYqIdwCfAD4E7A8cCnwaOK3ion8JPCEz9wQOB2YAf9ty/s7y+WfHeO2dwOnAPsB84Fzgqy3n3wo8DjgWOAi4H/inkZMR8YfAh4HXA3OBJwM3tbz+F8CrgbtGFxwR84HvAZ8B9gWOBH7QcslXgN+V594LfD0iFpTnXgK8AXhSWfdfA18c4/52EBEnU3xGr8jMucDDgf9s57U94kxgMfBI4GjgBOCvAcoWwm8D/0PxfTkD+FJEHN2dqkrdYeCRKhIRewL/F3hzZn4jM9dl5pbM/E5mvqu8pi8izixbQe6NiK9FxD67WnZm3p6Z97QcGqIIDyPnv5GZ3wLuHeO1qzLzliyWYY/RrwUOA76fmXdn5kaKYNDakvIB4P9m5kWZOZyZyzJzWfnemzPzE5n5i/J9R3tH+d5fzsxNmbkmM68BKH9BnwC8LzM3ZOZ/A1cAL26p1y8y86bMHAK+BBwzRhljeQzw68z8XVnP+zLz85m5JiIOi4hVEdFX1uPfImLFyAsj4osR8bby8Z4RcU7ZkresbHHqb7n2DWXL1/0R8f2IeEjLuYyIP4+ImyLinoj4yEiZbXge8Mmy3iuBT1KEP4CHUQTTj2fmUGb+hCIQv6bN95YawcAjVedxwGzgmxNc82fAC4CT2dZa8qmdvXFEHFr+Ej50gmueGBEPAGsoQsEn2q558fpVwEaK1psPtZw6B3hCRBwUEXOAVwHnl6/pp2hpWFB2ndwREf8cEbu1WexJwH0R8auyK+47Lff4COCmzFzTcv1lbAtbXwWOiIijy+6c11G0FrXjYuBZEfGBiHhCRMwaOZGZNwOrgePLQ08G1kbEw8vnJwMXlo8/BwxSBMTjgWcCfwQQEacBfwW8CFgA/JyixarVCym+fydQtAK+oXztTj9vinDa+vjgMnSPd+0jJ3gvqXEMPFJ19gXuyczBCa55E/DezLwjMzcB7wdOL7shxpWZt2XmXpl52wTX/KLs0joY+Ahwy2Qqn5l7AXsCb6HoRhpxA3A7sIwiCDycoiULim67AYousScBx1H84v/rNos9mCKovJWi++9mtoWCPYAHRl3/AEW3GcByiu6y64ANFF1cb2+n0Mz8OUUQOQE4D7g3Ij7W0jpzIXByRBxQPv96+fwwYB5wWUTsD5wKvK1szVsBfBx4efmaNwF/l5nXlH8nPgQc19rKA3y4bKW5jSKgvqKs384+7+8Bb42IBWUd/7w8Pqf8fqwA3hURAxHxTIqQNqed743UFAYeqTr3AvN3El4eAnyz/N/7KuAaiq6e/TtVibI76XtsPw6n3deuA/4V+EJE7Fce/hQwiyLQ7Q58g7KFhyJoAPxTZi4vu9U+RhEE2rEB+GZm/qbsLvsA8PiypWItRbhoNY+iBQvg/1B0TR1C0bL2AeAnZStUO/d6fmY+j2Kcy2nA/6JsnaEIPE+haN35GfBTitBwMvDzzBym+CwHgOUtn+dngJHv20OAf2w5dx9FS0vrgO/bWx7fStHq144PUoTS3wO/Ar4FbAHuzswtFK2Iz6EYN/UXwNeAO9p8b6kRDDxSdX4NbKL4ZTOe24Fnl/97H/maPTLmpYNmAEc8yNf2UbQGjPxiPg74XNkSsYmiy+vEiJifmfdT/CLNlte3Pt6Zyyd47VXA4aNmTj2qPD5Sr/8sW8sGM/NzwN60P46nKLAYd/Rj4Cds6/a5kKLF6inl418AT2D77qzbKT7v+S2f5bzMfETL+T8Z9Vnvlpm/ain+kJbHh1IMIG+nzhsy8y2ZuTAzD6cI25eWQYzMvDwzT87MfTPzWRQD2S+ZxLdFmvIMPFJFMvMBilaHT0XECyJiTtml8OyI+Pvysn8FPjjSrVF2SezyDK6IeNXIeI/yvT8I/Ljl/IyImA30A/0RMTu2rffzhxFxfET0RzGV/WMUY4uuKV/+G+C15QDdAeB/A3e2DJL+f8CfRcR+EbE3RbfS/7SUPassG2BmWXa0vPaFEXFc+d5/QzEQ+YHMvJ6iBeN95WteSDFT7L9b6vWSiNi/HAz+GooWl6Vlue+PiJ+O8/06LYqp9HtH4USKMHMRQGbeQNH69GrgwsxcDdxNMTbqwvKa5RQzyj4aEfPKOhwRxQwwKD7r90Q5Vb78/r1kVFXeVdbhEIpuvbZmikXEwnJMVUTESeX37X0t548tv2dzIuKdwIEU442k6SMz/fLLrwq/KAb1LgHWUXQpnAc8vjzXRzEz6TqKrpkbgQ+V5xZRtHDMKJ//FPij8vGhFF08h45T5gcpWlrWlX+eDezbcv795Xu3fr2/PPcS4Nry/VeW9T225bX7Al+mGBeyiqK148SW8wMUU+9Xlff7SWB2y/lbxih7Ucv5P6UYH3Q/8B3gkJZzi8rvw4bye/aMlnOzKbrbllOMLfotcErL+XOAD47z/XoyRSC8p/wcrgfePeqarwA3tzz/h/La/pZjewL/Un7PH6DoZnp5y/nXUMwsW03R4vPZlnNJMfbmJooWmo+OvHcbn/eTy+/r+vL78qpR5z9Sfj/XUnQ/Htntnwu//Kr7KzIn09osSVNTRPweeHpm7jAVvxdERAJHZebSbtdFaqIJZ4JIUlNk5nHdroOk7nEMjyRJajy7tCRJUuPZwiNJkhrPwCNJkhqvEYOW58+fn4sWLep2NSRJUgdceuml92Tmgk6+ZyMCz6JFi1iyZEm3qyFJkjogIm7t9HvapSVJkhrPwCNJkhrPwCNJkhrPwCNJkhrPwCNJkhrPwCNJkhrPwCNJkhrPwDNFXHXnAyw68zx+tfSeysv65dJ7+O4VyysvR5Kkuhh4poiLb7oPgB9cfXflZb3q3y/mf3/5t5WXM+KUT/yMZ378wtrKkyRNP41YaXk66O8LAIYbuLv9tXet6XYVJEkNZwvPFNFXBp7B4eYFHkmSqmbgmSL6o2zhMfBIkjRpBp4pomzgYcjAI0nSpBl4poi+soVHkiRNnoFnirF9R5KkyTPwTBU28EiS9KAZeCRJUuMZeKaYBi7DI0lS5Qw8U4Q9WpIkPXgGHkmS1HgGnikmnaclSdKkGXimiHAdHkmSHjQDjyRJajwDz1Rjj5YkSZNm4Jki7NCSJOnBM/BMMTbwSJI0eQaeKcIxy5IkPXgGHkmS1HgGHkmS1HgGnikm3UxLkqRJM/BIkqTGM/BMESODlm3fkSRp8gw8U0S4Eo8kSQ9azwaeiDglIq6LiKURcWa36yNJkqaungw8EdEPfAp4NnAM8IqIOKa7tZIkSVNVTwYe4ERgaWbelJmbga8Cp3W5TpIkaYrq1cCzELi95fkd5bFpa+ugZUctS5I0ab0aeHYqIs6IiCURsWTlypXdrk5tzDuSJE1erwaeZcAhLc8PLo9tlZlnZ+bizFy8YMGCWis3XbjIoSSpKXo18PwGOCoiDouImcDLgXO7XKdpZ9i8I0lqiBndrsBYMnMwIt4CfB/oBz6bmVd1uVrTTtHC4/o/kqSprycDD0Bmfhf4brfr0Wvq7GaygUeS1BS92qWlUaKcplVnCHEIjySpKQw8U0Q3OpbSNh5JUkMYeDQuW3gkSU1h4JkiupE9DDySpKYw8EwR3VgTxy4tSVJTGHimmhoziC08kqSmMPBMMXW2ugybeCRJDWHgmSK6kT2MO5KkpjDwTBHdGE9jA48kqSkMPFNEV8KHgUeS1BAGnimmzuDjLC1JUlMYeKaIbrTwuFu6JKkpDDxTRHcWHjTxSJKawcAzRXRn4cGayzNgSZIqYuCZIkaiQK1jeGrOH+YdSVJVDDxTRTfW4ak5gZh3JElVMfBMMXXOnLJLS5LUFAaeKWI6LDxo3JEkVcXAM0V0Z2uJmru0TDySpIoYeKaI7kxLr7k823gkSRWZ0c5FEbE3cBCwAbglM4crrZV20J2FB23hkSQ1w7iBJyL2BN4MvAKYCawEZgP7R8RFwKcz84JaaqmtmjwtXZKkqkzUwvN14AvAkzJzVeuJiHg08JqIODwzz6mwfiqNdPc0OYMYsCRJVRk38GTmH05w7lLg0kpqpDF1ZdCyY3gkSQ0x7qDliLg6Iv46Io6os0IaW1cGLTtLS5LUEBPN0noFsDvwg4i4JCLeHhEH1VQvjdaFNFD3bunmHUlSVcYNPJl5WWa+JzOPAP4cOBS4KCIuiIg/rq2G2k69g5brbuEx8kiSqtHWOjyZeVFmvh14LbAX8M9VVko76k6XVrPLkyRNHztdhyciHkPRvfVi4GbgM8B/VVwvjTItBi2beCRJFZloHZ4PAS8D7gO+CjwhM++oq2LaXje6e2ov08AjSarIRC08G4FTMvOGuiqj8eUYj+ors67yTDySpGpMtA7P/wWIiH7gOcCi1usz82NVV07b2KUlSdKD185eWt+haO25AnAPrS6rdZZW3evw1FqaJGk6aSfwHJyZx1ZeE01oWuyWbhOPJKki7UxLPz8inll5TTShboSB2ndLr7U0SdJ00k4Lz0XANyOiD9gCBJCZOa/SmqnrHMMjSWqKdgLPx4DHAVekfQ5dMx2+8/71kiRVpZ0urduBKw07vaHOD6GOT7z1r5V/wSRJVWmnhecm4KcRcT6waeTgrkxLj4iPAM8DNgM3Aq/PzFXlufcAbwSGgD/PzO8/2HKaZGTGVJ25s45ZWq23Y6SWJFWlnRaem4EfAzOBuS1fu+KHwCPL2V/XA+8BiIhjgJcDjwBOAT5drgM07XUjDNSxW3pu99jEI0mqxk5beDLzA50uNDN/0PL0IuD08vFpwFczcxNwc0QsBU4Eft3pOkw13ZmWXkcLT0uXlnlHklSRcVt4IuLfIuIPxjm3e0S8ISJe1YE6vAE4v3y8kGLM0Ig7ymNj1eGMiFgSEUtWrlzZgWr0tq6stFxzGeYdSVJVJmrh+RTwN2XouRJYCcwGjgLmAZ8FvjzeiyPiR8ABY5x6b2Z+u7zmvcDgRO8znsw8GzgbYPHixY3/XdmN7p56Bi1vezxcRx+aJGlammgvrd8DL42IPYDFwIHABuCazLxuZ2+cmc+Y6HxE/C/gucDTW2aALQMOabns4PKYSvXO0qqhS8t2HUlSDdoZw7MW+GknC42IU4B3Aydn5vqWU+cC/xERHwMOomhNuqSTZU9VTe3S2q48s48kqSLtTEuvwj8Ds4AfRgTARZn5psy8KiK+BlxN0dX15swc6lIdp726u7Rs7ZEkVaUrgSczj5zg3AeBD9ZYnSlhpHup1t3S695Ly7wjSapIO+vwABARc6qsiCbW1C6t7QYtm3gkSRXZaeCJiMdHxNXAteXzR0XEpyuvmcZUZyRwt3RJUlO008LzceBZwL0AmXkZ8OQqK6UddSUM1LLSsgsPSpKq11aXVmbePuqQA4lrNh26tGzjkSRVpZ1By7dHxOOBjIgB4K3ANdVWS6M1duHBmsuTJE1P7bTwvAl4M8UWD8uA48rnqlF3Ng91DI8kqRnaWXjwHqATe2ZpF4yEgTqnitfTpbWtFGdpSZKq0s4srb+PiHkRMRARP46IlRHx6joqp+6qZ2uJ1vIqL06SNE2106X1zMxcTbHv1S3AkcC7qqyUxtCNhQfrKCPHfixJUie1E3hGur2eA/xXZj5QYX00jpEsUHW3T26/10Ot3FpCklSVdmZp/U9EXEuxU/qfRsQCYGO11dJoIzmk6laQ2lc+toVHklSDnbbwZOaZwOOBxZm5BVgHnFZ1xbS9kdaPqltB6h5T48KDkqQ6tLt56MOARRHRev0XKqiPdqL6Fp6WAFJtUWV5LY/t0pIkVWSngScivggcAfyebSssJwaeWm3t0qq6nO3KdLd0SVIztNPCsxg4Juv+7aft5A4PKiqn5jHLOc5jSZI6qZ1ZWlcCB1RdEU1sWwtPjQsP1rEOT2sXmplaklSRdlp45gNXR8QlwKaRg5n5/MpqpR1sHbRcdQtPzYOIbeGRJNWhncDz/qorofZVvw5Py+NKSxqrbCOPJKka7eyldWFE7A88pjx0SWauqLZa2kFNg5a3K7KOFh7X4ZEk1aCdvbReClwCvAR4KXBxRJxedcW0vW2bh1ZcTs0LD27XhVZ5aZKk6aqdLq33Ao8ZadUpV1r+EfD1Kium7Y1091Q/Lb3mAGILjySpBu3M0uob1YV1b5uvUwdlTU0823cx1b0Oj4lHklSNdlp4vhcR3we+Uj5/GfDd6qqkseSoP6supy6t5Q2bdyRJFWln0PK7IuJFwBPLQ2dn5jerrZbGU+vWEnUPWnYUjySpIu3upfUrim0lhoHfVFcdjacbCw/WPWjZvCNJqko7s7T+iGKW1guB04GLIuINVVdM2xsJBsPDVZfT8rj2Fh5JkqrRTgvPu4DjM/NegIjYl6LF57NVVkzbq23z0K4uPFhzgZKkaaOd2Vb3Amtanq8pj6kLKp/JVPMsre23ljDxSJKq0U4Lz1KKxQa/TfH76TTg8oh4B0BmfqzC+qlmda/D0xqqnKUlSapKO4HnxvJrxLfLP+d2vjoaz9aFB2tcabme3dLrLU+SND21My39AyOPI6IP2CMzV1daK+1g2zo8FS882Pq45vxh3JEkVaWdWVr/ERHzImJ34Erg6oh4V/VVU6utg5brXIen2qLGKLzuAiVJ00U7g5aPKVt0XgCcDxwGvKbKSmlHIy07da607MKDkqSmaCfwDETEAEXgOTczt+D/xWs3EgzqWAxwRN0LD1a9xpAkafpqJ/B8BrgF2B34WUQ8BHAMT81yhwcVldPNdXhqLk+SNH20M2j5k8AnWw7dGhFPra5KGsvWWVpVl7P9QjwVl+YsLUlSPdoZtLx/RJwTEeeXz48BXld5zbSdbYOWa1x4sNqSdijDuCNJqko7XVqfA74PHFQ+vx54WycKj4i/iIiMiPnl84iIT0bE0oi4PCJO6EQ5TVDb1hJjlFlpeTXvzi5Jmp7aCTzzM/NrFDulk5mDFDun75KIOAR4JnBby+FnA0eVX2cA/7Kr5TTFcBcWHqxzgHRZes3lSZKmi3YCz7pyw9AEiIiTgAc6UPbHgXez/W+504AvZOEiYK+IOLADZU159S08WG+LS2sRbi0hSapKO1tLvAM4FzgiIn4JLABO35VCI+I0YFlmXhYRracWAre3PL+jPLZ8jPc4g6IViEMPPXRXqjMl1LfwYMvjaovasTwDjySpIu3M0vptRJwMPBQI4DrgxJ29LiJ+BBwwxqn3An9F0Z31oGXm2cDZAIsXL278r8ra9tIao8y6SnThQUlSVcYNPBHRD7yUooXl/My8KiKeSxEydgOOn+iNM/MZ47zvH1Cs1jzSunMw8NuIOBFYBhzScvnB5bFpb2uXVo3NILXvpWXekSRVZKIWnnMowsclwD9FxJ3Ao4H3ZOa3HmyBmXkFsN/I84i4BVicmfdExLnAWyLiq8BjgQcyc4furOlouK51eLLeFpduLnQoSZo+Jgo8i4FjM3M4ImYDdwFHZOa9Fdbnu8CpwFJgPfD6CsuaUroyhqfmQcsuPChJqspEgWdzZo5MRd8YETdVEXYyc1HL4wTe3OkymqCuWVpjlVlpGQ5aliTVYKLA87CIuLx8HBSztC4vH2dmHlt57bRVN9bhqX0Mj51akqSKTBR4Hl5bLbRzta203LJ7ec27pdvCI0mqyriBJzNvrbMimthIMKizhacOw8PdK1uSNH20s9KyesBIMKh6YG/dg4iHt5sVJklSNQw8U8TWFp6qy+niZp71790lSZouDDxTxMg+U7UuPFhDGcMuxCNJqsFEKy1fwdi/gpyl1QVZ26DlbepocRneLu+YeCRJ1ZholtZza6uF2tDMaend7EKTJE0fztKaIurr0qp3EPGwPVqSpBpM1KW1hm2/g6L8M9nWpTWv4rqpxdbd0isupzWA1NHk0hrgHLQsSarKRC08c+usiCaWOzyoxtBwawCptiwYPQ2++vIkSdNTW7O0IuKJEfH68vH8iDis2mpptJHwUXUryPbr4tQwaHm43i40SdL0tNPAExHvA/4SeE95aCbwpSorpR3V1aVV96DlurvQJEnTUzstPC8Eng+sA8jMOwG7u2q2dVp6jV1ateyWXvMgaUnS9NRO4NmcRfNCAkTE7tVWSWPZttJyjV1atUxLH/uxJEmd1E7g+VpEfAbYKyL+GPgR8G/VVkuj1dXCs9008Zr30nKWliSpKhMtPAhAZv5DRPwhsBp4KPB/MvOHlddM2xmubVp6F9fhMe9Ikioy0To8RwL7Z+Yvy4Dzw/L4EyPiiMy8sa5Kattu6VWnkO1mTdW8Do95R5JUlYm6tD5B0aoz2gPlOdVo/ZZBoI4xPNse19HismWo3oAlSZqeJgo8+2fmFaMPlscWVVYjjWn95iGgjjE89S48uHlweOcXSZK0iyYKPHtNcG63DtdDO7GhDDxVD+zdflp69Yln89DQ1scOWpYkVWWiwLOknJW1nYj4I+DS6qqksWxt4am4nDUbB7c+riN/tLbwmHckSVWZaJbW24BvRsSr2BZwFlOstPzCiuulUTbU1KV1//rN1RYwSmvgqaMLTZI0PU20eejdwOMj4qnAI8vD52XmT2qpmbYaHBpm89AwfVF9KFhVBp7dBvprGUS8ZtO2FiW7tCRJVWlnHZ4LgAtqqIvGsa5s3ZkzcwZrNw2SmUREJWXdv34Luw30M3ugr5YWl6Ur1rLv7jO5d93m7abES5LUSW3tlq7uWnb/BgAO3HM2UG0rz/3rN7P3nAEiopZByzfcvZaHHVhszTZkC48kqSIGnilg6cq1ADz0gDIYVJh47ly1gQP2nE1QwxT44WTpirU8dP95RFR7X5Kk6c3AMwUsXbGWvoAj99sDqHasy833rOPwBXsQUf2MsDvu38CGLUMcvf8e9EcYeCRJlTHwTAE3rljLofvMYc7MfgAGKwoGazcNcvfqTRw2f/eiS6vi/HH93WsAOGr/ufT1hV1akqTKGHimgKUr1nLkfnvQVw5Urqol5JZ71gFwxILdyy6tagPIdVsDT9HC46BlSVJVDDw9bnBomJvvWccR++3BjL5qA88Vyx4A2NalVXH+uOHuNRy452zmzR6gvy8YcpcJSVJFDDw97vb7N7B5aJgjF+xBf8WB5z3fKLZOW7Tv7gTVz9K6/u61HLV/MRC7WGPIFh5JUjUMPD1u6YpihtaR++1Bf1/xcVUVDPaYVSzLNHNGH30Vt/AMDSc3rlzLQ/cvBmLP6O9z0LIkqTIGnh73mQtvBIqBvf3lp1XVoOU5M/t50lHzAYiIStf7ue2+9WwaHG5p4YnK7kuSJANPj9tU7jW1x6wZWwctVzG49+7VG1mxZtN2rUdVdmmNzNA6ugw8/X3V3JckSWDg6XnrNg1yyiMOAGBGf3VjeG4su85efMLBAERQ6UI8199VztAq1xbqD6elS5KqY+DpYRs2D3Hzveu2br0w0sJTRdfPNWUAedJRC7aWVeUg4utXrGXhXruxezluqK/PaemSpOp0LfBExJ9FxLURcVVE/H3L8fdExNKIuC4intWt+vWC6+9eQyY87IB5AFtnaVURRK5Zvpr5e8xiwdxZQNGaVOWYmhvuXsPR5YBlKO7NFh5JUlV2ult6FSLiqcBpwKMyc1NE7FcePwZ4OfAI4CDgRxFxdGYOdaOe3XbtXasBeFi5h9bIOjyDQ9UEnoeXLUkjZVU1a2pwaJibVq7j5KMXbD3m1hKSpCp1q4XnT4GzMnMTQGauKI+fBnw1Mzdl5s3AUuDELtWx665ZvobdBvo5dJ85wLYurU638AwODXPD3Wt5+IHzth7r7+urrIXnlnvXs3loeOuA5aI8A48kqTrdCjxHA0+KiIsj4sKIeEx5fCFwe8t1d5THpqVr71rNQw8o9pmC6gYt33TPOjYPDe/QwjNY0dLHN4yaoQUGHklStSrr0oqIHwEHjHHqvWW5+wAnAY8BvhYRh0/y/c8AzgA49NBDd62yPSgzufauNTz7kdu+hVUNWr5medF1tn0LT3VjeK67ew3Rsvs7VD9IWpI0vVUWeDLzGeOdi4g/Bb6Rxe6Ul0TEMDAfWAYc0nLpweWxsd7/bOBsgMWLFzfuN+Xdqzexav2WrQOWobpBy9fetYaB/uCIBdsCyEB/dS0uN9y9lkP2nsNu5e7vYAuPJKla3erS+hbwVICIOBqYCdwDnAu8PCJmRcRhwFHAJV2qY1ddM2rAMlDZXlpLV6xl0b67M9C/7a9DlS0814+aoQXFtPQKxmJLkgR0aZYW8FngsxFxJbAZeF3Z2nNVRHwNuBoYBN48bWdoLS/GuWzXwhPVBJ4bV67l6P3mbndsRl8fG7Z0/lu/ebDY/f0Zx+y/3fH+cKVlSVJ1uhJ4MnMz8Opxzn0Q+GC9Neo91961moP2nM2ecwa2HquihWfL0DC33bt+62rOrWVVMWj5tvvWMTicW1dYHjGjz81DJUnVcaXlHnXVncUMrVZVBJ7b7lvP4HBuN34HijE8VXRpXbHsAQAesu+c7Y739VWzZYYkSWDg6UnrNw+ydMVaHtiwZbvjVQSekT20Dl+w+w5lVRFALrn5fmD7GWFby3OWliSpIgaeHnTzPesAeFG5keeIrYGng8Fg6coi8BwxRhdTFS08X7nkNgDmzNy+N7XPlZYlSRXq1qBlTeBbvytm4o8e51JNC8869ps7i3mzB7Y7XtUYnsPn7771PkaX5zo8kqSq2MLTg+58YCMAj1y453bHq5ilddt961i07+47HJ9RwbT0zGTFmk08/oh9dzjnXlqSpCoZeHpRwswZfew+a/sGuKoGLR86agAxFNtYdDqA3LN2M2s3DXLY/B0D1kB/H1sq2spCkiQDTw+6/f71PPawfXY4PnNG8XFtHuxMMNi4ZYi7V2/iIfvsGHiq2Dx0ZPf3h4zRojR7oI+NWww8kqRqGHh60C33rNth2jZsG+i7fvNgR8q5/b71ABwyRuCZNaOPjR1eeHDF6k0AHLjX7B3OzR7o73h5kiSNMPD0mPvWbWb1xkEW7rVjCNltoNh7akOHWkKWl2OFFu692w7n5szsZ8PmIbKDA4nvuH8DwJhjhmbN6GNTh1quJEkazcDTY269t5iSfuCeY7WC9BEBGzrUwrP8gSKAHDBvx7J2nzWDweFkcwfH1dxx/3r2nzeL2QP9O5yzhUeSVCUDT48ZWYn4mIPm7XAuIthtoJ/1m4tgcPt961l05nncdu/6B1XWnas2EgH7jxF45pQ7ma/f1LkQsmzVBhbutWNrEsCsgX42DQ6TmQwPJ0tXrGHDZgOQJKkzXIenx6xaX6yufMjeO3ZpQdnVtGWIT/zoej7xoxsAePJHLgDgpg+dSt8Ya9yMZ8Wajey7+6ytg6Fb7V6OF1q3eZCVazfxzI//DICPnH4sL1l8SPs31OKuBzbusMLyiNkDRR02DQ7zsL/53nbnln7w2czoN5tLkh48f4v0mGX3b2DB3FnsNnPHbh8oun42bB7aGnZaHf5X353UVPK7V29i/3mzxjw3Z1ZR/qr1W7aGHYB3ff1yFp15XttljMhMbrpnHQvmjl3e7BlFea1ljTjyvefz7d8vm3SZkiSNMPD0mDtWrR+32weKFp4lt96/9fktZz2H3/3NH259fsRffZevX3pHW2XdvXrjmN1ZsK2F57n/9Isxz0829KzeUIw7mjNOkBs5fls5c+xH7ziZKz/wrK3n3/rV3/PN37V3X5IkjWbg6THLV22cMPDsNnPG1lDw0Zc8CoC9d5/JzX936tZr3vlfl3HqP/58p2UVgWecFp5RweS6vz2FW856Dm956pFbj00m9KxYU8wIG70D/IjRLT9H7rcHe8yawS1nPWfrsbf/52V8/le3tF2mJEkjDDw9JDNZ/sBGDhhjhtaIg1rOvfjR2zYXjYjtwsHVy1dPGEi2DA1zz9rN47fwjFrleVbZ5fTOZz2Un7/7qVuPLzrzPG4sNyCdyIo1xRo8+80du7zW4//fCx653bnW+3rfuVc9qC41SdL0ZuDpIavWb2HDlqExp6SPuG/d5gnf45aznsOLTli49fmiM8/je1fetcN1K8sAMl7gaa3DOa9bvN25Q/aZw40f2tai9PSPXsh/76QbbaS8/cZpUXrI/G2DtF9z0kN2OH/LWc9h/h7bXrvozPMYdu8tSVKbDDw9ZGQhwIMm6NL6+9OPBeCSv3r6uNd87KXH8e+v3RZS3vSlS1l05nnbDWi+e3VR1n7jDCLetyVcPP3h++9wvr8vtgs9f/Ffl+1QRquRLq3xyps3e4DjD92LNzzhsPFuiyV//Qze97xjtj4//K++67geSVJbDDw95O4yFIzX6gLFPlS3nPUc9pvgGoBnHLP/duN6oBjQPNIddPXyYl+r1mAz2s1/d+oO79Gqv2/7brSRMj73y5t3uHbF6k3sNtDPHrPGXwnhm//7CfyflkAzltc/4bDtwt7b//Myu7gkSTtl4OkhK3bS6jJZI+N6/uOPH7vd8UVnnsd7v3klsONg4dGvj9j5uj63nPUcLnzXU7Y+f/93rmbRmedxxR0PbD22Ys0m9ps3q63325n95s3eIYgtOvM8Hvd3P+7oVhiSpOYw8PSQkc01xxvn8mA9/oj547bUHLiTlqJ2jbQ8tXreP/+CRWeex8s+82tWrNnYsSAH28Lcb1um5C9/YCOHvadoxVq9cUvHypIkTX2utNxDVqzZxF5zBrbOiOqkkYAwPJz82Vd+x3lXLAeY1MrM7RgJPa3dTBfffB8Aj1w49irLu2Kf3Wdyy1nP4WtLbufdX7986/Fj3/8DAA7ZZzcu+IunuFKzJE1z0YQugMWLF+eSJUu6XY1ddsYXlnDLvev4wdtPrrys2+9bz+33r+fxR8yvtJzFf/sj7lm7aevz0a1AnfbrG+/lFf920Zjn3nTyEbztGUeNuXmpJKl3RMSlmbl451dO4j0NPL3jBZ/6JXNnz+CLb3zszi+eQjKTp330Qt781CM5vWXtoCoNDydP/ehPuXUnG6v+6B0nc+R+e9RSJ0lSe6oIPHZp9ZCVazZx+ILdu12NjosILnjnU2ots68vuPBdxQKJy1Zt4Aln/WTM657xsQvHPH7S4fvwkdMfxSH7jL2JqyRpajHw9IjMZOWaTeOuRKwHb+Feu23XlTZRt9eIi266jyf9/QXjnj9x0T783Yv/gA2bh9hztwEWzJ3FjL5wrJAk9ahGBJ4rlj3AWedfy79eeOMO55589AKefNR8br9vPU952H7sPWcmP79+JScetg/rNg9yyN5z2HO3AW67bz1zZw/Q3xccuOdsZg/0M5xJfwQRbDedOjPZuGWY2QN9HZlmDbB64yCbh4aZv8fMjryfxve4I/bdYSzRuk2D/O8v/5YLr1/Z1ntccst9PP2jY7cOddKMvmCvOQPM7O/j0Yv2Yf4eM9l/3mwO2XsOF998L9+78i72nzebg/aaza33rmfebgO86PiFnHT4vgxlMjSc3HzPOg7Zew6HL9id4Uxmzeinr+XvdGYynNAXsH7zELsN9DOUyf3rN7Ps/g2s3jjIPnNmsmj+HHYb6GdGfx9rNm5hj1kzGE4YzmSgJegND2fHB8OPlpkd+9nbFYNDw/T3BSMjA1r/rVi2agOr1m9mRl8fw5nsNWeAe9Zs5v71mzn3sjvb3uR3xMMPnMdjD9uH4w/di6P3n8uvb7yXjYNDHLbv7jz28H1Zt2mQ/ebNoi+Cgf6+rUs0TPR9Gh7OHf59G5GZZMJQ+e/g2s2DXHjdSg6bvzvHHDiP+9ZvZu7sGWRSlhkMJwwNJwP9xfdk89Awm7YMM2+3GWzcMsyyVetZtO/u9EXs8HdkaDjZuGWIdZsHGejrY9WGLRyy927cuWojG7YM0RfFvoHDw8mKNZv48TUr+MNj9uegvWYzo7+P9ZsG2Wf3mfSV/2bfeu969pg9g/l7zOLOVRuY0Rfcs3Yz1yxfzYF7zWbe7AF+c8t97DVngMxiFfu7V2/k4pvv49EP2ZuLb7qPZz/yAG5cuZaLbrqP0x99MDNn9PGxH17Pnz/9KD754xuY0RcM9siK73Nnz2DNxsGtz5901Hxe+7hFXLnsAU5+6AJ+e+v9xWd30Dz2njOT9ZuHWLFmIwfO242hTO5du4m5swf41Y33sGbjIA/Zdw4L99qNTYPDrN64hVkz+pjR18dvbrmPvggedsBcHrFwT+bOmkEEDA5v/+9AL2rEGJ5ZBx6VB77uE92uRke85qSH7LCXlLprzcYtLF2xlhd++lfdrookTQu3fvi5juFpusuXPbDzi1SrubMHOP7QvSc9w2zkPxNbhopWltUbt9AXwV9/60quKVe6HrHf3FlbN1jV9PKoQ/bisttXdbsaqtiBe87eun1QBDSgrWHKaUQLTzdnaQ0NZ9mkXTT/DmfSF8GW4WEG+ormvYjiuhktzczDydbXRRR/fvC8a/jLZz+s55sFpckYHk42Dw2zbtMgM/r76AvYNDjMnrsN0BfB4PAwM/v7GBxOZpTdHJsGi2OtPS0jPzPtaP25GumuGelqG/kZzNx+Harxusl6pftMmg6GhpNNg0PsPmvAFp5eM/IPcJT9xn0Uz2f1bb/Wy4z+bdcBlE+3Po8I/vq5E+8jJU1FfX3B7L7+7dY/mttyvr/8WRno3xYqxlorqX8SmaP156q1HtufG/s1472XpOr19wVzZlYTTWxKkCRJjWfgkSRJjWfgkSRJjWfgkSRJjWfgkSRJjWfgkSRJjWfgkSRJjWfgkSRJjdeIlZYjYg1wXbfr0SXzgXu6XYku8d6nn+l63+C9e+/Ty0Mzc+7OL2tfU1Zavq7TS1BPFRGxxHuffqbrvU/X+wbv3XufXiKi4/tF2aUlSZIaz8AjSZIarymB5+xuV6CLvPfpabre+3S9b/Dep6vpeu8dv+9GDFqWJEmaSFNaeCRJksZl4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY1n4JEkSY03o9sV6IT58+fnokWLul0NSZLUAZdeeuk9mbmgk+/ZiMCzaNEilixZ0u1qSJKkDoiIWzv9nnZpSZKkxjPwSJKkxjPwSJKkxjPwSJKkxjPwSJKkxjPwSJKkxjPwSJKkxmvEOjxNkJncsGItazYOjnvNQw+Yyx6zOvORbdwyxFV3rh73/G4D/Tz8wLlEREfKu3PVBpY/sHHc8wfvvRv7z5vdkbIkSRrNwNMjrrt7Dad84ucTXvOi4xfysZcd15HyPvL96zjnFzdPeM1//PFjefwR8ztS3imf+BmrJwhzC/fajV+e+bSOlCVJ0mgGnh4x0rLzrmc9lEcu3HOH83/zrSsnDAyTL28Le88Z4BMvP36Hc7fdu46/+fZVE7Y2Tbq8TYM8/1EH8eJHH7zDuS9ddCsX33Rvx8qSJGk0A0+PedTBe/HEo3ZsVelUV1ar2QP9nHz0jluVXHXnzI6XBbBo3zljlnfBtSsqKU+SpBEOWpYkSY1n4JEkSY1n4JEkSY1n4JEkSY1XW+CJiP6I+F1E/E/5/LCIuDgilkbEf0bEzPL4rPL50vL8orrq2E2ZbV1Va3nt1akz5XWwKEmSdlBnC89bgWtann8Y+HhmHgncD7yxPP5G4P7y+MfL6yRJkh60WgJPRBwMPAf49/J5AE8Dvl5e8nngBeXj08rnlOefHp1a7ncKGO9Oq/gOjPeWMe6ZXS1w7PedPp+uJKlb6mrh+QTwbmC4fL4vsCozR1a2uwNYWD5eCNwOUJ5/oLx+OxFxRkQsiYglK1eurLDqkiRpqqs88ETEc4EVmXlpJ983M8/OzMWZuXjBgh0Xs5MkSRpRx0rLTwCeHxGnArOBecA/AntFxIyyFedgYFl5/TLgEOCOiJgB7Am474AkSXrQKm/hycz3ZObBmbkIeDnwk8x8FXABcHp52euAb5ePzy2fU57/SWYn5wtJkqTpppvr8Pwl8I6IWEoxRuec8vg5wL7l8XcAZ3apfrVqJ9N1dJp4B6/qCCOtJKlCtW4empk/BX5aPr4JOHGMazYCL6mzXpIkqdlcabnHjDtVvIpp6TVPE699GrwkSSUDjyRJajwDjyRJajwDjyRJajwDjyRJajwDT49oZ1Z2J2du17lbeltT7jtTlCRJYzLwSJKkxjPw9Jrxdkuvcep2ZdPSa9wJXpKkVgYeSZLUeAYeSZLUeAYeSZLUeAYeSZLUeAaeHtHeNPHOTd7ONiaCd6q0uu9NkqTRDDySJKnxDDw9Zrzp59Xslj65OuxyeePdWyWlSZK0jYFHkiQ1noFHkiQ1noFHkiQ1noFHkiQ1noGnR9Q5TbzdN+vYbukdukaSpAfLwCNJkhrPwNNjxp8qXmNZ7pYuSWoYA48kSWo8A48kSWo8A48kSWo8A48kSWo8A0+vqHGaeJvFtTVVvq2y2qi4m6VLkqpk4Okx405YqmAqU92beY73vuE0LUlSxQw8kiSp8Qw8kiSp8Qw8kiSp8Qw8kiSp8Qw8kiSp8Qw8PaLuHcXrnCpe5xR4SZLGYuDpMeNN0W705qHVFCdJ0lYGHkmS1HgGHkmS1HgGHkmS1HgGHkmS1HiVB56ImB0Rl0TEZRFxVUR8oDx+WERcHBFLI+I/I2JmeXxW+XxpeX5R1XWUJEnNVkcLzybgaZn5KOA44JSIOAn4MPDxzDwSuB94Y3n9G4H7y+MfL69rvHamgLczlbzt8jp0TVtl1bwTvCRJo1UeeLKwtnw6UH4l8DTg6+XxzwMvKB+fVj6nPP/0mEbbadc5VXz8t6zm2z3uxzhtPl1JUrfMaOeiiJgNPBd4EnAQsAG4EjgvM69q4/X9wKXAkcCngBuBVZk5WF5yB7CwfLwQuB0gMwcj4gFgX+CeUe95BnAGwKGHHtrObUiSpGlqpy085ZibXwKPAy4GPgN8DRgEzoqIH0bEsRO9R2YOZeZxwMHAicDDdrHeZObZmbk4MxcvWLBgV99OkiQ1WDstPJdk5vvGOfexiNgPaKuJJTNXRcQFFOFpr4iYUbbyHAwsKy9bBhwC3BERM4A9gXvbeX9JkqSx7LSFJzPPG+t4OfvqJZm5IjOXjPf6iFgQEXuVj3cD/hC4BrgAOL287HXAt8vH55bPKc//JDs5WleSJE07kxq0HBH9EXFqRHwRuBV4WRsvOxC4ICIuB34D/DAz/wf4S+AdEbGUYozOOeX15wD7lsffAZw5mTpKkiSN1u6g5ZOBVwKnApcATwAOy8z1O3ttZl4OHD/G8ZsoxvOMPr4ReEk79WqSuncLr3MafDv3ZhOeJKlKOw08EXEHcBvwL8A7M3NNRNzcTtjR5I03Q7ua3dLH2Zm95mni4bx0SVLF2unS+jrFVPSXAc+LiN3xP+SSJGkKaWfQ8tuAw4CPAk8BrgMWRMRLI2KPSmsnSZLUAW0NWi5XS74gM8+gCD+vpFgR+ZYK6yZJktQRbQ1abpWZW4DvAN8pp5lLkiT1tLYDT0Q8AXg/8JBRrzu8w3WalureYLPOQVht1dtRYZKkCk2mhecc4O0Ue2INVVMdSZKkzptM4HkgM8+vrCYCJtotvfNTt+ucAg/17gQvSVKryQSeCyLiI8A3gE0jBzPztx2vlSRJUgdNJvA8tvxzccuxBJ7WuepIkiR1XtuBJzOfWmVFJEmSqrLTdXgi4tURMe51EXFERDyxs9WSJEnqnHZaePYFfhcRl1LM0FoJzAaOBE4G7sEdzXdZezO3Ozd3u52NQTs5DX6nZTkvXZJUoZ0Gnsz8x4j4Z4qxOk8AjgU2ANcAr8nM26qtoiRJ0q5pawxPZg4BPyy/VKlxdjCvr6hKpsAXxdV4b5IktWhrLy1JkqSpzMAjSZIar+3AExGHtXNMkiSp10ymhee/xzj29U5VRJIkqSo7HbQcEQ8DHgHsGREvajk1j2J6ujqg7mnidU6Dr3sneEmSRmtnltZDgecCewHPazm+BvjjCuokSZLUUe2sw/Nt4NsR8bjM/HUNdZrW6txR3N3SJUnTxWQ2D10aEX8FLGp9XWa+odOVkiRJ6qTJBJ5vAz8HfgQMVVMdSZKkzptM4JmTmX9ZWU0kSZIqMplp6f8TEadWVhNJkqSKTCbwvJUi9GyMiNURsSYiVldVsemmrWninZy6XeNU8XamtzsrXZJUpba7tDJzbpUVkSRJqspktpaIiHh1RPxN+fyQiDixuqpNT+NPFe/83O3xdkWvapp4nfcmSVKryXRpfRp4HPDK8vla4FMdr5EkSVKHTWaW1mMz84SI+B1AZt4fETMrqpckSVLHTKaFZ0tE9FOOL42IBcBwJbWSJEnqoMkEnk8C3wT2i4gPAr8APlRJrSRJkjqorS6tiOgDbgbeDTydYvzpCzLzmgrrNr20M028g5O325oq3qlp6W1NgXdiuiSpOm0FnswcjohPZebxwLUV10mSJKmjJtOl9eOIeHGMN5dZHTHut7fW3dKr+YjdLV2S1C2TCTx/AvwXsMmVliVJ0lQymTE8p2TmLyuujyRJUse11cKTmcPAP1dcF0mSpEpUPoan3ILigoi4OiKuioi3lsf3iYgfRsQN5Z97l8cjIj4ZEUsj4vKIOGEy5UmSJI1WxxieQeAvMvMY4CTgzRFxDHAm8OPMPAr4cfkc4NnAUeXXGcC/TKKOU1ad08Tbfa9OFdfWTvAdKkuSpLG0HXgyc25m9mXmzMycVz6f18brlmfmb8vHa4BrgIXAacDny8s+D7ygfHwa8IUsXATsFREHtn9LkiRJ22t7L62IePJYxzPzZ5N4j0XA8cDFwP6Zubw8dRewf/l4IXB7y8vuKI8tbzlGRJxB0QLEoYce2m4Vet74U8UrKKvmaeLjTXd3VrokqWqT2Tz0XS2PZwMnApcCT2vnxRGxB/DfwNsyc3XrUKDMzIiYVK9GZp4NnA2wePFie0QkSdK42g48mfm81ucRcQjwiXZeGxEDFGHny5n5jfLw3RFxYGYuL7usVpTHlwGHtLz84PKYJEnSgzKZQcuj3QE8fGcXlbO6zgGuycyPtZw6F3hd+fh1wLdbjr+2nK11EvBAS9eXJEnSpE1mDM8/sW0yTR9wHPDbNl76BOA1wBUR8fvy2F8BZwFfi4g3ArcCLy3PfRc4FVgKrAde324dJUmSxjKZMTxLWh4PAl9pZ+XlzPwF449LffoY1yfw5knUqxHqnCbednkdmgffzvu4WbokqUo7DTwRsQBYkJmfH3X8mIhYkJkrK6udJElSB7QzhuefgPljHN8X+MfOVkd1ThWvalf0ccsbd869E9MlSdVqJ/AcOdZaO5n5c+DYzldJkiSps9oJPHMnODfQqYpIkiRVpZ3AszQiTh19MCKeDdzU+SpJkiR1VjuztN4GnBcRL6VYWRlgMfA44LkV1UuSJKljdtrCk5k3AH8AXAgsKr8uBI7NzOurrNx00ta07E7ult7O7uwdK0uSpO5qax2ezNwE/L+K6yJJklSJXdlaQhUYf0fxzk/drnu39HHrUW9xkqRpyMAjSZIar+3AExFvbeeYJElSr5lMC8/rxjj2vzpUD0mSpMq0s5fWK4BXAodFxLktp+YC91VVMUmSpE5pZ5bWr4DlFPtpfbTl+Brg8ioqNR21Nyu9cxO865wG3+5O6JlJuK+WJKkCOw08mXkrcCvFQoOSJElTTlvr8ABExBq2/Z9/JsU+Wusyc14VFZuuemGqeFWtLOO9r406kqSqtR14MnPrJqJR/OY6DTipikpJkiR10oNahycL3wKe1dnqSJIkdd5kurRe1PK0j2ID0Y0dr5EkSVKHtR14gOe1PB4EbqHo1pIkSeppkxnD8/oqKzLdZRtzt9ud3t1WeW1d06l56W1elg5gliRVYzJbSxweEd+JiJURsSIivh0Rh1dZOUmSpE6YzKDl/wC+BhwIHAT8F/CVKiqlHVXR8jHuNPHOFzXh+1axE7wkSa0mE3jmZOYXM3Ow/PoSMLuqikmSJHXKZAYtnx8RZwJfpRiV8TLguxGxD0Bmuq+WJEnqSZMJPC8t//yTUcdfThGAHM8jSZJ60mRmaR1WZUUkSZKqMpkWHiLi8cCi1tdl5hc6XKdpqcbNy4v3auPNOjUNvt3p7Z28P0mSWk1mpeUvAkcAvweGysMJGHgkSVJPm0wLz2LgmGxnhTw9aOPull7B1O1xp4lXNEu8F3aClyRNT5OZln4lcEBVFZEkSarKZFp45gNXR8QlwKaRg5n5/I7XSpIkqYMmE3jeX1UlJEmSqjSZaekXVlkRSZKkquw08ETEGsaeMRxAZua8jtdqGmpvmnhHJ6Z34Io2S2p7t/Skup28JEnT2U4DT2bOraMikiRJVZnMLC3VYLzp59Xslj65OuxyeZM8LklSpxh4JElS4xl4JElS41UeeCLisxGxIiKubDm2T0T8MCJuKP/cuzweEfHJiFgaEZdHxAlV10+SJDVfHS08nwNOGXXsTODHmXkU8OPyOcCzgaPKrzOAf6mhfpIkqeEqDzyZ+TPgvlGHTwM+Xz7+PPCCluNfyMJFwF4RcWDVdewN9U0Th7p3S+/sdZIkTVa3xvDsn5nLy8d3AfuXjxcCt7dcd0d5TJIk6UHr+qDlcvf1Sf/nPiLOiIglEbFk5cqVFdSsO+rcObzu3ctjnDd2t3RJUtW6FXjuHumqKv9cUR5fBhzSct3B5bEdZObZmbk4MxcvWLCg0spKkqSprVuB51zgdeXj1wHfbjn+2nK21knAAy1dX5IkSQ/KZHZLf1Ai4ivAU4D5EXEH8D7gLOBrEfFG4FbgpeXl3wVOBZYC64HXV10/SZLUfJUHnsx8xTinnj7GtQm8udoaSZKk6abrg5ZVqHOaOLQ3Sjw7NFG83V3eO7oZvCRJLQw8kiSp8Qw8PWb8qeKdn7s97s7sHS+pfN8a702SpFYGHkmS1HgGHkmS1HgGHkmS1HgGHkmS1HgGnh7R3jTxDpbXxhzw+ndLd166JKkaBp4eU+fMqXEnR1W1eWg1bytJ0k4ZeCRJUuMZeCRJUuMZeCRJUuMZeCRJUuMZeCRJUuMZeHpEW1PAO7ideJ3T4NuttrulS5KqYuDpMeNvsFlBWeMer2pe+jhT7p2vLkmqmIFHkiQ1noFHkiQ1noFHkiQ1noFHkiQ1noFHkiQ1noGnR7SzU3hnd0vv1EVtvI27oEuSuszA02Nq3cC85mnitU+DlySpZOCRJEmNZ+CRJEmNZ+CRJEmNZ+CRJEmNZ+CRJEmNZ+DpEe3MAO/kbuJ17pbe7hu5W7okqSoGnh4z/m7pnZ+6XesUeOrdCV6SpFYGHkmS1HgGHkmS1HgGHkmS1HgGHkmS1HgGnh7R3qypzk1jyjamRHVq1lS7b+Mmo5Kkqhh4JElS4xl4es44O5hXUVKNU+Bh/F3RnZUuSaqagUeSJDWegUeSJDVezwaeiDglIq6LiKURcWa36yNJkqaungw8EdEPfAp4NnAM8IqIOKa7tZIkSVPVjG5XYBwnAksz8yaAiPgqcBpw9VgXD2WyeuOWGqvXeRs3D+30msGhzt3n4NDOp4Bv2DLUkfLWbBxs+7rBYaemS5I6r1cDz0Lg9pbndwCPHe/iq+9czbHv/0HllarDQP/Yc5Zm9AfX3rWmo/d54qJ9xjze31fU4azzr+Ws86/tWHkzxr23oqHxsR/6ccfKkiSpVa8Gnp2KiDOAMwDmLzyMv37Ow7tco12395yZHLrPnDHPvfOZD+Ux4wSUB+uxh+075vE9dxvgU688geUPbOhYWTNn9HHKIw8Y89yLjl9If2DrjiQJgD/+cOffM9pZcbduEfE44P2Z+azy+XsAMvPvxrp+8eLFuWTJkhprKEmSqhIRl2bm4k6+Z08OWgZ+AxwVEYdFxEzg5cC5Xa6TJEmaonqySyszByPiLcD3gX7gs5l5VZerJUmSpqieDDwAmfld4LvdrockSZr6erVLS5IkqWMMPJIkqfEMPJIkqfEMPJIkqfEMPJIkqfF6cuHByYqINcB13a5Hl8wH7ul2JbrEe59+put9g/fuvU8vD83MuZ18w56dlj5J13V6RcapIiKWeO/Tz3S99+l63+C9e+/TS0R0fPsEu7QkSVLjGXgkSVLjNSXwnN3tCnSR9z49Tdd7n673Dd77dDVd773j992IQcuSJEkTaUoLjyRJ0rh6LvBExCERcUFEXB0RV0XEW8e4JiLikxGxNCIuj4gTWs69LiJuKL9e13L80RFxRfmaT0ZE1HVP7diV+46I4yLi1+XrLo+Il7W85nMRcXNE/L78Oq7G22pLBz7zoZb7O7fl+GERcXH5mv+MiJl13VO7dvFzf2rLff8+IjZGxAvKc0353B9W/t3eFBHvHHXulIi4rvy+nNlyvKc/912574leGxHvj4hlLZ/5qXXdU7s68JnfUv47/vtomcUTEftExA+j+Hf/hxGxdx33Mxm7+Lk/dNTP+uqIeFt5rimf+6vKf9+uiIhfRcSjWs515mc9M3vqCzgQOKF8PBe4Hjhm1DWnAucDAZwEXFwe3we4qfxz7/Lx3uW5S8pro3zts7t9rx2876OBo8rHBwHLgb3K558DTu/2/VV17+W5teO879eAl5eP/xX4027fa6fvveWafYD7gDkN+9z3Ax4DfBB4Z8vxfuBG4HBgJnDZyGt7/XPfxfse97XA+1uv7cWvXbn38twtwPwx3vfvgTPLx2cCH+72vXb63luu6QfuAh7SsM/98Wz7ff1stv1+69jPes+18GTm8sz8bfl4DXANsHDUZacBX8jCRcBeEXEg8Czgh5l5X2beD/wQOKU8Ny8zL8riO/MF4AU13VJbduW+M/P6zLyhfO2dwApgQY3V3yW7+JmPKSICeBrw9fLQ5+mxzxw6eu+nA+dn5vrKK90h7dx7Zq7IzN8AW0a9/ERgaWbelJmbga8Cp02Fz31X7rvNvy89axc/84mcRvFZQw9+5tDRe386cGNm3lpZZTuszXv/Vfl7G+Ai4ODyccd+1nsu8LSKiEXA8cDFo04tBG5veX5HeWyi43eMcbwnPYj7bn3tiRQp+MaWwx8smwo/HhGzOl/jznmQ9z47IpZExEUjXTrAvsCqzBwc4/qetCufO/By4CujjjXhcx/PeN+TKfW5P4j73tlr31J+5p/txW6dVg/y3hP4QURcGhFntBzfPzOXl4/vAvbvTC2rsSufO2P/rDftc38jRas2dPBnvWcDT0TsAfw38LbMXN3t+tRlV+67/F//F4HXZ+Zwefg9wMMomkn3Af6yg9XtqF2494dksRLpK4FPRMQRlVSwQh343P8A+H7L4enwuU9pu/iZj/XafwGOAI6j6Nb+aOdq21m7cO9PzMwTKLo83hwRTx59QdmK37PTj3fxc58JPB/4r5bDjfrcI+KpFIGn4/9m9WTgiYgBim/KlzPzG2Ncsgw4pOX5weWxiY4fPMbxnrIL901EzAPOA95bdnsAW5sSMzM3Af+Ponmw5+zKvWfmyJ83AT+l+N/DvRRdPzNGX99rduXeSy8FvpmZW5vBG/S5j2e878mU+Nx34b7HfW1m3p2ZQ+V/dv6N5n3mrT/rK4Bvsu0e7x7p5i3/XNG5GnfOrtx76dnAbzPz7pEDTfrcI+JY4N+B0zLz3vJwx37Wey7wlP1y5wDXZObHxrnsXOC1UTgJeKBszvw+8MyI2Lts1nsm8P3y3OqIOKl8/9cC367+btq3K/ddpv5vUozz+HrrC1r+EQiK/s0rq7qHB2sX733vke6aiJgPPAG4uvxf3gUUY1sAXkePfeawy3/fR7yCUU3cDfrcx/Mb4KhylsZMimb+c6fC574r9z3Ra0eN63ohDfvMI2L3iJg78pji3/eRezyX4rOGHvzMYZf/vo8Y92e9NGU/94g4FPgG8JrMvL7lVOd+1rMHRnC3fgFPpGiOvBz4ffl1KvAm4E3lNQF8imKcyhXA4pbXvwFYWn69vuX4Yoq/CDcC/0y56GKvfO3KfQOvphjk9vuWr+PKcz8pr70S+BKwR7fvtcP3/vjy+WXln29sed/DKWbnLaVoAp7V7Xut4O/7Ior/1fSNet+mfO4HUPTNrwZWlY/nledOpZjtcSNFy+aU+Nx35b7He235mi+Wn/nlFAHgwG7fa4fv/fDy5/wy4KpRn/m+wI+BG4AfAft0+14r+Pu+O0Wrxp6j3rcpn/u/A/e3nF/S8vqO/Ky70rIkSWq8nuvSkiRJ6jQDjyRJajwDjyRJajwDjyRJajwDjyRJajwDjyRJajwDj6RdFhH7RsTvy6+7ImJZ+XhtRHy6ojLfFhGv7eD7fTUijurU+0nqLa7DI6mjIuL9wNrM/IcKy5gB/BY4IbdtHrir73ky8OrM/ONOvJ+k3mILj6TKRMRTIuJ/ysfvj4jPR8TPI+LWiHhRRPx9RFwREd8r99ohIh4dERdGsSP290ctnT/iaRR7Cg2Wr/nziLg6ih2jv1oe2z2K3aMviYjfRcRp5fH+iPiHiLiyvP7Pyvf8OfCMlr15JDWIgUdSnY6gCCvPp9jy4oLM/ANgA/CcMvT8E3B6Zj4a+CzwwTHe5wnApS3PzwSOz8xjKZarB3gv8JPMPBF4KvCRcg+mMyi25DiuvP7LAFlsvrgUeFTnbldSr/B/MpLqdH5mbomIK4B+4Hvl8SsoQshDgUcCPyz2G6QfWD7G+xwIXNPy/HLgyxHxLeBb5bFnAs+PiHeWz2cDhwLPAP51pHUoM+9reZ8VwEFsH6YkNYCBR1KdNkHRmhIRW3LbIMJhin+PArgqMx+3k/fZQBFgRjwHeDLwPOC9EfEH5Xu9ODOva31hGaTGM7t8b0kNY5eWpF5yHbAgIh4HEBEDEfGIMa67BjiyvKYPOCQzLwD+EtgT2AP4PvBnUSaciDi+fO0PgT8ZGasTEfu0vO/RFDvMS2oYA4+knpGZm4HTgQ9HxGXA74HHj3Hp+RQtOlB0e32p7Cb7HfDJzFwF/H/AAHB5RFxVPgf4d+C28vhlwCsBImJ/YENm3lXBrUnqMqelS5qSIuKbwLsz84YOvd/bgdWZeU4n3k9Sb7GFR9JUdSbF4OVOWQV8voPvJ6mH2MIjSZIazxYeSZLUeAYeSZLUeAYeSZLUeAYeSZLUeAYeSZLUeP8/UMrpc7YP5fMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Get the stimulus trace (in amps) and convert to pA\n", "stim_current = sweep_data['stimulus'] * 1e12\n", "\n", "# Get the voltage trace (in volts) and convert to mV\n", "response_voltage = sweep_data['response'] * 1e3\n", "\n", "# Get the sampling rate and can create a time axis for our data\n", "sampling_rate = sweep_data['sampling_rate'] # in Hz\n", "timestamps = (np.arange(0, len(response_voltage)) * (1.0 / sampling_rate))\n", "\n", "fig, ax = plt.subplots(2, 1, sharex=True, figsize=(9,9))\n", "\n", "ax[0].set_title('Cell: '+str(cell_id)+', Sweep: '+str(sweep_number))\n", "ax[0].plot(timestamps, response_voltage)\n", "ax[0].set_ylabel('Cell Response (mV)')\n", "ax[1].plot(timestamps, stim_current)\n", "ax[1].set_xlabel('Time (sec)')\n", "ax[1].set_ylabel('Input Current (nA)')\n", "ax[1].set_xlim([2,2.2])\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's how you can dig into the morphology and raw electrophysiology traces for single cells. In the next notebook, we'll take a look at some of the features of these action potentials." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }