{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Scripting NEURON basics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The objectives of this part of the tutorial are to get familiar with basic operations of NEURON using Python. In this worksheet we will:\n", "\n", "* Create a passive cell membrane in NEURON.\n", "* Create a synaptic stimulus onto the neuron.\n", "* Modify parameters of the membrane and stimulus.\n", "* Visualize results with bokeh." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is NEURON?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The NEURON simulation environment is a powerful engine for performing simulations of neurons and biophysical neural networks. It permits the construction of biologically realistic membranes with active and passive ion channels, combined with virtual connectivity and electrophysiology tools to drive and measure neuron and network behaviors." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 1: Import the neuron module into Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Any code that is not part of Python's Built-in Functions must be imported. The Python interface to NEURON goes through the neuron module, especially the neuron.h submodule. The neuron module has additional submodules, including neuron.rxd for reaction-diffusion dynamics, neuron.gui2 for Jupyter-compatible PlotShape graphs, and neuron.gui for Interviews-based GUI tools. The neuron.h submodule also allows loading files, executing code, and calling functions written in HOC, an older scripting language supported by NEURON. This allows the continued use of HOC libraries in Python code." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To import neuron, we could use:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:57.870764Z", "iopub.status.busy": "2025-05-23T00:18:57.870609Z", "iopub.status.idle": "2025-05-23T00:18:58.159834Z", "shell.execute_reply": "2025-05-23T00:18:58.159420Z" } }, "outputs": [], "source": [ "import neuron" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the above succeeded, it produces no output (in recent versions of NEURON), so how can we know what version of NEURON we have? Simple: ask for the `__version__`:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.162140Z", "iopub.status.busy": "2025-05-23T00:18:58.161938Z", "iopub.status.idle": "2025-05-23T00:18:58.165456Z", "shell.execute_reply": "2025-05-23T00:18:58.165125Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8.2.7+\n" ] } ], "source": [ "print(neuron.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are only a limited number of functions avaiable directly from the neuron module. In practice, we usually want to directly import the submodules we need; i.e. do something like the below instead:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.166920Z", "iopub.status.busy": "2025-05-23T00:18:58.166776Z", "iopub.status.idle": "2025-05-23T00:18:58.169637Z", "shell.execute_reply": "2025-05-23T00:18:58.169303Z" } }, "outputs": [], "source": [ "from neuron import h" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When using NEURON, you will always want the h submodule. You may or may not need to import the additional submodules mentioned above. If you do, they can be imported separately or loaded in one line with a comma separated list, as in:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.171751Z", "iopub.status.busy": "2025-05-23T00:18:58.171002Z", "iopub.status.idle": "2025-05-23T00:18:58.186402Z", "shell.execute_reply": "2025-05-23T00:18:58.186028Z" } }, "outputs": [], "source": [ "from neuron import h, rxd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NB: When importing h, etc like this, there is usually no need for importing neuron separately." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

NEURON assumes certain default units (concentration in mM, time in ms, voltage in mV), but units can be specified explicitly by importing unit definitions from neuron.units. Even if you are using the default units, being explicit makes your code more readable by others. For example:

" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.188079Z", "iopub.status.busy": "2025-05-23T00:18:58.187933Z", "iopub.status.idle": "2025-05-23T00:18:58.190949Z", "shell.execute_reply": "2025-05-23T00:18:58.190626Z" } }, "outputs": [], "source": [ "from neuron.units import ms, mV" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the above gives you an error, then you are using a version of NEURON older than 7.7. Update before proceeding." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 2: Create a cell" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A Section is the basic morphological building-block in NEURON. We typically think of a Section as an unbranched cable, but it can also be used to represent a soma. Thus a simple model neuron with only a soma can be created as in:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.193165Z", "iopub.status.busy": "2025-05-23T00:18:58.192589Z", "iopub.status.idle": "2025-05-23T00:18:58.195501Z", "shell.execute_reply": "2025-05-23T00:18:58.195139Z" } }, "outputs": [], "source": [ "soma = h.Section(name=\"soma\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is no output, so how can we tell that we successfully created a Section?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aside 1: NEURON's h.topology function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

NEURON's h.topology() function displays the topological structure of the entire model, indicating which sections are connected to which sections, where they are connected, and how many segments each section is divided into.

\n", "

If you're following along with our example, there's not much to see yet since there is only one section, but it does demonstrate that the soma has been created and has one segment (one dash is shown):

" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.197109Z", "iopub.status.busy": "2025-05-23T00:18:58.196965Z", "iopub.status.idle": "2025-05-23T00:18:58.200661Z", "shell.execute_reply": "2025-05-23T00:18:58.200277Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "|-| soma(0-1)\n", "\n" ] }, { "data": { "text/plain": [ "1.0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.topology()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The h.topology() function displays its data to screen and returns 1.0 indicating success (this function always succeeds). Note: This function is only for displaying data; other methods must be used to store the data in a variable for programmatic analysis." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aside 2: The psection method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Every NEURON section has a psection method (think: properties of the section) that returns a Python dictionary providing a structured data representation of the properties of the section.

For example, we can query the soma via:

" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.202083Z", "iopub.status.busy": "2025-05-23T00:18:58.201870Z", "iopub.status.idle": "2025-05-23T00:18:58.205926Z", "shell.execute_reply": "2025-05-23T00:18:58.205611Z" } }, "outputs": [ { "data": { "text/plain": [ "{'point_processes': {},\n", " 'density_mechs': {},\n", " 'ions': {},\n", " 'morphology': {'L': 100.0,\n", " 'diam': [500.0],\n", " 'pts3d': [],\n", " 'parent': None,\n", " 'trueparent': None},\n", " 'nseg': 1,\n", " 'Ra': 35.4,\n", " 'cm': [1.0],\n", " 'regions': set(),\n", " 'species': set(),\n", " 'name': 'soma',\n", " 'hoc_internal_name': '__nrnsec_0x6067fe019070',\n", " 'cell': None}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soma.psection()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The results tell us the soma is a cylinder with length 100 microns, diameter 500 microns, axial resistivity 35.4 ohm*cm, and specific membrance capacitance 1 μF/cm2." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: calling this method does not itself print anything to the screen. Instead it returns a dictionary. We see the contents of the dictionary only because we are running interactively; from a script, nothing would be printed unless we explicitly printed it with print, or, better pretty-printed it with pprint.pprint." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since this is a dictionary, we can extract any properties we want using square brackets. For example, the length of the section is:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.207606Z", "iopub.status.busy": "2025-05-23T00:18:58.207281Z", "iopub.status.idle": "2025-05-23T00:18:58.210073Z", "shell.execute_reply": "2025-05-23T00:18:58.209788Z" } }, "outputs": [ { "data": { "text/plain": [ "100.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soma.psection()[\"morphology\"][\"L\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All of these values can be individually accessed in more efficient ways, but psection provides an overview of the full properties of the section." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For example, the length of the soma is more efficiently available (and settable) via:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.211526Z", "iopub.status.busy": "2025-05-23T00:18:58.211180Z", "iopub.status.idle": "2025-05-23T00:18:58.213767Z", "shell.execute_reply": "2025-05-23T00:18:58.213473Z" } }, "outputs": [ { "data": { "text/plain": [ "100.0" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soma.L" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "soma.psection()['morphology']['diam'] is a list (of length 1 here), with each entry corresponding to the value for each segment. Similarly for soma.psection()['cm'], etc." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Important: You may have noticed that the default diameter is 500 μm, which is excessively large for mammalian neurons. It's the default because it's appropriate for the squid giant axons studied by Hodgkin and Huxley. NEURON also uses squid-relevant values for axial resistivity (soma.Ra) and temperature (h.celsius). These should all be adjusted for mammalian models." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 3: Set the cell's morphological properties" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since we're simulating a soma, the default length of 100 μm and diameter of 500 μm are inappropriate. Let's set the length (L) and diameter (diam) to 20 μm instead:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.215107Z", "iopub.status.busy": "2025-05-23T00:18:58.214913Z", "iopub.status.idle": "2025-05-23T00:18:58.216880Z", "shell.execute_reply": "2025-05-23T00:18:58.216597Z" } }, "outputs": [], "source": [ "soma.L = 20\n", "soma.diam = 20" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In many models, you will have cells consisting of many connected sections. In brief, this can be done using the Section's connect method. That will be described in a subsequent part of the tutorial. For now though, we consider only the soma." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aside 3: Python's dir function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also probe objects with Python’s built-in dir() function. Let’s see what it says about soma." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.218239Z", "iopub.status.busy": "2025-05-23T00:18:58.217938Z", "iopub.status.idle": "2025-05-23T00:18:58.221012Z", "shell.execute_reply": "2025-05-23T00:18:58.220711Z" } }, "outputs": [ { "data": { "text/plain": [ "['L',\n", " 'Ra',\n", " '__call__',\n", " '__class__',\n", " '__contains__',\n", " '__delattr__',\n", " '__dir__',\n", " '__doc__',\n", " '__eq__',\n", " '__format__',\n", " '__ge__',\n", " '__getattribute__',\n", " '__getstate__',\n", " '__gt__',\n", " '__hash__',\n", " '__init__',\n", " '__init_subclass__',\n", " '__iter__',\n", " '__le__',\n", " '__lt__',\n", " '__module__',\n", " '__ne__',\n", " '__new__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__setattr__',\n", " '__sizeof__',\n", " '__str__',\n", " '__subclasshook__',\n", " 'allseg',\n", " 'arc3d',\n", " 'cell',\n", " 'children',\n", " 'connect',\n", " 'diam3d',\n", " 'disconnect',\n", " 'has_membrane',\n", " 'hname',\n", " 'hoc_internal_name',\n", " 'insert',\n", " 'is_pysec',\n", " 'n3d',\n", " 'name',\n", " 'nseg',\n", " 'orientation',\n", " 'parentseg',\n", " 'psection',\n", " 'pt3dadd',\n", " 'pt3dchange',\n", " 'pt3dclear',\n", " 'pt3dinsert',\n", " 'pt3dremove',\n", " 'pt3dstyle',\n", " 'push',\n", " 'rallbranch',\n", " 'same',\n", " 'spine3d',\n", " 'subtree',\n", " 'trueparentseg',\n", " 'uninsert',\n", " 'wholetree',\n", " 'x3d',\n", " 'y3d',\n", " 'z3d']" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(soma)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tells us all of the Python methods and variables associated with the object. Any methods with two leading and trailing underscores are reserved by Python. The other items in the list are additional members of soma that we can call. To see all of the functions, variables, etc available through NEURON's h submodule, try:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.222221Z", "iopub.status.busy": "2025-05-23T00:18:58.222024Z", "iopub.status.idle": "2025-05-23T00:18:58.225148Z", "shell.execute_reply": "2025-05-23T00:18:58.224869Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "APCount, AlphaSynapse, Avogadro_constant, BBSaveState, CVode, DEG,\n", "Deck, E, Exp2Syn, ExpSyn, FARADAY, FInitializeHandler, File, GAMMA,\n", "GUIMath, Glyph, Graph, HBox, IClamp, Impedance, IntFire1, IntFire2,\n", "IntFire4, KSChan, KSGate, KSState, KSTrans, L, LinearMechanism, List,\n", "Matrix, MechanismStandard, MechanismType, NetCon, NetStim, OClamp,\n", "PHI, PI, PPShape, PWManager, ParallelContext, PatternStim, PlotShape,\n", "PointProcessMark, Pointer, PtrVector, PythonObject, R, Ra, Random,\n", "RangeVarPlot, SEClamp, SaveState, Section, SectionBrowser,\n", "SectionList, SectionRef, Shape, SingleChan, StateTransitionEvent,\n", "StringFunctions, SymChooser, TQueue, TextEditor, Timer, VBox, VClamp,\n", "ValueFieldEditor, Vector, __abs__, __add__, __bool__, __call__,\n", "__class__, __delattr__, __delitem__, __dir__, __doc__, __eq__,\n", "__format__, __ge__, __getattribute__, __getitem__, __getstate__,\n", "__gt__, __hash__, __init__, __init_subclass__, __iter__, __le__,\n", "__len__, __lt__, __module__, __mul__, __ne__, __neg__, __new__,\n", "__next__, __pos__, __radd__, __reduce__, __reduce_ex__, __repr__,\n", "__rmul__, __rsub__, __rtruediv__, __setattr__, __setitem__,\n", "__setstate__, __sizeof__, __str__, __sub__, __subclasshook__,\n", "__truediv__, _pysec, abs, access, allobjects, allobjectvars, allsec,\n", "arc3d, area, argtype, atan, atan2, attr_praxis, axis, baseattr,\n", "batch_run, batch_save, begintemplate, boolean_dialog, break,\n", "capacitance, cas, celsius, chdir, checkpoint, clamp_resist, cm,\n", "connect, continue, continue_dialog, coredump_on_error, cos, create,\n", "debug, default_dll_loaded_, define_shape, delete, delete_section,\n", "depvar, diam, diam3d, diam_changed, dik_dv_, dina_dv_, disconnect,\n", "distance, doEvents, doNotify, double, dt, e_extracellular, e_fastpas,\n", "e_pas, ek, el_hh, else, ena, endtemplate, eps_IntFire4, eqinit, eqn,\n", "erf, erfc, execerror, execute, execute1, exp, external, extracellular,\n", "fadvance, fastpas, fclamp, fclampi, fclampv, fcurrent, finitialize,\n", "fit_praxis, float_epsilon, fmatrix, fmenu, for, forall, forsec,\n", "fprint, frecord_init, fscan, fstim, fstimi, fsyn, fsyng, fsyni, func,\n", "g_fastpas, g_pas, getSpineArea, getcwd, getstr, ghk, gk_hh, gkbar_hh,\n", "gl_hh, gna_hh, gnabar_hh, graph, graphmode, h_hh, help, hh, hinf_hh,\n", "hname, hoc_ac_, hoc_cross_x_, hoc_cross_y_, hoc_obj_, hoc_pointer_,\n", "hoc_stdout, hocobjptr, htau_hh, i_cap, i_membrane, i_membrane_, i_pas,\n", "ib_IntFire4, if, ifsec, ik, il_hh, ina, initnrn, insert,\n", "install_vector_fitness, int, ion_charge, ion_register, ion_style,\n", "ismembrane, issection, iterator, iterator_statement, ivoc_style,\n", "k_ion, keep_nseg_parm, ki, ki0_k_ion, ko, ko0_k_ion, libpython_path,\n", "load_file, load_func, load_proc, load_template, local, localobj, log,\n", "log10, lw, m_hh, machine_name, make_mechanism, make_pointprocess,\n", "mcell_ran4, mcell_ran4_init, minf_hh, morphology, mtau_hh, n3d, n_hh,\n", "na_ion, nai, nai0_na_ion, name_declared, nao, nao0_na_ion, nernst,\n", "neuronhome, new, ninf_hh, nlayer_extracellular, node_data,\n", "nrn_feenableexcept, nrn_load_dll, nrn_mallinfo,\n", "nrn_netrec_state_adjust, nrn_shape_changed_, nrn_sparse_partrans,\n", "nrnallpointmenu, nrnallsectionmenu, nrnglobalmechmenu,\n", "nrniv_bind_thread, nrnmechmenu, nrnmpi_init, nrnpointmenu, nrnpython,\n", "nrnsecmenu, nrnunit_use_legacy, nrnversion, nseg, ntau_hh, numarg,\n", "obfunc, object_id, object_pop, object_push, object_pushed, objectvar,\n", "objref, parallel, parent_connection, parent_node, parent_section, pas,\n", "plot, plotx, ploty, plt, pop_section, print, print_session, printf,\n", "prmat, proc, prstim, psection, pt3dadd, pt3dchange, pt3dclear,\n", "pt3dconst, pt3dinsert, pt3dremove, pt3dstyle, public, push_section,\n", "pval_praxis, pwman_place, quit, rallbranch, rates_hh, read, ref,\n", "regraph, retrieveaudit, return, ri, ropen, same, save_session,\n", "saveaudit, secname, secondorder, section_exists, section_orientation,\n", "section_owner, sectionname, setSpineArea, setcolor, setdata_feature,\n", "setdata_hh, setdata_pas, setpointer, show_errmess_always, show_winio,\n", "sin, solve, spine3d, sprint, sqrt, sred, sscanf, startsw, stop,\n", "stop_praxis, stoprun, stopsw, strcmp, strdef, string_dialog, symbols,\n", "system, t, tanh, taueps_IntFire4, this_node, this_section, topology,\n", "uninsert, units, unix_mac_pc, use_mcell_ran4, v, variable_domain,\n", "vext, vtrap_hh, while, wopen, x3d, xbutton, xc, xcheckbox,\n", "xfixedvalue, xg, xlabel, xmenu, xopen, xopen_broadcast_, xpanel,\n", "xpvalue, xradiobutton, xraxial, xred, xslider, xstatebutton, xvalue,\n", "xvarlabel, y3d, z3d\n" ] } ], "source": [ "import textwrap\n", "\n", "print(textwrap.fill(\", \".join(dir(h))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(The ', '.join(...) tells Python to build a string out of the list returned by dir where the items are separated from each other with a comma and a space. The textwrap.fill(...) tells Python to split long lines into multiple lines, by default a maximum of 70 characters long.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aside 4: Getting more help" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to probing objects with dir(), help from docstrings is available using help()." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For example, from dir(soma) above, we know that there is a connect method available. Let's inquire about that:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.226515Z", "iopub.status.busy": "2025-05-23T00:18:58.226264Z", "iopub.status.idle": "2025-05-23T00:18:58.229001Z", "shell.execute_reply": "2025-05-23T00:18:58.228700Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on built-in function connect:\n", "\n", "connect(...) method of nrn.Section instance\n", " childSection.connect(parentSection, [parentX], [childEnd]) or\n", " childSection.connect(parentSegment, [childEnd])\n", "\n" ] } ], "source": [ "help(soma.connect)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When running interactively in Jupyter, the same information is available in a window that can be popped out by prefacing the method/function/etc with a question mark; e.g." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.230372Z", "iopub.status.busy": "2025-05-23T00:18:58.230057Z", "iopub.status.idle": "2025-05-23T00:18:58.232585Z", "shell.execute_reply": "2025-05-23T00:18:58.232261Z" } }, "outputs": [], "source": [ "?soma.connect" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Biophysical mechanisms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NEURON comes with a few built in biophysical mechanisms that can be added to a model:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
pasPassive (“leak”) channel.
extracellularFor simulating effects of nonzero extracellular\n", "potential, as may happen with leaky patch clamps,\n", "or detailed propertes of the myelin sheath.
hhHodgkin-Huxley sodium, potassium, and leakage channels.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thousands of additional mechanisms (for A-currents, etc) are available as MOD files as part of published model codes on ModelDB." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 4: Insert ion channels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A section's insert method is used to insert density mechanisms (i.e. anything where we don't want to specify every single instance separately). Let's insert Hodgkin-Huxley channels into the soma's membrane. We do this by passing 'hh' as the mechanism type:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.233918Z", "iopub.status.busy": "2025-05-23T00:18:58.233724Z", "iopub.status.idle": "2025-05-23T00:18:58.237656Z", "shell.execute_reply": "2025-05-23T00:18:58.237356Z" } }, "outputs": [ { "data": { "text/plain": [ "soma" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soma.insert(\"hh\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The section is returned so that multiple insertions can be chained together if desired." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We note that Hodgkin-Huxley channel kinetics are based on the squid giant axon. If that's not your model organism, then for your actual modeling projects, you'll want to use other kinetics, either by downloading them from online resources like ModelDB or by writing them yourself in NMODL or NeuroML." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aside 5: Sections and segments" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A NEURON Section is considered a piece of cable. Depending on the resolution desired, it may be necessary to divide the cable into a number of segments where voltage varies linearly between centers of adjacent segments. The number of segments within a section is given by the variable, `nseg`. The total ionic current across the segment membrane is approximately the area of the segment multiplied by the ionic current density at the center of the segment. To access a part of the section, specify a value between 0 and 1, where 0 is typically the end closest to the soma and 1 is the distal end. Because nseg divides the cable into equal-length parts, it should be an odd number so that to address the middle of the cable, (0.5), gives the middle segment." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To summarize, we access sections by their name and segments by some location on the section.\n", "\n", "* Section: ``section``\n", "* Segment: ``section(loc)``" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the Python `type` function can tell us what a variable is:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.239184Z", "iopub.status.busy": "2025-05-23T00:18:58.238973Z", "iopub.status.idle": "2025-05-23T00:18:58.241254Z", "shell.execute_reply": "2025-05-23T00:18:58.240963Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "type(soma) = \n", "type(soma(0.5)) = \n" ] } ], "source": [ "print(\"type(soma) = {}\".format(type(soma)))\n", "print(\"type(soma(0.5)) = {}\".format(type(soma(0.5))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aside 6: Accessing segment variables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Segment variables follow the idiom:\n", "\n", " section(loc).var\n", "\n", "And for mechanisms on the segment:\n", "\n", " section(loc).mech.var\n", "\n", "or\n", "\n", " section(loc).var_mech\n", "\n", "The first form is preferred." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.242517Z", "iopub.status.busy": "2025-05-23T00:18:58.242287Z", "iopub.status.idle": "2025-05-23T00:18:58.244945Z", "shell.execute_reply": "2025-05-23T00:18:58.244670Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'el', 'gk', 'gkbar', 'gl', 'gna', 'gnabar', 'h', 'hinf', 'htau', 'il', 'is_ion', 'm', 'minf', 'mtau', 'n', 'name', 'ninf', 'ntau', 'segment']\n" ] } ], "source": [ "mech = soma(0.5).hh\n", "print(dir(mech))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.246289Z", "iopub.status.busy": "2025-05-23T00:18:58.245943Z", "iopub.status.idle": "2025-05-23T00:18:58.248230Z", "shell.execute_reply": "2025-05-23T00:18:58.247939Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.036\n", "0.036\n" ] } ], "source": [ "print(mech.gkbar)\n", "print(soma(0.5).hh.gkbar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 5: Insert a stimulus" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's insert a current clamp (an IClamp object) into the center of the soma to induce some membrane dynamics." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.249485Z", "iopub.status.busy": "2025-05-23T00:18:58.249276Z", "iopub.status.idle": "2025-05-23T00:18:58.252084Z", "shell.execute_reply": "2025-05-23T00:18:58.251767Z" } }, "outputs": [], "source": [ "iclamp = h.IClamp(soma(0.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An IClamp is a Point Process. Point processes are point sources of current. When making a new PointProcess, you pass the segment to which it will bind.\n", "\n", "Again, with the dir function, we can validate that iclamp is an object and contains some useful parameters. Let's look at some of those parameters. We use a list comprehension to ignore those elements of the dir that start with double underscores (and are thus Python magic methods and not functions/variables intended to be used directly). " ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.253493Z", "iopub.status.busy": "2025-05-23T00:18:58.253294Z", "iopub.status.idle": "2025-05-23T00:18:58.256958Z", "shell.execute_reply": "2025-05-23T00:18:58.256623Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['amp', 'baseattr', 'delay', 'dur', 'get_loc', 'get_segment', 'has_loc', 'hname', 'hocobjptr', 'i', 'loc', 'same']\n" ] } ], "source": [ "print([item for item in dir(iclamp) if not item.startswith(\"__\")])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In particular, we notice three key properties of a current clamp: amp -- the amplitude (in nA), delay -- the time the current clamp switches on (in ms), and dur -- how long (in ms) the current clamp stays on. Let's set these values:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.258313Z", "iopub.status.busy": "2025-05-23T00:18:58.258177Z", "iopub.status.idle": "2025-05-23T00:18:58.260631Z", "shell.execute_reply": "2025-05-23T00:18:58.260285Z" } }, "outputs": [], "source": [ "iclamp.delay = 2\n", "iclamp.dur = 0.1\n", "iclamp.amp = 0.9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's use psection to get a representation of the soma model:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.262018Z", "iopub.status.busy": "2025-05-23T00:18:58.261890Z", "iopub.status.idle": "2025-05-23T00:18:58.266469Z", "shell.execute_reply": "2025-05-23T00:18:58.266147Z" } }, "outputs": [ { "data": { "text/plain": [ "{'point_processes': {'IClamp': {IClamp[0]}},\n", " 'density_mechs': {'hh': {'gnabar': [0.12],\n", " 'gkbar': [0.036],\n", " 'gl': [0.0003],\n", " 'el': [-54.3],\n", " 'gna': [0.0],\n", " 'gk': [0.0],\n", " 'il': [0.0],\n", " 'minf': [0.0],\n", " 'hinf': [0.0],\n", " 'ninf': [0.0],\n", " 'mtau': [0.0],\n", " 'htau': [0.0],\n", " 'ntau': [0.0],\n", " 'm': [0.0],\n", " 'h': [0.0],\n", " 'n': [0.0]}},\n", " 'ions': {'na': {'ena': [50.0],\n", " 'nai': [10.0],\n", " 'nao': [140.0],\n", " 'ina': [0.0],\n", " 'dina_dv_': [0.0]},\n", " 'k': {'ek': [-77.0],\n", " 'ki': [54.4],\n", " 'ko': [2.5],\n", " 'ik': [0.0],\n", " 'dik_dv_': [0.0]}},\n", " 'morphology': {'L': 20.0,\n", " 'diam': [20.0],\n", " 'pts3d': [],\n", " 'parent': None,\n", " 'trueparent': None},\n", " 'nseg': 1,\n", " 'Ra': 35.4,\n", " 'cm': [1.0],\n", " 'regions': set(),\n", " 'species': set(),\n", " 'name': 'soma',\n", " 'hoc_internal_name': '__nrnsec_0x6067fe019070',\n", " 'cell': None}" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soma.psection()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 6: Set up recording variables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The cell should be configured to run a simulation. However, we need to indicate which variables we wish to record; these will be stored in a NEURON Vector (h.Vector object). For now, we will record the membrane potential, which is soma(0.5).v and the corresponding time points (h.t). References to variables are available by preceding the last part of the variable name with a `_ref_`" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.268022Z", "iopub.status.busy": "2025-05-23T00:18:58.267694Z", "iopub.status.idle": "2025-05-23T00:18:58.270760Z", "shell.execute_reply": "2025-05-23T00:18:58.270407Z" } }, "outputs": [], "source": [ "v = h.Vector().record(soma(0.5)._ref_v) # Membrane potential vector\n", "t = h.Vector().record(h._ref_t) # Time stamp vector" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 7: Run the simulation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By default, the NEURON h module provides the low level fadvance function for advancing one time step. For higher-level simulation control specification, we load NEURON's stdrun library:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.272274Z", "iopub.status.busy": "2025-05-23T00:18:58.271937Z", "iopub.status.idle": "2025-05-23T00:18:58.279965Z", "shell.execute_reply": "2025-05-23T00:18:58.279646Z" } }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.load_file(\"stdrun.hoc\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can then initialize our simulation such that our cell has a resting membrane potential of -65 mV:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.281603Z", "iopub.status.busy": "2025-05-23T00:18:58.281220Z", "iopub.status.idle": "2025-05-23T00:18:58.284884Z", "shell.execute_reply": "2025-05-23T00:18:58.284568Z" } }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.finitialize(-65 * mV)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now continue the simulation from the current time (0) until 40 ms:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.286319Z", "iopub.status.busy": "2025-05-23T00:18:58.286028Z", "iopub.status.idle": "2025-05-23T00:18:58.292297Z", "shell.execute_reply": "2025-05-23T00:18:58.291991Z" } }, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.continuerun(40 * ms)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(For those who are interested: we initialized to a resting membrane potential of -65 mV because that's the default reversal potential for the hh channels, the only channel (set) inserted in this model.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(Strictly speaking, we didn't need to specify the units here -- recall they were defined above in the from neuron.units import ms, mV -- as they are the defaults assumed by NEURON, but it is good practice to be explicitly clear.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 8: Plot the results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using bokeh\n", "

When working in Jupyter with an active internet connection, it is often convenient to use the bokeh module for plotting, as it provides interactive graphs that can be panned, zoomed, and saved from the Jupyter notebook.

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's load bokeh and tell it to output to the Jupyter notebook:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.293863Z", "iopub.status.busy": "2025-05-23T00:18:58.293622Z", "iopub.status.idle": "2025-05-23T00:18:58.639378Z", "shell.execute_reply": "2025-05-23T00:18:58.639036Z" } }, "outputs": [ { "data": { "text/html": [ " \n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "'use strict';\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " function drop(id) {\n", " const view = Bokeh.index.get_by_id(id)\n", " if (view != null) {\n", " view.model.document.clear()\n", " Bokeh.index.delete(view)\n", " }\n", " }\n", "\n", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const server_id = cell.output_area._bokeh_server_id;\n", "\n", " // Clean up Bokeh references\n", " if (id != null) {\n", " drop(id)\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const id = msg.content.text.trim()\n", " drop(id)\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " const toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " const events = require('base/js/events');\n", " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"
    \\n\"+\n", " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", " \"
\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded(error = null) {\n", " const el = document.getElementById(\"f011e7ee-3c9b-4c14-9d24-ab83a6aaf29b\");\n", " if (el != null) {\n", " const html = (() => {\n", " if (typeof root.Bokeh === \"undefined\") {\n", " if (error == null) {\n", " return \"BokehJS is loading ...\";\n", " } else {\n", " return \"BokehJS failed to load.\";\n", " }\n", " } else {\n", " const prefix = `BokehJS ${root.Bokeh.version}`;\n", " if (error == null) {\n", " return `${prefix} successfully loaded.`;\n", " } else {\n", " return `${prefix} encountered errors while loading and may not function as expected.`;\n", " }\n", " }\n", " })();\n", " el.innerHTML = html;\n", "\n", " if (error != null) {\n", " const wrapper = document.createElement(\"div\");\n", " wrapper.style.overflow = \"auto\";\n", " wrapper.style.height = \"5em\";\n", " wrapper.style.resize = \"vertical\";\n", " const content = document.createElement(\"div\");\n", " content.style.fontFamily = \"monospace\";\n", " content.style.whiteSpace = \"pre-wrap\";\n", " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", " content.textContent = error.stack ?? error.toString();\n", " wrapper.append(content);\n", " el.append(wrapper);\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(() => display_loaded(error), 100);\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", "\n", " function on_error(url) {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (let i = 0; i < css_urls.length; i++) {\n", " const url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " }\n", "\n", " for (let i = 0; i < js_urls.length; i++) {\n", " const url = js_urls[i];\n", " const element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.3.min.js\"];\n", " const css_urls = [];\n", "\n", " const inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " if (root.Bokeh !== undefined || force === true) {\n", " try {\n", " for (let i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }\n", "\n", " } catch (error) {display_loaded(error);throw error;\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " const cell = $(document.getElementById(\"f011e7ee-3c9b-4c14-9d24-ab83a6aaf29b\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(css_urls, js_urls, function() {\n", " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"f011e7ee-3c9b-4c14-9d24-ab83a6aaf29b\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"f011e7ee-3c9b-4c14-9d24-ab83a6aaf29b\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from bokeh.io import output_notebook\n", "import bokeh.plotting as plt\n", "\n", "output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we plot membrane potential vs time." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.640943Z", "iopub.status.busy": "2025-05-23T00:18:58.640749Z", "iopub.status.idle": "2025-05-23T00:18:58.906109Z", "shell.execute_reply": "2025-05-23T00:18:58.905741Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"a47f8afb-1c5f-4190-affd-22430d6802b4\":{\"version\":\"3.7.3\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1003\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1004\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1005\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1012\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1013\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1010\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1043\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1037\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1038\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1039\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[0.0,0.025,0.05,0.075,0.09999999999999999,0.12499999999999999,0.15,0.17500000000000002,0.20000000000000004,0.22500000000000006,0.25000000000000006,0.2750000000000001,0.3000000000000001,0.3250000000000001,0.35000000000000014,0.37500000000000017,0.4000000000000002,0.4250000000000002,0.45000000000000023,0.47500000000000026,0.5000000000000002,0.5250000000000001,0.55,0.575,0.5999999999999999,0.6249999999999998,0.6499999999999997,0.6749999999999996,0.6999999999999995,0.7249999999999994,0.7499999999999993,0.7749999999999992,0.7999999999999992,0.8249999999999991,0.849999999999999,0.8749999999999989,0.8999999999999988,0.9249999999999987,0.9499999999999986,0.9749999999999985,0.9999999999999984,1.0249999999999984,1.0499999999999983,1.0749999999999982,1.099999999999998,1.124999999999998,1.149999999999998,1.1749999999999978,1.1999999999999977,1.2249999999999976,1.2499999999999976,1.2749999999999975,1.2999999999999974,1.3249999999999973,1.3499999999999972,1.3749999999999971,1.399999999999997,1.424999999999997,1.4499999999999968,1.4749999999999968,1.4999999999999967,1.5249999999999966,1.5499999999999965,1.5749999999999964,1.5999999999999963,1.6249999999999962,1.6499999999999961,1.674999999999996,1.699999999999996,1.7249999999999959,1.7499999999999958,1.7749999999999957,1.7999999999999956,1.8249999999999955,1.8499999999999954,1.8749999999999953,1.8999999999999952,1.9249999999999952,1.949999999999995,1.974999999999995,1.999999999999995,2.024999999999995,2.0499999999999954,2.0749999999999957,2.099999999999996,2.1249999999999964,2.149999999999997,2.174999999999997,2.1999999999999975,2.224999999999998,2.2499999999999982,2.2749999999999986,2.299999999999999,2.3249999999999993,2.3499999999999996,2.375,2.4000000000000004,2.4250000000000007,2.450000000000001,2.4750000000000014,2.5000000000000018,2.525000000000002,2.5500000000000025,2.575000000000003,2.600000000000003,2.6250000000000036,2.650000000000004,2.6750000000000043,2.7000000000000046,2.725000000000005,2.7500000000000053,2.7750000000000057,2.800000000000006,2.8250000000000064,2.8500000000000068,2.875000000000007,2.9000000000000075,2.925000000000008,2.950000000000008,2.9750000000000085,3.000000000000009,3.0250000000000092,3.0500000000000096,3.07500000000001,3.1000000000000103,3.1250000000000107,3.150000000000011,3.1750000000000114,3.2000000000000117,3.225000000000012,3.2500000000000124,3.275000000000013,3.300000000000013,3.3250000000000135,3.350000000000014,3.375000000000014,3.4000000000000146,3.425000000000015,3.4500000000000153,3.4750000000000156,3.500000000000016,3.5250000000000163,3.5500000000000167,3.575000000000017,3.6000000000000174,3.6250000000000178,3.650000000000018,3.6750000000000185,3.700000000000019,3.725000000000019,3.7500000000000195,3.77500000000002,3.8000000000000203,3.8250000000000206,3.850000000000021,3.8750000000000213,3.9000000000000217,3.925000000000022,3.9500000000000224,3.9750000000000227,4.000000000000023,4.0250000000000234,4.050000000000024,4.075000000000024,4.1000000000000245,4.125000000000025,4.150000000000025,4.175000000000026,4.200000000000026,4.225000000000026,4.250000000000027,4.275000000000027,4.300000000000027,4.325000000000028,4.350000000000028,4.375000000000028,4.400000000000029,4.425000000000029,4.4500000000000295,4.47500000000003,4.50000000000003,4.5250000000000306,4.550000000000031,4.575000000000031,4.600000000000032,4.625000000000032,4.650000000000032,4.675000000000033,4.700000000000033,4.725000000000033,4.750000000000034,4.775000000000034,4.8000000000000345,4.825000000000035,4.850000000000035,4.8750000000000355,4.900000000000036,4.925000000000036,4.950000000000037,4.975000000000037,5.000000000000037,5.025000000000038,5.050000000000038,5.075000000000038,5.100000000000039,5.125000000000039,5.150000000000039,5.17500000000004,5.20000000000004,5.2250000000000405,5.250000000000041,5.275000000000041,5.300000000000042,5.325000000000042,5.350000000000042,5.375000000000043,5.400000000000043,5.425000000000043,5.450000000000044,5.475000000000044,5.500000000000044,5.525000000000045,5.550000000000045,5.5750000000000455,5.600000000000046,5.625000000000046,5.6500000000000465,5.675000000000047,5.700000000000047,5.725000000000048,5.750000000000048,5.775000000000048,5.800000000000049,5.825000000000049,5.850000000000049,5.87500000000005,5.90000000000005,5.9250000000000504,5.950000000000051,5.975000000000051,6.0000000000000515,6.025000000000052,6.050000000000052,6.075000000000053,6.100000000000053,6.125000000000053,6.150000000000054,6.175000000000054,6.200000000000054,6.225000000000055,6.250000000000055,6.275000000000055,6.300000000000056,6.325000000000056,6.3500000000000565,6.375000000000057,6.400000000000057,6.4250000000000576,6.450000000000058,6.475000000000058,6.500000000000059,6.525000000000059,6.550000000000059,6.57500000000006,6.60000000000006,6.62500000000006,6.650000000000061,6.675000000000061,6.7000000000000615,6.725000000000062,6.750000000000062,6.7750000000000625,6.800000000000063,6.825000000000063,6.850000000000064,6.875000000000064,6.900000000000064,6.925000000000065,6.950000000000065,6.975000000000065,7.000000000000066,7.025000000000066,7.050000000000066,7.075000000000067,7.100000000000067,7.1250000000000675,7.150000000000068,7.175000000000068,7.200000000000069,7.225000000000069,7.250000000000069,7.27500000000007,7.30000000000007,7.32500000000007,7.350000000000071,7.375000000000071,7.400000000000071,7.425000000000072,7.450000000000072,7.4750000000000725,7.500000000000073,7.525000000000073,7.5500000000000735,7.575000000000074,7.600000000000074,7.625000000000075,7.650000000000075,7.675000000000075,7.700000000000076,7.725000000000076,7.750000000000076,7.775000000000077,7.800000000000077,7.8250000000000774,7.850000000000078,7.875000000000078,7.9000000000000785,7.925000000000079,7.950000000000079,7.97500000000008,8.00000000000008,8.025000000000079,8.050000000000077,8.075000000000076,8.100000000000074,8.125000000000073,8.150000000000071,8.17500000000007,8.200000000000069,8.225000000000067,8.250000000000066,8.275000000000064,8.300000000000063,8.325000000000061,8.35000000000006,8.375000000000059,8.400000000000057,8.425000000000056,8.450000000000054,8.475000000000053,8.500000000000052,8.52500000000005,8.550000000000049,8.575000000000047,8.600000000000046,8.625000000000044,8.650000000000043,8.675000000000042,8.70000000000004,8.725000000000039,8.750000000000037,8.775000000000036,8.800000000000034,8.825000000000033,8.850000000000032,8.87500000000003,8.900000000000029,8.925000000000027,8.950000000000026,8.975000000000025,9.000000000000023,9.025000000000022,9.05000000000002,9.075000000000019,9.100000000000017,9.125000000000016,9.150000000000015,9.175000000000013,9.200000000000012,9.22500000000001,9.250000000000009,9.275000000000007,9.300000000000006,9.325000000000005,9.350000000000003,9.375000000000002,9.4,9.424999999999999,9.449999999999998,9.474999999999996,9.499999999999995,9.524999999999993,9.549999999999992,9.57499999999999,9.599999999999989,9.624999999999988,9.649999999999986,9.674999999999985,9.699999999999983,9.724999999999982,9.74999999999998,9.774999999999979,9.799999999999978,9.824999999999976,9.849999999999975,9.874999999999973,9.899999999999972,9.92499999999997,9.949999999999969,9.974999999999968,9.999999999999966,10.024999999999965,10.049999999999963,10.074999999999962,10.09999999999996,10.12499999999996,10.149999999999958,10.174999999999956,10.199999999999955,10.224999999999953,10.249999999999952,10.27499999999995,10.29999999999995,10.324999999999948,10.349999999999946,10.374999999999945,10.399999999999944,10.424999999999942,10.44999999999994,10.47499999999994,10.499999999999938,10.524999999999936,10.549999999999935,10.574999999999934,10.599999999999932,10.62499999999993,10.64999999999993,10.674999999999928,10.699999999999926,10.724999999999925,10.749999999999924,10.774999999999922,10.79999999999992,10.82499999999992,10.849999999999918,10.874999999999917,10.899999999999915,10.924999999999914,10.949999999999912,10.97499999999991,10.99999999999991,11.024999999999908,11.049999999999907,11.074999999999905,11.099999999999904,11.124999999999902,11.1499999999999,11.1749999999999,11.199999999999898,11.224999999999897,11.249999999999895,11.274999999999894,11.299999999999892,11.324999999999891,11.34999999999989,11.374999999999888,11.399999999999887,11.424999999999885,11.449999999999884,11.474999999999882,11.499999999999881,11.52499999999988,11.549999999999878,11.574999999999877,11.599999999999875,11.624999999999874,11.649999999999872,11.674999999999871,11.69999999999987,11.724999999999868,11.749999999999867,11.774999999999865,11.799999999999864,11.824999999999863,11.849999999999861,11.87499999999986,11.899999999999858,11.924999999999857,11.949999999999855,11.974999999999854,11.999999999999853,12.024999999999851,12.04999999999985,12.074999999999848,12.099999999999847,12.124999999999845,12.149999999999844,12.174999999999843,12.199999999999841,12.22499999999984,12.249999999999838,12.274999999999837,12.299999999999836,12.324999999999834,12.349999999999833,12.374999999999831,12.39999999999983,12.424999999999828,12.449999999999827,12.474999999999826,12.499999999999824,12.524999999999823,12.549999999999821,12.57499999999982,12.599999999999818,12.624999999999817,12.649999999999816,12.674999999999814,12.699999999999813,12.724999999999811,12.74999999999981,12.774999999999809,12.799999999999807,12.824999999999806,12.849999999999804,12.874999999999803,12.899999999999801,12.9249999999998,12.949999999999799,12.974999999999797,12.999999999999796,13.024999999999794,13.049999999999793,13.074999999999791,13.09999999999979,13.124999999999789,13.149999999999787,13.174999999999786,13.199999999999784,13.224999999999783,13.249999999999782,13.27499999999978,13.299999999999779,13.324999999999777,13.349999999999776,13.374999999999774,13.399999999999773,13.424999999999772,13.44999999999977,13.474999999999769,13.499999999999767,13.524999999999766,13.549999999999764,13.574999999999763,13.599999999999762,13.62499999999976,13.649999999999759,13.674999999999757,13.699999999999756,13.724999999999755,13.749999999999753,13.774999999999752,13.79999999999975,13.824999999999749,13.849999999999747,13.874999999999746,13.899999999999745,13.924999999999743,13.949999999999742,13.97499999999974,13.999999999999739,14.024999999999737,14.049999999999736,14.074999999999735,14.099999999999733,14.124999999999732,14.14999999999973,14.174999999999729,14.199999999999728,14.224999999999726,14.249999999999725,14.274999999999723,14.299999999999722,14.32499999999972,14.349999999999719,14.374999999999718,14.399999999999716,14.424999999999715,14.449999999999713,14.474999999999712,14.49999999999971,14.524999999999709,14.549999999999708,14.574999999999706,14.599999999999705,14.624999999999703,14.649999999999702,14.6749999999997,14.699999999999699,14.724999999999698,14.749999999999696,14.774999999999695,14.799999999999693,14.824999999999692,14.84999999999969,14.87499999999969,14.899999999999688,14.924999999999686,14.949999999999685,14.974999999999683,14.999999999999682,15.02499999999968,15.04999999999968,15.074999999999678,15.099999999999676,15.124999999999675,15.149999999999674,15.174999999999672,15.19999999999967,15.22499999999967,15.249999999999668,15.274999999999666,15.299999999999665,15.324999999999664,15.349999999999662,15.37499999999966,15.39999999999966,15.424999999999658,15.449999999999656,15.474999999999655,15.499999999999654,15.524999999999652,15.54999999999965,15.57499999999965,15.599999999999648,15.624999999999647,15.649999999999645,15.674999999999644,15.699999999999642,15.72499999999964,15.74999999999964,15.774999999999638,15.799999999999637,15.824999999999635,15.849999999999634,15.874999999999632,15.89999999999963,15.92499999999963,15.949999999999628,15.974999999999627,15.999999999999625,16.024999999999626,16.049999999999624,16.074999999999623,16.09999999999962,16.12499999999962,16.14999999999962,16.174999999999617,16.199999999999616,16.224999999999614,16.249999999999613,16.27499999999961,16.29999999999961,16.32499999999961,16.349999999999607,16.374999999999606,16.399999999999604,16.424999999999603,16.4499999999996,16.4749999999996,16.4999999999996,16.524999999999597,16.549999999999596,16.574999999999594,16.599999999999593,16.62499999999959,16.64999999999959,16.67499999999959,16.699999999999587,16.724999999999586,16.749999999999584,16.774999999999583,16.79999999999958,16.82499999999958,16.84999999999958,16.874999999999577,16.899999999999576,16.924999999999574,16.949999999999573,16.97499999999957,16.99999999999957,17.02499999999957,17.049999999999567,17.074999999999566,17.099999999999564,17.124999999999563,17.14999999999956,17.17499999999956,17.19999999999956,17.224999999999557,17.249999999999556,17.274999999999554,17.299999999999553,17.32499999999955,17.34999999999955,17.37499999999955,17.399999999999547,17.424999999999546,17.449999999999545,17.474999999999543,17.49999999999954,17.52499999999954,17.54999999999954,17.574999999999537,17.599999999999536,17.624999999999535,17.649999999999533,17.67499999999953,17.69999999999953,17.72499999999953,17.749999999999527,17.774999999999526,17.799999999999525,17.824999999999523,17.849999999999522,17.87499999999952,17.89999999999952,17.924999999999518,17.949999999999516,17.974999999999515,17.999999999999513,18.024999999999512,18.04999999999951,18.07499999999951,18.099999999999508,18.124999999999506,18.149999999999505,18.174999999999503,18.199999999999502,18.2249999999995,18.2499999999995,18.274999999999498,18.299999999999496,18.324999999999495,18.349999999999493,18.374999999999492,18.39999999999949,18.42499999999949,18.449999999999488,18.474999999999486,18.499999999999485,18.524999999999483,18.549999999999482,18.57499999999948,18.59999999999948,18.624999999999478,18.649999999999476,18.674999999999475,18.699999999999473,18.724999999999472,18.74999999999947,18.77499999999947,18.799999999999468,18.824999999999466,18.849999999999465,18.874999999999464,18.899999999999462,18.92499999999946,18.94999999999946,18.974999999999458,18.999999999999456,19.024999999999455,19.049999999999454,19.074999999999452,19.09999999999945,19.12499999999945,19.149999999999448,19.174999999999446,19.199999999999445,19.224999999999444,19.249999999999442,19.27499999999944,19.29999999999944,19.324999999999438,19.349999999999437,19.374999999999435,19.399999999999434,19.424999999999432,19.44999999999943,19.47499999999943,19.499999999999428,19.524999999999427,19.549999999999425,19.574999999999424,19.599999999999422,19.62499999999942,19.64999999999942,19.674999999999418,19.699999999999417,19.724999999999415,19.749999999999414,19.774999999999412,19.79999999999941,19.82499999999941,19.849999999999408,19.874999999999407,19.899999999999405,19.924999999999404,19.949999999999402,19.9749999999994,19.9999999999994,20.024999999999398,20.049999999999397,20.074999999999395,20.099999999999394,20.124999999999392,20.14999999999939,20.17499999999939,20.199999999999388,20.224999999999387,20.249999999999385,20.274999999999384,20.299999999999383,20.32499999999938,20.34999999999938,20.37499999999938,20.399999999999377,20.424999999999375,20.449999999999374,20.474999999999373,20.49999999999937,20.52499999999937,20.54999999999937,20.574999999999367,20.599999999999365,20.624999999999364,20.649999999999363,20.67499999999936,20.69999999999936,20.72499999999936,20.749999999999357,20.774999999999356,20.799999999999354,20.824999999999353,20.84999999999935,20.87499999999935,20.89999999999935,20.924999999999347,20.949999999999346,20.974999999999344,20.999999999999343,21.02499999999934,21.04999999999934,21.07499999999934,21.099999999999337,21.124999999999336,21.149999999999334,21.174999999999333,21.19999999999933,21.22499999999933,21.24999999999933,21.274999999999327,21.299999999999326,21.324999999999324,21.349999999999323,21.37499999999932,21.39999999999932,21.42499999999932,21.449999999999317,21.474999999999316,21.499999999999314,21.524999999999313,21.54999999999931,21.57499999999931,21.59999999999931,21.624999999999307,21.649999999999306,21.674999999999304,21.699999999999303,21.7249999999993,21.7499999999993,21.7749999999993,21.799999999999297,21.824999999999296,21.849999999999294,21.874999999999293,21.89999999999929,21.92499999999929,21.94999999999929,21.974999999999287,21.999999999999286,22.024999999999284,22.049999999999283,22.07499999999928,22.09999999999928,22.12499999999928,22.149999999999277,22.174999999999276,22.199999999999275,22.224999999999273,22.24999999999927,22.27499999999927,22.29999999999927,22.324999999999267,22.349999999999266,22.374999999999265,22.399999999999263,22.42499999999926,22.44999999999926,22.47499999999926,22.499999999999257,22.524999999999256,22.549999999999255,22.574999999999253,22.599999999999252,22.62499999999925,22.64999999999925,22.674999999999248,22.699999999999246,22.724999999999245,22.749999999999243,22.774999999999242,22.79999999999924,22.82499999999924,22.849999999999238,22.874999999999236,22.899999999999235,22.924999999999233,22.949999999999232,22.97499999999923,22.99999999999923,23.024999999999228,23.049999999999226,23.074999999999225,23.099999999999223,23.124999999999222,23.14999999999922,23.17499999999922,23.199999999999218,23.224999999999216,23.249999999999215,23.274999999999213,23.299999999999212,23.32499999999921,23.34999999999921,23.374999999999208,23.399999999999206,23.424999999999205,23.449999999999203,23.474999999999202,23.4999999999992,23.5249999999992,23.549999999999198,23.574999999999196,23.599999999999195,23.624999999999194,23.649999999999192,23.67499999999919,23.69999999999919,23.724999999999188,23.749999999999186,23.774999999999185,23.799999999999184,23.824999999999182,23.84999999999918,23.87499999999918,23.899999999999178,23.924999999999176,23.949999999999175,23.974999999999174,23.999999999999172,24.02499999999917,24.04999999999917,24.074999999999168,24.099999999999167,24.124999999999165,24.149999999999164,24.174999999999162,24.19999999999916,24.22499999999916,24.249999999999158,24.274999999999157,24.299999999999155,24.324999999999154,24.349999999999152,24.37499999999915,24.39999999999915,24.424999999999148,24.449999999999147,24.474999999999145,24.499999999999144,24.524999999999142,24.54999999999914,24.57499999999914,24.599999999999138,24.624999999999137,24.649999999999135,24.674999999999134,24.699999999999132,24.72499999999913,24.74999999999913,24.774999999999128,24.799999999999127,24.824999999999125,24.849999999999124,24.874999999999122,24.89999999999912,24.92499999999912,24.949999999999118,24.974999999999117,24.999999999999115,25.024999999999114,25.049999999999113,25.07499999999911,25.09999999999911,25.12499999999911,25.149999999999107,25.174999999999105,25.199999999999104,25.224999999999103,25.2499999999991,25.2749999999991,25.2999999999991,25.324999999999097,25.349999999999095,25.374999999999094,25.399999999999093,25.42499999999909,25.44999999999909,25.47499999999909,25.499999999999087,25.524999999999086,25.549999999999084,25.574999999999083,25.59999999999908,25.62499999999908,25.64999999999908,25.674999999999077,25.699999999999076,25.724999999999074,25.749999999999073,25.77499999999907,25.79999999999907,25.82499999999907,25.849999999999067,25.874999999999066,25.899999999999064,25.924999999999063,25.94999999999906,25.97499999999906,25.99999999999906,26.024999999999057,26.049999999999056,26.074999999999054,26.099999999999053,26.12499999999905,26.14999999999905,26.17499999999905,26.199999999999047,26.224999999999046,26.249999999999044,26.274999999999043,26.29999999999904,26.32499999999904,26.34999999999904,26.374999999999037,26.399999999999036,26.424999999999034,26.449999999999033,26.47499999999903,26.49999999999903,26.52499999999903,26.549999999999027,26.574999999999026,26.599999999999024,26.624999999999023,26.64999999999902,26.67499999999902,26.69999999999902,26.724999999999017,26.749999999999016,26.774999999999014,26.799999999999013,26.82499999999901,26.84999999999901,26.87499999999901,26.899999999999007,26.924999999999006,26.949999999999005,26.974999999999003,26.999999999999,27.024999999999,27.049999999999,27.074999999998997,27.099999999998996,27.124999999998995,27.149999999998993,27.17499999999899,27.19999999999899,27.22499999999899,27.249999999998987,27.274999999998986,27.299999999998985,27.324999999998983,27.349999999998982,27.37499999999898,27.39999999999898,27.424999999998978,27.449999999998976,27.474999999998975,27.499999999998973,27.524999999998972,27.54999999999897,27.57499999999897,27.599999999998968,27.624999999998966,27.649999999998965,27.674999999998963,27.699999999998962,27.72499999999896,27.74999999999896,27.774999999998958,27.799999999998956,27.824999999998955,27.849999999998953,27.874999999998952,27.89999999999895,27.92499999999895,27.949999999998948,27.974999999998946,27.999999999998945,28.024999999998943,28.049999999998942,28.07499999999894,28.09999999999894,28.124999999998938,28.149999999998936,28.174999999998935,28.199999999998933,28.224999999998932,28.24999999999893,28.27499999999893,28.299999999998928,28.324999999998926,28.349999999998925,28.374999999998924,28.399999999998922,28.42499999999892,28.44999999999892,28.474999999998918,28.499999999998916,28.524999999998915,28.549999999998914,28.574999999998912,28.59999999999891,28.62499999999891,28.649999999998908,28.674999999998906,28.699999999998905,28.724999999998904,28.749999999998902,28.7749999999989,28.7999999999989,28.824999999998898,28.849999999998897,28.874999999998895,28.899999999998894,28.924999999998892,28.94999999999889,28.97499999999889,28.999999999998888,29.024999999998887,29.049999999998885,29.074999999998884,29.099999999998882,29.12499999999888,29.14999999999888,29.174999999998878,29.199999999998877,29.224999999998875,29.249999999998874,29.274999999998872,29.29999999999887,29.32499999999887,29.349999999998868,29.374999999998867,29.399999999998865,29.424999999998864,29.449999999998862,29.47499999999886,29.49999999999886,29.524999999998858,29.549999999998857,29.574999999998855,29.599999999998854,29.624999999998852,29.64999999999885,29.67499999999885,29.699999999998848,29.724999999998847,29.749999999998845,29.774999999998844,29.799999999998843,29.82499999999884,29.84999999999884,29.87499999999884,29.899999999998837,29.924999999998835,29.949999999998834,29.974999999998833,29.99999999999883,30.02499999999883,30.04999999999883,30.074999999998827,30.099999999998825,30.124999999998824,30.149999999998823,30.17499999999882,30.19999999999882,30.22499999999882,30.249999999998817,30.274999999998816,30.299999999998814,30.324999999998813,30.34999999999881,30.37499999999881,30.39999999999881,30.424999999998807,30.449999999998806,30.474999999998804,30.499999999998803,30.5249999999988,30.5499999999988,30.5749999999988,30.599999999998797,30.624999999998796,30.649999999998794,30.674999999998793,30.69999999999879,30.72499999999879,30.74999999999879,30.774999999998787,30.799999999998786,30.824999999998784,30.849999999998783,30.87499999999878,30.89999999999878,30.92499999999878,30.949999999998777,30.974999999998776,30.999999999998774,31.024999999998773,31.04999999999877,31.07499999999877,31.09999999999877,31.124999999998767,31.149999999998766,31.174999999998764,31.199999999998763,31.22499999999876,31.24999999999876,31.27499999999876,31.299999999998757,31.324999999998756,31.349999999998754,31.374999999998753,31.39999999999875,31.42499999999875,31.44999999999875,31.474999999998747,31.499999999998746,31.524999999998744,31.549999999998743,31.57499999999874,31.59999999999874,31.62499999999874,31.649999999998737,31.674999999998736,31.699999999998735,31.724999999998733,31.74999999999873,31.77499999999873,31.79999999999873,31.824999999998727,31.849999999998726,31.874999999998725,31.899999999998723,31.92499999999872,31.94999999999872,31.97499999999872,31.999999999998717,32.02499999999872,32.049999999998725,32.07499999999873,32.09999999999874,32.12499999999874,32.14999999999875,32.174999999998754,32.19999999999876,32.224999999998765,32.24999999999877,32.274999999998776,32.29999999999878,32.32499999999879,32.34999999999879,32.3749999999988,32.399999999998805,32.42499999999881,32.449999999998816,32.47499999999882,32.49999999999883,32.52499999999883,32.54999999999884,32.574999999998845,32.59999999999885,32.624999999998856,32.64999999999886,32.67499999999887,32.69999999999887,32.72499999999888,32.749999999998884,32.77499999999889,32.799999999998896,32.8249999999989,32.84999999999891,32.87499999999891,32.89999999999892,32.924999999998924,32.94999999999893,32.974999999998936,32.99999999999894,33.02499999999895,33.04999999999895,33.07499999999896,33.099999999998964,33.12499999999897,33.149999999998975,33.17499999999898,33.19999999999899,33.22499999999899,33.249999999999,33.274999999999004,33.29999999999901,33.324999999999015,33.34999999999902,33.37499999999903,33.39999999999903,33.42499999999904,33.449999999999044,33.47499999999905,33.499999999999055,33.52499999999906,33.549999999999066,33.57499999999907,33.59999999999908,33.62499999999908,33.64999999999909,33.674999999999095,33.6999999999991,33.724999999999106,33.74999999999911,33.77499999999912,33.79999999999912,33.82499999999913,33.849999999999135,33.87499999999914,33.899999999999146,33.92499999999915,33.94999999999916,33.97499999999916,33.99999999999917,34.024999999999174,34.04999999999918,34.074999999999186,34.09999999999919,34.1249999999992,34.1499999999992,34.17499999999921,34.199999999999214,34.22499999999922,34.249999999999226,34.27499999999923,34.29999999999924,34.32499999999924,34.34999999999925,34.374999999999254,34.39999999999926,34.424999999999265,34.44999999999927,34.47499999999928,34.49999999999928,34.52499999999929,34.549999999999294,34.5749999999993,34.599999999999305,34.62499999999931,34.64999999999932,34.67499999999932,34.69999999999933,34.72499999999933,34.74999999999934,34.774999999999345,34.79999999999935,34.824999999999356,34.84999999999936,34.87499999999937,34.89999999999937,34.92499999999938,34.949999999999385,34.97499999999939,34.999999999999396,35.0249999999994,35.04999999999941,35.07499999999941,35.09999999999942,35.124999999999424,35.14999999999943,35.174999999999436,35.19999999999944,35.22499999999945,35.24999999999945,35.27499999999946,35.299999999999464,35.32499999999947,35.349999999999476,35.37499999999948,35.39999999999949,35.42499999999949,35.4499999999995,35.474999999999504,35.49999999999951,35.524999999999515,35.54999999999952,35.57499999999953,35.59999999999953,35.62499999999954,35.649999999999544,35.67499999999955,35.699999999999555,35.72499999999956,35.74999999999957,35.77499999999957,35.79999999999958,35.824999999999584,35.84999999999959,35.874999999999595,35.8999999999996,35.924999999999606,35.94999999999961,35.97499999999962,35.99999999999962,36.02499999999963,36.049999999999635,36.07499999999964,36.099999999999646,36.12499999999965,36.14999999999966,36.17499999999966,36.19999999999967,36.224999999999675,36.24999999999968,36.274999999999686,36.29999999999969,36.3249999999997,36.3499999999997,36.37499999999971,36.399999999999714,36.42499999999972,36.449999999999726,36.47499999999973,36.49999999999974,36.52499999999974,36.54999999999975,36.574999999999754,36.59999999999976,36.624999999999766,36.64999999999977,36.67499999999978,36.69999999999978,36.72499999999979,36.749999999999794,36.7749999999998,36.799999999999805,36.82499999999981,36.84999999999982,36.87499999999982,36.89999999999983,36.924999999999834,36.94999999999984,36.974999999999845,36.99999999999985,37.02499999999986,37.04999999999986,37.07499999999987,37.09999999999987,37.12499999999988,37.149999999999885,37.17499999999989,37.199999999999896,37.2249999999999,37.24999999999991,37.27499999999991,37.29999999999992,37.324999999999925,37.34999999999993,37.374999999999936,37.39999999999994,37.42499999999995,37.44999999999995,37.47499999999996,37.499999999999964,37.52499999999997,37.549999999999976,37.57499999999998,37.59999999999999,37.62499999999999,37.65,37.675000000000004,37.70000000000001,37.725000000000016,37.75000000000002,37.77500000000003,37.80000000000003,37.82500000000004,37.850000000000044,37.87500000000005,37.900000000000055,37.92500000000006,37.95000000000007,37.97500000000007,38.00000000000008,38.025000000000084,38.05000000000009,38.075000000000095,38.1000000000001,38.12500000000011,38.15000000000011,38.17500000000012,38.200000000000124,38.22500000000013,38.250000000000135,38.27500000000014,38.300000000000146,38.32500000000015,38.35000000000016,38.37500000000016,38.40000000000017,38.425000000000175,38.45000000000018,38.475000000000186,38.50000000000019,38.5250000000002,38.5500000000002,38.57500000000021,38.600000000000215,38.62500000000022,38.650000000000226,38.67500000000023,38.70000000000024,38.72500000000024,38.75000000000025,38.775000000000254,38.80000000000026,38.825000000000266,38.85000000000027,38.87500000000028,38.90000000000028,38.92500000000029,38.950000000000294,38.9750000000003,39.000000000000306,39.02500000000031,39.05000000000032,39.07500000000032,39.10000000000033,39.125000000000334,39.15000000000034,39.175000000000345,39.20000000000035,39.22500000000036,39.25000000000036,39.27500000000037,39.300000000000374,39.32500000000038,39.350000000000385,39.37500000000039,39.4000000000004,39.4250000000004,39.45000000000041,39.47500000000041,39.50000000000042,39.525000000000425,39.55000000000043,39.575000000000436,39.60000000000044,39.62500000000045,39.65000000000045,39.67500000000046,39.700000000000465,39.72500000000047,39.750000000000476,39.77500000000048,39.80000000000049,39.82500000000049,39.8500000000005,39.875000000000504,39.90000000000051,39.925000000000516,39.95000000000052,39.97500000000053,40.00000000000053]],[\"y\",[-65.0,-64.99925452909274,-64.99852075227696,-64.9977978475833,-64.99708508702204,-64.99638182611027,-64.99568749456127,-64.99500158800655,-64.99432366063525,-64.99365331864878,-64.99299021443998,-64.99233404141641,-64.9916845293962,-64.99104144051296,-64.99040456557343,-64.98977372081768,-64.9891487450373,-64.98852949701207,-64.98791585322985,-64.98730770585841,-64.98670496094138,-64.9861075367936,-64.98551536257385,-64.98492837701538,-64.98434652729684,-64.98376976803814,-64.98319806040752,-64.98263137132736,-64.98206967276823,-64.98151294112104,-64.98096115663894,-64.98041430294127,-64.97987236657264,-64.97933533661109,-64.97880320431999,-64.9782759628388,-64.97775360690842,-64.97723613262737,-64.9767235372353,-64.976215818921,-64.97571297665202,-64.97521501002359,-64.97472191912485,-64.97423370442026,-64.97375036664468,-64.97327190671056,-64.97279832562592,-64.97232962442185,-64.97186580408872,-64.97140686551985,-64.97095280946199,-64.97050363647182,-64.97005934687785,-64.96961994074702,-64.96918541785564,-64.96875577766399,-64.96833101929437,-64.96791114151216,-64.96749614270949,-64.9670860208913,-64.96668077366353,-64.96628039822312,-64.96588489134983,-64.9654942493994,-64.96510846829811,-64.9647275435385,-64.96435147017613,-64.96398024282732,-64.96361385566767,-64.96325230243136,-64.96289557641103,-64.96254367045837,-64.96219657698516,-64.96185428796474,-64.96151679493397,-64.96118408899548,-64.96085616082033,-64.96053300065086,-64.9602145983039,-64.95990094317416,-64.95959202423776,-63.198634351039374,-61.46536203027198,-59.75773689270969,-58.07359230754556,-58.170457061154295,-58.257730017975106,-58.33547199503264,-58.40388212484168,-58.4632680739881,-58.51401852849681,-58.556578799750085,-58.59142992143593,-58.61907127388353,-58.64000655502838,-58.654732788723884,-58.6637319971177,-58.667465144769245,-58.66636797276464,-58.66084836971148,-58.65128496475647,-58.6380266698054,-58.621392940058975,-58.601674561413944,-58.57913480888771,-58.554010851419484,-58.5265153050822,-58.49683785911291,-58.465146917612245,-58.431591214733636,-58.39630137316026,-58.35939138511563,-58.3209600024985,-58.28109202835445,-58.239859506121974,-58.19732280620089,-58.15353161161637,-58.10852580608641,-58.062336268798816,-58.01498558079308,-57.96648864812153,-57.91685324701327,-57.866080496144676,-57.814165260879655,-57.76109649401794,-57.70685751720756,-57.65142624675864,-57.59477536715443,-57.53687245510158,-57.477680056501825,-57.417155718265306,-57.35525197642252,-57.29191630152756,-57.22709100187768,-57.160713084600665,-57.09271407417685,-57.023019787463184,-56.95155006376474,-56.87821844794819,-56.80293182400374,-56.725589995826,-56.64608521129102,-56.56430162494125,-56.48011469373937,-56.3933904993973,-56.303984989708304,-56.21174313008392,-56.116497955095284,-56.018069508206864,-55.91626365602909,-55.81087076125867,-55.701664195962096,-55.58839867392244,-55.470808377326605,-55.34860484902034,-55.22147461677819,-55.08907651037481,-54.95103862552097,-54.80695488071454,-54.656381103478736,-54.49883057097196,-54.333768916130964,-54.16060829382256,-53.978700681266695,-53.78733016242803,-53.585704016113255,-53.372942390845544,-53.14806630455663,-52.90998365163839,-52.65747283125343,-52.38916352561147,-52.10351405081877,-51.79878457033873,-51.47300529493949,-51.12393858414016,-50.74903360098485,-50.34537183970256,-49.90960142583741,-49.437857557567284,-48.92566578687187,-48.367823996579645,-47.75825787700601,-47.08984340731901,-46.35418827595065,-45.541362337330476,-44.63956517973419,-43.63471690944499,-42.50995689075253,-41.24503556815871,-39.8155888916553,-38.19229751294195,-36.33996152653941,-34.216579578835315,-31.772631231471184,-28.95095901412986,-25.687981223730645,-21.9174880312778,-17.578962343702518,-12.63291766141284,-7.085135201812935,-1.0179143926789784,5.382047766416414,11.819448301937816,17.929800223932357,23.360774256158166,27.861088337437828,31.331025704673916,33.81411490049834,35.44717414907224,36.40214314269685,36.84340665107104,36.90665021047105,36.69413169962213,36.27865062591318,35.71039684698942,35.02357366969869,34.24164540972922,33.38108313423841,32.45387604579519,31.46915004146075,30.434185088737387,29.355045025743113,28.236964174238942,27.08458390447041,25.902097569978604,24.693339856489196,23.461842587160895,22.210870406802396,20.94344450380876,19.662359321464773,18.370195253940835,17.069329125262772,15.761943514666068,14.450035539845194,13.135425432053498,11.819765067471074,10.5045465175411,9.191110621244501,7.880655548859019,6.574245309936455,5.272818150912821,3.977194786391311,2.6880864097483124,1.4061024316911823,0.1317578986122414,-1.1345194547391102,-2.392382561598657,-3.6415588311875275,-4.881844451019843,-6.113099227504804,-7.33524201096909,-8.548246753916533,-9.752139254734145,-10.946994642010063,-12.132935657433425,-13.31013179671867,-14.478799368249135,-15.639202526770827,-16.791655334623897,-17.936524894868352,-19.074235588651177,-20.205274433716042,-21.33019756125026,-22.449637785220936,-23.56431321187793,-24.67503680770133,-25.782726812228233,-26.888417847137998,-27.993272534438454,-29.098593391737335,-30.205834717926383,-31.31661411191648,-32.432723171722266,-33.55613678941025,-34.6890202741692,-35.83373328238329,-36.99282918822591,-38.169048066702224,-39.36530085837807,-40.58464152034837,-41.83022303094811,-43.10523202052271,-44.412795606100175,-45.755852851251134,-47.13698241635657,-48.558177859133544,-50.0205633989629,-51.524046791674834,-53.066913589424985,-54.645379906647484,-56.25313989702618,-57.88096908550265,-59.5164721862727,-61.1440861752996,-62.74545305086927,-64.30024599934212,-65.78745634258203,-67.18703176260479,-68.48162965912793,-69.65816553935358,-70.70884515954809,-71.63148469850157,-72.42910591932117,-73.1089682699621,-73.68130099410013,-74.1580031664215,-74.55151171902706,-74.87394186641481,-75.13651941379995,-75.34926914263336,-75.52089880003915,-75.65881573288044,-75.76922270805076,-75.85725305715866,-75.92711833872858,-75.98225221504548,-76.02544179600017,-76.05894268254542,-76.08457696731512,-76.1038151203041,-76.11784348468105,-76.12761937870512,-76.13391577664223,-76.13735737118662,-76.1384495897819,-76.13760189655291,-76.13514648562489,-76.13135327161423,-76.12644191229408,-76.12059145597179,-76.11394808913508,-76.1066313649095,-76.09873921627737,-76.09035199658463,-76.08153574077633,-76.07234480166218,-76.06282398434925,-76.05301027717915,-76.04293425777546,-76.03262123710381,-76.02209219194297,-76.01136452619932,-76.00045269354848,-75.98936870753927,-75.97812256021889,-75.96672256627484,-75.95517564643036,-75.94348756121455,-75.93166310412471,-75.91970626150493,-75.90762034509876,-75.89540810213033,-75.88307180687575,-75.87061333696346,-75.85803423705481,-75.84533577207948,-75.83251897181158,-75.81958466825587,-75.80653352705454,-75.7933660739138,-75.78008271687592,-75.76668376512035,-75.75316944486055,-75.73953991280722,-75.72579526758909,-75.71193555945713,-75.69796079854396,-75.68387096190546,-75.66966599953432,-75.65534583950469,-75.64091039238107,-75.62635955500362,-75.61169321374399,-75.59691124731116,-75.58201352917386,-75.56699992965655,-75.55187031775614,-75.53662456272042,-75.52126253542208,-75.50578410955764,-75.4901891626958,-75.47447757719645,-75.4586492410181,-75.44270404842888,-75.42664190063454,-75.41046270633406,-75.39416638221289,-75.37775285338157,-75.361222053767,-75.34457392646225,-75.32780842404009,-75.31092550883461,-75.29392515319492,-75.27680733971391,-75.25957206143535,-75.24221932204127,-75.22474913602215,-75.20716152883156,-75.18945653702676,-75.17163420839684,-75.1536946020794,-75.13563778866691,-75.11746385030355,-75.09917288077344,-75.08076498558076,-75.06224028202251,-75.04359889925436,-75.02484097834993,-75.0059666723541,-74.98697614633056,-74.9678695774038,-74.94864715479606,-74.92930907985925,-74.90985556610208,-74.89028683921266,-74.87060313707666,-74.8508047097911,-74.83089181967415,-74.81086474127059,-74.79072376135355,-74.77046917892223,-74.75010130519586,-74.72962046360385,-74.7090269897724,-74.68832123150727,-74.66750354877325,-74.64657431366987,-74.62553391040377,-74.60438273525759,-74.58312119655547,-74.56174971462521,-74.5402687217571,-74.51867866215947,-74.49697999191098,-74.47517317890967,-74.45325870281894,-74.43123705501023,-74.40910873850268,-74.38687426789971,-74.36453416932251,-74.34208898034052,-74.31953924989898,-74.29688553824347,-74.27412841684159,-74.25126846830172,-74.22830628628898,-74.20524247543838,-74.18207765126519,-74.1588124400726,-74.13544747885669,-74.1119834152088,-74.08842090721517,-74.06476062335416,-74.04100324239087,-74.01714945326933,-73.99319995500217,-73.96915545655804,-73.94501667674653,-73.92078434410092,-73.89645919675863,-73.87204198233945,-73.84753345782165,-73.82293438941598,-73.79824555243756,-73.77346773117591,-73.74860171876284,-73.72364831703855,-73.6986083364159,-73.67348259574277,-73.6482719221628,-73.6229771509744,-73.59759912548806,-73.57213869688213,-73.54659672405714,-73.52097407348846,-73.49527161907778,-73.46949024200306,-73.4436308305672,-73.41769428004554,-73.39168149253207,-73.36559337678459,-73.3394308480687,-73.3131948280009,-73.28688624439059,-73.2605060310812,-73.23405512779057,-73.20753447995037,-73.18094503854492,-73.1542877599493,-73.12756360576675,-73.10077354266569,-73.07391854221599,-73.04699958072501,-73.02001763907312,-72.99297370254892,-72.96586876068417,-72.93870380708852,-72.91147983928396,-72.88419785853935,-72.85685886970471,-72.82946388104557,-72.80201390407736,-72.77450995339993,-72.74695304653216,-72.71934420374684,-72.69168444790577,-72.66397480429518,-72.63621630046147,-72.60840996604746,-72.580556832629,-72.55265793355214,-72.52471430377084,-72.49672697968528,-72.46869699898089,-72.440625400468,-72.41251322392222,-72.38436150992574,-72.35617129970935,-72.32794363499536,-72.29967955784154,-72.27138011048584,-72.2430463351923,-72.21467927409799,-72.18627996906086,-72.15784946150899,-72.12938879229077,-72.10089900152646,-72.0723811284609,-72.04383621131754,-72.01526528715371,-71.98666939171737,-71.95804955930515,-71.92940682262184,-71.9007422126413,-71.87205675846889,-71.84335148720537,-71.8146274238124,-71.78588559097955,-71.7571270089929,-71.72835269560532,-71.69956366590839,-71.6707609322059,-71.64194550388916,-71.61311838731405,-71.58428058567961,-71.5554330989087,-71.52657692353014,-71.49771305256293,-71.46884247540204,-71.43996617770627,-71.41108514128778,-71.38220034400365,-71.3533127596492,-71.3244233578533,-71.29553310397559,-71.26664295900555,-71.23775387946365,-71.20886681730435,-71.17998271982108,-71.15110252955321,-71.12222718419503,-71.09335761650661,-71.06449475422684,-71.0356395199883,-71.00679283123418,-70.97795560013732,-70.9491287335211,-70.92031313278247,-70.89150969381693,-70.8627193069456,-70.83394285684426,-70.80518122247439,-70.77643527701632,-70.74770588780432,-70.71899391626371,-70.69030021785008,-70.66162564199037,-70.63297103202606,-70.60433722515837,-70.57572505239537,-70.54713533850115,-70.51856890194696,-70.49002655486431,-70.46150910300004,-70.43301734567332,-70.40455207573468,-70.3761140795269,-70.34770413684781,-70.31932302091509,-70.29097149833292,-70.26265032906052,-70.23436026638258,-70.20610205688156,-70.17787644041184,-70.14968415007566,-70.12152591220101,-70.09340244632114,-70.06531446515604,-70.0372626745956,-70.00924777368452,-69.98127045460902,-69.95333140268524,-69.92543129634934,-69.89757080714935,-69.86975059973852,-69.8419713318706,-69.81423365439647,-69.7865382112626,-69.75888563951092,-69.73127656928045,-69.70371162381032,-69.67619141944441,-69.64871656563749,-69.62128766496285,-69.59390531312137,-69.56657009895207,-69.53928260444407,-69.51204340474996,-69.48485306820055,-69.45771215632098,-69.43062122384816,-69.40358081874955,-69.37659148224314,-69.34965374881888,-69.32276814626113,-69.29593519567251,-69.2691554114989,-69.24242930155552,-69.2157573670543,-69.18914010263228,-69.16257799638122,-69.13607152987811,-69.10962117821697,-69.08322741004146,-69.05689068757866,-69.03061146667376,-69.00439019682572,-68.97822732122393,-68.95212327678564,-68.92607849419447,-68.9000933979396,-68.87416840635596,-68.84830393166517,-68.82250038001722,-68.79675815153306,-68.7710776403478,-68.74545923465475,-68.71990331675006,-68.69441026307815,-68.66898044427771,-68.64361422522832,-68.6183119650978,-68.59307401739005,-68.56790072999344,-68.54279244522984,-68.51774949990406,-68.49277222535389,-68.46786094750055,-68.44301598689964,-68.41823765879245,-68.39352627315779,-68.36888213476414,-68.34430554322215,-68.3197967930376,-68.29535617366454,-68.27098396955888,-68.24668046023214,-68.22244592030556,-68.19828061956443,-68.17418482301265,-68.15015879092748,-68.12620277891449,-68.1023170379627,-68.07850181449989,-68.0547573504479,-68.03108388327827,-68.0074816460678,-67.9839508675543,-67.96049177219226,-67.93710458020875,-67.9137895076592,-67.89054676648325,-67.86737656456059,-67.84427910576673,-67.82125459002883,-67.79830321338137,-67.7754251680218,-67.75262064236608,-67.72988982110415,-67.70723288525525,-67.68465001222313,-67.66214137585106,-67.6397071464768,-67.61734749098721,-67.59506257287289,-67.5728525522824,-67.5507175860764,-67.52865782788157,-67.50667342814418,-67.4847645341835,-67.4629312902449,-67.4411738375527,-67.41949231436269,-67.39788685601437,-67.37635759498289,-67.35490466093063,-67.33352818075844,-67.3122282786566,-67.29100507615537,-67.26985869217512,-67.2487892430762,-67.22779684270834,-67.20688160245966,-67.18604363130531,-67.16528303585565,-67.14459992040403,-67.12399438697415,-67.1034665353669,-67.08301646320692,-67.06264426598845,-67.04235003712095,-67.02213386797413,-67.00199584792249,-66.98193606438939,-66.96195460289067,-66.94205154707771,-66.92222697877999,-66.90248097804714,-66.88281362319046,-66.86322499082394,-66.8437151559047,-66.82428419177295,-66.80493217019128,-66.78565916138359,-66.76646523407328,-66.74735045552097,-66.72831489156165,-66.70935860664123,-66.69048166385252,-66.67168412497067,-66.65296605048792,-66.63432749964788,-66.61576853047916,-66.59728919982837,-66.57888956339261,-66.56056967575122,-66.54232959039709,-66.52416935976716,-66.50608903527251,-66.48808866732767,-66.4701683053794,-66.45232799793477,-66.43456779258872,-66.41688773605088,-66.39928787417182,-66.38176825196864,-66.36432891364996,-66.3469699026402,-66.32969126160333,-66.31249303246584,-66.29537525643914,-66.27833797404139,-66.2613812251185,-66.24450504886461,-66.22770948384192,-66.21099456799982,-66.19436033869337,-66.17780683270115,-66.16133408624243,-66.14494213499373,-66.12863101410464,-66.11240075821308,-66.09625140145982,-66.08018297750239,-66.06419551952828,-66.04828906026758,-66.03246363200482,-66.01671926659029,-66.00105599545059,-65.98547384959855,-65.96997285964255,-65.9545530557951,-65.9392144678808,-65.92395712534362,-65.90878105725353,-65.89368629231252,-65.87867285885986,-65.86374078487677,-65.84889009799045,-65.8341208254774,-65.81943299426611,-65.8048266309391,-65.79030176173434,-65.7758584125459,-65.7614966089241,-65.74721637607493,-65.73301773885882,-65.71890072178878,-65.70486534902793,-65.69091164438626,-65.67703963131697,-65.66324933291193,-65.64954077189667,-65.63591397062464,-65.62236895107095,-65.60890573482533,-65.59552434308456,-65.58222479664427,-65.56900711589007,-65.55587132078813,-65.54281743087503,-65.52984546524716,-65.51695544254933,-65.50414738096288,-65.49142129819319,-65.47877721145652,-65.4662151374663,-65.45373509241884,-65.44133709197835,-65.42902115126155,-65.4167872848215,-65.40463550663095,-65.39256583006518,-65.38057826788409,-65.36867283221392,-65.35684953452824,-65.34510838562852,-65.33344939562404,-65.32187257391132,-65.31037792915298,-65.29896546925603,-65.28763520134976,-65.27638713176292,-65.26522126600048,-65.25413760871993,-65.24313616370694,-65.23221693385058,-65.22137992111811,-65.21062512652918,-65.19995255012957,-65.18936219096447,-65.17885404705136,-65.16842811535226,-65.15808439174569,-65.14782287099813,-65.13764354673496,-65.12754641141113,-65.11753145628124,-65.10759867136932,-65.09774804543815,-65.08797956595825,-65.07829321907634,-65.06868898958359,-65.0591668608834,-65.0497268149588,-65.04036883233962,-65.03109289206917,-65.02189897167068,-65.0127870471134,-65.00375709277843,-64.99480908142411,-64.9859429841513,-64.97715877036828,-64.9684564077554,-64.95983586222948,-64.951297097908,-64.94284007707294,-64.9344647601346,-64.92617110559503,-64.91795907001134,-64.90982860795883,-64.90177967199398,-64.89381221261719,-64.88592617823552,-64.87812151512514,-64.87039816739379,-64.86275607694307,-64.85519518343071,-64.84771542423267,-64.8403167344053,-64.83299904664734,-64.82576229126198,-64.81860639611885,-64.81153128661609,-64.8045368856423,-64.7976231135387,-64.79078988806118,-64.78403712434252,-64.77736473485463,-64.77077262937094,-64.76426071492887,-64.75782889579241,-64.75147707341495,-64.74520514640209,-64.73901301047484,-64.73290055843289,-64.72686768011813,-64.72091426237841,-64.71504018903154,-64.70924534082954,-64.70352959542326,-64.69789282732722,-64.69233490788478,-64.68685570523373,-64.68145508427209,-64.6761329066245,-64.67088903060879,-64.6657233112031,-64.66063560001338,-64.65562574524141,-64.65069359165315,-64.64583898054774,-64.64106174972687,-64.6363617334648,-64.6317387624788,-64.62719266390026,-64.6227232612463,-64.61833037439206,-64.61401381954349,-64.6097734092109,-64.60560895218312,-64.60152025350227,-64.59750711443932,-64.59356933247031,-64.58970670125325,-64.58591901060586,-64.58220604648403,-64.57856759096101,-64.57500342220746,-64.57151331447228,-64.56809703806431,-64.5647543593348,-64.56148504066084,-64.55828884042958,-64.55516551302341,-64.552114808806,-64.54913647410932,-64.54623025122154,-64.54339587837599,-64.54063308974092,-64.53794161541045,-64.53532118139633,-64.53277150962086,-64.53029231791075,-64.52788331999207,-64.52554422548621,-64.52327473990695,-64.52107456465855,-64.51894339703495,-64.51688093022014,-64.51488685328952,-64.51296085121248,-64.51110260485602,-64.50931179098959,-64.50758808229102,-64.50593114735368,-64.5043406506947,-64.50281625276443,-64.50135760995707,-64.49996437462246,-64.49863619507911,-64.49737271562836,-64.49617357656975,-64.49503841421767,-64.49396686091916,-64.49295854507287,-64.4920130911493,-64.49113011971231,-64.49030924744167,-64.48955008715703,-64.48885224784293,-64.48821533467517,-64.48763894904832,-64.4871226886044,-64.48666614726292,-64.48626891525196,-64.48593057914054,-64.48565072187223,-64.48542892279984,-64.48526475772141,-64.48515779891731,-64.48510761518857,-64.48511377189634,-64.48517583100254,-64.48529335111162,-64.48546588751357,-64.48569299222788,-64.48597421404884,-64.48630909859175,-64.4866971883404,-64.48713802269553,-64.48763113802441,-64.48817606771146,-64.48877234220996,-64.4894194890947,-64.4901170331158,-64.49086449625335,-64.49166139777324,-64.49250725428372,-64.49340157979316,-64.49434388576852,-64.4953336811949,-64.4963704726359,-64.49745376429492,-64.4985830580772,-64.49975785365282,-64.50097764852046,-64.50224193807195,-64.50355021565757,-64.50490197265219,-64.50629669852201,-64.50773388089208,-64.50921300561448,-64.5107335568372,-64.51229501707351,-64.51389686727214,-64.51553858688784,-64.51721965395265,-64.51893954514759,-64.52069773587492,-64.52249370033088,-64.52432691157881,-64.52619684162276,-64.52810296148151,-64.53004474126284,-64.53202165023833,-64.53403315691831,-64.53607872912718,-64.53815783407899,-64.54026993845318,-64.54241450847064,-64.54459100996985,-64.54679890848318,-64.54903766931339,-64.55130675761008,-64.55360563844636,-64.55593377689542,-64.55829063810721,-64.56067568738503,-64.56308839026208,-64.565528212578,-64.56799462055521,-64.57048708087517,-64.57300506075447,-64.57554802802073,-64.57811545118832,-64.58070679953379,-64.583321543171,-64.58595915312607,-64.58861910141192,-64.5913008611025,-64.59400390640657,-64.59672771274124,-64.59947175680493,-64.60223551664991,-64.60501847175448,-64.6078201030945,-64.6106398932145,-64.6134773262982,-64.61633188823848,-64.61920306670676,-64.62209035122174,-64.62499323321754,-64.62791120611114,-64.63084376536922,-64.63379040857421,-64.63675063548968,-64.63972394812494,-64.64270985079898,-64.64570785020352,-64.64871745546532,-64.65173817820768,-64.65476953261113,-64.65781103547319,-64.66086220626738,-64.66392256720127,-64.66699164327365,-64.67006896233084,-64.67315405512203,-64.67624645535366,-64.67934569974297,-64.68245132807043,-64.68556288323131,-64.68867991128626,-64.69180196151078,-64.69492858644387,-64.6980593419355,-64.70119378719318,-64.70433148482736,-64.70747200089596,-64.71061490494769,-64.71375977006443,-64.71690617290247,-64.72005369373277,-64.72320191648004,-64.72635042876084,-64.72949882192054,-64.73264669106923,-64.7357936351165,-64.73893925680515,-64.74208316274388,-64.74522496343872,-64.74836427332355,-64.75150071078937,-64.7546338982126,-64.75776346198221,-64.76088903252572,-64.76401024433426,-64.76712673598632,-64.77023815017066,-64.77334413370787,-64.7764443375711,-64.77953841690554,-64.78262603104685,-64.78570684353859,-64.78878052214856,-64.791846738884,-64.79490517000588,-64.79795549604196,-64.80099740179902,-64.80403057637388,-64.80705471316344,-64.81006950987381,-64.81307466852824,-64.81606989547421,-64.81905490138942,-64.82202940128684,-64.82499311451882,-64.82794576478014,-64.83088708011017,-64.83381679289408,-64.8367346398631,-64.83964036209382,-64.84253370500664,-64.84541441836332,-64.8482822562635,-64.85113697714054,-64.85397834375634,-64.85680612319535,-64.85962008685779,-64.86242001045191,-64.86520567398556,-64.86797686175683,-64.87073336234405,-64.87347496859485,-64.8762014776145,-64.87891269075358,-64.88160841359475,-64.88428845593894,-64.88695263179073,-64.88960075934304,-64.89223266096117,-64.89484816316612,-64.89744709661726,-64.90002929609436,-64.90259460047899,-64.90514285273528,-64.90767389989007,-64.91018759301247,-64.91268378719286,-64.91516234152132,-64.91762311906548,-64.92006598684782,-64.92249081582251,-64.92489748085173,-64.92728586068135,-64.92965583791637,-64.93200729899569,-64.93434013416646,-64.93665423745813,-64.93894950665582,-64.94122584327353,-64.94348315252677,-64.94572134330485,-64.94794032814285,-64.95014002319313,-64.95232034819658,-64.95448122645347,-64.95662258479399,-64.95874435354848,-64.96084646651741,-64.96292886094095,-64.96499147746839,-64.96703426012725,-64.96905715629214,-64.97106011665332,-64.97304309518518,-64.97500604911433,-64.97694893888765,-64.97887172814,-64.98077438366188,-64.9826568753668,-64.9845191762586,-64.98636126239852,-64.98818311287222,-64.98998470975664,-64.99176603808671,-64.99352708582198,-64.9952678438132,-64.99698830576871,-64.99868846822088,-65.00036833049232,-65.00202789466223,-65.00366716553253,-65.00528615059405,-65.00688485999261,-65.00846330649522,-65.01002150545605,-65.01155947478263,-65.01307723490187,-65.01457480872618,-65.0160522216196,-65.01750950136396,-65.01894667812502,-65.02036378441873,-65.02176085507753,-65.02313792721662,-65.0244950402004,-65.02583223560895,-65.0271495572045,-65.02844705089815,-65.02972476471655,-65.03098274876866,-65.03222105521279,-65.03343973822349,-65.03463885395881,-65.03581846052744,-65.03697861795618,-65.03811938815744,-65.03924083489686,-65.04034302376111,-65.04142602212583,-65.04248989912372,-65.04353472561277,-65.04456057414464,-65.04556751893325,-65.0465556358235,-65.04752500226013,-65.04847569725688,-65.04940780136563,-65.05032139664594,-65.0512165666346,-65.05209339631544,-65.0529519720894,-65.05379238174464,-65.05461471442699,-65.05541906061052,-65.05620551206836,-65.05697416184371,-65.05772510422103,-65.0584584346975,-65.05917424995461,-65.05987264783008,-65.0605537272899,-65.06121758840062,-65.0618643323019,-65.06249406117918,-65.06310687823675,-65.06370288767086,-65.06428219464314,-65.0648449052543,-65.065391126518,-65.06592096633487,-65.06643453346702,-65.06693193751246,-65.06741328888003,-65.06787869876436,-65.06832827912122,-65.068762142643,-65.0691804027345,-65.06958317348892,-65.06997056966408,-65.07034270665892,-65.07069970049021,-65.07104166776949,-65.07136872568027,-65.07168099195547,-65.0719785848551,-65.07226162314416,-65.0725302260708,-65.0727845133447,-65.07302460511573,-65.0732506219528,-65.07346268482294,-65.07366091507075,-65.07384543439784,-65.07401636484278,-65.07417382876108,-65.07431794880553,-65.07444884790672,-65.0745666492538,-65.07467147627547,-65.07476345262123,-65.07484270214286,-65.0749093488761,-65.07496351702258,-65.07500533093197,-65.0750349150844,-65.07505239407307,-65.07505789258705,-65.07505153539442,-65.07503344732551,-65.07500375325644,-65.07496257809288,-65.07491004675398,-65.07484628415659,-65.07477141519963,-65.07468556474876,-65.07458885762115,-65.0744814185706,-65.07436337227276,-65.07423484331065,-65.07409595616035,-65.07394683517688,-65.07378760458033,-65.07361838844217,-65.0734393106718,-65.07325049500325,-65.07305206498215,-65.07284414395284,-65.0726268550457,-65.07240032116475,-65.0721646649753,-65.07192000889194,-65.07166647506662,-65.07140418537703,-65.07113326141507,-65.07085382447552,-65.07056599554501,-65.07026989529102,-65.06996564405118,-65.06965336182272,-65.06933316825209,-65.06900518262475,-65.06866952385519,-65.06832631047709,-65.06797566063366,-65.06761769206817,-65.06725252211459,-65.06688026768853,-65.06650104527826,-65.06611497093584,-65.0657221602686,-65.0653227284306,-65.06491679011435,-65.06450445954269,-65.06408585046078,-65.06366107612835,-65.06323024931197,-65.06279348227757,-65.06235088678314,-65.06190257407147,-65.06144865486317,-65.06098923934977,-65.06052443718691,-65.06005435748787,-65.05957910881703,-65.0590987991836,-65.05861353603548,-65.0581234262532,-65.05762857614413,-65.05712909143661,-65.05662507727449,-65.0561166382116,-65.05560387820643,-65.05508690061691,-65.05456580819543,-65.05404070308384,-65.05351168680865,-65.05297886027637,-65.05244232376899,-65.0519021769395,-65.05135851880769,-65.05081144775583,-65.05026106152475,-65.04970745720983,-65.04915073125723,-65.04859097946012,-65.04802829695517,-65.04746277821907,-65.04689451706514,-65.04632360664013,-65.04575013942105,-65.04517420721216,-65.04459590114207,-65.04401531166096,-65.04343252853778,-65.04284764085777,-65.04226073701992,-65.04167190473456,-65.0410812310211,-65.04048880220583,-65.03989470391986,-65.03929902109708,-65.03870183797231,-65.03810323807949,-65.03750330424994,-65.03690211861083,-65.03629976258355,-65.03569631688242,-65.03509186151322,-65.03448647577204,-65.03388023824405,-65.03327322680249,-65.03266551860766,-65.03205719010599,-65.03144831702926,-65.03083897439386,-65.03022923650012,-65.02961917693175,-65.02900886855537,-65.02839838352004,-65.027787793257,-65.02717716847937,-65.02656657918195,-65.02595609464117,-65.02534578341503,-65.02473571334312,-65.02412595154678,-65.02351656442926,-65.02290761767598,-65.02229917625488,-65.02169130441676,-65.02108406569582,-65.02047752291014,-65.0198717381623,-65.01926677284001,-65.01866268761692,-65.01805954245333,-65.01745739659708,-65.01685630858447,-65.01625633624123,-65.01565753668358,-65.0150599663193,-65.01446368084893,-65.01386873526698,-65.01327518386317,-65.0126830802238,-65.01209247723311,-65.01150342707477,-65.01091598123335,-65.01033019049588,-65.00974610495344,-65.00916377400283,-65.00858324634832,-65.00800457000338,-65.00742779229245,-65.00685295985286,-65.00628011863678,-65.00570931391306,-65.00514059026933,-65.00457399161405,-65.00400956117858,-65.00344734151933,-65.00288737452,-65.00232970139375,-65.0017743626855,-65.0012213982743,-65.00067084737563,-65.00012274854386,-64.99957713967467,-64.99903405800757,-64.99849354012838,-64.99795562197184,-64.99742033882421,-64.99688772532592,-64.99635781547425,-64.99583064262605,-64.99530623950048,-64.99478463818186,-64.99426587012243,-64.99374996614527,-64.99323695644716,-64.99272687060154,-64.99221973756147,-64.99171558566259,-64.9912144426262,-64.9907163355623,-64.99022129097268,-64.98972933475406,-64.98924049220119,-64.98875478801011,-64.9882722462813,-64.98779289052293,-64.98731674365413,-64.98684382800832,-64.98637416533646,-64.98590777681044,-64.98544468302646,-64.98498490400839,-64.98452845921122,-64.9840753675245,-64.98362564727579,-64.98317931623419,-64.98273639161381,-64.98229689007736,-64.98186082773965,-64.98142822017121,-64.98099908240188,-64.98057342892443,-64.98015127369818,-64.97973263015272,-64.97931751119151,-64.97890592919562,-64.97849789602745,-64.97809342303445,-64.97769252105287,-64.97729520041152,-64.97690147093554,-64.97651134195026,-64.9761248222849,-64.97574192027653,-64.97536264377379,-64.97498700014083,-64.97461499626111,-64.97424663854135,-64.97388193291536,-64.973520884848,-64.97316349933904,-64.97280978092714,-64.97245973369375,-64.97211336126709,-64.97177066682609,-64.97143165310435,-64.97109632239412,-64.9707646765503,-64.97043671699446,-64.97011244471874,-64.96979186028997,-64.96947496385366,-64.96916175513795,-64.96885223345771,-64.96854639771857,-64.96824424642091,-64.96794577766397,-64.96765098914986,-64.9673598781876,-64.96707244169717,-64.96678867621365,-64.96650857789119,-64.9662321425071,-64.96595936546592,-64.96569024180353,-64.96542476619113,-64.9651629329394,-64.96490473600252,-64.96465016898225,-64.964399225132,-64.9641518973609,-64.96390817823792,-64.96366805999583,-64.96343153453536,-64.96319859342923,-64.96296922792621,-64.96274342895519,-64.96252118712923,-64.9623024927496,-64.96208733580985,-64.96187570599986,-64.96166759270983,-64.96146298503437,-64.96126187177651,-64.96106424145174,-64.96087008229198,-64.96067938224965,-64.96049212900164,-64.9603083099533,-64.9601279122425,-64.95995092274352,-64.95977732807106,-64.95960711458424,-64.95944026839057,-64.95927677534978,-64.9591166210779,-64.95895979095113,-64.95880627010978,-64.95865604346214,-64.95850909568843,-64.95836541124467,-64.95822497436656,-64.95808776907333,-64.95795377917163,-64.95782298825937,-64.9576953797295,-64.9575709367739,-64.95744964238716,-64.95733147937035,-64.95721643033484,-64.95710447770601,-64.95699560372707,-64.95688979046275,-64.95678701980307,-64.95668727346698,-64.95659053300612,-64.95649677980846,-64.95640599510199,-64.95631815995834,-64.95623325529645,-64.95615126188615,-64.95607216035175,-64.95599593117568]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1044\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1045\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1040\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1041\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1042\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1011\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1024\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1025\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1026\",\"attributes\":{\"dimensions\":\"both\",\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1027\",\"attributes\":{\"syncable\":false,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"handles\":{\"type\":\"object\",\"name\":\"BoxInteractionHandles\",\"id\":\"p1033\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p1032\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1034\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1035\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1036\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1019\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1020\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1021\"},\"axis_label\":\"v (mV)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1022\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1014\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1015\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1016\"},\"axis_label\":\"t (ms)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1017\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1018\",\"attributes\":{\"axis\":{\"id\":\"p1014\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1023\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1019\"}}}]}}]}};\n", " const render_items = [{\"docid\":\"a47f8afb-1c5f-4190-affd-22430d6802b4\",\"roots\":{\"p1003\":\"de19e4aa-debf-403d-8583-c9da4e7de0e9\"},\"root_ids\":[\"p1003\"]}];\n", " void root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1003" } }, "output_type": "display_data" } ], "source": [ "f = plt.figure(x_axis_label=\"t (ms)\", y_axis_label=\"v (mV)\")\n", "f.line(t, v, line_width=2)\n", "plt.show(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using matplotlib" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "matplotlib is a mature non-Javascript based graphics library. While it does offer an interactive Jupyter mode, this interactivity blocks subsequent Python execution until interactive-mode is cancelled." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In Jupyter, to ensure matplotlib graphs appear inline, use:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:58.907904Z", "iopub.status.busy": "2025-05-23T00:18:58.907577Z", "iopub.status.idle": "2025-05-23T00:18:59.209882Z", "shell.execute_reply": "2025-05-23T00:18:59.209488Z" } }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(When not using Jupyter, skip the above step -- it would be a syntax error in pure Python. Your graphs will appear in separate windows instead.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As with bokeh, we must import the matplotlib module before using it. In particular, we will load the pyplot submodule and give it the shorter name plt:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.211798Z", "iopub.status.busy": "2025-05-23T00:18:59.211531Z", "iopub.status.idle": "2025-05-23T00:18:59.214248Z", "shell.execute_reply": "2025-05-23T00:18:59.213900Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The matplotlib equivalent to the above bokeh example is then:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.215771Z", "iopub.status.busy": "2025-05-23T00:18:59.215465Z", "iopub.status.idle": "2025-05-23T00:18:59.300408Z", "shell.execute_reply": "2025-05-23T00:18:59.299999Z" } }, "outputs": [ { "data": { "image/png": "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j9fr1WOPPaYxY8ZIki677DL94Q9/UE1NjTIzMzV+/HhdcMEFeuutt3TFFVeosrJSGRkZuuiii5SVlaURI0bojDPOiHjPIUOGyOPxqLq6WiNGjDDvggHEHUNdAAaE1tZWpaamdjuenp4eDj2SVFJSopEjRyozMzPiWG1trSTpX/7lXzRixAiNHj1a11xzjZ599lm1tLREvGdaWpokdTsOoP8j+AAYEAoLC1VXV9fteEpKSsRzm83W47FAICBJysrK0saNG/Xcc8/phBNO0OLFizVp0iTV19eHzz906JCkow+7Aei/CD4A+jWXyxVReHw0Z5xxhj755BNTPtPpdGrmzJm67777tHnzZu3atUurVq0Kv75lyxYNGzZMhYWFpnwegMShxgdAvzZy5Ei999572rVrlzIzM5Wfny+7vfu/2WbPnq3vfOc78vv9cjgcUX/e8uXLtWPHDk2bNk15eXl69dVXFQgENHbs2PA577zzjmbNmhX1ZwCwDj0+APq1H/3oR3I4HBo/fryKiopUWVnZ43kXXnihnE6n3nzzzZg+Lzc3Vy+99JKmT5+uU045RY8//riee+45TZgwQZLU1tamv/zlL1q4cGFMnwPAGqzcDGDAWLp0qf73f/9Xf//73+P2GY899phefvllvfHGG3H7DADxw1AXgAHju9/9rurr69XU1KSsrKy4fEZKSooeeeSRuLw3gPijxwcAAAwa1PgAAIBBg+ADAAAGDYIPAAAYNAg+AABg0CD4AACAQYPgAwAABg2CDwAAGDQIPgAAYNAg+AAAgEHj/wfn9lbaR131KwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(t, v)\n", "plt.xlabel(\"t (ms)\")\n", "plt.ylabel(\"v (mV)\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 9: Saving and loading results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### CSV\n", "

The csv (comma separated variables) file format is widely used for data interchange, and can be used to transfer data to MATLAB, Excel, etc without writing any special conversion code.

(Many Python distributions provide the pandas module which can do the same using a slightly simpler interface, but the code below works in all versions of Python... an example of reading CSV using pandas is shown below.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python provides the csv module to simplify reading and writing csv files. We load it via:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.302408Z", "iopub.status.busy": "2025-05-23T00:18:59.302180Z", "iopub.status.idle": "2025-05-23T00:18:59.305042Z", "shell.execute_reply": "2025-05-23T00:18:59.304714Z" } }, "outputs": [], "source": [ "import csv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Writing

" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.306865Z", "iopub.status.busy": "2025-05-23T00:18:59.306537Z", "iopub.status.idle": "2025-05-23T00:18:59.312955Z", "shell.execute_reply": "2025-05-23T00:18:59.312623Z" } }, "outputs": [], "source": [ "with open(\"data.csv\", \"w\") as f:\n", " csv.writer(f).writerows(zip(t, v))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You should now have a data.csv file. Try loading it in your favorite spreadsheet.\n", "\n", "To write additional variables (as columns) to the CSV file, just add them inside the zip; e.g. zip(t, v1, v2, ca1)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Reading

" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.315156Z", "iopub.status.busy": "2025-05-23T00:18:59.314418Z", "iopub.status.idle": "2025-05-23T00:18:59.321565Z", "shell.execute_reply": "2025-05-23T00:18:59.321228Z" } }, "outputs": [], "source": [ "with open(\"data.csv\") as f:\n", " reader = csv.reader(f)\n", " tnew, vnew = zip(*[[float(val) for val in row] for row in reader if row])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The argument to the zip is a nested list comprehension; the zip and the asterisk together effectively transpose the data turning it from a list of (t, v) pairs into a list of t values and a list of v values. For loading more variables, the right hand side of the last line is unchanged; all that changes is that the variables need to be listed on the left; e.g. tnew, vnew, canew = zip(...)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot our newly loaded data (here with matplotlib) to see that it is the same as before:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.323296Z", "iopub.status.busy": "2025-05-23T00:18:59.323089Z", "iopub.status.idle": "2025-05-23T00:18:59.394059Z", "shell.execute_reply": "2025-05-23T00:18:59.393675Z" } }, "outputs": [ { "data": { "image/png": "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j9fr1WOPPaYxY8ZIki677DL94Q9/UE1NjTIzMzV+/HhdcMEFeuutt3TFFVeosrJSGRkZuuiii5SVlaURI0bojDPOiHjPIUOGyOPxqLq6WiNGjDDvggHEHUNdAAaE1tZWpaamdjuenp4eDj2SVFJSopEjRyozMzPiWG1trSTpX/7lXzRixAiNHj1a11xzjZ599lm1tLREvGdaWpokdTsOoP8j+AAYEAoLC1VXV9fteEpKSsRzm83W47FAICBJysrK0saNG/Xcc8/phBNO0OLFizVp0iTV19eHzz906JCkow+7Aei/CD4A+jWXyxVReHw0Z5xxhj755BNTPtPpdGrmzJm67777tHnzZu3atUurVq0Kv75lyxYNGzZMhYWFpnwegMShxgdAvzZy5Ei999572rVrlzIzM5Wfny+7vfu/2WbPnq3vfOc78vv9cjgcUX/e8uXLtWPHDk2bNk15eXl69dVXFQgENHbs2PA577zzjmbNmhX1ZwCwDj0+APq1H/3oR3I4HBo/fryKiopUWVnZ43kXXnihnE6n3nzzzZg+Lzc3Vy+99JKmT5+uU045RY8//riee+45TZgwQZLU1tamv/zlL1q4cGFMnwPAGqzcDGDAWLp0qf73f/9Xf//73+P2GY899phefvllvfHGG3H7DADxw1AXgAHju9/9rurr69XU1KSsrKy4fEZKSooeeeSRuLw3gPijxwcAAAwa1PgAAIBBg+ADAAAGDYIPAAAYNAg+AABg0CD4AACAQYPgAwAABg2CDwAAGDQIPgAAYNAg+AAAgEHj/wfn9lbaR131KwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(tnew, vnew)\n", "plt.xlabel(\"t (ms)\")\n", "plt.ylabel(\"v (mV)\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Reading and plotting using plotnine and pandas:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The modules plotnine and pandas are key components of the Python data science ecosystem. We can use them to work with our NEURON data, but they may have to be installed separately." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we'll load the modules. It is common to use shortened names for the modules, but this is not necessary:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.396395Z", "iopub.status.busy": "2025-05-23T00:18:59.395612Z", "iopub.status.idle": "2025-05-23T00:18:59.635808Z", "shell.execute_reply": "2025-05-23T00:18:59.635417Z" } }, "outputs": [], "source": [ "import plotnine as p9\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can load the data:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.637633Z", "iopub.status.busy": "2025-05-23T00:18:59.637439Z", "iopub.status.idle": "2025-05-23T00:18:59.641869Z", "shell.execute_reply": "2025-05-23T00:18:59.641564Z" } }, "outputs": [], "source": [ "data = pd.read_csv(\"data.csv\", header=None, names=[\"t\", \"v\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(If the CSV file had a header row identifying the columns, then pd.read_csv would have handled the names automatically and we would not have had to specify the last two arguments above.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now plot with plotnine's version of ggplot. This function provides an implementation of Wilkinson's Grammar of Graphics; as such, the interface is essentially identical to the R function of the same name. " ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.643332Z", "iopub.status.busy": "2025-05-23T00:18:59.643044Z", "iopub.status.idle": "2025-05-23T00:18:59.707169Z", "shell.execute_reply": "2025-05-23T00:18:59.706797Z" } }, "outputs": [], "source": [ "g = (p9.ggplot(data, p9.aes(x=\"t\", y=\"v\")) + p9.geom_path()).draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### JSON\n", "

JSON is used for structured data interchange. It is a newer but widely used format and libraries for reading and writing JSON exist for most programming languages.

Python provides the json module to simplify reading and writing JSON files. We load it via:

" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.708991Z", "iopub.status.busy": "2025-05-23T00:18:59.708802Z", "iopub.status.idle": "2025-05-23T00:18:59.711337Z", "shell.execute_reply": "2025-05-23T00:18:59.711026Z" } }, "outputs": [], "source": [ "import json" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Writing

" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.712790Z", "iopub.status.busy": "2025-05-23T00:18:59.712494Z", "iopub.status.idle": "2025-05-23T00:18:59.719422Z", "shell.execute_reply": "2025-05-23T00:18:59.719102Z" } }, "outputs": [], "source": [ "with open(\"data.json\", \"w\") as f:\n", " json.dump({\"t\": list(t), \"v\": list(v)}, f, indent=4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we built a dictionary with keys t and v, and stored their values as a list. Since JSON is a language-independent format, it does not have a concept of NEURON Vectors, which is why we had to create a list copy of them before saving. The indent=4 argument is optional, but indents the output to make it more human-readable (at the cost of a larger file size)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Reading

" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.721054Z", "iopub.status.busy": "2025-05-23T00:18:59.720724Z", "iopub.status.idle": "2025-05-23T00:18:59.724449Z", "shell.execute_reply": "2025-05-23T00:18:59.724124Z" } }, "outputs": [], "source": [ "with open(\"data.json\") as f:\n", " data = json.load(f)\n", "tnew = data[\"t\"]\n", "vnew = data[\"v\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As for csv, we plot the newly loaded data to show that it is the same as the original:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.725783Z", "iopub.status.busy": "2025-05-23T00:18:59.725540Z", "iopub.status.idle": "2025-05-23T00:18:59.795776Z", "shell.execute_reply": "2025-05-23T00:18:59.795377Z" } }, "outputs": [ { "data": { "image/png": "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j9fr1WOPPaYxY8ZIki677DL94Q9/UE1NjTIzMzV+/HhdcMEFeuutt3TFFVeosrJSGRkZuuiii5SVlaURI0bojDPOiHjPIUOGyOPxqLq6WiNGjDDvggHEHUNdAAaE1tZWpaamdjuenp4eDj2SVFJSopEjRyozMzPiWG1trSTpX/7lXzRixAiNHj1a11xzjZ599lm1tLREvGdaWpokdTsOoP8j+AAYEAoLC1VXV9fteEpKSsRzm83W47FAICBJysrK0saNG/Xcc8/phBNO0OLFizVp0iTV19eHzz906JCkow+7Aei/CD4A+jWXyxVReHw0Z5xxhj755BNTPtPpdGrmzJm67777tHnzZu3atUurVq0Kv75lyxYNGzZMhYWFpnwegMShxgdAvzZy5Ei999572rVrlzIzM5Wfny+7vfu/2WbPnq3vfOc78vv9cjgcUX/e8uXLtWPHDk2bNk15eXl69dVXFQgENHbs2PA577zzjmbNmhX1ZwCwDj0+APq1H/3oR3I4HBo/fryKiopUWVnZ43kXXnihnE6n3nzzzZg+Lzc3Vy+99JKmT5+uU045RY8//riee+45TZgwQZLU1tamv/zlL1q4cGFMnwPAGqzcDGDAWLp0qf73f/9Xf//73+P2GY899phefvllvfHGG3H7DADxw1AXgAHju9/9rurr69XU1KSsrKy4fEZKSooeeeSRuLw3gPijxwcAAAwa1PgAAIBBg+ADAAAGDYIPAAAYNAg+AABg0CD4AACAQYPgAwAABg2CDwAAGDQIPgAAYNAg+AAAgEHj/wfn9lbaR131KwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(tnew, vnew)\n", "plt.xlabel(\"t (ms)\")\n", "plt.ylabel(\"v (mV)\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pickles\n", "

Pickles are a Python-specific data exchange format.

Python provides the pickle module to read and write pickled files. We load it via:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.797613Z", "iopub.status.busy": "2025-05-23T00:18:59.797413Z", "iopub.status.idle": "2025-05-23T00:18:59.800253Z", "shell.execute_reply": "2025-05-23T00:18:59.799950Z" } }, "outputs": [], "source": [ "import pickle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Writing

" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.802042Z", "iopub.status.busy": "2025-05-23T00:18:59.801807Z", "iopub.status.idle": "2025-05-23T00:18:59.804948Z", "shell.execute_reply": "2025-05-23T00:18:59.804625Z" } }, "outputs": [], "source": [ "with open(\"data.p\", \"wb\") as f:\n", " pickle.dump({\"t\": t, \"v\": v}, f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is slightly cleaner than the JSON solution above because it is Python specific and therefore able to explicitly encode NEURON Vector objects." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Reading

" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.806997Z", "iopub.status.busy": "2025-05-23T00:18:59.806359Z", "iopub.status.idle": "2025-05-23T00:18:59.809600Z", "shell.execute_reply": "2025-05-23T00:18:59.809282Z" } }, "outputs": [], "source": [ "with open(\"data.p\", \"rb\") as f:\n", " data = pickle.load(f)\n", "tnewp = data[\"t\"]\n", "vnewp = data[\"v\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pickles in Python 3 are by default binary files, so we have to specify write and read flags of wb and rb respectively. We use a different variable name here than before simply to indicate that what is loaded in has type" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.811308Z", "iopub.status.busy": "2025-05-23T00:18:59.811063Z", "iopub.status.idle": "2025-05-23T00:18:59.815031Z", "shell.execute_reply": "2025-05-23T00:18:59.814725Z" } }, "outputs": [ { "data": { "text/plain": [ "hoc.HocObject" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(tnewp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and in particular is a NEURON Vector:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.817084Z", "iopub.status.busy": "2025-05-23T00:18:59.816344Z", "iopub.status.idle": "2025-05-23T00:18:59.820500Z", "shell.execute_reply": "2025-05-23T00:18:59.820173Z" } }, "outputs": [ { "data": { "text/plain": [ "'Vector[2]'" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tnewp.hname()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unlike the other solutions provided, which construct regular Python lists:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.822168Z", "iopub.status.busy": "2025-05-23T00:18:59.821819Z", "iopub.status.idle": "2025-05-23T00:18:59.825542Z", "shell.execute_reply": "2025-05-23T00:18:59.825213Z" } }, "outputs": [ { "data": { "text/plain": [ "list" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(tnew)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a minor distinction though, as we've already seen list(vec) copies a Vector vec into a new list. Using `h.Vector(old_list)` makes a NEURON Vector that is a copy of `old_list`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As before, plotting suggests that we have successfully loaded in the data:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "execution": { "iopub.execute_input": "2025-05-23T00:18:59.827364Z", "iopub.status.busy": "2025-05-23T00:18:59.827034Z", "iopub.status.idle": "2025-05-23T00:18:59.897327Z", "shell.execute_reply": "2025-05-23T00:18:59.896971Z" } }, "outputs": [ { "data": { "image/png": "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j9fr1WOPPaYxY8ZIki677DL94Q9/UE1NjTIzMzV+/HhdcMEFeuutt3TFFVeosrJSGRkZuuiii5SVlaURI0bojDPOiHjPIUOGyOPxqLq6WiNGjDDvggHEHUNdAAaE1tZWpaamdjuenp4eDj2SVFJSopEjRyozMzPiWG1trSTpX/7lXzRixAiNHj1a11xzjZ599lm1tLREvGdaWpokdTsOoP8j+AAYEAoLC1VXV9fteEpKSsRzm83W47FAICBJysrK0saNG/Xcc8/phBNO0OLFizVp0iTV19eHzz906JCkow+7Aei/CD4A+jWXyxVReHw0Z5xxhj755BNTPtPpdGrmzJm67777tHnzZu3atUurVq0Kv75lyxYNGzZMhYWFpnwegMShxgdAvzZy5Ei999572rVrlzIzM5Wfny+7vfu/2WbPnq3vfOc78vv9cjgcUX/e8uXLtWPHDk2bNk15eXl69dVXFQgENHbs2PA577zzjmbNmhX1ZwCwDj0+APq1H/3oR3I4HBo/fryKiopUWVnZ43kXXnihnE6n3nzzzZg+Lzc3Vy+99JKmT5+uU045RY8//riee+45TZgwQZLU1tamv/zlL1q4cGFMnwPAGqzcDGDAWLp0qf73f/9Xf//73+P2GY899phefvllvfHGG3H7DADxw1AXgAHju9/9rurr69XU1KSsrKy4fEZKSooeeeSRuLw3gPijxwcAAAwa1PgAAIBBg+ADAAAGDYIPAAAYNAg+AABg0CD4AACAQYPgAwAABg2CDwAAGDQIPgAAYNAg+AAAgEHj/wfn9lbaR131KwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(tnewp, vnewp)\n", "plt.xlabel(\"t (ms)\")\n", "plt.ylabel(\"v (mV)\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.10" } }, "nbformat": 4, "nbformat_minor": 2 }