Browse Source

gin commit from nit-ope-de04

New files: 64
Modified files: 1
sprenger 2 years ago
parent
commit
f80e021469
65 changed files with 127042 additions and 2 deletions
  1. 18 2
      README.md
  2. 3 0
      create_slides.sh
  3. 352 0
      elephant_material/elephant_logo_on_structure.svg
  4. BIN
      elephant_material/elephant_logo_sidebar.png
  5. 1159 0
      elephant_material/elephant_structure.eps
  6. BIN
      elephant_material/elephant_structure.png
  7. BIN
      elephant_material/viziphant_logo_sidebar.png
  8. 131 0
      hands_on_1.ipynb
  9. 240 0
      hands_on_1_solution.ipynb
  10. 89 0
      hands_on_2.ipynb
  11. 212 0
      hands_on_2_solution.ipynb
  12. 244 0
      hands_on_3.ipynb
  13. 432 0
      hands_on_3_solution.ipynb
  14. 1 0
      i140703-001.nix
  15. BIN
      l101210-001.nev
  16. 1 0
      l101210-001.nix
  17. BIN
      l101210-001.ns2
  18. 1 0
      l101210-001.ns5
  19. BIN
      my_first_neo_dataset.nix
  20. 1212 0
      neo_material/IODiagram.eps
  21. BIN
      neo_material/IODiagram.png
  22. 525 0
      neo_material/IODiagram.svg
  23. 3105 0
      neo_material/IODiagram_ext.eps
  24. BIN
      neo_material/IODiagram_ext.png
  25. 1553 0
      neo_material/IODiagram_ext.svg
  26. 3573 0
      neo_material/base_schematic.svg
  27. 489 0
      neo_material/base_schematic_0.svg
  28. 513 0
      neo_material/base_schematic_1.svg
  29. 681 0
      neo_material/base_schematic_2.svg
  30. 1832 0
      neo_material/base_schematic_3.svg
  31. 1893 0
      neo_material/base_schematic_4.svg
  32. 2006 0
      neo_material/base_schematic_5.svg
  33. 2024 0
      neo_material/base_schematic_6.svg
  34. 3489 0
      neo_material/base_schematic_7.svg
  35. 3558 0
      neo_material/base_schematic_8.svg
  36. BIN
      neo_material/ephys_data_modalities.png
  37. BIN
      neo_material/ephys_data_sources.png
  38. BIN
      neo_material/example_data/OpenEphys_SampleData_1/101_CH0.continuous
  39. BIN
      neo_material/example_data/OpenEphys_SampleData_1/101_CH1.continuous
  40. 12 0
      neo_material/example_data/OpenEphys_SampleData_1/Continuous_Data.openephys
  41. BIN
      neo_material/example_data/OpenEphys_SampleData_1/STp106.0n0.spikes
  42. 12 0
      neo_material/example_data/OpenEphys_SampleData_1/all_channels.events
  43. 2 0
      neo_material/example_data/OpenEphys_SampleData_1/messages.events
  44. 355 0
      neo_material/example_data/OpenEphys_SampleData_1/settings.xml
  45. 2 0
      neo_material/example_data/README.txt
  46. 116 0
      neo_material/generate_io_overview.py
  47. 202 0
      neo_material/neo_as_interface.drawio
  48. 778 0
      neo_material/neo_as_interface.svg
  49. 9221 0
      neo_material/neo_logo.eps
  50. BIN
      neo_material/neo_logo.png
  51. BIN
      neo_material/neo_logo_transparent.png
  52. 27944 0
      neo_material/neo_logo_transparent.svg
  53. BIN
      neo_material/neo_logo_transparent_no_border.png
  54. 11010 0
      neo_material/simple_generated_diagram_with_channelview.svg
  55. BIN
      reach_to_grasp_material/R2G_arrays.jpg
  56. BIN
      reach_to_grasp_material/R2G_files.png
  57. BIN
      reach_to_grasp_material/R2G_task_overview.png
  58. BIN
      results.nix
  59. 3 0
      serve_slides.sh
  60. 982 0
      tutorial_1.ipynb
  61. 15021 0
      tutorial_1.slides.html
  62. 672 0
      tutorial_2.ipynb
  63. 14768 0
      tutorial_2.slides.html
  64. 1291 0
      tutorial_3.ipynb
  65. 15315 0
      tutorial_3.slides.html

+ 18 - 2
README.md

@@ -1,3 +1,19 @@
-# neo_elephant_teaching
+---
+title: "INCF virtual training weeks 2021 - Day 3"
+subtitle: "NIX-Neo workshop"
+author: "Michael Denker, Jan Grewe, Michael Sonntag, and Julia Sprenger"
+date: 2021-08-30 to 2021-09-01
+---
 
-Teaching material for Neo and Elephant
+# Day 3 - Introduction to NEO & Elephant
+
+## Using Binder to run Juypter notebooks online
+
+We recommend running the Jupyter notebooks locally, but you can also use the following quick-links to run the featured Day 3 Jupyter notebooks on Binder.
+
+- [Day 3 - Tutorial 01 - Neo Basics](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Ftutorial_1.ipynb)
+- [Day 3 - Hands On 01 - Neo Basics](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Fhands_on_1.ipynb)
+- [Day 3 - Tutorial 02 - Data Introduction and Advanced Neo](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Ftutorial_2.ipynb)
+- [Day 3 - Hands On 02 - Data Introduction and Advanced Neo](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Fhands_on_2.ipynb)
+- [Day 3 - Tutorial 03 - Elephant](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Ftutorial_3.ipynb)
+- [Day 3 - Hands On 03 - Elephant](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Fhands_on_3.ipynb)

+ 3 - 0
create_slides.sh

@@ -0,0 +1,3 @@
+jupyter nbconvert tutorial_1.ipynb --to slides
+jupyter nbconvert tutorial_2.ipynb --to slides
+jupyter nbconvert tutorial_3.ipynb --to slides

+ 352 - 0
elephant_material/elephant_logo_on_structure.svg

@@ -0,0 +1,352 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   viewBox="0 0 492.08017 497.77286"
+   height="497.77286"
+   width="492.08017"
+   xml:space="preserve"
+   version="1.1"
+   id="svg2"><metadata
+     id="metadata8"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs6"><clipPath
+       id="clipPath172"
+       clipPathUnits="userSpaceOnUse"><path
+         id="path174"
+         d="m 210,1788.57 2070,0 0,1290 -2070,0 0,-1290 z" /></clipPath></defs><g
+     transform="matrix(1.25,0,0,-1.25,207.07093,497.76354)"
+     id="g10"><g
+       transform="scale(0.1,0.1)"
+       id="g12"><path
+         id="path14"
+         style="fill:#dbdee3;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0.04263772,-0.07451487 2280.00126228,0 0,2320.06881487 -2280.00126228,0 0,-2320.06881487 z" /><path
+         id="path16"
+         style="fill:#dbdee3;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 707.34,1768.69 1571.88,0 0,471.559 -1571.88,0 0,-471.559 z" /><path
+         id="path18"
+         style="fill:#ac9d93;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 52.3789,350.57 654.961,0 0,261.988 -654.961,0 0,-261.988 z" /><g
+         transform="scale(10,10)"
+         id="g20"><text
+           id="text22"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,15.0965,45.5367)"><tspan
+             id="tspan24"
+             y="0"
+             x="0 4.6108479 9.7414646 15.056515 20.019464 25.17523 28.62079 33.013763 35.344337 40.474953">conversion</tspan></text>
+</g><path
+         id="path26"
+         style="fill:#ac9d93;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 1571.88,350.57 654.961,0 0,261.988 -654.961,0 0,-261.988 z" /><g
+         transform="scale(10,10)"
+         id="g28"><text
+           id="text30"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,170.827,49.6465)"><tspan
+             id="tspan32"
+             y="0"
+             x="0 5.3234334 10.462433 15.777484 21.100918 26.239916">pandas</tspan><tspan
+             id="tspan34"
+             y="10.4793"
+             x="3.9542999 9.2777338 12.723294 15.053868 20.377302 25.700735">bridge</tspan></text>
+</g><path
+         id="path36"
+         style="fill:#ac9d93;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 812.148,350.57 654.922,0 0,261.988 -654.922,0 0,-261.988 z" /><g
+         transform="scale(10,10)"
+         id="g38"><text
+           id="text40"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,95.2543,45.5367)"><tspan
+             id="tspan42"
+             y="0"
+             x="0 5.3150501 10.470817 19.793114 23.07939 28.210007 33.340622 35.671196">neotools</tspan></text>
+</g><path
+         id="path44"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 1571.88,1031.74 654.961,0 0,261.953 -654.961,0 0,-261.953 z" /><g
+         transform="scale(10,10)"
+         id="g46"><text
+           y="-113.652"
+           x="186.69505"
+           id="text48"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="scale(1,-1)"><tspan
+             id="tspan50"
+             y="-113.652"
+             x="186.69505">...</tspan></text>
+</g><path
+         id="path52"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 812.148,1030.96 654.922,0 0,262.73 -654.922,0 0,-262.73 z" /><path
+         id="path62"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 52.3789,1031.74 654.961,0 0,261.953 -654.961,0 0,-261.953 z" /><g
+         transform="matrix(10,0,0,10,1579.9999,627.99997)"
+         id="g64"><text
+           id="text66"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,20.598,113.652)"><tspan
+             id="tspan68"
+             y="0"
+             x="0 4.3677306 7.6540079 12.793007 16.079285 18.409859 22.77759 26.063866 28.39444 33.030563">statistics</tspan></text>
+</g><path
+         id="path70"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 812.148,1346.11 654.922,0 0,261.949 -654.922,0 0,-261.949 z" /><g
+         transform="scale(10,10)"
+         id="g72"><text
+           y="-150.44701"
+           x="113.57523"
+           id="text74"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="scale(1,-1)"><tspan
+             id="tspan76"
+             y="-150.44701"
+             x="113.57523">cell assembly</tspan><tspan
+             id="tspan78"
+             y="-139.9678"
+             x="113.57523">detection</tspan></text>
+</g><path
+         id="path80"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 1571.88,1346.11 654.961,0 0,261.949 -654.961,0 0,-261.949 z" /><g
+         transform="scale(10,10)"
+         id="g82"><text
+           y="-145.04486"
+           x="174.23022"
+           id="text84"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="scale(1,-1)"><tspan
+             id="tspan86"
+             y="-145.04486"
+             x="174.23022">spectral</tspan></text>
+</g><path
+         id="path88"
+         style="fill:#ac9d93;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 812.891,662.129 654.961,0 0,261.949 -654.961,0 0,-261.949 z" /><g
+         transform="scale(10,10)"
+         id="g90"><text
+           id="text92"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,87.8949,80.6199)"><tspan
+             id="tspan94"
+             y="0"
+             x="0 4.3677306 9.691164 12.021738 16.590841 25.938288 29.224564 32.670124 37.809124 40.139698">spiketrain</tspan><tspan
+             id="tspan96"
+             y="10.4789"
+             x="2.4890599 6.8567905 12.171841 15.491706 18.76129 23.891907 29.21534 34.35434 37.640617 42.796383">surrogates</tspan></text>
+</g><path
+         id="path98"
+         style="fill:#ac9d93;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 1571.88,664.941 654.961,0 0,261.988 -654.961,0 0,-261.988 z" /><g
+         transform="scale(10,10)"
+         id="g100"><text
+           id="text102"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,165.08,81.084)"><tspan
+             id="tspan104"
+             y="0"
+             x="0 4.3677306 9.691164 12.021738 16.590841 25.938288 29.224564 32.670124 37.809124 40.139698">spiketrain</tspan><tspan
+             id="tspan106"
+             y="10.4793"
+             x="2.02227 7.3457036 12.50147 17.816521 22.972286 26.417847 31.556847 34.868431 37.199005 42.32962">generation</tspan></text>
+</g><g
+         transform="scale(10,10)"
+         id="g108"><text
+           id="text110"
+           style="font-variant:normal;font-weight:bold;font-size:11.78909588px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans-Bold;writing-mode:lr-tb;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(0.999975,-0.00702568,-0.00702568,-0.999975,3.97539,216)"><tspan
+             id="tspan112"
+             y="0"
+             x="0 7.9576402 16.351477">analysis</tspan></text>
+<text
+           id="text114"
+           style="font-variant:normal;font-weight:bold;font-size:11.78909969px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans-Bold;writing-mode:lr-tb;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(0.999982,0.00599396,0.00599396,-0.999982,3.08125,85.9207)"><tspan
+             id="tspan116"
+             y="0"
+             x="0 6.9909363 15.090048 20.902073">core</tspan></text>
+</g><path
+         id="path118"
+         style="fill:#ff5555;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 52.3789,114.781 2173.05,0 0,132.07 -2173.05,0 0,-132.07 z" /><g
+         transform="scale(10,10)"
+         id="g120"><text
+           id="text122"
+           style="font-variant:normal;font-weight:normal;font-size:8.38324356px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(0.90845,-3.93598e-4,0.00174332,-0.999998,85.8582,14.5113)"><tspan
+             id="tspan124"
+             y="0"
+             x="0 3.2862315 8.441927 12.809597 16.095829 18.7617 21.712601 25.158115 30.321997 38.487274 43.642971 50.500465 55.631008 59.076523">test framework</tspan></text>
+</g><path
+         id="path126"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 52.3789,1660.49 654.961,0 0,261.953 -654.961,0 0,-261.953 z" /><g
+         transform="scale(10,10)"
+         id="g128"><text
+           y="0"
+           x="14.997868"
+           id="text130"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,19.7262,181.885)"><tspan
+             id="tspan3454"
+             y="10.4793"
+             x="2.8738301 8.0295963 12.992545 18.148312 23.463362 26.74964" /></text>
+</g><path
+         id="path136"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 1571.88,1660.49 654.961,0 0,261.953 -654.961,0 0,-261.953 z" /><path
+         id="path144"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 812.148,1660.49 654.922,0 0,261.953 -654.922,0 0,-261.953 z" /><g
+         transform="scale(10,10)"
+         id="g146"><text
+           id="text148"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,97.7102,176.645)"><tspan
+             id="tspan150"
+             y="0"
+             x="0" /></text>
+</g><path
+         id="path152"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 52.3789,1346.11 654.961,0 0,261.949 -654.961,0 0,-261.949 z" /><g
+         id="g168"><g
+           clip-path="url(#clipPath172)"
+           id="g170"><g
+             transform="matrix(2071.2,0,0,1291.2,210,1787.37)"
+             id="g176" /></g></g><g
+         transform="matrix(10,0,0,10,785.7546,365.53328)"
+         id="g72-3"><text
+           y="-144.84698"
+           x="111.09045"
+           id="text74-6"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="scale(1,-1)"><tspan
+             y="-144.84698"
+             id="tspan78-5"
+             x="111.09045">spike triggered</tspan><tspan
+             id="tspan3536"
+             y="-134.36778"
+             x="111.09045">average</tspan></text>
+</g><path
+         id="path80-3"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 810.86833,1979.0533 654.96097,0 0,261.949 -654.96097,0 0,-261.949 z" /><path
+         id="path80-3-9"
+         style="fill:#f39200;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 1573.0492,1984.8941 654.961,0 0,261.949 -654.961,0 0,-261.949 z" /><g
+         transform="matrix(10,0,0,10,-30.830824,638.78415)"
+         id="g82-5-1"><text
+           id="text84-6-2"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,182.387,145.208)"><tspan
+             id="tspan86-2-7"
+             y="0"
+             x="0">cubic</tspan></text>
+</g><g
+         id="g3756"
+         transform="matrix(9.3503137,0,0,9.3503137,-1656.5792,1702.1839)"><g
+           id="g3758"
+           transform="scale(0.1,0.1)"><path
+             d="m 1774.3,664.859 c 0,0 -45,75.551 -65,178.911 -39.34,203.16 -124.65,402.03 -325.12,344.96 -102.27,-29.11 -138.44,-66.45 -211.13,-137.46 -44.69,-43.68 -169.65,-235 -169.65,-235 L 744.488,992.32 c 0,0 81.641,241.6 116.293,308.05 211.799,406.05 460.739,818.12 899.449,1001.79 290.43,121.61 384.69,84.96 660.2,21.61 364.84,-83.95 253.71,-67.54 623.87,-165 221.6,-58.36 336.68,-108.36 615.86,-114.38 304.41,-6.56 485.0594,80.7909 549.7494,51.6909 L 4205.16,665.762 1774.3,664.859"
+             style="fill:#f68712;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path3760" /><path
+             d="m 1774.3,664.855 c 0,0 -45,75.551 -65,178.911 -39.34,203.164 -124.65,402.034 -325.12,344.964 -102.27,-29.1 -138.44,-66.44 -211.13,-137.46 -44.69,-43.68 -169.65,-235.004 -169.65,-235.004 l -258.912,176.05 c 0,0 81.641,241.614 116.293,308.054 211.799,406.06 460.739,818.13 899.449,1001.79 290.43,121.61 384.69,84.97 660.2,21.61 364.84,-83.95 253.71,-67.54 623.87,-165 221.6,-58.36 336.68,-108.36 615.86,-114.38 304.41,-6.57 479.5767,83.4378 544.2667,54.3378 l 0.7562,-0.8024 -0.023,-1432.1714 z"
+             style="fill:none;stroke:#f68712;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+             id="path3762" /><path
+             d="m 2468.59,975.02 c -845.19,575 -333.32,1338.32 -415.82,1463.32 1100.63,-393.32 545.63,-958.32 415.82,-1463.32"
+             style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path3764" /><path
+             d="m 1005.04,817.711 c 0,0 -221.489,-546.133 -346.642,-694.371 C 636.09,96.8906 590.941,65.25 546.719,41.6602 496.719,15.0195 411.762,15.2891 366.719,15.0195 308.398,14.6211 247.07,40.8398 208.75,58.8789 167.031,78.5703 84.4883,124.309 53.3984,158.34 35.9805,177.398 -0.078125,224.82 5.69922,250.02 c 4.85158,21.05 67.66018,36.871 83.32028,51.75 20.3905,19.378 29.6525,84.5 57.6995,86.57 37.769,2.808 80.082,-82.07 112.73,-101.289 26.723,-15.75 83.949,-52.031 129.262,-36.063 54.059,19.063 103.828,98.172 134.687,144.032 20.391,30.308 50.512,114.41 64.84,148.039 29.813,69.769 103.481,285.281 103.481,285.281 l 54.41,165.461 258.911,-176.09"
+             style="fill:#f68712;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path3766" /><path
+             d="m 1005.04,817.715 c 0,0 -221.489,-546.141 -346.642,-694.379 C 636.09,96.8867 590.941,65.2461 546.719,41.6563 496.719,15.0156 411.762,15.2852 366.719,15.0156 308.398,14.625 247.07,40.8359 208.75,58.8867 167.031,78.5664 84.4883,124.316 53.3984,158.336 c -17.4179,19.059 -53.476525,66.48 -47.69918,91.68 4.85158,21.05 67.66018,36.871 83.32028,51.761 20.3905,19.368 29.6525,84.489 57.6995,86.559 37.769,2.809 80.082,-82.07 112.73,-101.289 26.723,-15.742 83.949,-52.031 129.262,-36.051 54.059,19.059 103.828,98.16 134.687,144.02 20.391,30.308 50.512,114.41 64.84,148.05 29.813,69.758 103.481,285.27 103.481,285.27 l 54.41,165.469 258.911,-176.09 z"
+             style="fill:none;stroke:#f68712;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+             id="path3768" /></g></g><g
+         transform="matrix(10,0,0,10,17.75458,309.53327)"
+         id="g72-3-3"><text
+           y="-150.44701"
+           x="111.89045"
+           id="text74-6-6"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="scale(1,-1)"><tspan
+             id="tspan3534"
+             y="-150.44701"
+             x="111.89045">current source</tspan><tspan
+             id="tspan3443"
+             y="-139.9678"
+             x="111.89045">density</tspan></text>
+</g><g
+         transform="matrix(10,0,0,10,-734.24543,309.53327)"
+         id="g72-3-3-3"><text
+           y="-150.44701"
+           x="111.89045"
+           id="text74-6-6-5"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="scale(1,-1)"><tspan
+             y="-150.44701"
+             id="tspan76-7-7-6"
+             x="111.89045">unitary event</tspan><tspan
+             y="-139.9678"
+             id="tspan78-5-5-2"
+             x="111.89045">detection</tspan></text>
+</g><g
+         transform="matrix(10,0,0,10,-742.24542,-314.46673)"
+         id="g72-3-9"><text
+           y="-150.44701"
+           x="111.89045"
+           id="text74-6-1"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="scale(1,-1)"><tspan
+             y="-150.44701"
+             id="tspan76-7-2"
+             x="111.89045">synfire</tspan><tspan
+             y="-139.9678"
+             id="tspan78-5-7"
+             x="111.89045">detection</tspan></text>
+</g><g
+         transform="matrix(10,0,0,10,-728.00004,-3e-5)"
+         id="g72-0"><text
+           id="text74-9"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,87.8738,150.447)"><tspan
+             id="tspan76-3"
+             y="0"
+             x="0 4.3677306 9.691164 12.021738 16.590841 16.590841 25.938288 29.224564 32.670124 37.809124 40.139698">spike train</tspan><tspan
+             id="tspan78-6"
+             y="10.4793"
+             x="2.325 6.9358482 12.066464 15.377846 18.64743 23.803196 26.13377 31.27277 34.559048 36.889622 42.020237">correlation</tspan></text>
+</g><g
+         transform="matrix(10,0,0,10,41.75458,-314.46673)"
+         id="g72-3-9-3"><text
+           y="-150.44701"
+           x="111.89045"
+           id="text74-6-1-6"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="scale(1,-1)"><tspan
+             y="-150.44701"
+             id="tspan76-7-2-7"
+             x="111.89045">change point</tspan><tspan
+             y="-139.9678"
+             id="tspan78-5-7-5"
+             x="111.89045">detection</tspan></text>
+</g><g
+         transform="matrix(10,0,0,10,-790.83078,638.78413)"
+         id="g82-5-1-3"><text
+           y="-145.20799"
+           x="175.98697"
+           id="text84-6-2-6"
+           style="font-variant:normal;font-weight:normal;font-size:8.38335991px;font-family:'DejaVu Sans';-inkscape-font-specification:DejaVuSans;writing-mode:lr-tb;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="scale(1,-1)"><tspan
+             id="tspan86-2-7-7"
+             y="-145.20799"
+             x="175.98697">statistics</tspan></text>
+</g></g></g></svg>

