From 5e3ea094846ea7a17dd0b4815f10c975c3c6dded Mon Sep 17 00:00:00 2001 From: oreHGA Date: Thu, 7 Mar 2024 20:21:28 +0000 Subject: [PATCH] deploy: 1257c3aa10184f216fa69d8c60addeb5f7f2e31e --- .buildinfo | 2 +- .../auto_examples_python.zip | Bin 75037 -> 76033 bytes .../04r__cueing_group_analysis_winter2019.py | 6 +- .../02r__cueing_group_analysis.ipynb | 15 +- .../visual_p300_python.zip | Bin 10209 -> 10490 bytes .../00x__n170_run_experiment.ipynb | 35 +- .../visual_cueing_jupyter.zip | Bin 50544 -> 49974 bytes .../00x__ssvep_run_experiment.py | 7 +- .../01r__ssvep_viz.ipynb | 21 +- .../visual_n170_python.zip | Bin 10218 -> 10404 bytes ...4r__cueing_group_analysis_winter2019.ipynb | 17 +- .../visual_gonogo_jupyter.zip | Bin 22 -> 0 bytes .../visual_cueing_python.zip | Bin 40913 -> 41151 bytes .../00x__n170_run_experiment.py | 36 +- .../auto_examples_jupyter.zip | Bin 98670 -> 96908 bytes .../02r__n170_decoding.ipynb | 13 +- .../01r__ssvep_viz.py | 15 +- .../01r__n170_viz.ipynb | 17 +- .../02r__ssvep_decoding.ipynb | 13 +- .../visual_ssvep_jupyter.zip | Bin 18209 -> 17902 bytes .../visual_n170_jupyter.zip | Bin 14897 -> 14327 bytes .../01r__p300_viz.ipynb | 19 +- .../00x__p300_run_experiment.ipynb | 19 +- .../00x__p300_run_experiment.py | 10 +- .../01r__cueing_singlesub_analysis.ipynb | 25 +- .../01r__cueing_singlesub_analysis.py | 30 +- .../00x__ssvep_run_experiment.ipynb | 17 +- .../02r__cueing_group_analysis.py | 4 +- .../visual_ssvep_python.zip | Bin 13429 -> 13720 bytes .../visual_p300_jupyter.zip | Bin 14752 -> 14437 bytes .../02r__p300_decoding.ipynb | 13 +- .../01r__n170_viz.py | 19 +- .../01r__p300_viz.py | 23 +- ...cueing_behaviour_analysis_winter2019.ipynb | 13 +- ...glr_01r__cueing_singlesub_analysis_001.png | Bin 218166 -> 218093 bytes ...glr_01r__cueing_singlesub_analysis_002.png | Bin 86480 -> 91894 bytes ...glr_01r__cueing_singlesub_analysis_003.png | Bin 70253 -> 74264 bytes ...glr_01r__cueing_singlesub_analysis_004.png | Bin 265617 -> 47490 bytes ...glr_01r__cueing_singlesub_analysis_005.png | Bin 61577 -> 63199 bytes ...glr_01r__cueing_singlesub_analysis_006.png | Bin 63636 -> 66574 bytes ...glr_01r__cueing_singlesub_analysis_007.png | Bin 65377 -> 65342 bytes ...glr_01r__cueing_singlesub_analysis_008.png | Bin 61101 -> 63851 bytes ...glr_01r__cueing_singlesub_analysis_009.png | Bin 104489 -> 104489 bytes ...glr_01r__cueing_singlesub_analysis_010.png | Bin 96010 -> 96010 bytes ...glr_01r__cueing_singlesub_analysis_011.png | Bin 108040 -> 108040 bytes ...glr_01r__cueing_singlesub_analysis_012.png | Bin 182633 -> 49043 bytes ...r_01r__cueing_singlesub_analysis_thumb.png | Bin 73469 -> 73521 bytes _images/sphx_glr_01r__n170_viz_001.png | Bin 64131 -> 82794 bytes _images/sphx_glr_01r__n170_viz_002.png | Bin 53804 -> 67318 bytes _images/sphx_glr_01r__n170_viz_003.png | Bin 184338 -> 240179 bytes _images/sphx_glr_01r__n170_viz_thumb.png | Bin 51306 -> 56072 bytes _images/sphx_glr_01r__p300_viz_001.png | Bin 67791 -> 72403 bytes _images/sphx_glr_01r__p300_viz_002.png | Bin 59167 -> 63070 bytes _images/sphx_glr_01r__p300_viz_003.png | Bin 157751 -> 341164 bytes _images/sphx_glr_01r__p300_viz_thumb.png | Bin 38175 -> 73749 bytes _images/sphx_glr_01r__ssvep_viz_001.png | Bin 77760 -> 96844 bytes _images/sphx_glr_01r__ssvep_viz_002.png | Bin 69347 -> 69347 bytes _images/sphx_glr_01r__ssvep_viz_003.png | Bin 55023 -> 58342 bytes _images/sphx_glr_01r__ssvep_viz_004.png | Bin 53069 -> 54510 bytes _images/sphx_glr_01r__ssvep_viz_005.png | Bin 0 -> 2396 bytes _images/sphx_glr_01r__ssvep_viz_thumb.png | Bin 59774 -> 64640 bytes ...phx_glr_02r__cueing_group_analysis_001.png | Bin 83715 -> 83715 bytes ...phx_glr_02r__cueing_group_analysis_002.png | Bin 97885 -> 97885 bytes ...phx_glr_02r__cueing_group_analysis_003.png | Bin 106889 -> 106889 bytes ...phx_glr_02r__cueing_group_analysis_004.png | Bin 73774 -> 73774 bytes ...phx_glr_02r__cueing_group_analysis_005.png | Bin 76150 -> 76150 bytes ...phx_glr_02r__cueing_group_analysis_006.png | Bin 86862 -> 86862 bytes ...phx_glr_02r__cueing_group_analysis_007.png | Bin 73555 -> 73555 bytes ...phx_glr_02r__cueing_group_analysis_008.png | Bin 77582 -> 77582 bytes ...phx_glr_02r__cueing_group_analysis_009.png | Bin 105434 -> 105434 bytes ...phx_glr_02r__cueing_group_analysis_010.png | Bin 63973 -> 63973 bytes ...phx_glr_02r__cueing_group_analysis_011.png | Bin 60031 -> 60031 bytes ...phx_glr_02r__cueing_group_analysis_012.png | Bin 89031 -> 89031 bytes ...phx_glr_02r__cueing_group_analysis_013.png | Bin 82180 -> 82180 bytes ...phx_glr_02r__cueing_group_analysis_014.png | Bin 90524 -> 90524 bytes ...phx_glr_02r__cueing_group_analysis_015.png | Bin 104598 -> 104598 bytes ...phx_glr_02r__cueing_group_analysis_016.png | Bin 27037 -> 27037 bytes ...phx_glr_02r__cueing_group_analysis_017.png | Bin 27129 -> 27129 bytes ...phx_glr_02r__cueing_group_analysis_018.png | Bin 27956 -> 27956 bytes ...phx_glr_02r__cueing_group_analysis_019.png | Bin 27037 -> 27037 bytes ...phx_glr_02r__cueing_group_analysis_020.png | Bin 27248 -> 27248 bytes ...phx_glr_02r__cueing_group_analysis_021.png | Bin 27956 -> 27956 bytes ...phx_glr_02r__cueing_group_analysis_022.png | Bin 103408 -> 103408 bytes ...phx_glr_02r__cueing_group_analysis_023.png | Bin 110531 -> 110531 bytes ...phx_glr_02r__cueing_group_analysis_024.png | Bin 114478 -> 114478 bytes ...phx_glr_02r__cueing_group_analysis_025.png | Bin 86848 -> 86848 bytes ...phx_glr_02r__cueing_group_analysis_026.png | Bin 87000 -> 87000 bytes ...phx_glr_02r__cueing_group_analysis_027.png | Bin 113188 -> 113188 bytes ...phx_glr_02r__cueing_group_analysis_028.png | Bin 54728 -> 54728 bytes ...phx_glr_02r__cueing_group_analysis_029.png | Bin 54710 -> 54710 bytes ...phx_glr_02r__cueing_group_analysis_030.png | Bin 63758 -> 63758 bytes ...phx_glr_02r__cueing_group_analysis_031.png | Bin 27037 -> 27037 bytes ...phx_glr_02r__cueing_group_analysis_032.png | Bin 26982 -> 26982 bytes ...phx_glr_02r__cueing_group_analysis_033.png | Bin 27956 -> 27956 bytes ...phx_glr_02r__cueing_group_analysis_034.png | Bin 71727 -> 71727 bytes ...phx_glr_02r__cueing_group_analysis_035.png | Bin 70145 -> 70145 bytes ...phx_glr_02r__cueing_group_analysis_036.png | Bin 86653 -> 86653 bytes ...phx_glr_02r__cueing_group_analysis_037.png | Bin 94628 -> 94628 bytes ...phx_glr_02r__cueing_group_analysis_038.png | Bin 85100 -> 85100 bytes ...phx_glr_02r__cueing_group_analysis_039.png | Bin 99433 -> 99433 bytes ...phx_glr_02r__cueing_group_analysis_040.png | Bin 75756 -> 75756 bytes ...phx_glr_02r__cueing_group_analysis_041.png | Bin 75503 -> 75503 bytes ...phx_glr_02r__cueing_group_analysis_042.png | Bin 104582 -> 104582 bytes ...phx_glr_02r__cueing_group_analysis_043.png | Bin 81029 -> 81029 bytes ...phx_glr_02r__cueing_group_analysis_044.png | Bin 75530 -> 75530 bytes ...phx_glr_02r__cueing_group_analysis_045.png | Bin 130392 -> 130392 bytes ...phx_glr_02r__cueing_group_analysis_046.png | Bin 109775 -> 109775 bytes ...phx_glr_02r__cueing_group_analysis_047.png | Bin 118952 -> 118952 bytes ...phx_glr_02r__cueing_group_analysis_048.png | Bin 113093 -> 113093 bytes ...phx_glr_02r__cueing_group_analysis_049.png | Bin 74953 -> 74953 bytes ...phx_glr_02r__cueing_group_analysis_050.png | Bin 79321 -> 79321 bytes ...phx_glr_02r__cueing_group_analysis_051.png | Bin 94572 -> 94572 bytes ...phx_glr_02r__cueing_group_analysis_052.png | Bin 71870 -> 71870 bytes ...phx_glr_02r__cueing_group_analysis_053.png | Bin 65411 -> 65411 bytes ...phx_glr_02r__cueing_group_analysis_054.png | Bin 92375 -> 92375 bytes ...phx_glr_02r__cueing_group_analysis_055.png | Bin 75035 -> 75035 bytes ...phx_glr_02r__cueing_group_analysis_056.png | Bin 74915 -> 74915 bytes ...phx_glr_02r__cueing_group_analysis_057.png | Bin 108165 -> 108165 bytes ...phx_glr_02r__cueing_group_analysis_058.png | Bin 93516 -> 93516 bytes ...phx_glr_02r__cueing_group_analysis_059.png | Bin 88699 -> 88699 bytes ...phx_glr_02r__cueing_group_analysis_060.png | Bin 103195 -> 103195 bytes ...phx_glr_02r__cueing_group_analysis_061.png | Bin 83323 -> 83323 bytes ...phx_glr_02r__cueing_group_analysis_062.png | Bin 90609 -> 90609 bytes ...phx_glr_02r__cueing_group_analysis_063.png | Bin 86635 -> 86635 bytes ...phx_glr_02r__cueing_group_analysis_064.png | Bin 94150 -> 94150 bytes ...phx_glr_02r__cueing_group_analysis_065.png | Bin 98012 -> 98012 bytes ...phx_glr_02r__cueing_group_analysis_066.png | Bin 89817 -> 89817 bytes ...phx_glr_02r__cueing_group_analysis_067.png | Bin 74403 -> 74403 bytes ...phx_glr_02r__cueing_group_analysis_068.png | Bin 64729 -> 64729 bytes ...phx_glr_02r__cueing_group_analysis_069.png | Bin 78609 -> 78609 bytes ...phx_glr_02r__cueing_group_analysis_070.png | Bin 91531 -> 91531 bytes ...phx_glr_02r__cueing_group_analysis_071.png | Bin 94207 -> 94207 bytes ...phx_glr_02r__cueing_group_analysis_072.png | Bin 106461 -> 106461 bytes ...phx_glr_02r__cueing_group_analysis_073.png | Bin 96298 -> 96298 bytes ...phx_glr_02r__cueing_group_analysis_074.png | Bin 88714 -> 88714 bytes ...phx_glr_02r__cueing_group_analysis_075.png | Bin 105043 -> 105043 bytes ...phx_glr_02r__cueing_group_analysis_076.png | Bin 27037 -> 27037 bytes ...phx_glr_02r__cueing_group_analysis_077.png | Bin 27240 -> 27240 bytes ...phx_glr_02r__cueing_group_analysis_078.png | Bin 27956 -> 27956 bytes ...phx_glr_02r__cueing_group_analysis_079.png | Bin 81853 -> 81853 bytes ...phx_glr_02r__cueing_group_analysis_080.png | Bin 82107 -> 82107 bytes ...phx_glr_02r__cueing_group_analysis_081.png | Bin 105383 -> 105383 bytes ...phx_glr_02r__cueing_group_analysis_082.png | Bin 69973 -> 69973 bytes ...phx_glr_02r__cueing_group_analysis_083.png | Bin 68181 -> 68181 bytes ...phx_glr_02r__cueing_group_analysis_084.png | Bin 90415 -> 90415 bytes ...phx_glr_02r__cueing_group_analysis_085.png | Bin 99637 -> 99637 bytes ...phx_glr_02r__cueing_group_analysis_086.png | Bin 93168 -> 93168 bytes ...phx_glr_02r__cueing_group_analysis_087.png | Bin 98525 -> 98525 bytes ...phx_glr_02r__cueing_group_analysis_088.png | Bin 25135 -> 25135 bytes ...phx_glr_02r__cueing_group_analysis_089.png | Bin 18417 -> 18417 bytes ...phx_glr_02r__cueing_group_analysis_090.png | Bin 73545 -> 73545 bytes ...phx_glr_02r__cueing_group_analysis_091.png | Bin 69116 -> 69116 bytes ...phx_glr_02r__cueing_group_analysis_092.png | Bin 92974 -> 92974 bytes _images/sphx_glr_02r__n170_decoding_001.png | Bin 15219 -> 15128 bytes _images/sphx_glr_02r__n170_decoding_thumb.png | Bin 10204 -> 10362 bytes _images/sphx_glr_02r__p300_decoding_001.png | Bin 17017 -> 16995 bytes _images/sphx_glr_02r__p300_decoding_thumb.png | Bin 11714 -> 11885 bytes _images/sphx_glr_02r__ssvep_decoding_001.png | Bin 11869 -> 11814 bytes .../sphx_glr_02r__ssvep_decoding_thumb.png | Bin 7939 -> 7993 bytes ...eing_behaviour_analysis_winter2019_001.png | Bin 25359 -> 25359 bytes ...__cueing_group_analysis_winter2019_001.png | Bin 26936 -> 26936 bytes ...__cueing_group_analysis_winter2019_002.png | Bin 17672 -> 17672 bytes ...__cueing_group_analysis_winter2019_003.png | Bin 58140 -> 58140 bytes ...__cueing_group_analysis_winter2019_004.png | Bin 59209 -> 59209 bytes ...__cueing_group_analysis_winter2019_005.png | Bin 89100 -> 89100 bytes .../_sphinx_javascript_frameworks_compat.js | 123 + _static/basic.css | 73 +- _static/copybutton.css | 3 +- _static/copybutton.js | 44 +- _static/copybutton_funcs.js | 17 +- _static/css/badge_only.css | 2 +- _static/css/theme.css | 4 +- _static/doctools.js | 420 +- _static/jquery-3.5.1.js | 10872 ---------------- _static/jquery.js | 4 +- _static/jupyterlite_badge_logo.svg | 3 + _static/language_data.js | 102 +- _static/pygments.css | 1 + _static/searchtools.js | 823 +- _static/sg_gallery-binder.css | 5 + _static/sg_gallery-dataframe.css | 19 +- _static/sg_gallery-rendered-html.css | 37 +- _static/sg_gallery.css | 238 +- _static/sphinx_highlight.js | 144 + _static/underscore-1.13.1.js | 2042 --- _static/underscore.js | 6 - auto_examples/index.html | 200 +- auto_examples/sg_execution_times.html | 509 + .../01r__cueing_singlesub_analysis.html | 204 +- .../02r__cueing_group_analysis.html | 704 +- ..._cueing_behaviour_analysis_winter2019.html | 95 +- ...04r__cueing_group_analysis_winter2019.html | 815 +- auto_examples/visual_cueing/index.html | 109 +- .../visual_cueing/sg_execution_times.html | 105 +- auto_examples/visual_gonogo/index.html | 68 +- .../visual_gonogo/sg_execution_times.html | 509 + .../visual_n170/00x__n170_run_experiment.html | 110 +- auto_examples/visual_n170/01r__n170_viz.html | 200 +- .../visual_n170/02r__n170_decoding.html | 276 +- auto_examples/visual_n170/index.html | 98 +- .../visual_n170/sg_execution_times.html | 99 +- .../visual_p300/00x__p300_run_experiment.html | 86 +- auto_examples/visual_p300/01r__p300_viz.html | 175 +- .../visual_p300/02r__p300_decoding.html | 261 +- auto_examples/visual_p300/index.html | 98 +- .../visual_p300/sg_execution_times.html | 99 +- .../00x__ssvep_run_experiment.html | 85 +- .../visual_ssvep/01r__ssvep_viz.html | 240 +- .../visual_ssvep/02r__ssvep_decoding.html | 137 +- auto_examples/visual_ssvep/index.html | 98 +- .../visual_ssvep/sg_execution_times.html | 99 +- changelog.html | 59 +- docs_notes.html | 59 +- experiments/all_examples.html | 204 +- experiments/cueing.html | 103 +- experiments/gonogo.html | 62 +- experiments/vn170.html | 92 +- experiments/vp300.html | 92 +- experiments/vssvep.html | 92 +- genindex.html | 53 +- getting_started/analysis.html | 55 +- getting_started/available_notebooks.html | 83 +- getting_started/data_zipper.html | 59 +- getting_started/faq.html | 65 +- getting_started/installation.html | 121 +- getting_started/loading_and_saving.html | 69 +- getting_started/running_experiments.html | 71 +- getting_started/streaming.html | 79 +- index.html | 87 +- misc/about_the_docs.html | 55 +- misc/muse_info.html | 71 +- misc/ntcs_phase1_instructions.html | 109 +- misc/using_an_extra_electrode_muse.html | 61 +- objects.inv | Bin 1808 -> 1792 bytes search.html | 53 +- searchindex.js | 2 +- sg_execution_times.html | 609 + 237 files changed, 6775 insertions(+), 16540 deletions(-) delete mode 100644 _downloads/5ea8fb0b660bbd8665ebbc30a424eb42/visual_gonogo_jupyter.zip create mode 100644 _images/sphx_glr_01r__ssvep_viz_005.png create mode 100644 _static/_sphinx_javascript_frameworks_compat.js delete mode 100644 _static/jquery-3.5.1.js create mode 100644 _static/jupyterlite_badge_logo.svg create mode 100644 _static/sphinx_highlight.js delete mode 100644 _static/underscore-1.13.1.js delete mode 100644 _static/underscore.js create mode 100644 auto_examples/sg_execution_times.html create mode 100644 auto_examples/visual_gonogo/sg_execution_times.html create mode 100644 sg_execution_times.html diff --git a/.buildinfo b/.buildinfo index cce61473..3ed22fc2 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 75670e2e8c59814fc976e9ef5fbe74ea +config: 0b0845f06aa0ea4305158e51e2e10944 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip b/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip index d0c43a60a214860ea1857052dac33c56c7d46cb9..61d2c7e6bdbc480593b20d61e0e6d1b9c4d641e3 100644 GIT binary patch delta 2821 zcmbVOeQXp(6yG_HQWvPURBCByr+d}CJMOO6t8FcC5ek^17Fxh!tj)UJo4YRD?H;>( zg`!w%i2fl$bP_k1_=S~#v3$6RBpMa9egrf@{X=3zCGoQ=1fx-j5odPW-k!vm*k&#> zZ+`FXoA-O~%{+0!JMxjYtm~E;-g1WiweCyZeoy7Ioz}_t6;~Gf!;PVEq&a~1tl3~i zJ2!%9iM40VgIvka&!lemfA#4*A9D=zF=rjFx*p)~kIZI$A$>>>rP69Yu6eHwM;9Id zKI`4><>lwQrl|l1TTAPe3GgpWJ6XJy_dfgC5;t1#P`8C>}~90eRyqfA@{F{X*})> zR!8`Ca%#X)XA^QVxm6rQ#EyR&6@qz40B;UHUpxh~suo2&`OtKShx38L-Qk-puHoQZ zp6?OUa$9L_ST@gk2VuRveU8``W*9nJ81qscxWT$>%T5pe>uC7V&pCW#nT!wr zHq+vkhk^BZ?)dEdf%lKh$sgEy`Tjquywu{+5?tj~$izB!=%KQ?w~^V^zm43r!^}Kn~-D(a)N-P1YjWDfRj=vCs-ZnI>{SB>7N8l3ZRn9tn5b` zt076%5<()Ui8R3osxd|lIdWM^!Kp2l^}!TU5CI~n)5OV&#sGeDJT}vI7oQqmP(d(~ zhA1L|24x9B)pihz<9>eC^zooElyx7Me04f9QGEQzrTC9=JnV``M9V3D!ln15&(j2BE zZk>8^g%`K}QVSpkM?<8*7g;x-;XKv@&vnnLE~v>4HK)5P^1=(1HSUUZ?eoqYpMT*R zAAgf55w)poCsFV_B9i3}jAnNa7REYeO=dW*n^%obja32`e?PXX7`23=k!I9_hYs;e z$Rb7;eE~L`HX;Tsbs;SdsX2qjE?)^d$gvMUyi2~9Bq<#{V@~)$z}olS0dQqus&-*v zq5;IL-4i}fn1p|YL#~U;wKl4GD2+UoPI6cH`QIb4){at!p`)5HpZ0+o zi#>gw#v5YK(M6Nd-Z!gEQI)V^_Y;0GB(0J+@LyjY$7?>k6L)^I&HStaNch~rV%+v^ zm*~RU?U8p2ST`e+79G^o!bLFme_wz6a&neD&hu`kcgXPC3| zkG;o&PrR6|IgFQ%jvbp>3i@Yo^p?>{|CI(rML}tSR-5j>o9|k?oy3qwD20bFZpP{X z%bK|Oy2o604R{l>TTxmX5VE2sX7qSMmJELe83Sq}&f7bjd)`;b^|$V zd8s0hmL=#Y6^}Kyz#wd*(&4NuZPw$wm`?K~@yInuuQ&~DX(Vw$SydV!_gGUDc5LVS z3a-Oo(CtJZLNAeoXo!9d899x7n%L0e8?+oEDXu4Cj@6jUD(PJv+uQ!P*<;UFf;WnW zNt;0iywxrph?JD9AZV!2t|&T5%G)5)G*yFJWn%#5blPq6VFka{xBMNja6% z5P1qvQk-4EvFhh-n|xr2I}^-72$nCHdaY2xH=_0vn@FY75n#+4>%k&x#ZL#pyuxZ- zzrJTx7mmLb0x`UMqQY8z{%TLjbX7XLq%3Q7eGp}xy6n0Ic*1EQ!=%~wsh^_H6X15PC*u`sZuP5hu z^*nyGWu|8*o* Jd+PyN{SA{Bj%ok^ delta 1693 zcma)6Z%kWN6u-BWTHc_A34*lJM-fWlweZ@}5kg(!vamrWi~%1YwZrm&I@Xr9gGGju z4ClWkxSY6WvWWkf%Ur~b=V){>rXPS*M>Ir0Kpe?Fh|vw4nrLFw`&#Iq=?Cx2eYx-5 zbAIQX-#x!OG$(!IbE%@CE=ih+#PJjwZW0v3pif zZ7SV}%XWHMPR6eHA$RM^M-Nl9p^@8IuVt&G|BxW!MA&Xm3%=50P3P>pMMsZD)!y z>Iw_#O>k?UTsWnyj{{ste?gn(AP!9(r)Lfr5IP{d+!B+Mt2S@ zD}Rmt5Hh;|P$@jbeMN5Gm{uY*t(*unN?~T#At7|bmlEb+aB2r;VPq;t63(>+=;{56 zC)_TMp$j5)>tX0yHJqK!fs4~;rA)c80tQ!g*^G&>prPT%qN9=nU(T~0fXdE8z>W55kAh(Ea0qdEI_W2$cy}LIvS+#hv(avtvwO zB6zFT+FCo|*BA`+NSaRUg2l2_I zQ^cGorqj#yvg9PA&czXS+jQn~djB&z8$-M7ot=IwTW+cp*W~o=KCa7Zs<6-{w3(qj zPRCK7RoC9rqtlBym?EI2{{%HfLG}L|HQ>y_K^a_K&EzLExKf2BnMtwBM;&p^jS@^n&yvBxj6}ZhTUtfq*>20x7W`x99nqc{{^_<$kG}OhS zCTN}L-I8FR+6yBsmAtBmAScQiA$5Y~Wx)L3I9l$T(6mBReG9BUqGs7scKJ89%;B*CxKn0);MHEsse diff --git a/_downloads/18e4b69d6ddc9302425e645c1fec16c3/04r__cueing_group_analysis_winter2019.py b/_downloads/18e4b69d6ddc9302425e645c1fec16c3/04r__cueing_group_analysis_winter2019.py index 8c2fb9cc..8e0c1e93 100644 --- a/_downloads/18e4b69d6ddc9302425e645c1fec16c3/04r__cueing_group_analysis_winter2019.py +++ b/_downloads/18e4b69d6ddc9302425e645c1fec16c3/04r__cueing_group_analysis_winter2019.py @@ -22,7 +22,7 @@ from mne.time_frequency import tfr_morlet # EEG-Noteooks functions -from eegnb.analysis.utils import load_data,plot_conditions +from eegnb.analysis.utils import load_data from eegnb.datasets import fetch_dataset # sphinx_gallery_thumbnail_number = 1 @@ -136,14 +136,14 @@ # Left Cue tfr, itc = tfr_morlet(epochs['LeftCue'], freqs=frequencies, n_cycles=wave_cycles, return_itc=True) - tfr = tfr.apply_baseline([-1,-.5],mode='mean') + tfr = tfr.apply_baseline((-1,-.5),mode='mean') power_Ipsi_TP9 = tfr.data[0,:,:] power_Contra_TP10 = tfr.data[1,:,:] # Right Cue tfr, itc = tfr_morlet(epochs['RightCue'], freqs=frequencies, n_cycles=wave_cycles, return_itc=True) - tfr = tfr.apply_baseline([-1,-.5],mode='mean') + tfr = tfr.apply_baseline((-1,-.5),mode='mean') power_Contra_TP9 = tfr.data[0,:,:] power_Ipsi_TP10 = tfr.data[1,:,:] diff --git a/_downloads/1f56a155b1a68a196eeb8aea2e0b7517/02r__cueing_group_analysis.ipynb b/_downloads/1f56a155b1a68a196eeb8aea2e0b7517/02r__cueing_group_analysis.ipynb index 0fa210b9..3326933d 100644 --- a/_downloads/1f56a155b1a68a196eeb8aea2e0b7517/02r__cueing_group_analysis.ipynb +++ b/_downloads/1f56a155b1a68a196eeb8aea2e0b7517/02r__cueing_group_analysis.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -80,7 +69,7 @@ }, "outputs": [], "source": [ - "subs = [101, 102, 103, 104, 105, 106, 108, 109, 110, 111, 112,\n 202, 203, 204, 205, 207, 208, 209, 210, 211, \n 301, 302, 303, 304, 305, 306, 307, 308, 309]\n\ndiff_out = []\nIpsi_out = []\nContra_out = []\nIpsi_spectra_out = []\nContra_spectra_out = []\ndiff_spectra_out = []\nERSP_diff_out = []\nERSP_Ipsi_out = []\nERSP_Contra_out = []\n\nfrequencies = np.linspace(6, 30, 100, endpoint=True)\nwave_cycles = 6\n\n# time frequency window for analysis\nf_low = 7 # Hz\nf_high = 10\nf_diff = f_high-f_low\n \nt_low = 0 # s\nt_high = 1\nt_diff = t_high-t_low\n\nbad_subs= [6, 7, 13, 26]\nreally_bad_subs = [11, 12, 19]\nsub_count = 0 \n \n \n \nfor sub in subs:\n print(sub)\n \n sub_count += 1\n\n \n if (sub_count in really_bad_subs):\n rej_thresh_uV = 90\n elif (sub_count in bad_subs):\n rej_thresh_uV = 90\n else:\n rej_thresh_uV = 90\n\n rej_thresh = rej_thresh_uV*1e-6\n \n \n # Load both sessions\n raw = load_data(sub,1, # subject, session\n experiment='visual-cueing',site='kylemathlab_dev',device_name='muse2016',\n data_dir = eegnb_data_path)\n \n raw.append(\n load_data(sub,2, # subject, session\n experiment='visual-cueing', site='kylemathlab_dev', device_name='muse2016',\n data_dir = eegnb_data_path))\n \n\n # Filter Raw Data\n raw.filter(1,30, method='iir')\n\n #Select Events\n events = find_events(raw)\n event_id = {'LeftCue': 1, 'RightCue': 2}\n epochs = Epochs(raw, events=events, event_id=event_id, \n tmin=-1, tmax=2, baseline=(-1, 0), \n reject={'eeg':rej_thresh}, preload=True,\n verbose=False, picks=[0, 3])\n print('Trials Remaining: ' + str(len(epochs.events)) + '.')\n\n # Compute morlet wavelet\n\n # Left Cue\n tfr, itc = tfr_morlet(epochs['LeftCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\n tfr = tfr.apply_baseline([-1,-.5],mode='mean')\n #tfr.plot(picks=[0], mode='logratio', \n # title='TP9 - Ipsi');\n #tfr.plot(picks=[3], mode='logratio', \n # title='TP10 - Contra');\n power_Ipsi_TP9 = tfr.data[0,:,:]\n power_Contra_TP10 = tfr.data[1,:,:]\n\n # Right Cue\n tfr, itc = tfr_morlet(epochs['RightCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\n tfr = tfr.apply_baseline([-1,-.5],mode='mean')\n #tfr.plot(picks=[0], mode='logratio', \n # title='TP9 - Contra');\n #tfr.plot(picks=[3], mode='logratio', \n # title='TP10 - Ipsi');\n power_Contra_TP9 = tfr.data[0,:,:]\n power_Ipsi_TP10 = tfr.data[1,:,:]\n\n # Plot Differences\n #%matplotlib inline\n times = epochs.times\n power_Avg_Ipsi = (power_Ipsi_TP9+power_Ipsi_TP10)/2;\n power_Avg_Contra = (power_Contra_TP9+power_Contra_TP10)/2;\n power_Avg_Diff = power_Avg_Ipsi-power_Avg_Contra;\n\n\n #find max to make color range\n plot_max = np.max([np.max(np.abs(power_Avg_Ipsi)), np.max(np.abs(power_Avg_Contra))])\n plot_diff_max = np.max(np.abs(power_Avg_Diff))\n\n \n \n #Ipsi\n fig, ax = plt.subplots(1)\n im = plt.imshow(power_Avg_Ipsi,\n extent=[times[0], times[-1], frequencies[0], frequencies[-1]],\n aspect='auto', origin='lower', cmap='coolwarm', vmin=-plot_max, vmax=plot_max)\n plt.xlabel('Time (sec)')\n plt.ylabel('Frequency (Hz)')\n plt.title('Power Average Ipsilateral to Cue')\n cb = fig.colorbar(im)\n cb.set_label('Power')\n # Create a Rectangle patch\n rect = patches.Rectangle((t_low,f_low),t_diff,f_diff,linewidth=1,edgecolor='k',facecolor='none')\n # Add the patch to the Axes\n ax.add_patch(rect)\n\n #TP10\n fig, ax = plt.subplots(1)\n im = plt.imshow(power_Avg_Contra,\n extent=[times[0], times[-1], frequencies[0], frequencies[-1]],\n aspect='auto', origin='lower', cmap='coolwarm', vmin=-plot_max, vmax=plot_max)\n plt.xlabel('Time (sec)')\n plt.ylabel('Frequency (Hz)')\n plt.title(str(sub) + ' - Power Average Contra to Cue')\n cb = fig.colorbar(im)\n cb.set_label('Power')\n # Create a Rectangle patch\n rect = patches.Rectangle((t_low,f_low),t_diff,f_diff,linewidth=1,edgecolor='k',facecolor='none')\n # Add the patch to the Axes\n ax.add_patch(rect)\n\n #difference between conditions\n fig, ax = plt.subplots(1)\n im = plt.imshow(power_Avg_Diff,\n extent=[times[0], times[-1], frequencies[0], frequencies[-1]],\n aspect='auto', origin='lower', cmap='coolwarm', vmin=-plot_diff_max, vmax=plot_diff_max)\n plt.xlabel('Time (sec)')\n plt.ylabel('Frequency (Hz)')\n plt.title('Power Difference Ipsi-Contra')\n cb = fig.colorbar(im)\n cb.set_label('Ipsi-Contra Power')\n # Create a Rectangle patch\n rect = patches.Rectangle((t_low,f_low),t_diff,f_diff,linewidth=1,edgecolor='k',facecolor='none')\n # Add the patch to the Axes\n ax.add_patch(rect)\n \n \n \n \n #output data into array\n Ipsi_out.append(np.mean(power_Avg_Ipsi[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n ) \n Ipsi_spectra_out.append(np.mean(power_Avg_Ipsi[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1\n )\n )\n \n Contra_out.append(np.mean(power_Avg_Contra[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n )\n \n Contra_spectra_out.append(np.mean(power_Avg_Contra[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1))\n \n \n diff_out.append(np.mean(power_Avg_Diff[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n )\n diff_spectra_out.append(np.mean(power_Avg_Diff[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1\n )\n )\n \n \n ERSP_diff_out.append(power_Avg_Diff)\n ERSP_Ipsi_out.append(power_Avg_Ipsi)\n ERSP_Contra_out.append(power_Avg_Contra)\n\n\n \nprint(np.shape(ERSP_diff_out))\nprint(np.shape(Contra_spectra_out))\n\nprint(diff_out)" + "subs = [101, 102, 103, 104, 105, 106, 108, 109, 110, 111, 112,\n 202, 203, 204, 205, 207, 208, 209, 210, 211, \n 301, 302, 303, 304, 305, 306, 307, 308, 309]\n\ndiff_out = []\nIpsi_out = []\nContra_out = []\nIpsi_spectra_out = []\nContra_spectra_out = []\ndiff_spectra_out = []\nERSP_diff_out = []\nERSP_Ipsi_out = []\nERSP_Contra_out = []\n\nfrequencies = np.linspace(6, 30, 100, endpoint=True)\nwave_cycles = 6\n\n# time frequency window for analysis\nf_low = 7 # Hz\nf_high = 10\nf_diff = f_high-f_low\n \nt_low = 0 # s\nt_high = 1\nt_diff = t_high-t_low\n\nbad_subs= [6, 7, 13, 26]\nreally_bad_subs = [11, 12, 19]\nsub_count = 0 \n \n \n \nfor sub in subs:\n print(sub)\n \n sub_count += 1\n\n \n if (sub_count in really_bad_subs):\n rej_thresh_uV = 90\n elif (sub_count in bad_subs):\n rej_thresh_uV = 90\n else:\n rej_thresh_uV = 90\n\n rej_thresh = rej_thresh_uV*1e-6\n \n \n # Load both sessions\n raw = load_data(sub,1, # subject, session\n experiment='visual-cueing',site='kylemathlab_dev',device_name='muse2016',\n data_dir = eegnb_data_path)\n \n raw.append(\n load_data(sub,2, # subject, session\n experiment='visual-cueing', site='kylemathlab_dev', device_name='muse2016',\n data_dir = eegnb_data_path))\n \n\n # Filter Raw Data\n raw.filter(1,30, method='iir')\n\n #Select Events\n events = find_events(raw)\n event_id = {'LeftCue': 1, 'RightCue': 2}\n epochs = Epochs(raw, events=events, event_id=event_id, \n tmin=-1, tmax=2, baseline=(-1, 0), \n reject={'eeg':rej_thresh}, preload=True,\n verbose=False, picks=[0, 3])\n print('Trials Remaining: ' + str(len(epochs.events)) + '.')\n\n # Compute morlet wavelet\n\n # Left Cue\n tfr, itc = tfr_morlet(epochs['LeftCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\n tfr = tfr.apply_baseline((-1,-.5),mode='mean')\n #tfr.plot(picks=[0], mode='logratio', \n # title='TP9 - Ipsi');\n #tfr.plot(picks=[3], mode='logratio', \n # title='TP10 - Contra');\n power_Ipsi_TP9 = tfr.data[0,:,:]\n power_Contra_TP10 = tfr.data[1,:,:]\n\n # Right Cue\n tfr, itc = tfr_morlet(epochs['RightCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\n tfr = tfr.apply_baseline((-1,-.5),mode='mean')\n #tfr.plot(picks=[0], mode='logratio', \n # title='TP9 - Contra');\n #tfr.plot(picks=[3], mode='logratio', \n # title='TP10 - Ipsi');\n power_Contra_TP9 = tfr.data[0,:,:]\n power_Ipsi_TP10 = tfr.data[1,:,:]\n\n # Plot Differences\n #%matplotlib inline\n times = epochs.times\n power_Avg_Ipsi = (power_Ipsi_TP9+power_Ipsi_TP10)/2;\n power_Avg_Contra = (power_Contra_TP9+power_Contra_TP10)/2;\n power_Avg_Diff = power_Avg_Ipsi-power_Avg_Contra;\n\n\n #find max to make color range\n plot_max = np.max([np.max(np.abs(power_Avg_Ipsi)), np.max(np.abs(power_Avg_Contra))])\n plot_diff_max = np.max(np.abs(power_Avg_Diff))\n\n \n \n #Ipsi\n fig, ax = plt.subplots(1)\n im = plt.imshow(power_Avg_Ipsi,\n extent=[times[0], times[-1], frequencies[0], frequencies[-1]],\n aspect='auto', origin='lower', cmap='coolwarm', vmin=-plot_max, vmax=plot_max)\n plt.xlabel('Time (sec)')\n plt.ylabel('Frequency (Hz)')\n plt.title('Power Average Ipsilateral to Cue')\n cb = fig.colorbar(im)\n cb.set_label('Power')\n # Create a Rectangle patch\n rect = patches.Rectangle((t_low,f_low),t_diff,f_diff,linewidth=1,edgecolor='k',facecolor='none')\n # Add the patch to the Axes\n ax.add_patch(rect)\n\n #TP10\n fig, ax = plt.subplots(1)\n im = plt.imshow(power_Avg_Contra,\n extent=[times[0], times[-1], frequencies[0], frequencies[-1]],\n aspect='auto', origin='lower', cmap='coolwarm', vmin=-plot_max, vmax=plot_max)\n plt.xlabel('Time (sec)')\n plt.ylabel('Frequency (Hz)')\n plt.title(str(sub) + ' - Power Average Contra to Cue')\n cb = fig.colorbar(im)\n cb.set_label('Power')\n # Create a Rectangle patch\n rect = patches.Rectangle((t_low,f_low),t_diff,f_diff,linewidth=1,edgecolor='k',facecolor='none')\n # Add the patch to the Axes\n ax.add_patch(rect)\n\n #difference between conditions\n fig, ax = plt.subplots(1)\n im = plt.imshow(power_Avg_Diff,\n extent=[times[0], times[-1], frequencies[0], frequencies[-1]],\n aspect='auto', origin='lower', cmap='coolwarm', vmin=-plot_diff_max, vmax=plot_diff_max)\n plt.xlabel('Time (sec)')\n plt.ylabel('Frequency (Hz)')\n plt.title('Power Difference Ipsi-Contra')\n cb = fig.colorbar(im)\n cb.set_label('Ipsi-Contra Power')\n # Create a Rectangle patch\n rect = patches.Rectangle((t_low,f_low),t_diff,f_diff,linewidth=1,edgecolor='k',facecolor='none')\n # Add the patch to the Axes\n ax.add_patch(rect)\n \n \n \n \n #output data into array\n Ipsi_out.append(np.mean(power_Avg_Ipsi[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n ) \n Ipsi_spectra_out.append(np.mean(power_Avg_Ipsi[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1\n )\n )\n \n Contra_out.append(np.mean(power_Avg_Contra[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n )\n \n Contra_spectra_out.append(np.mean(power_Avg_Contra[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1))\n \n \n diff_out.append(np.mean(power_Avg_Diff[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n )\n diff_spectra_out.append(np.mean(power_Avg_Diff[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1\n )\n )\n \n \n ERSP_diff_out.append(power_Avg_Diff)\n ERSP_Ipsi_out.append(power_Avg_Ipsi)\n ERSP_Contra_out.append(power_Avg_Contra)\n\n\n \nprint(np.shape(ERSP_diff_out))\nprint(np.shape(Contra_spectra_out))\n\nprint(diff_out)" ] }, { @@ -172,7 +161,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/2cbf7eec12f4415419df2cf85cbe5c5b/visual_p300_python.zip b/_downloads/2cbf7eec12f4415419df2cf85cbe5c5b/visual_p300_python.zip index f0576d7e35a7ff02ba1415581109ce2c22e82bef..0f1a8209ed74f9725eff12798bb0ee9345c1a75c 100644 GIT binary patch delta 677 zcmaFp|0_@?z?+#xgaHI<7o|t6@9oK~V_{$bVQGfR>(pg8FIQT@$ghx@TaaH=q7ar@ zT$-2@FgZm=c3fal2irPih|Ul%-qzx5(WRHtkmQZt^#8N0|i@{ zE+A*}Q8gQ7kf>f!X`Y5A7pm<)^o-0s1Q{4S1UIt^v9eC?U{aXu$)vs6K>RGbP+oqX zZb@QMdTNQfm4cy;f_lm1gCu%2WBl(S5=@{vmx|+r6a7|X^mYN){#9I$E5^A_67ck&_ z6Z3$OYK8v>nxMY$nZxi-*2sb)a+Tm?BLdL^0Z871*KiIw@KCBV2qii}yn zq_C0ip`aEclL#}e)B#R3U}8xl11PP?qbWy3Cj)~3LN&vZ#_cSV3)JOUK-NqaRF`7X Y6`QQ9E-Avw22#Zggr|VClm>_g0DfY;rvLx| delta 374 zcmewr_|Ts(z?+#xgaHI*FtmhhwibIRC4*w+Ax+YIX^EYvm`S=uQ*yg1WC$h@;Z@;dMTM{Y4PQWWvOZTMY*;bhB^vH znwnf(2#124<^NXCD~g4IA!?)eDMnGfvdrSr#GLp7V*>+)%-n+fq7sFI$sZW?H!CnH zGw~}ZaDim>3W`#TQ}aqD7qHj}1b8zti7+F4K6#^t6cYo(c1_T@| nX?!a%u|{uBRlzth5#F*I!FQlU(RB} diff --git a/_downloads/2f1a411d3414306e436c6540c86910c5/00x__n170_run_experiment.ipynb b/_downloads/2f1a411d3414306e436c6540c86910c5/00x__n170_run_experiment.ipynb index b3f8b2ad..4ccbaaf4 100644 --- a/_downloads/2f1a411d3414306e436c6540c86910c5/00x__n170_run_experiment.ipynb +++ b/_downloads/2f1a411d3414306e436c6540c86910c5/00x__n170_run_experiment.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -33,25 +22,7 @@ }, "outputs": [], "source": [ - "import os\nfrom eegnb import generate_save_fn\nfrom eegnb.devices.eeg import EEG\nfrom eegnb.experiments.visual_n170 import n170\n\n# Define some variables\nboard_name = \"muse\"\nexperiment = \"visual_n170\"\nsubject_id = 0\nsession_nb = 0\nrecord_duration = 120" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Initiate EEG device\n\nStart EEG device\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "eeg_device = EEG(device=board_name)\n\n# Create save file name\nsave_fn = generate_save_fn(board_name, experiment, subject_id, session_nb)\nprint(save_fn)" + "from eegnb import generate_save_fn\nfrom eegnb.devices.eeg import EEG\nfrom eegnb.experiments import VisualN170\n\n# Define some variables\nboard_name = \"muse2\" # board name\nexperiment_name = \"visual_n170\" # experiment name\nsubject_id = 0 # test subject id\nsession_nb = 0 # session number\nrecord_duration = 120 # recording duration\n\n# generate save path\nsave_fn = generate_save_fn(board_name, experiment_name, subject_id, session_nb)\n\n# create device object\neeg_device = EEG(device=board_name)\n\n# Experiment type\nexperiment = VisualN170(duration=record_duration, eeg=eeg_device, save_fn=save_fn)" ] }, { @@ -69,7 +40,7 @@ }, "outputs": [], "source": [ - "n170.present(duration=record_duration, eeg=eeg_device, save_fn=save_fn)" + "experiment.run()\n\n# Saved csv location\nprint(\"Recording saved in\", experiment.save_fn)" ] } ], @@ -89,7 +60,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/2fc210914b93a8aaaaa1a6667585ad74/visual_cueing_jupyter.zip b/_downloads/2fc210914b93a8aaaaa1a6667585ad74/visual_cueing_jupyter.zip index ca27b83da08645e93834a4d1b29c37e5ff76f964..9dc938eeaaeb0ba0ae21e66c48e79625be1d8225 100644 GIT binary patch delta 917 zcmey+#k{SJSth`nnMH&F1Uwd{M@auWBmCKlfdPaS7$)C8qBOZ)RdcdDkIm%uYTT1A z^ztpf9w^A6p=+q4t7odY`F_$iMmTTs{iLwT_IBKx|D}kkvsmaET1-BF*nG0RDu<9c z(Cn+i>Czn93=ANw!Z5k_h#Ji7&Fj_b7)A3+a|%aXC0GQlvu6@ zm7YA&M0D~V{i4l+rX9>cV`f^&0?BO_a`nmic`2DCnfZCe(ds^_X(i63sp_!`whBnR zm^@@fL7C|pNU9Lr7@$FEY2}G!sX*--aKm&I)ZuD0WAbA1(lXO^6cQ_dih!=2yxMmz z2Tb2&KR@}&1|2b*8Lc9i;GwxW(WVP2Y!hvKHrw0j@vEzcCFW$Ngd`TFrHD>SNLTfn*}c0u(Lknv-Ywu7kUOv!CBdM%4HY1;+P< zzjD8)m@zPbur|YF-J`k_ec?%I^MzhU=FJZ$i1H&m{BOQ6l867zmz-?7fOGN!JJHPn z3#*k-ED!`G)(cvy%&IC33?QsOS^tO;viTj1HOeq8jtU^3`f#JjC{JHUy1vvYJRC5zc3UcyGax#+? zGV^jW^HL{YR7u~=HLqQn#az$OX!0K`d%i%RR@E0$p%=9n7%pl}_OuShqjxgbJnqep zt&15a_smzGTxEM}vH)}X<~?>v92_8v;tPsXHXFG2Fe$|36(yGI!NfGuax?R64RsXK zauX|TjSV!dfey*q9O%`-Jo%Qd>||>{DJG-X$t`~C*ffBuj5Ie}`Cn$@h}JdK(bY4J zoxD8QXLDkZ9V1+1^YY*-epVwx9V4U39?42cui3$>vr_8k?VAI5Pe3LcjHBMf-de`RKj2(=VZ`-Zhd@ieo4{rVB+$zb**_FTG z0-JNIHYveuH=lgwAeRD48UUsPeQ?Tv5K9^v7$(0zWUR%=B*F|yGN|#+zyQ<%2TK}l zRVVvet4+>2#G`;3ZVU_xaAgb(OBw?LCdw#*)Tv+#0hrPyjXphy@DQA=a9Dti@-`~Uy| diff --git a/_downloads/335ce423c80436163e4a75b13e3dba64/00x__ssvep_run_experiment.py b/_downloads/335ce423c80436163e4a75b13e3dba64/00x__ssvep_run_experiment.py index 1741760e..dfb8c046 100644 --- a/_downloads/335ce423c80436163e4a75b13e3dba64/00x__ssvep_run_experiment.py +++ b/_downloads/335ce423c80436163e4a75b13e3dba64/00x__ssvep_run_experiment.py @@ -15,10 +15,10 @@ import os from eegnb import generate_save_fn from eegnb.devices.eeg import EEG -from eegnb.experiments.visual_ssvep import ssvep +from eegnb.experiments import VisualSSVEP # Define some variables -board_name = "muse" +board_name = "muse2" experiment = "visual_ssvep" subject_id = 0 session_nb = 0 @@ -39,4 +39,5 @@ # Run experiment # --------------------- # -ssvep.present(duration=record_duration, eeg=eeg_device, save_fn=save_fn) +ssvep = VisualSSVEP(duration=record_duration, eeg=eeg_device, save_fn=save_fn) +ssvep.run() \ No newline at end of file diff --git a/_downloads/482813616f7e52f19737a9e9e4714600/01r__ssvep_viz.ipynb b/_downloads/482813616f7e52f19737a9e9e4714600/01r__ssvep_viz.ipynb index bb88a75c..d197e645 100644 --- a/_downloads/482813616f7e52f19737a9e9e4714600/01r__ssvep_viz.ipynb +++ b/_downloads/482813616f7e52f19737a9e9e4714600/01r__ssvep_viz.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -26,7 +15,7 @@ }, "outputs": [], "source": [ - "# Some standard pythonic imports\nimport os, numpy as np, pandas as pd\nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\nfrom matplotlib import pyplot as plt\n\n# MNE functions\nfrom mne import Epochs,find_events\nfrom mne.time_frequency import psd_welch,tfr_morlet\n\n# EEG-Notebooks functions\nfrom eegnb.analysis.utils import load_data,plot_conditions\nfrom eegnb.datasets import fetch_dataset" + "# Some standard pythonic imports\nimport os, numpy as np, pandas as pd\nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\nfrom matplotlib import pyplot as plt\n\n# MNE functions\nfrom mne import Epochs,find_events\nfrom mne.time_frequency import tfr_morlet\n\n# EEG-Notebooks functions\nfrom eegnb.analysis.utils import load_data,plot_conditions\nfrom eegnb.datasets import fetch_dataset" ] }, { @@ -44,7 +33,7 @@ }, "outputs": [], "source": [ - "eegnb_data_path = os.path.join(os.path.expanduser('~/'),'.eegnb', 'data') \nssvep_data_path = os.path.join(eegnb_data_path, 'visual-SSVEP', 'eegnb_examples')\n\n# If dataset hasn't been downloaded yet, download it \nif not os.path.isdir(ssvep_data_path):\n fetch_dataset(data_dir=eegnb_data_path, experiment='visual-SSVEP', site='eegnb_examples'); \n\n\nsubject = 1\nsession = 1\nraw = load_data(subject, session, \n experiment='visual-SSVEP', site='eegnb_examples', device_name='muse2016',\n data_dir = eegnb_data_path,\n replace_ch_names={'Right AUX': 'POz'})" + "eegnb_data_path = os.path.join(os.path.expanduser('~/'),'.eegnb', 'data') \nssvep_data_path = os.path.join(eegnb_data_path, 'visual-SSVEP', 'eegnb_examples')\n\n# If dataset hasn't been downloaded yet, download it \nif not os.path.isdir(ssvep_data_path):\n fetch_dataset(data_dir=eegnb_data_path, experiment='visual-SSVEP', site='eegnb_examples'); \n\n\nsubject = 1\nsession = 1\nraw = load_data(subject, session, \n experiment='visual-SSVEP', site='eegnb_examples', device_name='muse2016',\n data_dir = eegnb_data_path,\n replace_ch_names={'Right AUX': 'POz'})\nraw.set_channel_types({'POz': 'eeg'})" ] }, { @@ -98,7 +87,7 @@ }, "outputs": [], "source": [ - "# Next, we can compare the PSD of epochs specifically during 20hz and 30hz stimulus presentation\n\nf, axs = plt.subplots(2, 1, figsize=(10, 10))\npsd1, freq1 = psd_welch(epochs['30 Hz'], n_fft=1028, n_per_seg=256 * 3, picks='all')\npsd2, freq2 = psd_welch(epochs['20 Hz'], n_fft=1028, n_per_seg=256 * 3, picks='all')\npsd1 = 10 * np.log10(psd1)\npsd2 = 10 * np.log10(psd2)\n\npsd1_mean = psd1.mean(0)\npsd1_std = psd1.mean(0)\n\npsd2_mean = psd2.mean(0)\npsd2_std = psd2.mean(0)\n\naxs[0].plot(freq1, psd1_mean[[0, 3], :].mean(0), color='b', label='30 Hz')\naxs[0].plot(freq2, psd2_mean[[0, 3], :].mean(0), color='r', label='20 Hz')\n\naxs[1].plot(freq1, psd1_mean[4, :], color='b', label='30 Hz')\naxs[1].plot(freq2, psd2_mean[4, :], color='r', label='20 Hz')\n\naxs[0].set_title('TP9 and TP10')\naxs[1].set_title('POz')\n\naxs[0].set_ylabel('Power Spectral Density (dB)')\naxs[1].set_ylabel('Power Spectral Density (dB)')\n\naxs[0].set_xlim((2, 50))\naxs[1].set_xlim((2, 50))\n\naxs[1].set_xlabel('Frequency (Hz)')\n\naxs[0].legend()\naxs[1].legend()\n\nplt.show();\n\n# With this visualization we can clearly see distinct peaks at 30hz and 20hz in the PSD, corresponding to the frequency of the visual stimulation. The peaks are much larger at the POz electrode, but still visible at TP9 and TP10" + "# Next, we can compare the PSD of epochs specifically during 20hz and 30hz stimulus presentation\n\nf, axs = plt.subplots(2, 1, figsize=(10, 10))\n\nwelch_params=dict(method='welch',\n n_fft=1028,\n n_per_seg=256 * 3,\n picks='all')\n\npsd1, freq1 = epochs['30 Hz'].compute_psd(**welch_params).get_data(return_freqs=True)\npsd2, freq2 = epochs['20 Hz'].compute_psd(**welch_params).get_data(return_freqs=True)\npsd1 = 10 * np.log10(psd1)\npsd2 = 10 * np.log10(psd2)\n\npsd1_mean = psd1.mean(0)\npsd1_std = psd1.mean(0)\n\npsd2_mean = psd2.mean(0)\npsd2_std = psd2.mean(0)\n\naxs[0].plot(freq1, psd1_mean[[0, 3], :].mean(0), color='b', label='30 Hz')\naxs[0].plot(freq2, psd2_mean[[0, 3], :].mean(0), color='r', label='20 Hz')\n\naxs[1].plot(freq1, psd1_mean[4, :], color='b', label='30 Hz')\naxs[1].plot(freq2, psd2_mean[4, :], color='r', label='20 Hz')\n\naxs[0].set_title('TP9 and TP10')\naxs[1].set_title('POz')\n\naxs[0].set_ylabel('Power Spectral Density (dB)')\naxs[1].set_ylabel('Power Spectral Density (dB)')\n\naxs[0].set_xlim((2, 50))\naxs[1].set_xlim((2, 50))\n\naxs[1].set_xlabel('Frequency (Hz)')\n\naxs[0].legend()\naxs[1].legend()\n\nplt.show();\n\n# With this visualization we can clearly see distinct peaks at 30hz and 20hz in the PSD, corresponding to the frequency of the visual stimulation. The peaks are much larger at the POz electrode, but still visible at TP9 and TP10" ] }, { @@ -116,7 +105,7 @@ }, "outputs": [], "source": [ - "# We can also look for SSVEPs in the spectrogram, which uses color to represent the power of frequencies in the EEG signal over time\n\nfrequencies = np.logspace(1, 1.75, 60)\ntfr, itc = tfr_morlet(epochs['30 Hz'], freqs=frequencies,picks='all',\n n_cycles=15, return_itc=True)\ntfr.plot(picks=[4], baseline=(-0.5, -0.1), mode='logratio', \n title='POz - 30 Hz stim');\n\ntfr, itc = tfr_morlet(epochs['20 Hz'], freqs=frequencies,picks='all',\n n_cycles=15, return_itc=True)\ntfr.plot(picks=[4], baseline=(-0.5, -0.1), mode='logratio', \n title='POz - 20 Hz stim');\n\nplt.tight_layout()\n\n# Once again we can see clear SSVEPs at 30hz and 20hz" + "# We can also look for SSVEPs in the spectrogram, which uses color to represent the power of frequencies in the EEG signal over time\n\nfrequencies = np.logspace(1, 1.75, 60)\ntfr, itc = tfr_morlet(epochs['30 Hz'], freqs=frequencies,picks='all',\n n_cycles=15, return_itc=True)\ntfr.plot(picks=[4], baseline=(-0.5, -0.1), mode='logratio', \n title='POz - 30 Hz stim');\n\ntfr, itc = tfr_morlet(epochs['20 Hz'], freqs=frequencies,picks='all',\n n_cycles=15, return_itc=True)\ntfr.plot(picks=[4], baseline=(-0.5, -0.1), mode='logratio', \n title='POz - 20 Hz stim');\n\n# Set Layout engine to tight to fix error with using colorbar layout error\nplt.figure().set_layout_engine('tight');\nplt.tight_layout()\n\n# Once again we can see clear SSVEPs at 30hz and 20hz" ] } ], @@ -136,7 +125,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/4c0d23639fbd212d64cd06010552da22/visual_n170_python.zip b/_downloads/4c0d23639fbd212d64cd06010552da22/visual_n170_python.zip index 6f67e453689c055260a4a7832da402d1cf43813c..7417a01c0d6e577e087483ec23316e521abb2572 100644 GIT binary patch delta 854 zcmZva(P|Sx6oxl#kap0d#+E7y9X7U`z>+4RrW7iOXb}qAV&U|O)od2BP5BrZ&)$Qrzyrw?- zt@Ug$HP_8tcq&&5e|paklA3lf_^9KA_?xYzA?bK7<8YVwf!%%}I@edbWgTW=!?hWL z)b3z_UwN334yN2vdw3J-VT4<>v|d#3m>7EaLE{B>xJ8hJixS}2=PJ&(BtEaK zb|-`?uz=>G7j|Ss2s(ZU+pZJk0z5`2&*_h&6jdrJY6J<@%?Tw7%4#)f9*oPWiumd0 z#l!lXrl}!+typ4KREY1!dQu!_mJ(3h%9w+<$)nk8S;wV_CFxc`6a!U0AeluVFp*s zV&Mj^h~u}p2S)L4jmc{ufZ znn=%G7VnMo@Jvt3zP@^fdy^4AjHQk7wf|FZlp6o1 delta 595 zcmZ1y_{v`*z?+#xgaHH!7+OMZa~Qur#?QcTjDK^WxEsslASSiVkEQ2vN+sv#rDT?5 z=I0eht9#^^7N@GmD%dJS8^&@?o~tT3SwL+rzh8b{s*ZxPhM|svk)|fs_qLcAac{JUCnHj0ITA!_q1p;X4n z9n$=hSwzA_^~y4fOA~YA^9;=m6f$!Q@{39o@+N1B=m#iqrB)QA7G>t9=9K_lq=ckU ziL1CYDJwO(BtA0*C}qG^oLXEA^g?`I5|~?*nw(#h5}#69lnC+}P|VQCVDd(V3}Mea zpkEV9QWacX-4#+&%QBNwCr{*&nEZj2RUo(|5okG*#9>hlQRkvmkn-ZhvQ&k%%$!t( zyu{qp$N*MtM*!Jy7ie-76lLa>Xn?fDr{zuFppZ6slbAlgf&v%FlX?Y3sl`Aq zO%@Wf$qMjhWD;S<7E25a0^qoV5K9_Cw1Ht!JUF1@%QCC<3M!FxgTlJ4z%4OAh=Bow tMNxEr;h+3LU0DGo9)NKnjiRVrY4Us_S+M|bRyL40GZ3Bv(p>5w9srT(rojLJ diff --git a/_downloads/4cd288a0df5274e2be1a468e1967a571/04r__cueing_group_analysis_winter2019.ipynb b/_downloads/4cd288a0df5274e2be1a468e1967a571/04r__cueing_group_analysis_winter2019.ipynb index c39b3737..822f31bd 100644 --- a/_downloads/4cd288a0df5274e2be1a468e1967a571/04r__cueing_group_analysis_winter2019.ipynb +++ b/_downloads/4cd288a0df5274e2be1a468e1967a571/04r__cueing_group_analysis_winter2019.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -33,7 +22,7 @@ }, "outputs": [], "source": [ - "# Standard Pythonic imports\nimport os,sys,glob,numpy as np, pandas as pd\nimport scipy\nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\nfrom matplotlib import pyplot as plt\nimport matplotlib.patches as patches\n\n# MNE functions\nfrom mne import Epochs, find_events, concatenate_raws\nfrom mne.time_frequency import tfr_morlet\n\n# EEG-Noteooks functions\nfrom eegnb.analysis.utils import load_data,plot_conditions\nfrom eegnb.datasets import fetch_dataset" + "# Standard Pythonic imports\nimport os,sys,glob,numpy as np, pandas as pd\nimport scipy\nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\nfrom matplotlib import pyplot as plt\nimport matplotlib.patches as patches\n\n# MNE functions\nfrom mne import Epochs, find_events, concatenate_raws\nfrom mne.time_frequency import tfr_morlet\n\n# EEG-Noteooks functions\nfrom eegnb.analysis.utils import load_data\nfrom eegnb.datasets import fetch_dataset" ] }, { @@ -69,7 +58,7 @@ }, "outputs": [], "source": [ - "subs = [1101, 1102, 1103, 1104, 1105, 1106, 1108, 1109, 1110,\n 1202, 1203, 1205, 1206, 1209, 1210, 1211, 1215,\n 1301, 1302, 1313, \n 1401, 1402, 1403, 1404, 1405, 1408, 1410, 1411, 1412, 1413, 1413, 1414, 1415, 1416]\n#\n# Both\n# subs = [101, 102, 103, 104, 105, 106, 108, 109, 110, 111, 112,\n# 202, 203, 204, 205, 207, 208, 209, 210, 211, \n# 301, 302, 303, 304, 305, 306, 307, 308, 309,\n# 1101, 1102, 1103, 1104, 1105, 1106, 1108, 1109, 1110,\n# 1202, 1203, 1205, 1206, 1209, 1210, 1211, 1215,\n# 1301, 1302, 1313, \n# 1401, 1402, 1403, 1404, 1405, 1408, 1410, 1411, 1412, 1413, 1413, 1414, 1415, 1416]\n#\n#\n# placeholders to add to for each subject\ndiff_out = []\nIpsi_out = []\nContra_out = []\nIpsi_spectra_out = []\nContra_spectra_out = []\ndiff_spectra_out = []\nERSP_diff_out = []\nERSP_Ipsi_out = []\nERSP_Contra_out = []\n\nfrequencies = np.linspace(6, 30, 100, endpoint=True)\nwave_cycles = 6\n\n# time frequency window for analysis\nf_low = 7 # Hz\nf_high = 10\nf_diff = f_high-f_low\n \nt_low = 0 # s\nt_high = 1\nt_diff = t_high-t_low\n\nbad_subs= [6, 7, 13, 26]\nreally_bad_subs = [11, 12, 19]\nsub_count = 0 \n \n \n \nfor sub in subs:\n print(sub)\n \n sub_count += 1\n\n \n if (sub_count in really_bad_subs):\n rej_thresh_uV = 90\n elif (sub_count in bad_subs):\n rej_thresh_uV = 90\n else:\n rej_thresh_uV = 90\n\n rej_thresh = rej_thresh_uV*1e-6\n \n \n # Load both sessions\n raw = load_data(sub,1, # subject, session\n experiment='visual-cueing',site='kylemathlab_dev',device_name='muse2016',\n data_dir = eegnb_data_path)\n \n raw.append(\n load_data(sub,2, # subject, session\n experiment='visual-cueing', site='kylemathlab_dev', device_name='muse2016',\n data_dir = eegnb_data_path))\n \n\n # Filter Raw Data\n raw.filter(1,30, method='iir')\n\n #Select Events\n events = find_events(raw)\n event_id = {'LeftCue': 1, 'RightCue': 2}\n epochs = Epochs(raw, events=events, event_id=event_id, \n tmin=-1, tmax=2, baseline=(-1, 0), \n reject={'eeg':rej_thresh}, preload=True,\n verbose=False, picks=[0, 3])\n print('Trials Remaining: ' + str(len(epochs.events)) + '.')\n\n # Compute morlet wavelet\n # Left Cue\n tfr, itc = tfr_morlet(epochs['LeftCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\n tfr = tfr.apply_baseline([-1,-.5],mode='mean')\n power_Ipsi_TP9 = tfr.data[0,:,:]\n power_Contra_TP10 = tfr.data[1,:,:]\n\n # Right Cue\n tfr, itc = tfr_morlet(epochs['RightCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\n tfr = tfr.apply_baseline([-1,-.5],mode='mean')\n power_Contra_TP9 = tfr.data[0,:,:]\n power_Ipsi_TP10 = tfr.data[1,:,:]\n\n # Compute averages Differences\n power_Avg_Ipsi = (power_Ipsi_TP9+power_Ipsi_TP10)/2;\n power_Avg_Contra = (power_Contra_TP9+power_Contra_TP10)/2;\n power_Avg_Diff = power_Avg_Ipsi-power_Avg_Contra;\n \n #output data into array\n times = epochs.times\n Ipsi_out.append(np.mean(power_Avg_Ipsi[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n ) \n Ipsi_spectra_out.append(np.mean(power_Avg_Ipsi[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1\n )\n )\n \n Contra_out.append(np.mean(power_Avg_Contra[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n )\n \n Contra_spectra_out.append(np.mean(power_Avg_Contra[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1))\n \n \n diff_out.append(np.mean(power_Avg_Diff[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n )\n diff_spectra_out.append(np.mean(power_Avg_Diff[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1\n )\n )\n \n #save the spectrograms to average over after\n ERSP_diff_out.append(power_Avg_Diff)\n ERSP_Ipsi_out.append(power_Avg_Ipsi)\n ERSP_Contra_out.append(power_Avg_Contra)" + "subs = [1101, 1102, 1103, 1104, 1105, 1106, 1108, 1109, 1110,\n 1202, 1203, 1205, 1206, 1209, 1210, 1211, 1215,\n 1301, 1302, 1313, \n 1401, 1402, 1403, 1404, 1405, 1408, 1410, 1411, 1412, 1413, 1413, 1414, 1415, 1416]\n#\n# Both\n# subs = [101, 102, 103, 104, 105, 106, 108, 109, 110, 111, 112,\n# 202, 203, 204, 205, 207, 208, 209, 210, 211, \n# 301, 302, 303, 304, 305, 306, 307, 308, 309,\n# 1101, 1102, 1103, 1104, 1105, 1106, 1108, 1109, 1110,\n# 1202, 1203, 1205, 1206, 1209, 1210, 1211, 1215,\n# 1301, 1302, 1313, \n# 1401, 1402, 1403, 1404, 1405, 1408, 1410, 1411, 1412, 1413, 1413, 1414, 1415, 1416]\n#\n#\n# placeholders to add to for each subject\ndiff_out = []\nIpsi_out = []\nContra_out = []\nIpsi_spectra_out = []\nContra_spectra_out = []\ndiff_spectra_out = []\nERSP_diff_out = []\nERSP_Ipsi_out = []\nERSP_Contra_out = []\n\nfrequencies = np.linspace(6, 30, 100, endpoint=True)\nwave_cycles = 6\n\n# time frequency window for analysis\nf_low = 7 # Hz\nf_high = 10\nf_diff = f_high-f_low\n \nt_low = 0 # s\nt_high = 1\nt_diff = t_high-t_low\n\nbad_subs= [6, 7, 13, 26]\nreally_bad_subs = [11, 12, 19]\nsub_count = 0 \n \n \n \nfor sub in subs:\n print(sub)\n \n sub_count += 1\n\n \n if (sub_count in really_bad_subs):\n rej_thresh_uV = 90\n elif (sub_count in bad_subs):\n rej_thresh_uV = 90\n else:\n rej_thresh_uV = 90\n\n rej_thresh = rej_thresh_uV*1e-6\n \n \n # Load both sessions\n raw = load_data(sub,1, # subject, session\n experiment='visual-cueing',site='kylemathlab_dev',device_name='muse2016',\n data_dir = eegnb_data_path)\n \n raw.append(\n load_data(sub,2, # subject, session\n experiment='visual-cueing', site='kylemathlab_dev', device_name='muse2016',\n data_dir = eegnb_data_path))\n \n\n # Filter Raw Data\n raw.filter(1,30, method='iir')\n\n #Select Events\n events = find_events(raw)\n event_id = {'LeftCue': 1, 'RightCue': 2}\n epochs = Epochs(raw, events=events, event_id=event_id, \n tmin=-1, tmax=2, baseline=(-1, 0), \n reject={'eeg':rej_thresh}, preload=True,\n verbose=False, picks=[0, 3])\n print('Trials Remaining: ' + str(len(epochs.events)) + '.')\n\n # Compute morlet wavelet\n # Left Cue\n tfr, itc = tfr_morlet(epochs['LeftCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\n tfr = tfr.apply_baseline((-1,-.5),mode='mean')\n power_Ipsi_TP9 = tfr.data[0,:,:]\n power_Contra_TP10 = tfr.data[1,:,:]\n\n # Right Cue\n tfr, itc = tfr_morlet(epochs['RightCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\n tfr = tfr.apply_baseline((-1,-.5),mode='mean')\n power_Contra_TP9 = tfr.data[0,:,:]\n power_Ipsi_TP10 = tfr.data[1,:,:]\n\n # Compute averages Differences\n power_Avg_Ipsi = (power_Ipsi_TP9+power_Ipsi_TP10)/2;\n power_Avg_Contra = (power_Contra_TP9+power_Contra_TP10)/2;\n power_Avg_Diff = power_Avg_Ipsi-power_Avg_Contra;\n \n #output data into array\n times = epochs.times\n Ipsi_out.append(np.mean(power_Avg_Ipsi[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n ) \n Ipsi_spectra_out.append(np.mean(power_Avg_Ipsi[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1\n )\n )\n \n Contra_out.append(np.mean(power_Avg_Contra[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n )\n \n Contra_spectra_out.append(np.mean(power_Avg_Contra[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1))\n \n \n diff_out.append(np.mean(power_Avg_Diff[np.argmax(frequencies>f_low):\n np.argmax(frequencies>f_high)-1,\n np.argmax(times>t_low):np.argmax(times>t_high)-1 ]\n )\n )\n diff_spectra_out.append(np.mean(power_Avg_Diff[:,np.argmax(times>t_low):\n np.argmax(times>t_high)-1 ],1\n )\n )\n \n #save the spectrograms to average over after\n ERSP_diff_out.append(power_Avg_Diff)\n ERSP_Ipsi_out.append(power_Avg_Ipsi)\n ERSP_Contra_out.append(power_Avg_Contra)" ] }, { @@ -219,7 +208,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/5ea8fb0b660bbd8665ebbc30a424eb42/visual_gonogo_jupyter.zip b/_downloads/5ea8fb0b660bbd8665ebbc30a424eb42/visual_gonogo_jupyter.zip deleted file mode 100644 index 15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22 NcmWIWW@Tf*000g10H*)| diff --git a/_downloads/67001aab4aa80bdc4a44406add4d085e/visual_cueing_python.zip b/_downloads/67001aab4aa80bdc4a44406add4d085e/visual_cueing_python.zip index 38aa69d96499e8547931d7c37ddc0c73de5bd54e..33e73a871c7e64a8a2973d915bc85c0888d7403c 100644 GIT binary patch delta 771 zcmcb(pK1R=CZPatW)=|!5HMeq9#JE?*mv`K+uwW~8oGu$x_YLXlT-adCfDn7Z07Uz zXM~GxPW5Y7;`_8PJwoHjtz(y!7#J=qZC)s?#weOsnp;q*kXWpcSD>s@Tv@D>o|B(6 z`L@hMM&-?WWdE}XCFkcBl$NB%7Zj&xXzCT@$ z=@|%FqgXDSI^pI_Hq?^QQ%7jzO36%1D^Dy-1)8q`SEZwXP@*~6UuzWyOxfoDT6#?I zkea+l&ueqNt|?O3?a}+ptF9iFn3I_jl30|US`rWPf;!MdWHGP<)F*GTQH)Uc%qzp9 z8dVgcJ{HxrNCtw;N712<>g>tgwlYEL%fJA_8Vr*s&exjg#l6|Mu##!A zpo7fhEIE_O0!$g3OG-ZRzX+t$r7w`#8~JLbg&3Jc zm{F75WWD)fj0}@^*eXnxn$M$vnywfa6v62eLM&-?HJ^v?OkiyB0^Q4%rHBX*9&tUT2`Fw2g^FfLM_WkyU delta 523 zcmdmgkm=%nCcXe~W)=|!5J+NZ3EBLlxmH>XCgKegd7QfX?+#Bx2DkVaZ= zW}dB~jzU^)Vuh`-!RCc_p3IY9JIYMvaFU%o$!R5<22j#SbF;Iv9ur5juAz>uo@wkP zcdyNdT}>I`0-M}F^RgNl>KGYKmI_s5Gc?pOG>V-((P@&p%?CGd@(F>E&6)h+2rD+95NKE8O$I6sNohXrsms9Nxj8Rv zGt=ZhrU{c@F=cGN8TpAv6y`#m-29YOTlL)3#5{G)$p`uW!%g1&JpH3IA0v|pGa`H^ z$1jj#WSIQ1S%0$s0v-j_0A^qShBF*2Y3!7qoM@~(dDVO#1(?&hj2Rd}SQf5~fniDG rT-%8<@*s68D6R&&TmwbjqXGs71Cxmg5|jJG_$IGhAi!2Q52OG9jEa`O diff --git a/_downloads/679acb9da15a2bd0f1cf78d5dea6995b/00x__n170_run_experiment.py b/_downloads/679acb9da15a2bd0f1cf78d5dea6995b/00x__n170_run_experiment.py index 2258aa08..51b6d2c6 100644 --- a/_downloads/679acb9da15a2bd0f1cf78d5dea6995b/00x__n170_run_experiment.py +++ b/_downloads/679acb9da15a2bd0f1cf78d5dea6995b/00x__n170_run_experiment.py @@ -12,31 +12,31 @@ # --------------------- # # Imports -import os from eegnb import generate_save_fn from eegnb.devices.eeg import EEG -from eegnb.experiments.visual_n170 import n170 +from eegnb.experiments import VisualN170 # Define some variables -board_name = "muse" -experiment = "visual_n170" -subject_id = 0 -session_nb = 0 -record_duration = 120 - -################################################################################################### -# Initiate EEG device -# --------------------- -# -# Start EEG device +board_name = "muse2" # board name +experiment_name = "visual_n170" # experiment name +subject_id = 0 # test subject id +session_nb = 0 # session number +record_duration = 120 # recording duration + +# generate save path +save_fn = generate_save_fn(board_name, experiment_name, subject_id, session_nb) + +# create device object eeg_device = EEG(device=board_name) -# Create save file name -save_fn = generate_save_fn(board_name, experiment, subject_id, session_nb) -print(save_fn) +# Experiment type +experiment = VisualN170(duration=record_duration, eeg=eeg_device, save_fn=save_fn) ################################################################################################### # Run experiment # --------------------- -# -n170.present(duration=record_duration, eeg=eeg_device, save_fn=save_fn) +# +experiment.run() + +# Saved csv location +print("Recording saved in", experiment.save_fn) diff --git a/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip b/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip index a57c29cbe00b8e50cab4ffa315d4bfc2ac56ed55..7f94d2d8b7eae8b2a0a4da91d92e0f3554573775 100644 GIT binary patch delta 3194 zcmbtWZEO=q8s2ddFiA*g0tq1`nK%t=2gf)LIFQ7l2-0#ugF`|DvU9$TJ$5!{@4CC| zK+-lJRi&PEG%X$4QSYljBUMnTjqnevch@6Da8*yBqtX>3u7}k7(f+uPoJw=m9Zk8} zwOM;9{dK#twe!w1@4R30yz|fJR-9NWSnu7Rm%o-#pS@=zN2jY zdPyf2Qn}JS}z@j&a95tfZbozVO>YDH$x7Tc8vn%~{ zvvBwrH;U*MRvl)CS&R*@xp@>%Ew02pJ9^Cb;drE{4zHQ_Cu`b|n6g1G?K*%1!Bsfi z)rHr1zSbv_rCsBtEIYtO`A|P6MUWCuonz@nxiZZ#7SB9sIm-S(7<~xZC{5$3=l9Lh zyvWh0ZeUo#KHQz;NY6(gTNQ_CRa{@Ly?e^dFsIyj=ESgC70Klni}T352{e(nYe0l- z*$d1``S3N6oW$=I>%P+3tHK9Q|5q0zd(T|3=*m~CC49Z9F|YAahG{%m8Pf~yHSkPB z7WOQKUHN_2EysF>ao~%$`Zb(yX;re}(-$grT#0JyDKxs+VP=>PGroK0sAj8gX#tSW zc7VZB$j9QMq`(1QPH@p4Jok0$q|0xC4RA>0q!1Li81f6~cpOQ53<*j=70^KXEu-3s zfY8$B)bLqMW|5p28bLuNz=tT_Ni`}+R$xX7`H)|bku1|<4hTaTgeF)e3Q$PIhLA+Q zb%M%fx>7(&?5UjSe zIepZM5DdzrFe(N!X2vC6P^^B-A>9Sl))3?czr_x7^pN>ZPk{AC_TMQcTUv5-a8A#!AE|}p9 z*C77$jjBEDUNIq4k&zv;FgE?EA0ZkMYg$H+PI|3+WX`V495LMcRt^62W|he=;H8@{ znUUM>bZkRz{F4Q1Asx8X!Jv(t9tUevm&(C=S!c`DlJO2YAf%K*f5=Po1C@xKh7!f{#t>cc(L*lhlJ+wsC#_`;Ww1olZTcUOJ#T?I`pM zs$5NDYQ7x&CTmg2&!|Q3yu*EHs-)qsBv;pg9yRQ#`bscSKx1ByFW$D_k9Zv*BN4C% z7hheU5^BL7bD1Ct&5A~6Y&)ck&MIWC2wWm_{a_Qh!U8v`u!1r2QXGt6?-vF5n@|1` z$yuZEI-4snW+|gO4ZAD^V2q+p*54LQ5n)MzWr>S5OijcYeAeK630lk36{zEb| z07_C30sK49;unsgXmB_X=OivBdqR9rvBr=xEQUO+Hp9{ott%7);jrRqak{pvL-L9Q z%J8AL)=tLx;E!bw%SEHC#tO9MtKD2ePqom9qPQ3wrp>$63HOe(gNDxE)Reoi&7thjktB%{JjN@-Fd?hN92BFXG{i|Tnpvj;sGU*85#}Qa3DJv>nv?W& zAg$KQYD!u4BBUahSb@1a6GR>KlU0xJ@-Yl{m7#z{@sJ$Rt-#R^B#7iq`j7W^9*I$*S&S* z{Ij4K8gGaUA%_OogFyRxHXM5-WnKYhXF~##5Dn)fQI%@uK*qc>bYN@+_;m( zCg{e73jn?%03$wXT~&=?@Bln0cx?>%X$AMs;# z8WUrjdKT|krooNGeHbKrCe5~tG2;F)BgXiT!!YNViCLUsI$g-v+b^q=wqlXNt5sn_WjJ%Zok zZfD%Q$IWxVR&_})ojz2osWh<`82zy-y`H)*y`A55r3|4fWw6ESjOY8CbuWhT?uBH$ z0Ivc;^#NJlgr9;5cP*F(5 zRcUN}xf&Q(Dy+7rF>GrK?-KY9x8E)BzGi)cyQ|y3wvW@dGB&2!(h39ip~OXv#>ium+0-I$TAGENfsD0bsL37aGpRALCdB z+Gz#Op5rq{tO$)*k1uMCQvlf1m3QXSf*9zrtj(~eK`XJDTVkn5$Fc(Y7=TCtzRemv zB2*$IRKoer?l=h2rmj@=Tmhx&o&)JoBx(1~tQZ39-kB#2@9Hm#qNMpLigBa%?d3TL zEr--8M;s8)UDrwjQ=e&|M%5U)n~Zf>rV9qDN?_`zY^mbsFH>ZGGHQfA-(wM4v(?+$RwTjbAI^oQfZNyS^tAD8rI~SiMWNTv@Zg#(U))mE!gD)BuGj75ct7pImZF%g z6r8=Ff?sZYkt#cy#9q!vjexnaetuh>rMZ25^*i0AT!b#=l27vRrZ~xkR^?-7PV8jw zQ16oar*Dr_Hpg>_M}_V2ydSFY-h>F5Uunrm3BFDyvv4Lnx|czYW#NtRhVB{pmz^hE z8nUkxi)1t#-!oAHjeciu7v~R;+x%f{{KwwhByEjw9~nsntLZYU2VXf@@R*SeGjSQY zIa95QG9i|mqfCfko-LO;X0L>6EpI)k)~hprxV4}5!G0}C^5W)r)jI9PYgGA>4)FN` zoET|=xew@^G>3{sd_tWZ4|SNHRY*A5?$;sY*O5DB+!P0uP}G#rAr|8$QJT|+Xo%8} zte5)>5b7t_9Jv085rjH?N0TD@I@-2#9#^*k>eVY`(G5}2O-~?REA9zxY{mtN`=||7 z&CXtK8%w)5>QTyxf~%VfZMm7L*`;qaFnn8Qr{Bh!EzisEwDa41T$jyKv63lc$_75>repw4o<58uFxzn|qrATmvdmqG;m2UGb}2MlSCFj%YN^zDgiH!cPu=kXbJ$R+*9g6! zFbo_aw*q(_qtIJArL+m6YcTlYMdI9njf_I&sM66BMAu;O!wFb2RzfD_gDABOA$lK2 z*I;n!J{+Aekcl1CQmHKeiuorwpNGRi3zaf5KgkOVG1;cVjIpj3tFqPM{}Rdxo}b5v z0Ym-Fb90Fl%8A6r4k1G{VT1;QZ?427)r*Z`Tjj7IRHCqTRAch18SCdtQK*;-IvIru X+oabp`QCwxNMIL!I`PJCOn3hV{aE>O diff --git a/_downloads/872178a6cf309a4de1aa7d759d171a7b/02r__n170_decoding.ipynb b/_downloads/872178a6cf309a4de1aa7d759d171a7b/02r__n170_decoding.ipynb index f4daf2ea..cf64d3c5 100644 --- a/_downloads/872178a6cf309a4de1aa7d759d171a7b/02r__n170_decoding.ipynb +++ b/_downloads/872178a6cf309a4de1aa7d759d171a7b/02r__n170_decoding.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -143,7 +132,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/89f5ff349033ec3c3d48bcfb2c3c3de2/01r__ssvep_viz.py b/_downloads/89f5ff349033ec3c3d48bcfb2c3c3de2/01r__ssvep_viz.py index 91d9ad50..22da3b6a 100644 --- a/_downloads/89f5ff349033ec3c3d48bcfb2c3c3de2/01r__ssvep_viz.py +++ b/_downloads/89f5ff349033ec3c3d48bcfb2c3c3de2/01r__ssvep_viz.py @@ -26,7 +26,7 @@ # MNE functions from mne import Epochs,find_events -from mne.time_frequency import psd_welch,tfr_morlet +from mne.time_frequency import tfr_morlet # EEG-Notebooks functions from eegnb.analysis.utils import load_data,plot_conditions @@ -59,6 +59,7 @@ experiment='visual-SSVEP', site='eegnb_examples', device_name='muse2016', data_dir = eegnb_data_path, replace_ch_names={'Right AUX': 'POz'}) +raw.set_channel_types({'POz': 'eeg'}) ################################################################################################### # Visualize the power spectrum @@ -87,8 +88,14 @@ # Next, we can compare the PSD of epochs specifically during 20hz and 30hz stimulus presentation f, axs = plt.subplots(2, 1, figsize=(10, 10)) -psd1, freq1 = psd_welch(epochs['30 Hz'], n_fft=1028, n_per_seg=256 * 3, picks='all') -psd2, freq2 = psd_welch(epochs['20 Hz'], n_fft=1028, n_per_seg=256 * 3, picks='all') + +welch_params=dict(method='welch', + n_fft=1028, + n_per_seg=256 * 3, + picks='all') + +psd1, freq1 = epochs['30 Hz'].compute_psd(**welch_params).get_data(return_freqs=True) +psd2, freq2 = epochs['20 Hz'].compute_psd(**welch_params).get_data(return_freqs=True) psd1 = 10 * np.log10(psd1) psd2 = 10 * np.log10(psd2) @@ -139,6 +146,8 @@ tfr.plot(picks=[4], baseline=(-0.5, -0.1), mode='logratio', title='POz - 20 Hz stim'); +# Set Layout engine to tight to fix error with using colorbar layout error +plt.figure().set_layout_engine('tight'); plt.tight_layout() # Once again we can see clear SSVEPs at 30hz and 20hz diff --git a/_downloads/8d83acdbf2986ad81d4d9e035ff593ef/01r__n170_viz.ipynb b/_downloads/8d83acdbf2986ad81d4d9e035ff593ef/01r__n170_viz.ipynb index 47acd03f..00fdb815 100644 --- a/_downloads/8d83acdbf2986ad81d4d9e035ff593ef/01r__n170_viz.ipynb +++ b/_downloads/8d83acdbf2986ad81d4d9e035ff593ef/01r__n170_viz.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -33,7 +22,7 @@ }, "outputs": [], "source": [ - "# Some standard pythonic imports\nimport os\nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\n\n# MNE functions\nfrom mne import Epochs,find_events\n\n# EEG-Notebooks functions\nfrom eegnb.analysis.utils import load_data,plot_conditions\nfrom eegnb.datasets import fetch_dataset" + "# Some standard pythonic imports\nimport os\nfrom matplotlib import pyplot as plt \nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\n\n# MNE functions\nfrom mne import Epochs,find_events\n\n# EEG-Notebooks functions\nfrom eegnb.analysis.utils import load_data,plot_conditions\nfrom eegnb.datasets import fetch_dataset" ] }, { @@ -123,7 +112,7 @@ }, "outputs": [], "source": [ - "conditions = OrderedDict()\nconditions['House'] = [1]\nconditions['Face'] = [2]\n\nfig, ax = plot_conditions(epochs, conditions=conditions, \n ci=97.5, n_boot=1000, title='',\n diff_waveform=None, #(1, 2))\n channel_order=[1,0,2,3]) # reordering of epochs.ch_names according to [[0,2],[1,3]] of subplot axes\n\n# Manually adjust the ylims\nfor i in [0,2]: ax[i].set_ylim([-0.5,0.5])\nfor i in [1,3]: ax[i].set_ylim([-1.5,2.5])" + "conditions = OrderedDict()\n#conditions['House'] = [1]\n#conditions['Face'] = [2]\nconditions['House'] = ['House']\nconditions['Face'] = ['Face']\ndiffwav = ('Face', 'House')\n\nfig, ax = plot_conditions(epochs, conditions=conditions, \n ci=97.5, n_boot=1000, title='',\n diff_waveform=diffwav,\n channel_order=[1,0,2,3]) \n# reordering of epochs.ch_names according to [[0,2],[1,3]] of subplot axes\n\n# Manually adjust the ylims\nfor i in [0,2]: ax[i].set_ylim([-0.5e6,0.5e6])\nfor i in [1,3]: ax[i].set_ylim([-1.5e6,2.5e6])\nplt.tight_layout()" ] } ], @@ -143,7 +132,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/a74331ba25f1e4b93e2ecf2b3efd4a13/02r__ssvep_decoding.ipynb b/_downloads/a74331ba25f1e4b93e2ecf2b3efd4a13/02r__ssvep_decoding.ipynb index ae8385cb..e5c4128b 100644 --- a/_downloads/a74331ba25f1e4b93e2ecf2b3efd4a13/02r__ssvep_decoding.ipynb +++ b/_downloads/a74331ba25f1e4b93e2ecf2b3efd4a13/02r__ssvep_decoding.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -125,7 +114,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/b1193b749e4caeff4dbfdf0c20ae6801/visual_ssvep_jupyter.zip b/_downloads/b1193b749e4caeff4dbfdf0c20ae6801/visual_ssvep_jupyter.zip index fef1d03da1c250c04c4f62b2f7d7a88f27518aa1..329fe4c07e6afa6d9220ea27da5afb65ce1f3efd 100644 GIT binary patch delta 830 zcmbtSJ#5oJ6t-X55D$2-@*94>HNG|q9syXyJi`w21FFIGc&mS31EOQrI#x*FKx%*jKBm(PA% zIm&a~Q7{nK!~LR?3CCCT46I|KcO?%|&1mZwBU__A7kR={Si9YaR{=!GgwMp_;@rdV z)pCBiP{&f7ADaZC1thtD29x_#B zc?A@~QtaMyE#r}=Lfy8ZSjTnjdd<=zXc6?d1XO@r$7p*ya7hL?`tY7)I33rgNMk6W zSe(3wD4FaHO`YljLDVNKJ>&4yJH$tfm>p0OT4jP(kt_eh8`dkYvwH=wg($eC_Z*)B zgiQ-0Kpj9WvrVH-%X$J3Ar1jui?)I9S=a=IV>_gw6JY;77XjEcZ7Q`a(*2nE}g z=j-;?*7im%_?VV?CH#>drcbdSnv4vyYjbt%dArD!h>wMEoPGZ%<27(xjIl=JX*A#> zX~M=o3S=rwbesT3gU?LEa*1eKoI~5S`jX}LaHF=#r*i28d+bqvvv8vUUkUVTA(xqs OylK`yu{E_3S-$|bu?Ld? delta 648 zcmaFY&A70SQ6j*bnMH&F1ePx zLS|l0W?t&#g>2~)=WuOaYh%tNrB{|&T$-2@UtC<4TA+}bTaaH=q5$Sh{%&WmS;Kx3 zGlyP5QEG8&UdiMWPS%q%9QilPJFjA7G1oIRntay9ToUGh4L}FvvrbDYk!N54Vadt5 zt}+wNHSsuO;~Z`|xIv;YgVq5J(pYJIex?iq!_3Lw*8=jE#~`fHxzP2s0!VU_=63H3P$v z#{Ha=^<33`Py!ej$Pld%l}j44G#MBS42$9+X(GNXvq~?spfWEhz?+o~q=p#?uK{UO HHxLg1tXjQ! diff --git a/_downloads/b1c28450479cda89a20f021d24809e55/visual_n170_jupyter.zip b/_downloads/b1c28450479cda89a20f021d24809e55/visual_n170_jupyter.zip index b8bdedcb0c10966914d5dc96167e367a0ad6bf33..b7f9a84aad4f999ae9aca3203f15703b262bb2f3 100644 GIT binary patch delta 910 zcmZ{jK}-`t6o#jzAR=Nyn-*Guu}Ih|S=*9Q8c<1$hCm>V1Vh3$o9*sUhP1Pr-Py%z z)Nt}>%y98aNW4g*_M|rt8gCrD5KTOK)tiT2oZYU)9-Q4|GjG0m`~Pp=yrIAKSaG>4 z6ansdbWqv&`02)1aR>mB?M4^buh2Yerq4ExV^3qDSur!qu10STtaEN3IX~xm0hsG$ zFR!h*V56Bn39#?k(glcXhHg@L4_mfUU1i1T=_gq!3CCesS4<5OrG_Me?i0roJO zV8?}i*xB3wjJ7EN4)?Sn)+{8~1HnjF>&|pkkykR@fq#Plq%)@Mb+qi@2O>7=q+DF? Q?s2&;{(RxzfxJ8W1B96$u>b%7 delta 696 zcmeyKzp+F-z?+#xgaHIf7+OMfeL1J-i!m_hPyVFfJXt}sPe?U4v7{g;za%F!Ng*>Y zCo?Z~vZHMJ#Mzvis}y&#Om<~f-`uF?%`=(VSe(&tvZAphlTqyCIO9cpe))N+Itt1f zhB^vHnwpb@WhSebNKUpl>1WX~&@-KU%|wG$$4JjKc5|WFE=Cq}Jwv0(`V#iM6M?R% zcl{UiQ-Xov=R|Q2JdW5ndxAJzBVPefv;xki#vIanYYH@L9eqMZD5`0{< zRY=RsNma;8%uSu_A!9tbK}MRbpeQr1L}T(pIq}T_vUZF-An)iE6r~meoj#dO)@!r2 z=_+`jn@<)n=SoD0eqa(11}6##v7`}18yFVFg99eMEVD{4v!F6BDZrbNNrV}aeo$f# z7<)hj2TK|g#3sr}=^(2|jW7lVIk;*Dh9!;t`jZ>Xl|)$CK%&e*co|50Sb}%}Vvx#g diff --git a/_downloads/b2ef39fb5bc5abfa985af6266c497c15/01r__p300_viz.ipynb b/_downloads/b2ef39fb5bc5abfa985af6266c497c15/01r__p300_viz.ipynb index 451b208c..5339b78f 100644 --- a/_downloads/b2ef39fb5bc5abfa985af6266c497c15/01r__p300_viz.ipynb +++ b/_downloads/b2ef39fb5bc5abfa985af6266c497c15/01r__p300_viz.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -33,7 +22,7 @@ }, "outputs": [], "source": [ - "# Some standard pythonic imports\nimport os\nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\n\n# MNE functions\nfrom mne import Epochs,find_events\n\n# EEG-Notebooks functions\nfrom eegnb.analysis.utils import load_data,plot_conditions\nfrom eegnb.datasets import fetch_dataset" + "# Some standard pythonic imports\nimport os\nfrom matplotlib import pyplot as plt\nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\n\n# MNE functions\nfrom mne import Epochs,find_events\n\n# EEG-Notebooks functions\nfrom eegnb.analysis.utils import load_data,plot_conditions\nfrom eegnb.datasets import fetch_dataset" ] }, { @@ -105,7 +94,7 @@ }, "outputs": [], "source": [ - "# Create an array containing the timestamps and type of each stimulus (i.e. face or house)\nevents = find_events(raw)\nevent_id = {'Non-Target': 1, 'Target': 2}\nepochs = Epochs(raw, events=events, event_id=event_id,\n tmin=-0.1, tmax=0.8, baseline=None, \n reject={'eeg': 100e-6}, preload=True, \n verbose=False, picks=[0,1,2,3])\n\nprint('sample drop %: ', (1 - len(epochs.events)/len(events)) * 100)\n\nepochs" + "# Create an array containing the timestamps and type of each stimulus (i.e. face or house)\nevents = find_events(raw)\nevent_id = {'non-target': 1, 'target': 2}\nepochs = Epochs(raw, events=events, event_id=event_id,\n tmin=-0.1, tmax=0.8, baseline=None, reject={'eeg': 100e-6}, preload=True, \n verbose=False, picks=[0,1,2,3])\n\nprint('sample drop %: ', (1 - len(epochs.events)/len(events)) * 100)" ] }, { @@ -123,7 +112,7 @@ }, "outputs": [], "source": [ - "conditions = OrderedDict()\nconditions['Non-target'] = [1]\nconditions['Target'] = [2]\n\nfig, ax = plot_conditions(epochs, conditions=conditions, \n ci=97.5, n_boot=1000, title='',\n diff_waveform=(1, 2))" + "conditions = OrderedDict()\nconditions['non-target'] = ['non-target']\nconditions['target'] = ['target']\ndiffwav = [\"non-target\", \"target\"]\n\nfig, ax = plot_conditions(epochs, conditions=conditions, \n ci=97.5, n_boot=1000, title='',\n channel_order=[1,0,2,3],ylim=[-2E6,2.5E6],\n diff_waveform = diffwav)\n\n# Manually adjust the ylims\nfor i in [0,2]: ax[i].set_ylim([-0.5e6,0.5e6])\nfor i in [1,3]: ax[i].set_ylim([-1.5e6,2.5e6])\n\nplt.tight_layout()" ] } ], @@ -143,7 +132,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/b6763bc95c5e2ede1c4ce186cc0c606a/00x__p300_run_experiment.ipynb b/_downloads/b6763bc95c5e2ede1c4ce186cc0c606a/00x__p300_run_experiment.ipynb index 45c048c9..d2c71277 100644 --- a/_downloads/b6763bc95c5e2ede1c4ce186cc0c606a/00x__p300_run_experiment.ipynb +++ b/_downloads/b6763bc95c5e2ede1c4ce186cc0c606a/00x__p300_run_experiment.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -33,7 +22,7 @@ }, "outputs": [], "source": [ - "import os\nfrom eegnb import generate_save_fn\nfrom eegnb.devices.eeg import EEG\nfrom eegnb.experiments.visual_p300 import p300\n\n# Define some variables\nboard_name = \"muse\"\nexperiment = \"visual_p300\"\nsubject_id = 0\nsession_nb = 0\nrecord_duration = 120" + "import os\nfrom eegnb import generate_save_fn\nfrom eegnb.devices.eeg import EEG\nfrom eegnb.experiments import VisualP300\n\n# Define some variables\nboard_name = \"muse2\"\nexperiment = \"visual_p300\"\nsubject_id = 0\nsession_nb = 0\nrecord_duration = 120" ] }, { @@ -58,7 +47,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Run experiment\n--------------------- \n\n\n" + "Run experiment\n--------------------- \n\nCreate Experiment Object\n\n" ] }, { @@ -69,7 +58,7 @@ }, "outputs": [], "source": [ - "p300.present(duration=record_duration, eeg=eeg_device, save_fn=save_fn)" + "p300 = VisualP300(duration=record_duration, eeg=eeg_device, save_fn=save_fn)\np300.run()" ] } ], @@ -89,7 +78,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/b6fdaf0dd3351d46675abacd38607890/00x__p300_run_experiment.py b/_downloads/b6fdaf0dd3351d46675abacd38607890/00x__p300_run_experiment.py index 8edcdbfd..754f5340 100644 --- a/_downloads/b6fdaf0dd3351d46675abacd38607890/00x__p300_run_experiment.py +++ b/_downloads/b6fdaf0dd3351d46675abacd38607890/00x__p300_run_experiment.py @@ -15,10 +15,10 @@ import os from eegnb import generate_save_fn from eegnb.devices.eeg import EEG -from eegnb.experiments.visual_p300 import p300 +from eegnb.experiments import VisualP300 # Define some variables -board_name = "muse" +board_name = "muse2" experiment = "visual_p300" subject_id = 0 session_nb = 0 @@ -38,5 +38,7 @@ ################################################################################################### # Run experiment # --------------------- -# -p300.present(duration=record_duration, eeg=eeg_device, save_fn=save_fn) +# +# Create Experiment Object +p300 = VisualP300(duration=record_duration, eeg=eeg_device, save_fn=save_fn) +p300.run() diff --git a/_downloads/bffc7389ff14934d31aa05a911f58bf0/01r__cueing_singlesub_analysis.ipynb b/_downloads/bffc7389ff14934d31aa05a911f58bf0/01r__cueing_singlesub_analysis.ipynb index 8beefb4e..1dc876ed 100644 --- a/_downloads/bffc7389ff14934d31aa05a911f58bf0/01r__cueing_singlesub_analysis.ipynb +++ b/_downloads/bffc7389ff14934d31aa05a911f58bf0/01r__cueing_singlesub_analysis.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -33,7 +22,7 @@ }, "outputs": [], "source": [ - "# Some standard pythonic imports\nimport os,sys,glob,numpy as np,pandas as pd\nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\nfrom matplotlib import pyplot as plt\nimport matplotlib.patches as patches\n\n# MNE functions\nfrom mne import Epochs,find_events, concatenate_raws\nfrom mne.time_frequency import tfr_morlet\n\n# EEG-Notebooks functions\nfrom eegnb.analysis.utils import load_data,plot_conditions\nfrom eegnb.datasets import fetch_dataset" + "# Some standard pythonic imports\nimport os,numpy as np#,sys,glob,pandas as pd\nfrom collections import OrderedDict\nimport warnings\nwarnings.filterwarnings('ignore')\nfrom matplotlib import pyplot as plt\nimport matplotlib.patches as patches\n\n# MNE functions\nfrom mne import Epochs,find_events#, concatenate_raws\nfrom mne.time_frequency import tfr_morlet\n\n# EEG-Notebooks functions\nfrom eegnb.analysis.utils import load_data,plot_conditions\nfrom eegnb.datasets import fetch_dataset" ] }, { @@ -87,7 +76,7 @@ }, "outputs": [], "source": [ - "raw.plot_psd();\n\n# Should see the electrical noise at 60 Hz, and maybe a peak at the red and blue channels between 7-14 Hz (Alpha)" + "raw.compute_psd().plot();\n\n# Should see the electrical noise at 60 Hz, and maybe a peak at the red and blue channels between 7-14 Hz (Alpha)" ] }, { @@ -105,7 +94,7 @@ }, "outputs": [], "source": [ - "raw.filter(1,30, method='iir')\nraw.plot_psd(fmin=1, fmax=30);" + "raw.filter(1,30, method='iir');\nraw.compute_psd(fmin=1, fmax=30).plot();" ] }, { @@ -123,7 +112,7 @@ }, "outputs": [], "source": [ - "raw.filter(1,30, method='iir')\nevents = find_events(raw)\nevent_id = {'LeftCue': 1, 'RightCue': 2}\n\nrej_thresh_uV = 150\nrej_thresh = rej_thresh_uV*1e-6\n\nepochs = Epochs(raw, events=events, event_id=event_id, \n tmin=-1, tmax=2, baseline=(-1, 0), \n reject={'eeg':rej_thresh}, preload=True,\n verbose=False, picks=[0, 1, 2, 3])\n\nprint('sample drop %: ', (1 - len(epochs.events)/len(events)) * 100)\n\nconditions = OrderedDict()\nconditions['LeftCue'] = [1]\nconditions['RightCue'] = [2]\n\nfig, ax = plot_conditions(epochs, conditions=conditions, \n ci=97.5, n_boot=1000, title='',\n diff_waveform=(1, 2), ylim=(-20,20))" + "raw.filter(1,30, method='iir')\nevents = find_events(raw)\nevent_id = {'LeftCue': 1, 'RightCue': 2}\n\nrej_thresh_uV = 150\nrej_thresh = rej_thresh_uV*1e-6\n\nepochs = Epochs(raw, events=events, event_id=event_id, \n tmin=-1, tmax=2, baseline=(-1, 0), \n reject={'eeg':rej_thresh}, preload=True,\n verbose=False, picks=[0, 1, 2, 3])\n\nprint('sample drop %: ', (1 - len(epochs.events)/len(events)) * 100)\n\nconditions = OrderedDict()\n#conditions['LeftCue'] = [1]\n#conditions['RightCue'] = [2]\nconditions['LeftCue'] = ['LeftCue']\nconditions['RightCue'] = ['RightCue']\ndiffwave = ('LeftCue', 'RightCue')\n\nfig, ax = plot_conditions(epochs, conditions=conditions, \n ci=97.5, n_boot=1000, title='',\n diff_waveform=diffwave, ylim=(-20,20))" ] }, { @@ -141,7 +130,7 @@ }, "outputs": [], "source": [ - "frequencies = np.linspace(6, 30, 100, endpoint=True)\n\nwave_cycles = 6\n\n# Compute morlet wavelet\n\n# Left Cue\ntfr, itc = tfr_morlet(epochs['LeftCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\ntfr = tfr.apply_baseline([-1,-.5],mode='mean')\ntfr.plot(picks=[0], mode='logratio', \n title='TP9 - Ipsi');\ntfr.plot(picks=[1], mode='logratio', \n title='TP10 - Contra');\npower_Ipsi_TP9 = tfr.data[0,:,:]\npower_Contra_TP10 = tfr.data[1,:,:]\n\n# Right Cue\ntfr, itc = tfr_morlet(epochs['RightCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\ntfr = tfr.apply_baseline([-1,-.5],mode='mean')\ntfr.plot(picks=[0], mode='logratio', \n title='TP9 - Contra');\ntfr.plot(picks=[1], mode='logratio', \n title='TP10 - Ipsi');\npower_Contra_TP9 = tfr.data[0,:,:]\npower_Ipsi_TP10 = tfr.data[1,:,:]" + "frequencies = np.linspace(6, 30, 100, endpoint=True)\n\nwave_cycles = 6\n\n# Compute morlet wavelet\n\n# Left Cue\ntfr, itc = tfr_morlet(epochs['LeftCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\ntfr = tfr.apply_baseline((-1,-.5),mode='mean')\ntfr.plot(picks=[0], mode='logratio', \n title='TP9 - Ipsi');\ntfr.plot(picks=[1], mode='logratio', \n title='TP10 - Contra');\npower_Ipsi_TP9 = tfr.data[0,:,:]\npower_Contra_TP10 = tfr.data[1,:,:]\n\n# Right Cue\ntfr, itc = tfr_morlet(epochs['RightCue'], freqs=frequencies, \n n_cycles=wave_cycles, return_itc=True)\ntfr = tfr.apply_baseline((-1,-.5),mode='mean')\ntfr.plot(picks=[0], mode='logratio', \n title='TP9 - Contra');\ntfr.plot(picks=[1], mode='logratio', \n title='TP10 - Ipsi');\npower_Contra_TP9 = tfr.data[0,:,:]\npower_Ipsi_TP10 = tfr.data[1,:,:]" ] }, { @@ -177,7 +166,7 @@ }, "outputs": [], "source": [ - "events = find_events(raw)\nevent_id = {'InvalidTarget_Left': 11, 'InvalidTarget_Right': 12,\n 'ValidTarget_Left': 21,'ValidTarget_Right': 11}\n\nepochs = Epochs(raw, events=events, event_id=event_id, \n tmin=-.2, tmax=1, baseline=(-.2, 0), \n reject={'eeg':.0001}, preload=True,\n verbose=False, picks=[0, 1, 2, 3])\nprint('sample drop %: ', (1 - len(epochs.events)/len(events)) * 100)\n\nconditions = OrderedDict()\nconditions['ValidTarget'] = [21,22]\nconditions['InvalidTarget'] = [11,12]\n\nfig, ax = plot_conditions(epochs, conditions=conditions, \n ci=97.5, n_boot=1000, title='',\n diff_waveform=(1, 2), ylim=(-20,20))" + "events = find_events(raw)\nevent_id = {'InvalidTarget_Left': 11, 'InvalidTarget_Right': 12,\n 'ValidTarget_Left': 21,'ValidTarget_Right': 11}\n\nepochs = Epochs(raw, events=events, event_id=event_id, \n tmin=-.2, tmax=1, baseline=(-.2, 0), \n reject={'eeg':.0001}, preload=True,\n verbose=False, picks=[0, 1, 2, 3])\nprint('sample drop %: ', (1 - len(epochs.events)/len(events)) * 100)\n\nconditions = OrderedDict()\nconditions['ValidTarget'] = ['ValidTarget_Left', 'ValidTarget_Right']\nconditions['InvalidTarget'] = ['InvalidTarget_Left', 'InvalidTarget_Right']\ndiffwave = ('ValidTarget', 'InvalidTarget')\n\nfig, ax = plot_conditions(epochs, conditions=conditions, \n ci=97.5, n_boot=1000, title='',\n diff_waveform=diffwave, ylim=(-20,20))" ] } ], @@ -197,7 +186,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/c8168bec3b40b12111ac87ce4dfeac13/01r__cueing_singlesub_analysis.py b/_downloads/c8168bec3b40b12111ac87ce4dfeac13/01r__cueing_singlesub_analysis.py index fcee0f83..b3b4cf69 100644 --- a/_downloads/c8168bec3b40b12111ac87ce4dfeac13/01r__cueing_singlesub_analysis.py +++ b/_downloads/c8168bec3b40b12111ac87ce4dfeac13/01r__cueing_singlesub_analysis.py @@ -14,7 +14,7 @@ # # Some standard pythonic imports -import os,sys,glob,numpy as np,pandas as pd +import os,numpy as np#,sys,glob,pandas as pd from collections import OrderedDict import warnings warnings.filterwarnings('ignore') @@ -22,7 +22,7 @@ import matplotlib.patches as patches # MNE functions -from mne import Epochs,find_events, concatenate_raws +from mne import Epochs,find_events#, concatenate_raws from mne.time_frequency import tfr_morlet # EEG-Notebooks functions @@ -73,7 +73,7 @@ # One way to analyze the SSVEP is to plot the power spectral density, or PSD. SSVEPs should appear as peaks in power for certain frequencies. We expect clear peaks in the spectral domain at the stimulation frequencies of 30 and 20 Hz. # -raw.plot_psd(); +raw.compute_psd().plot(); # Should see the electrical noise at 60 Hz, and maybe a peak at the red and blue channels between 7-14 Hz (Alpha) @@ -84,8 +84,8 @@ # Most ERP components are composed of lower frequency fluctuations in the EEG signal. Thus, we can filter out all frequencies between 1 and 30 hz in order to increase our ability to detect them. # -raw.filter(1,30, method='iir') -raw.plot_psd(fmin=1, fmax=30); +raw.filter(1,30, method='iir'); +raw.compute_psd(fmin=1, fmax=30).plot(); ################################################################################################### # Epoching @@ -109,12 +109,15 @@ print('sample drop %: ', (1 - len(epochs.events)/len(events)) * 100) conditions = OrderedDict() -conditions['LeftCue'] = [1] -conditions['RightCue'] = [2] +#conditions['LeftCue'] = [1] +#conditions['RightCue'] = [2] +conditions['LeftCue'] = ['LeftCue'] +conditions['RightCue'] = ['RightCue'] +diffwave = ('LeftCue', 'RightCue') fig, ax = plot_conditions(epochs, conditions=conditions, ci=97.5, n_boot=1000, title='', - diff_waveform=(1, 2), ylim=(-20,20)) + diff_waveform=diffwave, ylim=(-20,20)) ################################################################################################### # Spectrogram @@ -132,7 +135,7 @@ # Left Cue tfr, itc = tfr_morlet(epochs['LeftCue'], freqs=frequencies, n_cycles=wave_cycles, return_itc=True) -tfr = tfr.apply_baseline([-1,-.5],mode='mean') +tfr = tfr.apply_baseline((-1,-.5),mode='mean') tfr.plot(picks=[0], mode='logratio', title='TP9 - Ipsi'); tfr.plot(picks=[1], mode='logratio', @@ -143,7 +146,7 @@ # Right Cue tfr, itc = tfr_morlet(epochs['RightCue'], freqs=frequencies, n_cycles=wave_cycles, return_itc=True) -tfr = tfr.apply_baseline([-1,-.5],mode='mean') +tfr = tfr.apply_baseline((-1,-.5),mode='mean') tfr.plot(picks=[0], mode='logratio', title='TP9 - Contra'); tfr.plot(picks=[1], mode='logratio', @@ -242,10 +245,11 @@ print('sample drop %: ', (1 - len(epochs.events)/len(events)) * 100) conditions = OrderedDict() -conditions['ValidTarget'] = [21,22] -conditions['InvalidTarget'] = [11,12] +conditions['ValidTarget'] = ['ValidTarget_Left', 'ValidTarget_Right'] +conditions['InvalidTarget'] = ['InvalidTarget_Left', 'InvalidTarget_Right'] +diffwave = ('ValidTarget', 'InvalidTarget') fig, ax = plot_conditions(epochs, conditions=conditions, ci=97.5, n_boot=1000, title='', - diff_waveform=(1, 2), ylim=(-20,20)) + diff_waveform=diffwave, ylim=(-20,20)) diff --git a/_downloads/c9435ee669e38dd54bad678a26f2c8c1/00x__ssvep_run_experiment.ipynb b/_downloads/c9435ee669e38dd54bad678a26f2c8c1/00x__ssvep_run_experiment.ipynb index 0be78638..faf9ed5e 100644 --- a/_downloads/c9435ee669e38dd54bad678a26f2c8c1/00x__ssvep_run_experiment.ipynb +++ b/_downloads/c9435ee669e38dd54bad678a26f2c8c1/00x__ssvep_run_experiment.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -33,7 +22,7 @@ }, "outputs": [], "source": [ - "import os\nfrom eegnb import generate_save_fn\nfrom eegnb.devices.eeg import EEG\nfrom eegnb.experiments.visual_ssvep import ssvep\n\n# Define some variables\nboard_name = \"muse\"\nexperiment = \"visual_ssvep\"\nsubject_id = 0\nsession_nb = 0\nrecord_duration = 120" + "import os\nfrom eegnb import generate_save_fn\nfrom eegnb.devices.eeg import EEG\nfrom eegnb.experiments import VisualSSVEP\n\n# Define some variables\nboard_name = \"muse2\"\nexperiment = \"visual_ssvep\"\nsubject_id = 0\nsession_nb = 0\nrecord_duration = 120" ] }, { @@ -69,7 +58,7 @@ }, "outputs": [], "source": [ - "ssvep.present(duration=record_duration, eeg=eeg_device, save_fn=save_fn)" + "ssvep = VisualSSVEP(duration=record_duration, eeg=eeg_device, save_fn=save_fn)\nssvep.run()" ] } ], @@ -89,7 +78,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.8.18" } }, "nbformat": 4, diff --git a/_downloads/d57fff739827ca575034e03b51d68a54/02r__cueing_group_analysis.py b/_downloads/d57fff739827ca575034e03b51d68a54/02r__cueing_group_analysis.py index 9053412a..535d8db3 100644 --- a/_downloads/d57fff739827ca575034e03b51d68a54/02r__cueing_group_analysis.py +++ b/_downloads/d57fff739827ca575034e03b51d68a54/02r__cueing_group_analysis.py @@ -123,7 +123,7 @@ # Left Cue tfr, itc = tfr_morlet(epochs['LeftCue'], freqs=frequencies, n_cycles=wave_cycles, return_itc=True) - tfr = tfr.apply_baseline([-1,-.5],mode='mean') + tfr = tfr.apply_baseline((-1,-.5),mode='mean') #tfr.plot(picks=[0], mode='logratio', # title='TP9 - Ipsi'); #tfr.plot(picks=[3], mode='logratio', @@ -134,7 +134,7 @@ # Right Cue tfr, itc = tfr_morlet(epochs['RightCue'], freqs=frequencies, n_cycles=wave_cycles, return_itc=True) - tfr = tfr.apply_baseline([-1,-.5],mode='mean') + tfr = tfr.apply_baseline((-1,-.5),mode='mean') #tfr.plot(picks=[0], mode='logratio', # title='TP9 - Contra'); #tfr.plot(picks=[3], mode='logratio', diff --git a/_downloads/d8a61e599ef859175e65b658c0800a68/visual_ssvep_python.zip b/_downloads/d8a61e599ef859175e65b658c0800a68/visual_ssvep_python.zip index 259fa313924dc254d0094c13c518407aa0d72a14..0636338d3da81d8be24b4bd25fcd50f212c761c0 100644 GIT binary patch delta 730 zcmbV~&1=*^6u@V9W04#d7T03^z@ZA0EKAr;s%SN!f*@3IVWo;vhM1isW3$OPGwHhP zp?J|hARyi4KZ`bR+m73B7#n{>Q zA7&qwgH!eGT>9|n&5!+g0QTpz&*%1(?A79~vdEp0A&A6o;6xD#u^clZv=^v%Z-SN~ zBE-*bpe+TeBNDm+W)63T!X8jpYC|G}cwnQ_l5UwN)d+i@w7VViO8U-hHX_Uj$Ab8_ zdFe82L95ViGU~1i8#!T!bX8?y&}~DHlV@FML&9P=5RZ}7fp;co&2Zx(OC-U$m)2^{ zrl1>sp7p?yj>d^hc>Z+G5cYkZ5WS$9Q>r;bH4Ez1|Hfvo+u!CkFTg&L@UAnC6A4M= z(}+MBLrMKW7J^5gL&AB?;fTrrCW1yjbmK7QPaF=zKXHYF%0g*))K56k^s)$3E1ps{ zR5Fo%t#m9eI86K2&4s`9Evou}+}eAp08p&6=~wIgr{$f>2}p-5<`S+_kvL($zk0iu z9#q;DGt;Z>YCZpyS<9Mo{frPBgc&@EG`+V{sWxl>S}6T#ovs3q9$&hM4>uA3jk3|E u+xwT51pqo-j&VuD8+2l@@ht90#)rZiopjfN&0}+gwwBND`T1q3xcvsS66at5 delta 508 zcmbP{{WU{8z?+#xgaHJWGqi-hM9hEYndEVH;YF(Olck-KoFrtONrC2#cYppUE=$p^1toYG5)j2%;#OCCk8I gU|19niLdyw%qqQt$^dUxHjpZ2AUq4CCmDly05ax|;Q#;t diff --git a/_downloads/d8e5dee04f613448d49984a260dabc0b/visual_p300_jupyter.zip b/_downloads/d8e5dee04f613448d49984a260dabc0b/visual_p300_jupyter.zip index 0e5821befcd4534d4fefbe496e61d7a64734827c..2a292f833c1e2a6bfba7f2231c6a1fb6ef8e3ae9 100644 GIT binary patch delta 770 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