{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Part 1: Transform cascade from SBML 2 NEURON" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Import pyneuroml" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "from pyneuroml import pynml" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Define file name (here we use MODEL_speedy_reduced2.xml) and set required parameters" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "SBML_file_name = 'MODEL_speedy_reduced2.xml'\n", "dur = 1 # ms, needed argument in neuroML. Does not change anything in the cascade.\n", "dt = 1 # ms, needed argument in neuroML. Does not change anything in the cascade." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## IMPORT the SBML file using jneuroml." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "This will create a new LEMS file named MODEL_speedy_reduced2_LEMS.xml (or similar if other file name is used) in the same directory" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pynml.run_jneuroml('-sbml-import', SBML_file_name, ' '.join([str(dur), str(dt)]) )" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## EXPORT the LEMS file into a NEURON readable .mod file." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "This will create a .mod file in the same directory. <br>\n", "The ID of the parent node in the xml file will be used as name of the mechanism." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "base, extention = SBML_file_name.split('.') #will not work if file name has more than one dot...\n", "LEMS_file_name = base + '_LEMS.' + extention\n", "\n", "pynml.run_jneuroml('', LEMS_file_name, '-neuron')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## CLEAN the .mod file" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The resulting .mod file will use the IDs of the substrate from the SBML file, instead of the names. <br>\n", "This makes it very hard to read (impossible if the file is large). <br>\n", "\n", "We therefore mapp all IDs to their respective names from the original file. <br>\n", "We also shorten some file names to avoide errors due to long file names (e.g. reversible_reaction -> r_r)\n", "\n", "It is likely that this will have to be custom made for each SBML file \n", " \n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "# Import lxml for parsing the SBML file\n", "from lxml import etree" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "READ in the tree from the SBML file" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "tree = etree.parse(SBML_file_name)\n", "root = tree.getroot()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "EXTRACT name and id from the SBML file and EXCHANGE id for name" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# open the .mod file resulting from the above cells (different depending on SBML file)\n", "mod_file_name = 'D1_LTP_time_window_0.mod'\n", "mod_file = open(mod_file_name, 'r')\n", "mod_file_data = mod_file.read() \n", "\n", "# close file\n", "mod_file.close()\n", "\n", "# get all species and parameter tags as well as the compartment tag (spine)\n", "species = root.xpath(\"//*[local-name() = 'species']\")\n", "parameters = root.xpath(\"//*[local-name() = 'parameter']\")\n", "compartment = root.xpath(\"//*[local-name() = 'compartment']\")\n", "\n", "for spc in species+parameters+compartment:\n", " \n", " # get name and id from tag\n", " name = spc.attrib['name']\n", " ID = spc.attrib['id' ]\n", " \n", " # replace non allowed characters in NEURON ('*' -> '_')\n", " name = name.replace('*', '_')\n", " \n", " # change id for name (if name is a single word)\n", " L = name.split(' ')\n", " \n", " if len(L) == 1:\n", " mod_file_data = mod_file_data.replace(ID, name)\n", " \n", "# exchange rate__revreaction and rate__irrevreaction with rate_r and rate_ir\n", "mod_file_data = mod_file_data.replace('rate__revreaction', 'rate_r')\n", "mod_file_data = mod_file_data.replace('rate__irrevreaction', 'rate_ir')\n", "\n", "# update comment\n", "org_com = '''This NEURON file has been generated by org.neuroml.export (see https://github.com/NeuroML/org.neuroml.export)\n", " org.neuroml.export v1.5.3\n", " org.neuroml.model v1.5.3\n", " jLEMS v0.9.9.0'''\n", "\n", "upd_com = '''reduced speedy cascade. Connects DA conc to an excitable target (by phosphorylation)\n", " - automatic version created using the jupyter notebook \"TRANSFORM_py_.ipynb\" \n", " \n", " - original cascade implemented and exported to SBML by Anu Nair; nair at kth . se\n", " based on published cascade in Nair et al., 2016 with removed dependencies and\n", " addition of excitable target.\n", " \n", " - transformation from SBML to mod by Robert Lindroos; robert . lindroos at ki . se\n", " and Daniel Keller; daniel . keller at epfl . ch\n", " using pyNeuroML.\n", " This mod file was further \"cleaned\" after pyNeuroML conversion:\n", " ~ IDs were exchanged for names\n", " ~ rate_revreaction -> rate_r\n", " ~ rate_irrevreaction -> rate_ir \n", " ~ '*' -> '_' (since not allowed by NEURON)\n", "\n", " This NEURON file has been generated by org.neuroml.export (see https://github.com/NeuroML/org.neuroml.export)\n", " org.neuroml.export v1.5.3\n", " org.neuroml.model v1.5.3\n", " jLEMS v0.9.9.0'''\n", "\n", "mod_file_data = mod_file_data.replace(org_com, upd_com)\n", "\n", "# save cleaned data as test_cascade.mod\n", "out_file = open('test_cascade.mod', 'w')\n", "out_file.write(mod_file_data)\n", "out_file.close()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "CLEAN up directory (remove additional files created in the transformation)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "rm D1_LTP_time_window_0.mod MODEL_speedy_reduced2_LEMS*" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## compile NEURON mechanisms" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creating x86_64 directory for .o files.\n", "\n", "/home/HDD-drive/Desktop/Notebook\n", "ampa.mod bk.mod cadyn.mod cal12.mod cal13.mod caldyn.mod can.mod caq.mod car.mod cat32.mod cat33.mod cav32.mod cav33.mod gaba.mod kaf.mod kas.mod kdr.mod kir.mod naf.mod nmda.mod sk.mod test_cascade.mod tmgabaa.mod tmglut.mod\n", "ampa.mod bk.mod cadyn.mod cal12.mod cal13.mod caldyn.mod can.mod caq.mod car.mod cat32.mod cat33.mod cav32.mod cav33.mod gaba.mod kaf.mod kas.mod kdr.mod kir.mod naf.mod nmda.mod sk.mod test_cascade.mod tmgabaa.mod tmglut.mod\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" ampa\n", "Translating ampa.mod into ampa.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o ampa.lo ampa.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c ampa.c -fPIC -DPIC -o .libs/ampa.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" bk\n", "Translating bk.mod into bk.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o bk.lo bk.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c bk.c -fPIC -DPIC -o .libs/bk.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" cadyn\n", "Translating cadyn.mod into cadyn.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o cadyn.lo cadyn.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c cadyn.c -fPIC -DPIC -o .libs/cadyn.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" cal12\n", "Translating cal12.mod into cal12.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o cal12.lo cal12.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c cal12.c -fPIC -DPIC -o .libs/cal12.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" cal13\n", "Translating cal13.mod into cal13.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o cal13.lo cal13.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c cal13.c -fPIC -DPIC -o .libs/cal13.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" caldyn\n", "Translating caldyn.mod into caldyn.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o caldyn.lo caldyn.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c caldyn.c -fPIC -DPIC -o .libs/caldyn.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" can\n", "Translating can.mod into can.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o can.lo can.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c can.c -fPIC -DPIC -o .libs/can.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" caq\n", "Translating caq.mod into caq.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o caq.lo caq.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c caq.c -fPIC -DPIC -o .libs/caq.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" car\n", "Translating car.mod into car.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o car.lo car.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c car.c -fPIC -DPIC -o .libs/car.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" cat32\n", "Translating cat32.mod into cat32.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o cat32.lo cat32.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c cat32.c -fPIC -DPIC -o .libs/cat32.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" cat33\n", "Translating cat33.mod into cat33.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o cat33.lo cat33.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c cat33.c -fPIC -DPIC -o .libs/cat33.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" cav32\n", "Translating cav32.mod into cav32.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o cav32.lo cav32.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c cav32.c -fPIC -DPIC -o .libs/cav32.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" cav33\n", "Translating cav33.mod into cav33.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o cav33.lo cav33.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c cav33.c -fPIC -DPIC -o .libs/cav33.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" gaba\n", "Translating gaba.mod into gaba.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o gaba.lo gaba.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c gaba.c -fPIC -DPIC -o .libs/gaba.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" kaf\n", "Translating kaf.mod into kaf.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o kaf.lo kaf.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c kaf.c -fPIC -DPIC -o .libs/kaf.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" kas\n", "Translating kas.mod into kas.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o kas.lo kas.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c kas.c -fPIC -DPIC -o .libs/kas.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" kdr\n", "Translating kdr.mod into kdr.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o kdr.lo kdr.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c kdr.c -fPIC -DPIC -o .libs/kdr.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" kir\n", "Translating kir.mod into kir.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o kir.lo kir.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c kir.c -fPIC -DPIC -o .libs/kir.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" naf\n", "Translating naf.mod into naf.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o naf.lo naf.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c naf.c -fPIC -DPIC -o .libs/naf.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" nmda\n", "Translating nmda.mod into nmda.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o nmda.lo nmda.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c nmda.c -fPIC -DPIC -o .libs/nmda.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" sk\n", "Translating sk.mod into sk.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o sk.lo sk.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c sk.c -fPIC -DPIC -o .libs/sk.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" test_cascade\n", "Translating test_cascade.mod into test_cascade.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o test_cascade.lo test_cascade.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c test_cascade.c -fPIC -DPIC -o .libs/test_cascade.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" tmgabaa\n", "Translating tmgabaa.mod into tmgabaa.c\n", "Notice: Use of POINTER is not thread safe.\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o tmgabaa.lo tmgabaa.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c tmgabaa.c -fPIC -DPIC -o .libs/tmgabaa.o\n", "\"/home/HDD-drive/neuron/nrn/x86_64/bin/nocmodl\" tmglut\n", "Translating tmglut.mod into tmglut.c\n", "Thread Safe\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o tmglut.lo tmglut.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c tmglut.c -fPIC -DPIC -o .libs/tmglut.o\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=compile mpicc -DHAVE_CONFIG_H -I. -I.. -I\"/home/HDD-drive/neuron/nrn/include/nrn\" -I\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -g -O2 -c -o mod_func.lo mod_func.c\n", "libtool: compile: mpicc -DHAVE_CONFIG_H -I. -I.. -I/home/HDD-drive/neuron/nrn/include/nrn -I/home/HDD-drive/neuron/nrn/x86_64/lib -g -O2 -c mod_func.c -fPIC -DPIC -o .libs/mod_func.o\n", "\"/home/HDD-drive/neuron/nrn/share/nrn/libtool\" --tag=CC --mode=link mpicc -module -g -O2 -o libnrnmech.la -rpath \"/home/HDD-drive/neuron/nrn/x86_64/lib\" ampa.lo bk.lo cadyn.lo cal12.lo cal13.lo caldyn.lo can.lo caq.lo car.lo cat32.lo cat33.lo cav32.lo cav33.lo gaba.lo kaf.lo kas.lo kdr.lo kir.lo naf.lo nmda.lo sk.lo test_cascade.lo tmgabaa.lo tmglut.lo mod_func.lo -L\"/home/HDD-drive/neuron/nrn/x86_64/lib\" -lnrnoc -loc -lmemacs -lnrnmpi -lscopmath -lsparse13 -lreadline -lncurses -L\"/home/HDD-drive/neuron/nrn/x86_64/lib\" \"/home/HDD-drive/neuron/nrn/x86_64/lib/libnrniv.la\" -livoc -lneuron_gnu -lmeschach -lsundials -lm -ldl\n", "libtool: link: mpicc -shared -fPIC -DPIC .libs/ampa.o .libs/bk.o .libs/cadyn.o .libs/cal12.o .libs/cal13.o .libs/caldyn.o .libs/can.o .libs/caq.o .libs/car.o .libs/cat32.o .libs/cat33.o .libs/cav32.o .libs/cav33.o .libs/gaba.o .libs/kaf.o .libs/kas.o .libs/kdr.o .libs/kir.o .libs/naf.o .libs/nmda.o .libs/sk.o .libs/test_cascade.o .libs/tmgabaa.o .libs/tmglut.o .libs/mod_func.o -Wl,-rpath -Wl,/home/HDD-drive/neuron/nrn/x86_64/lib -Wl,-rpath -Wl,/home/HDD-drive/neuron/nrn/x86_64/lib -L/home/HDD-drive/neuron/nrn/x86_64/lib /home/HDD-drive/neuron/nrn/x86_64/lib/libnrnoc.so /home/HDD-drive/neuron/nrn/x86_64/lib/liboc.so /home/HDD-drive/neuron/nrn/x86_64/lib/libmemacs.so /home/HDD-drive/neuron/nrn/x86_64/lib/libnrnmpi.so /home/HDD-drive/neuron/nrn/x86_64/lib/libscopmath.so /home/HDD-drive/neuron/nrn/x86_64/lib/libsparse13.so /home/HDD-drive/neuron/nrn/x86_64/lib/libreadline.so -lncurses /home/HDD-drive/neuron/nrn/x86_64/lib/libnrniv.so /home/HDD-drive/neuron/nrn/x86_64/lib/libivoc.so /home/HDD-drive/neuron/nrn/x86_64/lib/libneuron_gnu.so /home/HDD-drive/neuron/nrn/x86_64/lib/libmeschach.so /home/HDD-drive/neuron/nrn/x86_64/lib/libsundials.so -lm -ldl -O2 -Wl,-soname -Wl,libnrnmech.so.0 -o .libs/libnrnmech.so.0.0.0\n", "libtool: link: (cd \".libs\" && rm -f \"libnrnmech.so.0\" && ln -s \"libnrnmech.so.0.0.0\" \"libnrnmech.so.0\")\n", "libtool: link: (cd \".libs\" && rm -f \"libnrnmech.so\" && ln -s \"libnrnmech.so.0.0.0\" \"libnrnmech.so\")\n", "libtool: link: ( cd \".libs\" && rm -f \"libnrnmech.la\" && ln -s \"../libnrnmech.la\" \"libnrnmech.la\" )\n", "Successfully created x86_64/special\n" ] } ], "source": [ "!nrnivmodl" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Part 2; TEST the cascade in a model" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "IMPORT libraries" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "from __future__ import print_function, division\n", "import sys\n", "import json\n", "import numpy as np\n", "from neuron import h\n", "from math import exp\n", "from joblib import Parallel, delayed\n", "import multiprocessing\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "deletable": true, "editable": true }, "source": [ "define default default values for input files:\n", "\n", "TODO: these should preferably be added by the user/added here directly" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "mod = \"./mod/\"\n", "defparams = \"./params-msn.json\"\n", "morphology = \"./morphology/\"\n", "\n", "h.nrn_load_dll(mod + 'x86_64/.libs/libnrnmech.so')\n", "h.load_file('stdlib.hoc')\n", "h.load_file('import3d.hoc')\n", "\n", "with open('./substrates.json') as file:\n", " SUBSTRATES = json.load(file)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## def functions" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#calculate_distribution(d3, dist, a4, a5, a6, a7, g8)\n", "def calculate_distribution(d3, dist, a4, a5, a6, a7, g8):\n", " # d3 is the distribution type:\n", " # 0 linear, 1 sigmoid, 2 exponential\n", " # 3 step for absolute distance (in microns)\n", " # dist is the somatic distance\n", " # a4-7 is distribution parameters \n", " # g8 is the maximal conductance\n", " if d3 == 0: \n", " value = a4 + a5*dist\n", " elif d3 == 1: \n", " value = a4 + a5/(1 + exp((dist-a6)/a7) )\n", " elif d3 == 2: \n", " value = a4 + a5*exp((dist-a6)/a7)\n", " elif d3 == 3:\n", " if (dist > a6) and (dist < a7):\n", " value = a4\n", " else:\n", " value = a5\n", " \n", " if value < 0:\n", " value = 0\n", " \n", " value = value*g8\n", " return value " ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "def alpha(tstart, gmax, tau):\n", " '''calc and returns a \"magnitude\" using an alpha function''' \n", " \n", " v = 1 - (h.t - tstart) / tau\n", " e = exp(v)\n", " mag = gmax * (h.t - tstart) / tau * e\n", " \n", " return mag" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "def calc_rand_Modulation(mod_list, range_list=False, distribution='centered'):\n", " '''\n", " calc random modulation values between 0 and 2 (i.e. max +/- 100%).\n", " \n", " Values close to 1 (no mod) are given higer probability.\n", " this is achived by drawing two uniform random numbers between 0 and 1, and subtracts one from the other.\n", " This gives values ranging from -1 to 1. By adding one we end upp at the wanted value.\n", " \n", " If a range_list is supplied the range of the values can be shifted from [0,2] to any\n", " other range. The range list must have the same length as mod_list and hold lists of\n", " [min, max] values.\n", " \n", " '''\n", " \n", " mod_factors = []\n", " \n", " A=0\n", " B=2\n", " \n", " for i,channel in enumerate(mod_list):\n", " \n", " if distribution=='centered':\n", " factor = 1.0 + ( np.random.uniform() - np.random.uniform() )\n", " elif distribution=='inv_centered':\n", " factor = 1.0 + ( np.random.uniform() - np.random.uniform() )\n", " if factor <= 1:\n", " factor = factor + 1.0\n", " else:\n", " factor = factor - 1.0\n", " elif distribution=='uniform':\n", " factor = 2.0 * np.random.uniform()\n", " else:\n", " print('Error in MF distribution--line ~121')\n", " eegsjsd\n", " \n", " \n", " if range_list:\n", " \n", " a = range_list[i][0]\n", " b = range_list[i][1]\n", " \n", " factor = (b-a) / (B-A) * (factor-A) + a\n", " \n", " mod_factors.append(factor)\n", " \n", " return mod_factors " ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "def make_random_synapse(ns, nc, Syn, sec, x, \\\n", " Type='glut', \\\n", " NS_start=1, \\\n", " NS_interval=1000.0/18.0, \\\n", " NS_noise=1.0, \\\n", " NS_number=1000, \\\n", " S_AN_ratio=1.0, \\\n", " S_tau_dep=100, \\\n", " S_U=1, \\\n", " S_e=-60, \\\n", " S_tau1=0.25, \\\n", " S_tau2=3.75, \\\n", " NC_delay=1, \\\n", " NC_conductance=0.6e-3, \\\n", " NC_threshold=0.1 ):\n", " \n", " \n", " # create/set synapse in segment x of section\n", " if Type == 'glut':\n", " key = sec\n", " Syn[key] = h.tmGlut(x, sec=sec)\n", " Syn[key].nmda_ratio = S_AN_ratio\n", " Syn[key].tauR = S_tau_dep\n", " Syn[key].U = S_U\n", " \n", " elif Type in ['expSyn2', 'tmgabaa', 'gaba']:\n", " \n", " key = sec.name() + '_gaba'\n", " \n", " if Type == 'expSyn2':\n", " Syn[key] = h.Exp2Syn(x, sec=sec)\n", " Syn[key].tau1 = S_tau1\n", " Syn[key].tau2 = S_tau2 \n", " elif Type == 'tmgabaa':\n", " Syn[key] = h.tmGabaA(x, sec=sec)\n", " \n", " Syn[key].e = S_e\n", " \n", " \n", " # create NetStim object\n", " ns[key] = h.NetStim()\n", " ns[key].start = NS_start\n", " ns[key].interval = NS_interval # mean interval between two spikes in ms\n", " ns[key].noise = NS_noise\n", " ns[key].number = NS_number\n", "\n", " # create NetCon object\n", " nc[key] = h.NetCon(ns[sec],Syn[sec])\n", " nc[key].delay = NC_delay\n", " nc[key].weight[0] = NC_conductance\n", " nc[key].threshold = NC_threshold" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "def set_rand_synapse(channel_list, base_mod, max_mod, range_list=[[0.75,1.5],[0.75,1.5]]): \n", " \n", " syn_fact = calc_rand_Modulation(channel_list, range_list=range_list, distribution='uniform')\n", " \n", " # normalize factors to max-value of pointer substrate\n", " normalized_factors = []\n", " for i,mech in enumerate(channel_list):\n", " \n", " normalized_factors.append( (syn_fact[i] - 1) / (max_mod - base_mod) ) \n", " \n", " return syn_fact, normalized_factors " ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## def MSN class" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "class MSN:\n", " '''MSN class definition'''\n", " def __init__(self, params=defparams, factors=None):\n", " Import = h.Import3d_SWC_read()\n", " Import.input(morphology + 'latest_WT-P270-20-14ak.swc')\n", " imprt = h.Import3d_GUI(Import, 0)\n", " imprt.instantiate(None)\n", " h.define_shape()\n", " # h.cao0_ca_ion = 2 # default in nrn\n", " h.celsius = 35\n", " self._create_sectionlists()\n", " self._set_nsegs()\n", " self.v_init = -80\n", " for sec in self.allseclist:\n", " sec.Ra = 150\n", " sec.cm = 1.0\n", " sec.insert('pas')\n", " #sec.g_pas = 1e-5 # set using json file\n", " sec.e_pas = -70 # -73\n", " for sec in self.somalist:\n", " sec.insert('naf')\n", " sec.insert('kaf')\n", " sec.insert('kas')\n", " sec.insert('kdr')\n", " sec.insert('kir')\n", " sec.ena = 50\n", " sec.ek = -85 # -90\n", " sec.insert('cal12')\n", " sec.insert('cal13')\n", " sec.insert('car')\n", " sec.insert('cadyn')\n", " sec.insert('caldyn')\n", " sec.insert('sk')\n", " sec.insert('bk')\n", " sec.insert('can')\n", " #sec.kb_cadyn = 200.\n", " for sec in self.axonlist:\n", " sec.insert('naf')\n", " #sec.insert('kaf')\n", " sec.insert('kas')\n", " #sec.insert('kdr')\n", " #sec.insert('kir')\n", " sec.ena = 50\n", " sec.ek = -85 # -90\n", " for sec in self.dendlist:\n", " sec.insert('naf')\n", " sec.insert('kaf')\n", " sec.insert('kas')\n", " sec.insert('kdr')\n", " sec.insert('kir')\n", " sec.ena = 50\n", " sec.ek = -85 # -90\n", " sec.insert('cal12')\n", " sec.insert('cal13')\n", " sec.insert('car')\n", " sec.insert('cadyn')\n", " sec.insert('caldyn')\n", " sec.insert('sk')\n", " sec.insert('bk')\n", " sec.insert('cat32')\n", " sec.insert('cat33')\n", "\n", " with open(params) as file:\n", " par = json.load(file)\n", "\n", " self.distribute_channels(\"soma\", \"g_pas\", 0, 1, 0, 0, 0, float(par['g_pas_all']['Value']))\n", " self.distribute_channels(\"axon\", \"g_pas\", 0, 1, 0, 0, 0, float(par['g_pas_all']['Value']))\n", " self.distribute_channels(\"dend\", \"g_pas\", 0, 1, 0, 0, 0, float(par['g_pas_all']['Value']))\n", "\n", " self.distribute_channels(\"soma\", \"gbar_naf\", 0, 1, 0, 0, 0, float(par['gbar_naf_somatic']['Value']),factors=factors)\n", " self.distribute_channels(\"soma\", \"gbar_kaf\", 0, 1, 0, 0, 0, float(par['gbar_kaf_somatic']['Value']))\n", " self.distribute_channels(\"soma\", \"gbar_kas\", 0, 1, 0, 0, 0, float(par['gbar_kas_somatic']['Value']))\n", " self.distribute_channels(\"soma\", \"gbar_kdr\", 0, 1, 0, 0, 0, float(par['gbar_kdr_somatic']['Value']))\n", " self.distribute_channels(\"soma\", \"gbar_kir\", 0, 1, 0, 0, 0, float(par['gbar_kir_somatic']['Value']))\n", " self.distribute_channels(\"soma\", \"gbar_sk\", 0, 1, 0, 0, 0, float(par['gbar_sk_somatic']['Value']))\n", " self.distribute_channels(\"soma\", \"gbar_bk\", 0, 1, 0, 0, 0, float(par['gbar_bk_somatic']['Value']))\n", " \n", " #self.distribute_channels(\"axon\", \"gbar_naf\", 0, 1, 0, 0, 0, float(par['gbar_naf_somatic']['Value']),factors=factors)\n", " self.distribute_channels(\"axon\", \"gbar_naf\", 3, 1, 1.1, 30, 500, float(par['gbar_naf_axonal']['Value']),factors=factors)\n", " #self.distribute_channels(\"axon\", \"gbar_naf\", 3, 1, 1.1, 20, 500, float(par['gbar_naf_axonal']['Value']))\n", " #self.distribute_channels(\"dend\", \"gbar_naf\", 1, 1, 1.2, 30, -5, float(par['gbar_naf_axonal']['Value']))\n", " self.distribute_channels(\"axon\", \"gbar_kas\", 0, 1, 0, 0, 0, float(par['gbar_kas_axonal']['Value']))\n", " \n", " self.distribute_channels(\"dend\", \"gbar_naf\", 1, 0.1, 0.9, 60.0, 10.0, float(par['gbar_naf_basal']['Value']),factors=factors)\n", " self.distribute_channels(\"dend\", \"gbar_kaf\", 1, 1, 0.5, 120, -30, float(par['gbar_kaf_basal']['Value']))\n", " #self.distribute_channels(\"dend\", \"gbar_naf\", 0, 1, -0.0072, 0, 0, float(par['gbar_naf_basal']['Value']))\n", " #self.distribute_channels(\"dend\", \"gbar_kaf\", 0, 1, 0.0167, 0, 0, float(par['gbar_kaf_basal']['Value']))\n", " self.distribute_channels(\"dend\", \"gbar_kas\", 2, 1, 9.0, 0.0, -5.0, float(par['gbar_kas_basal']['Value']))\n", " self.distribute_channels(\"dend\", \"gbar_kdr\", 0, 1, 0, 0, 0, float(par['gbar_kdr_basal']['Value']))\n", " self.distribute_channels(\"dend\", \"gbar_kir\", 0, 1, 0, 0, 0, float(par['gbar_kir_basal']['Value']))\n", " self.distribute_channels(\"dend\", \"gbar_sk\", 0, 1, 0, 0, 0, float(par['gbar_sk_basal']['Value']))\n", " self.distribute_channels(\"dend\", \"gbar_bk\", 0, 1, 0, 0, 0, float(par['gbar_bk_basal']['Value']))\n", "\n", " self.distribute_channels(\"soma\", \"pbar_cal12\", 0, 1, 0, 0, 0, 1e-5)\n", " self.distribute_channels(\"soma\", \"pbar_cal13\", 0, 1, 0, 0, 0, 1e-6)\n", " self.distribute_channels(\"soma\", \"pbar_car\", 0, 1, 0, 0, 0, 1e-4)\n", " self.distribute_channels(\"soma\", \"pbar_can\", 0, 1, 0, 0, 0, 3e-5)\n", " #self.distribute_channels(\"soma\", \"kb_cadyn\", 0, 1, 0, 0, 0, 200.0)\n", " self.distribute_channels(\"dend\", \"pbar_cal12\", 0, 1, 0, 0, 0, 1e-5)\n", " self.distribute_channels(\"dend\", \"pbar_cal13\", 0, 1, 0, 0, 0, 1e-6)\n", " self.distribute_channels(\"dend\", \"pbar_car\", 0, 1, 0, 0, 0, 1e-4)\n", " self.distribute_channels(\"dend\", \"pbar_cat32\", 1, 0, 1.0, 70.0, -4.5, 1e-7)\n", " self.distribute_channels(\"dend\", \"pbar_cat33\", 1, 0, 1.0, 70.0, -4.5, 1e-8)\n", "\n", " def _create_sectionlists(self):\n", " self.allsecnames = []\n", " self.allseclist = h.SectionList()\n", " for sec in h.allsec():\n", " self.allsecnames.append(sec.name())\n", " self.allseclist.append(sec=sec)\n", " self.nsomasec = 0\n", " self.somalist = h.SectionList()\n", " for sec in h.allsec():\n", " if sec.name().find('soma') >= 0:\n", " self.somalist.append(sec=sec)\n", " if self.nsomasec == 0:\n", " self.soma = sec\n", " self.nsomasec += 1\n", " self.axonlist = h.SectionList()\n", " for sec in h.allsec():\n", " if sec.name().find('axon') >= 0:\n", " self.axonlist.append(sec=sec)\n", " self.dendlist = h.SectionList()\n", " for sec in h.allsec():\n", " if sec.name().find('dend') >= 0:\n", " self.dendlist.append(sec=sec)\n", "\n", " def _set_nsegs(self):\n", " for sec in self.allseclist:\n", " sec.nseg = 2*int(sec.L/40.0)+1\n", " for sec in self.axonlist:\n", " sec.nseg = 2 # two segments in axon initial segment\n", "\n", " def _max_dist(self, axon_excluding=True):\n", " h.distance(sec=self.soma)\n", " dmax = 0\n", " for sec in self.allseclist:\n", " if axon_excluding and sec.name().find('axon') == 0: continue\n", " dmax = max(dmax, h.distance(1, sec=sec))\n", " return dmax\n", "\n", " def distribute_channels(self, as1, as2, d3, a4, a5, a6, a7, g8, factors=None):\n", " h.distance(sec=self.soma)\n", " dmax = self._max_dist()\n", " for sec in self.allseclist:\n", " if sec.name().find(as1) >= 0:\n", " for seg in sec:\n", " dist = h.distance(seg.x, sec=sec)\n", " val = calculate_distribution(d3, dist, a4, a5, a6, a7, g8)\n", " cmd = 'seg.%s = %g' % (as2, val)\n", " exec(cmd)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## main function" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "def main(par=\"./params-msn.json\", \\\n", " sim='vm', \\\n", " amp=0.265, \\\n", " run=None, \\\n", " modulation=1, \\\n", " simDur=7000, \\\n", " stimDur=900, \\\n", " factors=None, \\\n", " section=None, \\\n", " randMod=None, \\\n", " testMode=False, \\\n", " target=None, \\\n", " chan2mod=['naf', 'kas', 'kaf', 'kir', 'cal12', 'cal13', 'can'] ): \n", " \n", " \n", " \n", " print(locals())\n", " \n", " # initiate cell\n", " cell = MSN(params=par, factors=factors)\n", " \n", " # set cascade ---- move to MSN def?\n", " casc = h.D1_LTP_time_window_0(0.5, sec=cell.soma) # other cascades also possible...\n", " \n", " if target:\n", " cmd = 'pointer = casc._ref_'+target\n", " exec(cmd)\n", " \n", " base_mod = SUBSTRATES[target][0]\n", " max_mod = SUBSTRATES[target][1]\n", " \n", " else:\n", " pointer = casc._ref_Target1p #Target1p #totalActivePKA (if full cascade used)\n", " base_mod = casc.init_Target1p\n", " max_mod = 2317.1\n", " \n", " # set edge of soma as reference for distance \n", " h.distance(1, sec=h.soma[0])\n", " \n", " # set current injection\n", " stim = h.IClamp(0.5, sec=cell.soma)\n", " stim.amp = amp \n", " stim.delay = 100\n", " stim.dur = stimDur # 2ms 2nA to elicit single AP, following Day et al 2008 Ca dyn \n", " \n", " # record vectors\n", " tm = h.Vector()\n", " tm.record(h._ref_t)\n", " vm = h.Vector()\n", " vm.record(cell.soma(0.5)._ref_v)\n", " \n", " # substrates\n", " pka = h.Vector()\n", " pka.record(casc._ref_Target1p)\n", " camp = h.Vector()\n", " camp.record(casc._ref_cAMP)\n", " gprot = h.Vector()\n", " gprot.record(casc._ref_D1RDAGolf) #D1RDAGolf\n", " gbg = h.Vector()\n", " gbg.record(casc._ref_Gbgolf) #Gbgolf\n", " da = h.Vector()\n", " da.record(casc._ref_DA)\n", " \n", " # peak n dipp parameters\n", " da_peak = 500 # concentration [nM]\n", " da_tstart = 1000 # stimulation time [ms]\n", " da_tau = 500 # time constant [ms]\n", " \n", " \n", " tstop = simDur # [ms]\n", " \n", " \n", " # all channels to modulate\n", " mod_list = ['naf', 'kas', 'kaf', 'kir', 'cal12', 'cal13', 'can' ]\n", " \n", " \n", " not2mod = [] #['kaf']\n", " \n", " \n", " # find channels that should not be modulated\n", " for chan in mod_list:\n", " \n", " if chan not in chan2mod:\n", " \n", " not2mod.append(chan)\n", " \n", " \n", " # for random modulation: modValues = np.arange(0.1, 2.0, 0.1) -------------------------\n", " if randMod == 1:\n", " \n", " # new factors every run\n", " mod_fact = calc_rand_Modulation(mod_list, range_list=[[0.60,0.80], \\\n", " [0.65,0.85], \\\n", " [0.75,0.85], \\\n", " [0.85,1.25], \\\n", " [1.0,2.0], \\\n", " [1.0,2.0], \\\n", " [0.0,1.0]],\n", " distribution='uniform' )\n", " \n", " else:\n", " mod_fact = [ 0.8, 0.8, 0.8, 1.25, 2.0, 2.0, 0.5 ]\n", " \n", " print()\n", " print('--- Intrinsic modulation factors ---')\n", " print(chan2mod)\n", " print(mod_fact)\n", " \n", " # normalize factors to target values seen in simulation\n", " factors = []\n", " for i,mech in enumerate(mod_list):\n", " \n", " factor = (mod_fact[i] - 1) / (max_mod - base_mod) #2317.1\n", " \n", " factors.append(factor)\n", " \n", " #print(mech, mod_fact[i], factor) # --------------------------------------------------------\n", " \n", " \n", " # set pointers \n", " for sec in h.allsec():\n", " \n", " for seg in sec:\n", " \n", " # naf and kas is in all sections\n", " h.setpointer(pointer, 'pka', seg.kas )\n", " h.setpointer(pointer, 'pka', seg.naf )\n", " \n", " if sec.name().find('axon') < 0: \n", " \n", " # these channels are not in the axon sections\n", " \n", " h.setpointer(pointer, 'pka', seg.kaf )\n", " h.setpointer(pointer, 'pka', seg.cal12 )\n", " h.setpointer(pointer, 'pka', seg.cal13 )\n", " h.setpointer(pointer, 'pka', seg.kir )\n", " #h.setpointer(pointerc, 'pka', seg.car )\n", " \n", " if sec.name().find('soma') >= 0:\n", " \n", " # can is only distributed to the soma section\n", " h.setpointer(pointer, 'pka', seg.can )\n", " \n", " \n", " \n", " # synaptic modulation ================================================================\n", " if sim == 'synMod':\n", " \n", " \n", " # draw random modulation factors (intervals given by range_list[[min,max]] \n", " glut_f, glut_f_norm = set_rand_synapse(['amp', 'nmd'], base_mod, max_mod, \\\n", " range_list=[[0.9,1.6], [0.9,1.6]] )\n", " \n", " gaba_f, gaba_f_norm = set_rand_synapse(['gab'], base_mod, max_mod, \\\n", " range_list=[[0.6,1.4]] )\n", " \n", " syn_fact = glut_f + gaba_f\n", " \n", " print()\n", " print('--- Synaptic factors ----')\n", " print(['amp', 'nmd']+['gab'])\n", " print(syn_fact)\n", " \n", " I_d={}\n", " \n", " ns = {}\n", " nc = {}\n", " Syn = {}\n", " for sec in h.allsec():\n", " if sec.name().find('dend') >= 0:\n", " \n", " # create a glut synapse\n", " make_random_synapse(ns, nc, Syn, sec, 0.5, \\\n", " NS_interval=1000.0/17.0, \\\n", " NC_conductance=0.15e-3, \\\n", " S_tau_dep=100 )\n", " \n", " # create a gaba synapse\n", " make_random_synapse(ns, nc, Syn, sec, 0.0, \\\n", " Type='tmgabaa', \\\n", " NS_interval=1000.0/4.0, \\\n", " NC_conductance=0.45e-3 )\n", " \n", " # set pointer(s)\n", " h.setpointer(pointer, 'pka', Syn[sec])\n", " h.setpointer(pointer, 'pka', Syn[sec.name()+'_gaba'])\n", " \n", " # set (random?) modulation\n", " Syn[sec].base = base_mod\n", " \n", " #randMod?\n", " if randMod == 1:\n", " Syn[sec].f_ampa = glut_f_norm[0]\n", " Syn[sec].f_nmda = glut_f_norm[1]\n", " else:\n", " Syn[sec].f_ampa = 0\n", " Syn[sec].f_nmda = 0\n", " \n", " if randMod == 1:\n", " Syn[sec.name()+'_gaba'].base = base_mod\n", " Syn[sec.name()+'_gaba'].f_gaba = gaba_f_norm[0]\n", " else:\n", " Syn[sec.name()+'_gaba'].f_gaba = 0\n", " \n", " \n", " elif sec.name().find('axon') >= 0: \n", " continue \n", " \n", " if randMod == 1:\n", " for seg in sec:\n", " \n", " for mech in seg:\n", " \n", " if mech.name() in not2mod:\n", " \n", " mech.factor = 0.0\n", " print(mech.name(), 'and channel:', not2mod, mech.factor, sec.name())\n", " \n", " elif mech.name() in mod_list:\n", " \n", " mech.base = base_mod\n", " index = mod_list.index( mech.name() )\n", " mech.factor = factors[index]\n", " \n", " \n", " \n", " \n", " \n", " # solver------------------------------------------------------------------------------ \n", " cvode = h.CVode()\n", " \n", " h.finitialize(cell.v_init)\n", " \n", " # run simulation\n", " while h.t < tstop:\n", " \n", " if modulation == 1:\n", " \n", " if h.t > da_tstart: \n", " \n", " # set DA and ACh values (using alpha function)\n", " casc.DA = alpha(da_tstart, da_peak, da_tau) \n", " #casc.ACh = ach_base - alpha(ach_tstart, ach_base, ach_tau)\n", " \n", " h.fadvance()\n", " \n", " # plot result --------------------------------------------------------------------------------\n", " try:\n", " import matplotlib.pyplot as plt\n", "\n", " # fig 1\n", " plt.plot(tm, vm) \n", "\n", " # fig 2\n", " plt.figure()\n", " plt.plot(tm, np.divide(da,max(da)))\n", " plt.plot(tm, np.divide(gprot,max(gprot)))\n", " plt.plot(tm, np.divide(gbg,max(gbg)))\n", " plt.plot(tm, np.divide(camp,max(camp)))\n", " plt.plot(tm, np.divide(pka,max(pka))) \n", " plt.legend(['da', 'gprot', 'gbg', 'camp', 'pka'], loc='best')\n", "\n", " plt.show()\n", "\n", " except ImportError:\n", " print('no matplotlib available')\n", " \n", " " ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Run simulation" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'par': './params-rob.json', 'run': None, 'target': 'Target1p', 'factors': None, 'modulation': 1, 'section': None, 'stimDur': 3000, 'chan2mod': ['naf', 'kas', 'kaf', 'kir', 'cal12', 'cal13', 'can'], 'simDur': 2000, 'testMode': False, 'randMod': 1, 'amp': 0.0, 'sim': 'synMod'}\n", "\n", "--- Intrinsic modulation factors ---\n", "['naf', 'kas', 'kaf', 'kir', 'cal12', 'cal13', 'can']\n", "[0.7767973730786708, 0.7301964162923315, 0.7525022527998952, 0.8652262814994733, 1.3064871683755204, 1.2313680332396997, 0.20685330244859668]\n", "\n", "--- Synaptic factors ----\n", "['amp', 'nmd', 'gab']\n", "[1.452231099657812, 1.0590033190739863, 0.765033362085102]\n" ] }, { "data": { "image/png": "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\nOErr1vn/Bx7oT7ucOjWazyGB7t39RqWLLy773ooVwK9/Daxc6c3+7t2Bzz/3E49duwJffQUUFla8\n3KVLfTsNGBBNucsrKamb8yR9+3qN9oknvDZcXFy1+YYNA+bNq/g9MrNdc7fd5vcYkP5Yi/79genT\nw6dfv97PB5T36qvA4sW+vDBLl/oVSxde6Cee+/YF7rnH99/kTXDNm/vjva+91n9R7vTTfXzPnjVe\nRakPdZk4dfkPtWhJJGtPYWbN2rH2XJlly8iWLcnWrcl3361x0VhSsvPPnjaN/OUvffipp8gLL6z5\nZ+1MUZGvz9at5F57kVu2pN67/HL/7HPP9Zre99+Xnffaa8l77ql4ub16ea1zt93IGTNS45csIU87\nre5aYr16kddfTzZvTnbuXLtlffMNuffe5JQpvu+ceCI5fXrl8xUX+/b51a8qfv+xx/z9deuqXpaS\nEvLWW317zZhBfvFF2ffHjPHlVmbBAm+JNm/utfv99ye//ZbcZx+v0Vfk5z8n27TZcXzr1uTs2WST\nJuTGjRXPO3582X113Tpf9zZtyu5b5b322o77l9QO6rglkfEwCC1YDUPi7bd9rTZt8tdr1pAff5x6\nf8MGf/+yy6q33Cef9APT00/7QaQqZs0iFy8uO27oUP/8f/97x+lXriQffNAPwsmy77ffjs38v/7V\nm+s7s2yZd1mRXoZnnin7/quvkl27+nDnzmQ8nnovFvOwWrKEHDeu4vVq184PqMuXlw3lNm18vpEj\nfXjhQu9O+MlPfL3vu2/n5a6KeJzcYw/SzJfZvDm5dGn1lrFmDXnlleR335EzZ/oBMqmggLzllsqX\nUVTkAQuQkyb5dkj+XRct8vEtWvjfvCoSCfLZZ32+K67w/087rez7ye6aadPCl7NunW/7//1f8o47\nfPp+/fy9c84hX3ppx3m2bUste9u21PjNm8k99/Tw+u1vyVGjUu9t304OH+772l13eddlulmzwkNF\notPgQ2LzZvLYY8kzz9zxALx2bWpHf+op32mTr9euJR9/nPzDH8if/pQ88ECytDQ17/bt5C9+QV56\nKTl2rNew011+uR+ct2/3A/fatRUWr4x99/XPnj3ba1NbtpA//rF/gUeP9gPVW295f/GVV6bK+uCD\nqWUcfzz5r3+lXs+a5dN065YaV1BA/u1vXuY5c7xGB3gNMJEgzzvPX3/9dWqekSPJa67x4RtuIP/n\n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\nxQJInfOqig8+8HnOOaf6nzlunFeCqtvCq6qtW3d+N7XklroOiaz+ZbrevYkuXfzhX5X55ht/ttB+\n+9VdGYqLgcMP97tmS0r8QWWV2bIFGD7c75Y+6aS6K0s++cc/gAsu8N8t7tcv+s9r397vKm/UCLj7\nbn9U9dFH12xZmzb5gxebNQM6dQKsir//RfrDEe+/H7j11pp9tkhV1PUv02X1A/7WrgVatqzatPvs\nU/efv9tuwLhxwJtvVi0gAGDffVOPRJaKnX020Lt31cK/Lsyf7wGxYQNwwgk1DwjAKyFdu1Z/PjN/\nnEldVmJE6kNWtyROPJEYNsyfCikiIpVrUL9xvXmzP2JYREQyI6tDYssW774REZHMyOqQUEtCRCSz\nIgsJM/upmb1rZh+Z2XtmdmLae8PMrNDM5ppZx7BlbN8O7LVXVCUUEZHKRNmSuB/AIJLHAxgUvIaZ\nnQvgMJKHA7gGwKNhC9h336pfYigiInUvypBIAEh2Fu0HYFUw3APAOAAgORtAEzOr8JdsdT5CRCSz\norxP4mYAk83sAQAG4JRgfCsAK9KmWxWMW1d+Ac2bR1g6ERGpVK1CwsymAkhvBRgAArgTwFkAbiL5\nspldBGAMgLOrs/wvvyxAQYEPx2IxxGKx2hRXRCTvxONxxOPxyJYf2c10ZraJ5H7lX5vZowBmkHwu\nGL8YQBeS68rNz2OOYeiPzIuIyI5y6Wa6VWbWBQDM7EwAhcH4iQB6B+M7A9hUPiCSBg6MsHQiIlKp\nKFsSpwAYBmBXAFsB9CP5UfDeCADdAHwH4EqSH1YwP7P1kSEiItmqrlsSWf3spmwtm4hItsql7iYR\nEclxCgkREQmlkBARkVAKCRERCaWQEBGRUAoJEREJpZAQEZFQCgkREQmlkBARkVAKCRERCaWQEBGR\nUAoJEREJpZAQEZFQCgkREQmlkBARkVAKCRERCaWQEBGRUAoJEREJpZAQEZFQCgkREQmlkBARkVAK\nCRERCVWrkDCzi8xsvpmVmtnPyr030MwKzWyRmXVNG9/NzBab2VIzu702ny8iItGqbUtiHoDzAbyZ\nPtLMOgDoBaADgO4ARpnbBcAIAOcAOBrApWbWvpZlyHvxeDzTRcga2hYp2hYp2hbRqVVIkFxCshCA\nlXurJ4AJJEtILgdQCOCk4F8hySKSxQAmBNPKTugLkKJtkaJtkaJtEZ2ozkm0ArAi7fWqYFz58SuD\ncSIikoUaVTaBmU0F0CJ9FAACuJPkpKgKJiIimWcka78QsxkAfk/yw+D1AAAkOTR4/QaAQfCAKSDZ\nraLpyi2z9gUTEWmASJY/BVBjlbYkqiG9UBMB/M3MHoJ3J7UD8B68e6udmbUBsAbAJQAurWhhdbmS\nIiJSM7UKCTP7DYDhAJoD+KeZzSXZneRCM3sewEIAxQD60ZsspWZ2A4Ap8MB4guSi2q2CiIhEpU66\nm0REJD9l5R3XDfGGOzNbbmYfm9lHZvZeMK6pmU0xsyVmNtnMmqRNPyy4WXGumXXMXMlrz8yeMLN1\nZvZJ2rhqr7uZXRHsM0vMrHd9r0ddCNkWg8xspZl9GPzrlvZeXt60amatzWy6mS0ws3lmdmMwvsHt\nFxVsi/7B+PrZL0hm1T94cC0D0AbAbgDmAmif6XLVw3p/BqBpuXFDAdwWDN8OYEgw3B3Aq8HwzwHM\nynT5a7nuvwDQEcAnNV13AE0BfAqgCYD9ksOZXrc62haDANxSwbQdAHwE7zZuG3xvLB++QwBaAugY\nDO8NYAmA9g1xv9jJtqiX/SIbWxIN9Ya75B8xXU8AY4PhsUhth54AxgEAydkAmphZC+Qokm8B2Fhu\ndHXX/RwAU0huJrkJft6rG3JMyLYAdrxhFcjjm1ZJriU5Nxj+FsAiAK3RAPeLkG2RvL8s8v0iG0Oi\nod5wRwCTzex9M/tdMK4FyXWA7yhI3a8SdrNiPvlxFdc9uX/k+za5PuhGeTyti6VB3LRqZm3hratZ\nqPp3Ii/3i7RtMTsYFfl+kY0h0VCdSvIEAOfC//CnwYMjXUO+yiBs3RvCpdKjABxGsiOAtQAeyHB5\n6o2Z7Q3gBQA3BbXoqn4n8m6/qGBb1Mt+kY0hsQrAwWmvWwfj8hrJNcH/XwJ4Gd40XJfsRjKzlgDW\nB5OvAvCTtNnzcRtVd93zdr8h+SWDzmYAj8H3DSDPt4WZNYIfFJ8m+UowukHuFxVti/raL7IxJN5H\ncMOdme0Ov+FuYobLFCkz2zOoJcDM9gLQFf6E3YkA+gST9QGQ/KJMBNA7mL4zgE3JJngOM+x4Q2af\nYLgPKl/3yQDONrMmZtYUwNnBuFxUZlsEB8OkCwDMD4YnArjEzHY3s0OQumk1X75DYwAsJPlw2riG\nul/ssC3qbb/I9Jn7kLP53eBn8AsBDMh0eephfQ+BX2nwETwcBgTjmwGYFmyLKQD2S5tnBPxKhY8B\n/CzT61DL9X8WwGoA2wB8AeBK+FUp1Vp3+EGjEMBSAL0zvV51uC3GAfgk2EdehvfLJ6cfGGyLRQC6\npo3P6e+qCSXIAAAAU0lEQVQQgFMBlKZ9Lz4M1qna34lc3y92si3qZb/QzXQiIhIqG7ubREQkSygk\nREQklEJCRERCKSRERCSUQkJEREIpJEREJJRCQkREQikkREQk1P8DMcCDyYh7V8YAAAAASUVORK5C\nYII=\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f1d5247e190>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEACAYAAABfxaZOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VMX6wPHvpEFCeqMTwNBBmlQRUESRIgLSFETwp169\noGK7lqtiuWJDVLBwFWnSVRRQwYIBBCmXDgZIKKmkZ9Pr7vz+OCGGkJAQdvecTebzPPuQPXv2nHeX\nzZvZOTPvCCkliqIoSt3gpHcAiqIoiv2opK8oilKHqKSvKIpSh6ikryiKUoeopK8oilKHqKSvKIpS\nh1SZ9IUQi4UQiUKIo1fY5yMhRIQQ4rAQopt1Q1QURVGspTot/SXA7ZU9KIS4A7hOStkGeBj4zEqx\nKYqiKFZWZdKXUv4BpF9hl9HA8pJ99wI+QoiG1glPURRFsSZr9Ok3BWLK3I8r2aYoiqIYjLqQqyiK\nUoe4WOEYcUDzMveblWy7jBBCFfpRFEWpASmlsMZxqtvSFyW3imwE7gMQQvQFTFLKxMoOJKVUNyl5\n5ZVXdI/BKLfa8l5YLBY2ntxIuwXt6PdFP9YcW0N+UT4ZGZJXX5UEBEgmTpT88ovEbL78+cXmYqY9\nPo2HNj5EwNsB3LXmLnac34HFYiEyUjJ3rqRzZ0nr1pIPP5RkZen/mq1yM5mQs2cjAwOR77/PT7Hx\nbHH/nZf+9ZL+sRnkZk3VGbK5CtgNtBVCRAshpgshHhZCPFSSxH8EzgkhIoFFwKNWjVBRHEByTjJj\n1o7h2V+f5f3b32fXjF1M7DyRLT/Uo2NHiIiAPXtgzRq49VZwquA3z9nJmZa+LVk0ahFRT0QxtPVQ\nHtj4ADctuYkE11089xwcOwZffQU7dkDLlvD665CdbfeXax1SwrJl0L49ZGbCiRMwezY/HkiBhq44\n1Ve9z7ZQZfeOlPKeauwz0zrhKIrj2RG1g0lfT2Lq9VNZN34dbs5u5ObCI4/An39qSXrw4Ks7ZgO3\nBjza61Ee7vkwXx39inu+vYeuDbsy//b59Ot3HV9/DZGR8PLL0LYtvPQSPPQQODvb5CVaX0wMPPgg\nJCbCxo3QqxcAuWYzMfvSCerlp3OAtZf6U6qTwVebBWoxR34vVhxZwd3r7mbpXUt5e+jbuDm7cfYs\n9OsHFgscOnR1Cb/8e+Hs5My0btM4NfMUA1oMoM8XfZi7cy6F5kJCQ2HVKti8GdauhT594OBBq748\n65MSPv8cevSAAQNg377ShA+wOTWVG8+6EtTH16E/F4Zm534pqSi1xYK9C2TI/BB5PPF46bYjR6Rs\n0kTKDz+U0mKx/jnPpZ+Tw1cOl50+7iQPxh8s3W6xSLlkiZTBwVI+9ZSUeXnWP/c1S06WcuRIKXv2\nlPLo0Qp3GX30qPzphj0yPSzdzsEZW0nutE4ettaBqnWySpJ+SEiIBNTtKm4hISHX+jlSrsGi/y2S\nLea3kOfSz5Vu27NHS7pr1tj23BaLRX515CsZ+E6gfOePd6TZYi59LClJyvHjpezcudK8qo/t26Vs\n1kzKp5+WsqCgwl3SCgul77btcrvHdlmUUWTnAI2t1iV99Q3g6qn3TD8bwjfIpvOayojUiNJtx45p\nCX/zZvvFcS79nBzw5QB589KbZXxmfOn2i63+wEDbfeOoNrNZytdek7JRIyl//PGKu34eFycf/vqw\n3Nt+r52CcxzWTPqqT19RrsKRhCM8uOlBvpv0HaH+oQCcPw933AEffAAjRtgvlpa+LQmbFsbAkIH0\n+rwXu2N2AyAE3H+/dhF5xQqYNAlycuwXV6msLBg3DrZsgQMHtDfpClYlJTEqxh2vG7zsFGDdpJK+\nolRTWl4ao9eMZuEdC7mhyQ2ANlxy1Ch46imYPNn+MTk7OTNn8BwWjVzEXWvu4pP9n1z8Vk1oKOzc\nCQ0aQN++2mgfuzl7Fvr3h4AA2LYNmjS54u5xBQUczs6m1UmLSvo2ppK+olSDlJIHNz3ImPZjmNh5\nYsk2eOABbfDJ44/rG9+ItiPY/cBuPv3fpzy46UGKzEUA1K8PixfDo4/CjTfCzz/bIZjt27WE//DD\n2kidevWqfMrapCTGBAaSdyAHr14q6duSSvo1MH36dF5++WW9w1DsaPGhxUSmRTL31rml295/X2vQ\nfvKJ1qWit1D/UP584E8ScxIZvmo4GfkZgBbbI4/AN9/AffdpfwRsZt06GD9em5wwc2a135hViYnc\n4xtEzokcPLt52jBARSV9RalClCmK5359jlVjV1HfpT4Ahw/DW2/B+vVaa9ooPN082TBxA+0C2jFg\nyQCiM6JLHxswQJvJO3euNplLWrsS1oIF8OST8Msv2rTjajqVm0t8YSE9Y1xxD3XH2cNRZpg5JpX0\nFeUKpJTM/GkmT/R9gk7BnQDIz4epU2HePK0UgtG4OLmw4I4FzOg2g/6L+3M44XDpY23bwu7dWl6+\n7z4oLLTCCaWEF16AhQvhjz+ga9erevrqxEQmBgeTcyBL9efbgUr61XDo0CF69uyJj48PkyZNIj8/\nHwCTycSoUaMIDg4mICCAUaNGER8fr3O0ijVtOLmByLRInun/TOm2i6UPpk7VMbAqCCGY3W82Hwz7\ngNtW3Mau6F2ljwUHa9dWMzJg7FjIy7uGE1ks8M9/wq+/wq5dV/1XUErJqqQk7gkOJut/Kunbg0r6\nVSgqKmLMmDFMmzaNtLQ0xo8fzzfffANoH9gZM2YQExNDdHQ0Hh4ezJypyhDVFjmFOTy+5XE+G/EZ\n9Vy0i5GHD8PSpfDZZ8box6/K3R3vZsWYFdy19i62Rm4t3e7hofXxe3trw0yzsmpwcItFu1hw5IiW\n9AMDr/oQB7KykMANXl5a0lcXcW3PWgP+q3OjhpOztO+P136riR07dsimTZtesq1///7ypZdeumzf\nQ4cOSX9//5qd6CpV9Z4p1+6N7W/I8evGl943m6Xs10/K//5Xx6Bq6I+oP2Twu8Hy6xNfX7K9uFjK\nBx+Usk8fKdPSruKAZrOUM2ZIOWCAlJmZNY5rdkSEfPnsWVmcUyy3u2+X5nxz1U+qg6hrk7OslfZr\nIj4+nqZNL139MSQkBIC8vDwefvhhWrZsia+vL4MGDcJkMpWOk1YcV3JOMvP3zOfNIW+WbluyRGvc\nPvCAjoHV0I0tbmTLvVuY+dNMlh1eVrrd2RkWLdKGcw4eDMnJ1TjYxTfhzBn46Sfwqlnr3Cwla5KS\nmBwcTPaRbDw6eOBUzyFSkkNT73AVGjduTFzcpQuBRUdrIyLmzZtHREQE+/fvx2QysWPHDgCV9GuB\nN3a8waTOk0pn3WZkaNcqP/mk4lr4jqB74+78Pu13Xtz24iWJXwh47z1tktmtt0Jq6hUOIiU89pg2\n0+uHH8Cz5sMrt5tMNHJzo32DBqo/344c9ONrP/369cPFxYUFCxZQXFzMt99+y759+wDIysrC3d0d\nb29v0tLSmDNnjr7BKlYRkxHDiqMreHnQ33Mx3n0Xhg/XKgI7svaB7fntvt8qTPyvv65VSrj1VkhL\nq+QAL7+sDf/ZvFmb6nsNViYmck9wMABZ+1XStxeV9Kvg6urKt99+y5IlSwgICGD9+vWMGzcOgNmz\nZ5Obm0tgYCD9+/dn+PDhOkerWMN7u99jRvcZBDfQEtKFC/Dpp/DqqzoHZiXtAtvx632/8sK2F1h+\nZHnpdiG0MfxDhsBtt4HJVO6J77+vTb7asgV8fK4phnyzmQ0pKUxu2BCAzL2ZePfxvqZjKtUj7NkV\nIYSQFZ1PCKG6RK6Ses9sIyknifYL23Pi0RM09moMwD/+oXVbv/uuzsFZ2cmUkwxZPoS3hrzF1K5/\njz+VEmbP1gq2/fxzSX5fsgTmzNGK+bRocc3n/jY5mYVxcWzr1o2itCL2tNzDgPQBCGcHGBKlg5Lf\nd6u8OVUul6godcmHez5kYqeJpQk/MhK+/hpOn9Y5MBtoH9ieX6f+yq0rbsXZyZl7umgrowoB8+fD\nrFnacM5f//UL9Z97TpvOa4WED5d27WTuy8TrBi+V8O1Ede8oSonMgkwWHVjEszc+W7rt7be1uUf+\n/joGZkMdgjrw85SfeXLrk2w8tbF0uxDw0UcwKOA4+XffS9Gq9dCunVXOaSoq4tf0dMYFBQGQuScT\n776qa8deVNJXlBLLjyxnSOshtPJrBWhrd3/zjTZYpTbrFNyJTZM38X8b/49t57aVbndKSuCNIyP5\nsvN8pi0eiMVinfN9m5LCLX5++Lm6AiVJX/Xn241K+ooCWKSFhfsWMrPX3zOq582DGTO0kvC1Xa+m\nvVg/fj2Tvp7E3ti9kJsLo0YhZszgkT/uJS5O++NnjctIKxMTubeka0daJFl7s/Dqo0bu2ItK+ooC\n/Hb2N+q51GNAiwEAJCXB8uXa4ih1xaCWg1h611LuXD0K0+Qx0KEDvPQS7u6wcaM2UvNaRyXHFxRw\nMDubESV/SXNP5+Li60K9RlXX3FesQ13IVRRgwb4FzOo9C1FSUOeTT7Sy8I0b6xyYnQ1vM5ytCbdx\n/tA6PP88SGjJ++Hjo43UHDBAu75R00Vj1iQlcVdgIO7OWvlk1Z9vf6qlr9R5UaYodsfsLh29Ulio\nlSbQezUsXfzyC91WbyP8sze4df1I4jL/no0eHKyVZH7vPW0dgZoo27UDkLU3SyV9O1MtfaXOW3Zk\nGZM7T8bD1QPQElrnztCxo86B2du5c1q96LVrmTxoEDE+MGzlMHZO34lvfV8AQkJg0yYYOlT7FjRg\nQPUPfzInh/jCQm728yvdlrknk0b3N7L2K1GuQLX0lTrNIi0sPbyU+7vdX7rto49q/4idy+Tmwpgx\nWoGhQYMAeKb/MwxpNYTRa0aTX5xfumu3btpqiHffDadOVf8Uq5KSmBQcjHNJl5E5x0zu6Vy1PKKd\nqaRvIMuWLeOmm27SO4w6ZWfUThq4NaBHY62ozt69WqXJOldRY9Ys7evNrFmlm4QQvH/7+zTybMSU\nb6dgtphLH7v9dq1kwx13QGJi1YeXUl7etfO/LBp0aaAqa9qZerftyFLFQGcpZemFRMU+lhxewvRu\n00vf94ULtclYznVpmdaVK7VlDitYGcZJOLH8ruWk5aXx+JbHLyn9MX26tuTiyJGQk3PlU+zLysJZ\nCHqWKcOsLuLqxFqF+atzo4aLqOjtwIEDsnv37tLb21uOHz9eTpw4Ub700ksyLCxMNmvWTL755psy\nMDBQtmrVSq5cubL0effff7985JFH5PDhw6Wnp6f87bffZEZGhpw6daoMCgqSLVu2lG+88YaUUsrw\n8HBZv3596eLiIj09PaWfn98VYzL6e+YIsgqypM9cH5mQlSCllDI9XUofHylTUnQOzJ5OnZIyMFDK\nw4evuJspzyS7ftpV/mfHfy7ZbrFIOX26lCNGSFlUVPnzZ50+LeecO3fJtmN3HZMJqxNqGnmdQl1b\nREVPRUVFjB07lhkzZpCWlsbkyZPZsGFD6eMJCQmkpaURHx/P0qVLeeihh4iIiCh9fPXq1bz00ktk\nZWVx4403MnPmTLKysjh//jxhYWEsX76cJUuW0L59ez777DP69etHVlYWaZXWtlWsZUP4Bga0GEBD\nT63S4+rVWnXJujAZC9BWeJ84EV57rcrFzH3q+/DTvT/xxcEv+PLQl6XbhdBGOhUVwcyZFU/eKrZY\nWFuyDu5FUkoydmfg0+/aqnUqV88hRu+IV63T5SFfufrphHv27MFsNpeufTtmzBh69+79d2xC8Prr\nr+Pq6srAgQMZMWIE69at48UXXwRg9OjR9O3bF9DKNK9du5ajR4/i4eFBSEgITz31FCtWrGD69OlW\neIXK1Vj31zomdZ5Uev/LL+GNN3QMyN6efhpCQ7UyotXQ2KsxW6ZsYdDSQQQ3CGZk25EAuLpqI54G\nDIAPPtAqdJb1m8lESP36tPHwKN2WF5mHUz0n6ofUt9rLUarHIZJ+TZK1tVS0XGLz5s1Lf/bz86N+\n/b8/uCEhIcTHx1e4b0pKCsXFxbQoU6kwJCTkspW5FNsz5ZvYEbWDlWNXAnD0KCQkaAuI1AkbN8KP\nP8LBg1e1wnvbgLZ8N/E7Rq4eyY/3/Eivpr0AbYH1TZugXz/t78ioUX8/Z2ViIveW1M2/KOOPDHwG\nqFa+HlT3ThUqWi4xJiam9Of09HTy8vJK70dHR9OkSZPS+2UvzAYGBuLq6kpUVFTptqioqNI/Kuoi\nrv1sPLWRm1vejHc97ULil1/C/ffXkQu4SUnw8MNanQlf36t+ep9mfVh852JGrxnNufRzpdtDQmDD\nBq1e0ZEj2rZcs5mNKSlMLKmoeZFK+vpRSb8K/fr1w9nZmY8//hiz2cz3339fulwiaH2Tr7zyCkVF\nRezcuZMffviBCRMmVHgsJycnJkyYwIsvvkh2djZRUVHMnz+fqVO1BSwaNmxIbGwsRUVFdnltddm6\nE+uY0En7fyos1Aaw1IkeNinhoYdg2rSrm1lVzp3t7uT5Ac8zYtUI0vPSS7f36aONgLrzTu2b06bU\nVHp7e9Oo3qW1dVTS149K+lW4uFziF198gZ+fH6tWrWLUqFHUK/kQN2rUCD8/P5o0acLUqVNZtGgR\nbdq0ASpuuX/00Ud4eHjQunVrBg4cyJQpU0r782+55RY6depEo0aNCC5z0UuxrvS8dHZG72RUW60P\n4pdfoG1baN1a58DsYelSbeatFdZ+nNVnFsNChzFm7RgKigtKt0+cCA88AKNHw/L4y7t2CpMKKUws\npEGna1tjV6mZai2XKIQYBnyA9kdisZTy7XKPNweWAb4l+zwvpfypguPIis7naEv/9e3bl0ceeYSW\nLVsydepUoqOj7R6Do71nRrLs8DK+O/UdGyZqo7CmTtVaqDNnVvFER3f+PPTqBdu2QZcuVjmkRVoY\nv3487i7urBizorShIyXcPaOITZP2kHRzP3zd/r58mLwhmQufX+D6H6+3Sgx1gTWXS6yypS+EcAIW\nArcDnYDJQoj25Xb7N7BWStkDmAx8Yo3gjGLHjh0kJiZiNptZtmwZx44dY9iwYXqHpdTQ96e+Z0z7\nMYBWfWDTJq2iZq1mNmtdOs8+a7WED9rkrRVjVhCZFsnLv79cul0IuHlOMt6n/Zn/n0vHi6iuHX1V\np3unNxAhpYySUhYBa4DR5faxABen1vkCtWo4yqlTp+jatSt+fn7Mnz+fb775hoblvrIqjiG/OJ/f\nzv3G8DZanYUfftAav7X+v3PhQrBY4MknrX5oD1cPNk7eyOrjqy8Zw78uLZF5dzRk+XLtmslFKunr\nrKrZW8A44L9l7k8BPiq3TyPgKBADpALdKznWlWabKVdBvWc181PET7L/4v6l98eOlXLxYh0Dsoez\nZ6UMCNBm39rQqZRTsuG7DeXWyK0yKi9P+u/cKfPNZnnsmJRBQVLu3i1lcXax3O6xXRbnFts0ltoG\nK87ItdY4/cnAEinlfCFEX+ArtK6gy8wps/TO4MGDGTx4sJVCUJSqbTq1qfQCbkYG/PorfPGFzkHZ\n0sXROs88o12ttqG2AW1ZP34949aN457hmxgXFEQ9Jyc6d4YlS7SqnL/Pz8SzqyfO7nVhbGzNhYWF\nERYWZpNjV3khtySJz5FSDiu5/xzaX523y+xzHLhdShlXcv8M0EdKmVLuWLKi86mLkldPvWdXT0pJ\nyAch/HTvT3QK7sRXX8G6ddo8pVpr6VJYsEArH+pin7mYa4+vZWpMAauu78fdTduUbn/nHUj78Dz3\nTzDTfv51domltrDrhVxgPxAqhAgRQrgBk4DyvyZRwK0lwXUA6pVP+Iqit2NJx3BxcqFjkLY6ynff\nwdixOgdlSwkJ2oXbxYvtlvABOrUcgYd7Q17fNIHMgszS7c88A10sGSw94GOVBdaVmqky6UspzcBM\n4GfgBLBGShkuhHhVCDGyZLengQeFEIeBlcA0WwWsKDV1sWtHCEFenjY+f+TIqp/nsGbNgv/7P23V\nEztamZTEg82uo2/T3kz8eiLFlmIAZJGF5tmZ7Mnx4a237BqSUka1JmdJKbdIKdtJKdtIKd8q2faK\nlHJzyc/hUsoBUspuUsoeUsrfbBm0otTEljNbuKPNHQD89ht07w6BgToHZSvffacVFHr55ar3tSIp\nJatLau18POJjpJTM+nEWUkoy92Xi0dadVZtc+eSTWt6tZmBqRu412L59+yUF1RTjyirI4nDCYQaG\nDAS0GjF33aVzULaSk6Ot9/jZZ1DfvlUs92Rm4u7sTFdPT1ycXFg3fh27YnYxf898TL+b8L3ZlyZN\n4JtvtC8hx4/bNTwFlfSvmSqS5hjCzofRu2lvPFw9MJu1CVm1Num//joMHAg332z3U69JSmJycHDp\n74V3PW8237OZeX/OI+KHCPxu1hZF790b3n9fK9WQmmr3MOs0lfSVOuGXs78wtPVQAHbvhqZNoWVL\nfWOyifBw7cLte+/Z/dRmKVmXnMzEcnWjWvi04Pu7vsd8yMyZ686Ubp8yRRvGOX68tgiLYh8q6VfD\nwYMH6dGjBz4+PkyYMIFJkybxcklfqZSSuXPnEhQUROvWrVm1alXp89LS0hg1ahQ+Pj706dOHl156\nSS18rpOySf+772ppK19KbYHfl16CRo3sfvodJhON3dxoV2axlItCY0JxaefCmB/HEGX6u7T4m2+C\nu/vlC68otqOSfhWuZbnERx99FC8vL5KSkli6dCnLli1T3UE6iM2MJTknme6NuwOwefOli3zUGqtX\nQ3o6PPqoPqdPSmJSJdVh039Pp9UdrXi2/7OMWDWCjPwMQFu/YNUq7cL6okX2jLYOs9bU3urcqGkZ\nBq0Nc+23GtixY4ds1qzZJdsGDBhQujC6q6urzMvLK31swoQJ8o033pBms1m6urrKiIiI0sf+/e9/\ny5tuuqlGcZRX5XumlPry4JdywvoJUkopz5yRsmFDKc1mnYOyNpNJysaNtVoHOigwm2XAzp3yfJnf\nhbIODjwoU35KkRaLRc78YaYcunyoLCwuLH389Gkpg4Ol3L7dXhE7FurcwujWSvs1UNPlEpOTkyku\nLqZZs2YVPk+xn7JdO1u2wLBh4OQYn/zqmzMHhg/X1ivUwa/p6bTz8CCkgtFC5jwzWQey8BnggxCC\n+cPm4+bsxqM/PFo6q7xNG/jqK60W//nzdg6+jqltH32rq+lyiUFBQbi4uBAbG1vh8xT7kFLy+/nf\nGdJqCPB30q9VwsO1jDl3rm4hrLlC107mn5l4Xu+Ji6c2K9jFyYU1d6/hfxf+x7u73y3db+hQeP55\nbURPdrZdwq6TVNKvQk2XS3RycmLcuHHMmTOHvLw8Tp48yfLly3V8JXVTZFokrk6utPRtSUEBbN+u\nJZda5emntWxZbh1ae8kzm9mUmsr4Ss6fvi0d35svXYvX082TzZM3s2DfAtafWF+6fdYsrdT1ffdp\nlaAV61NJvwpVLZfYuHHjSpdLXLBgASaTicaNGzNt2jTuueee0ucp9rEjagcDQwYihOCPP6BjRwgI\n0DsqK9qyBU6f1nXZrx/T0ujh6XnZOrgXpW9Nx/92/8u2N/VuyqbJm3j0x0f5M+ZPQFt85eOPtbXb\nV6ywadh1lv2qMDmwHj16cOjQodL7ffv2ZdSoUQwaNKh0qcTnn3/+sucFBgayefPm0vvPPffcJX38\niu3tiN5ROgv3p5/gjjt0Dsiaiou1RVHmzQM3N93CuDghqyKFKYXkns7Fu693hY93a9SNpaOXMnbd\nWHbN2EVrv9bUq6dNnvPysmXUdZdq6VdDTZdLPHXqFMeOHQNg3759LF68mLG1uqyj8Vxs6UMt7M9f\ntAiaNNF1/GlWcTE/p6UxtrKunV/T8R3ki5Nb5almRNsR/PumfzNi1QjS89IB8POza2HQOkW9rdVw\n6tQpJkyYQG5uLq1bt672colZWVlMnjyZCxcu0LBhQ5555hlG1coB4sYUnRFNTmEO7QLaEROjVRru\n2VPvqKwkPR1ee00rFarj3I+Nqanc5OODv6trhY+n/1xx1055/+z9TyLTIhm3bhxbpmzBzVm/by61\nXZWLqFj1ZGoRFatR71nVVh5dyYaTG/h6wtcsWwY//ghr1+odlZXMng15eVpRNR2NOnaMiUFBTKlg\nBrCUkj+b/0m337vh0ebyWbrlmS1mxq4bi7+7P1/e+aWayFiGvRdRURSHVLZrZ9s2XeqP2cbp09pV\nztde0zWMtKIidphMjK6kPnXuX7k4uTrhHupereM5OzmzauwqjiUe482db1ozVKUMlfSVWuviRVwp\ntaR/yy16R2QlL76oDdOs5OKpvXybnMxt/v54VdL5nvZzGn63+11Vi72BWwM2Td7Efw/+lw3hG6p+\ngnLVVJ++Uisl5yRzIesCXYK7cOaMNiG7TZuqn2d4e/fCn3/CsmV6R8KapCQeKTdbvay0rWk0eajJ\nVR+3sVdjtk7ZSpCHPvMOajvV0ldqpb1xe+ndtDfOTs6lXTsO30UsJfzrX1rJhQoqWdpTQkEBB7Kz\nGe5f8UVac76ZzF2Z+N7iW+HjVWkf2J4Aj9o0ocI4VNJXaqU9sXvo26wvUIu6drZsgcREuP9+vSNh\nfXIyowICcHd2rvBx0+8mPLt54upb8ageRT8q6Su10sWkLyX8/nstSPpms9bKnzvXEAPYr1RrByB1\nUyoBo1RL3YhU0ldqHbPFzP74/fRp2oe//gJPTwgJ0Tuqa7RqlfZCRo/WOxJi8vM5mZvLrX5+FT4u\npSR1s0r6RqV/k0FRrOxkykmCGwQT4BHAqtowVLOgQFsNa/lyQ1yY+CY5mTsDA3GrpD51ztEchKvA\no72+1x2UiqmWfjXExsYybtw4goODCQoK4rHHHuPs2bMMGTKEwMBAgoODmTJlCpmZmaXPadWqFe+9\n9x5du3bFy8uLBx98kKSkJIYPH463tze33XYbGRna6kFRUVE4OTnx+eef07RpU5o2bcq8efP0erkO\nr2x/flgYDB6sazjX7tNPoUsXbbFzA1ifnFxpRU2AlE0pBIwKUJOrDEol/SpYLBZGjhxJq1atiI6O\nJi4ujkmTJgHwwgsvkJCQQHh4OLGxscyZM+eS53777bf89ttvnD59mo0bNzJ8+HDeeustUlJSMJvN\nfPTRR5fJgp0UAAAgAElEQVTsHxYWxpkzZ9i6dStvv/0227Zts9fLrFX2xO6hb1OtP/+PPwyTK2sm\nK0vrx3/TGJOVYvPzCb9C1w5A6uZUAkdVPGFL0Z9DdO+IsDCrHEfWoMm3b98+Lly4wDvvvINTydfZ\n/v37A9C6dWsAAgICmD17Nq+VmyE5a9YsAktmK9500000bNiQ66+/HoAxY8ZcltTnzJlD/fr16dy5\nM9OnT2f16tXc4vBXIO1vT9we/nHDP4iMhHr1oEULvSO6BgsWwJAhWkvfAL5JSeHOgIBKu3YKEwvJ\nO5WHz00+do5MqS6HSPo1SdbWEhMTQ0hISGnCvygpKYnHH3+cnTt3kp2djdlsxr/cmOWyRdnc3d0v\nu59dZnkgIcQlZZdDQkI4fvy4tV9OrZdZkMnZ9LNc3/B6vloON96od0TXICMD5s/Xvq4YxPqkJF64\nwlXx1B9S8Rvqd8Wqmoq+1P9MFZo3b050dDSWcsv4vPDCCzg5OXHixAlMJhNfffXVNRVAk1Jespzi\nxWUXlauzP24/3Rt1x9XZlT/+gAED9I7oGsyfr617266d3pEAEFdQUGXXTsr3KWrUjsGppF+F3r17\n07hxY5577jlyc3MpKChg9+7dZGdn4+npiZeXF3Fxcbz77rtVH6wKr7/+Onl5eZw4cYIlS5aUXjtQ\nqu9/8f+jV5NeAOza5cBJPy0NFi6El1/WO5JS35RMyKqsa6c4qxhTmEklfYNTSb8KTk5ObNq0iYiI\nCFq0aEHz5s1Zt24dr7zyCgcOHMDX15dRo0Yxbty4S55XfuRCdUYyDBo0iNDQUIYOHcqzzz7LkCFD\nrPpa6oIDFw7Qs0lPkpO1+vmdO+sdUQ3NmwdjxsB11+kdSan1ycmMv9KErB9S8Rngo2bhGpyqp28A\nUVFRtG7dmqKiosuuHVSmrr9nlQn9KJSNkzdyeldHFi3Slkh0OCkpWpfOwYOGmVUWX1BA5/37Sejf\nv9KW/vG7jxMwIoDG0xvbObraT9XTr4VUAr92pnwTCdkJtAto59j9+e+8AxMnGibhQ9VdO+YcM+m/\npBM4Wg3VNDqV9A1CTWS5docuHKJro644Ozk7btJPTIQvvoAXXtA7kktUNSEr9adUvPt64+qvunaM\nziGGbNZ2ISEhmM1mvcNweAcvHKRn457k5sKxY9Crl94R1cBbb8HUqVBm+K7e4gsKOJ6Tw9BKyigD\nJH+dTNDdqv69I1BJX6k1DiYcZGjroRw4AJ066V5y/uolJmqLo5w4oXckl/gmOZmRAQHUq6xrJ9dM\n2pY02iyoDavU1H6qe0epNQ7EH6BH4x7s2wd9+ugdTQ28/z7cey80NtaF0Cq7djal4t3HG7cgNztG\npdRUtZK+EGKYEOKkEOK0EOJflewzQQhxQghxTAjxlXXDVJQryyrIIiYzho5BHdm71wGTfmqq1pf/\nzDN6R3KJCwUFHMvJ4bYrdO0krEig4ZSGlT6uGEuVSV8I4QQsBG4HOgGThRDty+0TCvwL6Cel7AI8\nYYNYFaVSRxKP0Dm4My5OLuzbB7176x3RVfrwQxg71nCFgqrq2ilMLiTjjwwCx6hRO46iOn36vYEI\nKWUUgBBiDTAaOFlmnweBj6WUmQBSyhRrB6ooV3Ig/gA9GvUgMREyMx1sEfSMDPjkE23Rc4NZn5zM\nU82bV/p40tokAkYG4OKpLg86iup07zQFYsrcjy3ZVlZboJ0Q4g8hxG4hxO3WCtDItm/fTvMr/EIo\n9nMw4WBpf36vXoZYa6T6Fi6EO+4w1Oxb0Lp2jubkcNsVau0kfpWounYcjLUu5LoAocBA4B7gcyGE\nt5WObWhqfL0xHE08StdGXR3vIm52tta1Y7Bx+QDfpqQwwt+f+pUsfp57Opf88/n43Vr5HwXFeKrz\nnSwOKNvR2KxkW1mxwB4ppQU4L4Q4DbQBDpQ/WNmFRgYPHsxgh1/WSNFbkbmIkykn6RTUiX/vhcce\n0zuiq7Bokba0V4cOekdymfVJSTx5hW+yCcsTaDi5IU4uahCgtYWFhRFmpXVELiOlvOINcAYigRDA\nDTgMdCi3z+3A0pKfA4EowK+CY8mKVLbdKFq2bCnnzp0rO3bsKP39/eWMGTNkQUGBDAsLk82bNy/d\n78MPP5SdOnWScXFxMj09XY4cOVIGBQVJf39/OXLkSBkXF2e1mIz+ntnTiaQTMvSjUGk2S+nrK2Vi\not4RVVNurpSNG0t5+LDekVzmQn6+9N25U+YVF1f4uLnILHc13iWzT2TbObK6qeT3vcp8XZ1blX+i\npZRmYCbwM3ACWCOlDBdCvCqEGFmyz1YgVQhxAvgNeFpKmW6tP0xGsGrVKn755RfOnDnDqVOneOON\nNy55/LXXXmP58uXs2LGDJk2aYLFYmDFjBjExMURHR+Ph4cHMmTN1ir52O5p4lOsbXk9EBPj6whUK\nQRrL4sVwww3QtavekVymqq6dtB/SqN+6Pg06NrBzZMq1qtYldynlFqBduW2vlLv/FPCU9UL7W5gI\ns8pxBsvBNX7urFmzShc1efHFF5k1axZDhgzBYrHw1FNPsX//fsLCwvD09ATA39+fMWPGAFCvXj2e\nf/55VSrZRo4lHqNLcBfH6s8vLNQKq339td6RVGh9cjJPXKEURPx/42nykFrkxxE5xDira0nW1lJ+\nKcMLFy4ghMBkMvH555+zdu3a0oQPkJeXxxNPPMHWrVsxmUxIKcnOzkZKqS7+WtnRpKNM7zadbV87\n0Pj8lSu18skGDDixsJDD2dncXsmonfzofDL3ZNJpfSc7R6ZYg7oCU01llzKMioqiSZMmSCnx9/dn\n8+bN3H///ezevbt0n3nz5hEREcH+/fsxmUzs2LEDUCWUbeFiS//AAa23xPAsFnj3XfhXhZPbdfdt\ncjLDr9C1c2HxBRre0xBnj4ofV4xNJf1q+vjjj4mLiyMtLY0333zzkqUMBw4cyMqVKxk7diz79+8H\nICsrC3d3d7y9vUlLS7tk1JJiPRn5GaTkptDCqzXHjkH37npHVA2bN4O7Oxi0u+9KtXYsBRYufH6B\nxg8bqz6QUn0q6VfTPffcw2233UZoaCht2rThxRdfvOTxW2+9lS+//JI777yTw4cP88QTT5Cbm0tg\nYCD9+/dn+PDhOkVeux1POk7HoI5ERjjTpAl4eekdUTW8/TY8+6whZ5AlFhZyMCuL2yuptZO0NokG\nnRrg2dmzwscV41PLJVZDq1atWLx4MbfccoveoZQy+ntmL5/u/5QDFw4wKOMLfvgB1qzRO6Iq7NoF\n990Hp06Bi/EuqX0WF8eOjAxWdex42WNSSg70OECr/7QiYLha/Nye1HKJilLiWJLWn3/oEPTooXc0\n1fD22/D004ZM+HDlrh3TdhPmPDP+wyqvuKkYn0r61aBG2xjXxTH6Bw86QH/+X3/Bvn1w//16R1Kh\npMJCDmRlMaySrp3Y+bE0e7wZwkn9PjgyYzY3DObs2bN6h6BUQErJ8aTjdArSWvqGT/rvvgszZ2oX\ncQ3ou5QUhvn7417BqJ2cv3LI/DOTjqsu7/ZRHItK+orDisuKo55LPTITAvH1hUAjl3SPjYXvv4fI\nSL0jqdT65GT+0aTiCVdR/4mi2exmODdQwzQdnereURxWeHI4HQI7OEZ//gcfwLRpcIUVqPSUUljI\nvsxM7qggvtyIXNJ/TqfpP8tXVFcckWrpKw4rPCWcjkEdOfiHwbt20tPhyy/h8GG9I6nUdykp3O7v\nj0cFXTvRb0bTdFZTXLxVuqgNDPG/GBISoi6WXqWQkBC9Q9BdeLKW9DcfhFmz9I7mCj77DEaONNxS\niGWtT07mgQoWZM87k0fKphT6RDpKUSOlKoZI+ufPn9c7BMUB/ZXyF2M7jOO1gwbu3snPh48+gl9+\n0TuSSqUWFbEnM5NvO3e+7LGzL5yl+ezmuPq66hCZYguqT19xWOHJ4fgWd8DJCSpopBrDV19pfU8V\nJFSj+D4lhaF+fjQo17WTuTeTjF0ZNJtdebVNxfGopK84pNTcVArMBVw41YRu3QxZ0QCk1C7gPvmk\n3pFc0dfJydxdbkKWlJIzz5yh1autVGG1WkYlfcUhhadoI3eOHRNGXINE88sv4ORk2MJqAOlFRezK\nyGBEwKVlFVK+S6EorYiG09Si57WNSvqKQwpPDqdDUAeOHYMuXfSOphLz58Ps2Qb9GqL5PiWFW/z8\n8CpTFqI4u5jIJyJp81Ebtf5tLaT+RxWH9FfyX3QI7MDRo3D99XpHU4HwcDh0CCZP1juSK/q6glo7\nUa9F4TvQF79bKl5ERXFsKukrDik8JZxQn46cOwft2+sdTQU++AAeeQTq19c7kkqZiorYkZHByDJd\nO9nHs0lYmsB1712nY2SKLRliyKaiXK3wlHBcTB247jqoV0/vaMpJSYF167TyyQa2KTWVm3198S7p\n2rEUWTh5/0lavdEKt4ZuOken2Ipq6SsOJ7swm+ScZNLOtDRmf/5nn8HYsRAcrHckV1S+jHLUG1G4\nBbvR+EGjjn9VrEG19BWHcyrlFG0C2nDiuLPx+vMLCuCTT2DrVr0juaKM4mLCTCZWdOgAQOa+TOIX\nxXPDoRvU7PhaTrX0FYdzcbjm0aMGHLmzdi106mTAwC61OTWVQb6++Li4UJRWxF+T/qLtx22p19ho\nfWWKtamkrziciNQI2ga0Nd5wTSn/HqZpcOuTkhgfFIQ0S8LvDSdwTCBB4ypeMUupXVTSVxzO6bTT\nNHJrQ06OwWqYbd8OeXkwbJjekVxRVnEx20wm7gwI4Pyc81jyLbR+u7XeYSl2opK+4nAiUiMgpS1d\nuhhs3tP8+fDEE9osXAPbnJrKTT4+5C1PIXFVIh3XdlSTsOoQdSFXcShSSiLSIjDltDHWRdzISNi9\nG1av1juSKq1NSuK+I+6c+/c5uu3ohluwGp5Zl6ikrziUpJwkXJxcOHvCn5499Y6mjA8/hAcfBA8P\nvSO5ooziYtJ+SafpW8503twFjzbGjlexPpX0FYcSkRZBG/82HD0K06frHU0JkwlWroRjx/SOpEpb\n15znuTcknTd2wru3t97hKDpQHXmKQ4lIjaCNf1v++ksbGWkIn38Ow4dDU2OvIZuwIoEGj8eRtzIE\n3wG+eoej6ES19BWHcjr1NMEubfD2Bl8j5K3iYliwADZs0DuSSkmL5NxL57iwKpF/fSDYe1tzvUNS\ndKSSvuJQItIiCC26m44d9Y6kxDffQKtWGOsCw98Kkwo5Of0kxRnFhG9sSmenrMtWyFLqFtW9oziU\niLQICuPbUlI9QF9SwvvvG3YyVupPqfyv2//w7OpJt9+7sdKcxiSD1wNSbE+19BWHYZEWItMi6Xa+\nDX276x0N8OefWkXNUaP0juQSBXEFRD4VSdbeLDqs7IDfzX7EFxRwODubYf7+eoen6Ey19BWHEZ8V\nj5ebF5EnvIzRvTN/Pjz+OBiku6Q4o5jzr51nf9f9uIe60+tEL/xu1hZCWZ+czJ0BAdQ3SKyKflRL\nX3EYF2vuHA9H/+6d8+dh2zb48kudA4HC5ELiF8UT92Ec/nf402NPDzxCLx1/vyYpiZdDQnSKUDGS\narX0hRDDhBAnhRCnhRD/usJ+44QQFiFED+uFqCia06mnaebeBicnCNK7NtiCBdpEAS8vXU4vLRLT\nThPhU8PZ22Yv+Wfz6bazGx2Wd7gs4Z/PyyMiN5db/dTyh0o1WvpCCCdgITAEiAf2CyG+l1KeLLef\nJ/AYsMcWgSpKRFoEDQra0KGDzjV3srJg6VI4eNCup7UUWsjck0nyN8kkf5OMq58rjaY3IvTDUFz9\nXSt93rrkZMYFBeFq8JpAin1Up3unNxAhpYwCEEKsAUYDJ8vt9zrwFvCsVSNUlBIRaREEpfbTvz//\nyy9hyBCwcXdJcVYx2YezydyTiWmbiYxdGbi3cSdwdCBdf+lKgw4NqnWcNUlJzLtOrXmraKqT9JsC\nMWXux6L9ISglhOgONJNS/iSEUElfsYkzaWeoHxVKfz2Tvtms1dlZudIqh5NSUpRSRN6ZPPIiS26n\n8sg6mEVBbAENujTA6wYvGj/YmA4rO1yxRV+Rv3JySCwsZKAhZrIpRnDNF3KFtrba+8C0spuv9biK\nUpaUknOmc/j/1YoOI3QMZONGbe3bfv3+js0ssRRakIUSc44Zc5aZ4sxizJlmirNK/s0spji9mMKE\nQgoTC7V/S25Ork64h7qX3vzv8KfFCy3w6OBxzSWPv0pM5J6GDXE2VA1qRU/VSfpxQNmlKpqVbLvI\nC+gEhJX8AWgEfC+EuFNKeVmn5yNtHyn9uVdAL3oF9kJKWfGZK9l8tdvV8R3/+EWWIj5M/BCREIFX\nEhx40brHv9J2aZHIwpLEHuuEpf6bWHx3lm7DAsJN4OTmhHMDZ5y9nXH2csbF2wVn7zL/+rrg0d4D\n38G+uDV0w62RG24N3XDxsc0gOouUrExMZKOhlhdTqiMsLIywsDCbHFtU+gtzcQchnIFTaBdyLwD7\ngMlSyvBK9v8deFJKeaiCx2TyxuRKTlTp+a9q/6vdro7vGMc/lniMd/94n+iFS/j99wou5NoyfgFO\n9ZxwOv0X4pEHcdq/G+HhilM9J4SbQDgLQy4mHpaezmORkRzt1UvvUJRrJIRASmmVD1mVTQwppVkI\nMRP4GW2I52IpZbgQ4lVgv5Ryc/mncIXuncBRgdcSr1JHnT96nuw4V1w7e+PTu+r9beI/H8Lse6Gp\nY9SgX5GYyNSGDfUOQzGYan2vlFJuAdqV2/ZKJfveYoW4FOUSZ9PP4pbTWr+RO3Fx8OOPsHChTgFc\nnTyzmQ0pKRxTrXylHDVwV3EIZ01nKU5uTfv2OgXw8ccwZYpB6jlXbVNqKj29vGhar57eoSgGo8ow\nKA7hXPo5CqKn0q6vDifPydEWStnjOPMOVyQmMkV17SgVUC19xSGcTT9L4slWtG2rw8mXL4cbbwQH\nmeCUXFjITpOJsYHq+plyOdXSVwyvoLiAxJxECG9u/7xrscAHH8B//2vnE9fc2qQkRgQE4OWifr2V\ny6mWvmJ4URlRNHRvRtPGLti9i/qnn8DTEwYOtPOJa25pQgL3NWqkdxiKQammgGJ4Z9PPEiBa06hd\n1fta3cWVsQw4Dr8iR7KzSSoqUhU1lUqplr5ieOfSz1E/v7X9+/OPHIGTJ2HCBDufuOYWX7jA9EaN\nVNkFpVIq6SuGdzb9LDJVh6Q/fz7MmgVubnY+cc3km82sSkxkuuraUa5AJX3F8M6azpIdY+ekf+GC\nVlztoYfseNJr811KCt29vGjp7q53KIqBqaSvGN7Z9LMknbbzcM1PPoHJk8GBFhJfnJDAA6qVr1RB\nXchVDE1Kydm0sxRGt6Z5czudNC8PFi2CP/6w0wmv3fm8PA5lZXFX5856h6IYnGrpK4aWlpeGxQKh\nzfyw22p/K1ZA377oMxOsZpYkJHBPw4bUd3bWOxTF4FTSVwztvOk8Ac6taNfWTqNRLBbtAu7s2fY5\nnxWYpWRJQgIPNG6sdyiKA1BJXzG06Ixo3AtC7Nfo3roV6teHwYPtdMJr90NqKk3r1aOrp6feoSgO\nQCV9xdCiMqKQphb2S/rvvw9PPukwk7EAPo6L49EmTfQOQ3EQKukrhhZliiL3gp1a+seOwV9/wcSJ\ndjiZdUTk5nIoO5vxQUF6h6I4CJX0FUOLyogi9aydkv78+fDPfzrMZCyAz+LjmdGokbqAq1SbGrKp\nGNrZ1Gics0IICLDxiRITYcMGiIy08YmsJ9dsZllCAvt79tQ7FMWBqJa+YmhRpiiuC2xh+y72BQtg\n0iRs/9fFetYkJdHX25tWagauchVUS18xrJzCHHKKs+nQIti2J8rO1iZj/fmnbc9jRVJKPo6L441W\nrfQORXEwqqWvGFZ0RjReluaEXmfjj+kXX8DNN0NoqG3PY0V/ZGSQaTZzuwOViVCMQbX0FcOKzojG\nLS+E6zra8CRFRdowzW++seFJrG9eTAyzmzXDyYGGlirGoFr6imFFZURhSQuhdWsbnmTtWq2F36uX\nDU9iXRG5uezKzOR+VVxNqQGV9BXDijJFkRPfwnbr4koJ77wDzz5roxPYxvzYWP7RpAkeapimUgMq\n6SuGFZkSRWFyCDYrKbN1q/bv7bfb6ATWl1JYyOqkJP6pZuAqNaSSvmJYkcnRNG0QYrvhmhdb+Q7U\nL/5pfDxjAwNpZPcV4pXaQiV9xbCiM6O4LjDENgffvx/OnHGokgu5ZjMfx8XxpN0WFlBqI5X0FUMq\nthSTXnSBTs2b2eYE776rFVZzdbXN8W3gv/Hx9PfxoVODBnqHojgwNWRTMaS4zDjqm4Npe50NkvLp\n0/D77/Dll9Y/to3km828GxPDpi5d9A5FcXCqpa8YUnRGNC45IbYZuTN3LsyaBQ5Uf/7LhAS6e3rS\nw8tL71AUB6da+oohRWVEUZxig6R/7hxs2uRQhdUKLRbeio5mfadOeoei1AKqpa8Y0tm0KPISQgix\n9nXct9+Gf/wDfH2tfGDbWZaQQAcPD/p4e+sdilILqJa+YkjhcTH4iuutW9o+NhbWr4dTp6x4UNvK\nN5t5IyqKVR1tWYtCqUtUS18xpLMpsTTztvLInXffhRkzIDDQuse1oU/j4+nq6cmNPj56h6LUEqql\nrxhSXFYsfYKtmPQTEmDFCm05RAeRWVzMW9HR/Na1q96hKLWIaukrhpRaFGvdMfrz5sGUKeBARcre\ni4lhmL8/nR1olJFifNVK+kKIYUKIk0KI00KIf1Xw+GwhxAkhxGEhxC9CCDVlUKmx/OJ8Csmmy3VW\n6oZJTNTG5DtQYbXEwkI+jovjNbVIimJlVSZ9IYQTsBC4HegETBZCtC+320Ggp5SyG/AN8K61A1Xq\njrjMOJxzm9Am1EpfROfO1Vr5zWw0u9cGXj53jmmNGhFSv77eoSi1THX69HsDEVLKKAAhxBpgNHDy\n4g5Syu1l9t8D3GvNIJW6JSYjFnN6M6zSyI2Jcbi+/INZWXyfksLJ3r31DkWpharTlGoKxJS5H1uy\nrTIPAD9dS1BK3RYeH4tzbjOsMmDl9dfhoYegYUMrHMz2pJQ8FhHBG61a4etAdYEUx2HV0TtCiClA\nT2BQZfvMmTOn9OfBgwczePBga4ag1AInYmLxc7JCV0xkJHz7rVZrx0GsTkoiz2Jhus0WEVAcQVhY\nGGFhYTY5tpBSXnkHIfoCc6SUw0ruPwdIKeXb5fa7FfgQGCilTK3kWLKq8ynKHR/NIv54G47897Fr\nO9CUKdCuHbz0knUCs7Gs4mI67NvH2k6d1Lh85RJCCKSUVln4oTrdO/uBUCFEiBDCDZgEbCwXUHfg\nM+DOyhK+olRXTGYsIX7X2NI/ehR++QWeeMI6QdnBi+fOMdTfXyV8xaaqTPpSSjMwE/gZOAGskVKG\nCyFeFUKMLNntHaABsF4IcUgI8Z3NIlZqvaT8WNo2uoakLyU8/bTWwneQqpR/ZmTwdXIy82y2ILCi\naKrVpy+l3AK0K7ftlTI/D7VyXEodlilj6dziGpL+li0QHQ0PP2y9oGyowGLh/06d4oPQUPzVxVvF\nxtSMXMVQCs2FFDin0q1NDUfbFBfDU09pdXYcJIHOjYoi1N2d8UFBeoei1AGq9o5iKPGZFxA5jWjd\n0rlmB/jiC2jcGEaOrHpfA9ifmckn8fEc7NkT4UALtCuOSyV9xVCOx8TinNOMGpWON5lgzhyte8cB\nEmh2cTH3hofzcZs2NFMzbxU7Ud07iqEcOReLp6WG/fkvvgh33QXdulk3KBt58swZ+nt7Mz44WO9Q\nlDpEtfQVQzkZH0tgvRok/f37tYlYDlJuYUNyMr+lp3Pohhv0DkWpY1TSVwzlfGosTT2vskir2QyP\nPKIthejnZ5vArCgiN5eHT59mU5cueLuoX0HFvlT3jmIo8TmxtA68ypb+p5+CpydMnWqboKwox2xm\n7IkTvN6qlVrzVtGFamYohpJWFEuHpleR9M+cgVdfhZ07DX/xVkrJg6dOcYOXFw+p2jqKTlTSVwwl\n2zmWbq2rmfTNZpg+HZ5/HtqXX+LBeN6OjuZUbi5/dO+uhmcqulFJXzGMYrOZ4nqJ9GxbzVbwhx9q\n/z7+uO2CspLViYl8Gh/Pnz164O5cwzkIimIFKukrhvFXdCIiPwB/32rMpD14UFsRa88eMHgS3Wky\n8XhkJL917UqTevX0Dkep49SFXMUwDkbE4V50pfV5SqSnw/jx8PHHYPACZUezs7n7xAlWduhAF7XA\nuWIAKukrhnE8Og4fpyZX3sli0frxR4yACRPsE1gNhefkMOzoURa0acNQf3+9w1EUQHXvKAYSmRhH\nsHsVLf3nn4eUFFi3zj5B1VBkbi5DjxzhrdatmaBm3CoGopK+YhjRpniaBV0h6X/yCXz/PezaBW5u\n9gvsKp3MyeG2o0d5uWVL7mvUSO9wFOUSqntHMYykvDhaB1XSvbN4Mbz5Jvz4IwQE2Dewq/C/zExu\nPnKE11u14qEmVXRVKYoOVEtfMQyTJY4OTcu19KWEhQu1+vi//w6tW+sTXDX8np7OxL/+4vN27Rgd\nGKh3OIpSIZX0FcPIc4nn+lZlkn5+Pjz2GOzeDdu3Q6tW+gVXhc/j43nx3DnWduzIzQ5Q/0epu1T3\njmIImZlgaRBH+6ZNtNb9b79B166QkQF//mnYhF9ssfB4RATvxcSws3t3lfAVw7N/Sz88/O+fpbz8\ncSNvM0oc1d1mlDiqse3CmXyGRufh/8VXsHq1NkLnnXdgzJjLn2cQCQUFTAkPx1kI9vTogZ+DLM+o\n1G1CVvTLaKuTCSFl+RopFdUgMfI2o8RR3W1GiaOKbXHJuZzKOMwtN0/UFkIZOdLQM223pqVx/8mT\nPNS4MS+FhODipL40K7YjhEBKaZWCTfZP+nY8n+I4nloQxqoLL3PhzR16h3JFeWYzL58/z+rERFZ0\n6KC6cxS7sGbSVxdyFUM4kxRHYL1qlGDQ0U6Tif87dYqunp4cuuEGggw8V0BRKqOSvmIIMRlxNG1l\nzLks8uoAAAfESURBVKSfVlTEv8+d4/uUFBa2acOYoCC9Q1KUGlMdkYohJObF0yrAWEm/yGJhQWws\nHfbtQwLHe/VSCV9xeKqlrxiCqTiOdk366R0GABYp+T4lhRfOnaN5vXr81rUrnVWFTKWWUElf0Z3F\nArkucXQJ0belb5GSb5OTeT0qChcheO+66xju769WuVJqFZX0Fd0lJYHwieG6oKtcEN1Kcs1mViYm\n8mFsLO7OzvynVStGBASoZK/USnZP+jujdlb6WFW/ZIIqHnfg5zty7Nf6/JSzLZAeSTTztm/SP5uX\nx2fx8SxJSKCftzfzQ0O51c9PJXulVrN70n9h2wsVbq9q/L6kisd1fL4jx17V82197uScZNq73k59\nc2NcnGz/cTQVFbE+OZkViYmE5+YytWFD9vboQWt3d5ufW1GMwO5Jv3VY5S19pe456f0JBzw/ws85\nxGbnSCws5IfUVDampPC7ycRQPz+eat6cO/z9cVMzaZU6xu5J/5Zb7H1GxchObAskO/AU7Vz6WO2Y\nBRYLezMz2W4y8VNaGn/l5HCbvz93BwWxpH17VSNHqdPsnvSnTbP3GRUj++1sIAeAdv6davR8KSVR\n+fkcys7mYHY2f2RksD8zk44NGjDI15c5LVsyyNeXeqpFryiAGr2j6CyAtgD0bX5Dpfvkmc0kFxWR\nVFjI+fx8IvPyOJOfT0RuLkdzcqjv5EQPT0+6e3nxTPPmDPDxwdtFfbQVpSJ2L7jW78CB0vsVnbmi\neCrcr7rbyh3Pmse6luPZ+nVWOw4rHqsmx8vIgIzsApo0qndZUU0JmIqLKbRYCHJ1JdjNjZD69Ql1\nd+e6+vW5zt2dLg0a0KhevQrOqii1h92rbAohhgEfoJVtWCylfLvc427AcqAnkAJMlFJGV3Acuctk\nunRbReerOIbq7VeNbdY81rUcz9avs7rH0+P/4OLx3n4bPv0UzpwBlwoqKfu6uODl7KyGUSp1ml2r\nbAohnICFwBAgHtgvhPheSnmyzG4PAGlSyjZCiInAO8Ckio7X38fn2qOuBcLCwhg8eLDeYegu+wyQ\nGEbrBoP1DsUQ1Ofib+q9sI3qXN3qDURIKaOklEXAGmB0uX1GA8tKfv4a7Q+EcgVhYWF6h2AI0dEA\nYTpHYRzqc/E39V7YRnWSflMgpsz92JJtFe4jpTQDJiGEv1UiVGq1mJiq91EUxXpsNY5NdcAq1eLq\nCmoyrKLYT5UXcoUQfYE5UsphJfefA2TZi7lCiJ9K9tkrhHAGLkgpgys4llorUVEUpQbsuVzifiBU\nCBECXEC7QDu53D6bgGnAXmA8sK2iA1kraEVRFKVmqkz6UkqzEGIm8DN/D9kMF0K8CuyXUm4GFgMr\nhBARQCqVjNxRFEVR9GXXyVmKoiiKvuxWkEQIMUwIcVIIcVoI8S97nVcvQojzQogjQohDQoh9Jdv8\nhBA/CyFOCSG2CiF8yuz/kRAiQghxWAjRTb/IrUMIsVgIkSiEOFpm21W/fiHEtJLPzCkhxH32fh3X\nqpL34RUhRKwQ4mDJbViZx54veR/ChRC3ldnu8L8/QohmQohtQogTQohjQojHSrbXxc9F+fdiVsl2\n2382pJQ2v6H9cYkEQgBX4DDQ3h7n1usGnAX8ym17G3i25Od/AW+V/HwH8EPJz32APXrHb4XXPwDo\nBhyt6esH/IAzgA/ge/FnvV+bFd6HV4AnK9i3A3AIrdu1ZcnvjKgtvz9AI6Bbyc+ewCmgfR39XFT2\nXtj8s2Gvln51JnjVNhf/Q8oqO4ltGX+/B6PRylggpdwL+AghGtojSFuRUv4BpJfbfLWv/3bgZ/n/\n7Zw9a1RBFIafA2Khgh+FWkQx6A8QsRCCZUKwEaxShQh2FrbxR1gIYqNYKIhl3C7iD/AD/MaA24iw\nmJgmgo2gHIs5V250F3Yh9y478z7N7g5z2T3vfc/Ze2fujPt3d98izSvNM0EM0AH6P9Z8EXjk7r/c\n/TPQJeVOFvnj7uvu/ibe/wDWgCnK9EU/Lar1T416o62iP8wCr9xwYNXMXprZlWg74u4bkE46UBX2\nf/Xpkac+h4eMv/JHzrpcjSGLu7XhjEHxZpc/ZnaCdAf0jOHzIktf1LR4Hk2NekObjDfHjLufBS6Q\nTuJ5htvksiQGxZ/7o723gZPufhpYB26M+fe0ipntI23Xci2ucofNi+x80UeLxr3RVtHvAcdrn6ei\nLVvc/Wu8bgIrpNuwjWrYxsyOAt+iew84Vjs8V31GjT9L37j7psdALXCH5A0oQAcz20Uqcg/c/XE0\nF+mLflq04Y22iv7fBV6WtmFeADotfXfrmNme+AfHzPYCc8B7UsxL0W0JqEzfARaj/zlgq7rdnXCM\n7Vdno8a/Csya2X4zOwjMRtuksU2HKGwVl4AP8b4DLJjZbjObBk4BL8grf+4BH939Zq2tVF/8p0Ur\n3mhxtnqeNEPdBZbHPXvecKzTpFn016Rivxzth4CnocMT4EDtmFukWfi3wJlxx7ADGjwkbcX9E/gC\nXCY9dTFS/KQi0AU+AYvjjmuHdLgPvAuPrJDGtKv+10OHNWCu1j7x+QPMAL9rufEq4ho5LzLwxSAt\nGveGFmcJIURBaCJXCCEKQkVfCCEKQkVfCCEKQkVfCCEKQkVfCCEKQkVfCCEKQkVfCCEKQkVfCCEK\n4g8OX6yEE7xN8gAAAABJRU5ErkJggg==\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f1d445a6450>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "main( par=\"./params-rob.json\", \\\n", " amp=0.0, \\\n", " simDur=2000, \\\n", " stimDur=3000, \\\n", " sim='synMod', \\\n", " modulation=1, \\\n", " randMod=1, \\\n", " target='Target1p')\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 2 }