BIN
elephant_material/elephant_logo_sidebar.png


File diff suppressed because it is too large
+ 1159 - 0
elephant_material/elephant_structure.eps


BIN
elephant_material/elephant_structure.png


BIN
elephant_material/viziphant_logo_sidebar.png


+ 131 - 0
hands_on_1.ipynb

@@ -0,0 +1,131 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "a20f7712",
+   "metadata": {},
+   "source": [
+    "# Hands-on session 1: Neo basics\n",
+    "\n",
+    "These exercises cover the basics introduced in Tutorial 1\n",
+    "\n",
+    "## Preparation: Download public ephys dataset\n",
+    "On Linux you can download the publicly available dataset via the command below. On other systems, please download the files manually from [l101210-001.ns2](https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.ns2), [l101210-001.nev](https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.nev) and [l101210-001.ns5](https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.ns5) and save them in the same folder as this notebook.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f914945d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!wget -O l101210-001.ns2 https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.ns2\n",
+    "!wget -O l101210-001.nev https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.nev\n",
+    "!wget -O l101210-001.ns5 https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.ns5"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "95c26202",
+   "metadata": {},
+   "source": [
+    "\n",
+    "## Exercise 1: Exploring an ephys dataset\n",
+    "\n",
+    "1. Load the dataset you just downloaded with Neo. Which IO seems suitable for this dataset?\n",
+    "2. How many continuous recording parts (segments) does this dataset contain?\n",
+    "3. How many channels were recorded in this dataset and at what sampling rates?\n",
+    "4. How many spiketrains does this dataset contain?\n",
+    "\n",
+    "### Your solution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "4fa3decf",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "31ba447a",
+   "metadata": {},
+   "source": [
+    "## Exercise 2: Extracting data for visualization\n",
+    "1. Visualize the channels 10 to 19 of the `AnalogSignal` with the highest temporal resolution. \n",
+    "2. Add axis labels, title and legend based on metadata provided by the `AnalogSignal`. Check the `array_annotations` to label each channel.\n",
+    "\n",
+    "### Your solution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "feceba8f",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "766cb710",
+   "metadata": {},
+   "source": [
+    "## Exercise 3: Saving the dataset using NIX\n",
+    "- Save the complete dataset in a new file named `l101210-001.nix`\n",
+    "- What is the size of the resulting nix file?\n",
+    "\n",
+    "### Your solution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "cc5336bb",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f9c5d03b",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "81aa0351",
+   "metadata": {},
+   "source": [
+    "## Bonus Exercise\n",
+    "Did you bring your own data? Check if your format is supported by Neo and load your data!"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

File diff suppressed because it is too large
+ 240 - 0
hands_on_1_solution.ipynb


+ 89 - 0
hands_on_2.ipynb

@@ -0,0 +1,89 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "503cb687",
+   "metadata": {},
+   "source": [
+    "# Hands-on session 2: Advanced Neo\n",
+    "\n",
+    "These exercises build on concepts introduced in Tutorial 2\n",
+    "\n",
+    "## Preparation: Download public ephys dataset\n",
+    "On Linux you can download the compiled nix file via the command below. On other systems, please download the file manually from [here](https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix) and save it in the same folder as this notebook. This is the same file as already used in Tutorial 2."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5fa6ae14",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!wget -O i140703-001.nix https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4d1cd9a4",
+   "metadata": {},
+   "source": [
+    "### SpikeTrain visualization\n",
+    "1. Load the data `i140703-001.nix` file using the `neo.io.NixIO` into a neo Block.\n",
+    "3. Here we will only investigate data measured between 2 second - 12 seconds of the datasets. Create a new neo Segment that only contains data of that time range.\n",
+    "2. Select all SpikeTrains that are marked as single unit activity and have `unit_id` 1. How many of those SpikeTrains exist in the dataset?\n",
+    "\n",
+    "4. Plot the spike times in a raster plot. Use the `connector_aligned_id` as vertical offset for each Spiketrain avoid overlapping spike markers.\n",
+    "5. Add vertical lines to indicate event times labeled as `TS-ON`, `SR`, `OT` and `RW-ON`.\n",
+    "\n",
+    "### Your solution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "63dafe3f",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "544d74f6",
+   "metadata": {},
+   "source": [
+    "## Bonus Exercise\n",
+    "Did you bring your own data? Visualize your own data. Note that it might be useful to load the data in lazy mode to spare your memory."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "24b21014",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

File diff suppressed because it is too large
+ 212 - 0
hands_on_2_solution.ipynb


+ 244 - 0
hands_on_3.ipynb

@@ -0,0 +1,244 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "503cb687",
+   "metadata": {},
+   "source": [
+    "# Hands-on session 3: Elephant\n",
+    "\n",
+    "These exercises build on concepts introduced in Tutorial 3\n",
+    "\n",
+    "In this exercise, we will use the SPADE method of Elephant to find recurring patterns in the spike data of trial 1.\n",
+    "\n",
+    "\n",
+    "## Imports and Preparation"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "2fc1d993",
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "import quantities as pq\n",
+    "import neo.utils\n",
+    "import elephant\n",
+    "import viziphant"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "fb0d97b0",
+   "metadata": {
+    "pycharm": {
+     "name": "#%% md\n"
+    }
+   },
+   "source": [
+    "On Linux you can download the compiled nix file via the command below. On other systems, please download the file manually from here and save it in the same folder as this notebook."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "619675c9",
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "!wget -O i140703-001.nix https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4d1cd9a4",
+   "metadata": {},
+   "source": [
+    "## Data preparation\n",
+    "\n",
+    "\n",
+    "1. Load the data `i140703-001.nix` file using the `neo.io.NixIO` into a neo Block."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "d2e41fc5",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bb1229d4",
+   "metadata": {},
+   "source": [
+    "2. In close analogy to the beginning of tutorial 3, prepare a Neo `Block`, containing one `Segment` of SGHF data of the first correct trial. Name this `Segement` by the variable `trial`, as in tutorial 3.  In contrast to the lecture, we will cut data from the trial start `TS-ON` to reward administration indicated by event `RW-ON`. To this end, first find also the `RW-ON` events similar to how we found `TS-ON` in tutorial 3. Then, in the call to `neo.utils.add_epoch()`, supply these as a second event `event2=` *instead* of giving `t_pre=0` and `t_post=2*pq.s`. This will cut from event 1 to event 2, instead of a fixed amount of 2 s around event 1 (as in tutorial 3)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "55270d93",
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7564a093",
+   "metadata": {},
+   "source": [
+    "## SPADE analysis\n",
+    "\n",
+    "Note that patterns in this data are not easily to spot by eye in the rasterplot we developed in tutorial 3.\n",
+    "We use SPADE as a technique that does that for us by finding all patterns and checking for each pattern if it\n",
+    "occurs more often than expected given its complexity (number of neurons participating) and frequency.\n",
+    "Before going directly to the analysis we briefly explain SPADE's most important parameters:\n",
+    "\n",
+    "- `binsize`: temporal precision of the method. The smaller the binsize is, the more precisely we expect each single pattern to repeat. This raises an important question: which is the temporal precision that are you interested in? It depends on the scientific question! We often use 5ms, based on a number of studies on the minimal neuronal temporal precision.\n",
+    "- `winlen`: window length, or maximal length allowed to each pattern, expressed in bin units. SPADE will detect patterns with a temporal duration up to the window length. If winlen=1, then only synchronous patterns are detected. Are you interested in synchronous higher-order correlations? Are you interested in patterns with delays? Note: the higher the winlen parameter is, the more expensive (memory and time) the pattern search is!\n",
+    "- `min_spikes` and `min_neu`: minimum number of spikes and minimum number of neurons allowed in a pattern. These parameters are important, too. Do you want to look for pattern with a particular size? Are you interested in patterns with multiple spikes coming from the same neuron?\n",
+    "- `n_surr`: number of surrogates used for the statistical testing. If the number of surrogates is set to zero, then all patterns are retrieved by SPADE without further testing. If, instead, the number of surrogates is different from zero (typically we suggest to use a large number - the more the better!) then only the significant patterns are retrieved from the analysis. For simplicity, we will set this parameter to `n_surr=0` in the following.\n",
+    "\n",
+    "Next steps:\n",
+    "3. As in tutorial 3, select only good quality neurons using the annotations (i.e., SUA units, more than 10000 spikes,...)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "10d32abe",
+   "metadata": {
+    "pycharm": {
+     "name": "#%% md\n"
+    }
+   },
+   "source": [
+    "4. Run the SPADE analysis by executing the code given below:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "23263b16",
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "# Fix parameters for SPADE\n",
+    "binsize = 5 * pq.ms\n",
+    "winlen = 1\n",
+    "min_spikes = 2\n",
+    "n_surr = 0\n",
+    "min_neu = 2\n",
+    "min_occ = 2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "23f7d6b4",
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "result = elephant.spade.spade(\n",
+    "        spiketrains=spiketrains, binsize=binsize, winlen=winlen,\n",
+    "        min_spikes=min_spikes, n_surr=n_surr, min_neu=min_neu, min_occ=min_occ)\n",
+    "patterns = result['patterns']"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1c3d05a6",
+   "metadata": {},
+   "source": [
+    "6. Let's look at the output in `patterns`. How many patterns were found? How does one pattern look as an output?"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "11523576",
+   "metadata": {},
+   "source": [
+    "7. Display five detected patterns in the data and their statistics by executing the Viziphant function calls given below"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "345f862e",
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "viziphant.spade.plot_patterns(spiketrains, patterns[:5], circle_sizes=(1, 50, 70))\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "cc8eedf4",
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "viziphant.spade.plot_patterns_statistics(patterns)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "d2b28248",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.0"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

File diff suppressed because it is too large
+ 432 - 0
hands_on_3_solution.ipynb


+ 1 - 0
i140703-001.nix

@@ -0,0 +1 @@
+/annex/objects/MD5-s47349440--30b5a1651e5f416df40a91e4418565d5

BIN
l101210-001.nev


+ 1 - 0
l101210-001.nix

@@ -0,0 +1 @@
+/annex/objects/MD5-s49205849--84a46252ddcf3e853fbecaac9f4fa8c1

BIN
l101210-001.ns2


+ 1 - 0
l101210-001.ns5

@@ -0,0 +1 @@
+/annex/objects/MD5-s20971616--4448c75e99fe14c42900ae8ef300de80

BIN
my_first_neo_dataset.nix


File diff suppressed because it is too large
+ 1212 - 0
neo_material/IODiagram.eps


BIN
neo_material/IODiagram.png


+ 525 - 0
neo_material/IODiagram.svg

@@ -0,0 +1,525 @@
+<?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">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Pages: 1 -->
+<svg width="1537pt" height="1537pt"
+ viewBox="0.00 0.00 1536.90 1536.90" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1532.9)">
+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1532.9 1532.9,-1532.9 1532.9,4 -4,4"/>
+<text text-anchor="middle" x="764.8023" y="-3.8" font-family="Times,serif" font-size="14.00" fill="#000000">NEO 0.10.0</text>
+<!-- NEO -->
+<g id="node1" class="node">
+<title>NEO</title>
+<ellipse fill="none" stroke="#000000" cx="728.5955" cy="-758.11" rx="88.5" ry="88.5"/>
+<text text-anchor="middle" x="728.5955" y="-745.61" font-family="Arial" font-size="50.00" fill="#000000">NEO</text>
+</g>
+<!-- AlphaOmega -->
+<g id="node2" class="node">
+<title>AlphaOmega</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="352.7627,-600.03 161.7627,-600.03 161.7627,-559.03 352.7627,-559.03 352.7627,-600.03"/>
+<text text-anchor="middle" x="257.2627" y="-572.03" font-family="Arial" font-size="30.00" fill="#000000">AlphaOmega</text>
+</g>
+<!-- NEO&#45;&#45;AlphaOmega -->
+<g id="edge1" class="edge">
+<title>NEO&#45;&#45;AlphaOmega</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M652.5345,-712.8639C603.2533,-685.1746 536.8933,-650.8706 474.7591,-628.42 435.8123,-614.3476 391.4265,-603.4978 352.9522,-595.6353"/>
+</g>
+<!-- AsciiImage IO -->
+<g id="node3" class="node">
+<title>AsciiImage IO</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="354.2934,-1089.2 151.2934,-1089.2 151.2934,-1048.2 354.2934,-1048.2 354.2934,-1089.2"/>
+<text text-anchor="middle" x="252.7934" y="-1061.2" font-family="Arial" font-size="30.00" fill="#000000">AsciiImage IO</text>
+</g>
+<!-- NEO&#45;&#45;AsciiImage IO -->
+<g id="edge2" class="edge">
+<title>NEO&#45;&#45;AsciiImage IO</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M659.687,-813.741C609.4897,-853.2129 539.1346,-906.396 473.8597,-948.24 413.5139,-986.9242 339.7605,-1025.4811 294.5439,-1048.1978"/>
+</g>
+<!-- AsciiSignal -->
+<g id="node4" class="node">
+<title>AsciiSignal</title>
+<polygon fill="none" stroke="#4169e1" stroke-width="6" points="444.1588,-1161.5 280.1588,-1161.5 280.1588,-1120.5 444.1588,-1120.5 444.1588,-1161.5"/>
+<text text-anchor="middle" x="362.1588" y="-1133.5" font-family="Arial" font-size="30.00" fill="#000000">AsciiSignal</text>
+</g>
+<!-- NEO&#45;&#45;AsciiSignal -->
+<g id="edge3" class="edge">
+<title>NEO&#45;&#45;AsciiSignal</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M667.2622,-822.1972C582.9133,-910.3334 435.4885,-1064.3777 382.1426,-1120.1188"/>
+</g>
+<!-- AsciiSpikeTrain -->
+<g id="node5" class="node">
+<title>AsciiSpikeTrain</title>
+<polygon fill="none" stroke="#4169e1" stroke-width="6" points="1030.7122,-1147.2 807.7122,-1147.2 807.7122,-1106.2 1030.7122,-1106.2 1030.7122,-1147.2"/>
+<text text-anchor="middle" x="919.2122" y="-1119.2" font-family="Arial" font-size="30.00" fill="#000000">AsciiSpikeTrain</text>
+</g>
+<!-- NEO&#45;&#45;AsciiSpikeTrain -->
+<g id="edge4" class="edge">
+<title>NEO&#45;&#45;AsciiSpikeTrain</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M769.2538,-836.7297C813.7551,-922.7807 882.2652,-1055.2565 908.4934,-1105.9732"/>
+</g>
+<!-- AxographIO -->
+<g id="node6" class="node">
+<title>AxographIO</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1130.9214,-186.15 954.9214,-186.15 954.9214,-145.15 1130.9214,-145.15 1130.9214,-186.15"/>
+<text text-anchor="middle" x="1042.9214" y="-158.15" font-family="Arial" font-size="30.00" fill="#000000">AxographIO</text>
+</g>
+<!-- NEO&#45;&#45;AxographIO -->
+<g id="edge5" class="edge">
+<title>NEO&#45;&#45;AxographIO</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M753.7016,-673.1924C778.122,-596.5498 819.0533,-482.0474 870.6849,-390.07 894.8463,-347.0285 987.2454,-233.2273 1025.8329,-186.3151"/>
+</g>
+<!-- Axona IO -->
+<g id="node7" class="node">
+<title>Axona IO</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="658.7173,-95.789 517.7173,-95.789 517.7173,-54.789 658.7173,-54.789 658.7173,-95.789"/>
+<text text-anchor="middle" x="588.2173" y="-67.789" font-family="Arial" font-size="30.00" fill="#000000">Axona IO</text>
+</g>
+<!-- NEO&#45;&#45;Axona IO -->
+<g id="edge6" class="edge">
+<title>NEO&#45;&#45;Axona IO</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M687.6549,-679.5073C646.6392,-595.9789 586.2797,-458.7624 562.4721,-332.21 558.5773,-311.5065 552.0531,-303.1198 562.4721,-284.81 573.2088,-265.9418 593.7279,-278.7282 604.4647,-259.86 634.4535,-207.1593 611.4701,-131.9981 597.2651,-96.0262"/>
+</g>
+<!-- Axon -->
+<g id="node8" class="node">
+<title>Axon</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="601.2647,-256.66 516.2647,-256.66 516.2647,-215.66 601.2647,-215.66 601.2647,-256.66"/>
+<text text-anchor="middle" x="558.7647" y="-228.66" font-family="Arial" font-size="30.00" fill="#000000">Axon</text>
+</g>
+<!-- NEO&#45;&#45;Axon -->
+<g id="edge7" class="edge">
+<title>NEO&#45;&#45;Axon</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M688.4492,-678.9258C648.2398,-595.2021 588.6758,-458.0854 562.4721,-332.21 557.1665,-306.7235 556.9504,-276.6316 557.5911,-257.0113"/>
+</g>
+<!-- BCI2000 -->
+<g id="node9" class="node">
+<title>BCI2000</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="439.7513,-341.77 306.7513,-341.77 306.7513,-300.77 439.7513,-300.77 439.7513,-341.77"/>
+<text text-anchor="middle" x="373.2513" y="-313.77" font-family="Arial" font-size="30.00" fill="#000000">BCI2000</text>
+</g>
+<!-- NEO&#45;&#45;BCI2000 -->
+<g id="edge8" class="edge">
+<title>NEO&#45;&#45;BCI2000</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M681.5621,-683.1014C639.23,-617.8565 573.6258,-522.1214 507.1485,-446.14 472.2999,-406.3092 426.1421,-365.4686 398.1272,-341.7804"/>
+</g>
+<!-- Blackrock IO for single nsx -->
+<g id="node10" class="node">
+<title>Blackrock IO for single nsx</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1527.682,-650.86 1157.682,-650.86 1157.682,-609.86 1527.682,-609.86 1527.682,-650.86"/>
+<text text-anchor="middle" x="1342.682" y="-622.86" font-family="Arial" font-size="30.00" fill="#000000">Blackrock IO for single nsx</text>
+</g>
+<!-- NEO&#45;&#45;Blackrock IO for single nsx -->
+<g id="edge9" class="edge">
+<title>NEO&#45;&#45;Blackrock IO for single nsx</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M817.2658,-752.3913C901.0665,-745.6438 1029.8345,-731.7896 1138.8255,-705.12 1194.1162,-691.5906 1255.106,-668.0115 1295.8353,-650.9453"/>
+</g>
+<!-- BLK IO -->
+<g id="node11" class="node">
+<title>BLK IO</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="1080.6989,-347.29 967.6989,-347.29 967.6989,-306.29 1080.6989,-306.29 1080.6989,-347.29"/>
+<text text-anchor="middle" x="1024.1989" y="-319.29" font-family="Arial" font-size="30.00" fill="#000000">BLK IO</text>
+</g>
+<!-- NEO&#45;&#45;BLK IO -->
+<g id="edge10" class="edge">
+<title>NEO&#45;&#45;BLK IO</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M778.7406,-684.9424C847.9233,-583.9968 968.7751,-407.6598 1009.9725,-347.548"/>
+</g>
+<!-- BrainVision -->
+<g id="node12" class="node">
+<title>BrainVision</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="542.0459,-168.26 374.0459,-168.26 374.0459,-127.26 542.0459,-127.26 542.0459,-168.26"/>
+<text text-anchor="middle" x="458.0459" y="-140.26" font-family="Arial" font-size="30.00" fill="#000000">BrainVision</text>
+</g>
+<!-- NEO&#45;&#45;BrainVision -->
+<g id="edge11" class="edge">
+<title>NEO&#45;&#45;BrainVision</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M696.5826,-675.4633C648.8349,-552.2989 564.0602,-334.0709 559.6866,-325.94 542.6598,-294.286 531.4005,-290.7741 513.0647,-259.86 494.8164,-229.0935 477.2354,-191.4183 467.0422,-168.5212"/>
+</g>
+<!-- Brainware DAM File -->
+<g id="node13" class="node">
+<title>Brainware DAM File</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="847.6721,-329.01 565.6721,-329.01 565.6721,-288.01 847.6721,-288.01 847.6721,-329.01"/>
+<text text-anchor="middle" x="706.6721" y="-301.01" font-family="Arial" font-size="30.00" fill="#000000">Brainware DAM File</text>
+</g>
+<!-- NEO&#45;&#45;Brainware DAM File -->
+<g id="edge12" class="edge">
+<title>NEO&#45;&#45;Brainware DAM File</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M724.2772,-669.5519C719.0504,-562.3619 710.5881,-388.8177 707.6863,-329.3088"/>
+</g>
+<!-- Brainware F32 File -->
+<g id="node14" class="node">
+<title>Brainware F32 File</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="784.1087,-1161.5 518.1087,-1161.5 518.1087,-1120.5 784.1087,-1120.5 784.1087,-1161.5"/>
+<text text-anchor="middle" x="651.1087" y="-1133.5" font-family="Arial" font-size="30.00" fill="#000000">Brainware F32 File</text>
+</g>
+<!-- NEO&#45;&#45;Brainware F32 File -->
+<g id="edge13" class="edge">
+<title>NEO&#45;&#45;Brainware F32 File</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M711.0125,-844.9937C692.7945,-935.0155 665.5719,-1069.532 655.2644,-1120.465"/>
+</g>
+<!-- Brainware SRC File -->
+<g id="node15" class="node">
+<title>Brainware SRC File</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="279.9184,-733.43 .9184,-733.43 .9184,-692.43 279.9184,-692.43 279.9184,-733.43"/>
+<text text-anchor="middle" x="140.4184" y="-705.43" font-family="Arial" font-size="30.00" fill="#000000">Brainware SRC File</text>
+</g>
+<!-- NEO&#45;&#45;Brainware SRC File -->
+<g id="edge14" class="edge">
+<title>NEO&#45;&#45;Brainware SRC File</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M640.2212,-751.3217C544.8937,-743.9992 391.7919,-732.2389 280.1302,-723.6618"/>
+</g>
+<!-- Ced -->
+<g id="node16" class="node">
+<title>Ced</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1031.2428,-1219.5 960.2428,-1219.5 960.2428,-1178.5 1031.2428,-1178.5 1031.2428,-1219.5"/>
+<text text-anchor="middle" x="995.7428" y="-1191.5" font-family="Arial" font-size="30.00" fill="#000000">Ced</text>
+</g>
+<!-- NEO&#45;&#45;Ced -->
+<g id="edge15" class="edge">
+<title>NEO&#45;&#45;Ced</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M799.5175,-811.3729C874.1728,-872.3351 987.2169,-979.8053 1033.9122,-1103 1041.3789,-1122.6991 1040.7961,-1130.4898 1033.9122,-1150.4 1030.4065,-1160.5397 1023.8154,-1170.1735 1017.0843,-1178.1495"/>
+</g>
+<!-- Elan -->
+<g id="node17" class="node">
+<title>Elan</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1063.3029,-543.14 986.3029,-543.14 986.3029,-502.14 1063.3029,-502.14 1063.3029,-543.14"/>
+<text text-anchor="middle" x="1024.8029" y="-515.14" font-family="Arial" font-size="30.00" fill="#000000">Elan</text>
+</g>
+<!-- NEO&#45;&#45;Elan -->
+<g id="edge16" class="edge">
+<title>NEO&#45;&#45;Elan</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M798.043,-702.9027C862.3375,-651.7918 954.4926,-578.5332 998.9135,-543.2207"/>
+</g>
+<!-- igorpro -->
+<g id="node18" class="node">
+<title>igorpro</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="926.5337,-1363.5 817.5337,-1363.5 817.5337,-1322.5 926.5337,-1322.5 926.5337,-1363.5"/>
+<text text-anchor="middle" x="872.0337" y="-1335.5" font-family="Arial" font-size="30.00" fill="#000000">igorpro</text>
+</g>
+<!-- NEO&#45;&#45;igorpro -->
+<g id="edge17" class="edge">
+<title>NEO&#45;&#45;igorpro</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M746.2666,-845.1413C760.1505,-917.6171 778.5543,-1023.718 787.3087,-1117.3 788.4619,-1129.6277 786.1065,-1216.9603 790.0413,-1228.7 802.4587,-1265.7486 831.3826,-1301.1349 851.3294,-1322.4647"/>
+</g>
+<!-- Intan -->
+<g id="node19" class="node">
+<title>Intan</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="843.2339,-243.46 760.2339,-243.46 760.2339,-202.46 843.2339,-202.46 843.2339,-243.46"/>
+<text text-anchor="middle" x="801.7339" y="-215.46" font-family="Arial" font-size="30.00" fill="#000000">Intan</text>
+</g>
+<!-- NEO&#45;&#45;Intan -->
+<g id="edge18" class="edge">
+<title>NEO&#45;&#45;Intan</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M759.9079,-675.1695C790.1092,-590.415 833.6951,-454.2846 850.8721,-332.21 853.8074,-311.3488 857.8117,-304.7009 850.8721,-284.81 845.451,-269.2715 834.3152,-254.7103 824.0134,-243.6243"/>
+</g>
+<!-- KlustaKwik -->
+<g id="node20" class="node">
+<title>KlustaKwik</title>
+<polygon fill="none" stroke="#4169e1" stroke-width="6" points="925.6681,-69.231 761.6681,-69.231 761.6681,-28.231 925.6681,-28.231 925.6681,-69.231"/>
+<text text-anchor="middle" x="843.6681" y="-41.231" font-family="Arial" font-size="30.00" fill="#000000">KlustaKwik</text>
+</g>
+<!-- NEO&#45;&#45;KlustaKwik -->
+<g id="edge19" class="edge">
+<title>NEO&#45;&#45;KlustaKwik</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M759.9079,-675.1695C790.1092,-590.415 833.6951,-454.2846 850.8721,-332.21 853.8074,-311.3488 851.1934,-305.8742 850.8721,-284.81 849.6557,-205.0645 846.1292,-110.2196 844.505,-69.252"/>
+</g>
+<!-- Kwik -->
+<g id="node21" class="node">
+<title>Kwik</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="597.6474,-1233.9 517.6474,-1233.9 517.6474,-1192.9 597.6474,-1192.9 597.6474,-1233.9"/>
+<text text-anchor="middle" x="557.6474" y="-1205.9" font-family="Arial" font-size="30.00" fill="#000000">Kwik</text>
+</g>
+<!-- NEO&#45;&#45;Kwik -->
+<g id="edge20" class="edge">
+<title>NEO&#45;&#45;Kwik</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M672.238,-826.7979C619.813,-895.4922 545.3523,-1006.5827 514.9087,-1117.3 509.3233,-1137.6128 507.4845,-1144.9849 514.9087,-1164.7 518.7937,-1175.0168 525.9674,-1184.5715 533.3426,-1192.4358"/>
+</g>
+<!-- MEArec -->
+<g id="node22" class="node">
+<title>MEArec</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1135.6255,-701.92 1012.6255,-701.92 1012.6255,-660.92 1135.6255,-660.92 1135.6255,-701.92"/>
+<text text-anchor="middle" x="1074.1255" y="-673.92" font-family="Arial" font-size="30.00" fill="#000000">MEArec</text>
+</g>
+<!-- NEO&#45;&#45;MEArec -->
+<g id="edge21" class="edge">
+<title>NEO&#45;&#45;MEArec</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M815.3413,-738.8569C876.7129,-725.2355 957.5276,-707.2988 1012.4038,-695.1191"/>
+</g>
+<!-- Maxwell -->
+<g id="node23" class="node">
+<title>Maxwell</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1179.204,-905.96 1054.204,-905.96 1054.204,-864.96 1179.204,-864.96 1179.204,-905.96"/>
+<text text-anchor="middle" x="1116.704" y="-877.96" font-family="Arial" font-size="30.00" fill="#000000">Maxwell</text>
+</g>
+<!-- NEO&#45;&#45;Maxwell -->
+<g id="edge22" class="edge">
+<title>NEO&#45;&#45;Maxwell</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M812.8092,-785.7431C885.3766,-809.5546 988.5002,-843.3925 1053.9989,-864.8846"/>
+</g>
+<!-- Micromed -->
+<g id="node24" class="node">
+<title>Micromed</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="724.5785,-1469.4 577.5785,-1469.4 577.5785,-1428.4 724.5785,-1428.4 724.5785,-1469.4"/>
+<text text-anchor="middle" x="651.0785" y="-1441.4" font-family="Arial" font-size="30.00" fill="#000000">Micromed</text>
+</g>
+<!-- NEO&#45;&#45;Micromed -->
+<g id="edge23" class="edge">
+<title>NEO&#45;&#45;Micromed</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M761.0957,-840.6734C789.1259,-923.9483 820.3114,-1055.4634 787.3087,-1164.7 761.2835,-1250.8413 709.9326,-1250.2862 675.2004,-1333.3 661.9856,-1364.8848 655.7468,-1404.4552 653.0062,-1428.1514"/>
+</g>
+<!-- NIX -->
+<g id="node25" class="node">
+<title>NIX</title>
+<polygon fill="none" stroke="#4169e1" stroke-width="6" points="940.8849,-434.27 873.8849,-434.27 873.8849,-393.27 940.8849,-393.27 940.8849,-434.27"/>
+<text text-anchor="middle" x="907.3849" y="-406.27" font-family="Arial" font-size="30.00" fill="#000000">NIX</text>
+</g>
+<!-- NEO&#45;&#45;NIX -->
+<g id="edge24" class="edge">
+<title>NEO&#45;&#45;NIX</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M769.3893,-679.5431C810.7173,-599.9473 871.9563,-482.0037 896.5668,-434.6052"/>
+</g>
+<!-- neomatlab -->
+<g id="node26" class="node">
+<title>neomatlab</title>
+<polygon fill="none" stroke="#4169e1" stroke-width="6" points="1271.107,-774.29 1116.107,-774.29 1116.107,-733.29 1271.107,-733.29 1271.107,-774.29"/>
+<text text-anchor="middle" x="1193.607" y="-746.29" font-family="Arial" font-size="30.00" fill="#000000">neomatlab</text>
+</g>
+<!-- NEO&#45;&#45;neomatlab -->
+<g id="edge25" class="edge">
+<title>NEO&#45;&#45;neomatlab</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M817.1551,-757.2873C903.4558,-756.4855 1033.3776,-755.2785 1115.8062,-754.5128"/>
+</g>
+<!-- nest -->
+<g id="node27" class="node">
+<title>nest</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="470.6597,-945.04 397.6597,-945.04 397.6597,-904.04 470.6597,-904.04 470.6597,-945.04"/>
+<text text-anchor="middle" x="434.1597" y="-917.04" font-family="Arial" font-size="30.00" fill="#000000">nest</text>
+</g>
+<!-- NEO&#45;&#45;nest -->
+<g id="edge26" class="edge">
+<title>NEO&#45;&#45;nest</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M651.2359,-801.8375C592.9649,-834.7753 515.6847,-878.4579 470.79,-903.8347"/>
+</g>
+<!-- Neuralynx -->
+<g id="node28" class="node">
+<title>Neuralynx</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1227.3337,-543.02 1076.3337,-543.02 1076.3337,-502.02 1227.3337,-502.02 1227.3337,-543.02"/>
+<text text-anchor="middle" x="1151.8337" y="-515.02" font-family="Arial" font-size="30.00" fill="#000000">Neuralynx</text>
+</g>
+<!-- NEO&#45;&#45;Neuralynx -->
+<g id="edge27" class="edge">
+<title>NEO&#45;&#45;Neuralynx</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M806.2239,-714.8992C897.7436,-663.956 1046.0621,-581.3964 1114.7463,-543.1643"/>
+</g>
+<!-- NeuroExplorer -->
+<g id="node29" class="node">
+<title>NeuroExplorer</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1354.7776,-978.31 1145.7776,-978.31 1145.7776,-937.31 1354.7776,-937.31 1354.7776,-978.31"/>
+<text text-anchor="middle" x="1250.2776" y="-950.31" font-family="Arial" font-size="30.00" fill="#000000">NeuroExplorer</text>
+</g>
+<!-- NEO&#45;&#45;NeuroExplorer -->
+<g id="edge28" class="edge">
+<title>NEO&#45;&#45;NeuroExplorer</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M806.5815,-800.0123C870.764,-833.1758 964.8678,-878.8073 1051.004,-909.16 1082.4086,-920.2264 1117.4555,-929.6989 1149.2948,-937.2655"/>
+</g>
+<!-- NeuroScope -->
+<g id="node30" class="node">
+<title>NeuroScope</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="357.0501,-945.99 175.0501,-945.99 175.0501,-904.99 357.0501,-904.99 357.0501,-945.99"/>
+<text text-anchor="middle" x="266.0501" y="-917.99" font-family="Arial" font-size="30.00" fill="#000000">NeuroScope</text>
+</g>
+<!-- NEO&#45;&#45;NeuroScope -->
+<g id="edge29" class="edge">
+<title>NEO&#45;&#45;NeuroScope</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M645.3674,-788.2275C552.1226,-821.9697 403.4878,-875.7558 322.746,-904.9736"/>
+</g>
+<!-- neuroshare -->
+<g id="node31" class="node">
+<title>neuroshare</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="380.1704,-805.8 213.1704,-805.8 213.1704,-764.8 380.1704,-764.8 380.1704,-805.8"/>
+<text text-anchor="middle" x="296.6704" y="-777.8" font-family="Arial" font-size="30.00" fill="#000000">neuroshare</text>
+</g>
+<!-- NEO&#45;&#45;neuroshare -->
+<g id="edge30" class="edge">
+<title>NEO&#45;&#45;neuroshare</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M640.1467,-763.6779C564.0067,-768.471 454.9211,-775.338 380.2349,-780.0396"/>
+</g>
+<!-- NeoNWB IO -->
+<g id="node32" class="node">
+<title>NeoNWB IO</title>
+<polygon fill="none" stroke="#4169e1" stroke-width="6" points="471.5591,-672.62 289.5591,-672.62 289.5591,-631.62 471.5591,-631.62 471.5591,-672.62"/>
+<text text-anchor="middle" x="380.5591" y="-644.62" font-family="Arial" font-size="30.00" fill="#000000">NeoNWB IO</text>
+</g>
+<!-- NEO&#45;&#45;NeoNWB IO -->
+<g id="edge31" class="edge">
+<title>NEO&#45;&#45;NeoNWB IO</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M643.9013,-732.3175C583.7394,-713.9959 504.0351,-689.723 448.1308,-672.6981"/>
+</g>
+<!-- OpenEphys -->
+<g id="node33" class="node">
+<title>OpenEphys</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="351.7952,-442.65 178.7952,-442.65 178.7952,-401.65 351.7952,-401.65 351.7952,-442.65"/>
+<text text-anchor="middle" x="265.2952" y="-414.65" font-family="Arial" font-size="30.00" fill="#000000">OpenEphys</text>
+</g>
+<!-- NEO&#45;&#45;OpenEphys -->
+<g id="edge32" class="edge">
+<title>NEO&#45;&#45;OpenEphys</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M655.878,-707.4506C580.6807,-654.7799 460.1456,-569.558 357.7485,-493.54 335.1156,-476.7377 309.804,-457.1348 291.3951,-442.7261"/>
+</g>
+<!-- OpenEphysBinary -->
+<g id="node34" class="node">
+<title>OpenEphysBinary</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1192.8616,-1426 935.8616,-1426 935.8616,-1385 1192.8616,-1385 1192.8616,-1426"/>
+<text text-anchor="middle" x="1064.3616" y="-1398" font-family="Arial" font-size="30.00" fill="#000000">OpenEphysBinary</text>
+</g>
+<!-- NEO&#45;&#45;OpenEphysBinary -->
+<g id="edge33" class="edge">
+<title>NEO&#45;&#45;OpenEphysBinary</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M799.0474,-811.9658C873.0045,-873.249 985.1737,-980.8144 1033.9122,-1103 1037.4794,-1111.9427 1036.1258,-1180.0032 1036.9,-1189.6 1042.7035,-1261.5349 1055.1337,-1346.3115 1061.0719,-1384.7245"/>
+</g>
+<!-- Phy IO -->
+<g id="node35" class="node">
+<title>Phy IO</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="508.9356,-1234 400.9356,-1234 400.9356,-1193 508.9356,-1193 508.9356,-1234"/>
+<text text-anchor="middle" x="454.9356" y="-1206" font-family="Arial" font-size="30.00" fill="#000000">Phy IO</text>
+</g>
+<!-- NEO&#45;&#45;Phy IO -->
+<g id="edge34" class="edge">
+<title>NEO&#45;&#45;Phy IO</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M682.945,-834.0757C618.6189,-941.119 504.9515,-1130.2698 467.378,-1192.7948"/>
+</g>
+<!-- Python pickle file -->
+<g id="node36" class="node">
+<title>Python pickle file</title>
+<polygon fill="none" stroke="#4169e1" stroke-width="6" points="1330.9169,-382.41 1089.9169,-382.41 1089.9169,-341.41 1330.9169,-341.41 1330.9169,-382.41"/>
+<text text-anchor="middle" x="1210.4169" y="-354.41" font-family="Arial" font-size="30.00" fill="#000000">Python pickle file</text>
+</g>
+<!-- NEO&#45;&#45;Python pickle file -->
+<g id="edge35" class="edge">
+<title>NEO&#45;&#45;Python pickle file</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M786.1678,-690.6511C835.2449,-635.4198 909.3642,-557.178 983.1029,-498.94 1043.6743,-451.1014 1122.2965,-407.2009 1169.4174,-382.5651"/>
+</g>
+<!-- Plexon -->
+<g id="node37" class="node">
+<title>Plexon</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="556.4866,-370.14 448.4866,-370.14 448.4866,-329.14 556.4866,-329.14 556.4866,-370.14"/>
+<text text-anchor="middle" x="502.4866" y="-342.14" font-family="Arial" font-size="30.00" fill="#000000">Plexon</text>
+</g>
+<!-- NEO&#45;&#45;Plexon -->
+<g id="edge36" class="edge">
+<title>NEO&#45;&#45;Plexon</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M685.5339,-680.3185C632.3593,-584.2574 545.1261,-426.6691 513.9815,-370.4058"/>
+</g>
+<!-- RawBinarySignal -->
+<g id="node38" class="node">
+<title>RawBinarySignal</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="478.6193,-1375.3 233.6193,-1375.3 233.6193,-1334.3 478.6193,-1334.3 478.6193,-1375.3"/>
+<text text-anchor="middle" x="356.1193" y="-1347.3" font-family="Arial" font-size="30.00" fill="#000000">RawBinarySignal</text>
+</g>
+<!-- NEO&#45;&#45;RawBinarySignal -->
+<g id="edge37" class="edge">
+<title>NEO&#45;&#45;RawBinarySignal</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M689.2196,-837.6163C641.9054,-926.6174 555.2426,-1070.6542 447.3588,-1164.7 428.7283,-1180.9408 413.1762,-1170.5011 397.7356,-1189.8 363.4066,-1232.707 356.993,-1300.3671 356.0522,-1334.1607"/>
+</g>
+<!-- RawMCS -->
+<g id="node39" class="node">
+<title>RawMCS</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="503.9485,-490.34 360.9485,-490.34 360.9485,-449.34 503.9485,-449.34 503.9485,-490.34"/>
+<text text-anchor="middle" x="432.4485" y="-462.34" font-family="Arial" font-size="30.00" fill="#000000">RawMCS</text>
+</g>
+<!-- NEO&#45;&#45;RawMCS -->
+<g id="edge38" class="edge">
+<title>NEO&#45;&#45;RawMCS</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M665.0645,-696.2689C598.4416,-631.418 497.4798,-533.1416 453.8136,-490.6369"/>
+</g>
+<!-- Spike2 -->
+<g id="node40" class="node">
+<title>Spike2</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="786.4004,-1377.5 678.4004,-1377.5 678.4004,-1336.5 786.4004,-1336.5 786.4004,-1377.5"/>
+<text text-anchor="middle" x="732.4004" y="-1349.5" font-family="Arial" font-size="30.00" fill="#000000">Spike2</text>
+</g>
+<!-- NEO&#45;&#45;Spike2 -->
+<g id="edge39" class="edge">
+<title>NEO&#45;&#45;Spike2</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M754.8987,-842.9616C777.0674,-925.1932 802.8798,-1053.4543 787.3087,-1164.7 778.3328,-1228.8271 753.2933,-1301.5794 740.3592,-1336.3552"/>
+</g>
+<!-- SpikeGadgets -->
+<g id="node41" class="node">
+<title>SpikeGadgets</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="937.8168,-1528.9 733.8168,-1528.9 733.8168,-1487.9 937.8168,-1487.9 937.8168,-1528.9"/>
+<text text-anchor="middle" x="835.8168" y="-1500.9" font-family="Arial" font-size="30.00" fill="#000000">SpikeGadgets</text>
+</g>
+<!-- NEO&#45;&#45;SpikeGadgets -->
+<g id="edge40" class="edge">
+<title>NEO&#45;&#45;SpikeGadgets</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M746.2666,-845.1413C760.1505,-917.6171 778.5543,-1023.718 787.3087,-1117.3 791.9216,-1166.6107 785.4236,-1179.3897 790.0413,-1228.7 799.1938,-1326.4364 821.8809,-1441.7043 831.4493,-1487.8235"/>
+</g>
+<!-- SpikeGLX -->
+<g id="node42" class="node">
+<title>SpikeGLX</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="1192.1,-1186.4 1040.1,-1186.4 1040.1,-1145.4 1192.1,-1145.4 1192.1,-1186.4"/>
+<text text-anchor="middle" x="1116.1" y="-1158.4" font-family="Arial" font-size="30.00" fill="#000000">SpikeGLX</text>
+</g>
+<!-- NEO&#45;&#45;SpikeGLX -->
+<g id="edge41" class="edge">
+<title>NEO&#45;&#45;SpikeGLX</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M789.5694,-822.2758C878.8742,-916.2556 1040.6936,-1086.5462 1096.5332,-1145.3088"/>
+</g>
+<!-- Stimfit -->
+<g id="node43" class="node">
+<title>Stimfit</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="956.9219,-258.6 856.9219,-258.6 856.9219,-217.6 956.9219,-217.6 956.9219,-258.6"/>
+<text text-anchor="middle" x="906.9219" y="-230.6" font-family="Arial" font-size="30.00" fill="#000000">Stimfit</text>
+</g>
+<!-- NEO&#45;&#45;Stimfit -->
+<g id="edge42" class="edge">
+<title>NEO&#45;&#45;Stimfit</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M757.3457,-674.2726C799.6086,-551.0317 876.0597,-328.0959 899.7359,-259.0547"/>
+</g>
+<!-- Tdt -->
+<g id="node44" class="node">
+<title>Tdt</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="852.2413,-1225.5 793.2413,-1225.5 793.2413,-1184.5 852.2413,-1184.5 852.2413,-1225.5"/>
+<text text-anchor="middle" x="822.7413" y="-1197.5" font-family="Arial" font-size="30.00" fill="#000000">Tdt</text>
+</g>
+<!-- NEO&#45;&#45;Tdt -->
+<g id="edge43" class="edge">
+<title>NEO&#45;&#45;Tdt</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M742.1661,-845.7137C755.3554,-925.7062 777.346,-1046.9035 804.5122,-1150.4 807.5061,-1161.806 811.613,-1174.2976 815.1708,-1184.4506"/>
+</g>
+<!-- TIFF IO -->
+<g id="node45" class="node">
+<title>TIFF IO</title>
+<polygon fill="none" stroke="#20b2aa" stroke-width="6" points="1136.6452,-1043.8 1017.6452,-1043.8 1017.6452,-1002.8 1136.6452,-1002.8 1136.6452,-1043.8"/>
+<text text-anchor="middle" x="1077.1452" y="-1015.8" font-family="Arial" font-size="30.00" fill="#000000">TIFF IO</text>
+</g>
+<!-- NEO&#45;&#45;TIFF IO -->
+<g id="edge44" class="edge">
+<title>NEO&#45;&#45;TIFF IO</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M799.1297,-811.7752C876.5098,-870.6489 996.7912,-962.1635 1050.1168,-1002.7357"/>
+</g>
+<!-- WinEdr -->
+<g id="node46" class="node">
+<title>WinEdr</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="782.6328,-141.68 667.6328,-141.68 667.6328,-100.68 782.6328,-100.68 782.6328,-141.68"/>
+<text text-anchor="middle" x="725.1328" y="-113.68" font-family="Arial" font-size="30.00" fill="#000000">WinEdr</text>
+</g>
+<!-- NEO&#45;&#45;WinEdr -->
+<g id="edge45" class="edge">
+<title>NEO&#45;&#45;WinEdr</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M759.9079,-675.1695C790.1092,-590.415 833.6951,-454.2846 850.8721,-332.21 853.8074,-311.3488 851.418,-305.8696 850.8721,-284.81 850.3788,-265.7797 855.9811,-215.7295 846.4339,-199.26 831.2986,-173.1507 803.5361,-154.3213 778.3872,-141.7034"/>
+</g>
+<!-- WinWcp -->
+<g id="node47" class="node">
+<title>WinWcp</title>
+<polygon fill="none" stroke="#008080" stroke-width="6" points="615.8696,-1395.2 487.8696,-1395.2 487.8696,-1354.2 615.8696,-1354.2 615.8696,-1395.2"/>
+<text text-anchor="middle" x="551.8696" y="-1367.2" font-family="Arial" font-size="30.00" fill="#000000">WinWcp</text>
+</g>
+<!-- NEO&#45;&#45;WinWcp -->
+<g id="edge46" class="edge">
+<title>NEO&#45;&#45;WinWcp</title>
+<path fill="none" stroke="#000000" stroke-width="4" d="M672.3922,-826.8406C620.0823,-895.5667 545.7048,-1006.6803 514.9087,-1117.3 511.3386,-1130.1235 512.6852,-1223.9059 514.4474,-1237.1 520.1171,-1279.552 535.2138,-1327.4667 544.4071,-1354.0739"/>
+</g>
+</g>
+</svg>

File diff suppressed because it is too large
+ 3105 - 0
neo_material/IODiagram_ext.eps


BIN
neo_material/IODiagram_ext.png


File diff suppressed because it is too large
+ 1553 - 0
neo_material/IODiagram_ext.svg


File diff suppressed because it is too large
+ 3573 - 0
neo_material/base_schematic.svg


File diff suppressed because it is too large
+ 489 - 0
neo_material/base_schematic_0.svg


File diff suppressed because it is too large
+ 513 - 0
neo_material/base_schematic_1.svg


File diff suppressed because it is too large
+ 681 - 0
neo_material/base_schematic_2.svg


File diff suppressed because it is too large
+ 1832 - 0
neo_material/base_schematic_3.svg


File diff suppressed because it is too large
+ 1893 - 0
neo_material/base_schematic_4.svg


File diff suppressed because it is too large
+ 2006 - 0
neo_material/base_schematic_5.svg


File diff suppressed because it is too large
+ 2024 - 0
neo_material/base_schematic_6.svg


File diff suppressed because it is too large
+ 3489 - 0
neo_material/base_schematic_7.svg


File diff suppressed because it is too large
+ 3558 - 0
neo_material/base_schematic_8.svg


BIN
neo_material/ephys_data_modalities.png


BIN
neo_material/ephys_data_sources.png


BIN
neo_material/example_data/OpenEphys_SampleData_1/101_CH0.continuous


BIN
neo_material/example_data/OpenEphys_SampleData_1/101_CH1.continuous


+ 12 - 0
neo_material/example_data/OpenEphys_SampleData_1/Continuous_Data.openephys

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<EXPERIMENT version="0.4000000000000000222" number="1" separatefiles="0">
+  <RECORDING number="0" samplerate="40000">
+    <PROCESSOR id="101">
+      <CHANNEL name="CH0" bitVolts="0.050000000745058059692" filename="101_CH0.continuous"
+               position="1024"/>
+      <CHANNEL name="CH1" bitVolts="0.050000000745058059692" filename="101_CH1.continuous"
+               position="1024"/>
+    </PROCESSOR>
+  </RECORDING>
+</EXPERIMENT>

BIN
neo_material/example_data/OpenEphys_SampleData_1/STp106.0n0.spikes


+ 12 - 0
neo_material/example_data/OpenEphys_SampleData_1/all_channels.events

@@ -0,0 +1,12 @@
+header.format = 'Open Ephys Data Format'; 
+header.version = 0.4; 
+header.header_bytes = 1024;
+header.description = 'each record contains one 64-bit timestamp, one 16-bit sample position, one uint8 event type, one uint8 processor ID, one uint8 event ID, one uint8 event channel, and one uint16 recordingNumber'; 
+header.date_created = '3-Oct-2018 131650';
+header.channel = 'GUI Messages';
+header.channelType = 'Continuous';
+header.sampleRate = 40000;
+header.blockLength = 1024;
+header.bufferSize = 1024;
+header.bitVolts = 1;
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    

+ 2 - 0
neo_material/example_data/OpenEphys_SampleData_1/messages.events

@@ -0,0 +1,2 @@
+51979 Software time: 51979@1000000000Hz
+51968 Processor: File Reader Id: 101 subProcessor: 0 start time: 51968@40000Hz

+ 355 - 0
neo_material/example_data/OpenEphys_SampleData_1/settings.xml

@@ -0,0 +1,355 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<SETTINGS>
+  <INFO>
+    <VERSION>0.4.4</VERSION>
+    <PLUGIN_API_VERSION>5</PLUGIN_API_VERSION>
+    <DATE>3 Oct 2018 13:16:50</DATE>
+    <OS>Mac OSX 10.12.6</OS>
+    <MACHINE>moondog</MACHINE>
+  </INFO>
+  <SIGNALCHAIN>
+    <PROCESSOR name="Sources/File Reader" insertionPoint="1" pluginName="File Reader"
+               pluginType="-1" pluginIndex="2" libraryName="" libraryVersion="-1"
+               isSource="1" isSink="0" NodeId="101">
+      <CHANNEL name="0" number="0">
+        <SELECTIONSTATE param="1" record="1" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="1" number="1">
+        <SELECTIONSTATE param="1" record="1" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="2" number="2">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="3" number="3">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="4" number="4">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="5" number="5">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="6" number="6">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="7" number="7">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="8" number="8">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="9" number="9">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="10" number="10">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="11" number="11">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="12" number="12">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="13" number="13">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="14" number="14">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="15" number="15">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <EDITOR isCollapsed="0" displayName="File Reader" Type="FileReader">
+        <FILENAME path="/Users/Josh/GitHub/open-ephys/DataFiles/data_stream_16ch_cortex.kwd"
+                  recording="1"/>
+        <TIME_LIMITS start_time="0" stop_time="4999"/>
+      </EDITOR>
+    </PROCESSOR>
+    <PROCESSOR name="Utilities/Splitter" insertionPoint="1" pluginName="Splitter"
+               pluginType="-1" pluginIndex="1" libraryName="" libraryVersion="-1"
+               isSource="0" isSink="0" NodeId="103">
+      <EDITOR isCollapsed="0" displayName="Splitter"/>
+    </PROCESSOR>
+    <PROCESSOR name="Sinks/LFP Viewer Beta" insertionPoint="1" pluginName="LFP Viewer Beta"
+               pluginType="1" pluginIndex="9" libraryName="LFP viewer Beta"
+               libraryVersion="1" isSource="0" isSink="1" NodeId="102">
+      <CHANNEL name="0" number="0">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="1" number="1">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="2" number="2">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="3" number="3">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="4" number="4">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="5" number="5">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="6" number="6">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="7" number="7">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="8" number="8">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="9" number="9">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="10" number="10">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="11" number="11">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="12" number="12">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="13" number="13">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="14" number="14">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="15" number="15">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <EDITOR isCollapsed="0" displayName="LFP Viewer Beta" Type="Visualizer">
+        <TAB Active="1"/>
+        <WINDOW Active="0"/>
+        <LFPDISPLAY Range="1000,2000,10.0" Timebase="2.0" Spread="50" colorGrouping="1"
+                    isInverted="0" drawMethod="0" EventButtonState="255" ChannelDisplayState="1111111111111111"
+                    ScrollX="0" ScrollY="0"/>
+      </EDITOR>
+    </PROCESSOR>
+    <SWITCH number="1"/>
+    <PROCESSOR name="Filters/Bandpass Filter" insertionPoint="1" pluginName="Bandpass Filter"
+               pluginType="1" pluginIndex="7" libraryName="Bandpass Filter"
+               libraryVersion="1" isSource="0" isSink="0" NodeId="105">
+      <CHANNEL name="0" number="0">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="1" number="1">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="2" number="2">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="3" number="3">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="4" number="4">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="5" number="5">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="6" number="6">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="7" number="7">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="8" number="8">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="9" number="9">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="10" number="10">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="11" number="11">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="12" number="12">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="13" number="13">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="14" number="14">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <CHANNEL name="15" number="15">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+        <PARAMETERS highcut="6000" lowcut="300" shouldFilter="1"/>
+      </CHANNEL>
+      <EDITOR isCollapsed="0" displayName="Bandpass Filter" Type="FilterEditor">
+        <VALUES HighCut="6000" LowCut="300" ApplyToADC="0"/>
+      </EDITOR>
+    </PROCESSOR>
+    <PROCESSOR name="Filters/Spike Detector" insertionPoint="1" pluginName="Spike Detector"
+               pluginType="1" pluginIndex="1" libraryName="Basic Spike Display"
+               libraryVersion="1" isSource="0" isSink="0" NodeId="106">
+      <ELECTRODE name="Stereotrode 1" numChannels="2" prePeakSamples="8" postPeakSamples="32"
+                 electrodeID="1">
+        <SUBCHANNEL ch="0" thresh="50" isActive="1"/>
+        <SUBCHANNEL ch="1" thresh="50" isActive="1"/>
+      </ELECTRODE>
+      <CHANNEL name="0" number="0">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="1" number="1">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="2" number="2">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="3" number="3">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="4" number="4">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="5" number="5">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="6" number="6">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="7" number="7">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="8" number="8">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="9" number="9">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="10" number="10">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="11" number="11">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="12" number="12">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="13" number="13">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="14" number="14">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="15" number="15">
+        <SELECTIONSTATE param="0" record="0" audio="0"/>
+      </CHANNEL>
+      <SPIKECHANNEL name="0" number="0"/>
+      <EDITOR isCollapsed="0" displayName="Spike Detector"/>
+    </PROCESSOR>
+    <PROCESSOR name="Sinks/Spike Viewer" insertionPoint="1" pluginName="Spike Viewer"
+               pluginType="1" pluginIndex="2" libraryName="Basic Spike Display"
+               libraryVersion="1" isSource="0" isSink="1" NodeId="107">
+      <CHANNEL name="0" number="0">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="1" number="1">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="2" number="2">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="3" number="3">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="4" number="4">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="5" number="5">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="6" number="6">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="7" number="7">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="8" number="8">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="9" number="9">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="10" number="10">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="11" number="11">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="12" number="12">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="13" number="13">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="14" number="14">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <CHANNEL name="15" number="15">
+        <SELECTIONSTATE param="1" record="0" audio="0"/>
+      </CHANNEL>
+      <SPIKECHANNEL name="0" number="0"/>
+      <EDITOR isCollapsed="0" displayName="Spike Viewer" Type="Visualizer">
+        <TAB Active="1"/>
+        <WINDOW Active="0"/>
+        <SPIKEDISPLAY LockThresholds="0" InvertSpikes="0">
+          <PLOT>
+            <AXIS thresh="0" range="250"/>
+            <AXIS thresh="0" range="250"/>
+          </PLOT>
+        </SPIKEDISPLAY>
+      </EDITOR>
+    </PROCESSOR>
+  </SIGNALCHAIN>
+  <AUDIO bufferSize="1024"/>
+  <GLOBAL_TIMESTAMP selected_index="0" selected_sub_index="0"/>
+  <CONTROLPANEL isOpen="1" recordPath="/Users/Josh/Documents/open-ephys" prependText=""
+                appendText="" recordEngine="OPENEPHYS"/>
+  <AUDIOEDITOR isMuted="0" volume="0" noiseGate="0"/>
+  <RECORDENGINES>
+    <ENGINE id="OPENEPHYS" name="Open Ephys">
+      <PARAMETER id="0" type="bool" value="0"/>
+      <PARAMETER id="1" type="bool" value="0"/>
+      <PARAMETER id="2" type="string" value="CH"/>
+    </ENGINE>
+    <ENGINE id="RAWBINARY" name="Binary">
+      <PARAMETER id="0" type="bool" value="1"/>
+    </ENGINE>
+    <ENGINE id="KWIK" name="Kwik"/>
+    <ENGINE id="NWB" name="NWB">
+      <PARAMETER id="0" type="string" value=""/>
+    </ENGINE>
+  </RECORDENGINES>
+  <PROCESSORLIST>
+    <COLOR ID="801" R="59" G="59" B="59"/>
+    <COLOR ID="804" R="241" G="90" B="41"/>
+    <COLOR ID="802" R="0" G="174" B="239"/>
+    <COLOR ID="803" R="0" G="166" B="81"/>
+    <COLOR ID="805" R="147" G="149" B="152"/>
+  </PROCESSORLIST>
+  <UICOMPONENT isProcessorListOpen="1" isEditorViewportOpen="1"/>
+</SETTINGS>

+ 2 - 0
neo_material/example_data/README.txt

@@ -0,0 +1,2 @@
+Data from https://gin.g-node.org/NeuralEnsemble/ephy_testing_data
+- `OpenEphys_SampleData_1` is provided by josh.siegle@gmail.com from open ephys project.

+ 116 - 0
neo_material/generate_io_overview.py

@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+
+"""
+This generate diagram of the (raw)ios and formats
+
+
+Author: Julia Sprenger
+"""
+
+import pygraphviz
+import neo
+# from datetime import datetime
+#
+# import numpy as np
+# import quantities as pq
+# from matplotlib import pyplot
+# from matplotlib.patches import Rectangle, ArrowStyle, FancyArrowPatch
+# from matplotlib.font_manager import FontProperties
+#
+# from neo.test.generate_datasets import fake_neo
+#
+# line_heigth = .22
+# fontsize = 10.5
+# left_text_shift = .1
+# dpi = 100
+
+
+default_style = {'shape': 'rectangle',
+                 'color': 'black',
+                 'fontcolor': 'black'}
+IO_style = default_style.copy()
+IO_style['fontsize'] = '30'
+IO_style['penwidth'] = 6
+
+styles = {'IO': {'ro': IO_style.copy(),
+                 'rw': IO_style.copy(),
+                 'raw': IO_style.copy()
+                 },
+          'main': default_style.copy(),
+          'ext': default_style.copy()}
+
+styles['IO']['ro']['color'] = '#20B2AA '
+styles['IO']['rw']['color'] = '#4169E1 '
+styles['IO']['raw']['color'] = '#008080 '
+styles['ext']['shape'] = 'circle'
+styles['ext']['fillcolor'] = 'red'
+styles['ext']['style'] = 'filled'
+# styles['ext']['fixedsize'] = 'True'
+
+
+def generate_diagram(filename, plot_extensions=False):
+    dia = pygraphviz.AGraph(strict=False, splines='true')
+    G=dia
+    G.node_attr['fontname'] = 'Arial'
+    # G.node_attr['shape'] = 'circle'
+    # G.node_attr['fixedsize'] = 'true'
+    # G.node_attr['sep'] = '-100'
+    G.node_attr['fixedsize'] = 'False'
+    # G.graph_attr['overlap'] = 'False'
+    G.graph_attr['packMode'] = 'clust'
+    # G.graph_attr['levelsgap'] = -500
+    G.node_attr['fontsize'] = '20'
+    G.edge_attr['minlen'] = '0'
+    # G.node_attr['style'] = 'filled'
+    # G.graph_attr['outputorder'] = 'edgesfirst'
+    # G.graph_attr['splines'] = "compound"
+    G.graph_attr['label'] = "NEO {}".format(neo.__version__)
+    G.graph_attr['ratio'] = '1.0'
+    # G.edge_attr['color'] = '#1100FF'
+
+
+    G.edge_attr['style'] = 'setlinewidth(4)'
+
+    dia.add_node('NEO', shape='circle', fontsize=50)
+
+    for io in neo.io.iolist:
+        io_name = io.name
+        rawio = False
+        if issubclass(io, neo.io.basefromrawio.BaseFromRaw):
+            rawio = True
+            if io_name == 'BaseIO':
+                io_name = io.__name__.rstrip('RawIO')
+        if io_name is None:
+            try:
+                io_name = io.__name__.rstrip('IO')
+            except:
+                continue
+        if 'example' in io_name:
+            continue
+
+        if io.is_writable and io.is_readable:
+            mode = 'rw'
+        elif io.is_readable:
+            mode = 'ro'
+        if rawio:
+            mode = 'raw'
+
+        dia.add_node(io_name, **styles['IO'][mode])
+        dia.add_edge('NEO', io_name)
+
+        if plot_extensions:
+            for ext in io.extensions:
+                dia.add_node(ext, **styles['ext'])
+                dia.add_edge(io_name, ext, minlen=0)
+
+    dia.layout(prog='fdp') #neato, dot, twopi, circo, fdp, nop, wc, acyclic, gvpr, gvcolor,
+    # ccomps, sccmap, tred, sfdp.
+    for ext in ['png', 'svg', 'eps']:
+        dia.draw('{}.{}'.format(filename, ext))
+
+
+
+if __name__ == '__main__':
+    generate_diagram('IODiagram', plot_extensions=False)
+    generate_diagram('IODiagram_ext', plot_extensions=True)
+    # pyplot.show()

File diff suppressed because it is too large
+ 202 - 0
neo_material/neo_as_interface.drawio


File diff suppressed because it is too large
+ 778 - 0
neo_material/neo_as_interface.svg


File diff suppressed because it is too large
+ 9221 - 0
neo_material/neo_logo.eps


BIN
neo_material/neo_logo.png


BIN
neo_material/neo_logo_transparent.png


File diff suppressed because it is too large
+ 27944 - 0
neo_material/neo_logo_transparent.svg


BIN
neo_material/neo_logo_transparent_no_border.png


File diff suppressed because it is too large
+ 11010 - 0
neo_material/simple_generated_diagram_with_channelview.svg


BIN
reach_to_grasp_material/R2G_arrays.jpg


BIN
reach_to_grasp_material/R2G_files.png


BIN
reach_to_grasp_material/R2G_task_overview.png


BIN
results.nix


+ 3 - 0
serve_slides.sh

@@ -0,0 +1,3 @@
+jupyter nbconvert tutorial_1.ipynb --to slides --post serve
+jupyter nbconvert tutorial_2.ipynb --to slides --post serve
+jupyter nbconvert tutorial_3.ipynb --to slides --post serve

+ 982 - 0
tutorial_1.ipynb

@@ -0,0 +1,982 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "591a5673",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "# <p align=\"center\">Introduction to\n",
+    "![Neo](./neo_material/neo_logo.png)\n",
+    "<p align=\"center\">Representing electrophysiology data in Python"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d02e9275",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "## Data sources in electrophysiology\n",
+    "\n",
+    "![Data sources](./neo_material/ephys_data_sources.png)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "dee2a771",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Data modalities in electrophysiology\n",
+    "\n",
+    "![Data sources](./neo_material/ephys_data_modalities.png)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4c7b4932",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "How can these diverse data types and formats by treated in a common framework to \n",
+    "- allow combined analyses\n",
+    "- facilitate reproducibility\n",
+    "- simplify scientific workflows"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b80bdd60",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "...without inventing yet another file format standard?"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c09c4aac",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "##  Neo - Generic representation of common ephys modalities\n",
+    "- [Neo on PyPi](https://pypi.org/project/neo/) & [github](https://github.com/NeuralEnsemble/python-neo)\n",
+    "- [Neo documentation](https://neo.readthedocs.io)\n",
+    "- Standardized representation of ephys data during runtime\n",
+    "- Efficient handling of large data arrays thanks to `numpy`\n",
+    "- Description of physical units and unit conversion thanks to `quantities`"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "6e5df85c",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "import neo\n",
+    "import numpy as np\n",
+    "import quantities as pq"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9242b2de",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Data Classes\n",
+    "- `AnalogSignal`: Continuous data sampled in **regular** intervals"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7f8c47d0",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "*essential metadata*: physical unit of samples, time stamps of the samples (first timestamp & sampling interval)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "ecfbe500",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "anasig = neo.AnalogSignal(np.zeros((50,2)), units='uV',\n",
+    "                sampling_rate=10000*pq.Hz,\n",
+    "                t_start=120*pq.ms)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "fa04abd6",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "Note the dimensions of `Analogsignal` object: (`time`, `channel`)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "710a0eb7",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "#### Accessing metadata"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "9ba68d73",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "units: 1.0 uV\n",
+      "sampling_rate: 10000.0 Hz\n",
+      "sampling_period: 0.0001 s\n",
+      "t_start & t_stop: (array(120.) * ms, array(125.) * ms)\n",
+      "times: [120.  120.1 120.2 120.3 120.4 120.5 120.6 120.7 120.8 120.9 121.  121.1\n",
+      " 121.2 121.3 121.4 121.5 121.6 121.7 121.8 121.9 122.  122.1 122.2 122.3\n",
+      " 122.4 122.5 122.6 122.7 122.8 122.9 123.  123.1 123.2 123.3 123.4 123.5\n",
+      " 123.6 123.7 123.8 123.9 124.  124.1 124.2 124.3 124.4 124.5 124.6 124.7\n",
+      " 124.8 124.9] ms\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(f'units: {anasig.units}')\n",
+    "print(f'sampling_rate: {anasig.sampling_rate}')\n",
+    "print(f'sampling_period: {anasig.sampling_period.simplified}')\n",
+    "print(f't_start & t_stop: {anasig.t_start, anasig.t_stop}')\n",
+    "print(f'times: {anasig.times}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "afdf47c2",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "\n",
+    "![AnalogSignal](./neo_material/base_schematic_0.svg)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9171b1f5",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Data Classes\n",
+    "- `AnalogSignal`: Continuous data sampled in **regular** intervals\n",
+    "- `IrregularlySampledSignal`: Continuous data sampled in **irregular** intervals\n",
+    "- `ImageSequence`: Continuous 2D **frames** sampled in regular intervals"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "cec7e8c0",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "![ImageSequence](./neo_material/base_schematic_2.svg)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0bfb4ac8",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Data Classes\n",
+    "- `AnalogSignal`: Continuous data sampled in **regular** intervals\n",
+    "- `IrregularlySampledSignal`: Continuous data sampled in **irregular** intervals\n",
+    "- `ImageSequence`: Continuous 2D **image frames** sampled in regular intervals\n",
+    "- `SpikeTrain`: Time point data (& optional waveform snippet)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0534eb6b",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "*essential metadata* time values, physical units of times, (& waveform sampling rate, waveform offset to corresponding time value)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "d7efe06e",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "spiketrain: [1.  4.  5.7] ms\n",
+      "t_start & t_stop: (array(0.) * ms, array(300.) * ms)\n"
+     ]
+    }
+   ],
+   "source": [
+    "st = neo.SpikeTrain([1, 4, 5.7], units='ms', name='#001', t_start=0*pq.ms, t_stop=300*pq.ms)\n",
+    "print(f'spiketrain: {st}')\n",
+    "print(f't_start & t_stop: {st.t_start, st.t_stop}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d5ad23e7",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "![SpikeTrain](./neo_material/base_schematic_3.svg)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d0456d48",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Data Classes\n",
+    "- `AnalogSignal`: Continuous data sampled in **regular** intervals\n",
+    "- `IrregularlySampledSignal`: Continuous data sampled in **irregular** intervals\n",
+    "- `ImageSequence`: Continuous 2D **image frames** sampled in regular intervals\n",
+    "- `SpikeTrain`: Time point data (& optional waveform snippet)\n",
+    "- `Event`: Experiment reference time points (e.g. trigger, trial start, ...)\n",
+    "- `Epoch`: Experiment reference time ranges (e.g. trial, stimulation, ...)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "759eee37",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "![Epoch](./neo_material/base_schematic_5.svg)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b1d5a21d",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Additional metadata attributes\n",
+    "- human readable label of objects via `name` attribute\n",
+    "- custom metadata annotations via `annotation` and `array_annotation` attributes\n",
+    "- `Event` and `Epoch` can be used to `label` each time point / time period"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "321dc012",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "name: electrode 1A\n",
+      "annotations: {'signal_quality': 'good'}\n",
+      "number of channels: 2\n",
+      "array_annotations: {'channel_id': array([1, 2])}\n"
+     ]
+    }
+   ],
+   "source": [
+    "anasig.name = 'electrode 1A'\n",
+    "anasig.annotate(signal_quality='good')\n",
+    "anasig.array_annotate(channel_id=[1,2])\n",
+    "print(f'name: {anasig.name}')\n",
+    "print(f'annotations: {anasig.annotations}')\n",
+    "print(f'number of channels: {anasig.shape[-1]}')\n",
+    "print(f'array_annotations: {anasig.array_annotations}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c2062418",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Neo objects provide utility functions\n",
+    "Some usefull utility attributes and methods of neo data objects are\n",
+    "- `.times` to get array of corresponding time values\n",
+    "- `.time_slice()` to crop to a specific time range\n",
+    "- `.merge()` to combine multiple objects of the same type\n",
+    "- `.concatenate()` to append multiple signal objects\n",
+    "- `.downsample()` to create a new signal with a different sampling rate\n",
+    "- `.magnitude` to extract the underlying numpy array\n",
+    "- check out the jupyter `help()` to discover more in the documentation!"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0b7a117b",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Relations between data objects - Container Classes\n",
+    "- `ChannelView`: select a subset of channels of a signal, e.g. all even channels of an `AnalogSignal`\n",
+    "- **`Segment`**: contains data objects with a shared clock, e.g. a trial\n",
+    "- `Group`: groups data objects logically (no common clock required, e.g. `SpikeTrain`s of a neuronal unit)\n",
+    "- **`Block`**: contains all objects of a recording"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "635213d6",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "![Block](./neo_material/base_schematic.svg)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "63624385",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Neo structure\n",
+    "\n",
+    "```\n",
+    "Block 0\n",
+    "    .segments\n",
+    "        Segment 0\n",
+    "            .analogsignals\n",
+    "                AnalogSignal 0\n",
+    "                AnalogSignal 1\n",
+    "            .spiketrains\n",
+    "                SpikeTrain 0\n",
+    "                SpikeTrain 1\n",
+    "                SpikeTrain 2\n",
+    "        Segment 1\n",
+    "            .analogsignals\n",
+    "                AnalogSignal 0\n",
+    "                AnalogSignal 1\n",
+    "            .spiketrains\n",
+    "                SpikeTrain 0\n",
+    "                SpikeTrain 1\n",
+    "                SpikeTrain 2\n",
+    "    .groups\n",
+    "        Group 0\n",
+    "            .analogsignals\n",
+    "                ...\n",
+    "            .spiketrains\n",
+    "                ...\n",
+    "            .events\n",
+    "                ...\n",
+    "            .epochs\n",
+    "            ...\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1130f965",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Neo Class Overview\n",
+    "![neo_uml](./neo_material/simple_generated_diagram_with_channelview.svg)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d46c3064",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "# Automatic generation of Neo objects\n",
+    "<img src=\"./neo_material/IODiagram.svg\" alt=\"IODiagram\" style=\"width: 600px;\"/>"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9afd13ea",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Loading a recording session\n",
+    "- generation of a complete neo structure requires only **2 lines of code** and the name of the original recording system."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "27a022ab",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Block with 1 segments, 1 groups\n",
+       "annotations: {'openephys_version': '0.4'}\n",
+       "file_origin: './neo_material/example_data/OpenEphys_SampleData_1'\n",
+       "# segments (N=1)\n",
+       "0: Segment with 1 analogsignals, 1 events, 1 spiketrains\n",
+       "   annotations: {'openephys_version': '0.4',\n",
+       "     'date_created': \"'3-Oct-2018 131650'\",\n",
+       "     'openephys_segment_index': 1}\n",
+       "   # analogsignals (N=1)\n",
+       "   0: AnalogSignal with 2 channels of length 423936; units V; datatype float32 \n",
+       "      name: 'Signals CH'\n",
+       "      annotations: {'stream_id': 'CH'}\n",
+       "      sampling rate: 40000.0 Hz\n",
+       "      time: 1.2992 s to 11.8976 s"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "recording_folder = './neo_material/example_data/OpenEphys_SampleData_1'\n",
+    "io = neo.io.OpenEphysIO(recording_folder)\n",
+    "block = io.read_block()\n",
+    "block"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "82d2f42a",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Accessing data objects\n",
+    "- child objects can be accessed the corresponding attribute based on the class name (plural!). E.g. `.segments`, `.analogsignals`, `.spiketrains`\n",
+    "- child objects are stored in *lists*"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "da4d5648",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "AnalogSignal with 2 channels of length 423936; units V; datatype float32 \n",
+       "name: 'Signals CH'\n",
+       "annotations: {'stream_id': 'CH'}\n",
+       "sampling rate: 40000.0 Hz\n",
+       "time: 1.2992 s to 11.8976 s"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# accessing the list of Segments\n",
+    "block.segments\n",
+    "# accessing the first AnalogSignal of a single Segment\n",
+    "segment = block.segments[0]\n",
+    "segment.analogsignals[0]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d8faf977",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "Inspecting a spiketrain object"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "18359d77",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "SpikeTrain name: 'STp106.0n0#0' annotations: {'id': 'STp106.0n0#0'}"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "spiketrain = segment.spiketrains[0]\n",
+    "spiketrain"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "3eed0a74",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Number of spikes: 454\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "array([1.30545 , 1.403875, 1.415325, 1.422425, 1.428775, 1.45465 ,\n",
+       "       1.4658  , 1.5147  , 1.51905 , 1.521725, 1.546   , 1.563975,\n",
+       "       1.566525, 1.568325, 1.573275, 1.58005 , 1.588125, 1.59505 ,\n",
+       "       1.599125, 1.654425]) * s"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "print(f'Number of spikes: {len(spiketrain)}')\n",
+    "spiketrain.times[:20]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b338dc98",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Dealing with large datasets\n",
+    "How to load only required data\n",
+    "\n",
+    "- some IOs are based on `RawIO` concept for efficient reading of data\n",
+    "- `RawIO`s require additional symmetries in the dataset for efficient loading\n",
+    "- *lazy* data objects (ProxyObjects) can be loaded using `io.read_block(`**`lazy=True`**`)`\n",
+    "- ProxyObjects provide a `.load(t_start, t_stop)` method that loads requested data in memory and returns complete neo data object."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "e516de90",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "AnalogSignalProxy name: 'Signals CH' annotations: {'stream_id': 'CH'}"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "recording_folder = './neo_material/example_data/OpenEphys_SampleData_1'\n",
+    "io = neo.io.OpenEphysIO(recording_folder)\n",
+    "block = io.read_block(lazy=True)\n",
+    "lazy_anasig = block.segments[0].analogsignals[0]\n",
+    "lazy_anasig"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9a6a885a",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "#### Loading data from a Proxy object\n",
+    "- ProxyObjects contain metadata and shape information\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "f50bc7a3",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "signal shape: (423936, 2)\n",
+      "signal sampling rate: 40000.0 Hz\n",
+      "signal annotations: {'stream_id': 'CH'}\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(f'signal shape: {lazy_anasig.shape}')\n",
+    "print(f'signal sampling rate: {lazy_anasig.sampling_rate}')\n",
+    "print(f'signal annotations: {lazy_anasig.annotations}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e4ef7c39",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- data of a specific channel and time range can be loaded selectively into a new neo object"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "id": "2aa4d7e9",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "anasig = lazy_anasig.load(time_slice=(5*pq.s,6*pq.s), channel_indexes=[0])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "7a4dca6d",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "signal shape: (40000, 1)\n",
+      "signal sampling rate: 40000.0 Hz\n",
+      "signal annotations: [5.       5.000025 5.00005  ... 5.999925 5.99995  5.999975] s\n",
+      "signal values: [[13.45]\n",
+      " [13.1 ]\n",
+      " [10.8 ]\n",
+      " ...\n",
+      " [12.3 ]\n",
+      " [13.05]\n",
+      " [14.15]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(f'signal shape: {anasig.shape}')\n",
+    "print(f'signal sampling rate: {anasig.sampling_rate}')\n",
+    "print(f'signal annotations: {anasig.times}')\n",
+    "print(f'signal values: {anasig.magnitude}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1f2d38e9",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### How to save data?"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "32c21898",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- selected open formats are supported for writing\n",
+    " - **NIX**<sup>1</sup>\n",
+    " - NWB<sup>1</sup>\n",
+    " - Matlab<sup>2</sup>\n",
+    " - Ascii<sup>2</sup>\n",
+    " - Numpy Pickle<sup>3</sup>\n",
+    " \n",
+    "1. Support of neo-compatible files\n",
+    "2. Does not capture complete set of metadata\n",
+    "3. Strong dependency on Numpy and Neo version"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "id": "18593599",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "filename = 'my_first_neo_dataset.nix'\n",
+    "with neo.io.NixIO(filename, 'ow') as io:\n",
+    "    io.write_block(block)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ffaaba4d",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Why two NixIOs in Neo?\n",
+    "**`neo.io.NixIO`**\n",
+    "- non-RawIO implementation\n",
+    "- can read and write arbitrary Neo object structures\n",
+    "\n",
+    "`neo.io.NixIOFr`\n",
+    "- RawIO implementation\n",
+    "- can very efficiently read specific Neo-Nix files that contain symmetric objects"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6f7915d3",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "# Time for ...\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "78a0901c",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- Questions"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3283b41c",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- Break\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a66e0e79",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- Interactive exploration of neo structures!"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d9e8db03",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "<table><tr>\n",
+    "<td> <img src=\"./neo_material/simple_generated_diagram_with_channelview.svg\" width=\"500\"/> </td>\n",
+    "<td> <img src=\"./neo_material/base_schematic.svg\" width=\"500\"/> </td>\n",
+    "</tr></table>"
+   ]
+  }
+ ],
+ "metadata": {
+  "celltoolbar": "Slideshow",
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.6"
+  },
+  "livereveal": {
+   "autolaunch": true,
+   "scroll": true
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

File diff suppressed because it is too large
+ 15021 - 0
tutorial_1.slides.html


+ 672 - 0
tutorial_2.ipynb

@@ -0,0 +1,672 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "9ad12793",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "# Getting Real - Investigating a published ephys dataset"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "94d4f389",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## The Reach-2-Grasp experiment\n",
+    "\n",
+    "![R2G_overview](reach_to_grasp_material/R2G_task_overview.png)\n",
+    "\n",
+    "Full data manuscript and dataset\n",
+    "- Brochier, T., Zehl, L., Hao, Y., Duret, M., Sprenger, J., Denker, M., Grün, S. & Riehle, A. (2018). Massively parallel recordings in macaque motor cortex during an instructed delayed reach-to-grasp task, Scientific Data, 5, 180055. http://doi.org/10.1038/sdata.2018.55\n",
+    "- https://gin.g-node.org/INT/multielectrode_grasp"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c7319580",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Neuronal data sources\n",
+    "<img src=\"reach_to_grasp_material/R2G_arrays.jpg\" width=\"500\"/>\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4fd00c42",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Data and metadata sources\n",
+    "<img src=\"reach_to_grasp_material/R2G_files.png\" width=\"700\"/>\n",
+    "\n",
+    "**GOOD NEWS!** A compiled version of a part of this dataset including metadata is available as NIX file [here](https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_637sec.nix)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "86089bd9",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Fetching the data file"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "33d1fceb",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "On Linux you can download the compiled nix file via the command below. On other systems, please download the file manually from [here](https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix) and save it in the same folder as this notebook."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "10d61396",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "--2021-08-30 14:37:26--  https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix\n",
+      "Resolving gin.g-node.org (gin.g-node.org)... 141.84.41.219\n",
+      "Connecting to gin.g-node.org (gin.g-node.org)|141.84.41.219|:443... connected.\n",
+      "HTTP request sent, awaiting response... 200 OK\n",
+      "Length: 47349440 (45M) [application/octet-stream]\n",
+      "Saving to: 'i140703-001.nix’\n",
+      "\n",
+      "i140703-001.nix     100%[===================>]  45,16M  3,41MB/s    in 16s     \n",
+      "\n",
+      "2021-08-30 14:37:42 (2,84 MB/s) - 'i140703-001.nix’ saved [47349440/47349440]\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "!wget -O i140703-001.nix https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "72309fcf",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Dataset overview - General\n",
+    "We can directly get an overview of the contained objects from the `neo.Block` print"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "a76ae878",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Block with 1 segments\n",
+       "name: 'Reach2Grasp data'\n",
+       "annotations: {'nix_name': 'neo.block.6aa7b5491ab74067aee4183310955892'}\n",
+       "rec_datetime: datetime.datetime(2021, 8, 25, 21, 3, 51)\n",
+       "# segments (N=1)\n",
+       "0: Segment with 1 analogsignals, 1 events, 271 spiketrains\n",
+       "   name: 'Segment 0'\n",
+       "   description: 'Segment containing data from t_start to t_stop'\n",
+       "   annotations: {'nix_name': 'neo.segment.1c1ad7987ca048efa7b433b4e87e0f71',\n",
+       "     'condition': 1}\n",
+       "   # analogsignals (N=1)\n",
+       "   0: AnalogSignal with 96 channels of length 74455; units uV; datatype float32 \n",
+       "      name: 'Channel bundle (chan1,chan2,chan3,chan4,chan5,chan6,chan7,chan8,chan9,chan10,chan11,chan12,chan13,chan14,chan15,chan16,chan17,chan18,chan19,chan20,chan21,chan22,chan23,chan24,chan25,chan26,chan27,chan28,chan29,chan30,chan31,chan32,chan33,chan34,chan35,chan36,chan37,chan38,chan39,chan40,chan41,chan42,chan43,chan44,chan45,chan46,chan47,chan48,chan49,chan50,chan51,chan52,chan53,chan54,chan55,chan56,chan57,chan58,chan59,chan60,chan61,chan62,chan63,chan64,chan65,chan66,chan67,chan68,chan69,chan70,chan71,chan72,chan73,chan74,chan75,chan76,chan77,chan78,chan79,chan80,chan81,chan82,chan83,chan84,chan85,chan86,chan87,chan88,chan89,chan90,chan91,chan92,chan93,chan94,chan95,chan96) '\n",
+       "      annotations: {'nix_name': 'neo.analogsignal.18037944fdf2472d9c49cff8ea26e4ff',\n",
+       "        'neural_signal': True,\n",
+       "        'filter_shift_correction': array(2.1) * ms}\n",
+       "      sampling rate: 1000.0 Hz\n",
+       "      time: -0.00010000000000000026 s to 74.4549 s"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "import neo\n",
+    "filename = 'i140703-001.nix'\n",
+    "with neo.io.NixIO(filename, 'ro') as io:\n",
+    "    block = io.read_block()\n",
+    "block"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a6213f01",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "This summary already tells us that we only need to take care of a single segment with one event, one analogsignal and multiple spiketrain objects. The 96 continuously sampled channels are sampled a 'low' sampling rate of 1kHz and contain neural data, so data comparable to local-field potential measurements."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c15de13b",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Dataset overview - SpikeTrains\n",
+    "To learn more about the spiketrains, we print the spiketrain annotations:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "02a207fc",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'nix_name': 'neo.spiketrain.22a41c20c0614a238d32dea2d46673ca',\n",
+       " 'id': 'Unit 1000',\n",
+       " 'channel_id': 1,\n",
+       " 'unit_id': 0,\n",
+       " 'unit_tag': 'unclassified',\n",
+       " 'electrode_reject_HFC': False,\n",
+       " 'electrode_reject_LFC': False,\n",
+       " 'electrode_reject_IFC': False,\n",
+       " 'connector_aligned_id': 93,\n",
+       " 'coordinate_x': array(0.8) * mm,\n",
+       " 'coordinate_y': array(3.6) * mm,\n",
+       " 'sua': False,\n",
+       " 'mua': False,\n",
+       " 'noise': True}"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "segment = block.segments[0]\n",
+    "segment.spiketrains[0].annotations"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f3fb14fe",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "\n",
+    "## Dataset overview - AnalogSignals\n",
+    "To learn more about the channels of the analogsignal, we print the array_annotations of the single analogsignal object:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "d5e4a903",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "dict_keys(['channel_names', 'channel_ids', 'file_origin', 'connector_ID', 'connector_pinID', 'nev_dig_factor', 'nb_sorted_units', 'nev_hi_freq_order', 'nev_hi_freq_type', 'nev_lo_freq_order', 'nev_lo_freq_type', 'nsx_hi_freq_order', 'nsx_lo_freq_order', 'nsx_hi_freq_type', 'nsx_lo_freq_type', 'description', 'nsx', 'hi_pass_freq', 'lo_pass_freq', 'hi_pass_order', 'lo_pass_order', 'filter_type', 'electrode_reject_HFC', 'electrode_reject_LFC', 'electrode_reject_IFC', 'connector_aligned_ids', 'coordinates_x', 'coordinates_y'])"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "segment.analogsignals[0].array_annotations.keys()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5111b21f",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "We see that both, spiketrains as well as channels are annotated with a 'connector_aligned_id', indicating the spatial source of the signal. In addition the coordinates in x and y direction are provided in physical units for each channel and spiketrain. Spiketrains also carry information about 'noise', 'mua' or 'sua' assignment, indicating that the spikes were spikesorted and assigned to one of the three unit categories:\n",
+    "- *noise*: non-neural threshold crossing events)\n",
+    "- *mua*: multi-unit-activity - neural threshold crossing events that can not be uniquely assigned to a virtual neuron unit\n",
+    "- *sua*: single-unit-activity - neural threshold crossing events that are assigned to a single virtual neuron unit"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "59207d6c",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Dataset overview - Events\n",
+    "To learn more about the events, we print the labels and annotations of the single event object:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "765fde73",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Event object name: TrialEvents\n",
+      "Number of event times: 192\n",
+      "Unique event labels: ['CUE-OFF' 'CUE-ON' 'DO' 'FSRplat-OFF' 'FSRplat-ON' 'GO-ON' 'HEplat-OFF'\n",
+      " 'HEplat-ON' 'OBB' 'OR' 'OT' 'RW-OFF' 'RW-ON' 'RW-ON-REP' 'SR' 'SR-REP'\n",
+      " 'STOP' 'TS-ON' 'WS-ON']\n",
+      "Event annotation keys: dict_keys(['trial_id', 'trial_timestamp_id', 'performance_in_trial', 'performance_in_trial_str', 'belongs_to_trialtype', 'trial_event_labels', 'trial_reject_HFC', 'trial_reject_LFC', 'trial_reject_IFC'])\n",
+      "Unique trial_ids: [ 1  2  3  4  5  6  7  8  9 10 11 12 13]\n",
+      "Number of reward-on events: 11\n"
+     ]
+    }
+   ],
+   "source": [
+    "import numpy as np\n",
+    "event = segment.events[0]\n",
+    "print(f'Event object name: {event.name}')\n",
+    "print(f'Number of event times: {len(event)}')\n",
+    "print(f'Unique event labels: {np.unique(event.labels)}')\n",
+    "print(f'Event annotation keys: {event.array_annotations.keys()}')\n",
+    "print(f'Unique trial_ids: {np.unique(event.array_annotations[\"trial_id\"])}')\n",
+    "print(f'Number of reward-on events: {sum(event.labels==\"RW-ON\")}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "58e0705c",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "# Working with a dataset - Neo methods and utility functions"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "07d3277a",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "In the following lines we are going to introduce a set of useful features of neo objects while cutting the dataset into individual trial segments. Based on the trial events and their annotations we can identify successful (correct) trials and select the time around the start of the trial."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "876b5fc5",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Filtering for event objects"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "27ce9e97",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "events = block.filter(objects='Event', name='TrialEvents')[0]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "76e95b3c",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Masking Neo objects\n",
+    "\n",
+    "First we are selecting event times that are occurring during successful trials, marked by the `performance_in_trial_str` as `correct_trial`. In addition we also only want to select trial start (`TS-ON`) events. Based on the array annotations we are creating two masks and apply both to the original event to generate a new event object via slicing."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "fe323fd4",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "11\n"
+     ]
+    }
+   ],
+   "source": [
+    "mask1 = event.array_annotations['performance_in_trial_str'] == 'correct_trial'\n",
+    "mask2 = event.array_annotations['trial_event_labels'] == 'TS-ON'\n",
+    "correct_TS_event = event[mask1 & mask2]\n",
+    "print(len(correct_TS_event))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "6096013b",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "start_event = correct_TS_event"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d5747d87",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Utility function: Epoch creation\n",
+    "In the next step we are making use of neo utility functions to generate epochs around the time points extracted.\n",
+    "\n",
+    "Construct analysis epochs from 10ms before the TS-ON of a successful behavioral trial to 15ms after TS-ON. The name \"analysis_epochs\" is given to the resulting Neo Epoch object. The object is not attached to the Neo Segment. The parameter event2 of add_epoch() is left empty, since we are cutting around a single event, as opposed to cutting between two events."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "192dd147",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "from neo.utils import add_epoch\n",
+    "import quantities as pq"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "daabfccf",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "pre = -10 * pq.ms\n",
+    "post = 15 * pq.ms\n",
+    "epoch = add_epoch(\n",
+    "    segment,\n",
+    "    event1=start_event, event2=None,\n",
+    "    pre=pre, post=post,\n",
+    "    attach_result=False,\n",
+    "    name='analysis_epochs')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "84ae63ef",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "The number of epochs generated is the same as the number of trial start events and all epochs have the same duration as we extract 25ms of data around each trial start event."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "adf48780",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Number of epochs: 11\n",
+      "Durations of epochs: [0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025] s\n"
+     ]
+    }
+   ],
+   "source": [
+    "print('Number of epochs: {}'.format(len(epoch)))\n",
+    "print('Durations of epochs: {}'.format(epoch.durations))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ec0a7841",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Utility function: cutting segment by epochs\n",
+    "Now we use the previously defined epochs to cut the segment containing the complete dataset into subsets, where each new segment corresponds to the starting epoch of a successful trial. For capturing the newly generated segments, we create a new Neo block.\n",
+    "\n",
+    "Create new segments of data cut according to the analysis epochs of the 'analysis_epochs' Neo Epoch object. The time axes of all segments are aligned such that each segment starts at time 0 (parameter reset_times); annotations describing the analysis epoch are carried over to the segments. A new Neo Block named \"data_cut_to_analysis_epochs\" is created to capture all cut analysis epochs.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "id": "42d33b10",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "from neo.utils import cut_segment_by_epoch\n",
+    "\n",
+    "cut_trial_block = neo.Block(name=\"data_cut_to_analysis_epochs\")\n",
+    "cut_trial_block.segments = cut_segment_by_epoch(segment, epoch, reset_time=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "f58bca34",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "11"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(cut_trial_block.segments)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "02812eaa",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "We can confirm that the resetting of the times during the segmentation process was successfull by checking the new times of the trial start events in the new segments:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "id": "8c34c004",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "In the new trial TS is happening at [array(0.01) * s, array(0.01) * s, array(0.01) * s, array(0.01) * s, array(0.01) * s, array(0.01) * s, array(0.01) * s, array(0.01) * s, array(0.01) * s, array(0.01) * s, array(0.01) * s]\n"
+     ]
+    }
+   ],
+   "source": [
+    "print('In the new trial TS is happening at {}'.format([s.events[-1][0] for s in cut_trial_block.segments]))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9481033e",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### More interesting features\n",
+    "- *`DataObject`*`.time_slice()` - create a new object containing data in a subset of the original time span\n",
+    "- *`Object`*`.annotate()` - adding a custom annotation\n",
+    "- *`DataObject`*`.array_annotate()` - adding a custom array annotation (channel / spike based annotation)\n",
+    "- *`DataObject`*`.merge()` - merge data values of two DataObjects\n",
+    "- *`DataObject`*`.concatenate()` - concatenate data values of two DataObjects\n",
+    "- `AnalogSignal.downsample()` - create an AnalogSignal with a lower sampling rate\n",
+    "- *`Object`*`.parents`, e.g. `AnalogSignal.segment` - to navigate in neo object structure\n",
+    "- *`Quantity`*`.rescale()` - rescale the data to a new physical unit\n",
+    "- *`Quantity`*`.dimensionality.latex` - get latex representation of physical unit (for plotting)"
+   ]
+  }
+ ],
+ "metadata": {
+  "celltoolbar": "Slideshow",
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.6"
+  },
+  "livereveal": {
+   "autolaunch": true,
+   "scroll": true
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

File diff suppressed because it is too large
+ 14768 - 0
tutorial_2.slides.html


File diff suppressed because it is too large
+ 1291 - 0
tutorial_3.ipynb


File diff suppressed because it is too large
+ 15315 - 0
tutorial_3.slides.html