{ "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-08-18T03:35:59.984091Z", "iopub.status.busy": "2025-08-18T03:35:59.983935Z", "iopub.status.idle": "2025-08-18T03:36:00.399663Z", "shell.execute_reply": "2025-08-18T03:36:00.399230Z" } }, "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-08-18T03:36:00.401978Z", "iopub.status.busy": "2025-08-18T03:36:00.401780Z", "iopub.status.idle": "2025-08-18T03:36:00.407470Z", "shell.execute_reply": "2025-08-18T03:36:00.407145Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\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-08-18T03:36:00.471051Z", "iopub.status.busy": "2025-08-18T03:36:00.470832Z", "iopub.status.idle": "2025-08-18T03:36:00.476117Z", "shell.execute_reply": "2025-08-18T03:36:00.475754Z" } }, "outputs": [], "source": [ "from neuron import n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When using NEURON, you will always want the n submodule. (With older code, you may have seen people use the h submodule. They are almost exactly equivalent, and h continues to work.) 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-08-18T03:36:00.478689Z", "iopub.status.busy": "2025-08-18T03:36:00.478538Z", "iopub.status.idle": "2025-08-18T03:36:00.507582Z", "shell.execute_reply": "2025-08-18T03:36:00.507185Z" } }, "outputs": [], "source": [ "from neuron import n, rxd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NB: When importing n, 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-08-18T03:36:00.509598Z", "iopub.status.busy": "2025-08-18T03:36:00.509447Z", "iopub.status.idle": "2025-08-18T03:36:00.514511Z", "shell.execute_reply": "2025-08-18T03:36:00.514139Z" } }, "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-08-18T03:36:00.516236Z", "iopub.status.busy": "2025-08-18T03:36:00.516093Z", "iopub.status.idle": "2025-08-18T03:36:00.520504Z", "shell.execute_reply": "2025-08-18T03:36:00.520158Z" } }, "outputs": [], "source": [ "soma = n.Section(\"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 `n.topology` function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NEURON's `n.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", "\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-08-18T03:36:00.523609Z", "iopub.status.busy": "2025-08-18T03:36:00.522055Z", "iopub.status.idle": "2025-08-18T03:36:00.532423Z", "shell.execute_reply": "2025-08-18T03:36:00.532059Z" } }, "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": [ "n.topology()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `n.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-08-18T03:36:00.534679Z", "iopub.status.busy": "2025-08-18T03:36:00.533995Z", "iopub.status.idle": "2025-08-18T03:36:00.539064Z", "shell.execute_reply": "2025-08-18T03:36:00.538691Z" } }, "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_0x59fadddf9cf0',\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-08-18T03:36:00.541334Z", "iopub.status.busy": "2025-08-18T03:36:00.540753Z", "iopub.status.idle": "2025-08-18T03:36:00.544925Z", "shell.execute_reply": "2025-08-18T03:36:00.544614Z" } }, "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-08-18T03:36:00.547176Z", "iopub.status.busy": "2025-08-18T03:36:00.546576Z", "iopub.status.idle": "2025-08-18T03:36:00.550430Z", "shell.execute_reply": "2025-08-18T03:36:00.550098Z" } }, "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 (`n.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-08-18T03:36:00.552096Z", "iopub.status.busy": "2025-08-18T03:36:00.551960Z", "iopub.status.idle": "2025-08-18T03:36:00.554673Z", "shell.execute_reply": "2025-08-18T03:36:00.554348Z" } }, "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-08-18T03:36:00.556842Z", "iopub.status.busy": "2025-08-18T03:36:00.556245Z", "iopub.status.idle": "2025-08-18T03:36:00.560535Z", "shell.execute_reply": "2025-08-18T03:36:00.560215Z" } }, "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 `n` submodule, try:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2025-08-18T03:36:00.562115Z", "iopub.status.busy": "2025-08-18T03:36:00.561979Z", "iopub.status.idle": "2025-08-18T03:36:00.566393Z", "shell.execute_reply": "2025-08-18T03:36:00.566066Z" } }, "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, NMODLRandom, NetCon,\n", "NetStim, OClamp, PHI, PI, PPShape, PWManager, ParallelContext,\n", "PatternStim, PlotShape, PointProcessMark, Pointer, PtrVector,\n", "PythonObject, R, Ra, Random, RangeVarPlot, SEClamp, SaveState,\n", "Section, SectionBrowser, SectionList, SectionRef, Shape,\n", "StateTransitionEvent, StringFunctions, SymChooser, Timer, VBox,\n", "VClamp, ValueFieldEditor, Vector, __abs__, __add__, __bool__,\n", "__call__, __class__, __delattr__, __delitem__, __dir__, __doc__,\n", "__eq__, __format__, __ge__, __getattribute__, __getitem__,\n", "__getstate__, __gt__, __hash__, __init__, __init_subclass__, __iter__,\n", "__le__, __len__, __lt__, __module__, __mul__, __ne__, __neg__,\n", "__new__, __next__, __pos__, __radd__, __reduce__, __reduce_ex__,\n", "__repr__, __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, clamp_resist, cm, connect, continue,\n", "continue_dialog, coredump_on_error, coreneuron_handle, 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, for, forall, forsec, fprint,\n", "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, nrn_feenableexcept,\n", "nrn_get_config_key, nrn_get_config_val, nrn_load_dll, nrn_mallinfo,\n", "nrn_netrec_state_adjust, nrn_num_config_keys, nrn_shape_changed_,\n", "nrn_sparse_partrans, nrnallpointmenu, nrnallsectionmenu,\n", "nrnglobalmechmenu, nrniv_bind_thread, nrnmechmenu, nrnmpi_init,\n", "nrnpointmenu, nrnpython, nrnsecmenu, nrnunit_use_legacy, nrnversion,\n", "nseg, ntau_hh, numarg, obfunc, object_id, object_pop, object_push,\n", "object_pushed, objectvar, objref, parent_connection, parent_node,\n", "parent_section, pas, plot, plotx, ploty, plt, pop_section, print,\n", "print_local_memory_usage, print_session, printf, prmat, proc, prstim,\n", "psection, pt3dadd, pt3dchange, pt3dclear, pt3dconst, pt3dinsert,\n", "pt3dremove, pt3dstyle, public, push_section, pval_praxis, pwman_place,\n", "quit, rallbranch, rates_hh, read, ref, regraph, retrieveaudit, return,\n", "ri, ropen, same, sav_g, sav_rhs, save_session, saveaudit, secname,\n", "secondorder, section_exists, section_orientation, section_owner,\n", "sectionname, setSpineArea, setcolor, setdata_feature, setdata_hh,\n", "setdata_pas, setpointer, show_errmess_always, show_winio, sin, solve,\n", "spine3d, sprint, sqrt, sred, sscanf, startsw, stop, stop_praxis,\n", "stoprun, stopsw, strcmp, strdef, string_dialog, symbols, system, t,\n", "tanh, taueps_IntFire4, this_node, this_section, topology, uninsert,\n", "units, unix_mac_pc, use_exp_pow_precision, use_mcell_ran4,\n", "usetable_hh, v, variable_domain, vext, vtrap_hh, while, wopen, x3d,\n", "xbutton, xc, xcheckbox, xfixedvalue, xg, xlabel, xmenu, xopen,\n", "xopen_broadcast_, xpanel, xpvalue, xradiobutton, xraxial, xred,\n", "xslider, xstatebutton, xvalue, xvarlabel, y3d, z3d\n" ] } ], "source": [ "import textwrap\n", "\n", "print(textwrap.fill(\", \".join(dir(n))))" ] }, { "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-08-18T03:36:00.568601Z", "iopub.status.busy": "2025-08-18T03:36:00.568016Z", "iopub.status.idle": "2025-08-18T03:36:00.573071Z", "shell.execute_reply": "2025-08-18T03:36:00.572773Z" } }, "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-08-18T03:36:00.574723Z", "iopub.status.busy": "2025-08-18T03:36:00.574587Z", "iopub.status.idle": "2025-08-18T03:36:00.577608Z", "shell.execute_reply": "2025-08-18T03:36:00.577275Z" } }, "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 `n.hh` as the mechanism type:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2025-08-18T03:36:00.579530Z", "iopub.status.busy": "2025-08-18T03:36:00.579245Z", "iopub.status.idle": "2025-08-18T03:36:00.599661Z", "shell.execute_reply": "2025-08-18T03:36:00.599320Z" } }, "outputs": [ { "data": { "text/plain": [ "soma" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soma.insert(n.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-08-18T03:36:00.601894Z", "iopub.status.busy": "2025-08-18T03:36:00.601216Z", "iopub.status.idle": "2025-08-18T03:36:00.604894Z", "shell.execute_reply": "2025-08-18T03:36:00.604587Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "type(soma) = \n", "type(soma(0.5)) = \n" ] } ], "source": [ "print(f\"type(soma) = {type(soma)}\")\n", "print(f\"type(soma(0.5)) = {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-08-18T03:36:00.607007Z", "iopub.status.busy": "2025-08-18T03:36:00.606296Z", "iopub.status.idle": "2025-08-18T03:36:00.609943Z", "shell.execute_reply": "2025-08-18T03:36:00.609624Z" } }, "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', 'il', 'is_ion', 'm', 'n', 'name', 'rates', 'segment', 'vtrap']\n" ] } ], "source": [ "mech = soma(0.5).hh\n", "print(dir(mech))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2025-08-18T03:36:00.611996Z", "iopub.status.busy": "2025-08-18T03:36:00.611253Z", "iopub.status.idle": "2025-08-18T03:36:00.614874Z", "shell.execute_reply": "2025-08-18T03:36:00.614553Z" } }, "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-08-18T03:36:00.616883Z", "iopub.status.busy": "2025-08-18T03:36:00.616238Z", "iopub.status.idle": "2025-08-18T03:36:00.619170Z", "shell.execute_reply": "2025-08-18T03:36:00.618841Z" } }, "outputs": [], "source": [ "iclamp = n.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-08-18T03:36:00.621226Z", "iopub.status.busy": "2025-08-18T03:36:00.620505Z", "iopub.status.idle": "2025-08-18T03:36:00.624254Z", "shell.execute_reply": "2025-08-18T03:36:00.623929Z" } }, "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-08-18T03:36:00.626328Z", "iopub.status.busy": "2025-08-18T03:36:00.625607Z", "iopub.status.idle": "2025-08-18T03:36:00.628487Z", "shell.execute_reply": "2025-08-18T03:36:00.628162Z" } }, "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-08-18T03:36:00.629960Z", "iopub.status.busy": "2025-08-18T03:36:00.629828Z", "iopub.status.idle": "2025-08-18T03:36:00.634708Z", "shell.execute_reply": "2025-08-18T03:36:00.634388Z" } }, "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", " '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_0x59fadddf9cf0',\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 (n.Vector object). For now, we will record the membrane potential, which is soma(0.5).v and the corresponding time points (n.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-08-18T03:36:00.636840Z", "iopub.status.busy": "2025-08-18T03:36:00.636103Z", "iopub.status.idle": "2025-08-18T03:36:00.639105Z", "shell.execute_reply": "2025-08-18T03:36:00.638799Z" } }, "outputs": [], "source": [ "v = n.Vector().record(soma(0.5)._ref_v) # Membrane potential vector\n", "t = n.Vector().record(n._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-08-18T03:36:00.640665Z", "iopub.status.busy": "2025-08-18T03:36:00.640528Z", "iopub.status.idle": "2025-08-18T03:36:00.652853Z", "shell.execute_reply": "2025-08-18T03:36:00.652055Z" } }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n.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-08-18T03:36:00.655891Z", "iopub.status.busy": "2025-08-18T03:36:00.655633Z", "iopub.status.idle": "2025-08-18T03:36:00.664662Z", "shell.execute_reply": "2025-08-18T03:36:00.662010Z" } }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n.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-08-18T03:36:00.666486Z", "iopub.status.busy": "2025-08-18T03:36:00.666066Z", "iopub.status.idle": "2025-08-18T03:36:00.680897Z", "shell.execute_reply": "2025-08-18T03:36:00.680558Z" } }, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n.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-08-18T03:36:00.683235Z", "iopub.status.busy": "2025-08-18T03:36:00.682548Z", "iopub.status.idle": "2025-08-18T03:36:01.206750Z", "shell.execute_reply": "2025-08-18T03:36:01.206345Z" } }, "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(\"d7eaa304-db42-46cf-8218-294c42221d59\");\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.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.2.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(\"d7eaa304-db42-46cf-8218-294c42221d59\")).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(\"d7eaa304-db42-46cf-8218-294c42221d59\");\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.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.2.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(\"d7eaa304-db42-46cf-8218-294c42221d59\")).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-08-18T03:36:01.214537Z", "iopub.status.busy": "2025-08-18T03:36:01.211420Z", "iopub.status.idle": "2025-08-18T03:36:01.671575Z", "shell.execute_reply": "2025-08-18T03:36:01.671156Z" } }, "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 = {\"60d22d04-a781-4122-a05a-17bb034e79c2\":{\"version\":\"3.7.2\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1002\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1003\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1010\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1011\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1008\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1041\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1035\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1036\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1037\"},\"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.9985207095132,-64.99779768226396,-64.99708468737194,-64.9963810528078,-64.99568618464123,-64.99499955829286,-64.99432071076043,-64.99364923370976,-64.99298476733401,-64.99232699489554,-64.99167563787408,-64.99103045165381,-64.99039122168917,-64.98975776009632,-64.9891299026229,-64.98850750595395,-64.98789044531675,-64.98727861235145,-64.98667191321786,-64.98607026691244,-64.98547360377184,-64.98488186414271,-64.98429499719907,-64.98371295989108,-64.98313571601047,-64.98256323535989,-64.98199549301468,-64.9814324686666,-64.98087414604076,-64.98032051237747,-64.9797715579718,-64.97922727576466,-64.97868766097943,-64.9781527107994,-64.97762242408126,-64.97709680110077,-64.9765758433271,-64.97605955322251,-64.97554793406478,-64.97504098978966,-64.97453872485134,-64.97404114409876,-64.97354825266615,-64.97306005587613,-64.9725765591541,-64.97209776795255,-64.97162368768419,-64.97115432366313,-64.97068968105297,-64.97022976482118,-64.96977457969902,-64.96932413014642,-64.96887842032129,-64.96843745405272,-64.96800123481766,-64.96756976572075,-64.96714304947682,-64.96672108839593,-64.96630388437062,-64.96589143886499,-64.96548375290563,-64.965080827074,-64.96468266150032,-64.96428925585846,-64.96390060936216,-64.96351672076206,-64.96313758834367,-64.96276320992605,-64.96239358286122,-64.9620287040342,-64.96166856986348,-64.96131317630213,-64.96096251883924,-64.96061659250175,-64.96027539185667,-64.95993891101354,-64.95960714362721,-64.95928008290086,-64.95895772158921,-63.19798736332058,-61.464694870907095,-59.75703419122009,-58.072839823716905,-58.16964490045525,-58.256841253276605,-58.33448369938544,-58.40276685030286,-58.461995448309736,-58.51255673329868,-58.554895785659305,-58.58949429402358,-58.6168528434295,-58.63747658275901,-58.651863984674115,-58.66049833391822,-58.663841551377466,-58.662329965945226,-58.65637167172371,-58.646345145266494,-58.6325988398746,-58.61545151697651,-58.59519311553911,-58.57208599765895,-58.54636644120206,-58.51824627839595,-58.48791460278973,-58.45553948635593,-58.42126966418342,-58.38523615670997,-58.34755380925979,-58.30832273624249,-58.267629663143644,-58.22554916374556,-58.18214479315957,-58.137470119478,-58.09156965836922,-58.04447971590917,-57.996229145500884,-57.9468381282237,-57.89629770551442,-57.844594382125436,-57.79171039266528,-57.73762392548039,-57.68230930762112,-57.6257371542461,-57.567874485451654,-57.5086848131674,-57.448128200438006,-57.38616129511288,-57.32273733969024,-57.257806158808805,-57.19131412564696,-57.12320410827557,-57.05341539681358,-56.98188361205518,-56.90852995441411,-56.83323971791679,-56.75589560130674,-56.67637707134254,-56.59455974168567,-56.51031476089089,-56.4235082035221,-56.33400045883448,-56.241645611805055,-56.14629081156851,-56.04777562253616,-55.94593135365083,-55.840544210746835,-55.731358061264366,-55.6181071136663,-55.50051422367577,-55.37828919013486,-55.25112702348323,-55.11870617095232,-54.98068668350593,-54.83669395590341,-54.6862380120864,-54.52880404426421,-54.363848522667176,-54.19079519843168,-54.009030963117496,-53.817901531957865,-53.6165566052332,-53.404084018948886,-53.179509612720864,-52.94178886552196,-52.68974665522115,-52.42194614486445,-52.13684143677896,-51.83276226640581,-51.507739091999525,-51.159493086398996,-50.78554649434564,-50.38298109346153,-49.948430415809796,-49.478151941088626,-48.967592929291406,-48.411702540818425,-47.80433276279685,-47.138457968590004,-46.405762976933595,-45.59632522780673,-44.69843533442472,-43.69813590810823,-42.57869325256925,-41.319994611579325,-39.89786474247446,-38.2832383416681,-36.441117400200156,-34.329762209218025,-31.899914597783116,-29.094597094361383,-25.850268197824974,-22.100497998728965,-17.783946791560687,-12.859555244273132,-7.330228042093876,-1.274379024980358,5.125813992509587,11.578465804782383,17.71926045063585,23.19225372324022,27.7397499683089,31.255374578797714,33.778022496850895,35.44261319736576,36.421344212124254,36.87998867231176,36.955888792538275,36.75275423999627,36.3444809935877,35.78201535680881,35.10004834305736,34.322344561756964,33.46555776808736,32.541783394147835,31.560208089972857,30.52814656340785,29.45168288970325,28.336063606645777,27.18593778520864,26.005503820380824,24.798599800528297,23.568767329118856,22.31927891046976,21.053162105631902,19.77321697908417,18.482032307221534,17.181993602378746,15.875292775111943,14.563935269904087,13.249747417964503,11.934392621395885,10.619374935551912,9.306034500280424,7.995581730365751,6.689101292271134,5.387518606690637,4.091664498495737,2.8022747118951497,1.519951488098684,0.24520676409339148,-1.0215109671920697,-2.2798258859227287,-3.529502193512476,-4.770332155699103,-6.002148036954923,-7.224828526056969,-8.43840301518397,-9.642903499198402,-10.838383258195297,-12.024927693745852,-13.20267685658381,-14.371910395178089,-15.532905752909878,-16.685961919809234,-17.831415461246113,-18.969652363838446,-20.101117804569533,-21.226417640074747,-22.346222067763293,-23.461251996338085,-24.5723032455902,-25.68026559306495,-26.786138846993634,-27.89104717402241,-28.996252318204768,-30.103165968200905,-31.213469731971664,-32.32897811820214,-33.45165882817509,-34.583650541150455,-35.727273483343154,-36.88503336506792,-38.05961834028547,-39.25392290914803,-40.47103586690234,-41.71410614446727,-42.98630567905948,-44.29076532470311,-45.63043135711528,-47.00792194326907,-48.42536093605243,-49.883859323339436,-51.38354130572999,-52.92276700047941,-54.49809635015044,-56.103325017021824,-57.72966433834327,-59.364922769937074,-60.993817638398916,-62.598417678688044,-64.15832199517473,-65.65262831832841,-67.06106512145502,-68.36606377024914,-69.55399338286647,-70.61655450755214,-71.55106012085174,-72.36008041492971,-73.05053196765671,-73.63243386929189,-74.11755204596177,-74.518320330378,-74.84690283574959,-75.11462964443167,-75.33164476004093,-75.50677805959572,-75.64755637549435,-75.76029108024632,-75.8502102439688,-75.92160595287035,-75.97797912687857,-76.02217235937576,-76.05648653941188,-76.08278057010453,-76.10255475782935,-76.11701952470165,-76.12715156872147,-76.13373943751407,-76.13742032949459,-76.13870971361321,-76.13802511993005,-76.1357052263362,-76.13202516455814,-76.12720879525833,-76.12143855709888,-76.11486337542485,-76.10760501929242,-76.09976321737317,-76.09141978052672,-76.08264192868216,-76.07348497967244,-76.06399452581545,-76.05420819869006,-76.0441571023898,-76.03386697948905,-76.02335916117966,-76.01265134285383,-76.0017582182886,-75.99069199910267,-75.97946283291091,-75.96807916286038,-75.9565480174786,-75.94487524790952,-75.93306572393841,-75.92112349623744,-75.9090519308783,-75.89685382103852,-75.88453147992233,-75.87208681818332,-75.85952140853976,-75.84683653978979,-75.83403326203907,-75.8211124246321,-75.80807470801604,-75.79492065055078,-75.78165067110346,-75.76826508812114,-75.75476413575649,-75.74114797752439,-75.72741671788614,-75.71357041209212,-75.69960907455858,-75.68553268600878,-75.67134119957139,-75.65703454599695,-75.64261263812833,-75.62807537473824,-75.61342264382982,-75.59865432548044,-75.58377029429687,-75.56877042153899,-75.55365457696044,-75.53842263040738,-75.52307445321,-75.50760991939632,-75.49202890675339,-75.47633129775718,-75.46051698038933,-75.44458584885616,-75.42853780422341,-75.41237275497767,-75.39609061752445,-75.37969131663105,-75.36317478582129,-75.34654096772822,-75.32978981441018,-75.31292128763445,-75.2959353591326,-75.27883201083074,-75.26161123505761,-75.24427303473297,-75.22681742353842,-75.2092444260726,-75.19155407799225,-75.17374642614058,-75.1558215286642,-75.13777945511956,-75.11962028656988,-75.10134411567343,-75.08295104676355,-75.06444119592149,-75.0458146910421,-75.02707167189315,-75.00821229016859,-74.98923670953599,-74.97014508098903,-74.9509375546967,-74.9316143028257,-74.91217551767392,-74.89262141013847,-74.87295220845911,-74.85316815718794,-74.83326951634525,-74.81325656072814,-74.79312957934431,-74.77288887494865,-74.75253476366353,-74.73206757466761,-74.71148764994012,-74.69079534405026,-74.66999102398283,-74.64907506899301,-74.62804787048427,-74.6069098319045,-74.58566136865653,-74.56430290801939,-74.5428348890779,-74.52125776265822,-74.49957199126762,-74.47777804903674,-74.45587642166358,-74.43386760635775,-74.41175211178462,-74.38953045800844,-74.36720317643399,-74.34477080974655,-74.32223391184964,-74.29959304780036,-74.27684879374229,-74.25400173683562,-74.23105247518451,-74.20800161776172,-74.18484978433023,-74.16159760536205,-74.13824572195425,-74.11479478574198,-74.09124545880873,-74.06759841359386,-74.0438543327973,-74.02001390928163,-73.99607784597151,-73.9720468391244,-73.947921512368,-73.92370251974172,-73.8993905420772,-73.87498628394833,-73.85049047109776,-73.82590384826193,-73.80122717733012,-73.77646123578323,-73.75160681536701,-73.72666472096189,-73.7016357696175,-73.67652078972523,-73.65132062030656,-73.62603611039806,-73.60066811851755,-73.57521751219802,-73.5496851675781,-73.52407196903984,-73.49837880888572,-73.47260658704855,-73.44675621082844,-73.42082859465236,-73.39482465985229,-73.36874533445867,-73.34259155300653,-73.31636425635187,-73.2900643914965,-73.26369291141955,-73.23725077491464,-73.21073894643125,-73.1841583959197,-73.15751009867878,-73.13079503520552,-73.10401419104652,-73.07716855665052,-73.05025912722186,-73.02328690257448,-72.99625288698644,-72.96915806295931,-72.94200325794415,-72.91478933659204,-72.88751719542203,-72.86018775828158,-72.83280197247647,-72.80536080546727,-72.77786524204564,-72.75031628191742,-72.72271493763091,-72.69506223279815,-72.66735920056524,-72.63960688229426,-72.61180632642505,-72.58395858749022,-72.55606472526017,-72.5281258039992,-72.50014289181573,-72.47211706009296,-72.44404938298797,-72.41594093698896,-72.38779280052216,-72.35960605360101,-72.33138177751134,-72.30312105452718,-72.27482496765285,-72.24649460038725,-72.21813103650727,-72.18973535986734,-72.16130865421296,-72.13285200300611,-72.10436648926074,-72.0758531953871,-72.04731320304346,-72.01874759299442,-71.99015744497468,-71.96154373169279,-71.93290723807073,-71.90424879437906,-71.87556926929162,-71.84686956392953,-71.81815060674852,-71.78941334914602,-71.76065876168339,-71.7318878308344,-71.70310155618436,-71.67430094801563,-71.64548702522417,-71.6166608135207,-71.58782334387587,-71.55897565117534,-71.53011877305516,-71.50125374889234,-71.47238161892882,-71.44350342351039,-71.4146202024245,-71.38573299432319,-71.35684283621957,-71.32795076304748,-71.29905780727576,-71.27016499856951,-71.24127336349213,-71.21238392524222,-71.18349770342095,-71.15461571382556,-71.12573896826545,-71.09686847439798,-71.06800523558118,-71.03915025074126,-71.0103045142528,-70.9814690158302,-70.95264444447851,-70.92383136181367,-70.89503038583418,-70.86624218243264,-70.83746745806738,-70.80870695343069,-70.77996143797479,-70.7512317051764,-70.72251856843826,-70.69382285754054,-70.66514541556704,-70.63648709624208,-70.60784876162242,-70.57923128009674,-70.55063552465116,-70.52206237136556,-70.49351269810975,-70.46498738341303,-70.43648730548415,-70.4080133413617,-70.37956636617781,-70.35114725252019,-70.3227568698795,-70.29439608417091,-70.26606575732018,-70.23776674690562,-70.2094999058488,-70.18126608214754,-70.15306611864574,-70.12490085283513,-70.09677111668492,-70.06867773649564,-70.04062153277405,-70.01260332012643,-69.98462390716777,-69.95668374277727,-69.92878302642522,-69.90092203277067,-69.87310110106151,-69.84532062592416,-69.81758104935552,-69.7898828537565,-69.76222655586876,-69.7346127014959,-69.70704186090582,-69.67951462482587,-69.65203160095366,-69.62459341091699,-69.59720068762499,-69.56985407296042,-69.54255421576943,-69.51530177011071,-69.48809739373135,-69.46094174674019,-69.433835490454,-69.40677928639434,-69.37977379541624,-69.35281967695192,-69.32591758835515,-69.29906818433345,-69.27227211645717,-69.24553003273567,-69.21884257725223,-69.19221038985022,-69.16563410586413,-69.13911435588976,-69.11265176558864,-69.08624695552233,-69.05990054101288,-69.03361313202612,-69.00738533307472,-68.9812177431388,-68.95511034512178,-68.92906295395399,-68.9030754786573,-68.87714791001372,-68.85128030978072,-68.82547280125412,-68.7997255610061,-68.77403881164926,-68.74841281549722,-68.72284786900921,-68.69734429792078,-68.67190245297519,-68.64652270618134,-68.62120544753296,-68.59595108213247,-68.57076002766988,-68.54563271221303,-68.52056957227155,-68.49557105110065,-68.47063759721603,-68.44576966309384,-68.42096770403354,-68.39623217716363,-68.37156354057305,-68.34696225255306,-68.322428770936,-68.29796355251952,-68.27356705256553,-68.24923972436508,-68.22498201886111,-68.20079438432191,-68.17667726605926,-68.15263110618572,-68.12865634340633,-68.10475341284041,-68.0809227458699,-68.0571647700108,-68.03347990880505,-68.00986858173005,-67.98633120412383,-67.96286757075356,-67.93947710236137,-67.91615933734721,-67.89291391734908,-67.86974057455767,-67.84663912055157,-67.82360943646614,-67.8006514643337,-67.77776519945294,-67.75495068366344,-67.73220799941645,-67.70953726454688,-67.68693862766283,-67.66441226407919,-67.64195837223103,-67.61957717050994,-67.59726889447347,-67.57503379438378,-67.55287213303681,-67.53078418384791,-67.50877022916374,-67.48683055877419,-67.46496546860064,-67.44317525954021,-67.4214602364476,-67.39982070723846,-67.37825698210018,-67.35676937279747,-67.33535819206165,-67.3140237530539,-67.29276636889384,-67.2715863522456,-67.25048401495492,-67.22945966773098,-67.20851361986794,-67.18764617900136,-67.1668576508954,-67.14614833925712,-67.12551854557478,-67.104968568977,-67.08449870611062,-67.06410925103465,-67.04380049512862,-67.02357272701343,-67.00342623248315,-66.98336129444651,-66.96337716499127,-66.94347300451983,-66.92364810465634,-66.90390187296038,-66.88423381940852,-66.86464354443437,-66.84513072834352,-66.82569512194237,-66.8063365382393,-66.78705484509334,-66.7678499587011,-66.74872183782479,-66.72967047867627,-66.71069591038193,-66.69179819096172,-66.67297740376371,-66.65423365430215,-66.63556706745311,-66.6169777849671,-66.59846596326254,-66.58003177146828,-66.56167538968703,-66.54339700745444,-66.525196822372,-66.50707503889372,-66.48903186724954,-66.47106752248976,-66.4531822236369,-66.4353761929328,-66.41764965517022,-66.40000283709938,-66.3824359669008,-66.36494927371716,-66.3475429872373,-66.3302173373265,-66.31297255369773,-66.29580886561926,-66.2787265016545,-66.2617256894302,-66.24480665543,-66.22796962481024,-66.21121482123557,-66.1945424667319,-66.17795278155494,-66.16144598407222,-66.14502229065722,-66.1286819155941,-66.11242507099172,-66.09625196670598,-66.0801628102693,-66.06415780682654,-66.04823715907648,-66.0324010672181,-66.0166497289013,-66.00098333918122,-65.98540209047584,-65.9699049545743,-65.95449096223622,-65.9391592787575,-65.92390918877717,-65.90874008278605,-65.89365144514281,-65.87864284342601,-65.86371391897075,-65.848864378456,-65.83409398642435,-65.81940255862943,-65.8047899561182,-65.79025607996596,-65.77580086659121,-65.76142428358575,-65.74712632600263,-65.73290701305116,-65.71876638515376,-65.70470450132449,-65.6907214368337,-65.67681728112709,-65.66299213597101,-65.64924611379905,-65.6355793362377,-65.62199193279112,-65.60848403966776,-65.5950557987329,-65.58170735657335,-65.56843886366188,-65.55525047361047,-65.54214234250242,-65.52911462829476,-65.51616749028315,-65.50330108862237,-65.4905155838962,-65.47781113673146,-65.46518790745098,-65.45264605576152,-65.44018574047256,-65.42780711924271,-65.41551034835054,-65.40329558248716,-65.39116297456825,-65.37911267556319,-65.36714483433961,-65.35525959752144,-65.34345710935908,-65.33173751161038,-65.32010094343109,-65.30854754127377,-65.2970774387944,-65.28569076676554,-65.2743876529955,-65.26316822225284,-65.25203259619553,-65.24098089330431,-65.23001322881979,-65.21912971468286,-65.20833045947808,-65.19761556837958,-65.18698514309946,-65.17643928183821,-65.165978079237,-65.15560162633159,-65.14531001050791,-65.13510331545882,-65.12498162114214,-65.11494500373983,-65.10499353561814,-65.09512728528861,-65.08534631737005,-65.07565069255112,-65.06604046755375,-65.05651569509715,-65.04707642386248,-65.03772269845807,-65.02845455938524,-65.01927204300459,-65.01017518150289,-65.00116400286036,-64.99223853081857,-64.98339792197886,-64.97464130450496,-64.96596791064427,-64.95737706491738,-64.94886817360249,-64.94044071537091,-64.93209423294628,-64.92382832567426,-64.91564264290226,-64.90753687808002,-64.89951076350177,-64.89156406561925,-64.88369658086337,-64.8759081319184,-64.86819856439926,-64.86056774388794,-64.85301555328954,-64.84554189047327,-64.8381466661672,-64.83082980207905,-64.82359122921847,-64.81643088639882,-64.809348718899,-64.80234467726777,-64.79541871625518,-64.78857079385743,-64.7818008704625,-64.77510890808607,-64.76849486968759,-64.76195871855806,-64.75550041777163,-64.74911992969426,-64.74281721554316,-64.73659223499166,-64.73044494581464,-64.72437530357,-64.71838326131254,-64.7124687693367,-64.70663177494507,-64.70087222223997,-64.69519005193568,-64.68958520118916,-64.68405760344723,-64.67860718830867,-64.67323388139961,-64.66793760426073,-64.66271827424536,-64.65757580442711,-64.6525101035162,-64.64752107578369,-64.64260862099265,-64.63777263433587,-64.63301300637934,-64.62832962301088,-64.62372236539369,-64.61919110992419,-64.61473572819392,-64.61035608695504,-64.6060520480892,-64.60182346857957,-64.59767020048568,-64.59359209092096,-64.58958898203274,-64.58566071098457,-64.58180710994078,-64.57802800605302,-64.57432322144874,-64.57069257322158,-64.56713587342342,-64.56365292905824,-64.56024354207739,-64.55690750937664,-64.55364462279455,-64.55045466911236,-64.54733743005531,-64.54429268229528,-64.54132019745482,-64.53841974211248,-64.5355910778094,-64.53283396105721,-64.53014814334718,-64.52753337116059,-64.52498938598029,-64.52251592430356,-64.52011271765606,-64.51777949260702,-64.5155159707856,-64.51332186889843,-64.51119689874828,-64.50914076725394,-64.50715317647116,-64.50523382361484,-64.50338240108228,-64.50159859647756,-64.49988209263715,-64.49823256765647,-64.49664969491774,-64.49513314311879,-64.49368257630314,-64.49229765389101,-64.49097803071156,-64.48972335703613,-64.4885332786126,-64.48740743670088,-64.48634546810933,-64.48534700523243,-64.48441167608931,-64.48353910436353,-64.48272890944372,-64.48198070646538,-64.48129410635363,-64.48066871586704,-64.4801041376424,-64.47959997024054,-64.4791558081931,-64.47877124205031,-64.47844585842972,-64.47817924006586,-64.47797096586088,-64.47782061093612,-64.47772774668458,-64.47769194082429,-64.47771275745257,-64.47778975710122,-64.47792249679252,-64.47811053009606,-64.4783534071865,-64.47865067490206,-64.47900187680382,-64.4794065532359,-64.47986424138631,-64.48037447534855,-64.48093678618409,-64.48155070198537,-64.4822157479397,-64.48293144639369,-64.48369731691842,-64.48451287637528,-64.48537763898237,-64.48629111638162,-64.48725281770638,-64.48826224964964,-64.48931891653281,-64.49042232037506,-64.49157196096309,-64.49276733592143,-64.49400794078328,-64.49529326906168,-64.49662281232118,-64.49799606024995,-64.49941250073216,-64.50087161992086,-64.50237290231108,-64.50391583081337,-64.50549988682751,-64.50712455031663,-64.50878929988147,-64.51049361283494,-64.51223696527684,-64.51401883216884,-64.51583868740956,-64.51769600390976,-64.5195902536678,-64.52152090784499,-64.52348743684117,-64.52548931037029,-64.52752599753602,-64.52959696690733,-64.53170168659412,-64.53383962432274,-64.53601024751151,-64.53821302334615,-64.540447418855,-64.54271290098428,-64.5450089366731,-64.54733499292826,-64.54969053689891,-64.55207503595105,-64.55448795774167,-64.55692877029271,-64.55939694206474,-64.56189194203026,-64.56441323974678,-64.56696030542956,-64.56953261002381,-64.57212962527676,-64.57475082380914,-64.57739567918631,-64.58006366598893,-64.58275425988322,-64.58546693769061,-64.58820117745707,-64.59095645852173,-64.59373226158516,-64.59652806877692,-64.59934336372265,-64.60217763161056,-64.60503035925723,-64.60790103517293,-64.61078914962616,-64.61369419470765,-64.6166156643936,-64.61955305460835,-64.62250586328618,-64.62547359043258,-64.6284557381847,-64.63145181087103,-64.63446131507041,-64.6374837596702,-64.64051865592374,-64.64356551750694,-64.64662386057414,-64.64969320381307,-64.65277306849912,-64.65586297854863,-64.6589624605714,-64.6620710439224,-64.66518826075246,-64.66831364605827,-64.67144673773137,-64.6745870766063,-64.67773420650784,-64.68088767429734,-64.68404702991816,-64.68721182644018,-64.69038162010334,-64.69355597036035,-64.69673443991839,-64.69991659477985,-64.70310200428221,-64.7062902411369,-64.7094808814672,-64.7126735048453,-64.71586769432822,-64.71906303649295,-64.72225912147047,-64.72545554297892,-64.72865189835576,-64.73184778858895,-64.73504281834718,-64.73823659600916,-64.74142873369188,-64.74461884727792,-64.74780655644187,-64.7509914846757,-64.75417325931313,-64.75735151155321,-64.76052587648276,-64.76369599309794,-64.76686150432486,-64.77002205703924,-64.7731773020851,-64.77632689429255,-64.7794704924946,-64.78260775954301,-64.78573836232336,-64.788861971769,-64.79197826287418,-64.7950869147063,-64.7981876104172,-64.80128003725353,-64.80436388656629,-64.80743885381943,-64.8105046385976,-64.81356094461302,-64.81660747971144,-64.81964395587734,-64.8226700892382,-64.8256856000679,-64.8286902127894,-64.83168365597648,-64.83466566235472,-64.8376359688017,-64.8405943163463,-64.8435404501673,-64.84647411959116,-64.84939507808907,-64.85230308327317,-64.85519789689207,-64.85807928482556,-64.86094701707876,-64.86380086777527,-64.86664061514989,-64.86946604154046,-64.87227693337907,-64.87507308118255,-64.87785427954236,-64.88062032711379,-64.88337102660444,-64.88610618476218,-64.88882561236242,-64.89152912419476,-64.89421653904904,-64.89688767970082,-64.89954237289628,-64.90218044933646,-64.90480174366108,-64.90740609443172,-64.90999334411448,-64.9125633390621,-64.91511592949563,-64.91765096948546,-64.92016831693208,-64.92266783354607,-64.92514938482789,-64.92761284004705,-64.93005807222086,-64.9324849580928,-64.9348933781104,-64.93728321640273,-64.93965436075752,-64.94200670259778,-64.9443401369582,-64.94665456246106,-64.9489498812918,-64.95122599917426,-64.95348282534557,-64.9557202725308,-64.95793825691707,-64.96013669812764,-64.96231551919546,-64.96447464653659,-64.96661400992329,-64.96873354245683,-64.97083318054007,-64.97291286384979,-64.9749725353088,-64.97701214105777,-64.97903163042695,-64.98103095590753,-64.98301007312298,-64.98496894080007,-64.98690752073978,-64.98882577778801,-64.99072367980615,-64.99260119764152,-64.99445830509761,-64.99629497890423,-64.99811119868755,-64.99990694694,-65.00168220899003,-65.00343678555087,-65.00517049426378,-65.00688317854359,-65.00857470499507,-65.01024496111023,-65.0118938532154,-65.01352130464055,-65.0151272540865,-65.01671165416796,-65.01827447011323,-65.01981567860311,-65.0213352667339,-65.02283323109057,-65.02430957691828,-65.02576431738112,-65.02719747289872,-65.02860907055205,-65.02999914355081,-65.03136773075569,-65.03271487624949,-65.03404062895163,-65.03534504227143,-65.03662817379583,-65.03789008500785,-65.03913084103226,-65.04035051040582,-65.04154916486894,-65.04272687917693,-65.04388373092829,-65.04501980040847,-65.04613517044726,-65.0472299262884,-65.04830415547009,-65.04935794771527,-65.05039139483041,-65.05140459061231,-65.05239763076155,-65.05337061280231,-65.0543236360077,-65.0552568013299,-65.056170211335,-65.05706397014151,-65.0579381833627,-65.05879295805194,-65.0596284026511,-65.06044462694139,-65.06124174199657,-65.06201986013835,-65.06277909489359,-65.06351956095324,-65.06424137413292,-65.06494465133481,-65.06562951051092,-65.06629607062746,-65.06694445163036,-65.06757477441174,-65.06818716077728,-65.06878173341447,-65.06935861586157,-65.06991793247738,-65.07045980841157,-65.0709843695757,-65.07149174261482,-65.07198205487965,-65.07245543439916,-65.07291200985375,-65.0733519105489,-65.07377526638915,-65.07418220785264,-65.07457286596598,-65.07494737227942,-65.07530585884264,-65.07564845818062,-65.07597530327008,-65.07628652751609,-65.07658226472914,-65.07686264910247,-65.07712781518968,-65.07737789788277,-65.07761303239027,-65.07783335421594,-65.07803899913748,-65.07823010318572,-65.07840680262404,-65.07856923392802,-65.07871753376538,-65.07885183897626,-65.07897228655365,-65.07907901362418,-65.07917215742911,-65.07925185530561,-65.0793182446683,-65.07937146299099,-65.07941164778875,-65.07943893660013,-65.07945346696974,-65.07945537643099,-65.07944480248906,-65.07942188260424,-65.0793867541753,-65.0793395545233,-65.07928042087549,-65.07920949034953,-65.07912689993789,-65.07903278649252,-65.0789272867097,-65.07881053711515,-65.07868267404933,-65.07854383365306,-65.07839415185319,-65.07823376434865,-65.07806280659666,-65.0778814137991,-65.07768972088918,-65.07748786251825,-65.07727597304293,-65.07705418651229,-65.07682263665535,-65.07658145686882,-65.07633078020488,-65.07607073935934,-65.07580146665988,-65.0755230940546,-65.07523575310063,-65.07493957495305,-65.07463469035396,-65.07432122962173,-65.07399932264049,-65.07366909884973,-65.0733306872342,-65.07298421631388,-65.07262981413422,-65.07226760825648,-65.07189772574837,-65.07152029317476,-65.07113543658859,-65.07074328152207,-65.07034395297785,-65.06993757542054,-65.06952427276833,-65.06910416838478,-65.0686773850708,-65.06824404505677,-65.06780426999487,-65.06735818095149,-65.06690589839992,-65.06644754221314,-65.06598323165669,-65.06551308538188,-65.06503722141899,-65.06455575717072,-65.06406880940575,-65.06357649425247,-65.06307892719286,-65.06257622305652,-65.06206849601483,-65.0615558595753,-65.06103842657598,-65.06051630918016,-65.05998961887101,-65.0594584664466,-65.05892296201479,-65.05838321498851,-65.05783933408101,-65.05729142730135,-65.0567396019499,-65.05618396461412,-65.05562462116437,-65.05506167674984,-65.05449523579472,-65.05392540199435,-65.05335227831162,-65.05277596697344,-65.05219656946728,-65.05161418653795,-65.0510289181844,-65.0504408636567,-65.0498501214531,-65.04925678931724,-65.04866096423541,-65.04806274243401,-65.0474622193771,-65.04685948976397,-65.04625464752701,-65.04564778582943,-65.04503899706336,-65.04442837284785,-65.0438160040271,-65.04320198066873,-65.04258639206216,-65.04196932671712,-65.04135087236226,-65.04073111594379,-65.04011014362432,-65.03948804078176,-65.03886489200829,-65.03824078110941,-65.03761579110316,-65.0369900042194,-65.03636350189913,-65.03573636479396,-65.03510867276566,-65.03448050488579,-65.03385193943544,-65.03322305390496,-65.03259392499399,-65.03196462861128,-65.03133523987486,-65.03070583311218,-65.03007648186026,-65.02944725886607,-65.02881823608688,-65.02818948469074,-65.02756107505704,-65.02693307677707,-65.0263055586548,-65.02567858870756,-65.02505223416698,-65.02442656147983,-65.02380163630905,-65.0231775235348,-65.02255428725562,-65.02193199078957,-65.02131069667557,-65.0206904666747,-65.0200713617716,-65.01945344217597,-65.01883676732409,-65.0182213958804,-65.01760738573921,-65.0169947940264,-65.0163836771012,-65.01577409055805,-65.01516608922852,-65.01455972718324,-65.01395505773401,-65.01335213343577,-65.01275100608885,-65.01215172674108,-65.01155434569012,-65.01095891248568,-65.01036547593196,-65.00977408409005,-65.00918478428035,-65.00859762308511,-65.00801264635102,-65.0074298991918,-65.00684942599091,-65.00627127040418,-65.00569547536267,-65.00512208307539,-65.00455113503223,-65.00398267200683,-65.0034167340595,-65.00285336054024,-65.00229259009178,-65.00173446065264,-65.00117900946023,-65.00062627305402,-65.00007628727876,-64.99952908728768,-64.99898465513829,-64.99844297014911,-64.9979040176783,-64.99736778838816,-64.99683427759146,-64.99630348467022,-64.99577541255904,-64.99525006728594,-64.99472745756415,-64.99420759442943,-64.9936904909176,-64.99317616177825,-64.99266462322014,-64.9921558926852,-64.99164998864777,-64.99114693043623,-64.99064673807483,-64.99014943214308,-64.9896550336512,-64.98916356392944,-64.98867504453007,-64.98818949714051,-64.98770694350627,-64.98722740536283,-64.98675090437531,-64.98627746208514,-64.98580709986292,-64.98533983886689,-64.98487570000621,-64.98441470390874,-64.9839568708926,-64.98350222094132,-64.98305077368201,-64.98260254836627,-64.98215756385363,-64.98171583859707,-64.98127739063057,-64.98084223755835,-64.98041039654565,-64.9799818843109,-64.97955671711914,-64.97913491077644,-64.97871648062542,-64.97830144154156,-64.97788980793028,-64.97748159372476,-64.97707681238433,-64.97667547689342,-64.97627759976109,-64.97588319302083,-64.97549226823094,-64.97510483647507,-64.97472090836325,-64.97434049403314,-64.97396360315146,-64.97359024491575,-64.9732204280563,-64.9728541608382,-64.97249145106368,-64.97213230607449,-64.97177673275445,-64.97142473753213,-64.97107632638362,-64.97073150483538,-64.97039027796727,-64.9700526504155,-64.96971862637582,-64.96938820960669,-64.96906140343246,-64.96873821074674,-64.96841863401568,-64.9681026752814,-64.96779033616538,-64.96748161787197,-64.96717652119183,-64.9668750465055,-64.96657719378696,-64.96628296260717,-64.96599235213772,-64.96570536115445,-64.96542198804109,-64.96514223079292,-64.9648660870205,-64.96459355395328,-64.96432462844342,-64.96405930696943,-64.96379758563995,-64.96353946019752,-64.96328492602228,-64.96303397813578,-64.96278661120478,-64.96254281954495,-64.96230259712476,-64.96206593756924,-64.96183283416373,-64.96160327985778,-64.9613772672689,-64.96115478868639,-64.96093583607514,-64.96072040107951,-64.9605084750271,-64.96030004893257,-64.9600951135015,-64.95989365913418,-64.9596956759295,-64.95950115368868,-64.95931008191917,-64.95912244983845,-64.95893824637784,-64.95875746018633,-64.9585800796344,-64.95840609281784,-64.95823548756152,-64.95806825142326,-64.95790437169757,-64.9577438354195,-64.95758662936842,-64.95743274007178,-64.95728215380893,-64.95713485661487,-64.95699083428403,-64.95685007237404,-64.9567125562095,-64.95657827088567,-64.9564472012723,-64.95631933201729,-64.95619464755046,-64.95607313208725,-64.95595476963243,-64.9558395439838,-64.95572743873588,-64.95561843728358,-64.95551252282588,-64.95540967836952,-64.95530988673258,-64.95521313054816,-64.95511939226802,-64.95502865416614,-64.95494089834239]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1042\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1043\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1038\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1039\",\"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\":\"p1040\",\"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\":\"p1009\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1022\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1023\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1024\",\"attributes\":{\"dimensions\":\"both\",\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1025\",\"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\":\"p1031\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p1030\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1032\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1033\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1034\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1017\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1018\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1019\"},\"axis_label\":\"v (mV)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1020\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1012\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1013\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1014\"},\"axis_label\":\"t (ms)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1015\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1016\",\"attributes\":{\"axis\":{\"id\":\"p1012\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1021\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1017\"}}}]}}]}};\n", " const render_items = [{\"docid\":\"60d22d04-a781-4122-a05a-17bb034e79c2\",\"roots\":{\"p1001\":\"ea7b14ad-e452-4e34-8dec-d6898d399b20\"},\"root_ids\":[\"p1001\"]}];\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": "p1001" } }, "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-08-18T03:36:01.673303Z", "iopub.status.busy": "2025-08-18T03:36:01.673116Z", "iopub.status.idle": "2025-08-18T03:36:02.298519Z", "shell.execute_reply": "2025-08-18T03:36:02.296215Z" } }, "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-08-18T03:36:02.300853Z", "iopub.status.busy": "2025-08-18T03:36:02.300628Z", "iopub.status.idle": "2025-08-18T03:36:02.305534Z", "shell.execute_reply": "2025-08-18T03:36:02.305149Z" } }, "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-08-18T03:36:02.307721Z", "iopub.status.busy": "2025-08-18T03:36:02.307113Z", "iopub.status.idle": "2025-08-18T03:36:02.483489Z", "shell.execute_reply": "2025-08-18T03:36:02.483077Z" } }, "outputs": [ { "data": { "image/png": "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jbF///7QraWlJfScG264wTjppJOMVatWGR9++KFRWVlpVFZWWtjq3jvR+W3bts342c9+Znz44YfGjh07jNdee80YNWqUMXXqVItb3nsLFy401q5da+zYscP45JNPjIULFxo2m8148803DcNI7OtnGMc/v4Fw/bpz9Ew1K68hwSdOHnvsMeOkk04yHA6Hcc455xjr16+3ukmmuPLKK40hQ4YYDofDGDZsmHHllVca27Zts7pZUVm9erUh6ZjbddddZxhGYEr7T3/6U6OkpMRwOp3G9OnTja1bt1rb6D443vm1tLQYM2fONIqKioyUlBSjvLzcWLBgQUKF9O7OTZKxbNmy0HNaW1uN//t//6+Rl5dnpKenG9/85jeN/fv3W9foPjjR+e3evduYOnWqkZ+fbzidTmPMmDHG7bffbrhcLmsb3gff/e53jfLycsPhcBhFRUXG9OnTQ6HHMBL7+hnG8c9vIFy/7hwdfKy8hjbDMIzY9ysBAABYjxofAAAwaBB8AADAoEHwAQAAgwbBBwAADBoEHwAAMGgQfAAAwKBB8AEAAIMGwQcAAAwaBB8AA8bWrVtVWlqqpqammL3HVVddpV/96lcxe30AscXKzQD6tQsuuEBnnHGGfv3rX5/wuZdffrkmTZqkO++8M2bt2bx5s6ZOnaodO3YoJycnZu8DIDbo8QEwIOzevVsrVqzQvHnzYvo+p512mkaPHq3/+q//iun7AIgNgg+AfmvevHlau3atHnnkEdlsNtlsNu3cubPb5/7+97/XxIkTNWzYsNCx5cuXKzc3VytWrFBFRYXS09P1rW99Sy0tLXr22Wc1YsQI5eXl6aabbpLP5wv93OOPP66TTz5ZqampKikp0be+9a2w97rkkkv04osvxuScAcRWstUNAICePPLII/riiy902mmn6Wc/+5kkqaioqNvnvvPOO5o8efIxx1taWvToo4/qxRdfVFNTky6//HJ985vfVG5url5//XVt375dc+fO1Xnnnacrr7xSH374oW666SY999xz+trXvqbDhw/rnXfeCXvNc845R7/4xS/kdrvldDrNP3EAMUPwAdBv5eTkyOFwKD09XaWlpcd97q5du7oNPu3t7XriiSc0evRoSdK3vvUtPffcc6qtrVVmZqbGjRunCy+8UKtXr9aVV16p3bt3KyMjQxdffLGysrJUXl6uM888M+w1hw4dKo/Ho5qaGpWXl5t3wgBijqEuAANCa2urUlNTjzmenp4eCj2SVFJSohEjRigzMzPsWF1dnSTpn/7pn1ReXq5Ro0bp2muv1fPPP6+Wlpaw10xLS5OkY44D6P8IPgAGhMLCQtXX1x9zPCUlJey+zWbr9pjf75ckZWVl6aOPPtILL7ygIUOGaPHixZo4caIaGhpCzz98+LCknofdAPRfBB8A/ZrD4QgrPO7JmWeeqc8//9yU90xOTtaMGTN0//3365NPPtHOnTu1atWq0OObN2/W8OHDVVhYaMr7AYgfanwA9GsjRozQ+++/r507dyozM1P5+fmy24/9N9usWbP0ve99Tz6fT0lJSRG/34oVK7R9+3ZNnTpVeXl5ev311+X3+1VRURF6zjvvvKOZM2dG/B4ArEOPD4B+7cc//rGSkpI0btw4FRUVaffu3d0+76KLLlJycrLeeuutqN4vNzdXr7zyiqZNm6ZTTz1VTz75pF544QWNHz9ektTW1qY//vGPWrBgQVTvA8AarNwMYMBYunSp/ud//kd/+ctfYvYeTzzxhF599VW9+eabMXsPALHDUBeAAeP73/++Ghoa1NTUpKysrJi8R0pKih577LGYvDaA2KPHBwAADBrU+AAAgEGD4AMAAAYNgg8AABg0CD4AAGDQIPgAAIBBg+ADAAAGDYIPAAAYNAg+AABg0CD4AACAQeP/ASeFXCDSGyeYAAAAAElFTkSuQmCC", "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-08-18T03:36:02.487222Z", "iopub.status.busy": "2025-08-18T03:36:02.487062Z", "iopub.status.idle": "2025-08-18T03:36:02.489849Z", "shell.execute_reply": "2025-08-18T03:36:02.489484Z" } }, "outputs": [], "source": [ "import csv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Writing

" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "execution": { "iopub.execute_input": "2025-08-18T03:36:02.492708Z", "iopub.status.busy": "2025-08-18T03:36:02.492562Z", "iopub.status.idle": "2025-08-18T03:36:02.503543Z", "shell.execute_reply": "2025-08-18T03:36:02.503158Z" } }, "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-08-18T03:36:02.507502Z", "iopub.status.busy": "2025-08-18T03:36:02.505189Z", "iopub.status.idle": "2025-08-18T03:36:02.518292Z", "shell.execute_reply": "2025-08-18T03:36:02.517918Z" } }, "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-08-18T03:36:02.521706Z", "iopub.status.busy": "2025-08-18T03:36:02.521551Z", "iopub.status.idle": "2025-08-18T03:36:02.669152Z", "shell.execute_reply": "2025-08-18T03:36:02.668748Z" } }, "outputs": [ { "data": { "image/png": "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jbF///7QraWlJfScG264wTjppJOMVatWGR9++KFRWVlpVFZWWtjq3jvR+W3bts342c9+Znz44YfGjh07jNdee80YNWqUMXXqVItb3nsLFy401q5da+zYscP45JNPjIULFxo2m8148803DcNI7OtnGMc/v4Fw/bpz9Ew1K68hwSdOHnvsMeOkk04yHA6Hcc455xjr16+3ukmmuPLKK40hQ4YYDofDGDZsmHHllVca27Zts7pZUVm9erUh6ZjbddddZxhGYEr7T3/6U6OkpMRwOp3G9OnTja1bt1rb6D443vm1tLQYM2fONIqKioyUlBSjvLzcWLBgQUKF9O7OTZKxbNmy0HNaW1uN//t//6+Rl5dnpKenG9/85jeN/fv3W9foPjjR+e3evduYOnWqkZ+fbzidTmPMmDHG7bffbrhcLmsb3gff/e53jfLycsPhcBhFRUXG9OnTQ6HHMBL7+hnG8c9vIFy/7hwdfKy8hjbDMIzY9ysBAABYjxofAAAwaBB8AADAoEHwAQAAgwbBBwAADBoEHwAAMGgQfAAAwKBB8AEAAIMGwQcAAAwaBB8AA8bWrVtVWlqqpqammL3HVVddpV/96lcxe30AscXKzQD6tQsuuEBnnHGGfv3rX5/wuZdffrkmTZqkO++8M2bt2bx5s6ZOnaodO3YoJycnZu8DIDbo8QEwIOzevVsrVqzQvHnzYvo+p512mkaPHq3/+q//iun7AIgNgg+AfmvevHlau3atHnnkEdlsNtlsNu3cubPb5/7+97/XxIkTNWzYsNCx5cuXKzc3VytWrFBFRYXS09P1rW99Sy0tLXr22Wc1YsQI5eXl6aabbpLP5wv93OOPP66TTz5ZqampKikp0be+9a2w97rkkkv04osvxuScAcRWstUNAICePPLII/riiy902mmn6Wc/+5kkqaioqNvnvvPOO5o8efIxx1taWvToo4/qxRdfVFNTky6//HJ985vfVG5url5//XVt375dc+fO1Xnnnacrr7xSH374oW666SY999xz+trXvqbDhw/rnXfeCXvNc845R7/4xS/kdrvldDrNP3EAMUPwAdBv5eTkyOFwKD09XaWlpcd97q5du7oNPu3t7XriiSc0evRoSdK3vvUtPffcc6qtrVVmZqbGjRunCy+8UKtXr9aVV16p3bt3KyMjQxdffLGysrJUXl6uM888M+w1hw4dKo/Ho5qaGpWXl5t3wgBijqEuAANCa2urUlNTjzmenp4eCj2SVFJSohEjRigzMzPsWF1dnSTpn/7pn1ReXq5Ro0bp2muv1fPPP6+Wlpaw10xLS5OkY44D6P8IPgAGhMLCQtXX1x9zPCUlJey+zWbr9pjf75ckZWVl6aOPPtILL7ygIUOGaPHixZo4caIaGhpCzz98+LCknofdAPRfBB8A/ZrD4QgrPO7JmWeeqc8//9yU90xOTtaMGTN0//3365NPPtHOnTu1atWq0OObN2/W8OHDVVhYaMr7AYgfanwA9GsjRozQ+++/r507dyozM1P5+fmy24/9N9usWbP0ve99Tz6fT0lJSRG/34oVK7R9+3ZNnTpVeXl5ev311+X3+1VRURF6zjvvvKOZM2dG/B4ArEOPD4B+7cc//rGSkpI0btw4FRUVaffu3d0+76KLLlJycrLeeuutqN4vNzdXr7zyiqZNm6ZTTz1VTz75pF544QWNHz9ektTW1qY//vGPWrBgQVTvA8AarNwMYMBYunSp/ud//kd/+ctfYvYeTzzxhF599VW9+eabMXsPALHDUBeAAeP73/++Ghoa1NTUpKysrJi8R0pKih577LGYvDaA2KPHBwAADBrU+AAAgEGD4AMAAAYNgg8AABg0CD4AAGDQIPgAAIBBg+ADAAAGDYIPAAAYNAg+AABg0CD4AACAQeP/ASeFXCDSGyeYAAAAAElFTkSuQmCC", "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-08-18T03:36:02.673777Z", "iopub.status.busy": "2025-08-18T03:36:02.673611Z", "iopub.status.idle": "2025-08-18T03:36:03.176651Z", "shell.execute_reply": "2025-08-18T03:36:03.175107Z" } }, "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-08-18T03:36:03.185499Z", "iopub.status.busy": "2025-08-18T03:36:03.184810Z", "iopub.status.idle": "2025-08-18T03:36:03.194134Z", "shell.execute_reply": "2025-08-18T03:36:03.193730Z" } }, "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-08-18T03:36:03.199815Z", "iopub.status.busy": "2025-08-18T03:36:03.199673Z", "iopub.status.idle": "2025-08-18T03:36:03.338417Z", "shell.execute_reply": "2025-08-18T03:36:03.336742Z" } }, "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-08-18T03:36:03.341037Z", "iopub.status.busy": "2025-08-18T03:36:03.340306Z", "iopub.status.idle": "2025-08-18T03:36:03.345504Z", "shell.execute_reply": "2025-08-18T03:36:03.345123Z" } }, "outputs": [], "source": [ "import json" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Writing

" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "execution": { "iopub.execute_input": "2025-08-18T03:36:03.347311Z", "iopub.status.busy": "2025-08-18T03:36:03.347047Z", "iopub.status.idle": "2025-08-18T03:36:03.361592Z", "shell.execute_reply": "2025-08-18T03:36:03.359324Z" } }, "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-08-18T03:36:03.363331Z", "iopub.status.busy": "2025-08-18T03:36:03.363107Z", "iopub.status.idle": "2025-08-18T03:36:03.370498Z", "shell.execute_reply": "2025-08-18T03:36:03.370115Z" } }, "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-08-18T03:36:03.372752Z", "iopub.status.busy": "2025-08-18T03:36:03.372017Z", "iopub.status.idle": "2025-08-18T03:36:03.513826Z", "shell.execute_reply": "2025-08-18T03:36:03.513416Z" } }, "outputs": [ { "data": { "image/png": "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jbF///7QraWlJfScG264wTjppJOMVatWGR9++KFRWVlpVFZWWtjq3jvR+W3bts342c9+Znz44YfGjh07jNdee80YNWqUMXXqVItb3nsLFy401q5da+zYscP45JNPjIULFxo2m8148803DcNI7OtnGMc/v4Fw/bpz9Ew1K68hwSdOHnvsMeOkk04yHA6Hcc455xjr16+3ukmmuPLKK40hQ4YYDofDGDZsmHHllVca27Zts7pZUVm9erUh6ZjbddddZxhGYEr7T3/6U6OkpMRwOp3G9OnTja1bt1rb6D443vm1tLQYM2fONIqKioyUlBSjvLzcWLBgQUKF9O7OTZKxbNmy0HNaW1uN//t//6+Rl5dnpKenG9/85jeN/fv3W9foPjjR+e3evduYOnWqkZ+fbzidTmPMmDHG7bffbrhcLmsb3gff/e53jfLycsPhcBhFRUXG9OnTQ6HHMBL7+hnG8c9vIFy/7hwdfKy8hjbDMIzY9ysBAABYjxofAAAwaBB8AADAoEHwAQAAgwbBBwAADBoEHwAAMGgQfAAAwKBB8AEAAIMGwQcAAAwaBB8AA8bWrVtVWlqqpqammL3HVVddpV/96lcxe30AscXKzQD6tQsuuEBnnHGGfv3rX5/wuZdffrkmTZqkO++8M2bt2bx5s6ZOnaodO3YoJycnZu8DIDbo8QEwIOzevVsrVqzQvHnzYvo+p512mkaPHq3/+q//iun7AIgNgg+AfmvevHlau3atHnnkEdlsNtlsNu3cubPb5/7+97/XxIkTNWzYsNCx5cuXKzc3VytWrFBFRYXS09P1rW99Sy0tLXr22Wc1YsQI5eXl6aabbpLP5wv93OOPP66TTz5ZqampKikp0be+9a2w97rkkkv04osvxuScAcRWstUNAICePPLII/riiy902mmn6Wc/+5kkqaioqNvnvvPOO5o8efIxx1taWvToo4/qxRdfVFNTky6//HJ985vfVG5url5//XVt375dc+fO1Xnnnacrr7xSH374oW666SY999xz+trXvqbDhw/rnXfeCXvNc845R7/4xS/kdrvldDrNP3EAMUPwAdBv5eTkyOFwKD09XaWlpcd97q5du7oNPu3t7XriiSc0evRoSdK3vvUtPffcc6qtrVVmZqbGjRunCy+8UKtXr9aVV16p3bt3KyMjQxdffLGysrJUXl6uM888M+w1hw4dKo/Ho5qaGpWXl5t3wgBijqEuAANCa2urUlNTjzmenp4eCj2SVFJSohEjRigzMzPsWF1dnSTpn/7pn1ReXq5Ro0bp2muv1fPPP6+Wlpaw10xLS5OkY44D6P8IPgAGhMLCQtXX1x9zPCUlJey+zWbr9pjf75ckZWVl6aOPPtILL7ygIUOGaPHixZo4caIaGhpCzz98+LCknofdAPRfBB8A/ZrD4QgrPO7JmWeeqc8//9yU90xOTtaMGTN0//3365NPPtHOnTu1atWq0OObN2/W8OHDVVhYaMr7AYgfanwA9GsjRozQ+++/r507dyozM1P5+fmy24/9N9usWbP0ve99Tz6fT0lJSRG/34oVK7R9+3ZNnTpVeXl5ev311+X3+1VRURF6zjvvvKOZM2dG/B4ArEOPD4B+7cc//rGSkpI0btw4FRUVaffu3d0+76KLLlJycrLeeuutqN4vNzdXr7zyiqZNm6ZTTz1VTz75pF544QWNHz9ektTW1qY//vGPWrBgQVTvA8AarNwMYMBYunSp/ud//kd/+ctfYvYeTzzxhF599VW9+eabMXsPALHDUBeAAeP73/++Ghoa1NTUpKysrJi8R0pKih577LGYvDaA2KPHBwAADBrU+AAAgEGD4AMAAAYNgg8AABg0CD4AAGDQIPgAAIBBg+ADAAAGDYIPAAAYNAg+AABg0CD4AACAQeP/ASeFXCDSGyeYAAAAAElFTkSuQmCC", "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-08-18T03:36:03.516499Z", "iopub.status.busy": "2025-08-18T03:36:03.516322Z", "iopub.status.idle": "2025-08-18T03:36:03.520508Z", "shell.execute_reply": "2025-08-18T03:36:03.520118Z" } }, "outputs": [], "source": [ "import pickle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Writing

" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "execution": { "iopub.execute_input": "2025-08-18T03:36:03.525961Z", "iopub.status.busy": "2025-08-18T03:36:03.525678Z", "iopub.status.idle": "2025-08-18T03:36:03.529521Z", "shell.execute_reply": "2025-08-18T03:36:03.529137Z" } }, "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-08-18T03:36:03.532888Z", "iopub.status.busy": "2025-08-18T03:36:03.532742Z", "iopub.status.idle": "2025-08-18T03:36:03.537525Z", "shell.execute_reply": "2025-08-18T03:36:03.537142Z" } }, "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-08-18T03:36:03.541850Z", "iopub.status.busy": "2025-08-18T03:36:03.541705Z", "iopub.status.idle": "2025-08-18T03:36:03.545935Z", "shell.execute_reply": "2025-08-18T03:36:03.545577Z" } }, "outputs": [ { "data": { "text/plain": [ "hoc.Vector" ] }, "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-08-18T03:36:03.549289Z", "iopub.status.busy": "2025-08-18T03:36:03.549145Z", "iopub.status.idle": "2025-08-18T03:36:03.552909Z", "shell.execute_reply": "2025-08-18T03:36:03.552588Z" } }, "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-08-18T03:36:03.557333Z", "iopub.status.busy": "2025-08-18T03:36:03.557055Z", "iopub.status.idle": "2025-08-18T03:36:03.561933Z", "shell.execute_reply": "2025-08-18T03:36:03.561578Z" } }, "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 `n.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-08-18T03:36:03.564217Z", "iopub.status.busy": "2025-08-18T03:36:03.564074Z", "iopub.status.idle": "2025-08-18T03:36:03.709429Z", "shell.execute_reply": "2025-08-18T03:36:03.709021Z" } }, "outputs": [ { "data": { "image/png": "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jbF///7QraWlJfScG264wTjppJOMVatWGR9++KFRWVlpVFZWWtjq3jvR+W3bts342c9+Znz44YfGjh07jNdee80YNWqUMXXqVItb3nsLFy401q5da+zYscP45JNPjIULFxo2m8148803DcNI7OtnGMc/v4Fw/bpz9Ew1K68hwSdOHnvsMeOkk04yHA6Hcc455xjr16+3ukmmuPLKK40hQ4YYDofDGDZsmHHllVca27Zts7pZUVm9erUh6ZjbddddZxhGYEr7T3/6U6OkpMRwOp3G9OnTja1bt1rb6D443vm1tLQYM2fONIqKioyUlBSjvLzcWLBgQUKF9O7OTZKxbNmy0HNaW1uN//t//6+Rl5dnpKenG9/85jeN/fv3W9foPjjR+e3evduYOnWqkZ+fbzidTmPMmDHG7bffbrhcLmsb3gff/e53jfLycsPhcBhFRUXG9OnTQ6HHMBL7+hnG8c9vIFy/7hwdfKy8hjbDMIzY9ysBAABYjxofAAAwaBB8AADAoEHwAQAAgwbBBwAADBoEHwAAMGgQfAAAwKBB8AEAAIMGwQcAAAwaBB8AA8bWrVtVWlqqpqammL3HVVddpV/96lcxe30AscXKzQD6tQsuuEBnnHGGfv3rX5/wuZdffrkmTZqkO++8M2bt2bx5s6ZOnaodO3YoJycnZu8DIDbo8QEwIOzevVsrVqzQvHnzYvo+p512mkaPHq3/+q//iun7AIgNgg+AfmvevHlau3atHnnkEdlsNtlsNu3cubPb5/7+97/XxIkTNWzYsNCx5cuXKzc3VytWrFBFRYXS09P1rW99Sy0tLXr22Wc1YsQI5eXl6aabbpLP5wv93OOPP66TTz5ZqampKikp0be+9a2w97rkkkv04osvxuScAcRWstUNAICePPLII/riiy902mmn6Wc/+5kkqaioqNvnvvPOO5o8efIxx1taWvToo4/qxRdfVFNTky6//HJ985vfVG5url5//XVt375dc+fO1Xnnnacrr7xSH374oW666SY999xz+trXvqbDhw/rnXfeCXvNc845R7/4xS/kdrvldDrNP3EAMUPwAdBv5eTkyOFwKD09XaWlpcd97q5du7oNPu3t7XriiSc0evRoSdK3vvUtPffcc6qtrVVmZqbGjRunCy+8UKtXr9aVV16p3bt3KyMjQxdffLGysrJUXl6uM888M+w1hw4dKo/Ho5qaGpWXl5t3wgBijqEuAANCa2urUlNTjzmenp4eCj2SVFJSohEjRigzMzPsWF1dnSTpn/7pn1ReXq5Ro0bp2muv1fPPP6+Wlpaw10xLS5OkY44D6P8IPgAGhMLCQtXX1x9zPCUlJey+zWbr9pjf75ckZWVl6aOPPtILL7ygIUOGaPHixZo4caIaGhpCzz98+LCknofdAPRfBB8A/ZrD4QgrPO7JmWeeqc8//9yU90xOTtaMGTN0//3365NPPtHOnTu1atWq0OObN2/W8OHDVVhYaMr7AYgfanwA9GsjRozQ+++/r507dyozM1P5+fmy24/9N9usWbP0ve99Tz6fT0lJSRG/34oVK7R9+3ZNnTpVeXl5ev311+X3+1VRURF6zjvvvKOZM2dG/B4ArEOPD4B+7cc//rGSkpI0btw4FRUVaffu3d0+76KLLlJycrLeeuutqN4vNzdXr7zyiqZNm6ZTTz1VTz75pF544QWNHz9ektTW1qY//vGPWrBgQVTvA8AarNwMYMBYunSp/ud//kd/+ctfYvYeTzzxhF599VW9+eabMXsPALHDUBeAAeP73/++Ghoa1NTUpKysrJi8R0pKih577LGYvDaA2KPHBwAADBrU+AAAgEGD4AMAAAYNgg8AABg0CD4AAGDQIPgAAIBBg+ADAAAGDYIPAAAYNAg+AABg0CD4AACAQeP/ASeFXCDSGyeYAAAAAElFTkSuQmCC", "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()" ] } ], "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 }