From f45c7fa1e6867fc5caa6073b86a29ea40db616f5 Mon Sep 17 00:00:00 2001 From: haykh Date: Tue, 7 Oct 2025 11:05:32 -0400 Subject: [PATCH] inspect movie fixed + added phaseplot --- README.md | 6 ++ dist/nt2py-1.1.0-py3-none-any.whl | Bin 0 -> 36348 bytes dist/nt2py-1.1.0.tar.gz | Bin 0 -> 30928 bytes nt2/__init__.py | 2 +- nt2/containers/data.py | 11 +++- nt2/plotters/inspect.py | 4 +- nt2/plotters/particles.py | 102 ++++++++++++++++++++++++++++++ nt2/utils.py | 4 +- shell.nix | 2 +- 9 files changed, 123 insertions(+), 8 deletions(-) create mode 100644 dist/nt2py-1.1.0-py3-none-any.whl create mode 100644 dist/nt2py-1.1.0.tar.gz create mode 100644 nt2/plotters/particles.py diff --git a/README.md b/README.md index 9c0e049..f994ee0 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,12 @@ You can also create a movie of a single field quantity (can be custom): (data.fields.Ex * data.fields.Bx).sel(x=slice(None, 0.2)).movie.plot(name="ExBx", vmin=-0.01, vmax=0.01, cmap="BrBG") ``` +For particles, one can also make 2D phase-space plots: + +```python +data.particles[1].sel(t=1.0, method="nearest").particles.phaseplot(x="x", y="uy", xnbins=100, ynbins=200, xlims=(0, 100), cmap="inferno") +``` + You may also combine different quantities and plots (e.g., fields & particles) to produce a more customized movie: ```python diff --git a/dist/nt2py-1.1.0-py3-none-any.whl b/dist/nt2py-1.1.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..580236cb6a8932e905ad059316d294e2b1000743 GIT binary patch literal 36348 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 IS{sN5049jeVgLXD literal 0 HcmV?d00001 diff --git a/dist/nt2py-1.1.0.tar.gz b/dist/nt2py-1.1.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f41e8352618db2137b67e557da80de50a482f5f9 GIT binary patch literal 30928 zcmV()K;OR~iwFP!rp^)q|Lnc(V%s*dFucEY6j5Eye5Sx}K|euj!o`03<+y6y-QcKkPQPL;{1sU@#cW3p*M|p@7c?JYd%SzgsU(LesRW$l>~F|e&+n~=6|?~+}U|D4*aP*vwn#K|I^I> zonAjT|F`=)kMHOIr}(*U7={T;d1N2j$+%xs3Bw%bM%j6TS|2vPn`T5^}{J4KV|3Af#J#mA$KOFY0 zUKg04hvU(2*#625hQl4}YpdI^qgmkhJLBopg>t*dD)O_=nd?tne-^{bp4F$9QE)XJ z_N;CE5+_M;;rQ?xzS4u0Kkj(Z0vqjGyA9lO#snG5pV?=QNBBI(Z;ri4-08xLgGIQ5 z81=TToyM7Gk1tYWK(g55^WpFjwSESzonvEjFf0w%cHx?I99SG`BtXJ?x4A{EpRcj6wDR9$x{Nui#6t zn1t}abMSo+YX)8rjh%#jhn9l*d^qePHt^X`f<+Xr7^UFBYV09s7zgNmV`9e_9Hm|S z>YOcRtS~gU1K-C%WG4Ys*tMvP2ZP9%CE4g%g_rF zY7J=Fa3{V^(7O$nWWDE}jpj~bF=w;`Y#IU7kKBn9BMf8)#LS+t zNr4>+Z6D?zE8eAV!I&9DV!`k55Cs)bgUUztoJ}Zv6U71Ii&F%?Boj7}SS&ebvxHCb z&{@LQM2OnZ^*j=tJqF0L6YSc=jcCq+Olu&;XDiVw*pdNXpF4|ql#!`Vb>U5zjBvhQ zxCtBMU3eVB-1o5C$OK`6o4TK1Ecz3v(k@7$@3MUNg8KEqZb(=%uo5<055L~e7O+eB5gfkN-0DLZ3hauZX z;*j|6ikCQ%I$kiFvFWzWfV}6^2wT2%-;Yq<@`dLSVE6Oh%NHp0yHw!){8uQ>2oX6` zCvt#a5LMuOSV|hG4xwd?xS$V18BNFA+uL7vfI9AkiC*M%_TuZW9_3&38c{fjY0g25 z$TRWSWg?t};*sM|`p1zSpEIex-GEhQ5pogxRhL*Ic9(o1g3rDS>r%iL41flb&6(gj zV#Cy=HPpf>gKK5%I+qSUc-#O5XME9Nq7Uc*%_L`Hl0#|W>ACCM6XMt&N>f-IR^u48 zf*!#`gx(851HEH~AJHsGex1ybH6P)E1G@+}@f;-CE{b+&DT1li8GCjdgREmXvi0F> zm;eo6KL-h<9d9hy-R(W%rHZuSCHh}u2^cv=ob0f*1?xuXGL*b$WZ+D)7r(0ll^nFXZy8@s&GC&e;U%Z8xr*Gg{|kk{vx9cX$NM6mYeu zOO%3VF^TMsn5j7C-Nq8;m%YlAkH&KK9;Vl&J9e^Fq1$-xjuRof-@9Q*GYYZ0JN-XC zcRbJX-Q^wYm}~U^Uca}SxBqQ#-`oE`+5SJgn8n8bF_@}k{2dqopL}av8#lOl4p;Ef z-0t~|8^a&ZcP2-Lt31j*t9}7q#~sMv%<_~MV}KJlok4P8N=jrI-U*l52g~x zoetSJ#vm`Lz_J>iSbvXGcio-66%{!)PVKdr?=Q0?De+M znH%`pphEl|h;`UYut!_4>Dq$skUc}xb;E4~l(EEyap^=xemk!##ui>J0BDJxJ7^xM zgTd5g<;UlN-~|JCsY7HiMA6B>_*?Vp+#R3u&bDyWA3XTxPiunt&Dej?|9ieT+qw#( ziz(=#@m9D1O(8zFRv%>WUnl=}dOJD!zuSL&FaJNy_=D^o7>6_y4Ymt%8jZjo7$@N( zK0j?VehJRv0ZdUcr3`3_M+-mhV420)!cP_*RF*)B(7QNs!g#<1M#oshPCTH=4_et4 z?0m-;!6NzYa+{YhXjvGf-weZ>LWLw+I4KN<cSS;)I~B;|{@zQy4&pf${GGNR-|nOEXd0S%kC5MjskqzfyUd z6U5m&Ln=p$MrT?O=wj_q8!HO_Z-i*hx^;|=(SrPrwfwHKQ`s6J030&Okg`mM>%d@Q z#DWcopNyDt01F_p(*xr_|I@$;m&89op(Za0yRWwK0Di|?i9L%Sv~nYh+sLiid54WK z3~lIkxM=z=ay-Y5ovq7W`9Q<&17sSmJlEGo?2IGWqF9GNA0CYM;NS7+O(BzqwdBDxX%CA>*wQtc6!^p_wxUf`TrsZ4J9Dom@P8%0?x(e++u&scK$hO z;vHsxOPq+DhK-whz3TTk|1lP9G;)168I54TKh^#prh8uh>u>k&<9|NM&uGN;pV0`n z@WcpagS$-(;0PX&K|9AV{Uf%xq_nxAPD%niq1%!T=HA3lreAH?EQ-;f;Y<@&=M8>+gC@eP($fGo1FjF7)}s|{SLbr|fByVGSmP;dQJmPd zeFo*|5Y2+-QF!h|?%4Ja*2I|_&m87GaZu#(4xo>30GphsWpuvfy<)IU(@ZPi#?2sk z%5*3EL(itJ=fpr|`Z9AbaeD_4Ew;NpL_Z_KV4KiR`orl78#-#6m3{*|;mB8t(r1QL zxBdRiRKT?4{iMMMX~@-N5bNnVD+cLg2x`QHe@Q$1Bsn|*PRELcy zX2BjI#_e^}v|v`YiU7%iKy1gk%)(h*DCT%2P+@Y{f(o)g12lF@>LUM2?An}~JfKkK z)PZp=P`a^9M%hA5^J%c~CWap*#w4B05)iD&gu`+0!(wjxZybAq!H-Q4G6Q4k1u!N4 z4g8R_jd(Ggx=Wg{C|;hJBr@PzDleY0PzS>{p!S&qA|im#=LokGalm4pkvZq+zyP5O zP@TAz$Uw=jV5LZftWh3w!DcYSn@bwGJb!^mhG;LtPe}%+31qPs9uOM)YE=uVJZugF zCQ{w*%fbd{;R1FxSifnaVEG6BdWpZj$6v?z>kxnKnm=ci_#y+M`5^8;I}AKKYEI$- zthA(K$4){Fa~1?%#xZDOMU2G)1Eo*|_n#Rd0$^m>lV8Eu#_q(4oJm>=0RXYiVOdYE z0%PLNxkU(uE;0=phSmXk!+4ng-~TfWAg-C5n`=fC@yv!aS~wMGwvFc)mum#r$Q8^% zbvQZQnurXH=mhpA?mQ;E5E1EFiyopJOdkw~MxWF6z{eFmd5U_$vtW$za-gM*Jv2eD zLWjtUAEX7GhutA-yR5b`5j71`r(peZ{KOz-L-678Idm?K+2hkAX1y1+V_bR37_0yg zlPGJ2FVOT}r3(-gkhex7C=5F~X!BLzOF~h82@)rp8)q;8NHwnBSu-b@M*&hood;M> z29I)3Z6e>ymqVqJJbX~>eslQS+W(C`_s(rVYtMgm^XI>|ySqF0`@hdO{&U;)KjHZA z?i9v<=YIeH>GuB?j<+xXz|z!cz^`T)1v7Hr4KbPn)Y^M#`RADb$PJ&){@?5E6ypE- z{oQ;2-zWLulb*t4+i2Ktqt%b3LLsPDNQgZjv_1^w5;nl>m;kU1enN9#=p`gaK+h!T z79Prrnz%du4jx1L=?DIZyOZOjy%D}Wa389a1gDmY&+YM z)p-P{3`FdBP574$!^9mYC-9|>mImYBsof#=+_7_-ju6zrO`2&+U1LpL-!R*NGQqBV)qV>BVR z4Lh143V8&EX4~ks)WT4X{))2cTYxdbGg(jo&s{X(yC@?Sf{h>=-(w2%@yCujqyk3U zXp&)x`qyUN%Yd}tg?Zq!VTDdP6i$Pc>Ci0o{=qe2dGlakTnnf-mhlqAq;cjLGIS_S z4M^-DD1Jgfkgx)V%qOCh$}4yr%88r&?*N-3o`Js^W3ZRT-(_27U9Lakm0f@0ER8wu zkqyl5cYJ3?5zE+`Gec20gDG&$+q)^_c>Z4L$kn->H1U^4`Vi?yK}ca1^{w8}a|B4! z5;#+VvN;_D2QUCI;t2cZfrVDi^l=O$=Kv2pXd4fh^if)Em68O3Z7Sm9^WdtPdN2mr z0+ZR-aq^~LSRchSZZ6V5~O zh?BQFv)r>4iKWg7Mt~?zTs;MFX-r#WeaGeUH`{lLrXyC?prv_Kz&6A9H8D=JV4lz6 zjIFf`g&5vHQPemM1Yl2k#tEB0Z6lpMZG+F9Q&WZ0%D$eqi?pRKi`mHI+3`!=5z+Ne zMw>xP5pM>*w*uNazVQzG{0^7hcdXF6mSr3{c%(3KKu&py8={$;0U$H?gKuEEzO+{c z56*zeH*=Pju|E%!6-r&t;V}MX?pqJPd15{Mm-()G@V_upd7LA| z7djsJB6Aw~NjvwbNT)BVIDt3Z)|8a#DwYJ~XZyk_A#BPXNZT%_5U*b8ZR@gZE2@3-UWChZZe*RWj0i!-#92bt-d@dR_kTc{6dxF=oiWe$>A19h%{ znaQxf{muI!t?SKhn@qc{wOr!0BafF8S*B;YH=lsi&|&W=`Z zd_+qHSLw_xp|+Q=Cl$ILQihb-Muk3?Iy2#sq`KKu5enF;248H+OC_;X}l$ZQ#N2U@|m) z2UNW{FGTlKV*%hc?R1Lkn&`|OSFrtvhu7vLbj^X$?{-z1WVjVW2eb&u?Uyv5^fxz70JBYA&|HW^ z=p|NcUpfG?Ic05_*HadU5c)HWC`f}Q(s`Bb7xG(xS3z=sLJbu}XTrl44n=X&KQRA? z*yy`iS!3lSBJx3PO>9VNwROY_*KbKC{>RwHlxvB~Hs;>`yOl-z-klq8bN}DY&hCBw zr_Vk9>BkRcfHmXa-+q*j|J`}qyFdT=>HL4p(l5;WPeB{Uz^Vpw1E7YAu~v8hfJKS0 zVo%`n8+x7w*5ae5f@{){nL{4UB3`h#6;f}`0}pd#7`DI4!a7Me#DEs2Cp%L^NFqfM zo@V-ZYU^)H_F}|rAYm!Lo7ipajrHAa8321P=fymn8&C z!*>-DhzOmuQZ5!x6OWe*u|&&C zS*4}$3Owi0z~rRJz2bBkasm}!Bf>+5IK$|>FbV*NWR>zLIh_ax#p26R$L}-*#qOA4|fp;P`&=clE0f@|F<9Apa1>r>wnwW^H=FPpLi9+ z=PCZRgx?)qIL5a_qq*HSdVOIAD?$|M_8M%bmkJH>yva-vt%AFkJ#TPLWE^U0IuJ+&yCS{jsNq+|=A@)TbV z?c3w=h`#8HrC>$T6s)c|H`9p1;*^@M=p0jvih}ed>sMOHS+dh^BEaRsd5)@Eyys6| zQk6#IyJZA4p1Clj(TInzj{v3<$7lqhu9>aIcUmry4$eX~3hhVl;GU?S633dvDNyy; z+`9I&2$Om^i1I}|#G4Ipp~EtIEX&-N14R0bYYL=d0$ z%pspyso-r5CT){BIUNSuiH&H<0nl>>4KYt|jH?_mm z4Y5%=#tI5q8H3l8H+8qB6ic&!S<#KA%ePi&Lbts*U>;eCVWgwE8MCBcHRgGx-Ggc2 zATpk?E%Xa^+-yB881gd$YEA=7O>pkxjigbBbjVeQ1D<3mpfR@5$IJrJrl32@&C46V zFQl`Xa^s|$o(ncii%;k1>nS_Tt$1`eq{6`};ozE+yF@zrT0D@NH#%gxTT^wxu|u*7 zM9|sR156dW0zBRM*m6IP_9(6S8sjVIX#RiFiF`&&aBMHY_Q~#70gqf}*i3_kKT#=^ou{|VmgY=+6erX&^h82KcQ&3$>3oNg z-}dm$UUKZh+5@$7-EK>*w8|zl0k;+*CdO_)d`Mrl^fI%BC^kiuC}W#?MAMdHb4LPA zkQq5Se0Ec0IdQdcTN@nQ$CKCCj}xVfr^MrD<``HTxtji-4jQH1NG+5+V4%s87#8Al z%YJxd5B@pn4Nfb|QVUWA5tT49TRILZtD1g>oki%`W2b3$v9F1SV>f`&Lm0~sgV9GA zs}F;*jWFJ?fx*)W3=JS23qsBl6b7RjM0UVFMdIfA!RUeUrGSpIkA3-)sQ3V52TULeVe@40gxrixC{%8ZqUk?c``s-ow`DFjm;SXi9zfAGJg=IpwXAv9h zYqr2VkQSH+r#G~rNo^J-+ZFwmB{c_e+g#Baq;e~ZAgN|olgSkrCRxl>k5?LAudH=z z>PVr(`srI<|3>@f3^u+O4cShnu!NRA#ms820*z@T-EU?gDiSC1opM$!<3bsOMlN&+ zEqsNDA>5%4**2Z+g=~Jh&at^{lu{Lrpfu z=9+0f1^U2v*}glcT%Y`+p9p|VoC!PbHeL8+r_ao_n|eGD%79J^kr!X)q`ee8FbNtS zVMJm)Cj`Xwoa}sa6X}Gk6rQhQOyfxz;dq8Hz<073Q$1|UQiuyJGnby{Uf|IKiY>Q2 z6$_u0As+zNxkT2Eg+eNr-!e*guLpj4aQ1EOx^FbI+D&z#hCfB{2+g;w_GNU+6BPN(e6EZALilUMr4CS&` zVlfgHjp9@)m15;U#o<7JOCr9BbEK)(wl17i+-$X4l_;gfPdH4_>rcxtEH|^~#GTA1 zBu99f;`0E>T@B> zhvI|!T9x9`*~PL5&cYg+MRVpAI>ohJc$o{-)VW5>gER|Rl%Y#ZqYF4i??_2tDZL`} zB;$2Gyr{Ws(dP&KtK)r-ShmIp(_qIS*V*dG+Y`YQjz9JSbp9d&Q(~qp_&pn&d5D+a zOjk`WPWVz!ZlHgs;cxU^zuOwC0)QU*Bo?}je5zt^gexSrqVqIRwQr4Gy{bFLWRK>* z{DQ)%FReo%1p|9`Z*F=?C>8*)BtX*8%WESgG07IM0?3KuCH4s2+D*NCiNj%g zj1x04Px)GQ(mMqd)|AN^wOYoO(bQFmYk-Yqu&oNh5NYrLGVk2L>KAEAr)HfMKQxzZ6m7kj4 zz2+c|6ziQG{gn>5q(?V5KMSLr(P38rW!DHXXRp#it8f-M7un9@lj*=qx(&;AVc*5L zbsO`;Nc4ng0cxnd;(@$EtlAT1g3t1gwsmKbS!?_~uGd+D__3wQDe~SA5&fvecn(!&6?(E_(eTS z+6FopW-i}vfbl}F3eZ88o=h@IJ>J_Q&0^K6|pE)#?i8N$QEDOPazJtCN< zD-t=Sj!3xc;=E}Ws{uxf0uAU!M9F$0H`gedV30Fod~`?aVJ| zr_78dish|!G8lAvr#I5sh=^T4Cz(%`zzX5l(#UaMLO90Q?N2<0BDMdqbAPJm#JL(} z$lnyqhb&(=9)PSi8fI`#vZhW12B)m&ty2+;5c90qjY8;5OdKeHH5AvgZnzGeNDR`C zcI0N(vch!1V)+O{-PGO;DhdFK$&^DeoXN}?m2%iVyxo++3L{OUjCYNRLFPvtBLQe-~jUeRHwMr1?wIt51yyj_>h5czt;|rAJ2qD(z zAvXtDFG_pLHVleBE(;<_aIx@Lu?edY;_*QZSjPo>u%yo`ja@gi0frefw$eKyNu|)o zOHOPnPVDhTc{JroWf&pU$1xglTSIeg1ggp-yxZ#oS4mqMGRyy9V03!g0e{0nxO=DT z0ZuTv=+LB4xi#UiYr@^pD}YL7dMN`*kJ367xY#I8Xo-R|rCB64p~Flq!HPqT{+lD= zy(^=p{Xg?@e$@P*z3s=33;ACk_qXru|G!83zeu>Wn1}Sp4?n6)Kv?}#|LQFa|5>J~ z54Zhu@307^msZ|2{(yYNyat82t0$QOyV6r2;uh|G1xg%8N?Q#k|1Dmnsfy^Lb?I`E zTlf>Q-cK}TUpW4Z^*rQQvw4&RAK-})cU)EYBA}HtM@5w@Le3kJr(j+u76z@2Y+1G2 z$(C-}e#doW&_aQJP3TqIXyTP6NX-tzsMUr&+&q|ovWIt^Cjb;05g$h^tZV3pmT&ty zFAF(WRHsUPcS@FU|99q5Ih2y**Kn$643sroEOK@_MLqN<`PeKTJ)3cX)?HGF<*M+^ zWD;L>&ZN)l_-Awtmbz%<7O!v0a|q}9ypelG%9t48c>sbynL7NHh&oQg!*rgKG+xXH z{>CUJk$&Y{qg#fuS~SC#B9!rd69wt)squnto1A7Cv9mkkLMwGqRw9Bf*v(Bf|~Dgf?rZ zr&=btHleaf%wp3S-X>=$3@LBjY(O{J&qa_W=T#FiWDvQ-s|4^(i6g9tw-$Ptdu)?_ zWDc{`GID#TnHW1Go!1}5ftInzEqrKM<&E8FDTU;#u-ittWr#6Xg`J-;~ZP#AY11ot8kR%oMlCBDX*qD&WN1VNpNHb zT6yvE^*EJiLZ)U4N~1az%Z4j+ng2&zfN*!W|J~~Tzuu$!^BQ?o#uD*^G`JHYm3OzsdV>;l(!3wq-Bdv^#Gb(HuWVNVg#{ zP8*c_Axlhx$|L{C-2B%!@M$?h0}A_smC~=`;%tr2kYpITujY1wEa|ytqL_y^<*EW9 zrtubL3(8HC#tx!hr%zQ=OwU5sTXQ|qa9n0xaxwf6A@D6oY3duEJBI8TbQ^LqOx#wQ zFy^G$I&BmT=)v5X*~VaKNEuPWI2zG&lhI$!mIBzpzGl89m!ZThE$$?gVkV^{Bcbar zLTctLZWetNe|7=k2A17yeMuCjEx3N#G}V$b0xzOOz4vtSK2JGtF$d z8UiJ|Ot1lxUF+-Jmi#(#mI*J?(U*A-`koUFciOU-HMnAe4h;uQ`W`1M4|MF#x8#NN zf@mm&Bbz|<3=I(%c!RljHN?T;$G93ot#eVUV^)O@?D(1~Mqjmztt}Y(jsY@R_eOG@ zVJ0QaPtob+qKSc6lgS7-im^rrknFWy!0-Mu{T}B8iPW{q!thRz3!1L+rO|^PN?%UP zqSDq-Nn49iu3g(NLDcxRaK``;1BbrYQRra52wm=4(L?}T3_L8AAvP`++`Pvr!>g6V zW2pC)rq;PVG${$828T;{H^y|E`HZElblRze$)-iOFVQ`lEXq^!Z_(D9(L=fS^?SWp zZ*{#a^e&SVu)l1Y!E`F@fWR1v9F#@3+r`^tQG#bO6P}`|xB9!87&~_on_}5R%fp+* zFcWgO%|v0_=ykgpA1>n_D;T?elT~ansW}efCN`OsU5T>zikFoD_16Fb7DQ}ic>OAP z;+>B!H9V!$JOOOm*b+O^b1H+Vj?(5U>ft5@gE>6K=yWd z#In_GSE@!Ikw~3eP>C{upM4rC4eL{>ghGNkPu*zj<&^_WIpk-u|=wc<1r`{{QpE|7O?l zaf?7%rpxTG54)GLZmMHlKI3+27G$YZENIc(EPrS2NX3-SG)&EFx}IQ*<$g3ZsY1!@QaAT!D}VcB7~x)E zYBH3K*uHe=V4>PySkO@E2gQs zirmD}2u;@Xko_sp;!KsN^6hsZ_!ODCdD>^1`>YjXfpd<$ ztM3@_cbIf^Zu^stNB7nNFdjCP3t!EJuIhtUivg=5Om=N^a!8cikdoK>gK}CElvhFG zNR2eoKzTVVp822O#fvl01Q6sq3@=`I6n*Y2o$(@Z%6rA67@*BEq+_|6d+GQYRX8sD zOB-)IQ0YrwzWw%Fi4j;MLvsry$yO3@W_%u+=!hFZDL!?! zb-QTT-#I?s@;)>}e?|t2ImVRIBT(gYvsKJc6Z4x(azU`3xJ5pt9N%CeLL)#Q*vS_% zrzxeEzgAeCRIdkA=|S6gK>c{oy7`Z;t{Cebl-q9IOe|fAw2uf3dI_M+hP2P+g9j*O z9^fJvGo`xtBq@Ss#}DFU;`*liEFB){DW=)e0ndsW+ufD|n#Og+`netwl{Qi3Re-os zO=URbLgT@u+yT!$TlOFAD1917)Acw=Oaz$pR7^l&#tXEujOWPLWSJ-3!R0BtlXJLQ zT<-L{VLP-Z!?ELfP4{Z6-+I^|urKHIMZs)k(v_k`Y*HRJxm4grQuRIrT}81HvRvnk z-&u{*Jm(-K#w;{v%#up5SC~y%HlebLY*{j&vO<_F6dE!3JxIJNx7Pw47arv#Nhg&R zEz(kWMluA^>5TZ)Wb>4anfNg?aWFs@Tdy!ndhWhWjuWE;$Rp$A^*>IFfz;`8m@{%0 zYGaQPLc7><`UvI>pe=uOqNva$TU+xgYV-5yqSM?R<$B$;@*0jTd>&W0Q|$`Q?$lr_ zH@j{f13%SpdLHo~V`!9mZmW6$=QnMLWiLBwl)GhP=J+I+Vs>T&)Jh(mg|}z0>`bCO z-BEzIasZzE4vvYl%rwr3KL-gl579MaXKSKCtSoNa!1X)5EIK&*#TkoEu?WL8_jDZd zBM^vyJ612};QbM55S!R(&8L78cLJVe$0$-b+$%^Oh_hPcLmb1@9itO5UG)hC8+4Ko zwUe_IQyGwO@1&bjGKR_>SUVQCsf(j?NPLz~g5{5Iq`U_;+3`#fSXDw4&LHdPVKlQ7 zM#LvJ8}ry12Y#mAanX`)vUr@Dwq>?@A-6s~e5(vd2yE(kj%RS;hQ7e;PIWAWvE%k7 zXw5joss0+B5vP^J&>la7!h}rBrAq0LKo5K;i=@vuS+ts6#V)m}xfUHd!9jERZ>JaA z@kP6ttyPKyzdziB^Rh za%ifS-XeyrHIq6SNLWecnQ!Hc6R?N^x>I-7M6DVzyxF=2TQVCL^jby-?hZcMSwQ=F6c@IO}Wznlc z_|z1o`P(l@A0+9Cm%sZD66gZRf;QhV8g7ze5FkfT2&_eA;wDv;tO@WMIeg+q;vHX+ z?DzulJ2^>Q;113fEI}GQq4Z9G8ZD#bn2&i>h!99n8GB;cVd$+!cD(Y(O^Npa22(5v z6tySnv!iWXdqSO+734Z2mWH|0LjLbw z@6o;e|5N-(o1(&&=O|g6#ltC+$ZH)1>z3H!dsvHLdrGS``>4$*qR;w`>g++>e|8vn zwp2#2uf^O~*}9*1U!<8sCh^E7>tMhSplC7xFnmU^-;mEJNJ{`aGMRgi33=0s@*zsR z*=ID1+(}s)=UEgiLPsR09Y{xyXkQ4QPNjGm?A%A)?9zIR;Y&=>$)1e^ukcLZtUP6x zZZPdgy59~3OyM!*ImtbH_z)PRvuD`TGj1e+HzauJKU7mQE?oMp%moiV;Ex)f32gzRw(!M}IICU&Hqo2ZtXICD&LJ1C&V zQW}aZX>n0=7n8V&?NK2W^AS*uM?0=yjyqm+R$73CLox?u-eLx{Zqq1~r8goGHFcNJ zt5i;n&~h;v!+uY4d5Vdiilk30k+2a&=?^USuzRDck0}jV2z}^{&@FZ0Cb5+cdM{mS zT?~PT#peix+V4@2GCKY?Br3LbqKcSNUS_F;IL8~LPLTL8o=ZIL4!vNb!5=^`)d#G@ zt^yQQ?4Be_cQ!ZP}!)nF6`v5OX+W=W(qNeeF++er`&MMcco z%%3&=<N%VhkSWCA<{v&iaByzyySh|vPnbp+4_ycuu0!X98ZcZ zgelx~=jg>-4&h%*t1{q3r@oIX2!P0<3CZzsQnuEp1j4>qwmE^~14CV4O0SzwFQ6_d z5MQ|AsGvxcl@5GwRll^nMygi;m(?KS^k!A$JC^I#K^09X0SawQ=hubpnbK-rAaf!6 zQI=E=ZTDowN3S+ub;Z4eLi>yj8yyWS;v_vYg-)y{s=2WU3u;N(f&M`q%Vi@{mcl`C zL$5N0#_f~&u&A8yC8d77rYoF0HfDeq<=ix&r)3$>oT*KgOlBCCaHd=k19ACcB@%DZ zm34Iv^oZ?C;ppOSRXQq|`T;B2lX%!*Y+2D|;c?>S(RT;c$sWu7FXV7*j%`0pg%&w8 zXQ_7i&D90Wyx5H>;@0MVNrm|_&j$_fW`cYl+X3VRPytrPv*m>(-YhSaF=2Tb ziP`EVX>q(-r0v%yZU4_nT6Ni|Pkvp|1i?mA&Aep%! zeI&U%nGHXZ4EKJj+94lO5*Pe6y0jxTv%4txZ9XvqW}B2PFg(irqLp3#NMKo3%2S<$ zkh;>!g`2AmCPA-)*Dx){OdQxKwkLwNY=6}}0VSO_QO$VTHl{p3<}|k#J#DQ?da7r* z+oQJzHHkEps1?yFqIB9&m3Q?$7Ra4hD;!FD736FMmZ{{|&9%rg@~Y1@CP(>o-I+6Y zeI@s9apF|Wjm$Pj*0z6hPnn3=q!@mQ7_6;9y=sMIs^-2q(5PhQ6aC}=(m#Hse|%hc ztX>^CE%!8ELbuxRn=Il@t*QZCo19uuuGx}uRkf?i!kCnoEjZwz&Pn$aF*Ns|{MRe! zP0_MVrhOWL6IT3Gx66TIrJJ>E3eSYwO4fZ%ysQCPk(D7KpnC)sfk z9xW7CtVN^^Yg8|m$52*!Wumv_mMOwVtbpuTh#RrA@<1ar)ov8ESG?$Vn#pQ`UqRVI zw_rYlK8z8*;Wr@X+Ahoq_5BIdJXKA5C543Ba4HeSC$e+(QLQ7D;06#Q(l-G_!*fN?ubfikpV9VN4Lv%DS={P6{xy4$>YVtI~xDCwW zv~6`8xs_kXK3xA`+*79E=nRmBRk>uOsVXh1`isfoO=<%5l{u~x;Hie0RYQ$s($dS- zT0ikST{Oj8c8U zTV?F4zN26x!MwSd#+$FaY2RR;mPSbn*s)ga#_(avIx-*Mu>jP zBmOqVak&o1 zr3)H@8=D$yhH`V&D^nL7%7M84)QSASEP4d;VD_uP#Eu)!-Ej>tPpZH?iJp941IB+< z!59aD2gIG5AKS`PZp$;Uciyp9yhQOrh<3}_CB4~xAw5jMP~LD0Rmm-H4k7|Pq5itU(+)MwtB zsmS2g=oXu`98RVmz&s{DMb@02vD3VOe7}at0g2?TMhT;6io+Nbiz5yrybDZ8KPc5B zB(>Zvs-j!N#B^(RWUeLW3Bw!7iXZ9}2fSHvjp>mDsESB1E4P`l2{|mAkrKIkP6tl` zl-fHL9EnDVBiHJz7s2cmJfo>P%p}vW%n+XMM7)}p_X9|soJUT4t{blOC1(4|`p~*X zCyrKg(T`GUrOge~Ps|XX?={-w{CI48&ak&Gl;ak*3?SfIoibjSS zBJg`vDvTg{ajQ40;7JH^%77iDDS$5apC2}m`_B&Gt)&NUL$N6Bm1);Y8(w9HEN|)6 zj#14OCTF*>>WB{b@I_Ei*AP4Urr86C4&z(05+kQ5|h9&ErSfqMof~{Au zVU3V;dC-3@kF+zL!gyXON05}I7yU7?KwCY^iIqP3*7*ACuQf`T1Q3;M%rGC!dfjGP zvxWPLp1vX?-+lNn1)}f!){vFf_h0)KZ&Qe2b|tnyMq^QaERa6!ylg6&9Ddw9#T_NVk^u02Egj3L38@hOPaeu)PWHKd^;SxI#&X)&_n#ED=JHqj*El^5w@Iy$u?o;F~JOwO<22|b`n zCKw?TRC+>h+@@8Xwi{Vq` z;RgSa>l3a_HYQTkDxo9v=KH8p& zA*Np%O_Nd?ONw85LCVxLPX6|sba zuFPis#%6i;Mqc=?ZvSrhE_o;S{+hbH{Ql<5y8p~<1bJ9FqR6v0V^Uco^2S@;vXs5N z-h;hwE{Cbfc8U^7E#4{>HIHo>3TtYqJ1maH53#LqF3b*m< zj%j{&)^U_3bZ!*@KD*F;ZGwuViCrpetta4IRYDbAVKlr79Y7*smfZ&ChwoZjvuUZe zuCjP!CK`60gWNO{&*_3jF(WeVU0u}v=Sb@~{G{Pf_nMKIOjJr%A*ZO4m9zDBY&_JY zC4+trqtwb{_;S4X#6OgYG@6Ux(*{>>`sLg7`DV}ib2BS*>-+VK#NRQjf&Bfn-f+AK z+^KBw`lmfo>TNVn>C+jHPdBH{hZkO??Q8yloOK0rsn}boWq)yiRmFkhsu`@&cfM$L zQ`9ZY7SpVylhUVn*KKw2BwXUw|B{D!Mz9%(38CEWosy`kzl}mF*8vqR#pTFQV@kb< zT+ueZFLz6Z$(T{uHX(24_?EU0Ux`~7KrIB;+IXE`HfR2b5e5iXolI-qf>^HtxGoqV z3ImAHgjhSC;~c8>Ix!vL)GpbU*zb-3@;EI~ixXxTs-6nJ{s63#mP}%S$b~F*(z10_ zzljo-0tRkq)Gu&4IZ3VP#8yEdl$bKmN;Xd9Bndq7ik+Q7?P9y#`LhDvHb6?US|+SI5!d==9!NQ?t0L+MNKg7wpFz( zcQ5Sw`JCmL6hl3?2<~1q1JYdRY@i8;PmQ0Cdo}>{hXf7d)YdZ;UcYzlLW^>K-3t5N zM`iKVINcf%3AOgKo^5m7$OSi#PKbWz*0k$z|wTP-?CY!@Rv0uVkMlnG? zrSuOJqNSu)Z{m)M;fiNUwHOGhWNVLA>cih#(0_5KW|Hod#EjA`sedJoyYA5eB&>Ri7DV1JV*g@UBkNK@uGv{}s`0<+uO5*GN z^(X6AR@U&hxA*t-@9pnVw{MtK{)!0C74?b$`d^z z#oSL}2z!jRD^-y=e`ZkD4Ie^!W>$0CidXaLuVgRZ^zzkKf-D|ru>z&>g`<)C;BDqC zXAN4v7{;89HRc6rjJ$=g4pKuoz$>AOZOPq&Z8nJW5L@r9{OM=2A+*nq&&OwH<2@_O zf}-qFXkEcnmaUZefeKvvdb1SOndKr|e|gRRZ^?ofeU2_Hzl`*#9LfGZ)O)$T?8wd$ zbA&FKuYKE+`7ELDYJ~IHx6Wc&Cr++W8xZkAxI~bzlu-HXyN2n#ae)#HkcCO2l9{~O zo|9mU?8xgG1{Sq92}CZL*%Pgkhe5B%kZ30cf@nHNc%46_Pgc!SVDgVAm0u4U=u5(ql`^3~_vvuk z&DIzxv+QDY9sxQX-?;krGIYAjQd}Bmb0cU}ByB;n*lCu}WiKF`4S(|T;!N+pBd&KvjQx{jlTxhox;uXR9-*yVm2_BsIv75Rf;Bn$oKF0EsK^Ml z#8YlD4`10Guun@GX9lL20h{UcyYPkZx!s1V8i%oPHv6?!W6RoyQ&s7_J?Ok6WW7@Z zW`|OkA)EAmY-m>+%p;=^u>c@vr7?1Px)SK`WB9%C%DdX`JG1m=JqH z+1o2N(X)kZrnB?03KtF3sEUQ{%7p2LU5r)2ED8!`q%I(IC1&gew};MbP|KnsB&O7MbU95a<+?*)T>zPJw?{44v#^WgQv$EouJ~*Ax$C1b8}mnW-+jGdHAx{M;%vK3y;11`{>7}+eT|~_~RIh zWbvpN35Jc>v^B)%ArM7FO<8u?n?RlSzs7TLitPm6s#*Z^M6+&tU-b1OzR$bfsYj90 zjs+Vtr?WWW_`71|rpKjwM64tS#nGcAJ1*)4e7j+OSd)Vi>f==>OsK=2h)ghphHLkN zH{F*?BPH!9>gePFoSO1H0xw8Cc^PcsSY~}dCVk5mprsz?Q zxD*=V^gHQ7@UbyNmsft4%qiS11g=rix?7??tXo4{gzfGin#HAdBb{sx`hZf?)*K!d zqM^jepd}NT4W~L)A8^N}k7-i!PtYd=B^Sv;zK+o{cSO(PS{!vREL$U~w=H>wAoat_ z(BA#YhAX3eq;e|h7Kh1qrrhu}@O)05f*frAbb*DX0%yHA^28Kd>M~a#4xTj}zJ+=_3t1^&E9D1bN$TlZR zWX{*Ox;U*8p#B$w*8r|i0!SejJkWG36peF|3x!Wr`r^5v3gP@z%OKxxCwTgx|P0{BlVL|BMhFT+xN{Rf^2oV}UciZddSslgh*W1me8dRWwgP{<>^Np z7VhdZ5v}?fo|J9MErPL>!SkR4ev(aNhbO~cc?;tEQFS9_RT3+*Wyhez9T`-x0>N)C zmmICSEfuF)`BylQyOBzX*UkYtA4@V_3i8}WKNUvX<|!dlMw{fQF}E}?YKee+^R!l%evjTGC6U zB1(EA!L+2&ry_Brr&t-O;{;Zb^?iP70HQ|$Na<=&#*j(|c4^8|kDb~m8a+B7*(}#7 zieT4TMSiMm&H)?tuvZ1;EfeZK-F0|pM^!-AYRc&%I))xIy9zuCE4pIl?c)+}RoLS& z)+VmxOd<;tN`2gH(r7MYP-$}8C>Qwr?fm;qIwnI}2Y@*}$}L1`Nm{Uq zw76pABKA_IN*}v54GmZHn<|>EsTJsxq%0V-Ra#@`+%NN(ftNP8Lb5HzFWyTBMBifkEVYq(=2O5He)QaSczzvZ>;~ zTZ>V~?fH)0q6I2!W6?$R9ZLMY5rFbCrBJw|kt_JW@z3-)hEkyqYcS1Jw2; z6zL?Es)1kCyQrNNBT>@~%4?JIm3)!GHI((6)?=>vz9_f8At5CW)ay%OYLGg?Ra|aU zG)#mY{?jJtH(Pb++76V^hh*wabt-#4UK#FlS#u})mxNh5AE>YVtrFDrMl+N0M z8rd>8$Hd4c8>w||A{(SW3Gmy&o_LM3lny#h`FWeLfBU0PI~Tw5oWq%-i?QHQLc>+j z))_r}S=NK#r`cz7GLNoW!H?^wxu~u#qhvZaD=X$?3?-{mIGuYe2`czZ*VxYy#iUNP zLv3;VDSC(B$`;U6*$hjm%YJncfK~WwdtSJg$)&*cQMQU1A&H}&s57RrUc%3jOkR zxy89HH&#kYFY|TuN;2xUBa*NLo`m~cT15#?3dlDPQX4t5Uq`RRU zW~!6EahYg(-pV(AT-(>%2Osa*`_L&> z_*Wj$pHy96*VbGdAASFS#?Z(-x@db5+DX80fn{^uP6le-rX!Ve9MY&JclHs|CWTDY zP`_9;2jC${24iRCwY27R7%np_S|ZnbtY#W0Lazrau;xc$lXhYI=@+ExY_fc6g4(? zla{svWLM9WCw_J%e23jFiluIUajxeO{7xR@A9!I$z$F~8QG!}jGQsoLk7Ta;K=S>N zu2FQkMBti4Mn{#6{5zU;Z&q>u$k}s~DJ4;q?l6z~iC==@W zGC1TUI`*W3t=IX<^c`HY71_oTikOh3MOGVl4PFp$fhWw<_yU0%QlzraLDljqOC8wn~|IRYtB~=~PbrXf#jA|1>&5(1eCPXsUX-|k4mT1AU@rbz${?%un zf^zY@2}FRB)JjSLWGT-IW`ep&6zQS2!eifa7EjF$NgkF+-TH%jTFZ*-3kT@r>Ml~_ zFk8||0BLSmw&m`X5Mz^YQKc2m9Cz}|60f%a`2n@1Uxs3-J982$* zz=B2Nl4Sp_rwTO)nar7Elos7Ff4 zz+)XPMPyebcdX{<)XYry==}u9VZ20b;*{7{n{{SxuKpg=r!nCR zf_lmPiLUlQGta#>M2L4q4^qQvob5IMr);N65Uq|iB~oEk)Mk|rc)w?)U&S_j>RzqU zUpJH`*F6w9dNcVGV>;bY|64or8#BJ+_~QF^v-|s_e*J6X-GxaRy{KmRQ^QzMGV;bI zXoICopP~QK;A!flPcw6UWWHeGWu)Dq(9mCHrVJrkjh)>lX)HozOTiu_m@~cv1T?3>OI8je4PV0vOio2Dy61YL6qrNQ+L(oxK3&HcA74lt+a)WeH;bl7v%fE6VJGGxHkgKDgl<^777%gzcyF?Ang^WEVCE)lRvnE`s~ z=ET`yy<9(W7E~!t#-cEZII8dcXO1!sB5 zZX@gFXUV?mNELf+Mu$kL)lL5flkbh@I0lbUp}6WA2#xqu%(A9~2*IafZRFVudOnP3 z+X9g~UQp@KN3q>)#UM@YrMA1>i*}bIh2~^3Psgouj^jR*?hUY9)JePA74!(ATz!~O zMt?+S;ada5-i~OOIn(N}jV1^#sj5ulDmQOn2Usfh@ju*Q4 zc%SUwaK+yir3@-rF*g6%;+8NfV77+s03Jz=N$Y9*H zDCqu878q+5&+@C3EnB4vSR2TZ*`7Eg8NQ36y)v@=vBhk4ex$wBO}xCksIjr#KV-iA zfITl*P`S}LMwX+3D=Y?w=u^;w5J@a+LxFA>LNz*WVlhc8+@P7#UetE5*<1EPMZ<{6 z5|GN1OsV?g(&72%Q*KnogRN9U`%T~UB#Lw4qsrkrA^&#NoV4s@tZ>nV6hV)*Brhpz zTpz@^$P}&qSO(%>T=KJqN&K}lxNK26FkVC0jl9?QD3kR;W0M@Cch(b=+F3I@{IVyd zQjbPRQg}13M(p9S*^ouDaJdpjJ{2njJEF=Yw?kEPj&D}-qNRtJt6wVq1cU)MiP)&` z_b(C$OB8p2Cq6p_CXCQ6bE}ubFBEI=7>mN_GLu(IRh5`MC_jOO1k;YmreoB_i5pwR zv6MKcJ;jy}uzjXNpEPcX4;QG~H1k9`G`iQqsEg(<{sgXbPcr@Mte*+=r^u#cXyMr^ z<8w|iuudKo=c2@K9BHV>TIedgpK#a>gT$|S95=<#;_KKS=;9bj{#t@4fbx+iTc`n% z=Z(JB1wfS>ug)5LTO=Wuv8}MYYT3ij8PBPW1yC8G{z1gCu*Bn9rR}0z1v9Dl{_?cd zW6V;NCXQbJ;n+6D@1B|#G|Aww-7!r{!D_s^G$9;`rs)`l5p<}&u%EWuht@T=jfE#u=&T0E%hyUO)_S77RFM>tP85$KB8#QIqze4CxU1qBZA&0LA&K89 z6&ij7E+KvVj~-UBq`5HB`MtJhmv^UY`#8}Vuy6cQ>#>RbCj|2EX=~U6*s5h*S(*=3 zF^MDJm(MWipi9@*acuJpB|CW_yPg7-|6l5b@)DQ29n%`GcG%(i&r4E~+Z(ca{fwBJ z&!Rqa>5nzD*%CVy?Vom8>TJ-j;cYXf+0!q48RX8zc1q#!WT_nn>8`kNw}etY_cpy1 z%aN^1r3CQT0t%(h+9RimyH*b6T0rqf6;AgWPl>`OYMA)xLB&H=VhGiL8HjE}ERBrI zAVnK##7o9_?WLf_t$`}kA+Gsf%gBM5QMoD-1INOw1s52{%1+Uc@s+sOPZCtOe8yi{ zNS5;8dX328@5~g?ZQE)$sDO|j5@atdDM+8Xl5oq^HnZzgYr?YC_D>DL6@vTZk=u(7 zrrv&cwocSS{nFry@!Lb$FA3F$z0{J#4D_+}q?lL@A_nF1g+SZ(grQSXqIgFJc6Zb9w>M`F=Lj^Xs&%!M0vVRr*#%oa-qpxY#fB2P5Se6RzG_x6mwizk|ZE$ z=rf_H+I9du)gn0ourr)dC#Cw+@hH2TFGTBQ_z#yA0fKQt7OaeNr87{UeSmI$IT+pL zcc~b522^)R8Xo8AE%T?V{c&ab&I`SG?hKd~eYgSv?L-dSjX2=RLP_BrPWF!WpL*;rwgJx6L-%1v7;RJY>bFI=ME9*}N9_u15}%uF6d zd(JOyqN5+#S09TLvTNSmPHV&I@7m7qt?Pdtg$x7R;8!#}@9$?RG7^f3AsvQac0 zCBCo`6h1z$hd}%jjF`cdb-X;Tq6O8X0@PaB(ShUUhkH8$neo9Lb8iD~7JVBB@8;hz zc?!7u115wl=DdgN2{iGlhY*>J{+b~bN4)o#rjRR{RxISR#fQN9qiItHZ|GWYx_a{a z1fKeJ{5hT?y*SratnqeR=;ML-Sg{BRi{1dnuzjdcDMnn!!AaE?&U zgQ;Pl?6cN8S%ZK4nqjjT3$p-T1Jt&`w(9}#s*Td;Ps0y57`MmUFmvhTl7cgcfSZOcZ3rVr2nL-Y%7~x4I|ql*`(7Zs1!j$@_;`8QHpTd&2^Y_NpBE! z(C;%YI3)gBXr1H;{$ki{5>15@;`nd8Yux~2$A1DV8An4nq73SSdSI2A-D3n^2;a6Iv%3iKM$J51=NwAObE)sX$C{kb4HI=2Aym{W}I(GwbX z4giTH(coH!9{b|p3)WGm6w^*_+Zx03&#UMVb26Otq(r(1Tx$Z0&WZf?=3#I34enloSB^G)2Wg(bn$UcQ*){? zRJc7lfWK(JXj4@z19q!)47G|IVwy$rmvw@OGa^=~6sp#w1?ba9Gf*4#p|!hBitqjk zdH+O^&#W1k4p+XZ?+-`QX=I)eBn^%cE1;gSmGQa)@bx)BP9Ra)2)2H7Z;bB#baA+M z{9Ky-&TOhT{$B9!j_>>ec@BPl>lKKiRodc{Z*W%Z+rKpI4?OIvNQ_y4MzJgWLV(I z%DEhFpx#spkY^msSOgrvs{m?6%U|lVyt&mO7VLgJbHs+=!|c&e0wG zTSk zYe>=}S%p5i`(t4C@hbjt?gWcVU;zih6sDtWGlkLo6(7m$R|t6_u5%5wj_Dsu&>yoo z(m4=@qW=>()X&sjpv`_zaP1|J);6Z=1!iS5EE?S$5^V{@lvgtE|32d9IJ^&=C`#mDIzY|Rxi@)|wZ%{mGy zv(vloVSwA~`lV-<}|$ z`-Xe#o8z6=xt0^GguZlcuTRq-k^>kgPLGeHv$y^CtNY&j@5_~$`1$C_>5KX(l^4b^pt1^At8mLWF9%>s@m_}58) zmp$@ti^=e<_kgvB`AIVkqr^gQmrZbPP-)tD24@0$tYcxdv4#|-dlcI>n3mdYNEeII zRxunX2YV9D`O+%-@GDJJp1T3=Xb`F4Kv2r*VoQNmSk=&fDr`Nr(}W^HYc_~^6{zJ{ zm)qT;6LVuJ8HQ)roB=k7vu_lS6>}_o0zDR+q3MeVHtB-@89{!Yc9L(AfP5%(t9q|Rp`0BRWb1v%Mxakd)A!$2*XC|(49Ry+ zU!cCfpd{&JVh))~)%Hk45|#}z@hqy^J4jNZd4ySnu|!3}V%OIV+uStm9!Z%hB}n`3 zEqE5un~STftFD_*w)u9OhI=2AA8XWDo3ek{gX|l8)?MNYmHv}(!VoL)_1*Fm!AQZ* zfxBtk4}@1YAJ`~Gee4l4Y$J#@O!obgR~2QEL9)D9CIL@V~SwWn~!_n|FuT#-59jShX{#Fn4{q4r) zOrVDm$2ney7!9f;gMA^u+JEYHX_ov`3|T<()lb|GPh}c>NuZd=uFi!(2Ul=doU!Wi zej~@jfIjqs_!hd*pm0nF&Zy@Yg)CotRDT?n?84FK+atwV5b@i>P7sYtOhVqf0g}#X z3h+6$o*=Tsx39jLJlWT$b1r3h(3M1YH{OCjHfnjvt5DbC!1C`SzDbZ9DcgYx4Oh>H z_^&aQAET9K(KUKIjY^i!d%c;TMxEE#6bM~JeElV=exs6~AhQ5WAazUiyRqJ2TqvH) zm}r&^=$DwAK1OdTuxJ3-V7!*HSkfs`>B%A4kvm?Qr>w8)RdR7gyL$Dx%+LD!rDMFy zTmn(^n2k03s=z$7+yYHDL_2mH$fPC27?+s*WTWblIete^s*GReXO*SAJdAvI>L<9` zEM~1ahf65I<{l!=d6WB%&sFEG((E5PeEfe;CMmxTM5_#;<5|gaACV^6`J12Xma05` z@D=^+un=aD6fg{40*V9*5bJR7_7?q$5uwRrLHuVC<`VJ2KE)pJ>)THI<=*?{YRuO; z{`q`$fH61!=ER7M_Nho2TAuPHsaRcwY^00|#~unf11}Y|*VZOGH82zMN#e#&Os9xB zwDM{z`ub=G&H07+E)O@reFl!)56FSfn0b6k-qzBrLzTR+Lh(_8wBFkScDxM8nF2ks zEVzzd;TqG_99D2GCtblmRylNPQ@eWc*w3F$_p4c-{csU6r^1;PL9sn<4?K9_(KqrP zf?wR1mx~~Y4c80T|H;4?duQN@AVx9KNS5K#J4GC&saDUF4DkeHTSl4=MAQe*mB1GEsoy;5m& zE!uJ0D~82!iX)iKqqlp>^*`V<#K7{~p~FG)pxI(zZYc-b z+3JZn7EEWSBwugR?;VqA+uLuZ&rC}6uIp6vr!u80-0GL?=+DGKpz6Ga`_aWmngy2E zkKj08$ZMUKrZ>k1E~6$(qIq> z?pXo>*gGe`#3aakd9aUVTn6|I1RsXhTos|> zCs}En5k;mJOO9e-M&(aCiyl%n9SQ63q|R|?{9~sr9$r&Z56PCFX(`Dd;mYpD-n+l3 z$g~nS&8nUSYDEF-Z!o&@B?5s~qAAQnZNHqdWTJnlZ!3IM^pjBMi9?|YE}o}!DK&wf zc%D?Yx&VGgw3ZPy?Bb_W?_nlrnY4ChSfDpz==hGdirby!G%4ZJ3$4*6?hfy*(5MWmizSg0Sn|kCV$OLG&SD z%-iEq!O|EIJN~H8SSFBflsVM(_P1c;3&B20ZXG$#T=N+su4E;NDF-A3#=I3ErN%~P|> zvXs$38FtFWrJNYN#dsqr$#8W~Vu4_Rxw&=3dx>F0P*(V6L|X|P@11yMw1dPSo+ZfS z8u^LJ&C>~Ex3Q2wnP|e!1c_L`aiID*GmQ;WTVzVR!uM20Eh@^@g0F?jofqri5#CnA zI7^n2)M(DnEAn44B%1lWcUCy9rBJ;$orBb+!Lsl6Z$Fg4q2PM~p#-_-`i##KnXUz+ zDNz&9LKL1#BqDno9qc9mR;8e7Qm4(TR*cEBTrW)bJU|8;^W|))mU0l7G&2J-YmfM) zwZtb(W1cUeizU|NDSSPRPq-nIX37>4|9X^e(^O{84P#E{YSrFCVo9Fd9#4_OdW7nf z_Eacs$E!6bgjNIq$D=6>n}{&hb;#3E{mhYVds`>voxXX^YD(>rmuHEi; zJ%iYdOOy&+(M}Jo({7A{zX!rR=uWyv-Z2+XnEkS#SKfJJA3IEy zVGDVS+XZmVj+*}xyl(puRo3mv?btD}N$UMWR7{XbEo*6iDnbAY$b^t|!1(Jq4P}Gy zzhSUf@fu1nnCoH01Tp$s=)qMyJg3ItT&uNVxnXW3+k9WVkEGz&q$OQSVHtSLk&6-r^^}qes#l z-;P{kxS;28NXbTLUg{wb$Csm`J|fo}t4Umqb9C%XyL9aWRhb(^0kw95w#mefoB7NOIqZ~XH4 zO4w0FL16N{0}A$ioBe$GX>yHw9pBm^wzG@t9_zk#Ts*8@ z^k8k?1*>)&wy0M}>btTpK9^UBsYa=UYz#r5bmNBCp&shZBN>kxq*dbZDLk1!9C9G_ zJNv}?NegMO_N)|T!djKZwJp8BjJvQ=Iw|Q2l*Za}^fZvmpG}hDkcc!L;{P&=-7&mEG z^OH2+-n-)@SH0#)M)*Z{ijN^tJ%uWv$3A@l&xo-a0ww#swT1ubDzKpS%5%~260K3o z+9c|O9i8}dBl~(@@nSTqyF=Br*=X{&8yUOMy7q05XP!|r2p*ohpn}U7Xr-@}!Nc8GhjSipM zlDx0{tbT#3b2CWv;an0PVrd^WP1$sZf{N#{fvtAmRwFP@|sZfPHWbu(Ji9xjdp=&vrpXZkErJ- z3g^G0BAku3{Kdg|`#NXq#kk%Xtky%8*`&*@!oR9M6B+#fK@Xank z6ZOBr$GCwl7sdizvgN5@&kT7w= (3, 12): from typing import override else: + def override(method): return method + from collections.abc import KeysView from nt2.utils import ToHumanReadable @@ -25,7 +28,7 @@ def override(method): from nt2.containers.particles import Particles import nt2.plotters.polar as acc_polar - +import nt2.plotters.particles as acc_particles import nt2.plotters.inspect as acc_inspect import nt2.plotters.movie as acc_movie from nt2.plotters.export import makeFramesAndMovie @@ -37,6 +40,12 @@ class DatasetPolarPlotAccessor(acc_polar.ds_accessor): pass +@xr.register_dataset_accessor("particles") +@InheritClassDocstring +class DatasetParticlesPlotAccessor(acc_particles.ds_accessor): + pass + + @xr.register_dataarray_accessor("polar") @InheritClassDocstring class PolarPlotAccessor(acc_polar.accessor): diff --git a/nt2/plotters/inspect.py b/nt2/plotters/inspect.py index ea5d91b..d9d9ab7 100644 --- a/nt2/plotters/inspect.py +++ b/nt2/plotters/inspect.py @@ -180,7 +180,7 @@ def plot( ) def plot_func(ti: int, _): - if len(self._obj.dims) == 1: + if len(self._obj.isel(t=ti).dims) == 1: _ = self.plot_frame_1d( self._obj.isel(t=ti), None, @@ -189,7 +189,7 @@ def plot_func(ti: int, _): fig_kwargs, plot_kwargs, ) - elif len(self._obj.dims) == 2: + elif len(self._obj.isel(t=ti).dims) == 2: _ = self.plot_frame_2d( self._obj.isel(t=ti), None, diff --git a/nt2/plotters/particles.py b/nt2/plotters/particles.py new file mode 100644 index 0000000..b4bbe1b --- /dev/null +++ b/nt2/plotters/particles.py @@ -0,0 +1,102 @@ +import xarray as xr +import numpy as np + + +class ds_accessor: + def __init__(self, xarray_obj: xr.Dataset): + self._obj: xr.Dataset = xarray_obj + + def phaseplot( + self, + x: str = "x", + y: str = "ux", + xbins: None | np.ndarray = None, + ybins: None | np.ndarray = None, + xlims: None | tuple[float] = None, + ylims: None | tuple[float] = None, + xnbins: int = 100, + ynbins: int = 100, + **kwargs, + ): + """ + Create a 2D histogram (phase plot) of two variables in the dataset. + + Parameters + ---------- + x : str + The variable name for the x-axis (default: "x"). + y : str + The variable name for the y-axis (default: "ux"). + xbins : np.ndarray, optional + The bin edges for the x-axis. If None, 100 bins between min and max of x are used. + ybins : np.ndarray, optional + The bin edges for the y-axis. If None, 100 bins between min and max of y are used. + xlims : tuple[float], optional + The limits for the x-axis. If None, the limits are determined from the data. + ylims : tuple[float], optional + The limits for the y-axis. If None, the limits are determined from the data. + xnbins : int, optional + The number of bins for the x-axis if xbins is None (default: 100). + ynbins : int, optional + The number of bins for the y-axis if ybins is None (default: 100). + **kwargs + Additional keyword arguments passed to matplotlib's pcolormesh. + + Raises + ------ + AssertionError + If x or y are not valid variable names in the dataset, or if the dataset has a time dimension. + + Returns + ------- + None + + Examples + -------- + >>> ds.phaseplot(x='x', y='ux', xbins=np.linspace(0, 1000, 100), ybins=np.linspace(-5, 5, 50)) + """ + assert x in list(self._obj.keys()) and y in list( + self._obj.keys() + ), "x and y must be valid variable names in the dataset" + assert ( + len(self._obj[x].dims) == 1 and len(self._obj[y].dims) == 1 + ), "x and y must be 1D variables" + assert "t" not in self._obj.dims, "Dataset must not have time dimension" + + import matplotlib.pyplot as plt + + if xbins is None: + if xlims is not None: + xbins_ = np.linspace(xlims[0], xlims[1], xnbins) + else: + xbins_ = np.linspace( + self._obj[x].values.min(), self._obj[x].values.max(), xnbins + ) + else: + xbins_ = xbins + if ybins is None: + if ylims is not None: + ybins_ = np.linspace(ylims[0], ylims[1], ynbins) + else: + ybins_ = np.linspace( + self._obj[y].values.min(), self._obj[y].values.max(), ynbins + ) + else: + ybins_ = ybins + + cnt, _, _ = np.histogram2d( + self._obj[x].values, self._obj[y].values, bins=[xbins_, ybins_] + ) + xbins_ = 0.5 * (xbins_[1:] + xbins_[:-1]) + ybins_ = 0.5 * (ybins_[1:] + ybins_[:-1]) + + ax = kwargs.pop("ax", plt.gca()) + ax.pcolormesh( + xbins_, + ybins_, + cnt.T, + rasterized=True, + **kwargs, + ) + ax.set_xlabel(x) + ax.set_ylabel(y) diff --git a/nt2/utils.py b/nt2/utils.py index 5e5d233..d85cece 100644 --- a/nt2/utils.py +++ b/nt2/utils.py @@ -93,9 +93,7 @@ def DataIs2DPolar(ds: xr.Dataset) -> bool: bool True if the dataset is 2D polar, False otherwise. """ - return ("r" in ds.dims and ("θ" in ds.dims or "th" in ds.dims)) and len( - ds.dims - ) == 2 + return ("r" in ds.dims and "th" in ds.dims) and len(ds.dims) == 2 def InheritClassDocstring(cls: type) -> type: diff --git a/shell.nix b/shell.nix index f8148ca..d7ee1a0 100644 --- a/shell.nix +++ b/shell.nix @@ -9,7 +9,7 @@ pkgs.mkShell { pkgs."python${py}" pkgs."python${py}Packages".pip black - basedpyright + pyright taplo vscode-langservers-extracted zlib