From cfb374ced84b22c4faccd10dd62dac7055905f82 Mon Sep 17 00:00:00 2001 From: ehennestad Date: Thu, 21 Nov 2024 17:37:31 +0100 Subject: [PATCH] Add uncovered types to ecephys tutorial (#631) --- tutorials/ecephys.mlx | Bin 357315 -> 359611 bytes tutorials/html/ecephys.html | 1977 +++++++++++++++-------------- tutorials/private/mcode/ecephys.m | 260 ++-- 3 files changed, 1203 insertions(+), 1034 deletions(-) diff --git a/tutorials/ecephys.mlx b/tutorials/ecephys.mlx index 60f7e85f360a6f31057e34a0f7529727a912e1a6..accdd482e6329ceb7bec72d2280164032d2ce92f 100644 GIT binary patch delta 20981 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≠~hNZCH(1=6& z#3ZmhI4>Vr(ssW2cD@{L7n!qo`0WPs}@oinac3XCPj2}J5EA;Wxc*+?+85W;|0 zL(n>FC=_AYs?^f*>_F#;#bs7l8HUSX#UN@MnYo)QP+~!Up*&OHW%YGB-oj1gCht~( zic)tYoV7*f-6_Fv9!P_oz$6F=ygK9viQJ)QSYc&k!RZ8408E*z?#w{Rkzqc0qpDdX zCYT#~zp&bZRT9;?iE7a`p|c(tk{*tCnJd#l5M)Qzd|=_FOR9T43K=Wwo(1!wb{E+f zm9~y|^a&|{93l*?MU^7UKSXZR8_3L>0-|9lx@Dy`&K6)STu22#gmnY(3>TDovT#)Z zGo>{ESkUxY4N#JR}{;ATmwq>OSidw?1!`ynENUgj zG(@$iW)gvkxGcg93@|y?SR_=7iE*kLhZ#D?@Byz8Q0@#3efRAAG8lqxtBo-aQs#&Zd>9!1g?&^u<2jX-X$C6Gf{q-NDPmiA2aimlW1utAE*Qe%m}F(~*BbmL;P4RfU#!B4eTql5Z(J~E<<`b4z#5%Bbv{>m#O9?zsDzP;xj(|{WMNz0lLbAtxdpeX6gAGjU z^(hfDqoR<`La$OQu)sgTrV!o+B!L%nVgj;43V}5teNZY+t`UOA**&mM6X0($iVUo! zysf$sf4M3-h(!udBueE=(&hCQ=g0^t0`w{%Y?B4XgjWm@UL+z2IVzinA99+(3uvw+4TfZ*SW^hc=!!wRx zp`w^;?_gRqpDXb#4zN)wPBk+*0ad{0JWu?}C|C^yqb!NDi3$KVlkvO_4TeP6${>YD zfTW;MSF|T+0c&omn*5VwuZUb~hqNyl1Zz_eR^oX^%&kp`7I}cFJaIP=)g~3F?MMMg ze`};!A(cfI_2F3*2I0b3;J9M`b)w7C5Dvi;>6k&00iN?DEp^B^^gVHb|Y1~HUy=B5Oqn{o-*3WJquCeaS!6vN<2Q^jd z8B_rq_@OMhq-I^|jKtkaX>FOs>}Xxke}8KTT2wgJIyqm5@m3yU!1M(eOA$LSBLjz8 z`12;2?8sy*h_oljJVDIhl7bu^6oIy-+9LC&RTz_VDk`?CO!5a%LuV@7nM4gpoBVl<)B)}u>KKe;d^; zq)8Mo0YkX;~_nP(J+t~?6n*x=LJqGtaKC^ zq+$YM_{^J_R8Lx*U=|QsB?R>-7#FKY1D*6`c%;$ryr|4GrYsCz=Xm@HJX0A~K`Bg; zpc$3}=dFC~u%Vt2FGQThxFz)iMc3B84zHf(m)Rz}AK! zG9$JhpvDuyb7392#{nixo_C1TGwsaN8(5JOX<#!DSSY2ksGK%&dZfAzBkpT&bvAwyYRufCO34iRbfWthx6%Pa-Pb z$re*@egh6#}dm4E>$RW&gI9r-)Kp|IAmBnLrehZs#}wQXVvu|es1 z<(Xg+&~Xxjws7M5XB7BOvTb^|o;kPz$*i`~p9uDq!lAG||mh+LP zbr^|73W>*SLdh_4Se@e7b}BMWKok}u5!6o4Mn_gZf2_SQsdk4j%Cyp`*uixHCj%9F zXvA=aN@c#5WqJ>?y@CU%2;2{x*bKL!VX&;?JP42QaA5IffWurqD0{MX1WU7qSu853 zW-Ka`jAY>SOu>PJ_(_>~L0zRMP1iibzRUsX5E(I`0Ew9pe-lcAwZaoykQ;ANdoH>c z=Sacff5ezvWfih3lcN)m4-Hc&6%@81H%Zu!NDb}=1nP3Ynis_O4R*f$z#Uc%#59rH zOb9`mxPc-OqZ|+vCTppaL^PxgGeTErKJegm<_I9DUU_&dfBPWgY{AGxm<**`;BXO* zLqb-@D{x`uNjeE=t(C!R6VO`WIl>UAvC@x;e=2{6(mumTyYsBGqVtXB4g$$}a=-|@ zzYbm)3%TtRbzDaN8f%>j>^P4Sd@G zi?rXC`aC}`@@hU?-!A9(epp1WKKMzI3cDuoC_~7+f>R)PfKGBa&=U!_Jm)sT1;v0T ze+;$RrsAX?RTWh&Z>)v+4j)Ci6Ihh+s@aDPQpjYoRt? z#5C|9kN0w52pnsNQ>_a!FiJvHF2Y(2tnTJw24r#JAOwf#vg3I$ILRO*Gm}*stS>P* zHqx4YSjU}>pXT*f%fotgq9w6-5l5pVfBs>35?v*JV#yP%Iv%DDLP`OVHWoVM#K0C} zpg6MC)CvWK5KILc#$W=D%CR_+CqwjzV4{}-<>&yH4rkptCa!pWF>C7`e0w~rnuqYz zgs1{+NC7`E71$x;>qzshNZzXaJr_W^2xpi@nQg{_g1IUn<_W-7bn5+$pC&gmfBQY6 z3Wy=JRU5tqRHZPLkopj5eR{cNp!wa90~_o znV|N7L;3^089GZf<|L?$bbq6cVk2oTUBwqU`@`CSDy*DkYi zUeN$g)8@g`76`#6#p5i+FF0_+e?m+}gb|W-`2U6S43Afymow3tKfmW^CwKowWZd-g z^l`7BryqVKZqtuMKIvHxZF`?s{K$u!oI+>D!&q#KxQ5|V9**IW7IygkqbH4nI~P9b zQWX*20c1XL&8R?$6Mp$*@cgwVLm2-_cNM9|98Twumza?mT=OnLVd7Xxe;#C#>mWsJ z3mQNg!DK){&<&@~-W$i!gJ7q>zcVIp z*rp8X*kTaBZGi_)l22*$?z@I6+_;!=@Sr?tg2#;`9NFthH&;CtX>4M=E@2J2{%%0= zPr3tr{1gVE)dwvG?%kiCe^lxie}8iPDL%c5pXR$+&Tp=7ZZ8_gHPYS89b0(jm*IyC zkDncn6nFgV240ywHBjS@rv^gZ@z6lSJ02Ryd*?%q@^_ECamB8u29DYNRO6?B16qNOn?Gf0Hpg-`B*??p+bd z^pU$V$h4hg*~Hz>;WSCO^PwgrcRtkQ=kC>RvUS%}gWTOYKew9(MsdAc7WneftTHHp z-7C-(#Ll@j-Lc2EWV^Gcrg3(!Qqx9z2w%Tb7K~bKCqp#_w};FW<@fRX()8vY`yx7Z z4|2+W5Bc15@g9=LfA1p@n-1UoRMYQ!^p(OMPc>Yy4;|aGWp7UIqk_ky=~y?sU#yRf zSMA2D?jM22`%hHg$K%ew&(PS7$GbBHj(qF*yJ_@XIo7q=ieO{1$n%JdSe3|f<;b7( zYKMe;Mi6*cgUNh$D<`*y6l`m-hjKEzHCS7>-B3qXbmv2Df30`J1=)q&1DE~TjVb&+ zCH@H*Fr_`%XYBNMt+CMh{I%HE{mYhKh5pYQAaW8k zwe9a*8{ahy>A6USJKq~~_4ll2%kBkuZiV6at@S@#uD##k;xL!~liu^Y%W|?&WNetr zIMk1tjNLgIe`hvMrd{4+GMs^VxRYap-*Ucg_k7Fd`If`mJimJ~b@OBnkP^er$@tBb z==Y<<-*hr@_hj7W$%Mn3Oxit}w0SZINM?EGWWr`L3kOJMW%pz@tD=|>Z!&e~Wa4Jg z9QPB=6S#2@s>tpJ5^=Nmjt9tBb~lnpn`e{V0nTPOe@@7oWnQrdIGf!-q4>?S@dr4Y z-AJKq78LaWm8;zi73yY6YnKmhHoLJx-Lf}_DARU>1#7n0dgc)2z;3)?&1PKMuOHle zc0&ehHZxDZerWS?d$<-%-ZGy9M09R9Cg@p!o91H=aX!0If!*RRv3vSUe%tx%#s$`G zk#Ft*f90FojSOsiX5)Mg5F5DN*uZY_@Yq9i@wnaSz;1E!*hBR4xIOTJ-@-rs0FkxZ z10VP;{IjRyij%k#F#E^(gZF?Celue2*AHzA{T>ivi-XICc!2ZS144u?kSOd2Avg(t z5G3jMKpAlh7sdnBVtx;l5x1c9xF1UAB*I~Af8icLWQ%Wa$Rs$lE!+c$q_}xL`2ZES z-vfx`%^tCS{ov-a2N20ywAdlK`1~F~q-+rxi7Ppp3dL31UCP zk&}oAA=1MhK%{Qb%7^IN40~ikZ1DxUL-YlPJ(3}|_?r6lgPYH82;uBzdh6E@Za%vq zK!mfKA%wFBXlRAq5W>055W=~~qT2Kuh`=E;?tL@f4Kmyo?~U8jd&4>8y=HteNdj!w zWmxCu^Yd@}^Q-6o7lUz1hjB^)hjB^*hjB^+hjB^-w{c1Zf*}O+OXjJU_iF_yf6Gq8 zFc3xe{R+!_$Bzb7tR!84x&jG_AP_stnYIzJW7&qZe~%kzC{T%|bCij) z(Dt^(JYyJv)qT_2O^F}t6?pr8Iw7e^TkU+f6f1J9hy|py8Ta@ z6V8d?HP5BU<;B&B^e9MG(m!2Rvk$jBZ3WB&3Qm@|0M#D=01?EO5pe}K9GlRll3_0Z z05aGB01*HH00000009610002lBbQ`x1w8_3QjN8qYj5L5lHdI+I$jKHV`V-38rxZC zA-^^Q%)=Nv$=wBkK#?t}V~VY1lh!Cffc+VFe{X-uRaLW_O^LGTv1EH^V!*aUHv3Us z@2W2T?eCw4A-m(T5;8hjZ`GUYj7Po>@=GPjiD!^b?mY$ zg9-j0(VwfB{#_@NkhAgeofn?0Cn5>?dIN9#>YIxp?UU?x)U8r`g_ZwT|{+RpVn3oUA)ns9Sn}KKbrFPh%N)iN}5t$v~zFJB7IeRM^F* zB=&qBhH2=<>>}iT63fwG0`LlDf5L9kM8?7kaXJZ2sxYOCC@3AdLCYTc$L%oTapWcZ zOh!o#-=SXxz&JuW+V0=j zZF(to7S1pXex~s7-pPL7IX%2Q+&{g4JaZ>|GZ2a;s~z{C*}gd3dHvcQ_nIdOpa4rp zEE#b2{-;xRDMG%Y8657m&o3|b3M*f*87rE}(SGaT{Oq({n28=c;EEAauW0DjVXM7& zcDUyb{T5oQ6^++?eQ|KG(>$MDs_?z=n#Y2#YUsng({}T;UD)rpmscwqZU69pVDIeW zu&~hUk+|jTMhqXYM)UJPjCy^!zq@;R=#Ku;>-TxU+HvenRt4kTql?4S*7>PB?m1VY z5AqEudzQVO15aGhWX{`dK(?cnJDHziK@)ib{&IHOIy-Oe6iDl%7IHN73RiyEZl7MX z4tL$5+kU2n(ZHY*^g-WSfCmeI1l|5ANRIPn0l;s$7e{O;WB$#9aQuO=Jv?fio}TU( zr3a^NZC|}%Mpp%_lMzcK3u#*8ftN6n!U^=Rm=|;A-FYHJ4qIOp9_+tv?;PwE@Zeqh z=571b%Gi~$yxpU-{mW*74O~q?|A_LT?-^O^OO2u$*T^)-hE*>~)4T+KMX~Gow+qyH z{;5ox)7?(#X^ld!jS@}y{;>vC70S8BgQFc~D!g;WH698I(?UC-*vVq0)Bvr5TAX}$ z7IOd)>v<{Al|UQ`N?FDWS`MG#$@~+bfI#}Gvm2l&O)Q{QQ-@=imS}v`tKNsNX}2yU*v?5b z?lvqZYz&fN*Z}q!%Q}8^x#k*CW77LRG1b^^@UrmU4-W|usbo&k%h<+?a zdf!EW3en=GQ#Vn5s^30 z42ZZ?X>Ag2f_8{c4P=13!%@9L^t$B}bZ>(E>ubO0$OF!WRL)VY%&uxBlO6*021JPX z3_>{!D+V5bPDaGPP{y9VX&=qe3!iw0PwaQjy~!?oo#~%&u7fxScLCrWKW?J?vBvgl zY-b;SYizd(zt9;P#s4ECY`YPnjNI6A`XoV=c*Bu@>cqSUkc@nOf7j3_^t`vfuK6WP%9yZo=La?%&r_%tL@j&>5xOP-yB^@W}5Q=O5l2x0>}*z1eDQ{IT_|+bf{YFTa$jYN zrfCMqC1AKI=()_j8e7jhFY5|;IjzE|O)x`$&}SqFu9XU{zml=j`0F4T_ByDS%BXQZ z0n`&d`C%U~&D`Fqh_w0>KzaazN%1>mA)uX5uqe=0iaLJ$@Sn;@tv$ZyX%b#u&%dp# zXE7Y{zyk@kvJt|J1XeZxXro#Qnl}RKT+74SP9My`QTbR8Rh*U~eQdnOiV1tAAbqBP zLO2z~joZ)Xi5s6ZnBr1=kP~wFU&9a@0Z>uNIavpjvCr2Fw{>eTNn*R+0T=y2vTl0c zYaZzV3ysDiNCvje{_BI1Hs~rs=Tkcr{m8cMdWr+P<0TJxVRD1(GfhjHkg|gs&OnUb z1h!@TCNMsa!qVLDOPA)?0w`JwQj}DGUz?C3o5=^Q04%LCYbz5bb@o%{J?wI7hTaIa z4i**<*O@QFbV%+MR98s)uf!Ko!FWoC*8?xQRbWExeY*x<&){psLv_Vtx&t?Mzg=6) zY21Yv+@u|WU|u8>Uk|322E_F2=w5CQmn`0PZ^6iD56G4N3U{hFBgdSi-rQa6#vW?R zprdcprpLs!!&N=WG{XNu{aW@C48U(@u(1ziYok9dU<*b=hoiYbKrYU)mH{Q}h2U*L zVqiXv<94#;SY8JL{wT*qSk6Eojcy}3j;5Bcjn)jsixBug9-JQqA8%%VbDsC8A&Tjx z&d!I3#@X3dYTIru;m>pzIdHZzknt#3!{0fuNTeq0Eij_bg&Kw4B=jodqRf&CYLNTz@~v*%7OyMsI18m5X~{)K^c>^pNklm^sYa1W zJzk0z`+I=@R8ios8a!5iW%%PhMd*hGb!v_&^Z2Rc%x2CAz`Z#-;A1(aJObSJOhJJy zi@6%fXeP+`RpU;bwV!dj5LrwRfV^BDdfLfp2HR$wWqKcbu^ciPab}@TqKFwEvyPQv z+&rFg!n`2XYcuLB_q11LjnO>Gt^yZ!`&lv;jA)@+|h^SSMo) zZtK)4u+^+PCy?5I_tl*^$t%x^G4otwI`4J44l>gS8Zjprr1d0T`uXQ@n4 zGLWIL7m85J&lAd{Y&1Y8Ca5m-U~Awzc}4W}z0SN+uhv$7Wly%-5U>)yZ#IuZ9`%#K zoWAQKsAJQu?bg=DRwe)0BgpSPka?br@n|erV6YinF{Z9$0~rR)^Z%I&od&9nD_@4# z5hx=;8rw{eJiTxU5LtD|ac5!3@z5ORea4XE&N4!dRml~X)lq~OWnqpSYuv;?^c?^O zn8dkey=iiP$rR{wQJ_lNbud9_1M~FYr*7JR|673$V=oG#&DM@?=2CQle9Jk_6j^uD zNF+%8Xp*SaQ|(O_u|=|Qtstx8vOvJcB%EaKqSVcb0tEz=<%IPmH!6LB1Sw2W!FTi- z$(?m)9354g-g^sj2U|V|o=ZvCGlwtp%sO+W5FogJyqe;3rAc|tqf17Id(LNQO(EN6 zz!=|CWGiXEA*vFXMb+gTIIkQ>${UVCO!Ka82Jp(#_Smw zAXVCg^q|q?H?RWm7-eYj3=@cD%Bw#k)7kVT@77EP)CrQTAo3v}QX-zgotBsaARzYzF?sXSaKIzi7L+RmtpaE#2x}TMK(r8H}KrRJHNe)-pNU84>{&JDMiXxk;c4&LeGq z%nnos4uk8V8WcTvR$Hbpb?6UPlqH4cCE@gaqZPnn3f)z+R-Y;H!dCdPcB#GMnzYw4 zM(>+b`=^41>-OZV=2@!6b=Mbxad#0M@2eH^i0!FXA>_V;9HvZ?1-!lDZegKvQia`f zJ6W=S!YRx!b0UutmA;eCa&7WHbHMVp33!ZJjGYz`=iX$!4qKnF$kZ)RhHDWDg>1@z819ezwwDlNJ zR4hK#ST{}bWNdV{dw|b93g0Jx2%9d5KdjK94KIDz44Hv-S8A`V$-B|pO$oyy3iu~( zSVk8AXT*BGHi1e)g-U_AAW^#ROfr@XwMQ8tfNMHx1|$!-NYHc>uQ492<7$?!oaWU1 zoc39=jA8HD6V%8irr`}lgKo^dTa`0@Q@4exlSP8kr%Yv+RdJp)5n)|_hyFVm*g6_) z^W>(@t4s*irD?sNM}Dgf#_#U$F7!&gZkDxqTBn3LIkaM@#LvVy$zh;68cl1=y++vZ z3-I6hD6*-UFWS;*8f%_Yu-8fAI}VM)kx^%~`%Z=GZcUC(?i+EQF3#MnrmU%6!A8ka z&B@PvDdu3@3pV5r&JIt1&yRL?ow8!)ifaY_5UI~G<=wuPEK%Q>ifxou8kR=DzC4B2 ziHz%zqjD7sggi(p^m^p=FR8`0-o9E^acvvXlX)N*?nE-tWp#$$M90O)UX)ZAKt*CS z;t3@TrUpH*HKjjiUFSh9n07A>X-2j3 zCYMVKRwoaHU1L71Qyh?FVjksBsQ~cPp$L)61qk9~c>%OykJWqxpC?}z3xHQFJ5M@2 zEv@%piXGMfQw%l`lP)}}~@&(2`$Z#s8F{Zfaf=e!4!GDAj# zdBP&0;9gDY_VX&jCuhX#Dcffu5OVWK@r_)oi9e=KO49UdW_uFO6dH zinW8F3{=3aZGlaPC9ajG%H=>(oolm2E=*r^}lVV~TaB1i{yue5IWyLyj5>={CrCVTbJ*AzQ7x7{0R_hoS?1rbdtU zjy`EF+cTbqq!XbvVicoT-U*Z<PHjgD_BGs1UHqcI9) z(&?FUxPQ^{O|=b3AK!swDOBjU(NU%YwAI#z$PhSxB%frJ+pVh$HCz)j!q978iwWS@ z3qkD^3Jhe@U50Ex4pUt!x`$^$(cuE?)yG0tZfTG?IUhe<9GH3GLnUyPl&E{sn&NX7 zLxsjOVODwD@pT(0YdsMHboPRis`((;P^RTmw)aF#BE zJuytyQAWvUJ;5^~h-w;(ESd(AMKYQ4Ef8COok2?ivy4JrL(2La{{652HER36|Mh=N zrEx4%DnC=0L;8Rshlj+^wK#iQn;m z>dl6`Oedh$@_^h4dF1ZV@hvlj4q6@MA+0486}F?OIVl25Dl2TpS&&rn<)f;VK^Rm8 zTPVe|XaHf{<)RaP<;r7NdhG6A&9UA0L}cn|e69kCFJon034gMFOY}h!=Z-@7r;lPD zW<7`u7gV@1N|R%-0?)LkDDOjha5+KCL%zg~R}CQhK)F zO|@mwj2MH(uKZAAsde}jBgo67BXj2Yf~p@s8b*cg9*18G1?Mw`5bV2gt)t&waYG1Y zugjg<*0P|1+t=dtR4R9H@o5B#^Co=4=u&n{#JJh;*vZD$3y#>>cL7@v*(-&Ag9cNt z2d)5Wx1S{|X6L#%CmwnrF^t|{Hu97bV6RT{LIyhX`b@vZaE?;_Xsz7|8U(YDv2=)a zIMB&LbG5mL^olj56G-z{??pOs+|5DEvL#IJBNbtTj&xZ>O5-S&XtP;{SRaI5SxGKK zY_Bl-t*g4B*pQNiUfk#U4VQF($n#_S9hIDdCNlD;Q;a_cNTKxRrB~CuBCPB;N)zYp zbhtj9t$;dI%+1^%`byVIM7+aJuy#G7`DQs0196Lf1U%jM`~lz4=f!s117m&nz!(T{ z6GEOjdDb^4&zwg2Svegw){SNk)j3bl)+1bBazNO=@7uBkd&Olh<*xvLufSy7-j>W{ zK>tD-ux@;+jF=VR(FY|bnX5x57|xuGemIrj;;)mmJBLy-eqfJGWaUz#36M{W?^z|5 zn7=NSUa<-~;uu*6Fb523@NBw9c4kDSBdud^Qp=sYif8q?vP1`=X;QP-K&V^PD3EVcm?HCk(X&UEh+Ie0csR-XTsoP*($iPkwT>Pypuv|w#hb0;{Tgc> zx0+j+Ml$U|gFZgWvGbx&d-j9szDqBd_T+ha%pJXXn4@(gu^*kap2?gv0vx=}rDe>M zG)DKF_KG^0vU&!at*yF~SNnVGkIy)lA(D_kf}`AY_D}auFVCBQRzGyExE$pz_u`1c zkKZh0BgHP9MZC~ctvmmzr&`Yrk6Ndvr~8hwX|5CwCi5q-X3N6(pBu49G9-ME%ePltV!4_Ch@uA( zi`&nV6D`=J2j4nf}o!mL?;0f^J@y-a)o%^!(C9{wJ<>!m@gP-QB_2P2*^`U)g4iDzb)628P^7Yq;|M}NHJ}HO) za&kPscsV~io1cGud%d~3-mFiKFXo%sA7-1G-1=#Dem&br^Y1pZ&HUtIw!EI5A0OSm zetbTAcX_=TzQ_ya$4ApE$Cth9_T_qgvYOA%-W?y^xOTk0I$vxy^VQhkYIS*axoR&s zF;Bzs(d7H_(XD5XINqVp->p`&cL$qySM#qAXYKQ$%;bN3elcHePLA8d*#q8zz z{JYIcXmNbhFOIE;o|dzV`N{I_%j2W|>9|dJesXZ|59gbIo*led&0l?ecrn|Y&t5)z zGe5uj%jMPe)xn?NzWn3je13Sa-n=`Pm%qAPZl1iIFJ8adJbQV0es=f|uQ&fZKGZro znzaiDZx?@?HwSHobD80M{p^b`4j%GPM)_h~~)fsNzscEGiVxJ$w4yeDl!dl3tgy^LOjT`V)3}@Or+SuV&{T)8*JjW5d~t)64Vo`RT|E`?E7U zng4&ZIGumk6txfGy7_9+)W$95+;2R0yXg}0@3Zyh;LoB|zB>5hVl{r=(IdOstY)Y4 z^YiQT+3Lmo>dm`{&G0?_yqGt7uS9pR_tyd1-(tDmEH>98dH!>`==x~$?%?v(!8h*? z{>0mRPIR$+@I>F!bg~5U!0F}ktc%pW6McVQSE4Xw9mQ&Z58n6m&1E)_f-+SKt zzMfX|tNG^cu;15YJ^$NvQ_XUF+ne9pba8QgzL_oOqJ}?e*z33R`PGX}Gqw*hE!yXg z^LKCM|?D7HhK?keL&84*8*;pH_=H~)1&R$$yzdT=@&PG=L<;y>O`=@8tJhjHA zqyKukoL{dlmruo#rl;0DHP(K)uhG;Osp(&w$=LLZbv`_V3DDX3U`O_&5L#VcuLKti zM&tdBw>Ejvaan_&AG9{2Zbg2tA1Hq{Xnph*l}FqWD$|7o#$=&*-> zi)LO0rGE-kgT6$GU7o(#(;%|dVkv(XXB`$kz?$CZLp+mVG7kk~BA2I)=bMH4bofr# za<(~r^Ko4&TZ-Uw`UXs|ym zUtOLYzn!iBI$WBceX}_G_r-F4@=BIZ{NQc3Zan|HO}qB5;)4CSt?6c*X4*Tl6#s8ZR zFKr7qd>tv~Zj&rdNG8v=_nq{2^``wRVgN%FU@c&I`MM2aan=XK3kP?fIlmm1ZQGO6 ze>YpbUR_>a?P#*4MK>JpX?AO9vzPPpd!GK{?&B|BY@~IeK^6 zyZaoyd+ptSMDOlK?`{ia!sqB6l!>3CcTgsMMDPAa?|utq^5^IslqsL1cTlE&MDO87 z@8K?G?8nIJy}c`C?8kq|>b<=;$`DCR49#FT*R!AIXWec-e|~5VzdFS0iMDl{BLr@o80GrlONvX zKjoVo-{kI4FMR$tjns>u|4k$H(x-fr=bQW;>gCV>rjdH(^S^&-q+b1$Zwh=>kbGvqN$4Q&SfI*4>sC`fnG{74>^1e5BcKs+3#9j zVJS@b`^)7<+8+FTalTwXyEqj;c(b{Bc678peKWt9t)I4(sN8&Yxf1_bzOG&$UCdTL zUSB;qy}Y;*4tTjZUu@nTIb+gc@B8;}E*Gcsga4TS?RtN)nu}-sAI{i1JKXx>_q2F< zIL@dojLzc-kN1{;oSmP)oSptSJ~@4gw~n^H_tW+CzlffyMFx^Wr`$^mK5^sO52o!0 z_NOr&(fQ{6F`YKC_l0!Y{Yf=Mm$zGSo%Pk?$NAmRPJ8#A(9WG;nAsBA8Hl|lvh&Mx z^R)Ql56pkld#x#{T`bPFZ_&1@0UcSiA@xUM>&$rHMpkog?p*c#?R{j< z*Y=1{{e3mY+}>AWf5f<9fVqu2C)X~9=-QLgW$Ax!Pq}yPhS|o{=ib|;Y}-9=`rEC` zZn)PjmXJJ$TVm*R3BmRk<7vR?xq*K! zU4U|DBA;{U^4I^!O!{&R(w}mlX2_#P87Nr#N{eE!UAVfSJ2S9w?jn;%TH8LBnsR?p z?46}B$lt)9HFO><&Ua#&&g?OCx;WdJ!Ph=_VfhJ>WlcL{`hL$3%aLOo#Ho(zqR%J| zGCe53TKfVBvATMyT{g!>9mPI-GrWJj>sBKd`Py8Ei=h)z)Sw##VIV;S7lb&dlAQW7rqFe{2u`1L=@J)R97xyYsG2^cG{~*9HvBM&=-i0k-1d*eqMTh` z3lzNT9Er0r|8&J~jUj<%%bgoT?#tc1F{G_rymKSn*Hyl6 zROP;R3@I9$Zr>QQE4EH=?3;hOu(x&QbVT>Y1~ox&vt`(`rN5)6%bqR6op;06E*nv3Xqo1Vc{4Cda+(E zuCC^r_06q0H}C!9v#*|gW&i2m>p@dDbEqeyrEq;sMn0qWG@kHSvtc+ot&OqWD5~>^ynBE&lj;Tin@kkS5xqtz#bF zD4yx~sg$a>lhfO&l%m580q+ju#HugjYl;j~$%2t*SCj%i>+KqKwnm(u@ijsMrJBv! z8uTmPM0U7JC@3iSvw+ z8$W)MWmWGLUB=?F0gG6jSk`~_jz(Epcv2TsmRorw z=)`P^1!O_zrD$vM*2mkynQ<9y%u3Y21#NM>VPeTDBWJ5Lcey6*Qr{i3)y{JXBUySt zXt?d21uGV-3!yTWk_9U|WryHEb8j-_yN+$D2&*nhOpx!S(=p1(*5I~tCFvlexx-Ak zs)TwFHJGZcd*FX(9B+zB-Wb3Rd2AzcXSKBnUwrY!7M15FD$hrsm5j<#CSox?gwB*W zzQR|7_d+ge1#x6GmCr;dwV$dgFT0F6tGci)x-zn10iSsnb+wB2lY_m(!NV3gil+#^P1BqfXHZ(Lt7=(UrYGWbR_^D=!V1WL2&<+`$gPDH{%#3xgfVQZ@^cn0hG0w3-J1D1C zk<0BW&rejI5xp}$pLNteLwH@(74}|rqukbEiP2Y^mvk|U&7ike#35tR&L`GSpq5fh zc}DCd5N1$Sl~RCtgM`$o_*4vwf(z?lfr?e6C8|Lw4*?Qo0xAQD1qY;6g7UakNFnwK z;#Yr_KT^_l6MzIBcLr^+9HLA>RI5Y{Dj^|6eYc=e9WSWg@)AmxLMWh&B-{gy2yEwU zp>EU#twASdTD*RsKn1GrIn?pClEp`;ya>Ev5~N(fg$}JcpxX(QB3a@cTy8|6YHP2n zTr7k)WayRTpy*VLv*VJh|zr0TIGPSs>prZk37 z3h2y518Cw1#8gF#zEt%k1_y>h=bfvfMPnf)g8$Wi7X9QRTn1;AeXH|zf`eWsd#`l<+E0S12Cjk%VxNl7CyK1 zJzmTiTAiFCwhGu-m7k1^%aP$Ec%Xk<7$|`_ij@G#qE9r;YCWi0UpxI(*al_5*F@k^>C5M1z^Y&1rwrx;Maf^#U|*yX@x?9E{_@n5M>SOCt#(hs8nV<-VT;H z&8TcdU`_Fb3OH4{#d}?`O5iQPT04h+svKI0ss{!9j^vG{(h8~A3RqB9tgr;V-f0*R z1VU_-ioYQUjB2h7QHLlBby9z7MfglaaI4CT6O|X?4T-EbTi2lW%X-!70*Jv1a1yFfzt;pn_JY7sfHw98Sjix`$S{9n2!YNeMqVTQ z{Yf+q-bB`Uix&z2O6cb!Oh$ry0a6qLBWvNoxuAHZ`Uv#E@G4YZwE$HWcqPLJ%Te7e zK|mNe@QOIQYQq>2%LL2>-i{&w4vSt_%+udDQC-t$6y>#IE1j5AwUZG674bv#HK`4& zR$~n|Ci;KcrH7P=9}a&f3s@-ycryD zNXsHDsj_VtZgW_p1k4}~B?2f0R^Kbnhzd9gy9VBQwEJO?Lc=)Vw1|JWrvnf(9v-`c%V3Lw-$E;7 zCs^Jh@(X{&=L`j(V7mi26>hNrEoCbaYRVX3r-9duxUtBSqFZF-vYSMHRbh(lM$7`O z#rswUOsYJx06sXFDnuFDtuVYQoTx)H>d%Rf;WC9n{!PDS4#ab*qs5z!H11W5-7O=wSo&?N@uabIF z6VQLpKt@YiC zfq;;~sZNXD!}Ki&%L;KsQ&#*oF?C1M>xlU-9%@5vqUk zs9A~xf#O@}cpbv4#xSX>=r;HYzZV__{kDoYVrB}yA~hKirWI=i_pqRx3hqkgf;y&B z4Jw`rDxRE2=Wwz_Kar6Uxh!g4t%tJCS=rZBouWWHWR$FGV-xkkA}j(wOfP!agi0Z5 zz-R0-DN$=-XxFOZ5bdQ=rU;Z*ASHhWj%_G@LN(;ilqr*Cwm4&z5kv_F4u^OqI&w&8 z_0Xrz!<#Y6R>ByDyoM?cgmT0K-mdcM)Uk!v$Mi*Duuc#?9Uaw54)Rrz49(y(AvY5~ zNO?fvTgx;V)NQMA8s8nT90rvu4k|xQveYjVuK<7swfepykW8KCMtLN*@h z;K-^zkJ6MFIfu;PEQ$w^kIH|Z;1^XCVrEcGhCEyaj1!+)sUIV=rg~ezIQ23nhRQJU zTNI%iNN4sCB3Obv$@eA|S(yWC3z*of5J6xiVFK7NzFWQ>%d4s`9LvR;eIoVw7SlTqN2TW0j zDS}4@a!~ACGl01`q^Kc=UmW0VWMup;3Q4R*>1tw88_MKbv{P?0gU_{N?VP+&kz>gK z04xebjiX3|QZ3R_B$VtjJ4?T~Olm#Ubq$GCwFx!j72)eLiA8@X))z~mT8p_dgRpag zm)Zgl0I1A)fX@RIs>>{(gd6JXB(;K+ZQ+A(*%Ru>tn!Uqqhir_w-RGrF;FeTAt|ua zg+c3pp$Wq)Bh#Z#5c-Hjw-^dSEyUY^jig6bL?LGc-Qp`)F+gR+sQOl19GD?!ctK;# z7J^%ls5PK@3?hHP+jZWJ{TEJUAfcv2z!Jt~9Sjp{O6U>L-Kenw?@)pq3VBn7KY>XL z^$;^fIHWTE8Bjt6m1rjUV&qwqfWO9M*k0DIrV50m4+<7V z$PBcKs8F-a5~RckDqxjm6mydHK^+P=mLx=X3LO zm5QvggGzrSQWJ=T@GJ~yKv26PEiFuk=q+Lur9juSbA!Dq7Ig;EGjW5>JY|w?2sFRS z$SfqEgr&vnLbeoMph=UuK4qb-F3@*Oi%;JC5#OQ@GP4x^^Oj4f+AhR^jD(}i_ z>1tY-=HMs!57gDd$8*qmtsZu4!dm8xQo@MRJn`|cSAZE|xM40C<^gmy!(_2NJ;VU- zR2@ihM7N|}k<-l)tvwD<>30a_dk$WNFt_YX73Dq(ZU`RxYF9@}iP)y0f z$O?ZjWs#zeh=1k4O@v;<4F;Q)%mk7^W0s(@B$9@dFSY@i#ClPHNb%2A-@@88Fb`M& zYmbd5t^{HZWVsSHFedm}85LEA+oQ?^_M=jwFayLoPsF+mVrDK--|~%_*?a~;xwDY_ zdM2Uzs4OJTG~&FGb)LvUV+&{W3bnG#?G7?$~`*o#tsaN+#Pai zDOmbCsM%h@7_^6+nen zXjO#0#QlV}HWgkaw%u7qrl9kL6%?TcYD|wR{>*?UYbpSO3i2b#2Z{({LMSzH6%jdy zO)(yUpv){DQ+okX=gK-Ug6D)7RUm&_ik2IQvHODw<$zpmEG)TaN*IL;DJXsjcCyD8 znF(ywm{gfL%iyL)Q+-BMEMgn3Ktt5AaN{&KO^F2rfe>a9$4Dt1b>xmYse&rwz#Rde z6~ooQ;3LuJp{>Q!WSy{jh_SE&M{gID2?a);BSJi}(hwu+U63&rNk&~oBou!`p+6!a zF)~dUkpKb0@V+vmrD9+Z&KF5$uD}9hp=ykwMuB-K)dc(%XZs$V7jDG!v}wWC8R24D zPhfr|mpsesYQzqMr~pAQ2T*$iq=hS4xy31fRSf1Axbw?-l=>o>I7vVX+D1l{C=tGG z#?H!&eR{=C7=I9mIu9K7nFt{|q|Mj-D|}BUwG*5Dyk}r7K?&1IJKHsQd^KI;mT82hd>4!m%5eJemv zf!-FQ3SE!t^^E9wOxzcmbU+oG`m&v@Hw+05$#ASP4YAPSRjp+Z{WV^RVXH+%g?qkP zUhM%!D*$X}X&ii8!S#RKQ=>?xVmm^~_v*ZOBX5gT8@4qu)R6oqE6q@;0W}l?cWxgN zZH@hiU?$N!43#1G#bai8_5gE0fx9SzCKe4&Ux?h`VG&yrDI-?}G~)T98ixrnY?E-XkckUQ;E)QGxnpP<+S()U797lw zaop&DI+y^jJO(YD5V=H!0cbA6MKLr_2jO16oPki)jTM*&z*KbPzF6p67_k7?Fu~<- zhsDBp>wp{r4>cP`1G(u7OIyu7dob*D6GlZgjEMr_8RUO;U{blMy_SjV%Xrk}7#N1U ziTPDY2nvSYiAYiyeRoT;La7xH3VXjIa`-Y+cy{m@%w(4Z!jmX0jFS+|Bt~EmZJ}un z*l^=D6p@(}j;MD}@J?Lv~aYR~$p$C}6RWeeOeYJX;5UN`o+xCd61yA z#5+#4R)V)8MhZl=IP(N2S+!g)U;#qQ0I=dxz-h;sC$h2#b#Os}axBBdj0R>1WkTpl z_#7(+m%moas0P9;5%occ1tmJ|9-A&Bpsc9>bZ38J9`Ck1Ln?xOEAqA_GFag>J1>A5 zJMZAf)il{dtQIFArsj!iaa4sEXBLtw9uT=ScsKGVhyWGjD8+XLuSM=>LAA+b;|o$+ zo^=@oLrW}Wgu7UU|L)Ow`Nr`AKrARsirfz;s2mlI*m=SYST*4MGYq?O<5@}ulUDuZ zSU7)g!64Pb^Wg1(f)Iz|b;GO>x0@$)-j1o$*6?VZM===LG$WxJ48us4fl5z*LnYB5 zc$Bb%p+Z}WtIf0P6e~mo-d%B%&=cIS0FES^BKK}kuazgE{)Esd&aUgVn98xNrbkpU zC3&htt6YbOmX-VkXf*Y-nMX zJ$7bum7`bW6C~o{gt3Wf7dp6LFf9-m9f>2vbdzxlKGT0W5ok;H#Jsm$0Ipv1^sF@}l|zGCEAOdfl_9Cm41GI={^ z3+svk0YH+3Bz8gIPs}k^6C!OKkLD~BUC;a_BH}DhFQ^Daw!2O$A2JVQAwq?fGR7bd z018Z!WeB`D>{E=)8~K1DIAncA6b7 z*VCl}Q4=a54dQv$Q!P~knj?3^t%MbYhde05#Ke-x3XO@NW8qGD$8)O!)f@3G4!8i~ z6EBxBb8M8tW`1s@^m+gbcuEGN@zt{!45yi7NJEa?UdhwU3RZuHRgL0M=)4hE z4rQ{Xb)xAM+OV`C;()n~{E27&G6d{}gLy28h4+v;9!eypmr-d)hXQ+FfiWFiR-UFU zXiZ#sG}LVyW~QHHWZxMP+4VA%nXE;&q=kx5ys}Io-WV~O$&#%Q%19#RLz!%2oslKW zXfn34j-fFaG4?Xn`linJo$q_jxt{yFuXC>ZkNfZIdBk|6+^&Lpyv~>mTyBAs6j^uE zzMV`?)^TOb&)G)12?)%Xa#DPAFSzgBfWX5CnAHN)_lsCol5F1A1A@^k9SSyC6UM(1 zuT|Pr8JbD6xZSC+*j*Zk^85ZnCu8THI zfNcHL9a6V>bNl-K&hS6@D2a*k5oj?k>0N)yy7teNgGxyw=2lW7+t@Jpi5evsTO-f# zZz*1|IfAo~_f9PHS6r{iCw`NRGZB=^LaoDmG9lCHU*TOmN)krha@HqZ|MgVIm=!_f z^Usqt1s_T?zDw}ygrqw2z5JMTB-G)&9G`zkR(Y8Cq*RSFTrQ=-sZtSspKq?s)!LKM z(O0Y|(%VHBgqOhdQ?VH?Z=#upqGpf|8m_e?R<1JX;#UOFzXDa(2}grpYfAHx~~7V3;>Y>C^C1So3C9I05ym>(cm!6CtEL zKL?7L@uii!n^xv1Ma59f{&^<}O?8OVtJY9ui!Q9j4uJ|rVeFao+KJFI_TIt1uXc5t zKJ|<7ZN&V({)&6@oM59=Qa}JCc!$w29bw^yOHhArcG30t%HyV!cR0h!LE`Ggh!o}& zuQt)VzeWQq9$sF!ig?I8X`Oy=06cq|eAOD3&5(&ZUc4#-(84*7=z=5l>5_hAaxQsv zs{p=imu7#C(p|k;GUsu|a;xB$0Rmr@YEWyb_{~lj=LWqDb-Rl%);~6}y{9viy1Ku* zb5d-ebThD^bZ~cmZGOA)fV($+@k2;j*Dh>#Z2-$4w52nJu=K;)nZ1UX{?~zu_&MzGkdxmi@wX&KZ^b#lH-7 zk>FZoTJMA(Un;sJ3;|*5u2J2}vzqrSESrZ%$fuGxL|GE!u5d<$Z%ni9 ztQwlAm8-Y<<1vP^+tDbXARCcqVXO&F^*Wd@4xXqkg5{gGd#e}8_*d*G7jR#t%F$6A zRS7!XiT=hm;nGN(^O9k38-*^>ktS`y+7QXF{5)CH`C(ywc*=wG7w5ayE*3i^gT##O zuCyB5Hn%(4X!t(V(d=$RfP&<}#&o~9p)SNbQ1pPdhj!ut!t;;Q^A+F=hSZJcdJadS76aFS_g$jHhNZn2R89ryg{huYNOrer;dLjsS`XH9V?q^ zPAEsU&c)0m;V%;#7yOrr=q4IM-|UoQH7UeutSJ&{PTQgN_!?z&p%wzxRGcGFMvh&y zK`YFoTLgIxiMp`kGx`*2P~rJnl?SM;eyXpLa|vyxh-d@HKBv1B#4i#e;${bz_#k1V z__CeR;YrkSQh&@bUlL)s%$&HzwgwLcNWZ}BRZ_`|om_t9^WOIB=e>%R0D%svniZv_ z(NYfJM-@%xh7ZNn-HvPfiRsUvx3uP<=pDzPq?7dC>3cUMMV17)(PombTCh^ zxlqV$P5u zI<~k-oxfZx)F}8X+|04(I-WzcJoL43{%n$~y*@}~$NE`q`?()#u3pozdMR^};3H=D z$^ITx0b~OkYEnND0}(JuR%13)ADMXIiBP__WC6*y{?HywGuAy7Ma;swC{J2JR9}bM z8Sd*(RO-5rJ@PT}9L3tverJhzq0bfs_19|^&w{N{Z%PVDl{x0NK~CKN{8P(BO}v3~ z^Hsc;ZNgSp$DV9NLo-^TIY;A8$Q>+&6+9UnsuQkXwSCLXxED`UUUuS>6>CqZ%Uk$@>E#2)uN5-*7X#*V$~GG@4r-qi~nd zz+vd`{X@AHSr8A8{2%9kC(PUeaND7P0 to overlap on subsequent pages. Displaying Document as flex renders summarybar and view in column format and fixes the issue g2788485 */.embeddedOutputsVariableTableElement .ClientDocument { display: flex; flex-direction: column;} -.S14 { border-left: 1px solid rgb(217, 217, 217); border-right: 1px solid rgb(217, 217, 217); border-top: 1px solid rgb(217, 217, 217); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 6px 45px 0px 13px; line-height: 18.004px; min-height: 0px; white-space: nowrap; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; } -.S15 { border-left: 1px solid rgb(217, 217, 217); border-right: 1px solid rgb(217, 217, 217); border-top: 0px none rgb(33, 33, 33); border-bottom: 1px solid rgb(217, 217, 217); border-radius: 0px 0px 4px 4px; padding: 0px 45px 4px 13px; line-height: 18.004px; min-height: 0px; white-space: nowrap; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; } -.S16 { margin: 10px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre-wrap; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; } -.S17 { border-left: 1px solid rgb(217, 217, 217); border-right: 1px solid rgb(217, 217, 217); border-top: 1px solid rgb(217, 217, 217); border-bottom: 1px solid rgb(217, 217, 217); border-radius: 4px; padding: 6px 45px 4px 13px; line-height: 18.004px; min-height: 0px; white-space: nowrap; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; } -.S18 { margin: 10px 10px 5px 4px; padding: 0px; line-height: 18px; min-height: 0px; white-space: pre-wrap; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 15px; font-weight: 700; text-align: left; } +.S15 { border-left: 1px solid rgb(217, 217, 217); border-right: 1px solid rgb(217, 217, 217); border-top: 1px solid rgb(217, 217, 217); border-bottom: 1px solid rgb(217, 217, 217); border-radius: 0px 0px 4px 4px; padding: 6px 45px 4px 13px; line-height: 18.004px; min-height: 0px; white-space: nowrap; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; } +.S16 { margin: 3px 10px 5px 4px; padding: 0px; line-height: 18px; min-height: 0px; white-space: pre-wrap; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 17px; font-weight: 700; text-align: left; } +.S17 { border-left: 1px solid rgb(217, 217, 217); border-right: 1px solid rgb(217, 217, 217); border-top: 0px none rgb(33, 33, 33); border-bottom: 1px solid rgb(217, 217, 217); border-radius: 0px 0px 4px 4px; padding: 0px 45px 4px 13px; line-height: 18.004px; min-height: 0px; white-space: nowrap; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; } +.S18 { margin: 10px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre-wrap; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; } +.S19 { border-left: 1px solid rgb(217, 217, 217); border-right: 1px solid rgb(217, 217, 217); border-top: 1px solid rgb(217, 217, 217); border-bottom: 1px solid rgb(217, 217, 217); border-radius: 4px; padding: 6px 45px 4px 13px; line-height: 18.004px; min-height: 0px; white-space: nowrap; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; } +.S20 { margin: 10px 10px 5px 4px; padding: 0px; line-height: 18px; min-height: 0px; white-space: pre-wrap; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 15px; font-weight: 700; text-align: left; } +.S21 { border-left: 1px solid rgb(217, 217, 217); border-right: 1px solid rgb(217, 217, 217); border-top: 1px solid rgb(217, 217, 217); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 6px 45px 0px 13px; line-height: 18.004px; min-height: 0px; white-space: nowrap; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; } .variableValue { width: 100% !important; } .embeddedOutputsMatrixElement,.eoOutputWrapper .matrixElement { min-height: 18px; box-sizing: border-box;} .embeddedOutputsMatrixElement .matrixElement,.eoOutputWrapper .matrixElement,.rtcDataTipElement .matrixElement { position: relative;} @@ -74,25 +77,33 @@ .variableNameElement { margin-bottom: 3px; display: inline-block;} /* * Ellipses as base64 for HTML export. */.matrixElement .horizontalEllipsis,.rtcDataTipElement .matrixElement .horizontalEllipsis { display: inline-block; margin-top: 3px; /* base64 encoded version of images-liveeditor/HEllipsis.png */ width: 30px; height: 12px; background-repeat: no-repeat; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAJCAYAAADO1CeCAAAAJUlEQVR42mP4//8/A70xw0i29BUDFPxnAEtTW37wWDqakIa4pQDvOOG89lHX2gAAAABJRU5ErkJggg==");} .matrixElement .verticalEllipsis,.textElement .verticalEllipsis,.rtcDataTipElement .matrixElement .verticalEllipsis,.rtcDataTipElement .textElement .verticalEllipsis { margin-left: 35px; /* base64 encoded version of images-liveeditor/VEllipsis.png */ width: 12px; height: 30px; background-repeat: no-repeat; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAZCAYAAAAIcL+IAAAALklEQVR42mP4//8/AzGYgWyFMECMwv8QddRS+P//KyimlmcGUOFoOI6GI/UVAgDnd8Dd4+NCwgAAAABJRU5ErkJggg==");} -.S19 { margin: 15px 10px 5px 4px; padding: 0px; line-height: 28.8px; min-height: 0px; white-space: pre-wrap; color: rgb(192, 76, 11); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 24px; font-weight: 400; text-align: left; } -.S20 { margin: 15px 10px 5px 4px; padding: 0px; line-height: 18px; min-height: 0px; white-space: pre-wrap; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 17px; font-weight: 700; text-align: left; }

Neurodata Without Borders Extracellular Electrophysiology Tutorial

This tutorial

Create fake data for a hypothetical extracellular electrophysiology experiment. The types of data we will convert are:
  • Voltage recording
  • Local field potential (LFP)
  • Spike times
It is recommended to first work through the Introduction to MatNWB tutorial, which demonstrates installing MatNWB and creating an NWB file with subject information, animal position, and trials, as well as writing and reading NWB files in MATLAB.

Setting up the NWB File

An NWB file represents a single session of an experiment. Each file must have a session_description, identifier, and session start time. Create a new NWBFile object with those and additional metadata. For all MatNWB functions, we use the Matlab method of entering keyword argument pairs, where arguments are entered as name followed by value.
nwb = NwbFile( ...
'session_description', 'mouse in open exploration',...
'identifier', 'Mouse5_Day3', ...
'session_start_time', datetime(2018, 4, 25, 2, 30, 3, 'TimeZone', 'local'), ...
'timestamps_reference_time', datetime(2018, 4, 25, 3, 0, 45, 'TimeZone', 'local'), ...
'general_experimenter', 'Last Name, First Name', ... % optional
'general_session_id', 'session_1234', ... % optional
'general_institution', 'University of My Institution', ... % optional
'general_related_publications', {'DOI:10.1016/j.neuron.2016.12.011'}); % optional
nwb
nwb =
NwbFile with properties: +.S22 { margin: 15px 10px 5px 4px; padding: 0px; line-height: 28.8px; min-height: 0px; white-space: pre-wrap; color: rgb(192, 76, 11); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 24px; font-weight: 400; text-align: left; }

Neurodata Without Borders Extracellular Electrophysiology Tutorial

About This Tutorial

This tutorial describes storage of hypothetical data from extracellular electrophysiology experiments in NWB for the following data categories:
  • Raw voltage recording
  • Local field potential (LFP) and filtered electrical signals
  • Spike times

Before You Begin

It is recommended to first work through the Introduction to MatNWB tutorial, which demonstrates installing MatNWB and creating an NWB file with subject information, animal position, and trials, as well as writing and reading NWB files in MATLAB.
Important: The dimensions of timeseries data in MatNWB should be defined in the opposite order of how it is defined in the nwb-schemas. In NWB, time is always stored in the first dimension of the data, whereas in MatNWB time should be stored in the last dimension of the data. This is explained in more detail here: MatNWB <-> HDF5 Dimension Mapping.

Setting up the NWB File

An NWB file represents a single session of an experiment. Each file must have a session_description, identifier, and session_start_time. Create a new NWBFile object these required fields along with any additional metadata. In MatNWB, arguments are specified using MATLAB's keyword argument pair convention, where each argument name is followed by its value.
nwb = NwbFile( ...
'session_description', 'mouse in open exploration',...
'identifier', 'Mouse5_Day3', ...
'session_start_time', datetime(2018, 4, 25, 2, 30, 3, 'TimeZone', 'local'), ...
'timestamps_reference_time', datetime(2018, 4, 25, 3, 0, 45, 'TimeZone', 'local'), ...
'general_experimenter', 'Last Name, First Name', ... % optional
'general_session_id', 'session_1234', ... % optional
'general_institution', 'University of My Institution', ... % optional
'general_related_publications', {'DOI:10.1016/j.neuron.2016.12.011'}); % optional
nwb
nwb =
NwbFile with properties: nwb_version: '2.7.0' file_create_date: [] @@ -143,922 +154,952 @@ stimulus_presentation: [0×1 types.untyped.Set] stimulus_templates: [0×1 types.untyped.Set] units: [] -

Extracellular Electrophysiology

In order to store extracellular electrophysiology data, you first must create an electrodes table describing the electrodes that generated this data. Extracellular electrodes are stored in an electrodes table, which is also a DynamicTable. electrodes has several required fields: x, y, z, impedance, location, filtering, and electrode_group.

Electrodes Table

Since this is a DynamicTable, we can add additional metadata fields. We will be adding a "label" column to the table.
numShanks = 4;
numChannelsPerShank = 3;
 
ElectrodesDynamicTable = types.hdmf_common.DynamicTable(...
'colnames', {'location', 'group', 'group_name', 'label'}, ...
'description', 'all electrodes');
 
Device = types.core.Device(...
'description', 'the best array', ...
'manufacturer', 'Probe Company 9000' ...
);
nwb.general_devices.set('array', Device);
for iShank = 1:numShanks
shankGroupName = sprintf('shank%d', iShank);
EGroup = types.core.ElectrodeGroup( ...
'description', sprintf('electrode group for %s', shankGroupName), ...
'location', 'brain area', ...
'device', types.untyped.SoftLink(Device) ...
);
nwb.general_extracellular_ephys.set(shankGroupName, EGroup);
for iElectrode = 1:numChannelsPerShank
ElectrodesDynamicTable.addRow( ...
'location', 'unknown', ...
'group', types.untyped.ObjectView(EGroup), ...
'group_name', shankGroupName, ...
'label', sprintf('%s-electrode%d', shankGroupName, iElectrode));
end
end
ElectrodesDynamicTable.toTable() % Display the table
ans = 12×5 table
 idlocationgroupgroup_namelabel
10'unknown'1×1 ObjectView'shank1''shank1-electrode1'
21'unknown'1×1 ObjectView'shank1''shank1-electrode2'
32'unknown'1×1 ObjectView'shank1''shank1-electrode3'
43'unknown'1×1 ObjectView'shank2''shank2-electrode1'
54'unknown'1×1 ObjectView'shank2''shank2-electrode2'
65'unknown'1×1 ObjectView'shank2''shank2-electrode3'
76'unknown'1×1 ObjectView'shank3''shank3-electrode1'
87'unknown'1×1 ObjectView'shank3''shank3-electrode2'
98'unknown'1×1 ObjectView'shank3''shank3-electrode3'
109'unknown'1×1 ObjectView'shank4''shank4-electrode1'
1110'unknown'1×1 ObjectView'shank4''shank4-electrode2'
1211'unknown'1×1 ObjectView'shank4''shank4-electrode3'
 
nwb.general_extracellular_ephys_electrodes = ElectrodesDynamicTable;

Links

In the above loop, we create ElectrodeGroup objects. The electrodes table then uses an ObjectView in each row to link to the corresponding ElectrodeGroup object. An ObjectView is an object that allow you to create a link from one neurodata type referencing another.

ElectricalSeries

Voltage data are stored in ElectricalSeries objects. ElectricalSeries is a subclass of TimeSeries specialized for voltage data. In order to create our ElectricalSeries object, we will need to reference a set of rows in the electrodes table to indicate which electrodes were recorded. We will do this by creating a DynamicTableRegion, which is a type of link that allows you to reference specific rows of a DynamicTable, such as the electrodes table, by row indices.
Create a DynamicTableRegion that references all rows of the electrodes table.
electrode_table_region = types.hdmf_common.DynamicTableRegion( ...
'table', types.untyped.ObjectView(ElectrodesDynamicTable), ...
'description', 'all electrodes', ...
'data', (0:length(ElectrodesDynamicTable.id.data)-1)');
Now create an ElectricalSeries object to hold acquisition data collected during the experiment.
electrical_series = types.core.ElectricalSeries( ...
'starting_time', 0.0, ... % seconds
'starting_time_rate', 30000., ... % Hz
'data', randn(12, 3000), ...
'electrodes', electrode_table_region, ...
'data_unit', 'volts');
This is the voltage data recorded directly from our electrodes, so it goes in the acquisition group.
nwb.acquisition.set('ElectricalSeries', electrical_series);

LFP

Local field potential (LFP) refers in this case to data that has been downsampled and/or filtered from the original acquisition data and is used to analyze signals in the lower frequency range. Filtered and downsampled LFP data would also be stored in an ElectricalSeries. To help data analysis and visualization tools know that this ElectricalSeries object represents LFP data, store it inside an LFP object, then place the LFP object in a ProcessingModule named 'ecephys'. This is analogous to how we stored the SpatialSeries object inside of a Position object and stored the Position object in a ProcessingModule named 'behavior' earlier.
electrical_series = types.core.ElectricalSeries( ...
'starting_time', 0.0, ... % seconds
'starting_time_rate', 1000., ... % Hz
'data', randn(12, 100), ...
'electrodes', electrode_table_region, ...
'data_unit', 'volts');
 
lfp = types.core.LFP('ElectricalSeries', electrical_series);
 
ecephys_module = types.core.ProcessingModule(...
'description', 'extracellular electrophysiology');
 
ecephys_module.nwbdatainterface.set('LFP', lfp);
nwb.processing.set('ecephys', ecephys_module);

Sorted Spike Times

Ragged Arrays

Spike times are stored in another DynamicTable of subtype Units. The default Units table is at /units in the HDF5 file. You can add columns to the Units table just like you did for electrodes and trials. Here, we generate some random spike data and populate the table.
num_cells = 10;
firing_rate = 20;
spikes = cell(1, num_cells);
for iShank = 1:num_cells
spikes{iShank} = rand(1, randi([16, 28]));
end
spikes
spikes = 1×10 cell
 12345678910
11×21 double1×24 double1×18 double1×28 double1×25 double1×18 double1×21 double1×28 double1×16 double1×19 double
Spike times are an example of a ragged array- it's like a matrix, but each row has a different number of elements. We can represent this type of data as an indexed column of the units DynamicTable. These indexed columns have two components, the vector data object that holds the data and the vector index object that holds the indices in the vector that indicate the row breaks. You can use the convenience function util.create_indexed_column to create these objects.
[spike_times_vector, spike_times_index] = util.create_indexed_column(spikes);
 
nwb.units = types.core.Units( ...
'colnames', {'spike_times'}, ...
'description', 'units table', ...
'spike_times', spike_times_vector, ...
'spike_times_index', spike_times_index ...
);
 
nwb.units.toTable
ans = 10×2 table
 idspike_times
1121×1 double
2224×1 double
3318×1 double
4428×1 double
5525×1 double
6618×1 double
7721×1 double
8828×1 double
9916×1 double
101019×1 double

Unsorted Spike Times

In MATLAB, while the Units table is used to store spike times and waveform data for spike-sorted, single-unit activity, you may also want to store spike times and waveform snippets of unsorted spiking activity. This is useful for recording multi-unit activity detected via threshold crossings during data acquisition. Such information can be stored using SpikeEventSeries objects.
% In the SpikeEventSeries the dimensions should be ordered as
% [num_events, num_channels, num_samples].
% Define spike snippets: 20 events, 3 channels, 40 samples per event.
spike_snippets = rand(20, 3, 40);
% Permute spike snippets (See dimensionMapNoDataPipes tutorial)
spike_snippets = permute(spike_snippets, [3,2,1])
spike_snippets =
spike_snippets(:,:,1) = - - 0.2857 0.6608 0.4367 - 0.3600 0.1626 0.8400 - 0.5475 0.0764 0.6130 - 0.1149 0.6369 0.1302 - 0.0839 0.7551 0.8632 - 0.5529 0.3187 0.0518 - 0.0574 0.7624 0.8898 - 0.6274 0.6888 0.5444 - 0.0840 0.9389 0.8369 - 0.2149 0.7280 0.1379 - 0.9564 0.0906 0.6076 - 0.3179 0.7600 0.8335 - 0.1967 0.6754 0.0739 - 0.8329 0.0264 0.5930 - 0.5987 0.1428 0.5505 - 0.8641 0.5217 0.8748 - 0.9503 0.9436 0.6849 - 0.0988 0.6326 0.2984 - 0.8497 0.6740 0.0928 - 0.9513 0.1322 0.6433 - 0.7060 0.3816 0.9528 - 0.9193 0.2140 0.7737 - 0.6863 0.3327 0.0457 - 0.1618 0.8800 0.0862 - 0.0080 0.8270 0.6271 - 0.8749 0.5075 0.5516 - 0.5649 0.8422 0.1858 - 0.8480 0.8885 0.5991 - 0.4204 0.1576 0.2430 - 0.5801 0.3614 0.8714 - 0.2796 0.5922 0.5711 - 0.7843 0.8961 0.5321 - 0.3181 0.6451 0.6615 - 0.1203 0.4240 0.7307 - 0.5491 0.9083 0.7756 - 0.1166 0.2054 0.1056 - 0.2286 0.7850 0.2984 - 0.7974 0.3422 0.4096 - 0.6017 0.6665 0.8854 - 0.6872 0.0761 0.4004 +

Electrode Information

In order to store extracellular electrophysiology data, you first must create an electrodes table describing the electrodes that generated this data. Extracellular electrodes are stored in an electrodes table, which is also a DynamicTable. electrodes has several required fields: x, y, z, impedance, location, filtering, and electrode_group.

Electrodes Table

Since this is a DynamicTable, we can add additional metadata fields. We will be adding a "label" column to the table.
numShanks = 4;
numChannelsPerShank = 3;
numChannels = numShanks * numChannelsPerShank;
 
electrodesDynamicTable = types.hdmf_common.DynamicTable(...
'colnames', {'location', 'group', 'group_name', 'label'}, ...
'description', 'all electrodes');
 
device = types.core.Device(...
'description', 'the best array', ...
'manufacturer', 'Probe Company 9000' ...
);
nwb.general_devices.set('array', device);
for iShank = 1:numShanks
shankGroupName = sprintf('shank%d', iShank);
electrodeGroup = types.core.ElectrodeGroup( ...
'description', sprintf('electrode group for %s', shankGroupName), ...
'location', 'brain area', ...
'device', types.untyped.SoftLink(device) ...
);
nwb.general_extracellular_ephys.set(shankGroupName, electrodeGroup);
for iElectrode = 1:numChannelsPerShank
electrodesDynamicTable.addRow( ...
'location', 'unknown', ...
'group', types.untyped.ObjectView(electrodeGroup), ...
'group_name', shankGroupName, ...
'label', sprintf('%s-electrode%d', shankGroupName, iElectrode));
end
end
electrodesDynamicTable.toTable() % Display the table
ans = 12×5 table
 idlocationgroupgroup_namelabel
10'unknown'1×1 ObjectView'shank1''shank1-electrode1'
21'unknown'1×1 ObjectView'shank1''shank1-electrode2'
32'unknown'1×1 ObjectView'shank1''shank1-electrode3'
43'unknown'1×1 ObjectView'shank2''shank2-electrode1'
54'unknown'1×1 ObjectView'shank2''shank2-electrode2'
65'unknown'1×1 ObjectView'shank2''shank2-electrode3'
76'unknown'1×1 ObjectView'shank3''shank3-electrode1'
87'unknown'1×1 ObjectView'shank3''shank3-electrode2'
98'unknown'1×1 ObjectView'shank3''shank3-electrode3'
109'unknown'1×1 ObjectView'shank4''shank4-electrode1'
1110'unknown'1×1 ObjectView'shank4''shank4-electrode2'
1211'unknown'1×1 ObjectView'shank4''shank4-electrode3'
nwb.general_extracellular_ephys_electrodes = electrodesDynamicTable;

Links

In the above loop, we create ElectrodeGroup objects. The electrodes table then uses an ObjectView in each row to link to the corresponding ElectrodeGroup object. An ObjectView is a construct that enables linking one neurodata type to another, allowing a neurodata type to reference another within the NWB file.

Recorded Extracellular Signals

Voltage data are stored using the ElectricalSeries class, a subclass of the TimeSeries class specialized for voltage data.

Referencing Electrodes

In order to create our ElectricalSeries object, we first need to reference a set of rows in the electrodes table to indicate which electrode (channel) each entry in the electrical series were recorded from. We will do this by creating a DynamicTableRegion, which is a type of link that allows you to reference specific rows of a DynamicTable, such as the electrodes table, using row indices.
Create a DynamicTableRegion that references all rows of the electrodes table.
electrode_table_region = types.hdmf_common.DynamicTableRegion( ...
'table', types.untyped.ObjectView(electrodesDynamicTable), ...
'description', 'all electrodes', ...
'data', (0:length(electrodesDynamicTable.id.data)-1)');

Raw Voltage Data

Now create an ElectricalSeries object to hold acquisition data collected during the experiment.
raw_electrical_series = types.core.ElectricalSeries( ...
'starting_time', 0.0, ... % seconds
'starting_time_rate', 30000., ... % Hz
'data', randn(numChannels, 3000), ... % nChannels x nTime
'electrodes', electrode_table_region, ...
'data_unit', 'volts');
This is the voltage data recorded directly from our electrodes, so it goes in the acquisition group.
nwb.acquisition.set('ElectricalSeries', raw_electrical_series);

Processed Extracellular Electrical Signals

LFP

LFP refers to data that has been low-pass filtered, typically below 300 Hz. This data may also be downsampled. Because it is filtered and potentially resampled, it is categorized as processed data. LFP data would also be stored in an ElectricalSeries. To help data analysis and visualization tools know that this ElectricalSeries object represents LFP data, we store it inside an LFP object and then place the LFP object in a ProcessingModule named 'ecephys'. This is analogous to how we stored the SpatialSeries object inside of a Position object and stored the Position object in a ProcessingModule named 'behavior' in the behavior tutorial
lfp_electrical_series = types.core.ElectricalSeries( ...
'starting_time', 0.0, ... % seconds
'starting_time_rate', 1000., ... % Hz
'data', randn(numChannels, 100), ... nChannels x nTime
'filtering', 'Low-pass filter at 300 Hz', ...
'electrodes', electrode_table_region, ...
'data_unit', 'volts');
 
lfp = types.core.LFP('ElectricalSeries', lfp_electrical_series);
 
ecephys_module = types.core.ProcessingModule(...
'description', 'extracellular electrophysiology');
 
ecephys_module.nwbdatainterface.set('LFP', lfp);
nwb.processing.set('ecephys', ecephys_module);

Other Types of Filtered Electrical Signals

If your derived data is filtered for frequency ranges other than LFP—such as Gamma or Theta—you should store it in an ElectricalSeries and encapsulate it within a FilteredEphys object instead of the LFP object.
% Generate filtered data
filtered_data = randn(50, 12); % 50 time points, 12 channels
filtered_data = permute(filtered_data, [2, 1]); % permute timeseries for matnwb
 
% Create an ElectricalSeries object
filtered_electrical_series = types.core.ElectricalSeries( ...
'description', 'Data filtered in the Theta range', ...
'data', filtered_data, ...
'electrodes', electrode_table_region, ...
'filtering', 'Band-pass filtered between 4 and 8 Hz', ...
'starting_time', 0.0, ...
'starting_time_rate', 200.0 ...
);
 
% Create a FilteredEphys object and add the filtered electrical series
filtered_ephys = types.core.FilteredEphys();
filtered_ephys.electricalseries.set('FilteredElectricalSeries', filtered_electrical_series);
 
% Add the FilteredEphys object to the ecephys module
ecephys_module.nwbdatainterface.set('FilteredEphys', filtered_ephys);

Spike Times and Extracellular Events

Sorted Spike Times

Spike times are stored in a Units table, a specialization of the DynamicTable class. The default Units table is located at /units in the HDF5 file. You can add columns to the Units table just like you did for electrodes and trials (see convertTrials). Here, we generate some random spike data and populate the table.
num_cells = 10;
spikes = cell(1, num_cells);
for iShank = 1:num_cells
spikes{iShank} = rand(1, randi([16, 28]));
end
spikes
spikes = 1×10 cell
 12345678910
11×23 double1×24 double1×25 double1×27 double1×23 double1×21 double1×27 double1×27 double1×28 double1×28 double

Ragged Arrays

Spike times are an example of a ragged array- it's like a matrix, but each row has a different number of elements. We can represent this type of data as an indexed column of the Units table. These indexed columns have two components, the VectorData object that holds the data and the VectorIndex object that holds the indices in the vector that indicate the row breaks. You can use the convenience function util.create_indexed_column to create these objects. For more information about ragged arrays, we refer you to the "Ragged Array Columns" section of the dynamic table tutorial.
[spike_times_vector, spike_times_index] = util.create_indexed_column(spikes);
 
nwb.units = types.core.Units( ...
'colnames', {'spike_times'}, ...
'description', 'units table', ...
'spike_times', spike_times_vector, ...
'spike_times_index', spike_times_index ...
);
 
nwb.units.toTable
ans = 10×2 table
 idspike_times
1123×1 double
2224×1 double
3325×1 double
4427×1 double
5523×1 double
6621×1 double
7727×1 double
8827×1 double
9928×1 double
101028×1 double

Unsorted Spike Times

While the Units table is used to store spike times and waveform data for spike-sorted, single-unit activity, you may also want to store spike times and waveform snippets of unsorted spiking activity. This is useful for recording multi-unit activity detected via threshold crossings during data acquisition. Such information can be stored using SpikeEventSeries objects.
% In the SpikeEventSeries the dimensions should be ordered as
% [num_events, num_channels, num_samples].
% Define spike snippets: 20 events, 3 channels, 40 samples per event.
spike_snippets = rand(20, 3, 40);
% Permute spike snippets (See dimensionMapNoDataPipes tutorial)
spike_snippets = permute(spike_snippets, [3,2,1])
spike_snippets =
spike_snippets(:,:,1) = + + 0.2780 0.0148 0.4113 + 0.9089 0.2536 0.2512 + 0.2961 0.4550 0.8541 + 0.5709 0.1663 0.1813 + 0.6639 0.8085 0.9136 + 0.1532 0.5275 0.1305 + 0.5169 0.6597 0.9037 + 0.6069 0.9045 0.9244 + 0.9657 0.3104 0.8828 + 0.4293 0.2333 0.9000 + 0.3021 0.8831 0.9400 + 0.1023 0.8102 0.2832 + 0.5171 0.9477 0.6370 + 0.6029 0.9545 0.8187 + 0.5206 0.4737 0.8799 + 0.3451 0.1380 0.5775 + 0.0495 0.1734 0.9920 + 0.8352 0.1176 0.1876 + 0.8302 0.8044 0.6006 + 0.3333 0.6354 0.1640 + 0.1174 0.6743 0.8681 + 0.3170 0.6718 0.1311 + 0.6166 0.2288 0.7316 + 0.8783 0.7603 0.0001 + 0.2442 0.5209 0.2155 + 0.3402 0.2235 0.5329 + 0.5665 0.0798 0.7609 + 0.5323 0.5660 0.5499 + 0.7377 0.0673 0.3152 + 0.2693 0.4380 0.2733 + 0.9295 0.5399 0.4471 + 0.2433 0.3025 0.8800 + 0.5839 0.5657 0.5774 + 0.9038 0.2999 0.9696 + 0.6991 0.2018 0.5173 + 0.2515 0.0586 0.2742 + 0.4466 0.4422 0.5018 + 0.9849 0.9096 0.8287 + 0.1720 0.6847 0.6424 + 0.1289 0.0637 0.0174 spike_snippets(:,:,2) = - 0.3537 0.5763 0.0558 - 0.3264 0.0852 0.3904 - 0.6326 0.9991 0.9243 - 0.0142 0.3299 0.1727 - 0.7906 0.1044 0.6286 - 0.5325 0.6482 0.3741 - 0.1618 0.3340 0.6112 - 0.1891 0.3239 0.9190 - 0.8035 0.1656 0.9514 - 0.8351 0.5910 0.6103 - 0.4504 0.8050 0.4005 - 0.6363 0.7321 0.7352 - 0.3229 0.4718 0.3551 - 0.5228 0.9125 0.7943 - 0.5838 0.8591 0.1924 - 0.1646 0.9811 0.3952 - 0.5876 0.7013 0.5506 - 0.6731 0.0672 0.7196 - 0.4278 0.2166 0.7300 - 0.3082 0.0349 0.0998 - 0.6421 0.0494 0.0303 - 0.8604 0.1456 0.3563 - 0.8400 0.7252 0.2455 - 0.1522 0.9904 0.1299 - 0.1487 0.3543 0.3340 - 0.7294 0.4209 0.4987 - 0.7297 0.4765 0.9868 - 0.5830 0.8183 0.6142 - 0.0503 0.9344 0.5153 - 0.1720 0.1192 0.9391 - 0.9381 0.5673 0.6301 - 0.2820 0.4955 0.2350 - 0.8668 0.6107 0.3925 - 0.6064 0.8543 0.9834 - 0.6108 0.4038 0.0298 - 0.3266 0.5498 0.5972 - 0.1845 0.5921 0.9274 - 0.6278 0.8075 0.1228 - 0.1886 0.3756 0.3849 - 0.0585 0.6472 0.9450 + 0.1356 0.8906 0.1356 + 0.8359 0.4499 0.4325 + 0.5334 0.7425 0.3893 + 0.7806 0.4774 0.1446 + 0.7090 0.6839 0.8727 + 0.6276 0.3848 0.9937 + 0.6387 0.0727 0.0036 + 0.2166 0.6525 0.1900 + 0.7040 0.5891 0.2017 + 0.3564 0.7157 0.4724 + 0.1167 0.6595 0.5219 + 0.2402 0.7465 0.9879 + 0.7433 0.5308 0.0752 + 0.5490 0.8776 0.2981 + 0.0620 0.7035 0.5912 + 0.1362 0.5743 0.8116 + 0.8572 0.4815 0.6027 + 0.9946 0.4654 0.4843 + 0.0120 0.4187 0.2885 + 0.4056 0.3358 0.7233 + 0.9679 0.1308 0.8167 + 0.2359 0.1989 0.8837 + 0.5314 0.6617 0.3106 + 0.0073 0.3747 0.3369 + 0.4491 0.5629 0.3621 + 0.3106 0.3202 0.3869 + 0.6711 0.7039 0.4220 + 0.5631 0.3319 0.3008 + 0.1683 0.4825 0.1346 + 0.2136 0.7076 0.7932 + 0.8566 0.7091 0.5236 + 0.0288 0.6919 0.5200 + 0.7006 0.1266 0.5687 + 0.6473 0.8367 0.3659 + 0.6176 0.6711 0.9105 + 0.9251 0.7086 0.8938 + 0.1278 0.7159 0.8852 + 0.0841 0.6990 0.3079 + 0.0080 0.0005 0.4075 + 0.7984 0.6617 0.3013 spike_snippets(:,:,3) = - 0.0790 0.9798 0.3705 - 0.2565 0.3337 0.3708 - 0.4972 0.1644 0.8170 - 0.8341 0.4508 0.3991 - 0.4084 0.5430 0.4807 - 0.3439 0.6642 0.5703 - 0.9957 0.1053 0.1126 - 0.1819 0.7859 0.5963 - 0.1255 0.1200 0.8429 - 0.8847 0.4127 0.9843 - 0.8943 0.6678 0.0982 - 0.0207 0.9872 0.9731 - 0.2515 0.3483 0.4459 - 0.6889 0.5565 0.2033 - 0.3814 0.8721 0.6273 - 0.5217 0.2188 0.8595 - 0.9447 0.0148 0.1967 - 0.8213 0.0100 0.3596 - 0.5204 0.0630 0.8961 - 0.3929 0.7670 0.6272 - 0.0254 0.7624 0.0719 - 0.3342 0.8155 0.2478 - 0.5622 0.2468 0.7245 - 0.3886 0.1705 0.6961 - 0.6668 0.7717 0.4452 - 0.0322 0.9974 0.1323 - 0.6823 0.3939 0.0021 - 0.3614 0.2507 0.6621 - 0.7852 0.7651 0.5013 - 0.3042 0.7980 0.0191 - 0.0733 0.7833 0.2535 - 0.2063 0.2281 0.8499 - 0.4524 0.5881 0.5972 - 0.7459 0.2085 0.7855 - 0.7223 0.9363 0.3330 - 0.3031 0.0221 0.9362 - 0.0528 0.5472 0.0018 - 0.8966 0.7395 0.3072 - 0.0647 0.9329 0.9689 - 0.7266 0.1662 0.9855 + 0.3783 0.7965 0.1050 + 0.7297 0.1329 0.8280 + 0.0421 0.7440 0.5148 + 0.0433 0.1966 0.3639 + 0.3937 0.0728 0.1104 + 0.5506 0.7925 0.4094 + 0.3709 0.7109 0.0431 + 0.5237 0.6674 0.2444 + 0.1808 0.7575 0.3823 + 0.8111 0.5852 0.2838 + 0.3822 0.9055 0.2303 + 0.0973 0.3953 0.7989 + 0.0419 0.8453 0.6505 + 0.4524 0.3664 0.2062 + 0.4113 0.1807 0.1150 + 0.0886 0.8685 0.3013 + 0.3449 0.5180 0.2821 + 0.3773 0.6463 0.4354 + 0.7497 0.3262 0.9738 + 0.3253 0.4987 0.7777 + 0.8843 0.4842 0.8025 + 0.6655 0.3403 0.4367 + 0.6173 0.6862 0.7745 + 0.3096 0.4351 0.8634 + 0.9581 0.5508 0.9057 + 0.9796 0.8453 0.2989 + 0.4616 0.3215 0.5217 + 0.6465 0.2757 0.8933 + 0.6273 0.7627 0.3487 + 0.7493 0.0711 0.7441 + 0.6469 0.6425 0.3223 + 0.2125 0.5889 0.7047 + 0.3090 0.2534 0.4767 + 0.2812 0.5091 0.6808 + 0.1553 0.4004 0.3360 + 0.5689 0.5763 0.1933 + 0.4353 0.9890 0.3021 + 0.4081 0.5490 0.2611 + 0.0308 0.0775 0.0438 + 0.2588 0.8739 0.3807 spike_snippets(:,:,4) = - 0.2545 0.1178 0.0623 - 0.1434 0.7919 0.9073 - 0.4296 0.1924 0.6309 - 0.5161 0.1803 0.0288 - 0.3179 0.7982 0.2427 - 0.2748 0.3133 0.0101 - 0.2930 0.1957 0.6955 - 0.6836 0.9551 0.2006 - 0.1638 0.1767 0.6102 - 0.9307 0.7772 0.1972 - 0.9277 0.5743 0.1019 - 0.7270 0.7339 0.1749 - 0.4948 0.2646 0.5360 - 0.8644 0.7049 0.4960 - 0.5880 0.8958 0.5753 - 0.0046 0.9635 0.3048 - 0.2872 0.7341 0.1214 - 0.0006 0.4956 0.6200 - 0.8845 0.5147 0.8833 - 0.1212 0.1808 0.5548 - 0.5224 0.7684 0.0541 - 0.6122 0.9229 0.9004 - 0.2470 0.2454 0.3503 - 0.4826 0.1955 0.2739 - 0.9240 0.7621 0.3529 - 0.1734 0.0407 0.7469 - 0.6788 0.3651 0.0434 - 0.1148 0.2578 0.8098 - 0.0898 0.4526 0.1006 - 0.2722 0.9148 0.1465 - 0.3516 0.7715 0.5164 - 0.6509 0.2735 0.4134 - 0.6057 0.5503 0.6118 - 0.7246 0.3308 0.9303 - 0.4009 0.2966 0.9465 - 0.8563 0.4760 0.5895 - 0.3833 0.8435 0.3921 - 0.1216 0.6948 0.9617 - 0.0278 0.8568 0.0843 - 0.2423 0.5999 0.6319 + 0.2649 0.6259 0.3227 + 0.2491 0.7486 0.8558 + 0.3198 0.5868 0.3054 + 0.9232 0.9241 0.1926 + 0.8567 0.2033 0.2909 + 0.9502 0.7225 0.7050 + 0.3448 0.9984 0.8057 + 0.6264 0.9101 0.6463 + 0.5162 0.6860 0.4762 + 0.3276 0.2264 0.5250 + 0.5039 0.8624 0.7269 + 0.7390 0.1356 0.6052 + 0.9651 0.2247 0.4177 + 0.1197 0.2531 0.0582 + 0.0431 0.1862 0.8068 + 0.5937 0.9858 0.4938 + 0.8370 0.3590 0.5061 + 0.0589 0.0558 0.9941 + 0.4473 0.9498 0.0472 + 0.8378 0.1685 0.4784 + 0.7923 0.4368 0.6926 + 0.5336 0.0716 0.9173 + 0.8650 0.4142 0.8525 + 0.0634 0.7115 0.9690 + 0.1277 0.2495 0.9790 + 0.2543 0.5766 0.0703 + 0.8826 0.7350 0.1136 + 0.6198 0.1620 0.6696 + 0.5354 0.5791 0.6978 + 0.8119 0.8240 0.6792 + 0.4559 0.7728 0.2349 + 0.1032 0.8007 0.3118 + 0.1165 0.3766 0.7736 + 0.2743 0.6713 0.0053 + 0.8355 0.9312 0.8363 + 0.8097 0.4272 0.2623 + 0.3977 0.9368 0.4354 + 0.4137 0.5146 0.7045 + 0.5012 0.6424 0.9537 + 0.6439 0.1141 0.0752 spike_snippets(:,:,5) = - 0.5522 0.6140 0.5597 - 0.4872 0.7144 0.3502 - 0.4616 0.4691 0.4971 - 0.3555 0.4293 0.6880 - 0.0012 0.4328 0.0814 - 0.6816 0.5303 0.6519 - 0.5734 0.7206 0.2286 - 0.6116 0.0223 0.9631 - 0.0033 0.3719 0.2236 - 0.9431 0.1396 0.0793 - 0.4107 0.9010 0.0474 - 0.8080 0.4957 0.3896 - 0.0888 0.6888 0.4446 - 0.6716 0.0954 0.6248 - 0.9566 0.5706 0.0673 - 0.8721 0.6358 0.3166 - 0.2042 0.8066 0.7187 - 0.2414 0.9353 0.2232 - 0.5845 0.9186 0.1913 - 0.7381 0.7520 0.3618 - 0.9733 0.9983 0.0858 - 0.7678 0.0200 0.8217 - 0.0691 0.5319 0.3943 - 0.0594 0.5005 0.8020 - 0.2298 0.7428 0.3926 - 0.3677 0.9118 0.1565 - 0.6005 0.3140 0.8609 - 0.0459 0.6408 0.3229 - 0.2813 0.0560 0.4407 - 0.0798 0.9051 0.9379 - 0.5298 0.4222 0.8412 - 0.8171 0.5180 0.8489 - 0.9351 0.5550 0.4569 - 0.2314 0.2319 0.0156 - 0.9743 0.4728 0.9320 - 0.5814 0.4281 0.6112 - 0.7730 0.4871 0.8687 - 0.7774 0.5609 0.8990 - 0.6401 0.7684 0.9780 - 0.6937 0.3855 0.2773 + 0.0353 0.5785 0.1052 + 0.9667 0.9307 0.7775 + 0.0724 0.7375 0.9376 + 0.2985 0.0157 0.5220 + 0.2656 0.4422 0.7409 + 0.1663 0.4812 0.8922 + 0.2181 0.4709 0.0764 + 0.2997 0.1134 0.7770 + 0.4091 0.1724 0.0672 + 0.3649 0.4570 0.8933 + 0.0467 0.9205 0.5342 + 0.2600 0.4604 0.6358 + 0.3632 0.4091 0.5228 + 0.3142 0.5238 0.8015 + 0.9972 0.8749 0.1874 + 0.2001 0.8972 0.8003 + 0.6966 0.7425 0.8926 + 0.2572 0.2725 0.3606 + 0.2437 0.2278 0.0985 + 0.5260 0.2972 0.9588 + 0.3713 0.6128 0.5907 + 0.5425 0.4280 0.9567 + 0.2313 0.8796 0.2725 + 0.8410 0.8233 0.3227 + 0.2570 0.2153 0.0822 + 0.6232 0.8143 0.8897 + 0.5503 0.2705 0.4599 + 0.4243 0.9212 0.8713 + 0.6731 0.7431 0.2173 + 0.7223 0.2741 0.7489 + 0.0597 0.2518 0.3761 + 0.9505 0.4155 0.3440 + 0.0127 0.5266 0.2639 + 0.9038 0.9368 0.6245 + 0.2475 0.5880 0.0437 + 0.8818 0.2390 0.7275 + 0.8650 0.2695 0.5546 + 0.5279 0.0313 0.2543 + 0.3718 0.3389 0.7586 + 0.9491 0.6410 0.0260 spike_snippets(:,:,6) = - 0.7563 0.7273 0.0133 - 0.3592 0.8510 0.3783 - 0.2910 0.2957 0.0741 - 0.2222 0.6956 0.2550 - 0.7024 0.7359 0.8882 - 0.7378 0.5554 0.4322 - 0.3820 0.1226 0.2407 - 0.7241 0.7887 0.3233 - 0.5451 0.4922 0.9290 - 0.8519 0.6864 0.1900 - 0.8484 0.4515 0.9817 - 0.7977 0.2750 0.3051 - 0.0746 0.6490 0.7667 - 0.0516 0.7495 0.5505 - 0.6045 0.0482 0.7680 - 0.1531 0.1959 0.0531 - 0.3139 0.2795 0.4414 - 0.0599 0.3964 0.1188 - 0.7404 0.0559 0.8768 - 0.9584 0.2563 0.1812 - 0.5370 0.5704 0.2613 - 0.3878 0.6127 0.9154 - 0.3381 0.5848 0.7191 - 0.6035 0.1744 0.6816 - 0.8049 0.4899 0.3228 - 0.4373 0.2797 0.0940 - 0.8263 0.6326 0.0613 - 0.6774 0.9938 0.4658 - 0.0273 0.3114 0.2264 - 0.5349 0.2503 0.0345 - 0.2270 0.1829 0.8232 - 0.1635 0.3015 0.7972 - 0.3778 0.3966 0.0747 - 0.7063 0.9485 0.0910 - 0.3828 0.1401 0.8424 - 0.3238 0.2967 0.7296 - 0.4243 0.0952 0.8124 - 0.4995 0.4657 0.7694 - 0.1477 0.7937 0.8987 - 0.4048 0.1036 0.0002 + 0.8353 0.8842 0.1327 + 0.0023 0.0828 0.0155 + 0.4521 0.2627 0.3135 + 0.6089 0.9924 0.1857 + 0.2771 0.0145 0.5243 + 0.0054 0.6352 0.6397 + 0.9503 0.6881 0.6905 + 0.5268 0.6878 0.0469 + 0.3679 0.0870 0.0940 + 0.7434 0.2069 0.6242 + 0.7756 0.0147 0.1339 + 0.3013 0.4838 0.5379 + 0.7562 0.3814 0.9576 + 0.5539 0.7027 0.2851 + 0.4565 0.4701 0.4139 + 0.9140 0.5460 0.2079 + 0.3755 0.6503 0.2046 + 0.1380 0.9547 0.2964 + 0.9064 0.5506 0.4604 + 0.4459 0.0249 0.1004 + 0.1336 0.8181 0.9869 + 0.7424 0.1500 0.2491 + 0.5502 0.8456 0.8847 + 0.2056 0.3975 0.2799 + 0.3125 0.9756 0.9344 + 0.1778 0.6799 0.5414 + 0.6171 0.7186 0.0913 + 0.5498 0.4818 0.1065 + 0.2924 0.6595 0.9587 + 0.0464 0.5249 0.9911 + 0.6492 0.7509 0.9557 + 0.3380 0.2306 0.6588 + 0.2239 0.2056 0.6502 + 0.0666 0.7243 0.5550 + 0.8463 0.7816 0.2333 + 0.1221 0.9336 0.6374 + 0.2198 0.0172 0.9353 + 0.2697 0.7625 0.7616 + 0.5676 0.3180 0.2653 + 0.7473 0.3677 0.3685 spike_snippets(:,:,7) = - 0.4580 0.9207 0.2481 - 0.1836 0.6374 0.5111 - 0.0742 0.8433 0.9611 - 0.0159 0.8911 0.7889 - 0.2008 0.8055 0.7266 - 0.5994 0.8005 0.9522 - 0.4349 0.8104 0.8747 - 0.3428 0.7336 0.5881 - 0.1481 0.0946 0.9118 - 0.0831 0.5271 0.7814 - 0.0389 0.8958 0.8084 - 0.3233 0.3729 0.3681 - 0.4450 0.6990 0.3603 - 0.6181 0.9658 0.1873 - 0.5898 0.2502 0.0125 - 0.2308 0.2501 0.7988 - 0.8013 0.1657 0.0417 - 0.9670 0.8803 0.1257 - 0.0179 0.6742 0.8754 - 0.3485 0.9857 0.9407 - 0.2647 0.2288 0.6305 - 0.0033 0.4910 0.1960 - 0.9030 0.8703 0.3570 - 0.5235 0.2891 0.1002 - 0.2324 0.0010 0.2280 - 0.2612 0.3101 0.0855 - 0.5968 0.3174 0.4167 - 0.9640 0.7214 0.4913 - 0.1577 0.9385 0.1025 - 0.1977 0.5359 0.2251 - 0.3496 0.7907 0.7362 - 0.0281 0.6693 0.0673 - 0.2872 0.3925 0.5873 - 0.3650 0.4479 0.9278 - 0.8428 0.9876 0.6636 - 0.8083 0.6426 0.9633 - 0.5935 0.5707 0.7156 - 0.6495 0.7981 0.8620 - 0.4248 0.5334 0.1100 - 0.0895 0.6389 0.0086 + 0.2717 0.8437 0.0614 + 0.9846 0.1554 0.6485 + 0.4405 0.5486 0.9861 + 0.2992 0.2502 0.0416 + 0.7311 0.8385 0.7856 + 0.5447 0.1100 0.3637 + 0.4743 0.6841 0.0385 + 0.7385 0.9559 0.6803 + 0.3589 0.2038 0.8423 + 0.6803 0.3435 0.9457 + 0.2223 0.2174 0.5204 + 0.5181 0.9136 0.4587 + 0.5111 0.5251 0.6280 + 0.1176 0.2497 0.5422 + 0.5466 0.6819 0.2333 + 0.5011 0.4795 0.9527 + 0.8456 0.4351 0.4552 + 0.5045 0.9980 0.1937 + 0.3748 0.1342 0.8555 + 0.6774 0.2389 0.2832 + 0.4197 0.1265 0.4677 + 0.9821 0.5483 0.3190 + 0.0633 0.8405 0.1184 + 0.8376 0.0095 0.9551 + 0.1982 0.8255 0.1118 + 0.9934 0.3247 0.2800 + 0.2720 0.7457 0.5024 + 0.4922 0.3824 0.4749 + 0.7537 0.4682 0.0557 + 0.5107 0.6124 0.4445 + 0.5398 0.3796 0.4417 + 0.0725 0.2940 0.3620 + 0.9727 0.1012 0.8457 + 0.6401 0.9106 0.6999 + 0.2930 0.8806 0.3215 + 0.4818 0.7571 0.2296 + 0.5412 0.0074 0.0305 + 0.4098 0.9592 0.5943 + 0.2615 0.6385 0.9016 + 0.0142 0.0078 0.2939 spike_snippets(:,:,8) = - 0.3173 0.7239 0.5842 - 0.9806 0.3725 0.7392 - 0.2726 0.0862 0.7087 - 0.7864 0.9975 0.8527 - 0.1554 0.4242 0.5882 - 0.7534 0.3430 0.0112 - 0.3874 0.5027 0.4471 - 0.3280 0.3424 0.3045 - 0.1938 0.7505 0.7932 - 0.2593 0.2949 0.4888 - 0.5396 0.1103 0.9481 - 0.1231 0.6017 0.7679 - 0.0303 0.7178 0.3082 - 0.6338 0.5286 0.1721 - 0.5765 0.0735 0.1011 - 0.4303 0.6201 0.7509 - 0.4182 0.1388 0.1476 - 0.2248 0.5659 0.0135 - 0.4919 0.7920 0.0609 - 0.2389 0.4693 0.8358 - 0.7148 0.3369 0.5812 - 0.1331 0.7267 0.6000 - 0.7245 0.4390 0.8241 - 0.5550 0.9808 0.7514 - 0.9064 0.5307 0.9582 - 0.8849 0.6957 0.7481 - 0.2192 0.9088 0.5844 - 0.2364 0.5855 0.7902 - 0.7584 0.0846 0.1370 - 0.7727 0.2945 0.2277 - 0.8112 0.0527 0.8338 - 0.3527 0.3030 0.9882 - 0.0002 0.2667 0.9848 - 0.2195 0.0832 0.4510 - 0.8938 0.0728 0.4832 - 0.8841 0.6265 0.6150 - 0.8769 0.5066 0.4031 - 0.6807 0.3424 0.9336 - 0.2345 0.0089 0.7260 - 0.2382 0.3721 0.6684 + 0.5593 0.0664 0.1353 + 0.3706 0.7314 0.5002 + 0.2348 0.4361 0.8898 + 0.3238 0.8773 0.3457 + 0.7999 0.0080 0.0955 + 0.1456 0.2914 0.5586 + 0.8459 0.2323 0.0713 + 0.8664 0.9928 0.3438 + 0.1765 0.6375 0.2839 + 0.0213 0.9495 0.2103 + 0.9784 0.6562 0.7590 + 0.4871 0.4380 0.3342 + 0.3254 0.4880 0.2579 + 0.7349 0.5574 0.3016 + 0.5836 0.4425 0.1105 + 0.6315 0.4373 0.2164 + 0.9936 0.1000 0.7040 + 0.0706 0.2114 0.4139 + 0.3899 0.1189 0.6065 + 0.8679 0.0302 0.9512 + 0.2909 0.3544 0.1529 + 0.2939 0.4527 0.7157 + 0.8946 0.0451 0.3767 + 0.8676 0.5813 0.1104 + 0.0709 0.2271 0.6175 + 0.8726 0.2966 0.0629 + 0.8273 0.7022 0.3356 + 0.0928 0.5537 0.5731 + 0.2954 0.0095 0.0852 + 0.1539 0.0523 0.0867 + 0.9804 0.0772 0.3589 + 0.8008 0.8144 0.7733 + 0.5719 0.3287 0.5242 + 0.7745 0.6716 0.0099 + 0.0604 0.9060 0.4542 + 0.3181 0.2407 0.6370 + 0.1010 0.6173 0.8799 + 0.3902 0.9332 0.4848 + 0.4473 0.5347 0.4481 + 0.8056 0.4465 0.1206 spike_snippets(:,:,9) = - 0.7887 0.1178 0.4502 - 0.8269 0.3962 0.5211 - 0.9859 0.7808 0.8825 - 0.7219 0.9935 0.1152 - 0.0173 0.1858 0.4448 - 0.0044 0.2231 0.0820 - 0.8686 0.5382 0.2548 - 0.4520 0.9463 0.1562 - 0.5869 0.8375 0.2189 - 0.7871 0.7757 0.4243 - 0.1588 0.5478 0.6302 - 0.4440 0.3944 0.8391 - 0.3337 0.1684 0.5720 - 0.0759 0.9428 0.7316 - 0.2520 0.8726 0.6824 - 0.5137 0.2414 0.0452 - 0.8611 0.8641 0.2069 - 0.5499 0.9632 0.1246 - 0.3078 0.4369 0.9144 - 0.7565 0.7739 0.5479 - 0.3609 0.3100 0.5928 - 0.3456 0.5537 0.2476 - 0.6165 0.3551 0.7373 - 0.5038 0.6011 0.9023 - 0.9612 0.7047 0.1553 - 0.3012 0.6818 0.3364 - 0.7665 0.1590 0.6036 - 0.7387 0.1920 0.7323 - 0.6689 0.6163 0.1122 - 0.0597 0.1126 0.9075 - 0.4382 0.9988 0.5944 - 0.5352 0.5993 0.9150 - 0.0732 0.8298 0.4190 - 0.1000 0.1752 0.8498 - 0.2800 0.1332 0.4710 - 0.8509 0.2318 0.1789 - 0.0231 0.6613 0.9997 - 0.8469 0.7678 0.8919 - 0.7672 0.0896 0.8968 - 0.3195 0.3421 0.0274 + 0.9006 0.9767 0.4546 + 0.4900 0.1118 0.3742 + 0.6286 0.1657 0.4895 + 0.0315 0.7151 0.8266 + 0.5473 0.4190 0.4702 + 0.5753 0.7077 0.3470 + 0.9155 0.6868 0.1367 + 0.0095 0.6625 0.5484 + 0.7689 0.2045 0.2163 + 0.4798 0.6163 0.2810 + 0.1679 0.4193 0.0015 + 0.3575 0.4011 0.3735 + 0.0642 0.3644 0.1549 + 0.9379 0.0651 0.6980 + 0.4819 0.6627 0.9033 + 0.8420 0.3811 0.3017 + 0.0722 0.2149 0.7973 + 0.4157 0.9105 0.2724 + 0.0533 0.0427 0.8246 + 0.6276 0.0139 0.2806 + 0.6060 0.0471 0.3017 + 0.5282 0.1674 0.4363 + 0.3956 0.7580 0.4897 + 0.6309 0.0353 0.6656 + 0.1861 0.6520 0.8533 + 0.0611 0.9159 0.1356 + 0.6147 0.7900 0.1875 + 0.2017 0.7556 0.4291 + 0.4022 0.2524 0.1622 + 0.5871 0.7990 0.1337 + 0.1497 0.4101 0.9119 + 0.0517 0.4808 0.4061 + 0.0749 0.3774 0.7091 + 0.2355 0.2938 0.9197 + 0.6699 0.6678 0.5774 + 0.3838 0.9774 0.6441 + 0.0487 0.8784 0.1452 + 0.7651 0.1562 0.2282 + 0.4379 0.5744 0.9057 + 0.9151 0.5201 0.2940 spike_snippets(:,:,10) = - 0.0246 0.1593 0.0619 - 0.1265 0.4231 0.4204 - 0.8991 0.6043 0.3761 - 0.9254 0.1290 0.2395 - 0.3477 0.0261 0.3631 - 0.4255 0.5196 0.4987 - 0.4745 0.6889 0.5786 - 0.6804 0.9587 0.7136 - 0.2899 0.7803 0.5361 - 0.4230 0.3868 0.5688 - 0.3492 0.5184 0.7157 - 0.3322 0.2954 0.5267 - 0.3834 0.0758 0.3822 - 0.3095 0.9617 0.0138 - 0.1127 0.2855 0.8902 - 0.4317 0.8442 0.9792 - 0.7420 0.0902 0.0456 - 0.7662 0.1624 0.1115 - 0.6543 0.3400 0.6864 - 0.6296 0.1255 0.5455 - 0.9029 0.0879 0.5006 - 0.6050 0.8464 0.5591 - 0.3601 0.3826 0.1305 - 0.8042 0.7910 0.4607 - 0.5606 0.6963 0.7884 - 0.3205 0.2410 0.7519 - 0.0024 0.6577 0.6181 - 0.1318 0.1590 0.2453 - 0.2791 0.1981 0.6390 - 0.2292 0.9181 0.1980 - 0.5690 0.9134 0.5699 - 0.0218 0.6615 0.1191 - 0.7396 0.8588 0.8290 - 0.4791 0.2304 0.7855 - 0.6231 0.5621 0.5530 - 0.2377 0.7269 0.4795 - 0.9498 0.7593 0.3992 - 0.4043 0.5552 0.6333 - 0.3988 0.1177 0.9016 - 0.6999 0.0590 0.5461 + 0.8282 0.2138 0.4285 + 0.1261 0.4883 0.5792 + 0.2228 0.6247 0.6779 + 0.5449 0.8480 0.6369 + 0.4660 0.2117 0.6570 + 0.3096 0.5601 0.1036 + 0.7891 0.2303 0.9913 + 0.4926 0.8584 0.9990 + 0.3495 0.0570 0.5718 + 0.9466 0.2449 0.6204 + 0.0511 0.9682 0.8855 + 0.3725 0.5535 0.6946 + 0.3412 0.3071 0.8087 + 0.5381 0.5668 0.9207 + 0.1865 0.0673 0.4772 + 0.3406 0.2523 0.8170 + 0.5898 0.5944 0.8017 + 0.8600 0.7295 0.3962 + 0.1895 0.6133 0.0434 + 0.0279 0.2701 0.1114 + 0.0769 0.4293 0.3671 + 0.7910 0.9349 0.3867 + 0.8657 0.1144 0.5284 + 0.8548 0.8806 0.7524 + 0.4823 0.9414 0.3000 + 0.9317 0.7896 0.5841 + 0.0128 0.5571 0.6863 + 0.8671 0.7001 0.9361 + 0.5764 0.2295 0.1059 + 0.8178 0.5535 0.1238 + 0.8806 0.7218 0.9090 + 0.0153 0.7562 0.7664 + 0.2824 0.6593 0.8112 + 0.3260 0.6340 0.0707 + 0.7501 0.4089 0.5904 + 0.5228 0.3117 0.3652 + 0.4952 0.8159 0.5059 + 0.0382 0.4136 0.9324 + 0.8208 0.4944 0.5800 + 0.2682 0.8801 0.1464 spike_snippets(:,:,11) = - 0.2220 0.6161 0.5482 - 0.4123 0.1179 0.7582 - 0.7245 0.9598 0.6356 - 0.7210 0.6697 0.9592 - 0.5535 0.0940 0.7996 - 0.4417 0.4261 0.0502 - 0.4423 0.5592 0.2896 - 0.9676 0.3315 0.7111 - 0.6885 0.1419 0.4361 - 0.0655 0.0035 0.1327 - 0.3826 0.6864 0.3620 - 0.0971 0.4998 0.1317 - 0.6550 0.8911 0.7389 - 0.7726 0.3506 0.4817 - 0.9044 0.0072 0.4791 - 0.9699 0.5444 0.4785 - 0.0592 0.5717 0.1154 - 0.6694 0.8065 0.3114 - 0.0451 0.4908 0.5335 - 0.6083 0.8033 0.7573 - 0.4028 0.8962 0.7841 - 0.6808 0.6181 0.2081 - 0.7436 0.6448 0.3955 - 0.0222 0.5468 0.5692 - 0.5026 0.1176 0.5409 - 0.3683 0.6528 0.1630 - 0.3198 0.7608 0.0527 - 0.0307 0.6699 0.7209 - 0.9927 0.2533 0.7853 - 0.5352 0.7892 0.0157 - 0.4994 0.9594 0.8645 - 0.2182 0.8810 0.4853 - 0.0327 0.1107 0.5328 - 0.4987 0.8243 0.0942 - 0.3071 0.6421 0.3681 - 0.0825 0.2762 0.5065 - 0.7225 0.3783 0.5774 - 0.1505 0.5689 0.6437 - 0.2730 0.3795 0.4207 - 0.3812 0.3843 0.7570 + 0.8236 0.0540 0.7995 + 0.0204 0.5714 0.1848 + 0.5037 0.2359 0.6157 + 0.1659 0.0862 0.1732 + 0.6297 0.3077 0.5853 + 0.5058 0.9417 0.8461 + 0.9337 0.4265 0.6859 + 0.8281 0.2999 0.5419 + 0.8863 0.3362 0.6720 + 0.7906 0.5052 0.6274 + 0.9557 0.0771 0.3880 + 0.5038 0.6242 0.7661 + 0.8903 0.7702 0.3272 + 0.4220 0.8902 0.2522 + 0.0672 0.8752 0.0396 + 0.9442 0.2209 0.3697 + 0.5215 0.2116 0.3633 + 0.3515 0.4938 0.7357 + 0.2163 0.7856 0.7170 + 0.9434 0.9972 0.2783 + 0.9765 0.7021 0.0121 + 0.4874 0.4950 0.5714 + 0.1665 0.2588 0.9994 + 0.9151 0.8206 0.1286 + 0.9721 0.8228 0.6599 + 0.1537 0.0543 0.0633 + 0.9924 0.5272 0.3047 + 0.6047 0.3395 0.0708 + 0.6732 0.5972 0.7567 + 0.9690 0.4308 0.0410 + 0.8854 0.6984 0.5455 + 0.4442 0.3944 0.5872 + 0.4572 0.4874 0.3204 + 0.2759 0.2410 0.6748 + 0.6670 0.9343 0.9368 + 0.1688 0.9325 0.1636 + 0.9597 0.4930 0.4160 + 0.7391 0.2095 0.5453 + 0.6546 0.9712 0.6962 + 0.6566 0.4447 0.1735 spike_snippets(:,:,12) = - 0.4536 0.0348 0.1280 - 0.0937 0.3153 0.8244 - 0.0254 0.7321 0.1776 - 0.5266 0.1378 0.7937 - 0.8184 0.4512 0.3127 - 0.2168 0.1070 0.4184 - 0.4308 0.8058 0.1924 - 0.2676 0.6272 0.4703 - 0.7924 0.5767 0.2068 - 0.6820 0.1100 0.2608 - 0.8025 0.4762 0.5039 - 0.5449 0.9441 0.8725 - 0.6045 0.0750 0.7539 - 0.3219 0.0809 0.9189 - 0.6374 0.1076 0.6818 - 0.6043 0.9807 0.2184 - 0.4737 0.8263 0.0113 - 0.4661 0.1748 0.3905 - 0.1515 0.5849 0.7402 - 0.0386 0.0491 0.0699 - 0.0451 0.8471 0.2438 - 0.9840 0.0645 0.1164 - 0.4521 0.4423 0.6804 - 0.3990 0.5811 0.2845 - 0.9404 0.8687 0.0697 - 0.7555 0.0850 0.2861 - 0.4284 0.9813 0.1606 - 0.1728 0.0667 0.2492 - 0.5687 0.0777 0.2709 - 0.2264 0.5504 0.8100 - 0.0541 0.0368 0.5259 - 0.4999 0.3839 0.5377 - 0.8043 0.5455 0.7418 - 0.2652 0.8362 0.7342 - 0.4792 0.8744 0.6765 - 0.3494 0.9809 0.9374 - 0.4120 0.9923 0.1729 - 0.8693 0.4478 0.9683 - 0.2047 0.0203 0.7611 - 0.2584 0.7700 0.7948 + 0.1184 0.1251 0.0214 + 0.5802 0.0419 0.5646 + 0.7721 0.2065 0.3439 + 0.8848 0.7671 0.2095 + 0.5418 0.3479 0.6222 + 0.8559 0.5945 0.7391 + 0.6337 0.6223 0.5492 + 0.0702 0.5033 0.6576 + 0.0921 0.6129 0.9543 + 0.8458 0.6076 0.3383 + 0.4057 0.1879 0.5339 + 0.0289 0.5740 0.8159 + 0.2173 0.5540 0.1329 + 0.5727 0.7952 0.9536 + 0.5524 0.2359 0.5984 + 0.4675 0.2840 0.3707 + 0.8868 0.5361 0.0724 + 0.9720 0.0704 0.1437 + 0.4901 0.2043 0.1668 + 0.4051 0.5348 0.8620 + 0.4173 0.5441 0.1257 + 0.1043 0.2794 0.7575 + 0.5445 0.8990 0.4524 + 0.1090 0.8750 0.9088 + 0.8141 0.4295 0.4942 + 0.0896 0.5689 0.9763 + 0.4692 0.4561 0.9672 + 0.5486 0.5594 0.7761 + 0.5805 0.8100 0.1513 + 0.8436 0.7339 0.5115 + 0.0133 0.0170 0.3654 + 0.2173 0.4141 0.6722 + 0.1264 0.5418 0.5239 + 0.2281 0.1424 0.2084 + 0.3829 0.8320 0.6373 + 0.1969 0.7664 0.5257 + 0.4521 0.7498 0.0649 + 0.2503 0.4570 0.1978 + 0.2399 0.7075 0.6893 + 0.4851 0.6479 0.6504 spike_snippets(:,:,13) = - 0.0157 0.0647 0.6416 - 0.7638 0.1440 0.4338 - 0.3404 0.7033 0.9323 - 0.3327 0.2419 0.0158 - 0.1027 0.5447 0.9455 - 0.4155 0.5504 0.4124 - 0.4389 0.7090 0.1019 - 0.1135 0.1518 0.7802 - 0.1862 0.0991 0.9385 - 0.8108 0.3330 0.3703 - 0.8882 0.0429 0.0777 - 0.6938 0.3064 0.6495 - 0.3660 0.9739 0.9794 - 0.2094 0.1125 0.6123 - 0.9374 0.2039 0.4439 - 0.3380 0.0786 0.5313 - 0.6468 0.8286 0.6347 - 0.8093 0.9563 0.2979 - 0.2439 0.3000 0.7636 - 0.9876 0.4089 0.9489 - 0.0655 0.6382 0.4527 - 0.5187 0.1400 0.3417 - 0.4703 0.5862 0.9807 - 0.2048 0.6405 0.4133 - 0.7057 0.7886 0.9320 - 0.2141 0.2059 0.3750 - 0.5749 0.4097 0.0935 - 0.1075 0.7629 0.3086 - 0.7586 0.6562 0.2721 - 0.8715 0.4178 0.0318 - 0.7900 0.4142 0.5397 - 0.5306 0.9462 0.6588 - 0.4306 0.8370 0.4302 - 0.5899 0.5945 0.0762 - 0.8496 0.3275 0.7257 - 0.2751 0.2624 0.5545 - 0.1538 0.0924 0.3398 - 0.7160 0.0858 0.0901 - 0.9813 0.8219 0.6498 - 0.8121 0.5394 0.8237 + 0.1851 0.2148 0.3096 + 0.1530 0.6928 0.4706 + 0.5957 0.5997 0.6436 + 0.5111 0.9477 0.0237 + 0.2794 0.8481 0.2508 + 0.8733 0.8629 0.9143 + 0.8843 0.5084 0.3684 + 0.2139 0.3135 0.3625 + 0.5994 0.2873 0.0790 + 0.9182 0.7084 0.1474 + 0.0354 0.0425 0.9387 + 0.2318 0.1590 0.8480 + 0.3196 0.2009 0.7093 + 0.1199 0.3389 0.8795 + 0.0257 0.4380 0.0876 + 0.3023 0.9498 0.4555 + 0.6875 0.8848 0.0010 + 0.5839 0.9727 0.6120 + 0.5932 0.3215 0.9277 + 0.7070 0.6221 0.4235 + 0.4214 0.4862 0.8240 + 0.3256 0.7700 0.4219 + 0.8684 0.9093 0.2151 + 0.1271 0.2716 0.2960 + 0.8478 0.4911 0.6642 + 0.1270 0.8443 0.8821 + 0.8903 0.9322 0.1781 + 0.0355 0.4999 0.5528 + 0.8283 0.6655 0.4869 + 0.9501 0.6728 0.0283 + 0.0597 0.0752 0.5528 + 0.0772 0.8877 0.5799 + 0.0882 0.7317 0.1380 + 0.6245 0.6600 0.9433 + 0.4312 0.1948 0.2695 + 0.2354 0.4766 0.3604 + 0.9902 0.3074 0.5376 + 0.7988 0.9897 0.9941 + 0.8217 0.5316 0.8525 + 0.2351 0.7831 0.0319 spike_snippets(:,:,14) = - 0.0221 0.8614 0.7634 - 0.3983 0.6727 0.3550 - 0.9539 0.1561 0.6813 - 0.5583 0.5885 0.9967 - 0.4075 0.0813 0.4429 - 0.2310 0.0248 0.7509 - 0.6427 0.7612 0.3196 - 0.7487 0.7756 0.8189 - 0.0629 0.4779 0.6550 - 0.8839 0.6752 0.3173 - 0.6077 0.3845 0.6331 - 0.3133 0.1429 0.8957 - 0.4345 0.7169 0.9520 - 0.0100 0.3340 0.6187 - 0.5361 0.1743 0.7057 - 0.7226 0.3522 0.6633 - 0.2896 0.4041 0.8869 - 0.7655 0.6235 0.4579 - 0.8103 0.0950 0.5008 - 0.8029 0.9529 0.8503 - 0.3489 0.9096 0.4176 - 0.6609 0.9922 0.3921 - 0.8915 0.3578 0.2378 - 0.3911 0.2561 0.2023 - 0.1938 0.1357 0.0510 - 0.5737 0.0948 0.8470 - 0.0540 0.6226 0.4725 - 0.2451 0.7750 0.8025 - 0.8169 0.3337 0.6998 - 0.2011 0.9325 0.9863 - 0.8228 0.7149 0.2157 - 0.9203 0.8141 0.3663 - 0.7566 0.7477 0.5670 - 0.8637 0.9622 0.7179 - 0.8148 0.6600 0.2051 - 0.4581 0.3688 0.0015 - 0.0350 0.1912 0.5752 - 0.5222 0.8343 0.5959 - 0.7374 0.5795 0.6809 - 0.9218 0.9206 0.8737 + 0.2230 0.1351 0.7886 + 0.4238 0.2492 0.9146 + 0.1847 0.5595 0.5707 + 0.8921 0.0787 0.4474 + 0.7938 0.3050 0.6435 + 0.0043 0.8448 0.9762 + 0.9224 0.5257 0.8517 + 0.0390 0.3533 0.2300 + 0.1118 0.7620 0.4621 + 0.2636 0.3288 0.9287 + 0.4195 0.1997 0.1947 + 0.6326 0.5843 0.1339 + 0.9864 0.6860 0.5085 + 0.3759 0.6882 0.3052 + 0.2147 0.6437 0.8457 + 0.8211 0.9626 0.7382 + 0.8825 0.5314 0.3377 + 0.2341 0.1485 0.8010 + 0.3810 0.8068 0.4227 + 0.4321 0.4115 0.7880 + 0.9936 0.1828 0.3977 + 0.7010 0.2326 0.6093 + 0.1119 0.4843 0.9668 + 0.0840 0.3081 0.2195 + 0.8017 0.3575 0.2703 + 0.6757 0.3959 0.3937 + 0.0061 0.4527 0.3682 + 0.1994 0.8625 0.6531 + 0.0574 0.4723 0.1477 + 0.0919 0.6493 0.7246 + 0.6749 0.4246 0.8361 + 0.1309 0.4423 0.8770 + 0.2955 0.5541 0.6218 + 0.3190 0.6917 0.7228 + 0.6028 0.3446 0.4859 + 0.6943 0.8714 0.3217 + 0.6263 0.6614 0.6188 + 0.5735 0.2745 0.5193 + 0.4774 0.9703 0.1984 + 0.5386 0.6275 0.1304 spike_snippets(:,:,15) = - 0.7865 0.7816 0.6155 - 0.5372 0.8114 0.4325 - 0.3727 0.8911 0.7185 - 0.0353 0.0340 0.4635 - 0.5840 0.0862 0.1968 - 0.9519 0.5324 0.2445 - 0.3134 0.7084 0.1353 - 0.1848 0.7557 0.4126 - 0.0106 0.8252 0.7487 - 0.1224 0.7105 0.7313 - 0.8718 0.5462 0.9643 - 0.2917 0.9847 0.3488 - 0.5548 0.8527 0.6744 - 0.0908 0.7675 0.8040 - 0.1565 0.1608 0.3398 - 0.7158 0.9291 0.1652 - 0.6822 0.5056 0.6049 - 0.6157 0.1270 0.7319 - 0.8646 0.4195 0.5200 - 0.0489 0.9945 0.8455 - 0.8568 0.1741 0.1825 - 0.5738 0.0524 0.1239 - 0.8604 0.1834 0.0426 - 0.3432 0.0838 0.5858 - 0.1225 0.9384 0.2049 - 0.8457 0.1780 0.2640 - 0.0039 0.7270 0.9247 - 0.2992 0.3269 0.1270 - 0.9960 0.6671 0.7288 - 0.3351 0.2429 0.6398 - 0.5583 0.6861 0.2227 - 0.3737 0.3230 0.4208 - 0.0274 0.5645 0.2406 - 0.5473 0.4634 0.8339 - 0.6710 0.1899 0.1739 - 0.9775 0.4120 0.5454 - 0.3883 0.3817 0.5621 - 0.4033 0.6777 0.4225 - 0.7234 0.2555 0.9704 - 0.1591 0.4925 0.9903 + 0.2262 0.2766 0.5907 + 0.2056 0.1937 0.8867 + 0.1219 0.6344 0.5519 + 0.5776 0.6414 0.7407 + 0.4338 0.4308 0.8669 + 0.4408 0.5366 0.0469 + 0.4334 0.6519 0.2752 + 0.0031 0.3424 0.6518 + 0.0089 0.9570 0.5937 + 0.3908 0.1357 0.6025 + 0.7333 0.2195 0.2525 + 0.1027 0.9820 0.3862 + 0.8368 0.5239 0.1034 + 0.5086 0.8720 0.9551 + 0.6295 0.4330 0.9450 + 0.8806 0.3041 0.5778 + 0.8743 0.3345 0.8624 + 0.9921 0.4705 0.1314 + 0.4447 0.1070 0.5149 + 0.7418 0.5089 0.6865 + 0.5510 0.5950 0.6378 + 0.5892 0.7082 0.6455 + 0.9912 0.5156 0.8352 + 0.3359 0.6611 0.4911 + 0.3669 0.8796 0.2214 + 0.1394 0.4076 0.7643 + 0.9438 0.9816 0.3084 + 0.3012 0.6891 0.7769 + 0.4734 0.3384 0.8854 + 0.6214 0.6087 0.1137 + 0.0905 0.7920 0.2819 + 0.1783 0.8610 0.3101 + 0.1026 0.2972 0.1394 + 0.9566 0.4932 0.2185 + 0.1568 0.0195 0.2752 + 0.1294 0.8462 0.1243 + 0.5607 0.1783 0.9560 + 0.6664 0.4109 0.7201 + 0.9564 0.1284 0.8795 + 0.3678 0.5102 0.1463 spike_snippets(:,:,16) = - 0.9601 0.4261 0.8380 - 0.4578 0.3814 0.9816 - 0.7650 0.7522 0.4094 - 0.0475 0.7618 0.2626 - 0.0517 0.4061 0.9587 - 0.3187 0.5696 0.0575 - 0.9259 0.4462 0.2033 - 0.5448 0.1725 0.5606 - 0.1203 0.7607 0.0725 - 0.8443 0.4323 0.7786 - 0.5015 0.6739 0.2669 - 0.0986 0.3635 0.6841 - 0.4879 0.6765 0.0829 - 0.9984 0.5124 0.1379 - 0.2017 0.6917 0.2215 - 0.2086 0.6594 0.5955 - 0.1700 0.9997 0.9314 - 0.2926 0.9844 0.1808 - 0.7029 0.1544 0.3578 - 0.1826 0.5482 0.9631 - 0.5764 0.0881 0.1198 - 0.2232 0.6394 0.1269 - 0.0194 0.4497 0.3601 - 0.7354 0.7041 0.9677 - 0.8830 0.4438 0.7886 - 0.5622 0.1308 0.8845 - 0.7777 0.6478 0.4099 - 0.9439 0.9918 0.3069 - 0.1511 0.8404 0.6417 - 0.3328 0.5915 0.7386 - 0.7354 0.3478 0.1711 - 0.5607 0.9615 0.8547 - 0.8202 0.1768 0.7434 - 0.9688 0.3658 0.0483 - 0.3226 0.4188 0.7442 - 0.6305 0.0570 0.8543 - 0.0882 0.8940 0.9014 - 0.2526 0.0621 0.0940 - 0.8808 0.3889 0.5883 - 0.6945 0.2075 0.9826 + 0.1927 0.6688 0.6547 + 0.1281 0.6194 0.0771 + 0.2197 0.5600 0.5198 + 0.4552 0.9523 0.6863 + 0.3747 0.6933 0.0655 + 0.0005 0.2037 0.3981 + 0.6358 0.3771 0.3128 + 0.9756 0.2283 0.1688 + 0.2239 0.9016 0.6976 + 0.6167 0.2771 0.7410 + 0.8370 0.4043 0.8922 + 0.1644 0.5570 0.8032 + 0.1674 0.9934 0.9522 + 0.3557 0.8356 0.3211 + 0.9197 0.0929 0.0852 + 0.5803 0.2539 0.5705 + 0.5259 0.0673 0.3024 + 0.6417 0.3843 0.7508 + 0.8997 0.1641 0.3253 + 0.5032 0.4427 0.6970 + 0.0421 0.0260 0.5815 + 0.2497 0.6524 0.2077 + 0.0868 0.2699 0.6739 + 0.7045 0.2186 0.7132 + 0.2521 0.5041 0.4006 + 0.4592 0.3762 0.8459 + 0.3910 0.6362 0.8886 + 0.9811 0.0518 0.6936 + 0.9311 0.1824 0.4904 + 0.3803 0.1296 0.3489 + 0.2317 0.9686 0.2949 + 0.7826 0.0530 0.1981 + 0.9760 0.7078 0.9084 + 0.1940 0.3259 0.6837 + 0.4076 0.6466 0.9943 + 0.0136 0.9390 0.2555 + 0.3636 0.5421 0.9818 + 0.9103 0.4774 0.2366 + 0.8823 0.6284 0.0572 + 0.3817 0.4467 0.2317 spike_snippets(:,:,17) = - 0.2518 0.5818 0.5687 - 0.1692 0.2601 0.8900 - 0.9416 0.9621 0.9741 - 0.6602 0.8987 0.2570 - 0.1918 0.9138 0.1570 - 0.4492 0.2385 0.0065 - 0.2470 0.6987 0.7600 - 0.4756 0.2300 0.5099 - 0.7998 0.4087 0.1418 - 0.3431 0.9322 0.6007 - 0.6657 0.9061 0.4275 - 0.8680 0.5521 0.2827 - 0.2041 0.2542 0.1747 - 0.8590 0.0126 0.7438 - 0.9619 0.0740 0.6684 - 0.0479 0.9238 0.3660 - 0.0550 0.0913 0.3853 - 0.6281 0.2848 0.6150 - 0.7952 0.2270 0.6275 - 0.4146 0.8272 0.9834 - 0.7049 0.8764 0.7300 - 0.8926 0.7747 0.2170 - 0.0096 0.2669 0.7916 - 0.4492 0.9704 0.6413 - 0.2610 0.9420 0.6689 - 0.5655 0.8651 0.2311 - 0.7637 0.2866 0.1800 - 0.2147 0.0454 0.4293 - 0.2542 0.5383 0.2259 - 0.9819 0.8289 0.4630 - 0.6742 0.0134 0.3185 - 0.1221 0.7918 0.9145 - 0.1994 0.2983 0.8845 - 0.1645 0.5156 0.6800 - 0.0033 0.2655 0.0551 - 0.5693 0.5705 0.0326 - 0.2717 0.6311 0.1091 - 0.9801 0.3286 0.5908 - 0.5141 0.1275 0.6234 - 0.3310 0.6454 0.7261 + 0.6173 0.6918 0.6871 + 0.7990 0.7099 0.8378 + 0.8449 0.0978 0.9949 + 0.5732 0.7979 0.6361 + 0.7057 0.3483 0.5367 + 0.2349 0.2924 0.7952 + 0.1477 0.4052 0.9149 + 0.9360 0.5117 0.0062 + 0.4026 0.8478 0.4686 + 0.9453 0.4626 0.3981 + 0.8858 0.2622 0.2753 + 0.5764 0.1099 0.3039 + 0.3797 0.8276 0.6748 + 0.1666 0.9840 0.7505 + 0.5156 0.3978 0.2766 + 0.0482 0.8001 0.9245 + 0.2122 0.5472 0.2862 + 0.3097 0.3191 0.8146 + 0.3381 0.4056 0.7843 + 0.1068 0.2273 0.6883 + 0.7219 0.8860 0.6370 + 0.2746 0.9846 0.0249 + 0.3418 0.3116 0.4372 + 0.1499 0.1693 0.3565 + 0.7936 0.9327 0.5851 + 0.0315 0.7144 0.9622 + 0.0995 0.4372 0.1286 + 0.8053 0.0565 0.4768 + 0.7469 0.6741 0.1784 + 0.3801 0.1842 0.0446 + 0.9876 0.0459 0.6812 + 0.3980 0.6965 0.4432 + 0.8502 0.9950 0.0137 + 0.7209 0.4370 0.6352 + 0.8724 0.0388 0.8579 + 0.2434 0.4660 0.3433 + 0.9861 0.0908 0.2780 + 0.4661 0.4741 0.7048 + 0.5965 0.5980 0.7120 + 0.9756 0.2825 0.6311 spike_snippets(:,:,18) = - 0.6792 0.1536 0.7686 - 0.4197 0.6222 0.3823 - 0.3714 0.4234 0.2509 - 0.7312 0.3902 0.0159 - 0.7945 0.9858 0.1467 - 0.5954 0.0416 0.6832 - 0.6992 0.2205 0.4558 - 0.5526 0.3969 0.6680 - 0.0647 0.0462 0.5156 - 0.0087 0.1158 0.5595 - 0.3502 0.2373 0.1293 - 0.3708 0.9807 0.5301 - 0.6378 0.8133 0.2024 - 0.3669 0.0297 0.6785 - 0.2471 0.4422 0.2760 - 0.2854 0.5070 0.9157 - 0.4780 0.8939 0.2641 - 0.0007 0.4187 0.1611 - 0.2343 0.2207 0.5019 - 0.3406 0.6748 0.8346 - 0.1625 0.8566 0.0020 - 0.5023 0.6093 0.5408 - 0.5373 0.5792 0.9837 - 0.4145 0.5383 0.3824 - 0.6758 0.0357 0.1393 - 0.2909 0.0263 0.2084 - 0.9296 0.4293 0.0568 - 0.1195 0.8615 0.3890 - 0.6217 0.4449 0.8288 - 0.2219 0.2328 0.2420 - 0.9573 0.7066 0.0879 - 0.3173 0.7592 0.4618 - 0.0770 0.2486 0.6727 - 0.3387 0.2439 0.4620 - 0.6189 0.2457 0.6979 - 0.4550 0.4702 0.6991 - 0.3922 0.4539 0.3660 - 0.1967 0.6131 0.1070 - 0.9190 0.3731 0.9881 - 0.6727 0.0177 0.8368 + 0.3776 0.7823 0.0801 + 0.8622 0.9565 0.5796 + 0.1562 0.4375 0.9515 + 0.6307 0.1624 0.2088 + 0.4483 0.3889 0.3454 + 0.2331 0.8179 0.4931 + 0.7838 0.0012 0.3175 + 0.1697 0.1593 0.4797 + 0.2247 0.6018 0.8109 + 0.0227 0.7476 0.2138 + 0.6950 0.5190 0.2881 + 0.4064 0.3057 0.6401 + 0.2390 0.8704 0.0040 + 0.6227 0.1564 0.0455 + 0.0884 0.0660 0.4039 + 0.2207 0.2480 0.9150 + 0.4498 0.5628 0.7846 + 0.0646 0.8577 0.3313 + 0.7398 0.3892 0.9641 + 0.4970 0.0113 0.2510 + 0.5149 0.6946 0.4709 + 0.3363 0.4596 0.7754 + 0.1217 0.6060 0.3198 + 0.2941 0.8403 0.3636 + 0.8140 0.8582 0.7648 + 0.9589 0.5882 0.1668 + 0.2749 0.3104 0.1562 + 0.9278 0.1316 0.6444 + 0.8572 0.8799 0.8106 + 0.0872 0.1756 0.3494 + 0.8922 0.9633 0.0120 + 0.2752 0.6267 0.2324 + 0.0307 0.7052 0.7999 + 0.0839 0.3741 0.6110 + 0.4028 0.6985 0.5585 + 0.6630 0.8418 0.7399 + 0.1706 0.5353 0.9734 + 0.6713 0.3043 0.4227 + 0.6851 0.4996 0.0506 + 0.3057 0.4802 0.9650 spike_snippets(:,:,19) = - 0.5723 0.4162 0.5737 - 0.7365 0.7400 0.0192 - 0.3486 0.1283 0.5239 - 0.5596 0.0741 0.9627 - 0.7251 0.3255 0.9218 - 0.4888 0.2237 0.8870 - 0.2031 0.5954 0.6067 - 0.3191 0.4081 0.8511 - 0.4727 0.8630 0.4413 - 0.0459 0.9529 0.9355 - 0.0706 0.7296 0.7513 - 0.1063 0.2827 0.0582 - 0.9681 0.3477 0.4857 - 0.0197 0.6786 0.2709 - 0.5342 0.7845 0.3807 - 0.4403 0.9275 0.8690 - 0.1449 0.7715 0.0911 - 0.4528 0.3883 0.4938 - 0.2482 0.6608 0.2387 - 0.2375 0.4085 0.6854 - 0.4636 0.7216 0.3191 - 0.4088 0.6269 0.4242 - 0.6251 0.8265 0.3873 - 0.7480 0.9342 0.8437 - 0.7078 0.5361 0.7469 - 0.6856 0.5139 0.4963 - 0.9682 0.1418 0.5922 - 0.3966 0.6482 0.8709 - 0.6875 0.3060 0.4249 - 0.3703 0.8274 0.2291 - 0.7073 0.3335 0.8946 - 0.5328 0.5704 0.4358 - 0.3135 0.3453 0.4677 - 0.4190 0.8187 0.4792 - 0.4847 0.5276 0.9708 - 0.2647 0.7839 0.6610 - 0.4281 0.1247 0.1745 - 0.4473 0.1502 0.9363 - 0.5404 0.8297 0.3259 - 0.8203 0.1586 0.0542 + 0.5319 0.4611 0.0238 + 0.0107 0.4021 0.9675 + 0.2670 0.4292 0.2256 + 0.0075 0.2988 0.7416 + 0.6676 0.3036 0.8923 + 0.2578 0.9139 0.3128 + 0.4729 0.1512 0.3253 + 0.0726 0.7248 0.6174 + 0.1111 0.1281 0.6482 + 0.1313 0.5600 0.3097 + 0.6213 0.9661 0.2627 + 0.2338 0.6094 0.3207 + 0.1518 0.5683 0.1826 + 0.4942 0.6299 0.3986 + 0.7793 0.3064 0.4732 + 0.6928 0.7628 0.8839 + 0.6003 0.6119 0.9674 + 0.2245 0.4440 0.3893 + 0.3195 0.2501 0.3615 + 0.9588 0.0686 0.9949 + 0.1095 0.7686 0.3792 + 0.6823 0.8999 0.1835 + 0.4789 0.4263 0.1516 + 0.7116 0.3164 0.5941 + 0.1937 0.2194 0.6845 + 0.6531 0.7972 0.8251 + 0.8248 0.3564 0.6396 + 0.9730 0.2390 0.7955 + 0.7474 0.6799 0.7575 + 0.9625 0.1981 0.9859 + 0.2182 0.2432 0.8913 + 0.6330 0.5699 0.0269 + 0.6607 0.3176 0.4056 + 0.1300 0.8386 0.4653 + 0.5340 0.0663 0.1382 + 0.6349 0.7329 0.6797 + 0.0701 0.4965 0.6668 + 0.5020 0.1398 0.9634 + 0.5295 0.0102 0.9432 + 0.4737 0.2624 0.7338 spike_snippets(:,:,20) = - 0.1943 0.5619 0.1293 - 0.9273 0.8478 0.7970 - 0.1930 0.3151 0.4309 - 0.7377 0.5235 0.5462 - 0.2804 0.0120 0.1150 - 0.1102 0.7948 0.4490 - 0.3471 0.2344 0.6634 - 0.9368 0.7492 0.8331 - 0.0338 0.8952 0.0004 - 0.3556 0.8802 0.2122 - 0.3900 0.4580 0.4061 - 0.3526 0.3209 0.9486 - 0.1045 0.3968 0.7268 - 0.3758 0.6132 0.2621 - 0.2642 0.8817 0.2963 - 0.5723 0.1138 0.3768 - 0.9351 0.0277 0.3637 - 0.1406 0.2203 0.2729 - 0.5997 0.5051 0.3468 - 0.2357 0.7267 0.0786 - 0.9923 0.6103 0.2772 - 0.1016 0.6222 0.8030 - 0.4693 0.7362 0.1926 - 0.7770 0.7613 0.1670 - 0.8043 0.4398 0.5129 - 0.5659 0.0116 0.4863 - 0.2755 0.4490 0.3219 - 0.9902 0.0969 0.6059 - 0.5231 0.5545 0.6418 - 0.6858 0.0013 0.3912 - 0.7352 0.1463 0.8434 - 0.3129 0.7567 0.2621 - 0.8429 0.9725 0.3036 - 0.0225 0.0850 0.6518 - 0.8738 0.2763 0.6083 - 0.9140 0.8860 0.5986 - 0.1661 0.6797 0.4139 - 0.0239 0.4074 0.7700 - 0.3080 0.5475 0.4765 - 0.7355 0.0164 0.3026 -
 
% Create electrode table region referencing electrodes 0, 1, and 2
shank0_table_region = types.hdmf_common.DynamicTableRegion( ...
'table', types.untyped.ObjectView(ElectrodesDynamicTable), ...
'description', 'shank0', ...
'data', (0:2)');
 
% Define spike event series for unsorted spike times
spike_events = types.core.SpikeEventSeries( ...
'data', spike_snippets, ...
'timestamps', (0:19)', ... % Timestamps for each event
'description', 'events detected with 100uV threshold', ...
'electrodes', shank0_table_region ...
);
 
% Add spike event series to NWB file acquisition
nwb.acquisition.set('SpikeEvents_Shank0', spike_events);

Designating Electrophysiology Data

As mentioned above, ElectricalSeries objects are meant for storing specific types of extracellular recordings. In addition to this TimeSeries class, NWB provides some Processing Modules for designating the type of data you are storing. We will briefly discuss them here, and refer the reader to the API documentation and Intro to NWB for more details on using these objects.
For storing unsorted spiking data, there are two options. Which one you choose depends on what data you have available. If you need to store complete and/or continuous raw voltage traces, you should store the traces with ElectricalSeries objects as acquisition data, and use the EventDetection class for identifying the spike events in your raw traces. If you do not want to store the raw voltage traces and only the waveform ‘snippets’ surrounding spike events, you should use SpikeEventSeries objects.
The results of spike sorting (or clustering) should be stored in the top-level Units table. The Units table can hold just the spike times of sorted units or, optionally, include additional waveform information. You can use the optional predefined columns waveform_mean, waveform_sd, and waveforms in the Units table to store individual and mean waveform data.
For local field potential data, there are two options. Again, which one you choose depends on what data you have available. With both options, you should store your traces with ElectricalSeries objects. If you are storing unfiltered local field potential data, you should store the ElectricalSeries objects in LFP data interface object(s). If you have filtered LFP data, you should store the ElectricalSeries objects in FilteredEphys data interface object(s).

Writing the NWB File

nwbExport(nwb, 'ecephys_tutorial.nwb')

Reading NWB Data

Data arrays are read passively from the file. Calling TimeSeries.data does not read the data values, but presents an HDF5 object that can be indexed to read data. This allows you to conveniently work with datasets that are too large to fit in RAM all at once. load with no input arguments reads the entire dataset:
nwb2 = nwbRead('ecephys_tutorial.nwb', 'ignorecache');
nwb2.processing.get('ecephys'). ...
nwbdatainterface.get('LFP'). ...
electricalseries.get('ElectricalSeries'). ...
data.load;

Accessing Data Regions

If all you need is a data region, you can index a DataStub object like you would any normal array in MATLAB, as shown below. When indexing the dataset this way, only the selected region is read from disk into RAM. This allows you to handle very large datasets that would not fit entirely into RAM.
% read section of LFP
nwb2.processing.get('ecephys'). ...
nwbdatainterface.get('LFP'). ...
electricalseries.get('ElectricalSeries'). ...
data(1:5, 1:10)
ans = 5×10
-1.0039 -0.5621 -1.1019 0.1768 0.2032 0.1612 -0.5518 0.8552 -1.3040 -0.5646 - -0.3458 -1.2921 -0.1967 1.7260 -1.5245 1.3653 -0.6380 0.8438 -0.7094 0.7466 - 0.2758 -0.3401 0.3549 0.4890 -0.2288 0.1290 2.1648 0.1316 -0.2172 0.3036 - -0.8548 -1.5282 -0.0919 -0.1388 1.7996 -0.2845 -1.1904 0.5773 -0.3059 -0.9745 - 0.1536 -0.2051 2.4873 1.0999 0.6398 -0.1086 -0.2511 -0.0993 1.3019 0.0095 -
 
% You can use the getRow method of the table to load spike times of a specific unit.
% To get the values, unpack from the returned table.
nwb.units.getRow(1).spike_times{1}
ans = 21×1
0.8383 - 0.6321 - 0.2418 - 0.2965 - 0.9865 - 0.2779 - 0.9945 - 0.5980 - 0.1216 - 0.1694 -

Learn more!

See the API documentation to learn what data types are available.

MATLAB tutorials

Python tutorials

See our tutorials for more details about your data type:
Check out other tutorials that teach advanced NWB topics:

+ 0.6584 0.9637 0.6694 + 0.6882 0.9234 0.5334 + 0.9451 0.2206 0.1100 + 0.1020 0.7264 0.1427 + 0.8448 0.6778 0.2754 + 0.1440 0.4233 0.8132 + 0.5736 0.6490 0.4518 + 0.2343 0.2426 0.4747 + 0.0774 0.1005 0.0246 + 0.9198 0.3224 0.4104 + 0.4359 0.3599 0.1246 + 0.5686 0.0664 0.3270 + 0.2882 0.4851 0.5189 + 0.7017 0.9357 0.8863 + 0.3291 0.3256 0.1743 + 0.7455 0.4708 0.5486 + 0.6446 0.0108 0.8551 + 0.4382 0.1401 0.4226 + 0.2296 0.6263 0.9103 + 0.2811 0.5259 0.3679 + 0.6857 0.9481 0.0568 + 0.2926 0.8703 0.7404 + 0.8050 0.0736 0.1273 + 0.7048 0.6245 0.4469 + 0.9038 0.0299 0.8430 + 0.5372 0.8920 0.6377 + 0.9344 0.5897 0.1500 + 0.5390 0.3147 0.9303 + 0.6639 0.7378 0.5821 + 0.7281 0.8026 0.4448 + 0.2334 0.8817 0.7433 + 0.4686 0.5002 0.2370 + 0.8984 0.6981 0.5906 + 0.4098 0.2956 0.0880 + 0.2328 0.6203 0.4738 + 0.6246 0.7486 0.9808 + 0.2156 0.1182 0.3692 + 0.6777 0.0449 0.6831 + 0.3080 0.6611 0.3553 + 0.0171 0.1520 0.3349 +
 
% Create electrode table region referencing electrodes 0, 1, and 2
shank0_table_region = types.hdmf_common.DynamicTableRegion( ...
'table', types.untyped.ObjectView(electrodesDynamicTable), ...
'description', 'shank0', ...
'data', (0:2)');
 
% Define spike event series for unsorted spike times
spike_events = types.core.SpikeEventSeries( ...
'data', spike_snippets, ...
'timestamps', (0:19)', ... % Timestamps for each event
'description', 'events detected with 100uV threshold', ...
'electrodes', shank0_table_region ...
);
 
% Add spike event series to NWB file acquisition
nwb.acquisition.set('SpikeEvents_Shank0', spike_events);

Detected Events

If you need to store the complete, continuous raw voltage traces, along with unsorted spike times, you should store the traces in ElectricalSeries objects in the acquisition group, and use the EventDetection class to identify the spike events in your raw traces.
% Create the EventDetection object
event_detection = types.core.EventDetection( ...
'detection_method', 'thresholding, 1.5 * std', ...
'source_electricalseries', types.untyped.SoftLink(raw_electrical_series), ...
'source_idx', [1000; 2000; 3000], ...
'times', [.033, .066, .099] ...
);
 
% Add the EventDetection object to the ecephys module
ecephys_module.nwbdatainterface.set('ThresholdEvents', event_detection);

Storing Spike Features (e.g Principal Components)

NWB also provides a way to store features of spikes, such as principal components, using the FeatureExtraction class.
% Generate random feature data (time x channel x feature)
features = rand(3, 12, 4); % 3 time points, 12 channels, 4 features
features = permute(features, [3,2,1]) % reverse dimension order for matnwb
features =
features(:,:,1) = + + 0.9316 0.4439 0.1664 0.8142 0.2697 0.6258 0.4445 0.5889 0.5936 0.5510 0.3843 0.0928 + 0.6321 0.6096 0.2896 0.5378 0.2169 0.2326 0.6727 0.3081 0.5352 0.3272 0.3730 0.7105 + 0.5674 0.5495 0.8397 0.5804 0.3298 0.0668 0.6826 0.1170 0.2237 0.8309 0.8602 0.1544 + 0.4657 0.4697 0.6416 0.8899 0.2070 0.2748 0.1939 0.7873 0.9721 0.7856 0.0667 0.1039 + + +features(:,:,2) = + + 0.9188 0.8798 0.8666 0.2478 0.7362 0.0880 0.0963 0.1304 0.5751 0.4159 0.8664 0.6476 + 0.9597 0.7697 0.0909 0.7685 0.0993 0.9162 0.8964 0.5880 0.4342 0.1795 0.7080 0.4490 + 0.5198 0.6699 0.2718 0.2714 0.3393 0.5473 0.2908 0.5508 0.2389 0.9618 0.6670 0.1449 + 0.1393 0.5076 0.7794 0.9437 0.9352 0.1637 0.5838 0.1138 0.7266 0.7907 0.8624 0.1127 + + +features(:,:,3) = + + 0.8750 0.5151 0.1783 0.6123 0.1882 0.2455 0.3716 0.9768 0.1423 0.1525 0.3370 0.2588 + 0.4765 0.7175 0.5126 0.4949 0.2113 0.9030 0.0051 0.3652 0.7116 0.9779 0.8704 0.7190 + 0.6226 0.7981 0.6252 0.9443 0.8116 0.8497 0.9575 0.3736 0.2381 0.6094 0.1856 0.6485 + 0.8744 0.2761 0.6534 0.0308 0.2033 0.1817 0.1606 0.0353 0.8287 0.1804 0.5846 0.6030 +
 
% Create the FeatureExtraction object
feature_extraction = types.core.FeatureExtraction( ...
'description', {'PC1', 'PC2', 'PC3', 'PC4'}, ... % Feature descriptions
'electrodes', electrode_table_region, ... % DynamicTableRegion referencing the electrodes table
'times', [.033; .066; .099], ... % Column vector for times
'features', features ...
);
 
% Add the FeatureExtraction object to the ecephys module (if required)
ecephys_module.nwbdatainterface.set('PCA_features', feature_extraction);

Choosing NWB-Types for Electrophysiology Data (A Summary)

As mentioned above, ElectricalSeries objects are meant for storing electrical timeseries data like raw voltage signals or processed signals like LFP or other filtered signals. In addition to the ElectricalSeries class, NWB provides some more classes for storing event-based electropysiological data. We will briefly discuss them here, and refer the reader to the API documentation and the section on Extracellular Physiology in the "NWB Format Specification" for more details on using these objects.
For storing unsorted spiking data, there are two options. Which one you choose depends on what data you have available. If you need to store complete and/or continuous raw voltage traces, you should store the traces with ElectricalSeries objects as acquisition data, and use the EventDetection class for identifying the spike events in your raw traces. If you do not want to store the entire raw voltage traces, only the waveform ‘snippets’ surrounding spike events, you should use SpikeEventSeries objects.
The results of spike sorting (or clustering) should be stored in the top-level Units table. The Units table can hold just the spike times of sorted units or, optionally, include additional waveform information. You can use the optional predefined columns waveform_mean, waveform_sd, and waveforms in the Units table to store individual and mean waveform data.

Writing the NWB File

nwbExport(nwb, 'ecephys_tutorial.nwb')

Reading NWB Data

Data arrays are read passively from the file. Calling TimeSeries.data does not read the data values, but presents an HDF5 object that can be indexed to read data. This allows you to conveniently work with datasets that are too large to fit in RAM all at once. load with no input arguments reads the entire dataset:
nwb2 = nwbRead('ecephys_tutorial.nwb', 'ignorecache');
nwb2.processing.get('ecephys'). ...
nwbdatainterface.get('LFP'). ...
electricalseries.get('ElectricalSeries'). ...
data.load;

Accessing Data Regions

If all you need is a data region, you can index a DataStub object like you would any normal array in MATLAB, as shown below. When indexing the dataset this way, only the selected region is read from disk into RAM. This allows you to handle very large datasets that would not fit entirely into RAM.
% read section of LFP
nwb2.processing.get('ecephys'). ...
nwbdatainterface.get('LFP'). ...
electricalseries.get('ElectricalSeries'). ...
data(1:5, 1:10)
ans = 5×10
-0.0003 -1.3106 2.3180 0.0008 1.9394 1.7373 -1.1235 -0.1723 -0.7690 0.3233 + -2.7453 0.6558 0.7985 -0.7032 -0.1310 0.7679 -1.0497 2.1285 0.8362 0.3742 + 0.7983 1.4374 0.1157 0.9797 0.2739 -1.4714 -2.2506 1.2310 -0.5585 0.0383 + -0.3854 -1.5432 1.3848 0.9771 1.1799 -0.3393 -1.3353 -1.6190 2.2322 -1.1545 + -0.9029 -1.5846 -0.5733 -0.1312 -1.0385 -0.9423 -0.2002 -0.9642 -0.4652 -1.5418 +
 
% You can use the getRow method of the table to load spike times of a specific unit.
% To get the values, unpack from the returned table.
nwb.units.getRow(1).spike_times{1}
ans = 23×1
0.7889 + 0.1248 + 0.0928 + 0.2707 + 0.1974 + 0.6140 + 0.5269 + 0.8578 + 0.2521 + 0.3357 +

Learn more!

See the API documentation to learn what data types are available.

MATLAB tutorials

Python tutorials

See our tutorials for more details about your data type:
Check out other tutorials that teach advanced NWB topics:

\ No newline at end of file diff --git a/tutorials/private/mcode/ecephys.m b/tutorials/private/mcode/ecephys.m index 73c6793c..2258695c 100644 --- a/tutorials/private/mcode/ecephys.m +++ b/tutorials/private/mcode/ecephys.m @@ -1,22 +1,30 @@ %% Neurodata Without Borders Extracellular Electrophysiology Tutorial -%% This tutorial -% Create fake data for a hypothetical extracellular electrophysiology experiment. -% The types of data we will convert are: +%% About This Tutorial +% This tutorial describes storage of hypothetical data from extracellular electrophysiology +% experiments in NWB for the following data categories: %% -% * Voltage recording -% * Local field potential (LFP) +% * Raw voltage recording +% * Local field potential (LFP) and filtered electrical signals % * Spike times -%% +%% Before You Begin % It is recommended to first work through the , which demonstrates installing MatNWB and creating % an NWB file with subject information, animal position, and trials, as well as % writing and reading NWB files in MATLAB. +% +% *Important*: The dimensions of timeseries data in MatNWB should be defined +% in the opposite order of how it is defined in the nwb-schemas. In NWB, time +% is always stored in the first dimension of the data, whereas in MatNWB time +% should be stored in the last dimension of the data. This is explained in more +% detail here: HDF5 Dimension Mapping>. %% Setting up the NWB File % An NWB file represents a single session of an experiment. Each file must have -% a session_description, identifier, and session start time. Create a new object with those and additional metadata. For all MatNWB functions, -% we use the Matlab method of entering keyword argument pairs, where arguments -% are entered as name followed by value. +% a |session_description|, |identifier|, and |session_start_time|. Create a new +% +% object these required fields along with any additional metadata. In MatNWB, +% arguments are specified using MATLAB's keyword argument pair convention, where +% each argument name is followed by its value. nwb = NwbFile( ... 'session_description', 'mouse in open exploration',... @@ -28,13 +36,13 @@ 'general_institution', 'University of My Institution', ... % optional 'general_related_publications', {'DOI:10.1016/j.neuron.2016.12.011'}); % optional nwb -%% Extracellular Electrophysiology +%% Electrode Information % In order to store extracellular electrophysiology data, you first must create % an electrodes table describing the electrodes that generated this data. Extracellular % electrodes are stored in an |electrodes| table, which is also a . |electrodes| has several required fields: |x|, |y|, |z|, % |impedance|, |location|, |filtering|, and |electrode_group|. -%% Electrodes Table +% Electrodes Table % % % Since this is a objects. The |electrodes| table then uses an |ObjectView| % in each row to link to the corresponding object. An |ObjectView| is an object that allow you to create -% a link from one neurodata type referencing another. -%% ElectricalSeries -% Voltage data are stored in objects. is a subclass of specialized for voltage data. In order to create our object, we will need to reference a set of rows in the -% |electrodes| table to indicate which electrodes were recorded. We will do this -% by creating a object. An |ObjectView| is a construct that enables linking +% one neurodata type to another, allowing a neurodata type to reference another +% within the NWB file. +%% Recorded Extracellular Signals +% Voltage data are stored using the class, a subclass of the class specialized for voltage data. +% Referencing Electrodes +% In order to create our object, we first need to reference a set of rows in the +% |electrodes| table to indicate which electrode (channel) each entry in the electrical +% series were recorded from. We will do this by creating a , which is a type of link that allows you to reference % specific rows of a , such as the |electrodes| table, by row indices. +% |*DynamicTable*|>, such as the |electrodes| table, using row indices. % % Create a that references all rows of the |electrodes| table. electrode_table_region = types.hdmf_common.DynamicTableRegion( ... - 'table', types.untyped.ObjectView(ElectrodesDynamicTable), ... + 'table', types.untyped.ObjectView(electrodesDynamicTable), ... 'description', 'all electrodes', ... - 'data', (0:length(ElectrodesDynamicTable.id.data)-1)'); -%% + 'data', (0:length(electrodesDynamicTable.id.data)-1)'); +% Raw Voltage Data % Now create an |ElectricalSeries| object to hold acquisition data collected % during the experiment. % % -electrical_series = types.core.ElectricalSeries( ... +raw_electrical_series = types.core.ElectricalSeries( ... 'starting_time', 0.0, ... % seconds 'starting_time_rate', 30000., ... % Hz - 'data', randn(12, 3000), ... + 'data', randn(numChannels, 3000), ... % nChannels x nTime 'electrodes', electrode_table_region, ... 'data_unit', 'volts'); %% % This is the voltage data recorded directly from our electrodes, so it goes -% in the acquisition group. - -nwb.acquisition.set('ElectricalSeries', electrical_series); -%% LFP -% Local field potential (LFP) refers in this case to data that has been downsampled -% and/or filtered from the original acquisition data and is used to analyze signals -% in the lower frequency range. Filtered and downsampled LFP data would also be -% stored in an . To help data analysis and visualization tools know that % this object represents LFP data, store it inside an |LFP| object, -% then place the |LFP| object in a object represents LFP data, we store it inside an object and then place the object in a named |'ecephys'|. This is analogous to how we stored % the object inside of a object and stored the object in a named |'behavior'| earlier. +% |*ProcessingModule*|> named |'behavior'| in the tutorial % % -electrical_series = types.core.ElectricalSeries( ... +lfp_electrical_series = types.core.ElectricalSeries( ... 'starting_time', 0.0, ... % seconds 'starting_time_rate', 1000., ... % Hz - 'data', randn(12, 100), ... + 'data', randn(numChannels, 100), ... nChannels x nTime + 'filtering', 'Low-pass filter at 300 Hz', ... 'electrodes', electrode_table_region, ... 'data_unit', 'volts'); -lfp = types.core.LFP('ElectricalSeries', electrical_series); +lfp = types.core.LFP('ElectricalSeries', lfp_electrical_series); ecephys_module = types.core.ProcessingModule(... 'description', 'extracellular electrophysiology'); ecephys_module.nwbdatainterface.set('LFP', lfp); nwb.processing.set('ecephys', ecephys_module); -%% Sorted Spike Times -% Ragged Arrays -% Spike times are stored in another of subtype . The default |Units| table is at |/units| in the HDF5 file. You can -% add columns to the table just like you did for |electrodes| and |trials|. Here, we generate -% some random spike data and populate the table. +% Other Types of Filtered Electrical Signals +% If your derived data is filtered for frequency ranges other than LFP—such +% as Gamma or Theta—you should store it in an and encapsulate it within a object instead of the object. + +% Generate filtered data +filtered_data = randn(50, 12); % 50 time points, 12 channels +filtered_data = permute(filtered_data, [2, 1]); % permute timeseries for matnwb + +% Create an ElectricalSeries object +filtered_electrical_series = types.core.ElectricalSeries( ... + 'description', 'Data filtered in the Theta range', ... + 'data', filtered_data, ... + 'electrodes', electrode_table_region, ... + 'filtering', 'Band-pass filtered between 4 and 8 Hz', ... + 'starting_time', 0.0, ... + 'starting_time_rate', 200.0 ... + ); + +% Create a FilteredEphys object and add the filtered electrical series +filtered_ephys = types.core.FilteredEphys(); +filtered_ephys.electricalseries.set('FilteredElectricalSeries', filtered_electrical_series); + +% Add the FilteredEphys object to the ecephys module +ecephys_module.nwbdatainterface.set('FilteredEphys', filtered_ephys); +%% Spike Times and Extracellular Events +% Sorted Spike Times +% Spike times are stored in a table, a specialization of the class. The default table is located at |/units| in the HDF5 file. You can add columns +% to the table just like you did for |electrodes| and |trials| (see ). Here, we generate some random spike data and populate the table. num_cells = 10; -firing_rate = 20; spikes = cell(1, num_cells); for iShank = 1:num_cells spikes{iShank} = rand(1, randi([16, 28])); end spikes -%% +% Ragged Arrays % Spike times are an example of a ragged array- it's like a matrix, but each % row has a different number of elements. We can represent this type of data as -% an indexed column of the units . These indexed columns have two components, the vector data -% object that holds the data and the vector index object that holds the indices -% in the vector that indicate the row breaks. You can use the convenience function -% |util.create_indexed_column| to create these objects. +% an indexed column of the table. These indexed columns have two components, the object that holds the data and the object that holds the indices in the vector that indicate the +% row breaks. You can use the convenience function |util.create_indexed_column| +% to create these objects. For more information about ragged arrays, we refer +% you to the *"Ragged Array Columns"* section of the tutorial. % % @@ -184,8 +227,8 @@ ); nwb.units.toTable -%% Unsorted Spike Times -% In MATLAB, while the table is used to store spike times and waveform data for spike-sorted, % single-unit activity, you may also want to store spike times and waveform snippets % of unsorted spiking activity. This is useful for recording multi-unit activity @@ -202,7 +245,7 @@ % Create electrode table region referencing electrodes 0, 1, and 2 shank0_table_region = types.hdmf_common.DynamicTableRegion( ... - 'table', types.untyped.ObjectView(ElectrodesDynamicTable), ... + 'table', types.untyped.ObjectView(electrodesDynamicTable), ... 'description', 'shank0', ... 'data', (0:2)'); @@ -216,23 +259,60 @@ % Add spike event series to NWB file acquisition nwb.acquisition.set('SpikeEvents_Shank0', spike_events); -%% Designating Electrophysiology Data +% Detected Events +% If you need to store the complete, continuous raw voltage traces, along with +% unsorted spike times, you should store the traces in objects in the acquisition group, and use the class to identify the spike events in your raw traces. + +% Create the EventDetection object +event_detection = types.core.EventDetection( ... + 'detection_method', 'thresholding, 1.5 * std', ... + 'source_electricalseries', types.untyped.SoftLink(raw_electrical_series), ... + 'source_idx', [1000; 2000; 3000], ... + 'times', [.033, .066, .099] ... +); + +% Add the EventDetection object to the ecephys module +ecephys_module.nwbdatainterface.set('ThresholdEvents', event_detection); +% Storing Spike Features (e.g Principal Components) +% NWB also provides a way to store features of spikes, such as principal components, +% using the class. + +% Generate random feature data (time x channel x feature) +features = rand(3, 12, 4); % 3 time points, 12 channels, 4 features +features = permute(features, [3,2,1]) % reverse dimension order for matnwb + +% Create the FeatureExtraction object +feature_extraction = types.core.FeatureExtraction( ... + 'description', {'PC1', 'PC2', 'PC3', 'PC4'}, ... % Feature descriptions + 'electrodes', electrode_table_region, ... % DynamicTableRegion referencing the electrodes table + 'times', [.033; .066; .099], ... % Column vector for times + 'features', features ... +); + +% Add the FeatureExtraction object to the ecephys module (if required) +ecephys_module.nwbdatainterface.set('PCA_features', feature_extraction); +%% Choosing NWB-Types for Electrophysiology Data (A Summary) % As mentioned above, objects are meant for storing specific types of extracellular -% recordings. In addition to this class, NWB provides some for designating the type of data you are storing. We will -% briefly discuss them here, and refer the reader to the and for more details on using these objects. +% |*ElectricalSeries*|> objects are meant for storing electrical timeseries data +% like raw voltage signals or processed signals like LFP or other filtered signals. +% In addition to the class, NWB provides some more classes for storing event-based +% electropysiological data. We will briefly discuss them here, and refer the reader +% to the and the section on in the "NWB Format Specification" for more details +% on using these objects. % % For storing unsorted spiking data, there are two options. Which one you choose % depends on what data you have available. If you need to store complete and/or % continuous raw voltage traces, you should store the traces with objects as acquisition data, and use the class for identifying the spike events in your raw traces. -% If you do not want to store the raw voltage traces and only the waveform ‘snippets’ -% surrounding spike events, you should use objects. % % The results of spike sorting (or clustering) should be stored in the top-level @@ -240,19 +320,8 @@ % |*Units*|> table. The table can hold just the spike times of sorted units or, optionally, % include additional waveform information. You can use the optional predefined -% columns |waveform_mean|, |waveform_sd|, and |waveforms| in the table to store individual and mean waveform data. -% -% For local field potential data, there are two options. Again, which one you -% choose depends on what data you have available. With both options, you should -% store your traces with objects. If you are storing unfiltered local field potential -% data, you should store the objects in data interface object(s). If you have filtered LFP data, you should -% store the objects in data interface object(s). %% Writing the NWB File nwbExport(nwb, 'ecephys_tutorial.nwb') @@ -307,5 +376,4 @@ % * % * -%% \ No newline at end of file +% Advanced HDF5 I/O> \ No newline at end of file