diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 0239d180112bfb369ca0b69409589a309b2ddce2..a12f8a4b12ebd03f93b581a6da89edd6d0f96472 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -165,6 +165,6 @@ jobs: python python/example/single_cell_model.py python python/example/single_cell_recipe.py python python/example/single_cell_stdp.py - python python/example/single_cell_swc.py python/example/morph.swc - python python/example/single_cell_detailed.py python/example/morph.swc - python python/example/single_cell_detailed_recipe.py python/example/morph.swc + python python/example/single_cell_swc.py python/example/single_cell_detailed.swc + python python/example/single_cell_detailed.py python/example/single_cell_detailed.swc + python python/example/single_cell_detailed_recipe.py python/example/single_cell_detailed.swc diff --git a/doc/concepts/interconnectivity.rst b/doc/concepts/interconnectivity.rst index 4e746349c7c2c88dacd7f4924523dca7a78907a7..11caa96af5a38349dd18287e59e2214ab17a6947 100644 --- a/doc/concepts/interconnectivity.rst +++ b/doc/concepts/interconnectivity.rst @@ -1,12 +1,12 @@ -.. _co_interconnectivity: +.. _interconnectivity: Interconnectivity ================= -Networks can be regarded as a sort of graph, where the nodes are cells and the edges +Networks can be regarded as graph, where the nodes are cells and the edges describe the communications between them. In Arbor, two sorts of edges are modelled: a -**connection** abstracts the propagation of action potentials (spikes) through the network, -while a **gap junction** is used to describe a direct electrical connection between two cells. +:term:`connection` abstracts the propagation of action potentials (:term:`spikes <spike>`) through the network, +while a :term:`gap junction` is used to describe a direct electrical connection between two cells. Connections only capture the propagation delay and attenuation associated with spike connectivity: the biophysical modelling of the chemical synapses themselves is the responsibility of the target cell model. @@ -17,34 +17,44 @@ A recipe lets you define which sites are connected to which. .. _modelconnections: -Connections ------------ +.. glossary:: -Connections implement chemical synapses between **source** and **target** cells and are characterized -by having a transmission delay. + connection + Connections implement chemical synapses between **source** and **target** cells and are characterized + by having a transmission delay. On a cell, sources and targets are separately indexed. -Connections in Arbor are defined in two steps: + Connections in Arbor are defined in two steps: -1. Create **source** and **target** on two separate cells as part of their - :ref:`cell descriptions <modelcelldesc>` in the :ref:`recipe <modelrecipe>`. Sources typically - generate spiking events. Targets are typically synapses with associated biophysical model descriptions. -2. Declare the connection in the recipe: with the source and target identified using :gen:`cell_member`, - a connection delay and a connection weight. The connection should be declared on the target cell. + 1. Create **source** and **target** on two separate cells as part of their + :ref:`cell descriptions <modelcelldesc>` in the :ref:`recipe <modelrecipe>`. Sources typically + generate spikes. Targets are typically synapses with associated biophysical model descriptions. + 2. Declare the connection in the recipe: with the source and target identified using :gen:`cell_member`, + a connection delay and a connection weight. The connection should be declared on the target cell. + + spike + action potential + Spikes travel over :term:`connections <connection>`. In a synapse, they generate an event. + + event + In a synapse :term:`spikes <spike>` generate events, which constitute stimulation of the synapse mechanism and the transmission of a signal. A synapse may receive events directly from an :term:`event generator`. + + event generator + Externally stimulate a synapse. Event can be delivered on a schedule, one time, etc. See :py:class:`arbor.event_generator` for options. .. _modelgapjunctions: -Gap junctions -------------- +.. glossary:: -Gap junctions represent electrical synapses where transmission between cells is bidirectional and direct. -They are modeled as a conductance between two **gap junction sites** on two cells. + gap junction + Gap junctions represent electrical synapses where transmission between cells is bidirectional and direct. + They are modelled as a conductance between two **gap junction sites** on two cells. -Similarly to `Connections`, Gap Junctions in Arbor are defined in two steps: + Similarly to `Connections`, Gap Junctions in Arbor are defined in two steps: -1. Create a **gap junction site** on two separate cells as part of their - :ref:`cell descriptions <modelcelldesc>` in the :ref:`recipe <modelrecipe>`. -2. Declare the Gap Junction in the recipe: with two **gap junction sites** identified using :gen:`cell_member` - and a conductance in μS. + 1. Create a **gap junction site** on two separate cells as part of their + :ref:`cell descriptions <modelcelldesc>` in the :ref:`recipe <modelrecipe>`. + 2. Declare the Gap Junction in the recipe: with two **gap junction sites** identified using :gen:`cell_member` + and a conductance in μS. .. Note:: Only cable cells support gap junctions as of now. diff --git a/doc/concepts/mechanisms.rst b/doc/concepts/mechanisms.rst index 8bc847ccaabe42bbc2522e07a942cb8bba0b0967..ca36c5427734511d607c4fe98ad49cbad9e99c88 100644 --- a/doc/concepts/mechanisms.rst +++ b/doc/concepts/mechanisms.rst @@ -51,6 +51,8 @@ used by the `Allen Institute <https://alleninstitute.org/>`_ and the `Blue Brain the `Allen institute mechanisms <https://github.com/arbor-sim/arbor/tree/master/mechanisms/allen>`_ and the `BBP mechanisms <https://github.com/arbor-sim/arbor/tree/master/mechanisms/bbp>`_ at the provided links.) +.. _mechanisms_builtins: + Built-in Catalogues ''''''''''''''''''' diff --git a/doc/concepts/recipe.rst b/doc/concepts/recipe.rst index 3b2a2edc677e2cfb3c67d39c9dac101d8a2647ad..ae64d334b3155e6638af74ffac3a8783d8500834 100644 --- a/doc/concepts/recipe.rst +++ b/doc/concepts/recipe.rst @@ -66,7 +66,7 @@ on ``cell 2``. All this information is also registered via the recipe. There are additional docs on :ref:`cell kinds <modelcellkind>`; :ref:`cell descriptions <modelcelldesc>`; :ref:`network connections <modelconnections>`; -:ref:`gap junction connections <modelgapjunctions>`; :ref:`probes <cablecell-probes>` +:ref:`gap junction connections <modelgapjunctions>`; :ref:`probes <cablecell-probes>`. The recipe is used to distribute the model across machines and is used in the simulation. Technical details of the recipe class are presented in the :ref:`Python <pyrecipe>` and diff --git a/doc/python/interconnectivity.rst b/doc/python/interconnectivity.rst index 71d8ebad16e16a7a61aa22f73e702c86e30ccf24..430496f28d9c7bf5c28e073d783f1bff3840ac8f 100644 --- a/doc/python/interconnectivity.rst +++ b/doc/python/interconnectivity.rst @@ -3,6 +3,8 @@ Interconnectivity ################# +.. currentmodule:: arbor + .. class:: connection Describes a connection between two cells, defined by source and destination end points (that is pre-synaptic and post-synaptic respectively), @@ -68,7 +70,7 @@ Interconnectivity .. class:: spike_detector - A spike detector, generates a spike when voltage crosses a threshold. Can be used as source endpoint for an :ref:`arbor.connection`. + A spike detector, generates a spike when voltage crosses a threshold. Can be used as source endpoint for an :class:`arbor.connection`. .. attribute:: threshold diff --git a/doc/python/simulation.rst b/doc/python/simulation.rst index cad11a468ef1087345f65fb5f31b87f66690a591..410e70f7f5733530a950cbbff2f9f76802042e0e 100644 --- a/doc/python/simulation.rst +++ b/doc/python/simulation.rst @@ -8,12 +8,12 @@ From recipe to simulation To build a simulation the following concepts are needed: - * an :class:`arbor.recipe` that describes the cells and connections in the model; - * an :class:`arbor.context` used to execute the simulation. + * an :py:class:`arbor.recipe` that describes the cells and connections in the model; + * an :py:class:`arbor.context` used to execute the simulation. The workflow to build a simulation is to first generate an -:class:`arbor.domain_decomposition` based on the :class:`arbor.recipe` and :class:`arbor.context` describing the distribution of the model -over the local and distributed hardware resources (see :ref:`pydomdec`). Then, the simulation is build using this :class:`arbor.domain_decomposition`. +:class:`arbor.domain_decomposition` based on the :py:class:`arbor.recipe` and :py:class:`arbor.context` describing the distribution of the model +over the local and distributed hardware resources (see :ref:`pydomdec`). Then, the simulation is build using this :py:class:`arbor.domain_decomposition`. .. container:: example-code @@ -50,9 +50,9 @@ over the local and distributed hardware resources (see :ref:`pydomdec`). Then, t The **constructor** takes - * an :class:`arbor.recipe` that describes the model; - * an :class:`arbor.domain_decomposition` that describes how the cells in the model are assigned to hardware resources; - * an :class:`arbor.context` which is used to execute the simulation. + * an :py:class:`arbor.recipe` that describes the model; + * an :py:class:`arbor.domain_decomposition` that describes how the cells in the model are assigned to hardware resources; + * an :py:class:`arbor.context` which is used to execute the simulation. Simulations provide an interface for executing and interacting with the model: @@ -65,7 +65,7 @@ over the local and distributed hardware resources (see :ref:`pydomdec`). Then, t .. function:: simulation(recipe, domain_decomposition, context) - Initialize the model described by an :class:`arbor.recipe`, with cells and network distributed according to :class:`arbor.domain_decomposition`, and computational resources described by :class:`arbor.context`. + Initialize the model described by an :py:class:`arbor.recipe`, with cells and network distributed according to :py:class:`arbor.domain_decomposition`, and computational resources described by :py:class:`arbor.context`. **Updating Model State:** @@ -87,7 +87,7 @@ over the local and distributed hardware resources (see :ref:`pydomdec`). Then, t Set the binning ``policy`` for event delivery, and the binning time interval ``bin_interval`` if applicable [ms]. - :param policy: The binning policy of type :class:`binning`. + :param policy: The binning policy of type :py:class:`binning`. :param bin_interval: The binning time interval [ms]. @@ -97,7 +97,7 @@ over the local and distributed hardware resources (see :ref:`pydomdec`). Then, t Disable or enable recorder of rank-local or global spikes, as determined by the ``policy``. - :param policy: Recording policy of type :class:`spike_recording`. + :param policy: Recording policy of type :py:class:`spike_recording`. .. function:: spikes() @@ -109,9 +109,9 @@ over the local and distributed hardware resources (see :ref:`pydomdec`). Then, t .. function:: sample(probe_id, schedule, policy) - Set up a sampling schedule for the probes associated with the supplied probe_id of type :class:`cell_member`. + Set up a sampling schedule for the probes associated with the supplied probe_id of type :py:class:`cell_member`. The schedule is any schedule object, as might be used with an event generator — see :ref:`pyrecipe` for details. - The policy is of type :class:`sampling_policy`. It can be omitted, in which case the sampling will accord with the + The policy is of type :py:class:`sampling_policy`. It can be omitted, in which case the sampling will accord with the ``sampling_policy.lax`` policy. The method returns a handle which can be used in turn to retrieve the sampled data from the simulator or to @@ -119,7 +119,7 @@ over the local and distributed hardware resources (see :ref:`pydomdec`). Then, t .. function:: probe_metadata(probe_id) - Retrieve probe metadata for the probes associated with the given probe_id of type :class:`cell_member`. + Retrieve probe metadata for the probes associated with the given probe_id of type :py:class:`cell_member`. The result will be a list, with one entry per probe; the specifics of each metadata entry will depend upon the kind of probe in question. @@ -134,7 +134,7 @@ over the local and distributed hardware resources (see :ref:`pydomdec`). Then, t .. function:: samples(handle) Retrieve a list of sample data associated with the given ``handle``. - There will be one entry in the list per probe associated with the probe id used when the sampling was set up. + There will be one entry in the list per probe associated with the :term:`probe id` used when the sampling was set up. For example, if a probe was placed on a locset describing three positions, the returned list will contain three elements. An empty list will be returned if no output was recorded for the cell. For simulations @@ -149,53 +149,53 @@ over the local and distributed hardware resources (see :ref:`pydomdec`). Then, t be a NumPy array, with the first column corresponding to sample time and subsequent columns holding the value or values that were sampled from that probe at that time. - **Types:** +**Types:** - .. class:: binning +.. class:: binning - Enumeration for event time binning policy. + Enumeration for event time binning policy. - .. attribute:: none + .. attribute:: none - No binning policy. + No binning policy. - .. attribute:: regular + .. attribute:: regular - Round time down to multiple of binning interval. + Round time down to multiple of binning interval. - .. attribute:: following + .. attribute:: following - Round times down to previous event if within binning interval. + Round times down to previous event if within binning interval. - .. class:: spike_recording +.. class:: spike_recording - Enumeration for spike recording policy. + Enumeration for spike recording policy. - .. attribute:: off + .. attribute:: off - Disable spike recording. + Disable spike recording. - .. attribute:: local + .. attribute:: local - Record all generated spikes from cells on this MPI rank. + Record all generated spikes from cells on this MPI rank. - .. attribute:: all + .. attribute:: all - Record all generated spikes from cells on all MPI ranks. + Record all generated spikes from cells on all MPI ranks. - .. class:: sampling_policy +.. class:: sampling_policy - Enumeration for deteriming sampling policy. + Enumeration for deteriming sampling policy. - .. attribute:: lax + .. attribute:: lax - Sampling times may not be exactly as requested in the sampling schedule, but - the process of sampling is guaranteed not to disturb the simulation progress or results. + Sampling times may not be exactly as requested in the sampling schedule, but + the process of sampling is guaranteed not to disturb the simulation progress or results. - .. attribute:: exact + .. attribute:: exact - Interrupt the progress of the simulation as required to retrieve probe samples at exactly - those times requested by the sampling schedule. + Interrupt the progress of the simulation as required to retrieve probe samples at exactly + those times requested by the sampling schedule. Recording spikes ---------------- @@ -248,34 +248,40 @@ Recording samples Definitions *********** -probe - A measurement that can be perfomed on a cell. Each cell kind will have its own sorts of probe; - Cable cells (:attr:`arbor.cable_probe`) allow the monitoring of membrane voltage, total membrane - current, mechanism state, and a number of other quantities, measured either over the whole cell, - or at specific sites (see :ref:`pycablecell-probes`). +.. glossary:: - Probes are described by probe addresses, and the collection of probe addresses for a given cell is - provided by the :class:`recipe` object. One address may correspond to more than one probe: - as an example, a request for membrane voltage on a cable cell at sites specified by a location - expression will generate one probe for each site in that location expression. + probe + A measurement that can be performed on a cell. Each cell kind will have its own sorts of probe; + Cable cells (:py:attr:`arbor.cable_probe`) allow the monitoring of membrane voltage, total membrane + current, mechanism state, and a number of other quantities, measured either over the whole cell, + or at specific sites (see :ref:`pycablecell-probes`). -probe id - A designator for one or more probes as specified by a recipe. The *probe id* is a - :class:`cell_member` refering to a specific cell by gid, and the index into the list of - probe addresses returned by the recipe for that gid. + Probes are described by probe addresses, and the collection of probe addresses for a given cell is + provided by the :py:class:`recipe` object. One address may correspond to more than one probe: + as an example, a request for membrane voltage on a cable cell at sites specified by a location + expression will generate one probe for each site in that location expression. -metadata - Each probe has associated metadata describing, for example, the location on a cell where the - measurement is being taken, or other such identifying information. Metadata for the probes - associated with a *probe id* can be retrieved from the simulation object, and is also provided - along with any recorded samples. + probe id + A designator for one or more probes as specified by a recipe. The *probe id* is a + :py:class:`cell_member` referring to a specific cell by gid, and the index into the list of + probe addresses returned by the recipe for that gid. -sample - A record of data corresponding to the value at a specific *probe* at a specific time. + metadata + Each probe has associated metadata describing, for example, the location on a cell where the + measurement is being taken, or other such identifying information. Metadata for the probes + associated with a :term:`probe id` can be retrieved from the simulation object, and is also provided + along with any recorded samples. -schedule - An object representing a series of monotonically increasing points in time, used for determining - sample times (see :ref:`pyrecipe`). + sampler + A sampler is something that receives probe data. It amounts to setting a particular :term:`probe` to a + particular measuring schedule, and then having a handle with which to access the recorded probe data later on. + + sample + A record of data corresponding to the value at a specific *probe* at a specific time. + + schedule + An object representing a series of monotonically increasing points in time, used for determining + sample times (see :ref:`pyrecipe`). Procedure ********* @@ -286,9 +292,9 @@ Procedure The recipe object must provide a method :py:func:`recipe.get_probes` that returns a list of probe addresses for the cell with a given ``gid``. The kth element of the list corresponds - to the *probe id* ``(gid, k)``. + to the :term:`probe id` ``(gid, k)``. - Each probe address is an opaue object describing what to measure and where, and each cell kind + Each probe address is an opaque object describing what to measure and where, and each cell kind will have its own set of functions for generating valid address specifications. Possible cable cell probes are described in the cable cell documentation: :ref:`pycablecell-probes`. @@ -301,7 +307,7 @@ Procedure 3. Retrieve recorded data. The method :py:func:`simulation.samples` takes a handle and returns the recorded data as a list, - with one entry for each probe associated with the *probe id* that was used in step 2 above. Each + with one entry for each probe associated with the :term:`probe id` that was used in step 2 above. Each entry will be a tuple ``(data, meta)`` where ``meta`` is the metadata associated with the probe, and ``data`` contains all the data sampled on that probe over the course of the simulation. diff --git a/doc/scripts/gen-labels.py b/doc/scripts/gen-labels.py index 22a5dd0aa660a17b66769c12fe0f1ba127286b49..34d7db2d579ec397b183ede625c4c7624b4b7d22 100644 --- a/doc/scripts/gen-labels.py +++ b/doc/scripts/gen-labels.py @@ -2,6 +2,7 @@ import arbor from arbor import mpoint import os.path import sys +from math import sqrt def is_collocated(l, r): return l[0]==r[0] and l[1]==r[1] @@ -180,6 +181,7 @@ regions = { 'branch3': '(branch 3)', 'segment0': '(segment 0)', 'segment3': '(segment 3)', + 'cable_0_28': '(cable 0 0.2 0.8)', 'cable_1_01': '(cable 1 0 1)', 'cable_1_31': '(cable 1 0.3 1)', 'cable_1_37': '(cable 1 0.3 0.7)', @@ -215,7 +217,7 @@ d = arbor.label_dict(labels) cell = arbor.cable_cell(label_morph, d, arbor.decor()) ############################################################################### -# Tutorial Example +# Tutorial Example: single_cell_detailed ############################################################################### tree = arbor.segment_tree() @@ -255,6 +257,31 @@ tutorial_dict = arbor.label_dict(tutorial_labels) # Create a cell to concretise the region and locset definitions tutorial_cell = arbor.cable_cell(tutorial_morph, tutorial_dict, arbor.decor()) +############################################################################### +# Tutorial Example: network_ring +############################################################################### + +tree = arbor.segment_tree() +s = tree.append(arbor.mnpos, arbor.mpoint(-12, 0, 0, 6), arbor.mpoint(0, 0, 0, 6), tag=1) +b0 = tree.append(s, arbor.mpoint(0, 0, 0, 2), arbor.mpoint(50, 0, 0, 2), tag=3) +b1 = tree.append(b0, arbor.mpoint(50, 0, 0, 2), arbor.mpoint(50+50/sqrt(2), 50/sqrt(2), 0, 0.5), tag=3) +b2 = tree.append(b0, arbor.mpoint(50, 0, 0, 1), arbor.mpoint(50+50/sqrt(2), -50/sqrt(2), 0, 1), tag=3) +tutorial_network_ring_morph = arbor.morphology(tree) + +tutorial_network_ring_regions = { + 'soma': '(tag 1)', + 'dend': '(tag 3)' +} +tutorial_network_ring_locsets = { + 'synapse_site': '(location 1 0.5)', + 'root': '(root)' +} +tutorial_network_ring_labels = {**tutorial_network_ring_regions, **tutorial_network_ring_locsets} +tutorial_network_ring_dict = arbor.label_dict(tutorial_network_ring_labels) + +# Create a cell to concretise the region and locset definitions +tutorial_network_ring_cell = arbor.cable_cell(tutorial_network_ring_morph, tutorial_network_ring_dict, arbor.decor()) + ################################################################################ # Output all of the morphologies and region/locset definitions to a Python script # that can be run during the documentation build to generate images. @@ -278,6 +305,7 @@ f.write(write_morphology('ysoma_morph2', ysoma_morph2)) f.write(write_morphology('ysoma_morph3', ysoma_morph3)) f.write(write_morphology('tutorial_morph', tutorial_morph)) f.write(write_morphology('swc_morph', swc_morph)) +f.write(write_morphology('tutorial_network_ring_morph', tutorial_network_ring_morph)) f.write('\n############# locsets (label_morph)\n\n') for label in locsets: @@ -299,4 +327,14 @@ for label in tutorial_regions: comps = [(c.branch, c.prox, c.dist) for c in tutorial_cell.cables('"{}"'.format(label))] f.write('tut_reg_{} = {{\'type\': \'region\', \'value\': {}}}\n'.format(label, comps)) +f.write('\n############# locsets (tutorial_network_ring_morph)\n\n') +for label in tutorial_network_ring_locsets: + locs = [(l.branch, l.pos) for l in tutorial_network_ring_cell.locations('"{}"'.format(label))] + f.write('tut_network_ring_ls_{} = {{\'type\': \'locset\', \'value\': {}}}\n'.format(label, locs)) + +f.write('\n############# regions (tutorial_network_ring_morph)\n\n') +for label in tutorial_network_ring_regions: + comps = [(c.branch, c.prox, c.dist) for c in tutorial_network_ring_cell.cables('"{}"'.format(label))] + f.write('tut_network_ring_reg_{} = {{\'type\': \'region\', \'value\': {}}}\n'.format(label, comps)) + f.close() diff --git a/doc/scripts/inputs.py b/doc/scripts/inputs.py index c7526982f97a870e9b47f16e71a6ba8cd8b7a644..3befe7ad031e1d13d128b41665f271ad3c235d7f 100644 --- a/doc/scripts/inputs.py +++ b/doc/scripts/inputs.py @@ -98,6 +98,12 @@ tmp = [ [[Segment((0.0, 0.0, 1.0), (-3.0, 0.0, 0.7), 2)]],] swc_morph = representation.make_morph(tmp) +tmp = [ + [[Segment((-12.0, 0.0, 6.0), (0.0, 0.0, 6.0), 1), Segment((0.0, 0.0, 2.0), (50.0, 0.0, 2.0), 3)]], + [[Segment((50.0, 0.0, 2.0), (85.35533905932738, 35.35533905932737, 0.5), 3)]], + [[Segment((50.0, 0.0, 1.0), (85.35533905932738, -35.35533905932737, 1.0), 3)]],] +tutorial_network_ring_morph = representation.make_morph(tmp) + ############# locsets (label_morph) @@ -164,3 +170,13 @@ tut_reg_dend = {'type': 'region', 'value': [(0, 0.3324708796524168, 1.0), (1, 0. tut_reg_last = {'type': 'region', 'value': [(3, 0.0, 1.0), (4, 0.0, 1.0)]} tut_reg_rad_gt = {'type': 'region', 'value': [(0, 0.0, 0.3324708796524168), (5, 0.0, 0.21875)]} tut_reg_custom = {'type': 'region', 'value': [(0, 0.0, 0.3324708796524168), (3, 0.0, 1.0), (4, 0.0, 1.0), (5, 0.0, 0.21875)]} + +############# locsets (tutorial_network_ring_morph) + +tut_network_ring_ls_synapse_site = {'type': 'locset', 'value': [(1, 0.5)]} +tut_network_ring_ls_root = {'type': 'locset', 'value': [(0, 0.0)]} + +############# regions (tutorial_network_ring_morph) + +tut_network_ring_reg_soma = {'type': 'region', 'value': [(0, 0.0, 0.1935483870967742)]} +tut_network_ring_reg_dend = {'type': 'region', 'value': [(0, 0.1935483870967742, 1.0), (1, 0.0, 1.0), (2, 0.0, 1.0)]} diff --git a/doc/scripts/make_images.py b/doc/scripts/make_images.py index 87daec93f5dcc444d20602bf54f8112ba6e6a952..7b1c6e6db20849217854c395c359097517153dbe 100644 --- a/doc/scripts/make_images.py +++ b/doc/scripts/make_images.py @@ -18,8 +18,13 @@ def translate_all(points, f, xshift): # Draw one or more morphologies, side by side. # Each morphology can be drawn as segments or branches. -def morph_image(morphs, methods, filename, drawnumbers=True, colors=True, sc=20): +def morph_image(morphs, methods, filename, **kwargs): assert(len(morphs)==len(methods)) + + lab_sc = kwargs.get('lab_sc',2) + sc = kwargs.get('sc',20) + draw_labels = kwargs.get('draw_labels',True) + colors = kwargs.get('colors',True) tag_colors = tag_colors_colorscheme if colors else tag_colors_bwscheme print('generating:', filename) @@ -81,11 +86,12 @@ def morph_image(morphs, methods, filename, drawnumbers=True, colors=True, sc=20) lines.add(dwg.polygon(points=line, fill=tag_colors[seg.tag])) pos = translate(seg.location(0.5), sc, offset) - if drawnumbers: + if draw_labels: points.add(dwg.circle(center=pos, stroke='black', - r=sc*0.55, - fill='white')) + r=sc*0.55*lab_sc, + fill='white', + stroke_width=sc/20*lab_sc)) # The svg alignment_baseline attribute: # - works on Chrome/Chromium # - doesn't work on Firefox @@ -94,7 +100,8 @@ def morph_image(morphs, methods, filename, drawnumbers=True, colors=True, sc=20) numbers.add(dwg.text(str(segid), insert=label_pos, stroke='black', - fill='black')) + fill='black', + font_size=sc*0.55*lab_sc)) segid += 1 elif method=='branches': @@ -102,12 +109,13 @@ def morph_image(morphs, methods, filename, drawnumbers=True, colors=True, sc=20) lines.add(dwg.polygon(points=translate_all(line, sc, offset), fill=branchfillcolor)) - if drawnumbers: + if draw_labels: pos = translate(branch.location(0.5), sc, offset) points.add(dwg.circle(center=pos, stroke=bcolor, - r=sc*0.55, - fill=bcolor)) + r=sc*0.55*lab_sc, + fill=bcolor, + stroke_width=sc/20*lab_sc)) # The svg alignment_baseline attribute: # - works on Chrome/Chromium # - doesn't work on Firefox @@ -116,7 +124,8 @@ def morph_image(morphs, methods, filename, drawnumbers=True, colors=True, sc=20) numbers.add(dwg.text(str(i), insert=label_pos, stroke='white', - fill='white')) + fill='white', + font_size=sc*0.55*lab_sc)) offset = maxx - minx + sc @@ -138,7 +147,12 @@ def morph_image(morphs, methods, filename, drawnumbers=True, colors=True, sc=20) # ordering don't have collocated distal-proximal locations respectively. # Handling this case would make rendering regions more complex, but would # not bee too hard to support. -def label_image(morphology, labels, filename, drawroot=True, sc=20): +def label_image(morphology, labels, filename, **kwargs): + + loc_sc = kwargs.get('loc_sc',2) + sc = kwargs.get('sc',20) + drawroot = kwargs.get('drawroot',True) + morph = morphology print('generating:', filename) dwg = svgwrite.Drawing(filename=filename, debug=True) @@ -193,7 +207,7 @@ def label_image(morphology, labels, filename, drawroot=True, sc=20): # Draw the root root = translate(morph[0].location(0), sc, offset) if drawroot: - points.add(dwg.circle(center=root, stroke='red', r=sc/2.5, fill='white')) + points.add(dwg.circle(center=root, stroke='red', r=sc/2.5*loc_sc, fill='white', stroke_width=sc/10*loc_sc)) if lab['type'] == 'locset': for loc in lab['value']: @@ -201,7 +215,7 @@ def label_image(morphology, labels, filename, drawroot=True, sc=20): pos = loc[1] loc = translate(morph[bid].location(pos), sc, offset) - points.add(dwg.circle(center=loc, stroke='black', r=sc/3, fill='white')) + points.add(dwg.circle(center=loc, stroke='black', r=sc/3*loc_sc, fill='white', stroke_width=sc/10*loc_sc)) if lab['type'] == 'region': for cab in lab['value']: @@ -235,26 +249,26 @@ def label_image(morphology, labels, filename, drawroot=True, sc=20): def generate(path=''): - morph_image([inputs.branch_morph2], ['segments'], path+'/term_segments.svg', False, False) - morph_image([inputs.branch_morph2], ['branches'], path+'/term_branch.svg', False, False) - label_image(inputs.branch_morph2, [inputs.reg_cable_0_28], path+'/term_cable.svg', False) + morph_image([inputs.branch_morph2], ['segments'], path+'/term_segments.svg', colors=False, draw_labels=False) + morph_image([inputs.branch_morph2], ['branches'], path+'/term_branch.svg', colors=False, draw_labels=False) + label_image(inputs.branch_morph2, [inputs.reg_cable_0_28], path+'/term_cable.svg', drawroot=False) morph_image([inputs.label_morph], ['branches'], path+'/label_branch.svg') morph_image([inputs.label_morph], ['segments'], path+'/label_seg.svg') morph_image([inputs.detached_morph], ['segments'], path+'/detached_seg.svg') - morph_image([inputs.stacked_morph], ['segments'], path+'/stacked_seg.svg') - morph_image([inputs.swc_morph], ['segments'], path+'/swc_morph.svg') + morph_image([inputs.stacked_morph], ['segments'], path+'/stacked_seg.svg',lab_sc=1.2) + morph_image([inputs.swc_morph], ['segments'], path+'/swc_morph.svg',lab_sc=1.5) morph_image([inputs.label_morph, inputs.label_morph], ['segments', 'branches'], path+'/label_morph.svg') morph_image([inputs.detached_morph, inputs.detached_morph], ['segments', 'branches'], path+'/detached_morph.svg') morph_image([inputs.stacked_morph, inputs.stacked_morph], ['segments', 'branches'], path+'/stacked_morph.svg') - morph_image([inputs.sphere_morph, inputs.sphere_morph], ['segments', 'branches'], path+'/sphere_morph.svg') - morph_image([inputs.branch_morph1, inputs.branch_morph1], ['segments', 'branches'], path+'/branch_morph1.svg') - morph_image([inputs.branch_morph2, inputs.branch_morph2], ['segments', 'branches'], path+'/branch_morph2.svg') - morph_image([inputs.branch_morph3, inputs.branch_morph3], ['segments', 'branches'], path+'/branch_morph3.svg') - morph_image([inputs.branch_morph4, inputs.branch_morph4], ['segments', 'branches'], path+'/branch_morph4.svg') - morph_image([inputs.yshaped_morph, inputs.yshaped_morph], ['segments', 'branches'], path+'/yshaped_morph.svg') + morph_image([inputs.sphere_morph, inputs.sphere_morph], ['segments', 'branches'], path+'/sphere_morph.svg',lab_sc=1.5) + morph_image([inputs.branch_morph1, inputs.branch_morph1], ['segments', 'branches'], path+'/branch_morph1.svg',lab_sc=1) + morph_image([inputs.branch_morph2, inputs.branch_morph2], ['segments', 'branches'], path+'/branch_morph2.svg',lab_sc=1) + morph_image([inputs.branch_morph3, inputs.branch_morph3], ['segments', 'branches'], path+'/branch_morph3.svg',lab_sc=1) + morph_image([inputs.branch_morph4, inputs.branch_morph4], ['segments', 'branches'], path+'/branch_morph4.svg',lab_sc=1) + morph_image([inputs.yshaped_morph, inputs.yshaped_morph], ['segments', 'branches'], path+'/yshaped_morph.svg',lab_sc=1.5) morph_image([inputs.ysoma_morph1, inputs.ysoma_morph1], ['segments', 'branches'], path+'/ysoma_morph1.svg') morph_image([inputs.ysoma_morph2, inputs.ysoma_morph2], ['segments', 'branches'], path+'/ysoma_morph2.svg') morph_image([inputs.ysoma_morph3, inputs.ysoma_morph3], ['segments', 'branches'], path+'/ysoma_morph3.svg') @@ -294,12 +308,13 @@ def generate(path=''): ####################### Tutorial examples morph_image([inputs.tutorial_morph], ['segments'], path+'/tutorial_morph.svg') + morph_image([inputs.tutorial_network_ring_morph], ['segments'], path+'/tutorial_network_ring_morph.svg',lab_sc=6) ####################### locsets label_image(inputs.tutorial_morph, [inputs.tut_ls_root, inputs.tut_ls_terminal], path+'/tutorial_root_term.svg') label_image(inputs.tutorial_morph, [inputs.tut_ls_custom_terminal, inputs.tut_ls_axon_terminal], path+'/tutorial_custom_axon_term.svg') - + label_image(inputs.tutorial_network_ring_morph, [inputs.tut_network_ring_ls_synapse_site], path+'/tutorial_network_ring_synapse_site.svg', loc_sc=6) ####################### regions label_image(inputs.tutorial_morph, [inputs.tut_reg_soma, inputs.tut_reg_axon, inputs.tut_reg_dend, inputs.tut_reg_last], path+'/tutorial_tag.svg') diff --git a/doc/tutorial/index.rst b/doc/tutorial/index.rst index c7f38777bb56480ea965ade3d790b500034c3763..d5cc95d8ba9ad6f805c8bd9dcbc5c5a24976f64b 100644 --- a/doc/tutorial/index.rst +++ b/doc/tutorial/index.rst @@ -24,3 +24,5 @@ Tutorials single_cell_recipe single_cell_detailed single_cell_detailed_recipe + network_ring + mpi diff --git a/doc/tutorial/mpi.rst b/doc/tutorial/mpi.rst new file mode 100644 index 0000000000000000000000000000000000000000..0d44ab9851363f4b4f5f479ed7f265b0a3ad881c --- /dev/null +++ b/doc/tutorial/mpi.rst @@ -0,0 +1,127 @@ +.. _tutorialmpi: + +Distributed ring network (MPI) +============================== + +In this example, the ring network created in an :ref:`earlier tutorial <tutorialnetworkring>` will be used to run the model in +a distributed context using MPI. Only the differences with that tutorial will be described. + +.. Note:: + + **Concepts covered in this example:** + + 1. Building a basic MPI aware :py:class:`arbor.context` to run a network. + This requires that you have built Arbor with MPI support enabled. + 2. Running the simulation and extracting the results. + +The recipe +********** + +Step **(11)** is changed to generate a network with five hundred cells. + +.. code-block:: python + + # (11) Instantiate recipe + ncells = 500 + recipe = ring_recipe(ncells) + +The hardware context +******************** + +Step **(12)** uses the Arbor-built-in :py:class:`MPI communicator <arbor.mpi_comm>`, which is identical to the +``MPI_COMM_WORLD`` communicator you'll know if you are familiar with MPI. The :py:class:`arbor.context` takes a +communicator for its ``mpi`` parameter. Note that you can also pass in communicators created with ``mpi4py``. +We print both the communicator and context to observe how Arbor configures their defaults. + +.. code-block:: python + + # (12) Create an MPI communicator, and use it to create a hardware context + arbor.mpi_init() + comm = arbor.mpi_comm() + print(comm) + context = arbor.context(mpi=comm) + print(context) + +The execution +************* + +Step **(16)** runs the simulation. Since we have more cells this time, which are connected in series, it will take some time for the action potential to propagate. In the :ref:`ring network <tutorialnetworkring>` we could see it takes about 5 ms for the signal to propgate through one cell, so let's set the runtime to ``5*ncells``. + +.. code-block:: python + + # (16) Run simulation + sim.run(ncells*5) + print('Simulation finished') + +An important change in the execution is how the script is run. Whereas normally you run the Python script by passing +it as an argument to the ``python`` command, you need to use ``srun`` or ``mpirun`` (depending on your MPI +distribution) to execute a number of jobs in parallel. You can still execute the script using ``python``, but then +MPI will not execute on more than one node. + +From the commandline, we can run the script using ``mpirun`` or ``srun`` and specify the number of ranks (``NRANKS``) +or nodes. Arbor will spread the cells evenly over the ranks, so with ``NRANKS`` set to 5, we'd be spreading the 500 +cells over 5 nodes, simulating 100 cells each. + +.. code-block:: + + srun -n NRANKS python network_ring_mpi.py + mpirun -n NRANKS python network_ring_mpi.py + +The results +*********** + +Before we execute the simulation, we have to understand how Arbor distributes the computational load over the ranks. +After executing ``mpirun``, all nodes will run the same script. In the domain decomposition step, the nodes will use +the provided MPI communicator to divide the work. Once :py:func:`arbor.simulation.run` starts, each node wil work on +their allocated cell ``gid`` s. + +This is relevant for the collection of results: these are not gathered for you. Remember that in step **(14)** we +store the handles to the probes; these referred to particular ``gid`` s. The ``gid`` s are now distributed, so on one +node, the script will not find the cell referred to by the handle and therefore return an empty list (no results were found). + +In step **(18)** we check, for each ``gid``, if the list returned by :py:func:`arbor.simulation.samples` has a nonzero +length. The effect is that we collect the results generated on this particular node. Since we now have ``NRANKS`` +instances of our script, and we can't access the results between nodes, we have to write the results to disk and +analyse them later. We query :py:attr:`arbor.context.rank` to generate a unique filename for the result. + +.. code-block:: python + + # (18) Store the recorded voltages + print("Storing results ...") + df_list = [] + for gid in range(ncells): + if len(sim.samples(handles[gid])): + samples, meta = sim.samples(handles[gid])[0] + df_list.append(pandas.DataFrame({'t/ms': samples[:, 0], 'U/mV': samples[:, 1], 'Cell': f"cell {gid}"})) + + if len(df_list): + df = pandas.concat(df_list) + df.to_csv(f"result_mpi_{context.rank}.csv", float_format='%g') + +In a second script, ``mpi_plot.py``, we load the results stored to disk into a pandas table, and plot the concatenated table as before: + +.. code-block:: python + + import glob + import pandas, seaborn + + results = glob.glob("result_mpi_*.csv") + + df_list = [] + for result in results: + df_list.append(pandas.read_csv(result)) + + df = pandas.concat(df_list) + seaborn.relplot(data=df, kind="line", x="t/ms", y="U/mV",hue="Cell",ci=None).savefig('mpi_result.svg') + +To avoid an overcrowded plot, this plot was generated with just 50 cells: + +.. figure:: mpi_result.svg + :width: 400 + :align: center + + +The full code +************* + +You can find the full code of the example at ``python/examples/mpi.py`` and ``python/examples/mpi_plot.py``. diff --git a/doc/tutorial/mpi_result.svg b/doc/tutorial/mpi_result.svg new file mode 100644 index 0000000000000000000000000000000000000000..c94939d447638abdde2abe8e829a0e4de5ef9dc3 --- /dev/null +++ b/doc/tutorial/mpi_result.svg @@ -0,0 +1,3059 @@ +<?xml version="1.0" encoding="utf-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with matplotlib (https://matplotlib.org/) --> +<svg height="765.984375pt" version="1.1" viewBox="0 0 433.874412 765.984375" width="433.874412pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <metadata> + <rdf:RDF xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <cc:Work> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + <dc:date>2021-02-18T11:04:04.847404</dc:date> + <dc:format>image/svg+xml</dc:format> + <dc:creator> + <cc:Agent> + <dc:title>Matplotlib v3.3.2, https://matplotlib.org/</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <defs> + <style type="text/css">*{stroke-linecap:butt;stroke-linejoin:round;}</style> + </defs> + <g id="figure_1"> + <g id="patch_1"> + <path d="M 0 765.984375 +L 433.874412 765.984375 +L 433.874412 0 +L 0 0 +z +" style="fill:#ffffff;"/> + </g> + <g id="axes_1"> + <g id="patch_2"> + <path d="M 48.982813 535.112188 +L 358.263213 535.112188 +L 358.263213 213.792188 +L 48.982813 213.792188 +z +" style="fill:#ffffff;"/> + </g> + <g id="matplotlib.axis_1"> + <g id="xtick_1"> + <g id="line2d_1"> + <defs> + <path d="M 0 0 +L 0 3.5 +" id="m7fab6e08c4" style="stroke:#000000;stroke-width:0.8;"/> + </defs> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="63.041013" xlink:href="#m7fab6e08c4" y="535.112188"/> + </g> + </g> + <g id="text_1"> + <!-- 0 --> + <g transform="translate(59.859763 549.710625)scale(0.1 -0.1)"> + <defs> + <path d="M 31.78125 66.40625 +Q 24.171875 66.40625 20.328125 58.90625 +Q 16.5 51.421875 16.5 36.375 +Q 16.5 21.390625 20.328125 13.890625 +Q 24.171875 6.390625 31.78125 6.390625 +Q 39.453125 6.390625 43.28125 13.890625 +Q 47.125 21.390625 47.125 36.375 +Q 47.125 51.421875 43.28125 58.90625 +Q 39.453125 66.40625 31.78125 66.40625 +z +M 31.78125 74.21875 +Q 44.046875 74.21875 50.515625 64.515625 +Q 56.984375 54.828125 56.984375 36.375 +Q 56.984375 17.96875 50.515625 8.265625 +Q 44.046875 -1.421875 31.78125 -1.421875 +Q 19.53125 -1.421875 13.0625 8.265625 +Q 6.59375 17.96875 6.59375 36.375 +Q 6.59375 54.828125 13.0625 64.515625 +Q 19.53125 74.21875 31.78125 74.21875 +z +" id="DejaVuSans-48"/> + </defs> + <use xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_2"> + <g id="line2d_2"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="119.505316" xlink:href="#m7fab6e08c4" y="535.112188"/> + </g> + </g> + <g id="text_2"> + <!-- 50 --> + <g transform="translate(113.142816 549.710625)scale(0.1 -0.1)"> + <defs> + <path d="M 10.796875 72.90625 +L 49.515625 72.90625 +L 49.515625 64.59375 +L 19.828125 64.59375 +L 19.828125 46.734375 +Q 21.96875 47.46875 24.109375 47.828125 +Q 26.265625 48.1875 28.421875 48.1875 +Q 40.625 48.1875 47.75 41.5 +Q 54.890625 34.8125 54.890625 23.390625 +Q 54.890625 11.625 47.5625 5.09375 +Q 40.234375 -1.421875 26.90625 -1.421875 +Q 22.3125 -1.421875 17.546875 -0.640625 +Q 12.796875 0.140625 7.71875 1.703125 +L 7.71875 11.625 +Q 12.109375 9.234375 16.796875 8.0625 +Q 21.484375 6.890625 26.703125 6.890625 +Q 35.15625 6.890625 40.078125 11.328125 +Q 45.015625 15.765625 45.015625 23.390625 +Q 45.015625 31 40.078125 35.4375 +Q 35.15625 39.890625 26.703125 39.890625 +Q 22.75 39.890625 18.8125 39.015625 +Q 14.890625 38.140625 10.796875 36.28125 +z +" id="DejaVuSans-53"/> + </defs> + <use xlink:href="#DejaVuSans-53"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_3"> + <g id="line2d_3"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="175.96962" xlink:href="#m7fab6e08c4" y="535.112188"/> + </g> + </g> + <g id="text_3"> + <!-- 100 --> + <g transform="translate(166.42587 549.710625)scale(0.1 -0.1)"> + <defs> + <path d="M 12.40625 8.296875 +L 28.515625 8.296875 +L 28.515625 63.921875 +L 10.984375 60.40625 +L 10.984375 69.390625 +L 28.421875 72.90625 +L 38.28125 72.90625 +L 38.28125 8.296875 +L 54.390625 8.296875 +L 54.390625 0 +L 12.40625 0 +z +" id="DejaVuSans-49"/> + </defs> + <use xlink:href="#DejaVuSans-49"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + <use x="127.246094" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_4"> + <g id="line2d_4"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="232.433923" xlink:href="#m7fab6e08c4" y="535.112188"/> + </g> + </g> + <g id="text_4"> + <!-- 150 --> + <g transform="translate(222.890173 549.710625)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-49"/> + <use x="63.623047" xlink:href="#DejaVuSans-53"/> + <use x="127.246094" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_5"> + <g id="line2d_5"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="288.898227" xlink:href="#m7fab6e08c4" y="535.112188"/> + </g> + </g> + <g id="text_5"> + <!-- 200 --> + <g transform="translate(279.354477 549.710625)scale(0.1 -0.1)"> + <defs> + <path d="M 19.1875 8.296875 +L 53.609375 8.296875 +L 53.609375 0 +L 7.328125 0 +L 7.328125 8.296875 +Q 12.9375 14.109375 22.625 23.890625 +Q 32.328125 33.6875 34.8125 36.53125 +Q 39.546875 41.84375 41.421875 45.53125 +Q 43.3125 49.21875 43.3125 52.78125 +Q 43.3125 58.59375 39.234375 62.25 +Q 35.15625 65.921875 28.609375 65.921875 +Q 23.96875 65.921875 18.8125 64.3125 +Q 13.671875 62.703125 7.8125 59.421875 +L 7.8125 69.390625 +Q 13.765625 71.78125 18.9375 73 +Q 24.125 74.21875 28.421875 74.21875 +Q 39.75 74.21875 46.484375 68.546875 +Q 53.21875 62.890625 53.21875 53.421875 +Q 53.21875 48.921875 51.53125 44.890625 +Q 49.859375 40.875 45.40625 35.40625 +Q 44.1875 33.984375 37.640625 27.21875 +Q 31.109375 20.453125 19.1875 8.296875 +z +" id="DejaVuSans-50"/> + </defs> + <use xlink:href="#DejaVuSans-50"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + <use x="127.246094" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_6"> + <g id="line2d_6"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="345.362531" xlink:href="#m7fab6e08c4" y="535.112188"/> + </g> + </g> + <g id="text_6"> + <!-- 250 --> + <g transform="translate(335.818781 549.710625)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-50"/> + <use x="63.623047" xlink:href="#DejaVuSans-53"/> + <use x="127.246094" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="text_7"> + <!-- t/ms --> + <g transform="translate(192.503481 563.38875)scale(0.1 -0.1)"> + <defs> + <path d="M 18.3125 70.21875 +L 18.3125 54.6875 +L 36.8125 54.6875 +L 36.8125 47.703125 +L 18.3125 47.703125 +L 18.3125 18.015625 +Q 18.3125 11.328125 20.140625 9.421875 +Q 21.96875 7.515625 27.59375 7.515625 +L 36.8125 7.515625 +L 36.8125 0 +L 27.59375 0 +Q 17.1875 0 13.234375 3.875 +Q 9.28125 7.765625 9.28125 18.015625 +L 9.28125 47.703125 +L 2.6875 47.703125 +L 2.6875 54.6875 +L 9.28125 54.6875 +L 9.28125 70.21875 +z +" id="DejaVuSans-116"/> + <path d="M 25.390625 72.90625 +L 33.6875 72.90625 +L 8.296875 -9.28125 +L 0 -9.28125 +z +" id="DejaVuSans-47"/> + <path d="M 52 44.1875 +Q 55.375 50.25 60.0625 53.125 +Q 64.75 56 71.09375 56 +Q 79.640625 56 84.28125 50.015625 +Q 88.921875 44.046875 88.921875 33.015625 +L 88.921875 0 +L 79.890625 0 +L 79.890625 32.71875 +Q 79.890625 40.578125 77.09375 44.375 +Q 74.3125 48.1875 68.609375 48.1875 +Q 61.625 48.1875 57.5625 43.546875 +Q 53.515625 38.921875 53.515625 30.90625 +L 53.515625 0 +L 44.484375 0 +L 44.484375 32.71875 +Q 44.484375 40.625 41.703125 44.40625 +Q 38.921875 48.1875 33.109375 48.1875 +Q 26.21875 48.1875 22.15625 43.53125 +Q 18.109375 38.875 18.109375 30.90625 +L 18.109375 0 +L 9.078125 0 +L 9.078125 54.6875 +L 18.109375 54.6875 +L 18.109375 46.1875 +Q 21.1875 51.21875 25.484375 53.609375 +Q 29.78125 56 35.6875 56 +Q 41.65625 56 45.828125 52.96875 +Q 50 49.953125 52 44.1875 +z +" id="DejaVuSans-109"/> + <path d="M 44.28125 53.078125 +L 44.28125 44.578125 +Q 40.484375 46.53125 36.375 47.5 +Q 32.28125 48.484375 27.875 48.484375 +Q 21.1875 48.484375 17.84375 46.4375 +Q 14.5 44.390625 14.5 40.28125 +Q 14.5 37.15625 16.890625 35.375 +Q 19.28125 33.59375 26.515625 31.984375 +L 29.59375 31.296875 +Q 39.15625 29.25 43.1875 25.515625 +Q 47.21875 21.78125 47.21875 15.09375 +Q 47.21875 7.46875 41.1875 3.015625 +Q 35.15625 -1.421875 24.609375 -1.421875 +Q 20.21875 -1.421875 15.453125 -0.5625 +Q 10.6875 0.296875 5.421875 2 +L 5.421875 11.28125 +Q 10.40625 8.6875 15.234375 7.390625 +Q 20.0625 6.109375 24.8125 6.109375 +Q 31.15625 6.109375 34.5625 8.28125 +Q 37.984375 10.453125 37.984375 14.40625 +Q 37.984375 18.0625 35.515625 20.015625 +Q 33.0625 21.96875 24.703125 23.78125 +L 21.578125 24.515625 +Q 13.234375 26.265625 9.515625 29.90625 +Q 5.8125 33.546875 5.8125 39.890625 +Q 5.8125 47.609375 11.28125 51.796875 +Q 16.75 56 26.8125 56 +Q 31.78125 56 36.171875 55.265625 +Q 40.578125 54.546875 44.28125 53.078125 +z +" id="DejaVuSans-115"/> + </defs> + <use xlink:href="#DejaVuSans-116"/> + <use x="39.208984" xlink:href="#DejaVuSans-47"/> + <use x="72.900391" xlink:href="#DejaVuSans-109"/> + <use x="170.3125" xlink:href="#DejaVuSans-115"/> + </g> + </g> + </g> + <g id="matplotlib.axis_2"> + <g id="ytick_1"> + <g id="line2d_7"> + <defs> + <path d="M 0 0 +L -3.5 0 +" id="m81b2cb8ec5" style="stroke:#000000;stroke-width:0.8;"/> + </defs> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m81b2cb8ec5" y="482.481401"/> + </g> + </g> + <g id="text_8"> + <!-- −60 --> + <g transform="translate(20.878125 486.28062)scale(0.1 -0.1)"> + <defs> + <path d="M 10.59375 35.5 +L 73.1875 35.5 +L 73.1875 27.203125 +L 10.59375 27.203125 +z +" id="DejaVuSans-8722"/> + <path d="M 33.015625 40.375 +Q 26.375 40.375 22.484375 35.828125 +Q 18.609375 31.296875 18.609375 23.390625 +Q 18.609375 15.53125 22.484375 10.953125 +Q 26.375 6.390625 33.015625 6.390625 +Q 39.65625 6.390625 43.53125 10.953125 +Q 47.40625 15.53125 47.40625 23.390625 +Q 47.40625 31.296875 43.53125 35.828125 +Q 39.65625 40.375 33.015625 40.375 +z +M 52.59375 71.296875 +L 52.59375 62.3125 +Q 48.875 64.0625 45.09375 64.984375 +Q 41.3125 65.921875 37.59375 65.921875 +Q 27.828125 65.921875 22.671875 59.328125 +Q 17.53125 52.734375 16.796875 39.40625 +Q 19.671875 43.65625 24.015625 45.921875 +Q 28.375 48.1875 33.59375 48.1875 +Q 44.578125 48.1875 50.953125 41.515625 +Q 57.328125 34.859375 57.328125 23.390625 +Q 57.328125 12.15625 50.6875 5.359375 +Q 44.046875 -1.421875 33.015625 -1.421875 +Q 20.359375 -1.421875 13.671875 8.265625 +Q 6.984375 17.96875 6.984375 36.375 +Q 6.984375 53.65625 15.1875 63.9375 +Q 23.390625 74.21875 37.203125 74.21875 +Q 40.921875 74.21875 44.703125 73.484375 +Q 48.484375 72.75 52.59375 71.296875 +z +" id="DejaVuSans-54"/> + </defs> + <use xlink:href="#DejaVuSans-8722"/> + <use x="83.789062" xlink:href="#DejaVuSans-54"/> + <use x="147.412109" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="ytick_2"> + <g id="line2d_8"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m81b2cb8ec5" y="423.906997"/> + </g> + </g> + <g id="text_9"> + <!-- −40 --> + <g transform="translate(20.878125 427.706215)scale(0.1 -0.1)"> + <defs> + <path d="M 37.796875 64.3125 +L 12.890625 25.390625 +L 37.796875 25.390625 +z +M 35.203125 72.90625 +L 47.609375 72.90625 +L 47.609375 25.390625 +L 58.015625 25.390625 +L 58.015625 17.1875 +L 47.609375 17.1875 +L 47.609375 0 +L 37.796875 0 +L 37.796875 17.1875 +L 4.890625 17.1875 +L 4.890625 26.703125 +z +" id="DejaVuSans-52"/> + </defs> + <use xlink:href="#DejaVuSans-8722"/> + <use x="83.789062" xlink:href="#DejaVuSans-52"/> + <use x="147.412109" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="ytick_3"> + <g id="line2d_9"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m81b2cb8ec5" y="365.332592"/> + </g> + </g> + <g id="text_10"> + <!-- −20 --> + <g transform="translate(20.878125 369.131811)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-8722"/> + <use x="83.789062" xlink:href="#DejaVuSans-50"/> + <use x="147.412109" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="ytick_4"> + <g id="line2d_10"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m81b2cb8ec5" y="306.758188"/> + </g> + </g> + <g id="text_11"> + <!-- 0 --> + <g transform="translate(35.620312 310.557406)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="ytick_5"> + <g id="line2d_11"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m81b2cb8ec5" y="248.183783"/> + </g> + </g> + <g id="text_12"> + <!-- 20 --> + <g transform="translate(29.257812 251.983002)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-50"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="text_13"> + <!-- U/mV --> + <g transform="translate(14.798438 388.086563)rotate(-90)scale(0.1 -0.1)"> + <defs> + <path d="M 8.6875 72.90625 +L 18.609375 72.90625 +L 18.609375 28.609375 +Q 18.609375 16.890625 22.84375 11.734375 +Q 27.09375 6.59375 36.625 6.59375 +Q 46.09375 6.59375 50.34375 11.734375 +Q 54.59375 16.890625 54.59375 28.609375 +L 54.59375 72.90625 +L 64.5 72.90625 +L 64.5 27.390625 +Q 64.5 13.140625 57.4375 5.859375 +Q 50.390625 -1.421875 36.625 -1.421875 +Q 22.796875 -1.421875 15.734375 5.859375 +Q 8.6875 13.140625 8.6875 27.390625 +z +" id="DejaVuSans-85"/> + <path d="M 28.609375 0 +L 0.78125 72.90625 +L 11.078125 72.90625 +L 34.1875 11.53125 +L 57.328125 72.90625 +L 67.578125 72.90625 +L 39.796875 0 +z +" id="DejaVuSans-86"/> + </defs> + <use xlink:href="#DejaVuSans-85"/> + <use x="73.193359" xlink:href="#DejaVuSans-47"/> + <use x="106.884766" xlink:href="#DejaVuSans-109"/> + <use x="204.296875" xlink:href="#DejaVuSans-86"/> + </g> + </g> + </g> + <g id="line2d_12"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.170299 504.339319 +L 65.299585 241.422247 +L 67.558157 422.875501 +L 68.687443 475.800697 +L 69.788497 489.08918 +L 70.917783 494.598688 +L 72.047069 498.912107 +L 73.176355 502.39787 +L 74.333873 505.126266 +L 75.434927 506.991861 +L 76.564213 508.279033 +L 77.693499 509.068323 +L 78.822785 509.492402 +L 79.980304 509.669882 +L 82.238876 509.608672 +L 91.273164 508.715998 +L 96.919595 508.504545 +L 107.083169 508.396768 +L 144.321378 508.372459 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f77189;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_13"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 69.788497 508.937995 +L 70.941001 471.963195 +L 72.047069 442.502906 +L 73.176355 271.09809 +L 74.333873 321.235935 +L 75.434927 438.729835 +L 76.564213 515.020361 +L 77.693499 520.345946 +L 78.822785 519.045887 +L 81.081358 515.591462 +L 82.238876 514.109822 +L 83.368162 512.916076 +L 84.497448 511.95487 +L 85.626734 511.194281 +L 86.75602 510.597994 +L 89.014592 509.769752 +L 91.273164 509.263962 +L 94.661023 508.839883 +L 99.178167 508.578348 +L 107.083169 508.425176 +L 126.281033 508.374802 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f77277;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_14"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 77.693499 508.526217 +L 78.826964 491.20723 +L 79.980304 450.891053 +L 81.081358 339.59002 +L 82.238876 285.373024 +L 83.368162 411.584699 +L 84.497448 508.330579 +L 85.626734 520.387534 +L 86.75602 519.493689 +L 89.014592 516.010855 +L 90.143878 514.500806 +L 91.273164 513.237649 +L 92.40245 512.213183 +L 93.531736 511.398706 +L 94.661023 510.758488 +L 96.919595 509.868157 +L 99.178167 509.324293 +L 102.566025 508.870049 +L 107.083169 508.590942 +L 113.858886 508.43982 +L 129.668891 508.377438 +L 278.70642 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f7745f;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_15"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 86.745744 508.404675 +L 87.87503 457.004464 +L 89.014592 383.153562 +L 90.143878 259.733191 +L 91.273164 389.303581 +L 92.40245 497.634599 +L 93.531736 520.139179 +L 94.661023 519.829613 +L 98.048881 514.793971 +L 99.178167 513.479269 +L 100.307453 512.407357 +L 101.436739 511.552171 +L 102.566025 510.878858 +L 104.824597 509.941375 +L 107.083169 509.369396 +L 109.341741 509.016192 +L 112.7296 508.714827 +L 118.37603 508.498101 +L 128.539605 508.39501 +L 168.036385 508.372459 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f87638;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_16"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 94.661023 508.380953 +L 96.919595 411.82544 +L 98.048881 240.295568 +L 99.178167 368.80049 +L 100.307453 482.80561 +L 101.436739 519.54787 +L 102.566025 520.090562 +L 105.953883 515.055213 +L 107.083169 513.695701 +L 108.212455 512.581909 +L 109.341741 511.690699 +L 110.471028 510.987221 +L 112.7296 510.007564 +L 114.988172 509.409812 +L 117.246744 509.041379 +L 120.634602 508.727713 +L 126.281033 508.502494 +L 136.444607 508.395596 +L 174.812102 508.372459 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#e98132;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_17"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 102.566025 508.374802 +L 104.8089 429.37316 +L 105.953883 229.199819 +L 108.212455 464.981712 +L 109.341741 518.450771 +L 110.471028 520.296158 +L 111.600314 518.728414 +L 113.858886 515.307083 +L 114.988172 513.905983 +L 116.117458 512.752068 +L 117.246744 511.825713 +L 118.37603 511.093533 +L 119.505316 510.519797 +L 121.763888 509.722599 +L 124.02246 509.234967 +L 127.410319 508.825239 +L 131.927463 508.572198 +L 139.804233 508.423712 +L 160.131383 508.374217 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#dc8932;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_18"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 110.471028 508.373045 +L 112.7296 438.621766 +L 113.858886 234.25684 +L 114.988172 327.293495 +L 116.117458 446.322543 +L 117.246744 516.555011 +L 118.37603 520.440837 +L 119.505316 519.017186 +L 121.763888 515.557196 +L 122.893174 514.115973 +L 124.02246 512.922812 +L 125.151747 511.961606 +L 126.281033 511.200432 +L 127.410319 510.603266 +L 129.668891 509.773559 +L 131.927463 509.266305 +L 135.315321 508.841055 +L 139.804233 508.579813 +L 147.737468 508.425176 +L 166.907099 508.374802 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#d18e32;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_19"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 118.37603 508.372459 +L 119.505316 481.574084 +L 120.634602 445.877963 +L 121.763888 268.333671 +L 122.893174 305.584406 +L 124.02246 427.892106 +L 125.151747 513.326682 +L 126.281033 520.506733 +L 127.410319 519.297757 +L 129.668891 515.811994 +L 130.798177 514.331233 +L 131.927463 513.098535 +L 133.056749 512.101892 +L 134.186035 511.310844 +L 135.315321 510.689663 +L 137.545661 509.834476 +L 139.804233 509.303792 +L 143.192092 508.859798 +L 147.737468 508.58567 +L 154.484952 508.438356 +L 171.424243 508.37656 +L 319.360719 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#c79332;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_20"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 126.281033 508.372459 +L 127.403317 493.046174 +L 128.539605 451.478554 +L 129.668891 326.389136 +L 130.798177 283.646953 +L 131.927463 409.826295 +L 133.056749 507.920265 +L 134.186035 520.455773 +L 135.315321 519.567785 +L 137.545661 516.112188 +L 138.674947 514.586911 +L 139.804233 513.308524 +L 140.933519 512.27 +L 142.091038 511.425357 +L 143.192092 510.793632 +L 145.450664 509.889244 +L 147.737468 509.332201 +L 151.097094 508.876492 +L 155.614238 508.593578 +L 162.389955 508.440698 +L 178.19996 508.377438 +L 327.265721 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#be9732;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_21"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 135.291267 508.372166 +L 136.444607 456.259983 +L 137.545661 382.200556 +L 138.674947 259.243802 +L 139.804233 388.767333 +L 140.933519 497.409967 +L 142.091038 520.228212 +L 143.192092 519.86095 +L 146.57995 514.814472 +L 147.737468 513.466382 +L 148.838522 512.420829 +L 149.967808 511.562714 +L 151.097094 510.887059 +L 153.383898 509.937275 +L 155.614238 509.372324 +L 157.87281 509.017949 +L 161.260669 508.715705 +L 166.907099 508.498394 +L 177.070674 508.39501 +L 216.595686 508.372459 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#b69a32;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_22"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 304.68 508.372166 +L 306.938572 429.57612 +L 308.067858 228.618175 +L 310.32643 462.991939 +L 311.483949 518.52809 +L 312.585002 520.319588 +L 313.714289 518.763559 +L 315.972861 515.33637 +L 317.130379 513.898662 +L 318.231433 512.771983 +L 319.360719 511.841528 +L 320.490005 511.105834 +L 321.619291 510.529462 +L 323.877863 509.728457 +L 326.136435 509.238482 +L 329.524294 508.82729 +L 334.06967 508.571905 +L 341.94644 508.423712 +L 344.205013 508.407604 +L 344.205013 508.407604 +" style="fill:none;stroke:#ae9d31;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_23"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 312.585002 508.372166 +L 314.843575 439.435071 +L 315.972861 235.966334 +L 317.130379 328.513776 +L 318.231433 444.480963 +L 319.360719 516.311927 +L 320.490005 520.453723 +L 321.619291 519.047059 +L 323.877863 515.583554 +L 325.007149 514.137938 +L 326.136435 512.94097 +L 327.265721 511.975957 +L 328.42324 511.194867 +L 329.524294 510.612052 +L 331.782866 509.778831 +L 334.06967 509.264547 +L 337.429296 508.842812 +L 341.94644 508.57952 +L 344.205013 508.511574 +L 344.205013 508.511574 +" style="fill:none;stroke:#a5a031;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_24"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 320.490005 508.372166 +L 321.646394 481.072979 +L 322.776809 445.478192 +L 323.877863 273.069412 +L 325.007149 303.528834 +L 326.136435 426.184955 +L 327.265721 512.930719 +L 328.42324 520.506733 +L 329.524294 519.324409 +L 331.782866 515.836596 +L 332.912152 514.35232 +L 334.06967 513.087992 +L 335.170724 512.115657 +L 336.30001 511.321681 +L 337.429296 510.698156 +L 339.7161 509.823054 +L 341.94644 509.301742 +L 344.205013 508.973726 +L 344.205013 508.973726 +" style="fill:none;stroke:#9ca231;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_25"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 328.42324 508.372166 +L 329.534457 493.046174 +L 330.663743 451.672729 +L 331.782866 331.643758 +L 332.912152 281.663448 +L 334.06967 411.000419 +L 335.170724 507.280047 +L 336.30001 520.444058 +L 337.429296 519.592094 +L 339.7161 516.054492 +L 340.817154 514.57256 +L 341.94644 513.296517 +L 343.075726 512.260335 +L 344.205013 511.435901 +L 344.205013 511.435901 +" style="fill:none;stroke:#92a531;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_26"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 336.30001 508.372166 +L 337.449623 506.731205 +L 338.578909 456.159528 +L 339.7161 373.281432 +L 340.817154 260.584863 +L 341.94644 389.999152 +L 343.075726 498.169384 +L 344.205013 520.196581 +L 344.205013 520.196581 +" style="fill:none;stroke:#86a831;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_27"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#77ab31;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_28"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#63ae31;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_29"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#42b231;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_30"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#32b252;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_31"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#33b16b;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_32"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#33b07a;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_33"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#34af86;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_34"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#34af8f;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_35"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#35ae97;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_36"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#35ad9e;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_37"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#36ada4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_38"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#36acaa;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_39"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#37abb0;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_40"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#37abb7;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_41"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#37aabe;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_42"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 223.371403 508.372166 +L 224.510852 487.43006 +L 225.640138 449.206746 +L 226.787493 294.023175 +L 227.888547 291.848951 +L 229.017833 416.575531 +L 230.147119 510.272613 +L 231.276405 520.492675 +L 232.433923 519.426621 +L 234.664263 515.973953 +L 235.79355 514.468883 +L 236.922836 513.211291 +L 238.080354 512.169545 +L 239.181408 511.382012 +L 240.310694 510.745601 +L 242.569266 509.859956 +L 244.827838 509.319315 +L 248.215696 508.867413 +L 252.732841 508.590063 +L 259.508557 508.439527 +L 275.318562 508.377438 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#38a9c5;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_43"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 231.276405 508.372166 +L 232.433923 498.917379 +L 233.534977 454.518273 +L 235.79355 270.236168 +L 236.922836 398.543108 +L 238.080354 504.322039 +L 239.181408 520.340089 +L 240.310694 519.729158 +L 242.569266 516.235487 +L 243.726784 514.6572 +L 244.827838 513.395507 +L 245.957124 512.339997 +L 247.08641 511.498575 +L 248.215696 510.836977 +L 250.474268 509.915602 +L 252.732841 509.353581 +L 255.019645 509.00272 +L 258.379271 508.709848 +L 264.025701 508.496344 +L 274.189276 508.394718 +L 313.714289 508.372459 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#39a8ce;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_44"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 240.310694 508.372166 +L 241.43998 459.104942 +L 242.569266 397.241585 +L 243.726784 253.189844 +L 244.827838 380.064933 +L 245.957124 491.556041 +L 247.08641 519.956134 +L 248.215696 519.971363 +L 251.603555 514.922835 +L 252.732841 513.585874 +L 253.862127 512.493169 +L 255.019645 511.600788 +L 256.120699 510.931868 +L 258.379271 509.973591 +L 260.666075 509.383454 +L 262.896415 509.0282 +L 266.312506 508.71922 +L 271.958936 508.499566 +L 282.094278 508.395303 +L 319.360719 508.372459 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#3aa6d9;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_45"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 248.215696 508.372166 +L 250.474268 419.184728 +L 251.603555 234.547955 +L 253.862127 476.064575 +L 255.019645 519.356332 +L 256.120699 520.186331 +L 260.666075 513.751054 +L 261.767129 512.651905 +L 262.896415 511.746052 +L 264.025701 511.030859 +L 265.154987 510.470887 +L 267.41356 509.692726 +L 269.672132 509.216516 +L 273.05999 508.81616 +L 277.605366 508.567512 +L 285.482137 508.42254 +L 305.837518 508.374217 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#3ba4e6;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_46"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 256.120699 508.372166 +L 258.379271 432.598267 +L 259.508557 228.397642 +L 261.767129 458.066418 +L 262.896415 517.870592 +L 264.025701 520.361468 +L 265.154987 518.839705 +L 267.41356 515.401974 +L 268.542846 513.985352 +L 269.672132 512.816499 +L 270.801418 511.876966 +L 271.958936 511.117256 +L 273.05999 510.551134 +L 275.318562 509.741636 +L 277.605366 509.241996 +L 280.964992 508.83139 +L 285.482137 508.574834 +L 293.387139 508.424005 +L 313.714289 508.374217 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#4aa0f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_47"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 264.025701 508.372166 +L 266.312506 440.299337 +L 267.41356 242.586413 +L 268.542846 319.456972 +L 269.672132 439.553391 +L 270.801418 515.574475 +L 271.958936 520.464267 +L 273.05999 519.121741 +L 275.318562 515.650622 +L 276.447848 514.194755 +L 277.605366 512.960007 +L 278.70642 512.012859 +L 279.835706 511.240555 +L 280.964992 510.634896 +L 283.251797 509.784688 +L 285.482137 509.27802 +L 288.898227 508.844276 +L 293.387139 508.581277 +L 301.292142 508.425762 +L 320.490005 508.374802 +L 344.205013 508.372459 +L 344.205013 508.372459 +" style="fill:none;stroke:#6e9bf4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_48"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 271.958936 508.372166 +L 273.078058 484.103033 +L 274.207345 447.433113 +L 275.318562 287.903145 +L 276.447848 297.693213 +L 277.605366 424.200747 +L 278.70642 511.692457 +L 279.835706 520.505269 +L 280.964992 519.397041 +L 283.251797 515.864711 +L 284.352851 514.410309 +L 285.482137 513.16326 +L 286.611423 512.15373 +L 287.740709 511.351554 +L 288.898227 510.707821 +L 291.128567 509.845606 +L 293.387139 509.310528 +L 296.774997 508.86302 +L 301.292142 508.588013 +L 308.067858 508.438941 +L 323.877863 508.377438 +L 344.205013 508.372459 +L 344.205013 508.372459 +" style="fill:none;stroke:#8795f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_49"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 279.835706 508.372166 +L 280.966122 497.25738 +L 282.095408 453.218507 +L 283.251797 337.852996 +L 284.352851 275.898848 +L 285.482137 403.363196 +L 286.611423 505.2358 +L 287.740709 520.399249 +L 288.898227 519.620795 +L 291.128567 516.165198 +L 292.257853 514.632306 +L 293.387139 513.346012 +L 294.544657 512.276736 +L 295.645711 511.467238 +L 296.774997 510.812083 +L 299.03357 509.900666 +L 301.292142 509.344502 +L 303.550714 509.000377 +L 306.938572 508.706919 +L 312.585002 508.495173 +L 322.776809 508.394425 +L 344.205013 508.373045 +L 344.205013 508.373045 +" style="fill:none;stroke:#9b8ff4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_50"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 288.898227 508.372166 +L 290.011703 457.589329 +L 291.140989 386.892073 +L 292.257853 255.309945 +L 293.387139 385.064845 +L 294.544657 496.912084 +L 295.645711 520.087633 +L 296.774997 519.908981 +L 300.191088 514.82443 +L 301.292142 513.534329 +L 302.421428 512.451581 +L 303.550714 511.587316 +L 304.68 510.906095 +L 306.938572 509.958068 +L 309.197144 509.379353 +L 311.483949 509.018828 +L 314.843575 508.718048 +L 320.490005 508.49898 +L 330.65358 508.39501 +L 344.205013 508.374802 +L 344.205013 508.374802 +" style="fill:none;stroke:#ac89f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_51"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 296.774997 508.372166 +L 299.03357 414.393635 +L 300.191088 240.434389 +L 301.292142 366.038414 +L 302.421428 480.538488 +L 303.550714 519.453565 +L 304.68 520.13215 +L 308.067858 515.095337 +L 309.197144 513.729381 +L 310.32643 512.608853 +L 311.483949 511.692164 +L 312.585002 511.003914 +L 314.843575 510.017521 +L 317.130379 509.410105 +L 319.360719 509.045186 +L 322.776809 508.727713 +L 328.42324 508.502494 +L 338.558582 508.395889 +L 344.205013 508.381831 +L 344.205013 508.381831 +" style="fill:none;stroke:#bc82f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_52"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 143.192092 508.372166 +L 144.336397 461.181112 +L 145.450664 410.367523 +L 146.57995 241.100087 +L 147.737468 372.913291 +L 148.838522 483.7346 +L 149.967808 519.613473 +L 151.097094 520.089976 +L 154.484952 515.048184 +L 155.614238 513.689844 +L 156.743524 512.577223 +L 157.87281 511.686599 +L 159.030329 510.96877 +L 161.260669 510.005514 +L 163.519241 509.408641 +L 165.777813 509.0405 +L 169.165671 508.72742 +L 174.812102 508.502202 +L 184.975676 508.395596 +L 224.500689 508.372459 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#cc7af4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_53"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 151.097094 508.372166 +L 153.383898 424.939956 +L 154.484952 229.550093 +L 156.743524 466.624431 +L 157.87281 518.585785 +L 159.030329 520.257792 +L 160.131383 518.706742 +L 162.389955 515.288046 +L 163.519241 513.889875 +L 164.676759 512.713408 +L 165.777813 511.81517 +L 166.907099 511.085333 +L 168.036385 510.513354 +L 170.323189 509.711177 +L 172.553529 509.232332 +L 175.96962 508.821725 +L 180.458532 508.571612 +L 188.363534 508.423419 +L 208.690684 508.374217 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#dc6ff4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_54"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 159.030329 508.372166 +L 161.269138 437.341036 +L 162.389955 232.489943 +L 163.519241 329.409232 +L 164.676759 451.071169 +L 165.777813 516.797216 +L 166.907099 520.432343 +L 168.036385 518.99112 +L 170.323189 515.495107 +L 171.424243 514.09635 +L 172.553529 512.906704 +L 173.682815 511.94872 +L 174.812102 511.190181 +L 175.96962 510.582472 +L 178.19996 509.76858 +L 180.458532 509.263376 +L 183.84639 508.83959 +L 188.363534 508.578348 +L 196.268537 508.424883 +L 215.494632 508.374802 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#ee61f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_55"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 166.907099 508.372166 +L 168.05547 479.659579 +L 169.184756 444.515229 +L 170.323189 255.775026 +L 171.424243 307.913079 +L 172.553529 429.822719 +L 173.682815 513.757497 +L 174.812102 520.505561 +L 175.96962 519.226296 +L 178.19996 515.785343 +L 179.329246 514.308682 +L 180.458532 513.080084 +L 181.61605 512.06499 +L 182.717104 511.299129 +L 183.84639 510.680584 +L 186.104962 509.820711 +L 188.363534 509.295299 +L 191.751393 508.855405 +L 196.268537 508.584792 +L 204.201772 508.426348 +L 223.371403 508.374802 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f55ee9;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_56"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 174.812102 508.372166 +L 175.96962 489.322013 +L 177.070674 450.920926 +L 178.19996 319.87162 +L 179.329246 286.027505 +L 180.458532 411.789124 +L 181.61605 509.631223 +L 182.717104 520.469245 +L 183.84639 519.539377 +L 186.104962 516.04307 +L 187.262481 514.493192 +L 188.363534 513.259908 +L 189.492821 512.231048 +L 190.622107 511.412764 +L 191.751393 510.769324 +L 194.009965 509.8746 +L 196.268537 509.328394 +L 199.656395 508.872099 +L 204.201772 508.590649 +L 210.949256 508.440113 +L 226.787493 508.377438 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f562da;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_57"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 182.717104 508.372166 +L 183.858812 504.325554 +L 184.975676 455.757122 +L 186.104962 371.73331 +L 187.262481 267.926872 +L 188.363534 393.680261 +L 189.492821 500.326972 +L 190.622107 520.264821 +L 191.751393 519.79564 +L 195.139251 514.753262 +L 196.268537 513.445588 +L 197.397823 512.38012 +L 198.555341 511.511755 +L 199.656395 510.861872 +L 201.914967 509.930831 +L 204.201772 509.357388 +L 206.432112 509.012092 +L 209.848202 508.711019 +L 215.494632 508.496637 +L 225.629975 508.394718 +L 265.154987 508.372459 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f565cc;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_58"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 191.751393 508.372166 +L 192.908911 459.597553 +L 194.009965 404.266999 +L 195.139251 245.502247 +L 196.268537 375.020799 +L 197.397823 487.791757 +L 198.555341 519.894923 +L 199.656395 520.031695 +L 203.044253 514.985217 +L 204.201772 513.606961 +L 205.302826 512.534757 +L 206.432112 511.653212 +L 207.561398 510.957934 +L 208.690684 510.413777 +L 210.949256 509.658167 +L 213.207828 509.195137 +L 216.595686 508.805324 +L 221.141063 508.562826 +L 229.017833 508.421369 +L 249.373215 508.374217 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f668c0;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_59"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 199.656395 508.372166 +L 201.914967 423.37602 +L 203.044253 231.652036 +L 205.302826 471.420796 +L 206.432112 518.920538 +L 207.561398 520.237584 +L 212.078542 513.835987 +L 213.207828 512.69525 +L 214.337114 511.780318 +L 215.494632 511.041988 +L 217.724972 510.050323 +L 219.983544 509.436171 +L 222.242117 509.057487 +L 225.629975 508.735913 +L 231.276405 508.505423 +L 241.43998 508.396182 +L 277.605366 508.372459 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f66ab3;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_60"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 207.561398 508.372166 +L 209.848202 433.696537 +L 210.949256 229.584945 +L 212.078542 335.048073 +L 213.207828 453.135917 +L 214.337114 517.374174 +L 215.494632 520.377284 +L 216.595686 518.915266 +L 218.854258 515.467284 +L 219.983544 514.040412 +L 221.141063 512.83495 +L 222.242117 511.912403 +L 223.371403 511.161772 +L 224.500689 510.5731 +L 226.787493 509.747201 +L 229.017833 509.254883 +L 232.433923 508.832854 +L 236.922836 508.576591 +L 244.827838 508.424591 +L 264.025701 508.374802 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f66ca7;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_61"> + <path clip-path="url(#p5214499835)" d="M 63.041013 497.125002 +L 64.142066 504.223634 +L 65.299585 507.357365 +L 66.428871 508.518017 +L 67.558157 508.902265 +L 68.687443 508.976947 +L 73.176355 508.713069 +L 78.822785 508.498394 +L 89.014592 508.394425 +L 128.539605 508.372166 +L 215.494632 508.372166 +L 216.622789 477.018752 +L 217.752075 442.354127 +L 218.854258 251.605993 +L 219.983544 313.69902 +L 221.141063 437.535796 +L 222.242117 514.728075 +L 223.371403 520.495018 +L 224.500689 519.195838 +L 226.787493 515.678152 +L 227.888547 514.251572 +L 229.017833 513.033518 +L 230.147119 512.04976 +L 231.276405 511.269842 +L 232.433923 510.644268 +L 234.664263 509.806654 +L 236.922836 509.286513 +L 240.310694 508.851305 +L 244.827838 508.583034 +L 252.732841 508.426055 +L 271.958936 508.374802 +L 344.205013 508.372166 +L 344.205013 508.372166 +" style="fill:none;stroke:#f76e9a;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_62"/> + <g id="line2d_63"/> + <g id="line2d_64"/> + <g id="line2d_65"/> + <g id="line2d_66"/> + <g id="line2d_67"/> + <g id="line2d_68"/> + <g id="line2d_69"/> + <g id="line2d_70"/> + <g id="line2d_71"/> + <g id="line2d_72"/> + <g id="line2d_73"/> + <g id="line2d_74"/> + <g id="line2d_75"/> + <g id="line2d_76"/> + <g id="line2d_77"/> + <g id="line2d_78"/> + <g id="line2d_79"/> + <g id="line2d_80"/> + <g id="line2d_81"/> + <g id="line2d_82"/> + <g id="line2d_83"/> + <g id="line2d_84"/> + <g id="line2d_85"/> + <g id="line2d_86"/> + <g id="line2d_87"/> + <g id="line2d_88"/> + <g id="line2d_89"/> + <g id="line2d_90"/> + <g id="line2d_91"/> + <g id="line2d_92"/> + <g id="line2d_93"/> + <g id="line2d_94"/> + <g id="line2d_95"/> + <g id="line2d_96"/> + <g id="line2d_97"/> + <g id="line2d_98"/> + <g id="line2d_99"/> + <g id="line2d_100"/> + <g id="line2d_101"/> + <g id="line2d_102"/> + <g id="line2d_103"/> + <g id="line2d_104"/> + <g id="line2d_105"/> + <g id="line2d_106"/> + <g id="line2d_107"/> + <g id="line2d_108"/> + <g id="line2d_109"/> + <g id="line2d_110"/> + <g id="line2d_111"/> + <g id="patch_3"> + <path d="M 48.982813 535.112188 +L 48.982813 213.792188 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + <g id="patch_4"> + <path d="M 48.982813 535.112188 +L 358.263213 535.112188 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + </g> + <g id="legend_1"> + <g id="text_14"> + <!-- Cell --> + <g transform="translate(384.97285 18.798438)scale(0.1 -0.1)"> + <defs> + <path d="M 64.40625 67.28125 +L 64.40625 56.890625 +Q 59.421875 61.53125 53.78125 63.8125 +Q 48.140625 66.109375 41.796875 66.109375 +Q 29.296875 66.109375 22.65625 58.46875 +Q 16.015625 50.828125 16.015625 36.375 +Q 16.015625 21.96875 22.65625 14.328125 +Q 29.296875 6.6875 41.796875 6.6875 +Q 48.140625 6.6875 53.78125 8.984375 +Q 59.421875 11.28125 64.40625 15.921875 +L 64.40625 5.609375 +Q 59.234375 2.09375 53.4375 0.328125 +Q 47.65625 -1.421875 41.21875 -1.421875 +Q 24.65625 -1.421875 15.125 8.703125 +Q 5.609375 18.84375 5.609375 36.375 +Q 5.609375 53.953125 15.125 64.078125 +Q 24.65625 74.21875 41.21875 74.21875 +Q 47.75 74.21875 53.53125 72.484375 +Q 59.328125 70.75 64.40625 67.28125 +z +" id="DejaVuSans-67"/> + <path d="M 56.203125 29.59375 +L 56.203125 25.203125 +L 14.890625 25.203125 +Q 15.484375 15.921875 20.484375 11.0625 +Q 25.484375 6.203125 34.421875 6.203125 +Q 39.59375 6.203125 44.453125 7.46875 +Q 49.3125 8.734375 54.109375 11.28125 +L 54.109375 2.78125 +Q 49.265625 0.734375 44.1875 -0.34375 +Q 39.109375 -1.421875 33.890625 -1.421875 +Q 20.796875 -1.421875 13.15625 6.1875 +Q 5.515625 13.8125 5.515625 26.8125 +Q 5.515625 40.234375 12.765625 48.109375 +Q 20.015625 56 32.328125 56 +Q 43.359375 56 49.78125 48.890625 +Q 56.203125 41.796875 56.203125 29.59375 +z +M 47.21875 32.234375 +Q 47.125 39.59375 43.09375 43.984375 +Q 39.0625 48.390625 32.421875 48.390625 +Q 24.90625 48.390625 20.390625 44.140625 +Q 15.875 39.890625 15.1875 32.171875 +z +" id="DejaVuSans-101"/> + <path d="M 9.421875 75.984375 +L 18.40625 75.984375 +L 18.40625 0 +L 9.421875 0 +z +" id="DejaVuSans-108"/> + </defs> + <use xlink:href="#DejaVuSans-67"/> + <use x="69.824219" xlink:href="#DejaVuSans-101"/> + <use x="131.347656" xlink:href="#DejaVuSans-108"/> + <use x="159.130859" xlink:href="#DejaVuSans-108"/> + </g> + </g> + <g id="line2d_112"> + <path d="M 363.763475 29.976563 +L 383.763475 29.976563 +" style="fill:none;stroke:#f77189;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_113"/> + <g id="text_15"> + <!-- cell 0 --> + <g transform="translate(391.763475 33.476563)scale(0.1 -0.1)"> + <defs> + <path d="M 48.78125 52.59375 +L 48.78125 44.1875 +Q 44.96875 46.296875 41.140625 47.34375 +Q 37.3125 48.390625 33.40625 48.390625 +Q 24.65625 48.390625 19.8125 42.84375 +Q 14.984375 37.3125 14.984375 27.296875 +Q 14.984375 17.28125 19.8125 11.734375 +Q 24.65625 6.203125 33.40625 6.203125 +Q 37.3125 6.203125 41.140625 7.25 +Q 44.96875 8.296875 48.78125 10.40625 +L 48.78125 2.09375 +Q 45.015625 0.34375 40.984375 -0.53125 +Q 36.96875 -1.421875 32.421875 -1.421875 +Q 20.0625 -1.421875 12.78125 6.34375 +Q 5.515625 14.109375 5.515625 27.296875 +Q 5.515625 40.671875 12.859375 48.328125 +Q 20.21875 56 33.015625 56 +Q 37.15625 56 41.109375 55.140625 +Q 45.0625 54.296875 48.78125 52.59375 +z +" id="DejaVuSans-99"/> + <path id="DejaVuSans-32"/> + </defs> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-48"/> + </g> + </g> + <g id="line2d_114"> + <path d="M 363.763475 44.654688 +L 383.763475 44.654688 +" style="fill:none;stroke:#f77277;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_115"/> + <g id="text_16"> + <!-- cell 1 --> + <g transform="translate(391.763475 48.154688)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + </g> + </g> + <g id="line2d_116"> + <path d="M 363.763475 59.332813 +L 383.763475 59.332813 +" style="fill:none;stroke:#f7745f;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_117"/> + <g id="text_17"> + <!-- cell 2 --> + <g transform="translate(391.763475 62.832813)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + </g> + </g> + <g id="line2d_118"> + <path d="M 363.763475 74.010938 +L 383.763475 74.010938 +" style="fill:none;stroke:#f87638;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_119"/> + <g id="text_18"> + <!-- cell 3 --> + <g transform="translate(391.763475 77.510938)scale(0.1 -0.1)"> + <defs> + <path d="M 40.578125 39.3125 +Q 47.65625 37.796875 51.625 33 +Q 55.609375 28.21875 55.609375 21.1875 +Q 55.609375 10.40625 48.1875 4.484375 +Q 40.765625 -1.421875 27.09375 -1.421875 +Q 22.515625 -1.421875 17.65625 -0.515625 +Q 12.796875 0.390625 7.625 2.203125 +L 7.625 11.71875 +Q 11.71875 9.328125 16.59375 8.109375 +Q 21.484375 6.890625 26.8125 6.890625 +Q 36.078125 6.890625 40.9375 10.546875 +Q 45.796875 14.203125 45.796875 21.1875 +Q 45.796875 27.640625 41.28125 31.265625 +Q 36.765625 34.90625 28.71875 34.90625 +L 20.21875 34.90625 +L 20.21875 43.015625 +L 29.109375 43.015625 +Q 36.375 43.015625 40.234375 45.921875 +Q 44.09375 48.828125 44.09375 54.296875 +Q 44.09375 59.90625 40.109375 62.90625 +Q 36.140625 65.921875 28.71875 65.921875 +Q 24.65625 65.921875 20.015625 65.03125 +Q 15.375 64.15625 9.8125 62.3125 +L 9.8125 71.09375 +Q 15.4375 72.65625 20.34375 73.4375 +Q 25.25 74.21875 29.59375 74.21875 +Q 40.828125 74.21875 47.359375 69.109375 +Q 53.90625 64.015625 53.90625 55.328125 +Q 53.90625 49.265625 50.4375 45.09375 +Q 46.96875 40.921875 40.578125 39.3125 +z +" id="DejaVuSans-51"/> + </defs> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + </g> + </g> + <g id="line2d_120"> + <path d="M 363.763475 88.689063 +L 383.763475 88.689063 +" style="fill:none;stroke:#e98132;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_121"/> + <g id="text_19"> + <!-- cell 4 --> + <g transform="translate(391.763475 92.189063)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + </g> + </g> + <g id="line2d_122"> + <path d="M 363.763475 103.367188 +L 383.763475 103.367188 +" style="fill:none;stroke:#dc8932;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_123"/> + <g id="text_20"> + <!-- cell 5 --> + <g transform="translate(391.763475 106.867188)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-53"/> + </g> + </g> + <g id="line2d_124"> + <path d="M 363.763475 118.045313 +L 383.763475 118.045313 +" style="fill:none;stroke:#d18e32;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_125"/> + <g id="text_21"> + <!-- cell 6 --> + <g transform="translate(391.763475 121.545313)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-54"/> + </g> + </g> + <g id="line2d_126"> + <path d="M 363.763475 132.723438 +L 383.763475 132.723438 +" style="fill:none;stroke:#c79332;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_127"/> + <g id="text_22"> + <!-- cell 7 --> + <g transform="translate(391.763475 136.223438)scale(0.1 -0.1)"> + <defs> + <path d="M 8.203125 72.90625 +L 55.078125 72.90625 +L 55.078125 68.703125 +L 28.609375 0 +L 18.3125 0 +L 43.21875 64.59375 +L 8.203125 64.59375 +z +" id="DejaVuSans-55"/> + </defs> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-55"/> + </g> + </g> + <g id="line2d_128"> + <path d="M 363.763475 147.401563 +L 383.763475 147.401563 +" style="fill:none;stroke:#be9732;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_129"/> + <g id="text_23"> + <!-- cell 8 --> + <g transform="translate(391.763475 150.901563)scale(0.1 -0.1)"> + <defs> + <path d="M 31.78125 34.625 +Q 24.75 34.625 20.71875 30.859375 +Q 16.703125 27.09375 16.703125 20.515625 +Q 16.703125 13.921875 20.71875 10.15625 +Q 24.75 6.390625 31.78125 6.390625 +Q 38.8125 6.390625 42.859375 10.171875 +Q 46.921875 13.96875 46.921875 20.515625 +Q 46.921875 27.09375 42.890625 30.859375 +Q 38.875 34.625 31.78125 34.625 +z +M 21.921875 38.8125 +Q 15.578125 40.375 12.03125 44.71875 +Q 8.5 49.078125 8.5 55.328125 +Q 8.5 64.0625 14.71875 69.140625 +Q 20.953125 74.21875 31.78125 74.21875 +Q 42.671875 74.21875 48.875 69.140625 +Q 55.078125 64.0625 55.078125 55.328125 +Q 55.078125 49.078125 51.53125 44.71875 +Q 48 40.375 41.703125 38.8125 +Q 48.828125 37.15625 52.796875 32.3125 +Q 56.78125 27.484375 56.78125 20.515625 +Q 56.78125 9.90625 50.3125 4.234375 +Q 43.84375 -1.421875 31.78125 -1.421875 +Q 19.734375 -1.421875 13.25 4.234375 +Q 6.78125 9.90625 6.78125 20.515625 +Q 6.78125 27.484375 10.78125 32.3125 +Q 14.796875 37.15625 21.921875 38.8125 +z +M 18.3125 54.390625 +Q 18.3125 48.734375 21.84375 45.5625 +Q 25.390625 42.390625 31.78125 42.390625 +Q 38.140625 42.390625 41.71875 45.5625 +Q 45.3125 48.734375 45.3125 54.390625 +Q 45.3125 60.0625 41.71875 63.234375 +Q 38.140625 66.40625 31.78125 66.40625 +Q 25.390625 66.40625 21.84375 63.234375 +Q 18.3125 60.0625 18.3125 54.390625 +z +" id="DejaVuSans-56"/> + </defs> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-56"/> + </g> + </g> + <g id="line2d_130"> + <path d="M 363.763475 162.079687 +L 383.763475 162.079687 +" style="fill:none;stroke:#b69a32;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_131"/> + <g id="text_24"> + <!-- cell 9 --> + <g transform="translate(391.763475 165.579687)scale(0.1 -0.1)"> + <defs> + <path d="M 10.984375 1.515625 +L 10.984375 10.5 +Q 14.703125 8.734375 18.5 7.8125 +Q 22.3125 6.890625 25.984375 6.890625 +Q 35.75 6.890625 40.890625 13.453125 +Q 46.046875 20.015625 46.78125 33.40625 +Q 43.953125 29.203125 39.59375 26.953125 +Q 35.25 24.703125 29.984375 24.703125 +Q 19.046875 24.703125 12.671875 31.3125 +Q 6.296875 37.9375 6.296875 49.421875 +Q 6.296875 60.640625 12.9375 67.421875 +Q 19.578125 74.21875 30.609375 74.21875 +Q 43.265625 74.21875 49.921875 64.515625 +Q 56.59375 54.828125 56.59375 36.375 +Q 56.59375 19.140625 48.40625 8.859375 +Q 40.234375 -1.421875 26.421875 -1.421875 +Q 22.703125 -1.421875 18.890625 -0.6875 +Q 15.09375 0.046875 10.984375 1.515625 +z +M 30.609375 32.421875 +Q 37.25 32.421875 41.125 36.953125 +Q 45.015625 41.5 45.015625 49.421875 +Q 45.015625 57.28125 41.125 61.84375 +Q 37.25 66.40625 30.609375 66.40625 +Q 23.96875 66.40625 20.09375 61.84375 +Q 16.21875 57.28125 16.21875 49.421875 +Q 16.21875 41.5 20.09375 36.953125 +Q 23.96875 32.421875 30.609375 32.421875 +z +" id="DejaVuSans-57"/> + </defs> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-57"/> + </g> + </g> + <g id="line2d_132"> + <path d="M 363.763475 176.757812 +L 383.763475 176.757812 +" style="fill:none;stroke:#ae9d31;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_133"/> + <g id="text_25"> + <!-- cell 30 --> + <g transform="translate(391.763475 180.257812)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-48"/> + </g> + </g> + <g id="line2d_134"> + <path d="M 363.763475 191.435938 +L 383.763475 191.435938 +" style="fill:none;stroke:#a5a031;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_135"/> + <g id="text_26"> + <!-- cell 31 --> + <g transform="translate(391.763475 194.935938)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-49"/> + </g> + </g> + <g id="line2d_136"> + <path d="M 363.763475 206.114063 +L 383.763475 206.114063 +" style="fill:none;stroke:#9ca231;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_137"/> + <g id="text_27"> + <!-- cell 32 --> + <g transform="translate(391.763475 209.614063)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-50"/> + </g> + </g> + <g id="line2d_138"> + <path d="M 363.763475 220.792188 +L 383.763475 220.792188 +" style="fill:none;stroke:#92a531;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_139"/> + <g id="text_28"> + <!-- cell 33 --> + <g transform="translate(391.763475 224.292188)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-51"/> + </g> + </g> + <g id="line2d_140"> + <path d="M 363.763475 235.470312 +L 383.763475 235.470312 +" style="fill:none;stroke:#86a831;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_141"/> + <g id="text_29"> + <!-- cell 34 --> + <g transform="translate(391.763475 238.970312)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-52"/> + </g> + </g> + <g id="line2d_142"> + <path d="M 363.763475 250.148438 +L 383.763475 250.148438 +" style="fill:none;stroke:#77ab31;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_143"/> + <g id="text_30"> + <!-- cell 35 --> + <g transform="translate(391.763475 253.648438)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-53"/> + </g> + </g> + <g id="line2d_144"> + <path d="M 363.763475 264.826563 +L 383.763475 264.826563 +" style="fill:none;stroke:#63ae31;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_145"/> + <g id="text_31"> + <!-- cell 36 --> + <g transform="translate(391.763475 268.326563)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-54"/> + </g> + </g> + <g id="line2d_146"> + <path d="M 363.763475 279.504687 +L 383.763475 279.504687 +" style="fill:none;stroke:#42b231;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_147"/> + <g id="text_32"> + <!-- cell 37 --> + <g transform="translate(391.763475 283.004687)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-55"/> + </g> + </g> + <g id="line2d_148"> + <path d="M 363.763475 294.182813 +L 383.763475 294.182813 +" style="fill:none;stroke:#32b252;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_149"/> + <g id="text_33"> + <!-- cell 38 --> + <g transform="translate(391.763475 297.682813)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-56"/> + </g> + </g> + <g id="line2d_150"> + <path d="M 363.763475 308.860938 +L 383.763475 308.860938 +" style="fill:none;stroke:#33b16b;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_151"/> + <g id="text_34"> + <!-- cell 39 --> + <g transform="translate(391.763475 312.360938)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + <use x="267.480469" xlink:href="#DejaVuSans-57"/> + </g> + </g> + <g id="line2d_152"> + <path d="M 363.763475 323.539063 +L 383.763475 323.539063 +" style="fill:none;stroke:#33b07a;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_153"/> + <g id="text_35"> + <!-- cell 40 --> + <g transform="translate(391.763475 327.039063)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-48"/> + </g> + </g> + <g id="line2d_154"> + <path d="M 363.763475 338.217188 +L 383.763475 338.217188 +" style="fill:none;stroke:#34af86;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_155"/> + <g id="text_36"> + <!-- cell 41 --> + <g transform="translate(391.763475 341.717188)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-49"/> + </g> + </g> + <g id="line2d_156"> + <path d="M 363.763475 352.895313 +L 383.763475 352.895313 +" style="fill:none;stroke:#34af8f;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_157"/> + <g id="text_37"> + <!-- cell 42 --> + <g transform="translate(391.763475 356.395313)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-50"/> + </g> + </g> + <g id="line2d_158"> + <path d="M 363.763475 367.573438 +L 383.763475 367.573438 +" style="fill:none;stroke:#35ae97;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_159"/> + <g id="text_38"> + <!-- cell 43 --> + <g transform="translate(391.763475 371.073438)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-51"/> + </g> + </g> + <g id="line2d_160"> + <path d="M 363.763475 382.251563 +L 383.763475 382.251563 +" style="fill:none;stroke:#35ad9e;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_161"/> + <g id="text_39"> + <!-- cell 44 --> + <g transform="translate(391.763475 385.751563)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-52"/> + </g> + </g> + <g id="line2d_162"> + <path d="M 363.763475 396.929688 +L 383.763475 396.929688 +" style="fill:none;stroke:#36ada4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_163"/> + <g id="text_40"> + <!-- cell 45 --> + <g transform="translate(391.763475 400.429688)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-53"/> + </g> + </g> + <g id="line2d_164"> + <path d="M 363.763475 411.607813 +L 383.763475 411.607813 +" style="fill:none;stroke:#36acaa;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_165"/> + <g id="text_41"> + <!-- cell 46 --> + <g transform="translate(391.763475 415.107813)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-54"/> + </g> + </g> + <g id="line2d_166"> + <path d="M 363.763475 426.285938 +L 383.763475 426.285938 +" style="fill:none;stroke:#37abb0;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_167"/> + <g id="text_42"> + <!-- cell 47 --> + <g transform="translate(391.763475 429.785938)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-55"/> + </g> + </g> + <g id="line2d_168"> + <path d="M 363.763475 440.964063 +L 383.763475 440.964063 +" style="fill:none;stroke:#37abb7;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_169"/> + <g id="text_43"> + <!-- cell 48 --> + <g transform="translate(391.763475 444.464063)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-56"/> + </g> + </g> + <g id="line2d_170"> + <path d="M 363.763475 455.642188 +L 383.763475 455.642188 +" style="fill:none;stroke:#37aabe;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_171"/> + <g id="text_44"> + <!-- cell 49 --> + <g transform="translate(391.763475 459.142188)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-52"/> + <use x="267.480469" xlink:href="#DejaVuSans-57"/> + </g> + </g> + <g id="line2d_172"> + <path d="M 363.763475 470.320313 +L 383.763475 470.320313 +" style="fill:none;stroke:#38a9c5;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_173"/> + <g id="text_45"> + <!-- cell 20 --> + <g transform="translate(391.763475 473.820313)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-48"/> + </g> + </g> + <g id="line2d_174"> + <path d="M 363.763475 484.998438 +L 383.763475 484.998438 +" style="fill:none;stroke:#39a8ce;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_175"/> + <g id="text_46"> + <!-- cell 21 --> + <g transform="translate(391.763475 488.498438)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-49"/> + </g> + </g> + <g id="line2d_176"> + <path d="M 363.763475 499.676563 +L 383.763475 499.676563 +" style="fill:none;stroke:#3aa6d9;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_177"/> + <g id="text_47"> + <!-- cell 22 --> + <g transform="translate(391.763475 503.176563)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-50"/> + </g> + </g> + <g id="line2d_178"> + <path d="M 363.763475 514.354688 +L 383.763475 514.354688 +" style="fill:none;stroke:#3ba4e6;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_179"/> + <g id="text_48"> + <!-- cell 23 --> + <g transform="translate(391.763475 517.854688)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-51"/> + </g> + </g> + <g id="line2d_180"> + <path d="M 363.763475 529.032813 +L 383.763475 529.032813 +" style="fill:none;stroke:#4aa0f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_181"/> + <g id="text_49"> + <!-- cell 24 --> + <g transform="translate(391.763475 532.532813)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-52"/> + </g> + </g> + <g id="line2d_182"> + <path d="M 363.763475 543.710938 +L 383.763475 543.710938 +" style="fill:none;stroke:#6e9bf4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_183"/> + <g id="text_50"> + <!-- cell 25 --> + <g transform="translate(391.763475 547.210938)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-53"/> + </g> + </g> + <g id="line2d_184"> + <path d="M 363.763475 558.389063 +L 383.763475 558.389063 +" style="fill:none;stroke:#8795f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_185"/> + <g id="text_51"> + <!-- cell 26 --> + <g transform="translate(391.763475 561.889063)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-54"/> + </g> + </g> + <g id="line2d_186"> + <path d="M 363.763475 573.067188 +L 383.763475 573.067188 +" style="fill:none;stroke:#9b8ff4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_187"/> + <g id="text_52"> + <!-- cell 27 --> + <g transform="translate(391.763475 576.567188)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-55"/> + </g> + </g> + <g id="line2d_188"> + <path d="M 363.763475 587.745313 +L 383.763475 587.745313 +" style="fill:none;stroke:#ac89f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_189"/> + <g id="text_53"> + <!-- cell 28 --> + <g transform="translate(391.763475 591.245313)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-56"/> + </g> + </g> + <g id="line2d_190"> + <path d="M 363.763475 602.423438 +L 383.763475 602.423438 +" style="fill:none;stroke:#bc82f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_191"/> + <g id="text_54"> + <!-- cell 29 --> + <g transform="translate(391.763475 605.923438)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + <use x="267.480469" xlink:href="#DejaVuSans-57"/> + </g> + </g> + <g id="line2d_192"> + <path d="M 363.763475 617.101563 +L 383.763475 617.101563 +" style="fill:none;stroke:#cc7af4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_193"/> + <g id="text_55"> + <!-- cell 10 --> + <g transform="translate(391.763475 620.601563)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-48"/> + </g> + </g> + <g id="line2d_194"> + <path d="M 363.763475 631.779688 +L 383.763475 631.779688 +" style="fill:none;stroke:#dc6ff4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_195"/> + <g id="text_56"> + <!-- cell 11 --> + <g transform="translate(391.763475 635.279688)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-49"/> + </g> + </g> + <g id="line2d_196"> + <path d="M 363.763475 646.457813 +L 383.763475 646.457813 +" style="fill:none;stroke:#ee61f4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_197"/> + <g id="text_57"> + <!-- cell 12 --> + <g transform="translate(391.763475 649.957813)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-50"/> + </g> + </g> + <g id="line2d_198"> + <path d="M 363.763475 661.135938 +L 383.763475 661.135938 +" style="fill:none;stroke:#f55ee9;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_199"/> + <g id="text_58"> + <!-- cell 13 --> + <g transform="translate(391.763475 664.635938)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-51"/> + </g> + </g> + <g id="line2d_200"> + <path d="M 363.763475 675.814063 +L 383.763475 675.814063 +" style="fill:none;stroke:#f562da;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_201"/> + <g id="text_59"> + <!-- cell 14 --> + <g transform="translate(391.763475 679.314063)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-52"/> + </g> + </g> + <g id="line2d_202"> + <path d="M 363.763475 690.492188 +L 383.763475 690.492188 +" style="fill:none;stroke:#f565cc;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_203"/> + <g id="text_60"> + <!-- cell 15 --> + <g transform="translate(391.763475 693.992188)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-53"/> + </g> + </g> + <g id="line2d_204"> + <path d="M 363.763475 705.170313 +L 383.763475 705.170313 +" style="fill:none;stroke:#f668c0;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_205"/> + <g id="text_61"> + <!-- cell 16 --> + <g transform="translate(391.763475 708.670313)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-54"/> + </g> + </g> + <g id="line2d_206"> + <path d="M 363.763475 719.848438 +L 383.763475 719.848438 +" style="fill:none;stroke:#f66ab3;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_207"/> + <g id="text_62"> + <!-- cell 17 --> + <g transform="translate(391.763475 723.348438)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-55"/> + </g> + </g> + <g id="line2d_208"> + <path d="M 363.763475 734.526563 +L 383.763475 734.526563 +" style="fill:none;stroke:#f66ca7;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_209"/> + <g id="text_63"> + <!-- cell 18 --> + <g transform="translate(391.763475 738.026563)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-56"/> + </g> + </g> + <g id="line2d_210"> + <path d="M 363.763475 749.204688 +L 383.763475 749.204688 +" style="fill:none;stroke:#f76e9a;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_211"/> + <g id="text_64"> + <!-- cell 19 --> + <g transform="translate(391.763475 752.704688)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + <use x="267.480469" xlink:href="#DejaVuSans-57"/> + </g> + </g> + </g> + </g> + <defs> + <clipPath id="p5214499835"> + <rect height="321.32" width="309.2804" x="48.982813" y="213.792188"/> + </clipPath> + </defs> +</svg> diff --git a/doc/tutorial/network_ring.rst b/doc/tutorial/network_ring.rst new file mode 100644 index 0000000000000000000000000000000000000000..b42a45dde51283df6cf9c7cfa51fb1666f73b1b4 --- /dev/null +++ b/doc/tutorial/network_ring.rst @@ -0,0 +1,261 @@ +.. _tutorialnetworkring: + +A ring network +============== + +In this example, a small *network* of cells, arranged in a ring, will be created and the simulation distributed over multiple threads or GPUs if available. + +.. Note:: + + **Concepts covered in this example:** + + 1. Building a basic :py:class:`arbor.cell` with a synapse site and spike generator. + 2. Building a :py:class:`arbor.recipe` with a network of interconnected cells. + 3. Running the simulation and extract the results. + +The cell +******** + +Step **(1)** shows how a simple cell with a dendrite is created. We construct the following :term:`morphology` and label the soma and dendrite: + +.. figure:: ../gen-images/tutorial_network_ring_morph.svg + :width: 400 + :align: center + + A 4-segment cell with a soma (pink) and a branched dendrite (light blue). + +.. code-block:: python + + # (1) Build a segment tree + tree = arbor.segment_tree() + + # Soma (tag=1) with radius 6 μm, modelled as cylinder of length 2*radius + s = tree.append(arbor.mnpos, arbor.mpoint(-12, 0, 0, 6), arbor.mpoint(0, 0, 0, 6), tag=1) + + # Single dendrite (tag=3) of length 50 μm and radius 2 μm attached to soma. + b0 = tree.append(s, arbor.mpoint(0, 0, 0, 2), arbor.mpoint(50, 0, 0, 2), tag=3) + + # Attach two dendrites (tag=3) of length 50 μm to the end of the first dendrite. + # Radius tapers from 2 to 0.5 μm over the length of the dendrite. + b1 = tree.append(b0, arbor.mpoint(50, 0, 0, 2), arbor.mpoint(50+50/sqrt(2), 50/sqrt(2), 0, 0.5), tag=3) + # Constant radius of 1 μm over the length of the dendrite. + b2 = tree.append(b0, arbor.mpoint(50, 0, 0, 1), arbor.mpoint(50+50/sqrt(2), -50/sqrt(2), 0, 1), tag=3) + + # Associate labels to tags + labels = arbor.label_dict() + labels['soma'] = '(tag 1)' + labels['dend'] = '(tag 3)' + +In step **(2)** we create a :term:`label` for both the root and the site of the synapse. +These locations will form the endpoints of the connections between the cells. + +.. figure:: ../gen-images/tutorial_network_ring_synapse_site.svg + :width: 400 + :align: center + + We'll create labels for the root (red) and a synapse_site (black). + +.. code-block:: python + + # (2) Mark location for synapse at the midpoint of branch 1 (the first dendrite). + labels['synapse_site'] = '(location 1 0.5)' + # Mark the root of the tree. + labels['root'] = '(root)' + +After we've created a basic :py:class:`arbor.decor`, step **(3)** places a synapse with an exponential decay (``'expsyn'``) is on the ``'synapse_site'``. +Note that mechanisms can be initialized with their name; ``'expsyn'`` is short for ``arbor.mechanism('expsyn')``. + +Step **(4)** places a spike detector at the ``'root'``. :py:class:`spike_detectors <spike_detector>` will send spikes into an +:class:`arbor.connection`, whereas the :ref:`expsyn mechanism <mechanisms_builtins>` can receive spikes from an +:class:`arbor.connection`. + +.. code-block:: python + + decor = arbor.decor() + + # Put hh dynamics on soma, and passive properties on the dendrites. + decor.paint('"soma"', 'hh') + decor.paint('"dend"', 'pas') + + # (3) Attach a single synapse. + decor.place('"synapse_site"', 'expsyn') + + # (4) Attach a spike detector with threshold of -10 mV. + decor.place('"root"', arbor.spike_detector(-10)) + + cell = arbor.cable_cell(tree, labels, decor) + +The recipe +********** + +To create a model with multiple connected cells, we need to use a :py:class:`recipe <arbor.recipe>`. +The recipe is where the different cells and the :ref:`connections <interconnectivity>` between them are defined. + +Step **(5)** shows a class definition for a recipe with multiple cells. Instantiating the class requires the desired +number of cells as input. Compared to the :ref:`simple cell recipe <tutorialsinglecellrecipe>`, the main differences +are connecting the cells **(8)**, returning a configurable number of cells **(6)** and returning a new cell per ``gid`` **(7)** +(``make_cable_cell()`` returns the cell above). + +Step **(8)** creates an :py:class:`arbor.connection` between consecutive cells. If a cell has gid ``gid``, the +previous cell has a gid ``(gid-1)%self.ncells``. The connection has a weight of 0.1 μS and a delay of 5 ms. The first two arguments +to :py:class:`arbor.connection` are the **source** and **target** of the connection, and these are defined by the +cell index ``gid`` and the source or target index. (:term:`Remember <connection>` that sources and targets are +separately indexed.) + +The two endpoints are of type :class:`arbor.cell_member`, and can be initialized with a ``(gid,index)`` tuple. +The cells have one synapse (step **3**), so the target endpoint has the 0th index. The cell has one +spike generator (step **4**), so its source index is also 0. + +Lastly, we must inform the recipe how many sources and targets we have on each cell (``gid``). +:func:`arbor.cable_cell.num_targets` and :func:`arbor.cable_cell.num_sources` must be set to 1: each cell has one +source and one target endpoint. + +Step **(9)** attaches an :py:class:`arbor.event_generator` on the 0th target (synapse) on the 0th cell; this means it +is connected to the ``"synapse_site"`` on cell 0. This initiates the signal cascade through the network. The +:class:`arbor.explicit_schedule` in instantiated with a list of times in milliseconds, so here a single event at the 1 +ms mark is emitted. Note that this synapse is connected twice, once to the event generator, and once to another cell. + +Step **(10)** places a :term:`probe` at the ``"root"`` of each cell. + +Step **(11)** instantiates the recipe with 4 cells. + +.. code-block:: python + + # (5) Create a recipe that generates a network of connected cells. + class ring_recipe (arbor.recipe): + def __init__(self, ncells): + # The base C++ class constructor must be called first, to ensure that + # all memory in the C++ class is initialized correctly. + arbor.recipe.__init__(self) + self.ncells = ncells + self.props = arbor.neuron_cable_properties() + self.cat = arbor.default_catalogue() + self.props.register(self.cat) + + # (6) The num_cells method that returns the total number of cells in the model + # must be implemented. + def num_cells(self): + return self.ncells + + # (7) The cell_description method returns a cell + def cell_description(self, gid): + return make_cable_cell(gid) + + # The kind method returns the type of cell with gid. + # Note: this must agree with the type returned by cell_description. + def cell_kind(self, gid): + return arbor.cell_kind.cable + + # (8) Make a ring network. For each gid, provide a list of incoming connections. + def connections_on(self, gid): + src = (gid-1)%self.ncells + w = 0.01 + d = 5 + return [arbor.connection((src,0), (gid,0), w, d)] + + def num_targets(self, gid): + return 1 + + def num_sources(self, gid): + return 1 + + # (9) Attach a generator to the first cell in the ring. + def event_generators(self, gid): + if gid==0: + sched = arbor.explicit_schedule([1]) + return [arbor.event_generator((0,0), 0.1, sched)] + return [] + + # (10) Place a probe at the root of each cell. + def probes(self, gid): + return [arbor.cable_probe_membrane_voltage('"root"')] + + def global_properties(self, kind): + return self.props + + # (11) Instantiate recipe + ncells = 4 + recipe = ring_recipe(ncells) + +The execution +************* + +To create a simulation, we must create an :class:`arbor.context` and :py:class:`arbor.domain_decomposition`. + +Step **(12)** creates a default execution context, and uses the :func:`arbor.partition_load_balance` to create a +default domain decomposition. You can print the objects to see what defaults they produce on your system. + +Step **(13)** sets all spike generators to record using the :py:class:`arbor.spike_recording.all` policy. +This means the timestamps of the generated events will be kept in memory. Be default, these are discarded. + +In addition to having the timestamps of spikes, we want to extract the voltage as a function of time. + +Step **(14)** sets the probes (step **10**) to measure at a certain schedule. This is sometimes described as attaching a :term:`sampler` to a :term:`probe`. :py:func:`arbor.simulation.sample` expects a :term:`probe id` and the desired schedule (here: a recording frequency of 10 kHz). Note that the probe id is a separate index from those of :term:`connection` endpoints; probe ids correspond to the index of the list produced by :py:func:`arbor.recipe.probes` on cell ``gid``. + +:py:func:`arbor.simulation.sample` returns a handle to the :term:`samples <sample>` that will be recorded. We store these handles for later use. + +Step **(15)** executes the simulation for a duration of 100 ms. + +.. code-block:: python + + # (12) Create a default execution context, domain decomposition and simulation + context = arbor.context() + decomp = arbor.partition_load_balance(recipe, context) + sim = arbor.simulation(recipe, decomp, context) + + # (13) Set spike generators to record + sim.record(arbor.spike_recording.all) + + # (14) Attach a sampler to the voltage probe on cell 0. Sample rate of 10 sample every ms. + handles = [sim.sample((gid, 0), arbor.regular_schedule(0.1)) for gid in range(ncells)] + + # (15) Run simulation + sim.run(100) + print('Simulation finished') + +The results +*********** + +Step **(16)** prints the timestamps of the spikes: + +.. code-block:: python + + # Print spike times + print('spikes:') + for sp in sim.spikes(): + print(' ', sp) + +Step **(17)** generates a plot of the sampling data. +:py:func:`arbor.simulation.samples` takes a ``handle`` of the probe we wish to examine. It returns a list +of ``(data, meta)`` terms: ``data`` being the time and value series of the probed quantity; and +``meta`` being the location of the probe. The size of the returned list depends on the number of +discrete locations pointed to by the handle, which in this case is 1, so we can take the first element. +(Recall that in step **(10)** we attached a probe to the ``"root"``, which describes one location. +It could have described a :term:`locset`.) + +.. code-block:: python + + # Plot the recorded voltages over time. + print("Plotting results ...") + df_list = [] + for gid in range(ncells): + samples, meta = sim.samples(handles[gid])[0] + df_list.append(pandas.DataFrame({'t/ms': samples[:, 0], 'U/mV': samples[:, 1], 'Cell': f"cell {gid}"})) + + df = pandas.concat(df_list) + seaborn.relplot(data=df, kind="line", x="t/ms", y="U/mV",hue="Cell",ci=None).savefig('network_ring_result.svg') + + +Since we have created ``ncells`` cells, we have ``ncells`` traces. We should be seeing phase shifted traces, as the action potential propagated through the network. + +We plot the results using pandas and seaborn: + +.. figure:: network_ring_result.svg + :width: 400 + :align: center + + +The full code +************* + +You can find the full code of the example at ``python/examples/network_ring.py``. diff --git a/doc/tutorial/network_ring_result.svg b/doc/tutorial/network_ring_result.svg new file mode 100644 index 0000000000000000000000000000000000000000..2d317e517afc7c3f4cdd7c57ec3ff2298b1f9c55 --- /dev/null +++ b/doc/tutorial/network_ring_result.svg @@ -0,0 +1,1298 @@ +<?xml version="1.0" encoding="utf-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with matplotlib (https://matplotlib.org/) --> +<svg height="366.07625pt" version="1.1" viewBox="0 0 428.175775 366.07625" width="428.175775pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <metadata> + <rdf:RDF xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <cc:Work> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + <dc:date>2021-01-15T15:47:38.365740</dc:date> + <dc:format>image/svg+xml</dc:format> + <dc:creator> + <cc:Agent> + <dc:title>Matplotlib v3.3.2, https://matplotlib.org/</dc:title> + </cc:Agent> + </dc:creator> + </cc:Work> + </rdf:RDF> + </metadata> + <defs> + <style type="text/css">*{stroke-linecap:butt;stroke-linejoin:round;}</style> + </defs> + <g id="figure_1"> + <g id="patch_1"> + <path d="M 0 366.07625 +L 428.175775 366.07625 +L 428.175775 0 +L 0 0 +z +" style="fill:#ffffff;"/> + </g> + <g id="axes_1"> + <g id="patch_2"> + <path d="M 48.982813 328.52 +L 359.018475 328.52 +L 359.018475 7.2 +L 48.982813 7.2 +z +" style="fill:#ffffff;"/> + </g> + <g id="matplotlib.axis_1"> + <g id="xtick_1"> + <g id="line2d_1"> + <defs> + <path d="M 0 0 +L 0 3.5 +" id="m2cb6aac0af" style="stroke:#000000;stroke-width:0.8;"/> + </defs> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="63.075343" xlink:href="#m2cb6aac0af" y="328.52"/> + </g> + </g> + <g id="text_1"> + <!-- 0 --> + <g transform="translate(59.894093 343.118437)scale(0.1 -0.1)"> + <defs> + <path d="M 31.78125 66.40625 +Q 24.171875 66.40625 20.328125 58.90625 +Q 16.5 51.421875 16.5 36.375 +Q 16.5 21.390625 20.328125 13.890625 +Q 24.171875 6.390625 31.78125 6.390625 +Q 39.453125 6.390625 43.28125 13.890625 +Q 47.125 21.390625 47.125 36.375 +Q 47.125 51.421875 43.28125 58.90625 +Q 39.453125 66.40625 31.78125 66.40625 +z +M 31.78125 74.21875 +Q 44.046875 74.21875 50.515625 64.515625 +Q 56.984375 54.828125 56.984375 36.375 +Q 56.984375 17.96875 50.515625 8.265625 +Q 44.046875 -1.421875 31.78125 -1.421875 +Q 19.53125 -1.421875 13.0625 8.265625 +Q 6.59375 17.96875 6.59375 36.375 +Q 6.59375 54.828125 13.0625 64.515625 +Q 19.53125 74.21875 31.78125 74.21875 +z +" id="DejaVuSans-48"/> + </defs> + <use xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_2"> + <g id="line2d_2"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="119.516014" xlink:href="#m2cb6aac0af" y="328.52"/> + </g> + </g> + <g id="text_2"> + <!-- 20 --> + <g transform="translate(113.153514 343.118437)scale(0.1 -0.1)"> + <defs> + <path d="M 19.1875 8.296875 +L 53.609375 8.296875 +L 53.609375 0 +L 7.328125 0 +L 7.328125 8.296875 +Q 12.9375 14.109375 22.625 23.890625 +Q 32.328125 33.6875 34.8125 36.53125 +Q 39.546875 41.84375 41.421875 45.53125 +Q 43.3125 49.21875 43.3125 52.78125 +Q 43.3125 58.59375 39.234375 62.25 +Q 35.15625 65.921875 28.609375 65.921875 +Q 23.96875 65.921875 18.8125 64.3125 +Q 13.671875 62.703125 7.8125 59.421875 +L 7.8125 69.390625 +Q 13.765625 71.78125 18.9375 73 +Q 24.125 74.21875 28.421875 74.21875 +Q 39.75 74.21875 46.484375 68.546875 +Q 53.21875 62.890625 53.21875 53.421875 +Q 53.21875 48.921875 51.53125 44.890625 +Q 49.859375 40.875 45.40625 35.40625 +Q 44.1875 33.984375 37.640625 27.21875 +Q 31.109375 20.453125 19.1875 8.296875 +z +" id="DejaVuSans-50"/> + </defs> + <use xlink:href="#DejaVuSans-50"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_3"> + <g id="line2d_3"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="175.956685" xlink:href="#m2cb6aac0af" y="328.52"/> + </g> + </g> + <g id="text_3"> + <!-- 40 --> + <g transform="translate(169.594185 343.118437)scale(0.1 -0.1)"> + <defs> + <path d="M 37.796875 64.3125 +L 12.890625 25.390625 +L 37.796875 25.390625 +z +M 35.203125 72.90625 +L 47.609375 72.90625 +L 47.609375 25.390625 +L 58.015625 25.390625 +L 58.015625 17.1875 +L 47.609375 17.1875 +L 47.609375 0 +L 37.796875 0 +L 37.796875 17.1875 +L 4.890625 17.1875 +L 4.890625 26.703125 +z +" id="DejaVuSans-52"/> + </defs> + <use xlink:href="#DejaVuSans-52"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_4"> + <g id="line2d_4"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="232.397356" xlink:href="#m2cb6aac0af" y="328.52"/> + </g> + </g> + <g id="text_4"> + <!-- 60 --> + <g transform="translate(226.034856 343.118437)scale(0.1 -0.1)"> + <defs> + <path d="M 33.015625 40.375 +Q 26.375 40.375 22.484375 35.828125 +Q 18.609375 31.296875 18.609375 23.390625 +Q 18.609375 15.53125 22.484375 10.953125 +Q 26.375 6.390625 33.015625 6.390625 +Q 39.65625 6.390625 43.53125 10.953125 +Q 47.40625 15.53125 47.40625 23.390625 +Q 47.40625 31.296875 43.53125 35.828125 +Q 39.65625 40.375 33.015625 40.375 +z +M 52.59375 71.296875 +L 52.59375 62.3125 +Q 48.875 64.0625 45.09375 64.984375 +Q 41.3125 65.921875 37.59375 65.921875 +Q 27.828125 65.921875 22.671875 59.328125 +Q 17.53125 52.734375 16.796875 39.40625 +Q 19.671875 43.65625 24.015625 45.921875 +Q 28.375 48.1875 33.59375 48.1875 +Q 44.578125 48.1875 50.953125 41.515625 +Q 57.328125 34.859375 57.328125 23.390625 +Q 57.328125 12.15625 50.6875 5.359375 +Q 44.046875 -1.421875 33.015625 -1.421875 +Q 20.359375 -1.421875 13.671875 8.265625 +Q 6.984375 17.96875 6.984375 36.375 +Q 6.984375 53.65625 15.1875 63.9375 +Q 23.390625 74.21875 37.203125 74.21875 +Q 40.921875 74.21875 44.703125 73.484375 +Q 48.484375 72.75 52.59375 71.296875 +z +" id="DejaVuSans-54"/> + </defs> + <use xlink:href="#DejaVuSans-54"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_5"> + <g id="line2d_5"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="288.838028" xlink:href="#m2cb6aac0af" y="328.52"/> + </g> + </g> + <g id="text_5"> + <!-- 80 --> + <g transform="translate(282.475528 343.118437)scale(0.1 -0.1)"> + <defs> + <path d="M 31.78125 34.625 +Q 24.75 34.625 20.71875 30.859375 +Q 16.703125 27.09375 16.703125 20.515625 +Q 16.703125 13.921875 20.71875 10.15625 +Q 24.75 6.390625 31.78125 6.390625 +Q 38.8125 6.390625 42.859375 10.171875 +Q 46.921875 13.96875 46.921875 20.515625 +Q 46.921875 27.09375 42.890625 30.859375 +Q 38.875 34.625 31.78125 34.625 +z +M 21.921875 38.8125 +Q 15.578125 40.375 12.03125 44.71875 +Q 8.5 49.078125 8.5 55.328125 +Q 8.5 64.0625 14.71875 69.140625 +Q 20.953125 74.21875 31.78125 74.21875 +Q 42.671875 74.21875 48.875 69.140625 +Q 55.078125 64.0625 55.078125 55.328125 +Q 55.078125 49.078125 51.53125 44.71875 +Q 48 40.375 41.703125 38.8125 +Q 48.828125 37.15625 52.796875 32.3125 +Q 56.78125 27.484375 56.78125 20.515625 +Q 56.78125 9.90625 50.3125 4.234375 +Q 43.84375 -1.421875 31.78125 -1.421875 +Q 19.734375 -1.421875 13.25 4.234375 +Q 6.78125 9.90625 6.78125 20.515625 +Q 6.78125 27.484375 10.78125 32.3125 +Q 14.796875 37.15625 21.921875 38.8125 +z +M 18.3125 54.390625 +Q 18.3125 48.734375 21.84375 45.5625 +Q 25.390625 42.390625 31.78125 42.390625 +Q 38.140625 42.390625 41.71875 45.5625 +Q 45.3125 48.734375 45.3125 54.390625 +Q 45.3125 60.0625 41.71875 63.234375 +Q 38.140625 66.40625 31.78125 66.40625 +Q 25.390625 66.40625 21.84375 63.234375 +Q 18.3125 60.0625 18.3125 54.390625 +z +" id="DejaVuSans-56"/> + </defs> + <use xlink:href="#DejaVuSans-56"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="xtick_6"> + <g id="line2d_6"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="345.278699" xlink:href="#m2cb6aac0af" y="328.52"/> + </g> + </g> + <g id="text_6"> + <!-- 100 --> + <g transform="translate(335.734949 343.118437)scale(0.1 -0.1)"> + <defs> + <path d="M 12.40625 8.296875 +L 28.515625 8.296875 +L 28.515625 63.921875 +L 10.984375 60.40625 +L 10.984375 69.390625 +L 28.421875 72.90625 +L 38.28125 72.90625 +L 38.28125 8.296875 +L 54.390625 8.296875 +L 54.390625 0 +L 12.40625 0 +z +" id="DejaVuSans-49"/> + </defs> + <use xlink:href="#DejaVuSans-49"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + <use x="127.246094" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="text_7"> + <!-- t/ms --> + <g transform="translate(192.881113 356.796562)scale(0.1 -0.1)"> + <defs> + <path d="M 18.3125 70.21875 +L 18.3125 54.6875 +L 36.8125 54.6875 +L 36.8125 47.703125 +L 18.3125 47.703125 +L 18.3125 18.015625 +Q 18.3125 11.328125 20.140625 9.421875 +Q 21.96875 7.515625 27.59375 7.515625 +L 36.8125 7.515625 +L 36.8125 0 +L 27.59375 0 +Q 17.1875 0 13.234375 3.875 +Q 9.28125 7.765625 9.28125 18.015625 +L 9.28125 47.703125 +L 2.6875 47.703125 +L 2.6875 54.6875 +L 9.28125 54.6875 +L 9.28125 70.21875 +z +" id="DejaVuSans-116"/> + <path d="M 25.390625 72.90625 +L 33.6875 72.90625 +L 8.296875 -9.28125 +L 0 -9.28125 +z +" id="DejaVuSans-47"/> + <path d="M 52 44.1875 +Q 55.375 50.25 60.0625 53.125 +Q 64.75 56 71.09375 56 +Q 79.640625 56 84.28125 50.015625 +Q 88.921875 44.046875 88.921875 33.015625 +L 88.921875 0 +L 79.890625 0 +L 79.890625 32.71875 +Q 79.890625 40.578125 77.09375 44.375 +Q 74.3125 48.1875 68.609375 48.1875 +Q 61.625 48.1875 57.5625 43.546875 +Q 53.515625 38.921875 53.515625 30.90625 +L 53.515625 0 +L 44.484375 0 +L 44.484375 32.71875 +Q 44.484375 40.625 41.703125 44.40625 +Q 38.921875 48.1875 33.109375 48.1875 +Q 26.21875 48.1875 22.15625 43.53125 +Q 18.109375 38.875 18.109375 30.90625 +L 18.109375 0 +L 9.078125 0 +L 9.078125 54.6875 +L 18.109375 54.6875 +L 18.109375 46.1875 +Q 21.1875 51.21875 25.484375 53.609375 +Q 29.78125 56 35.6875 56 +Q 41.65625 56 45.828125 52.96875 +Q 50 49.953125 52 44.1875 +z +" id="DejaVuSans-109"/> + <path d="M 44.28125 53.078125 +L 44.28125 44.578125 +Q 40.484375 46.53125 36.375 47.5 +Q 32.28125 48.484375 27.875 48.484375 +Q 21.1875 48.484375 17.84375 46.4375 +Q 14.5 44.390625 14.5 40.28125 +Q 14.5 37.15625 16.890625 35.375 +Q 19.28125 33.59375 26.515625 31.984375 +L 29.59375 31.296875 +Q 39.15625 29.25 43.1875 25.515625 +Q 47.21875 21.78125 47.21875 15.09375 +Q 47.21875 7.46875 41.1875 3.015625 +Q 35.15625 -1.421875 24.609375 -1.421875 +Q 20.21875 -1.421875 15.453125 -0.5625 +Q 10.6875 0.296875 5.421875 2 +L 5.421875 11.28125 +Q 10.40625 8.6875 15.234375 7.390625 +Q 20.0625 6.109375 24.8125 6.109375 +Q 31.15625 6.109375 34.5625 8.28125 +Q 37.984375 10.453125 37.984375 14.40625 +Q 37.984375 18.0625 35.515625 20.015625 +Q 33.0625 21.96875 24.703125 23.78125 +L 21.578125 24.515625 +Q 13.234375 26.265625 9.515625 29.90625 +Q 5.8125 33.546875 5.8125 39.890625 +Q 5.8125 47.609375 11.28125 51.796875 +Q 16.75 56 26.8125 56 +Q 31.78125 56 36.171875 55.265625 +Q 40.578125 54.546875 44.28125 53.078125 +z +" id="DejaVuSans-115"/> + </defs> + <use xlink:href="#DejaVuSans-116"/> + <use x="39.208984" xlink:href="#DejaVuSans-47"/> + <use x="72.900391" xlink:href="#DejaVuSans-109"/> + <use x="170.3125" xlink:href="#DejaVuSans-115"/> + </g> + </g> + </g> + <g id="matplotlib.axis_2"> + <g id="ytick_1"> + <g id="line2d_7"> + <defs> + <path d="M 0 0 +L -3.5 0 +" id="m907a06afe2" style="stroke:#000000;stroke-width:0.8;"/> + </defs> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m907a06afe2" y="278.92314"/> + </g> + </g> + <g id="text_8"> + <!-- −60 --> + <g transform="translate(20.878125 282.722359)scale(0.1 -0.1)"> + <defs> + <path d="M 10.59375 35.5 +L 73.1875 35.5 +L 73.1875 27.203125 +L 10.59375 27.203125 +z +" id="DejaVuSans-8722"/> + </defs> + <use xlink:href="#DejaVuSans-8722"/> + <use x="83.789062" xlink:href="#DejaVuSans-54"/> + <use x="147.412109" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="ytick_2"> + <g id="line2d_8"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m907a06afe2" y="216.820208"/> + </g> + </g> + <g id="text_9"> + <!-- −40 --> + <g transform="translate(20.878125 220.619427)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-8722"/> + <use x="83.789062" xlink:href="#DejaVuSans-52"/> + <use x="147.412109" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="ytick_3"> + <g id="line2d_9"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m907a06afe2" y="154.717277"/> + </g> + </g> + <g id="text_10"> + <!-- −20 --> + <g transform="translate(20.878125 158.516495)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-8722"/> + <use x="83.789062" xlink:href="#DejaVuSans-50"/> + <use x="147.412109" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="ytick_4"> + <g id="line2d_10"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m907a06afe2" y="92.614345"/> + </g> + </g> + <g id="text_11"> + <!-- 0 --> + <g transform="translate(35.620312 96.413563)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="ytick_5"> + <g id="line2d_11"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="48.982813" xlink:href="#m907a06afe2" y="30.511413"/> + </g> + </g> + <g id="text_12"> + <!-- 20 --> + <g transform="translate(29.257812 34.310632)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-50"/> + <use x="63.623047" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="text_13"> + <!-- U/mV --> + <g transform="translate(14.798438 181.494375)rotate(-90)scale(0.1 -0.1)"> + <defs> + <path d="M 8.6875 72.90625 +L 18.609375 72.90625 +L 18.609375 28.609375 +Q 18.609375 16.890625 22.84375 11.734375 +Q 27.09375 6.59375 36.625 6.59375 +Q 46.09375 6.59375 50.34375 11.734375 +Q 54.59375 16.890625 54.59375 28.609375 +L 54.59375 72.90625 +L 64.5 72.90625 +L 64.5 27.390625 +Q 64.5 13.140625 57.4375 5.859375 +Q 50.390625 -1.421875 36.625 -1.421875 +Q 22.796875 -1.421875 15.734375 5.859375 +Q 8.6875 13.140625 8.6875 27.390625 +z +" id="DejaVuSans-85"/> + <path d="M 28.609375 0 +L 0.78125 72.90625 +L 11.078125 72.90625 +L 34.1875 11.53125 +L 57.328125 72.90625 +L 67.578125 72.90625 +L 39.796875 0 +z +" id="DejaVuSans-86"/> + </defs> + <use xlink:href="#DejaVuSans-85"/> + <use x="73.193359" xlink:href="#DejaVuSans-47"/> + <use x="106.884766" xlink:href="#DejaVuSans-109"/> + <use x="204.296875" xlink:href="#DejaVuSans-86"/> + </g> + </g> + </g> + <g id="line2d_12"> + <path clip-path="url(#p8033eed20a)" d="M 63.075343 294.448873 +L 65.897376 294.432749 +L 66.461783 186.661355 +L 67.8728 40.858469 +L 68.155003 26.430295 +L 68.437206 21.805455 +L 68.71941 23.695842 +L 69.001613 29.55808 +L 69.56602 47.578232 +L 73.234663 183.716746 +L 74.64568 222.402577 +L 75.703943 246.535187 +L 76.550553 261.397094 +L 77.18551 269.23472 +L 77.679366 273.557845 +L 78.243773 277.077432 +L 78.80818 279.573371 +L 79.65479 282.208294 +L 80.5014 284.149414 +L 81.630213 286.232822 +L 83.323433 288.832879 +L 85.016654 291.036159 +L 86.709874 292.899178 +L 88.403094 294.435493 +L 90.096314 295.659877 +L 91.789534 296.595427 +L 93.482754 297.272473 +L 95.175974 297.725766 +L 97.151398 298.020272 +L 99.409025 298.116273 +L 102.231058 297.984586 +L 106.181905 297.537381 +L 120.362624 295.729504 +L 126.853301 295.223046 +L 134.472792 294.860164 +L 139.552452 294.713122 +L 141.245672 256.38291 +L 143.221096 227.930715 +L 143.785503 213.393472 +L 144.349909 188.939041 +L 144.914316 145.856303 +L 145.760926 57.285062 +L 146.043129 39.663061 +L 146.325333 32.210827 +L 146.607536 32.901276 +L 146.889739 39.24557 +L 147.454146 61.491065 +L 150.558383 206.687262 +L 152.533807 283.721314 +L 153.098213 297.604822 +L 153.66262 305.756472 +L 154.227027 310.113099 +L 154.791433 312.320295 +L 155.35584 313.341597 +L 155.920247 313.697776 +L 156.484654 313.671269 +L 157.04906 313.419033 +L 157.89567 312.803413 +L 159.588891 311.204429 +L 164.668551 306.19836 +L 167.208381 304.062882 +L 169.466008 302.432841 +L 171.723635 301.047359 +L 174.263465 299.75361 +L 176.803295 298.702576 +L 179.625329 297.771069 +L 182.729566 296.976854 +L 186.398209 296.277154 +L 190.63126 295.705088 +L 195.71092 295.247633 +L 202.201597 294.893891 +L 211.232105 294.641403 +L 217.722782 294.550408 +L 217.977737 292.908236 +L 218.569392 274.752758 +L 219.133799 262.765535 +L 219.980409 250.219443 +L 221.109222 234.569653 +L 221.673629 223.194955 +L 222.238036 205.249079 +L 222.802442 173.730338 +L 223.366849 119.840992 +L 223.931256 58.281785 +L 224.213459 38.805857 +L 224.495663 29.969264 +L 224.777866 29.774376 +L 225.060069 35.581202 +L 225.624476 57.322521 +L 229.010916 214.716654 +L 230.704136 281.256698 +L 231.268543 296.126829 +L 231.83295 305.015175 +L 232.397356 309.790372 +L 232.961763 312.217856 +L 233.52617 313.355177 +L 234.090577 313.773686 +L 234.654983 313.781357 +L 235.21939 313.548109 +L 236.066 312.946275 +L 237.477017 311.635721 +L 243.685491 305.56966 +L 246.15477 303.574571 +L 248.6946 301.837405 +L 251.234431 300.399818 +L 253.774261 299.226111 +L 256.596294 298.182598 +L 259.700531 297.291184 +L 263.086972 296.557013 +L 267.037819 295.934711 +L 271.835276 295.418599 +L 277.761546 295.018804 +L 285.66324 294.725583 +L 296.114157 294.549237 +L 296.960767 270.363198 +L 297.525174 259.64275 +L 298.653987 244.20455 +L 299.500597 231.313544 +L 300.065004 218.302129 +L 300.629411 196.913083 +L 301.193817 158.765718 +L 302.322631 44.292486 +L 302.604834 31.9002 +L 302.948196 29.444006 +L 303.159848 32.82806 +L 303.724255 52.534457 +L 305.135272 122.199673 +L 306.546288 186.874774 +L 308.803915 277.725429 +L 309.368322 293.799306 +L 310.00328 304.586321 +L 310.497135 309.108279 +L 311.061542 311.880746 +L 311.625949 313.20806 +L 312.190356 313.733559 +L 312.754762 313.803095 +L 313.319169 313.606498 +L 314.165779 313.034356 +L 315.576796 311.742674 +L 322.067473 305.418755 +L 324.607303 303.393126 +L 326.86493 301.860535 +L 329.40476 300.4188 +L 331.94459 299.241523 +L 334.766624 298.194732 +L 337.870861 297.300462 +L 341.257301 296.563916 +L 344.925945 295.977374 +L 344.925945 295.977374 +" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_13"> + <path clip-path="url(#p8033eed20a)" d="M 63.075343 294.448873 +L 78.525976 294.422778 +L 81.065807 294.423177 +L 81.348731 290.383689 +L 81.913138 273.5644 +L 82.477545 261.881178 +L 83.324155 249.437256 +L 84.240594 236.709078 +L 84.73445 227.56836 +L 85.298857 212.013177 +L 85.863264 185.187113 +L 86.42767 137.188519 +L 87.27428 45.921513 +L 87.556484 31.009651 +L 87.838687 26.339594 +L 88.120891 29.201064 +L 88.403094 37.032634 +L 88.967501 60.781577 +L 91.789534 194.572902 +L 94.047161 283.870658 +L 94.611568 297.891457 +L 95.175974 306.070144 +L 95.740381 310.40401 +L 96.304788 312.577909 +L 96.869195 313.569152 +L 97.433601 313.901512 +L 97.998008 313.856967 +L 98.844618 313.404721 +L 99.973431 312.454684 +L 102.513262 309.894547 +L 105.899702 306.56131 +L 108.439532 304.374465 +L 110.76771 302.650521 +L 113.025337 301.230161 +L 115.565167 299.901942 +L 118.104997 298.821881 +L 120.927031 297.864132 +L 124.031268 297.047342 +L 127.699911 296.327746 +L 131.932962 295.739516 +L 137.012622 295.269284 +L 143.503299 294.905825 +L 152.251603 294.651956 +L 159.253782 294.550788 +L 160.100392 270.364557 +L 160.664798 259.644097 +L 161.511408 247.84835 +L 162.410924 235.310872 +L 162.975331 224.276631 +L 163.539738 207.047137 +L 164.104144 176.959918 +L 164.668551 124.88218 +L 165.232958 62.306407 +L 165.515161 41.13531 +L 165.797364 30.701893 +L 166.079568 29.322595 +L 166.361771 34.340871 +L 166.926178 55.286536 +L 170.877025 236.011524 +L 172.005838 279.802965 +L 172.570245 295.180972 +L 173.134652 304.488449 +L 173.699058 309.516805 +L 174.263465 312.083866 +L 174.827872 313.298061 +L 175.392278 313.759886 +L 175.956685 313.792616 +L 176.521092 313.574214 +L 177.367702 312.984395 +L 178.778719 311.681424 +L 184.987193 305.609429 +L 187.527023 303.556017 +L 189.78465 301.999243 +L 192.32448 300.53276 +L 194.86431 299.33413 +L 197.686344 298.267692 +L 200.790581 297.356286 +L 204.177021 296.605466 +L 208.127868 295.968983 +L 212.925325 295.441091 +L 218.851595 295.032173 +L 226.753289 294.732269 +L 237.459009 294.549257 +L 238.305619 270.363215 +L 238.870025 259.642768 +L 239.734644 247.61293 +L 240.581254 235.876852 +L 241.145661 225.092708 +L 241.710067 208.394836 +L 242.274474 179.383592 +L 242.838881 128.769754 +L 243.685491 43.176627 +L 243.967694 31.457273 +L 244.249897 29.09994 +L 244.532101 33.459607 +L 245.025957 50.668561 +L 246.15477 105.898696 +L 247.565787 172.878056 +L 249.823414 265.926145 +L 250.38782 285.3062 +L 250.952227 298.686113 +L 251.516634 306.423469 +L 252.081041 310.519384 +L 252.645447 312.573173 +L 253.209854 313.503832 +L 253.774261 313.805259 +L 254.338667 313.744824 +L 255.185278 313.282246 +L 256.314091 312.32912 +L 258.853921 309.775576 +L 262.240361 306.459747 +L 264.780192 304.287859 +L 267.037819 302.62524 +L 269.295445 301.209408 +L 271.835276 299.885533 +L 274.375106 298.809037 +L 277.197139 297.854433 +L 280.301376 297.040276 +L 283.97002 296.322928 +L 288.20307 295.73645 +L 293.282731 295.267531 +L 299.773408 294.905001 +L 308.803915 294.646326 +L 315.576796 294.550167 +L 315.877537 288.063894 +L 316.441943 271.982493 +L 317.058363 259.93678 +L 317.834423 248.989086 +L 318.681033 237.552148 +L 319.245439 227.466434 +L 319.809846 212.254247 +L 320.374253 186.28446 +L 320.93866 140.222676 +L 321.78527 50.466543 +L 322.067473 34.673968 +L 322.349676 29.059064 +L 322.63188 31.175032 +L 322.914083 38.497228 +L 323.47849 61.741367 +L 326.300523 195.378739 +L 328.55815 284.216632 +L 329.122557 298.008956 +L 329.686964 306.053838 +L 330.25137 310.329002 +L 330.815777 312.481242 +L 331.380184 313.466426 +L 331.94459 313.798808 +L 332.508997 313.756413 +L 333.355607 313.308256 +L 334.484421 312.363324 +L 337.024251 309.813076 +L 340.410691 306.493273 +L 342.950521 304.3169 +L 344.925945 302.844706 +L 344.925945 302.844706 +" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_14"> + <path clip-path="url(#p8033eed20a)" d="M 63.075343 294.448873 +L 78.525976 294.422778 +L 100.537838 294.425266 +L 100.8863 287.945462 +L 101.450707 271.870739 +L 102.015113 260.675508 +L 102.861723 248.516577 +L 103.708333 236.704292 +L 104.27274 225.991792 +L 104.837147 209.440917 +L 105.405846 180.187354 +L 105.899702 136.705235 +L 106.746312 45.612349 +L 107.028515 30.877663 +L 107.310719 26.348196 +L 107.592922 29.305356 +L 108.157329 48.179994 +L 109.356693 107.050434 +L 110.76771 173.74712 +L 113.025337 266.841908 +L 113.589743 286.115899 +L 114.15415 299.28068 +L 114.718557 306.824592 +L 115.282964 310.79043 +L 115.84737 312.763062 +L 116.411777 313.643232 +L 116.976184 313.912726 +L 117.54059 313.831638 +L 118.3872 313.350255 +L 119.516014 312.383715 +L 122.338047 309.527491 +L 125.442284 306.491991 +L 127.982115 304.31439 +L 130.239741 302.64721 +L 132.497368 301.227361 +L 135.037199 299.899653 +L 137.577029 298.820027 +L 140.399062 297.862674 +L 143.503299 297.046227 +L 147.171943 296.326938 +L 151.404993 295.738959 +L 156.484654 295.268927 +L 162.975331 294.905623 +L 171.723635 294.651863 +L 178.778719 294.550188 +L 179.863542 265.919221 +L 180.710152 252.44026 +L 182.121169 232.599837 +L 182.685576 220.258816 +L 183.293972 198.171331 +L 183.858379 161.03514 +L 185.269396 32.58589 +L 185.551599 28.938402 +L 185.833803 32.419865 +L 186.398209 51.791414 +L 187.809226 121.361392 +L 189.220243 186.156684 +L 191.47787 277.151354 +L 192.042277 293.412942 +L 192.606683 303.490391 +L 193.17109 308.994129 +L 193.735497 311.824479 +L 194.299903 313.183553 +L 194.86431 313.726849 +L 195.428717 313.806623 +L 195.993124 313.61606 +L 196.839734 313.04878 +L 198.25075 311.760161 +L 204.741428 305.433825 +L 207.281258 303.405971 +L 209.538885 301.871456 +L 212.078715 300.427759 +L 214.618545 299.248796 +L 217.440579 298.200455 +L 220.544816 297.304836 +L 223.931256 296.567167 +L 227.882103 295.941888 +L 232.67956 295.423305 +L 238.60583 295.021598 +L 246.507524 294.726978 +L 256.878498 294.550632 +L 257.222353 288.06391 +L 257.78676 271.982507 +L 258.351167 260.803143 +L 259.197777 248.751939 +L 260.044387 237.268384 +L 260.617692 226.849528 +L 261.111548 213.693178 +L 261.675955 188.84333 +L 262.240361 144.602505 +L 263.086972 53.835814 +L 263.369175 36.378749 +L 263.651378 29.346897 +L 263.933582 30.459285 +L 264.215785 37.127288 +L 264.780192 59.727268 +L 267.884429 205.278564 +L 269.859852 282.901165 +L 270.424259 297.180499 +L 270.988665 305.598897 +L 271.553072 310.093857 +L 272.117479 312.366935 +L 272.681886 313.41895 +L 273.246292 313.789201 +L 273.810699 313.768838 +L 274.375106 313.518911 +L 275.503919 312.659698 +L 277.479343 310.726105 +L 281.782944 306.468052 +L 284.252223 304.351141 +L 286.50985 302.679591 +L 288.838028 301.21463 +L 291.307307 299.92307 +L 293.847137 298.839435 +L 296.669171 297.878328 +L 299.773408 297.058536 +L 303.442051 296.33618 +L 307.675102 295.745593 +L 312.754762 295.273385 +L 319.245439 294.908313 +L 327.993743 294.653237 +L 335.048827 294.551 +L 335.3586 290.506036 +L 335.923007 273.67791 +L 336.487414 262.007102 +L 337.334024 249.660688 +L 338.435268 234.296521 +L 338.999674 222.80028 +L 339.564081 204.588951 +L 340.128488 172.538375 +L 340.692895 118.005471 +L 341.257301 56.876324 +L 341.539505 38.01386 +L 341.821708 29.737763 +L 342.103911 29.95304 +L 342.386115 36.031362 +L 342.950521 58.044661 +L 344.925945 155.033094 +L 344.925945 155.033094 +" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_15"> + <path clip-path="url(#p8033eed20a)" d="M 63.075343 294.448873 +L 78.525976 294.422778 +L 120.080421 294.425706 +L 120.636028 279.153899 +L 121.200435 265.803068 +L 122.047045 252.256923 +L 123.175859 236.705702 +L 123.740265 225.994358 +L 124.304672 209.445951 +L 124.869079 180.557683 +L 125.433485 129.43113 +L 126.280095 41.154695 +L 126.571098 28.818931 +L 126.853301 26.52579 +L 127.135505 31.012156 +L 127.699911 51.447518 +L 131.932962 244.334017 +L 133.061775 286.243065 +L 133.626182 299.358116 +L 134.190588 306.866219 +L 134.754995 310.811519 +L 135.319402 312.772951 +L 135.883809 313.646943 +L 136.448215 313.912942 +L 137.012622 313.829822 +L 137.859232 313.346823 +L 138.988046 312.379374 +L 141.810079 309.522835 +L 144.914316 306.487826 +L 147.454146 304.310786 +L 149.711773 302.644117 +L 151.9694 301.224748 +L 154.50923 299.89752 +L 157.04906 298.8183 +L 159.871094 297.861317 +L 162.975331 297.045192 +L 166.643974 296.326187 +L 170.877025 295.738442 +L 175.956685 295.268596 +L 182.447362 294.905437 +L 191.195666 294.651776 +L 198.25075 294.550142 +L 198.497351 290.505845 +L 199.061758 273.677719 +L 199.626164 262.006782 +L 200.472774 249.659541 +L 201.601588 233.831455 +L 202.165995 222.100976 +L 202.730401 203.403798 +L 203.294808 170.394727 +L 203.859215 114.754883 +L 204.459224 51.534876 +L 204.741428 35.18571 +L 205.023631 29.088927 +L 205.305834 30.861999 +L 205.588038 37.960086 +L 206.152444 60.983477 +L 209.256681 206.387753 +L 211.232105 283.732643 +L 211.796511 297.706885 +L 212.360918 305.889403 +L 212.925325 310.245023 +L 213.489732 312.441338 +L 214.054138 313.450831 +L 214.618545 313.796948 +L 215.182952 313.76252 +L 216.029562 313.320692 +L 217.158375 312.379314 +L 219.698205 309.830404 +L 223.084646 306.508708 +L 225.624476 304.330253 +L 227.882103 302.661632 +L 230.13973 301.240155 +L 232.67956 299.910643 +L 235.21939 298.829363 +L 238.041424 297.870403 +L 241.145661 297.052474 +L 244.814304 296.331775 +L 248.976804 295.750685 +L 254.056464 295.276643 +L 260.617692 294.907207 +L 269.577649 294.648661 +L 276.350529 294.551461 +L 276.633009 292.908978 +L 277.197415 275.453957 +L 277.761822 263.258443 +L 278.608432 250.576243 +L 279.737245 235.023104 +L 280.301652 223.856311 +L 280.866059 206.349487 +L 281.430466 175.70675 +L 281.994596 122.937951 +L 282.559003 60.717666 +L 282.841206 40.199039 +L 283.12341 30.390518 +L 283.405613 29.478259 +L 283.687817 34.808534 +L 284.252223 56.070053 +L 287.920867 225.142716 +L 289.331884 280.369973 +L 289.89629 295.551746 +L 290.460697 304.695435 +L 291.025104 309.624436 +L 291.589511 312.136681 +L 292.153917 313.320698 +L 292.718324 313.765529 +L 293.282731 313.788434 +L 293.847137 313.564215 +L 294.693747 312.96969 +L 296.104764 311.663746 +L 302.313238 305.594024 +L 304.853068 303.542853 +L 307.110695 301.988032 +L 309.650525 300.523551 +L 312.190356 299.326649 +L 315.012389 298.2618 +L 318.116626 297.35178 +L 321.503066 296.602115 +L 325.453913 295.966614 +L 330.25137 295.439537 +L 336.177641 295.03125 +L 344.079335 294.731809 +L 344.925945 294.710365 +L 344.925945 294.710365 +" style="fill:none;stroke:#d62728;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_16"/> + <g id="line2d_17"/> + <g id="line2d_18"/> + <g id="line2d_19"/> + <g id="patch_3"> + <path d="M 48.982813 328.52 +L 48.982813 7.2 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + <g id="patch_4"> + <path d="M 48.982812 328.52 +L 359.018475 328.52 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + </g> + <g id="legend_1"> + <g id="text_14"> + <!-- Cell --> + <g transform="translate(382.455462 156.44125)scale(0.1 -0.1)"> + <defs> + <path d="M 64.40625 67.28125 +L 64.40625 56.890625 +Q 59.421875 61.53125 53.78125 63.8125 +Q 48.140625 66.109375 41.796875 66.109375 +Q 29.296875 66.109375 22.65625 58.46875 +Q 16.015625 50.828125 16.015625 36.375 +Q 16.015625 21.96875 22.65625 14.328125 +Q 29.296875 6.6875 41.796875 6.6875 +Q 48.140625 6.6875 53.78125 8.984375 +Q 59.421875 11.28125 64.40625 15.921875 +L 64.40625 5.609375 +Q 59.234375 2.09375 53.4375 0.328125 +Q 47.65625 -1.421875 41.21875 -1.421875 +Q 24.65625 -1.421875 15.125 8.703125 +Q 5.609375 18.84375 5.609375 36.375 +Q 5.609375 53.953125 15.125 64.078125 +Q 24.65625 74.21875 41.21875 74.21875 +Q 47.75 74.21875 53.53125 72.484375 +Q 59.328125 70.75 64.40625 67.28125 +z +" id="DejaVuSans-67"/> + <path d="M 56.203125 29.59375 +L 56.203125 25.203125 +L 14.890625 25.203125 +Q 15.484375 15.921875 20.484375 11.0625 +Q 25.484375 6.203125 34.421875 6.203125 +Q 39.59375 6.203125 44.453125 7.46875 +Q 49.3125 8.734375 54.109375 11.28125 +L 54.109375 2.78125 +Q 49.265625 0.734375 44.1875 -0.34375 +Q 39.109375 -1.421875 33.890625 -1.421875 +Q 20.796875 -1.421875 13.15625 6.1875 +Q 5.515625 13.8125 5.515625 26.8125 +Q 5.515625 40.234375 12.765625 48.109375 +Q 20.015625 56 32.328125 56 +Q 43.359375 56 49.78125 48.890625 +Q 56.203125 41.796875 56.203125 29.59375 +z +M 47.21875 32.234375 +Q 47.125 39.59375 43.09375 43.984375 +Q 39.0625 48.390625 32.421875 48.390625 +Q 24.90625 48.390625 20.390625 44.140625 +Q 15.875 39.890625 15.1875 32.171875 +z +" id="DejaVuSans-101"/> + <path d="M 9.421875 75.984375 +L 18.40625 75.984375 +L 18.40625 0 +L 9.421875 0 +z +" id="DejaVuSans-108"/> + </defs> + <use xlink:href="#DejaVuSans-67"/> + <use x="69.824219" xlink:href="#DejaVuSans-101"/> + <use x="131.347656" xlink:href="#DejaVuSans-108"/> + <use x="159.130859" xlink:href="#DejaVuSans-108"/> + </g> + </g> + <g id="line2d_20"> + <path d="M 364.427337 167.619375 +L 384.427337 167.619375 +" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_21"/> + <g id="text_15"> + <!-- cell 0 --> + <g transform="translate(392.427337 171.119375)scale(0.1 -0.1)"> + <defs> + <path d="M 48.78125 52.59375 +L 48.78125 44.1875 +Q 44.96875 46.296875 41.140625 47.34375 +Q 37.3125 48.390625 33.40625 48.390625 +Q 24.65625 48.390625 19.8125 42.84375 +Q 14.984375 37.3125 14.984375 27.296875 +Q 14.984375 17.28125 19.8125 11.734375 +Q 24.65625 6.203125 33.40625 6.203125 +Q 37.3125 6.203125 41.140625 7.25 +Q 44.96875 8.296875 48.78125 10.40625 +L 48.78125 2.09375 +Q 45.015625 0.34375 40.984375 -0.53125 +Q 36.96875 -1.421875 32.421875 -1.421875 +Q 20.0625 -1.421875 12.78125 6.34375 +Q 5.515625 14.109375 5.515625 27.296875 +Q 5.515625 40.671875 12.859375 48.328125 +Q 20.21875 56 33.015625 56 +Q 37.15625 56 41.109375 55.140625 +Q 45.0625 54.296875 48.78125 52.59375 +z +" id="DejaVuSans-99"/> + <path id="DejaVuSans-32"/> + </defs> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-48"/> + </g> + </g> + <g id="line2d_22"> + <path d="M 364.427337 182.2975 +L 384.427337 182.2975 +" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_23"/> + <g id="text_16"> + <!-- cell 1 --> + <g transform="translate(392.427337 185.7975)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-49"/> + </g> + </g> + <g id="line2d_24"> + <path d="M 364.427337 196.975625 +L 384.427337 196.975625 +" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_25"/> + <g id="text_17"> + <!-- cell 2 --> + <g transform="translate(392.427337 200.475625)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-50"/> + </g> + </g> + <g id="line2d_26"> + <path d="M 364.427337 211.65375 +L 384.427337 211.65375 +" style="fill:none;stroke:#d62728;stroke-linecap:square;stroke-width:1.5;"/> + </g> + <g id="line2d_27"/> + <g id="text_18"> + <!-- cell 3 --> + <g transform="translate(392.427337 215.15375)scale(0.1 -0.1)"> + <defs> + <path d="M 40.578125 39.3125 +Q 47.65625 37.796875 51.625 33 +Q 55.609375 28.21875 55.609375 21.1875 +Q 55.609375 10.40625 48.1875 4.484375 +Q 40.765625 -1.421875 27.09375 -1.421875 +Q 22.515625 -1.421875 17.65625 -0.515625 +Q 12.796875 0.390625 7.625 2.203125 +L 7.625 11.71875 +Q 11.71875 9.328125 16.59375 8.109375 +Q 21.484375 6.890625 26.8125 6.890625 +Q 36.078125 6.890625 40.9375 10.546875 +Q 45.796875 14.203125 45.796875 21.1875 +Q 45.796875 27.640625 41.28125 31.265625 +Q 36.765625 34.90625 28.71875 34.90625 +L 20.21875 34.90625 +L 20.21875 43.015625 +L 29.109375 43.015625 +Q 36.375 43.015625 40.234375 45.921875 +Q 44.09375 48.828125 44.09375 54.296875 +Q 44.09375 59.90625 40.109375 62.90625 +Q 36.140625 65.921875 28.71875 65.921875 +Q 24.65625 65.921875 20.015625 65.03125 +Q 15.375 64.15625 9.8125 62.3125 +L 9.8125 71.09375 +Q 15.4375 72.65625 20.34375 73.4375 +Q 25.25 74.21875 29.59375 74.21875 +Q 40.828125 74.21875 47.359375 69.109375 +Q 53.90625 64.015625 53.90625 55.328125 +Q 53.90625 49.265625 50.4375 45.09375 +Q 46.96875 40.921875 40.578125 39.3125 +z +" id="DejaVuSans-51"/> + </defs> + <use xlink:href="#DejaVuSans-99"/> + <use x="54.980469" xlink:href="#DejaVuSans-101"/> + <use x="116.503906" xlink:href="#DejaVuSans-108"/> + <use x="144.287109" xlink:href="#DejaVuSans-108"/> + <use x="172.070312" xlink:href="#DejaVuSans-32"/> + <use x="203.857422" xlink:href="#DejaVuSans-51"/> + </g> + </g> + </g> + </g> + <defs> + <clipPath id="p8033eed20a"> + <rect height="321.32" width="310.035663" x="48.982813" y="7.2"/> + </clipPath> + </defs> +</svg> diff --git a/doc/tutorial/single_cell_detailed.rst b/doc/tutorial/single_cell_detailed.rst index 78823febbf05f276824bc1bd9ac1f44b9ec76407..4934b388ce27141bd54e4555e5f9c19a76aabaab 100644 --- a/doc/tutorial/single_cell_detailed.rst +++ b/doc/tutorial/single_cell_detailed.rst @@ -22,15 +22,15 @@ We start by building the cell. This will be a :ref:`cable cell <cablecell>` with geometry and dynamics which can be constructed from 3 components: 1. A **morphology** defining the geometry of the cell. -2. A **label dictionary** storing labeled expressions which define regions and locations of +2. A **label dictionary** storing labelled expressions which define regions and locations of interest on the cell. -3. A **decor** defining various properties and dynamics on these labeled regions and locations. - The decor also includes hints about how the cell is to be modeled under the hood, by +3. A **decor** defining various properties and dynamics on these regions and locations. + The decor also includes hints about how the cell is to be modelled under the hood, by splitting it into discrete control volumes (CV). Next, we construct a :class:`arbor.single_cell_model`. This model takes care of a lot of details behind the scenes: it sets up a recipe (more on recipes :ref:`here <modelrecipe>`), creates -a simulation object, manages the hardware etc. These details become more important when modeling +a simulation object, manages the hardware etc. These details become more important when modelling a network of cells, but can be abstracted away when working with single cell networks. The single cell model has 4 main functions: @@ -47,7 +47,7 @@ The cell Before creating the actual cell object, we have to create its components. -The morpholohgy +The morphology ^^^^^^^^^^^^^^^ We begin by constructing the following morphology: @@ -92,7 +92,7 @@ This can be done by manually building a segment tree: The same morphology can be represented using an SWC file (interpreted according to :ref:`Arbor's specifications <morph-formats>`). We can save the following in -``morph.swc``. +``single_cell_detailed.swc``. .. code-block:: python @@ -122,7 +122,7 @@ to :ref:`Arbor's specifications <morph-formats>`). We can save the following in More information on SWC loaders can be found :ref:`here <morph-formats>`. -The morphology can then be loaded from ``morph.swc`` in the following way: +The morphology can then be loaded from ``single_cell_detailed.swc`` in the following way: .. code-block:: python @@ -130,7 +130,7 @@ The morphology can then be loaded from ``morph.swc`` in the following way: # Read the morphology from an SWC file - morph = arbor.load_swc_arbor("morph.swc") + morph = arbor.load_swc_arbor("single_cell_detailed.swc") The label dictionary ^^^^^^^^^^^^^^^^^^^^ @@ -254,7 +254,7 @@ This will generate the following 2 locsets when applied to the previously define The decorations ^^^^^^^^^^^^^^^ -With the key regions and location expressions identified and labeled, we can start to +With the key regions and location expressions identified and labelled, we can start to define certain features, properties and dynamics on the cell. This is done through a :class:`arbor.decor` object, which stores a mapping of these "decorations" to certain region or location expressions. diff --git a/doc/tutorial/single_cell_detailed_recipe.rst b/doc/tutorial/single_cell_detailed_recipe.rst index ad00e01a658bd1d279f0d876d5620b52a8a063f8..94723c416dc6d29a020045e3098d2f57dae501f9 100644 --- a/doc/tutorial/single_cell_detailed_recipe.rst +++ b/doc/tutorial/single_cell_detailed_recipe.rst @@ -47,7 +47,7 @@ We can immediately paste the cell description code from the #(1) Read the morphology from an SWC file. - morph = arbor.load_swc_arbor("morph.swc") + morph = arbor.load_swc_arbor("single_cell_detailed.swc") #(2) Create and populate the label dictionary. @@ -272,7 +272,7 @@ that kind. We return ``self.the_props`` which we defined in step **(1)**. More information on the recipe can be found :ref:`here <modelrecipe>`. -Now we can intantiate a ``single_recipe`` object using the ``cell`` and ``probe`` we created in the +Now we can instantiate a ``single_recipe`` object using the ``cell`` and ``probe`` we created in the previous section: .. code-block:: python @@ -284,15 +284,15 @@ previous section: The execution context ********************* -The execution context contains all system-specific information needed by the simulation: it contains the -thread pool which handles multi-threaded optimization on the CPU; it knows the relevant GPU attributes -if a GPU is available; and it holds the MPI communicator for distributed simulations. In the previous +An :ref:`execution context <modelcontext>`_ describes the hardware resources on which the simulation will run. +It contains the thread pool used to parallelise work on the local CPU, and optionally describes GPU resources +and the MPI communicator for distributed simulations. In the previous examples, the :class:`arbor.single_cell_model` object created the execution context :class:`arbor.context` behind the scenes. The details of the execution context can be customized by the user. We may specify the number of threads in the thread pool; determine the id of the GPU to be used; or create our own MPI communicator. However, -the ideal settings can usually be inferred from the system, and arbor can do that with a simple command. +the ideal settings can usually be inferred from the system, and Arbor can do that with a simple command. .. code-block:: python diff --git a/python/example/mpi.py b/python/example/mpi.py new file mode 100644 index 0000000000000000000000000000000000000000..14e7e409eb3083e03fadcfedba91a3379ac7a9b0 --- /dev/null +++ b/python/example/mpi.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 + +import arbor +import pandas, seaborn +from math import sqrt + +# Run with srun -n NJOBS python network_ring_mpi.py + +# Construct a cell with the following morphology. +# The soma (at the root of the tree) is marked 's', and +# the end of each branch i is marked 'bi'. +# +# b1 +# / +# s----b0 +# \ +# b2 + +def make_cable_cell(gid): + # (1) Build a segment tree + tree = arbor.segment_tree() + + # Soma (tag=1) with radius 6 μm, modelled as cylinder of length 2*radius + s = tree.append(arbor.mnpos, arbor.mpoint(-12, 0, 0, 6), arbor.mpoint(0, 0, 0, 6), tag=1) + + # Single dendrite (tag=3) of length 50 μm and radius 2 μm attached to soma. + b0 = tree.append(s, arbor.mpoint(0, 0, 0, 2), arbor.mpoint(50, 0, 0, 2), tag=3) + + # Attach two dendrites (tag=3) of length 50 μm to the end of the first dendrite. + # Radius tapers from 2 to 0.5 μm over the length of the dendrite. + b1 = tree.append(b0, arbor.mpoint(50, 0, 0, 2), arbor.mpoint(50+50/sqrt(2), 50/sqrt(2), 0, 0.5), tag=3) + # Constant radius of 1 μm over the length of the dendrite. + b2 = tree.append(b0, arbor.mpoint(50, 0, 0, 1), arbor.mpoint(50+50/sqrt(2), -50/sqrt(2), 0, 1), tag=3) + + # Associate labels to tags + labels = arbor.label_dict() + labels['soma'] = '(tag 1)' + labels['dend'] = '(tag 3)' + + # (2) Mark location for synapse at the midpoint of branch 1 (the first dendrite). + labels['synapse_site'] = '(location 1 0.5)' + # Mark the root of the tree. + labels['root'] = '(root)' + + # (3) Create a decor and a cable_cell + decor = arbor.decor() + + # Put hh dynamics on soma, and passive properties on the dendrites. + decor.paint('"soma"', 'hh') + decor.paint('"dend"', 'pas') + + # (4) Attach a single synapse. + decor.place('"synapse_site"', 'expsyn') + + # Attach a spike detector with threshold of -10 mV. + decor.place('"root"', arbor.spike_detector(-10)) + + cell = arbor.cable_cell(tree, labels, decor) + + return cell + +# (5) Create a recipe that generates a network of connected cells. +class ring_recipe (arbor.recipe): + + def __init__(self, ncells): + # The base C++ class constructor must be called first, to ensure that + # all memory in the C++ class is initialized correctly. + arbor.recipe.__init__(self) + self.ncells = ncells + self.props = arbor.neuron_cable_properties() + self.cat = arbor.default_catalogue() + self.props.register(self.cat) + + # (6) The num_cells method that returns the total number of cells in the model + # must be implemented. + def num_cells(self): + return self.ncells + + # (7) The cell_description method returns a cell + def cell_description(self, gid): + return make_cable_cell(gid) + + # The kind method returns the type of cell with gid. + # Note: this must agree with the type returned by cell_description. + def cell_kind(self, gid): + return arbor.cell_kind.cable + + # (8) Make a ring network. For each gid, provide a list of incoming connections. + def connections_on(self, gid): + src = (gid-1)%self.ncells + w = 0.01 + d = 5 + return [arbor.connection((src,0), (gid,0), w, d)] + + def num_targets(self, gid): + return 1 + + def num_sources(self, gid): + return 1 + + # (9) Attach a generator to the first cell in the ring. + def event_generators(self, gid): + if gid==0: + sched = arbor.explicit_schedule([1]) + return [arbor.event_generator((0,0), 0.1, sched)] + return [] + + # (10) Place a probe at the root of each cell. + def probes(self, gid): + return [arbor.cable_probe_membrane_voltage('"root"')] + + def global_properties(self, kind): + return self.props + +# (11) Instantiate recipe +ncells = 50 +recipe = ring_recipe(ncells) + +# (12) Create an MPI communicator, and use it to create a hardware context +arbor.mpi_init() +comm = arbor.mpi_comm() +print(comm) +context = arbor.context(mpi=comm) +print(context) + +# (13) Create a default domain decomposition and simulation +decomp = arbor.partition_load_balance(recipe, context) +sim = arbor.simulation(recipe, decomp, context) + +# (14) Set spike generators to record +sim.record(arbor.spike_recording.all) + +# (15) Attach a sampler to the voltage probe on cell 0. Sample rate of 1 sample every ms. +# Sampling period increased w.r.t network_ring.py to reduce amount of data +handles = [sim.sample((gid, 0), arbor.regular_schedule(1)) for gid in range(ncells)] + +# (16) Run simulation +sim.run(ncells*5) +print('Simulation finished') + +# (17) Plot the recorded voltages over time. +print("Storing results ...") +df_list = [] +for gid in range(ncells): + if len(sim.samples(handles[gid])): + samples, meta = sim.samples(handles[gid])[0] + df_list.append(pandas.DataFrame({'t/ms': samples[:, 0], 'U/mV': samples[:, 1], 'Cell': f"cell {gid}"})) + +if len(df_list): + df = pandas.concat(df_list) + df.to_csv(f"result_mpi_{context.rank}.csv", float_format='%g') diff --git a/python/example/mpi_plot.py b/python/example/mpi_plot.py new file mode 100644 index 0000000000000000000000000000000000000000..ba6a4f1fcaf7c6c6a58beac45dffac45a2721462 --- /dev/null +++ b/python/example/mpi_plot.py @@ -0,0 +1,11 @@ +import glob +import pandas, seaborn + +results = glob.glob("result_mpi_*.csv") + +df_list = [] +for result in results: + df_list.append(pandas.read_csv(result)) + +df = pandas.concat(df_list) +seaborn.relplot(data=df, kind="line", x="t/ms", y="U/mV",hue="Cell",ci=None).savefig('mpi_result.svg') \ No newline at end of file diff --git a/python/example/network_ring.py b/python/example/network_ring.py index 7038c3b5289be2bdc9888ede8a0c2aec8aa278a9..14671b3b362c0b7c4f179710db4d11234a598b29 100755 --- a/python/example/network_ring.py +++ b/python/example/network_ring.py @@ -2,7 +2,6 @@ import arbor import pandas, seaborn -import numpy from math import sqrt # Construct a cell with the following morphology. @@ -16,38 +15,41 @@ from math import sqrt # b2 def make_cable_cell(gid): - # Associate labels to tags - labels = arbor.label_dict() - labels['soma'] = '(tag 1)' - labels['dend'] = '(tag 3)' - - # Build a segment tree + # (1) Build a segment tree tree = arbor.segment_tree() # Soma (tag=1) with radius 6 μm, modelled as cylinder of length 2*radius s = tree.append(arbor.mnpos, arbor.mpoint(-12, 0, 0, 6), arbor.mpoint(0, 0, 0, 6), tag=1) - # Single dendrite (tag=3) of length 100 μm and radius 2 μm attached to soma. - b0 = tree.append(s, arbor.mpoint(0, 0, 0, 2), arbor.mpoint(100, 0, 0, 2), tag=3) + # Single dendrite (tag=3) of length 50 μm and radius 2 μm attached to soma. + b0 = tree.append(s, arbor.mpoint(0, 0, 0, 2), arbor.mpoint(50, 0, 0, 2), tag=3) # Attach two dendrites (tag=3) of length 50 μm to the end of the first dendrite. # Radius tapers from 2 to 0.5 μm over the length of the dendrite. - b1 = tree.append(b0, arbor.mpoint(100, 0, 0, 2), arbor.mpoint(100+50/sqrt(2), 50/sqrt(2), 0, 0.5), tag=3) + b1 = tree.append(b0, arbor.mpoint(50, 0, 0, 2), arbor.mpoint(50+50/sqrt(2), 50/sqrt(2), 0, 0.5), tag=3) # Constant radius of 1 μm over the length of the dendrite. - b2 = tree.append(b0, arbor.mpoint(100, 0, 0, 1), arbor.mpoint(100+50/sqrt(2), -50/sqrt(2), 0, 1), tag=3) + b2 = tree.append(b0, arbor.mpoint(50, 0, 0, 1), arbor.mpoint(50+50/sqrt(2), -50/sqrt(2), 0, 1), tag=3) - # Mark location for synapse at the midpoint of branch 1 (the first dendrite). + # Associate labels to tags + labels = arbor.label_dict() + labels['soma'] = '(tag 1)' + labels['dend'] = '(tag 3)' + + # (2) Mark location for synapse at the midpoint of branch 1 (the first dendrite). labels['synapse_site'] = '(location 1 0.5)' # Mark the root of the tree. labels['root'] = '(root)' + # (3) Create a decor and a cable_cell decor = arbor.decor() # Put hh dynamics on soma, and passive properties on the dendrites. decor.paint('"soma"', 'hh') decor.paint('"dend"', 'pas') - # Attach a single synapse. + + # (4) Attach a single synapse. decor.place('"synapse_site"', 'expsyn') + # Attach a spike detector with threshold of -10 mV. decor.place('"root"', arbor.spike_detector(-10)) @@ -55,104 +57,84 @@ def make_cable_cell(gid): return cell +# (5) Create a recipe that generates a network of connected cells. class ring_recipe (arbor.recipe): - def __init__(self, n=10): + def __init__(self, ncells): # The base C++ class constructor must be called first, to ensure that # all memory in the C++ class is initialized correctly. arbor.recipe.__init__(self) - self.ncells = n + self.ncells = ncells self.props = arbor.neuron_cable_properties() self.cat = arbor.default_catalogue() self.props.register(self.cat) - # The num_cells method that returns the total number of cells in the model + # (6) The num_cells method that returns the total number of cells in the model # must be implemented. def num_cells(self): return self.ncells - # The cell_description method returns a cell + # (7) The cell_description method returns a cell def cell_description(self, gid): return make_cable_cell(gid) - def num_targets(self, gid): - return 1 - - def num_sources(self, gid): - return 1 - # The kind method returns the type of cell with gid. # Note: this must agree with the type returned by cell_description. def cell_kind(self, gid): return arbor.cell_kind.cable - # Make a ring network + # (8) Make a ring network. For each gid, provide a list of incoming connections. def connections_on(self, gid): src = (gid-1)%self.ncells w = 0.01 d = 5 - return [arbor.connection(arbor.cell_member(src,0), arbor.cell_member(gid,0), w, d)] + return [arbor.connection((src,0), (gid,0), w, d)] - # Attach a generator to the first cell in the ring. + def num_targets(self, gid): + return 1 + + def num_sources(self, gid): + return 1 + + # (9) Attach a generator to the first cell in the ring. def event_generators(self, gid): if gid==0: sched = arbor.explicit_schedule([1]) - return [arbor.event_generator(arbor.cell_member(0,0), 0.1, sched)] + return [arbor.event_generator((0,0), 0.1, sched)] return [] + # (10) Place a probe at the root of each cell. def probes(self, gid): - return [arbor.cable_probe_membrane_voltage('(location 0 0)')] + return [arbor.cable_probe_membrane_voltage('"root"')] def global_properties(self, kind): return self.props -context = arbor.context(threads=12, gpu_id=None) -print(context) - -meters = arbor.meter_manager() -meters.start(context) - +# (11) Instantiate recipe ncells = 4 recipe = ring_recipe(ncells) -print(f'{recipe}') - -meters.checkpoint('recipe-create', context) - -hint = arbor.partition_hint() -hint.prefer_gpu = True -hint.gpu_group_size = 1000 -print(f'{hint}') - -hints = dict([(arbor.cell_kind.cable, hint)]) -decomp = arbor.partition_load_balance(recipe, context, hints) -print(f'{decomp}') - -meters.checkpoint('load-balance', context) +# (12) Create a default execution context, domain decomposition and simulation +context = arbor.context() +decomp = arbor.partition_load_balance(recipe, context) sim = arbor.simulation(recipe, decomp, context) -sim.record(arbor.spike_recording.all) -meters.checkpoint('simulation-init', context) +# (13) Set spike generators to record +sim.record(arbor.spike_recording.all) -# Attach a sampler to the voltage probe on cell 0. -# Sample rate of 10 sample every ms. +# (14) Attach a sampler to the voltage probe on cell 0. Sample rate of 10 sample every ms. handles = [sim.sample((gid, 0), arbor.regular_schedule(0.1)) for gid in range(ncells)] -tfinal=100 -sim.run(tfinal) -print(f'{sim} finished') - -meters.checkpoint('simulation-run', context) - -# Print profiling information -print(f'{arbor.meter_report(meters, context)}') +# (15) Run simulation +sim.run(100) +print('Simulation finished') -# Print spike times +# (16) Print spike times print('spikes:') for sp in sim.spikes(): print(' ', sp) -# Plot the recorded voltages over time. +# (17) Plot the recorded voltages over time. print("Plotting results ...") df_list = [] for gid in range(ncells): diff --git a/python/example/single_cell_detailed.py b/python/example/single_cell_detailed.py index 140b4d900cf6880aa1e36e1892997f2e29e0c067..d02238396983cc99be8bec7eb44fa1a55f426675 100755 --- a/python/example/single_cell_detailed.py +++ b/python/example/single_cell_detailed.py @@ -7,7 +7,7 @@ from arbor import mechanism as mech #(1) Read the morphology from an SWC file. # Read the SWC filename from input -# Example from docs: morph.swc +# Example from docs: single_cell_detailed.swc if len(sys.argv) < 2: print("No SWC file passed to the program") diff --git a/python/example/morph.swc b/python/example/single_cell_detailed.swc similarity index 100% rename from python/example/morph.swc rename to python/example/single_cell_detailed.swc diff --git a/python/example/single_cell_detailed_recipe.py b/python/example/single_cell_detailed_recipe.py index f7dfaf082470a95f30d28dcf4235ec1041a56b52..2e1ecac9d40ed53d0800371ea18c472164b2a894 100644 --- a/python/example/single_cell_detailed_recipe.py +++ b/python/example/single_cell_detailed_recipe.py @@ -11,7 +11,7 @@ from arbor import mechanism as mech # Create the morphology # Read the SWC filename from input -# Example from docs: morph.swc +# Example from docs: single_cell_detailed.swc if len(sys.argv) < 2: print("No SWC file passed to the program")