From f93d812da93d5bac1eb7bffdecb5c4aa34b91062 Mon Sep 17 00:00:00 2001 From: 153957 <153957@users.noreply.github.com> Date: Tue, 19 Mar 2024 07:05:10 +0000 Subject: [PATCH] deploy: 47aa27a87e3421eae9e1c8dd65c78882dfe0745b --- .buildinfo | 4 + .doctrees/api.doctree | Bin 0 -> 4391 bytes .doctrees/api_tutorial.doctree | Bin 0 -> 24267 bytes .doctrees/api_views.doctree | Bin 0 -> 58037 bytes .doctrees/data_access.doctree | Bin 0 -> 16260 bytes .doctrees/environment.pickle | Bin 0 -> 392062 bytes .doctrees/hisparc_maps.doctree | Bin 0 -> 18803 bytes .doctrees/index.doctree | Bin 0 -> 5027 bytes .doctrees/station_layout.doctree | Bin 0 -> 12799 bytes .doctrees/status_display.doctree | Bin 0 -> 3855 bytes .doctrees/status_display_views.doctree | Bin 0 -> 110062 bytes .nojekyll | 0 _images/coordinate_system.png | Bin 0 -> 21572 bytes _sources/api.rst.txt | 13 + _sources/api_tutorial.rst.txt | 179 +++++ _sources/api_views.rst.txt | 11 + _sources/data_access.rst.txt | 105 +++ _sources/hisparc_maps.rst.txt | 110 +++ _sources/index.rst.txt | 26 + _sources/station_layout.rst.txt | 63 ++ _sources/status_display.rst.txt | 13 + _sources/status_display_views.rst.txt | 11 + _static/basic.css | 925 +++++++++++++++++++++++++ _static/doctools.js | 156 +++++ _static/documentation_options.js | 13 + _static/favicon.ico | Bin 0 -> 4286 bytes _static/file.png | Bin 0 -> 286 bytes _static/header.png | Bin 0 -> 3210 bytes _static/hisparc_style.css | 70 ++ _static/language_data.js | 199 ++++++ _static/minus.png | Bin 0 -> 90 bytes _static/nature.css | 252 +++++++ _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 75 ++ _static/searchtools.js | 574 +++++++++++++++ _static/sphinx_highlight.js | 154 ++++ api.html | 145 ++++ api_tutorial.html | 286 ++++++++ api_views.html | 397 +++++++++++ data_access.html | 207 ++++++ genindex.html | 390 +++++++++++ hisparc_maps.html | 218 ++++++ index.html | 156 +++++ objects.inv | Bin 0 -> 987 bytes py-modindex.html | 121 ++++ search.html | 105 +++ searchindex.js | 1 + station_layout.html | 172 +++++ status_display.html | 191 +++++ status_display_views.html | 591 ++++++++++++++++ 50 files changed, 5933 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/api.doctree create mode 100644 .doctrees/api_tutorial.doctree create mode 100644 .doctrees/api_views.doctree create mode 100644 .doctrees/data_access.doctree create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/hisparc_maps.doctree create mode 100644 .doctrees/index.doctree create mode 100644 .doctrees/station_layout.doctree create mode 100644 .doctrees/status_display.doctree create mode 100644 .doctrees/status_display_views.doctree create mode 100644 .nojekyll create mode 100644 _images/coordinate_system.png create mode 100644 _sources/api.rst.txt create mode 100644 _sources/api_tutorial.rst.txt create mode 100644 _sources/api_views.rst.txt create mode 100644 _sources/data_access.rst.txt create mode 100644 _sources/hisparc_maps.rst.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/station_layout.rst.txt create mode 100644 _sources/status_display.rst.txt create mode 100644 _sources/status_display_views.rst.txt create mode 100644 _static/basic.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/favicon.ico create mode 100644 _static/file.png create mode 100644 _static/header.png create mode 100644 _static/hisparc_style.css create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/nature.css create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 api.html create mode 100644 api_tutorial.html create mode 100644 api_views.html create mode 100644 data_access.html create mode 100644 genindex.html create mode 100644 hisparc_maps.html create mode 100644 index.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 search.html create mode 100644 searchindex.js create mode 100644 station_layout.html create mode 100644 status_display.html create mode 100644 status_display_views.html diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 000000000..077b66117 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 8e0f07639d2cf4c371ecc2d6a8499e42 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/api.doctree b/.doctrees/api.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cc84b861d8b2ac287f5fd5a6b77d9267df6ebc77 GIT binary patch literal 4391 zcmcInTW=&s72aKY#va>aulM30b{#rGA&!V=c*p}ROJKD;u&i)aOBCQC>eO`COcn0# zYO1R3@dFY(EQ+Oi+ls_5;8#S-6Mu$30pF><%#4M_Dkvk3)OG6AsdM?xrT)_U^5OoC z@N;{n6tb9)Seh0p<;J_sR3%l;3+rF|_y6ku?2p_)vvZ>=opA4NfFltyOEoY2XWs1+ zyOo(4HRm@BPpni$cU<&DUu=BlkHoi zV0rzunO5auF=5H6=2POS+=gW{+VWygJP zP8J_fa?DCO(gs?;{rpxn5jR{<7Ac=Exuf=!_#U(r@4yq^$NydY-^2fX(ilc-8T34I z>m`%gyL-7xtBn6NYA+q(9`Ekfcykx+qZ(=|zhpZUKu`HyG<579> z2$mTrRm>taUDZLn4fi9O14N6>G%LlDsqSY_$`Vdu1eWN9R$$0;67#IETu)iTqp8x- zujFrEJbC#vdJ$Y2{gPQWVWvUK!T&3z0Ti6^q>koEP?}vE0`lF@#i95JLA=@e5LW)8 z&K1#f|NKPoh)`{04g;qMSCm5Qh$RU(CKwggi7G4uNYh9bkrjOF^J{F49t&$r^JqM# zb0Z-Q9GZ-Z?4!@)Q4~G1(K$2GMCl?@m8CF{w1Pu2d5|-6(OzyAvjR@6&DZO zS}4&=)%?T_K#I>KKR5nwp1B=aBw3a6smwyT7yn>xGiURZmsa>+{~JH_FII+Di*7f| z)Wl!9zL05(&V1>Hjew4@SycH1Nr!mfa9g1f8&zZ%;N3!lUvw67#NSck$PwFc#Fyxy zD^YTLjm^jBDC#BGo-KDNI{&(LU?XQ(O%{B*#0T!4)vPdCsBLjcy#|#y%mO{DEX!(_G(5pW72S8!?Ix9`Nh9v& zik+5H&lhgfaBI=FFgopbv(QurWTxKrKV?~k2)1R;^-*Ta%K8(rhoH|mW(H=J_E=C& zMgh)CEVk7_>FWjyy;G-BLp-RE!-Jr75 z;~yUziSLK2n=#i~=~%EL%>YG&9kwObyS>`eOHz74ig$-scCLsJ|8l#v(1il+(TA%W zS5CUyWB`C>1pJf1AdIjXD`pj&akx9h`WDjD-PJr%I*pOe95Y~%&`@{c`j`o(uo3Q% zDS(RfpL@}FyR5P*UXa`^32Y71Dlg*>fADG`NSdDtmXW}{Kndul*e^(>;Z>^Qc}{q` z&F7^u97EmWWPnIwQId?T@wpeL(y&QJhBR7kw0VIX+kr6#nGli;LWd1o+?FtRKwr4T za7|?kfgx!r;=PRm)GdL}eM&CCrkDYRnarj2zq$RM+bww+ceR0x*&zzGx|lM|HycbEvw*a^Z{CmXyRT!_=BRf#L;ofc|-Qv}c; zK%oI}Q5Eh`oiNqp3ZKjgyqRKkD$>L1)B`iE_biPr!8=^PI^n#*>n& zY*2f@c@zSy*|e@{mu`(0XY@dGn{_Qg@&bx@5=kV7jq8~yJkIu^6rg4C&;)GI6sdN* zJ1f-s$p$i{O}hn+J@ncGeS?Vg_mTKod?n6=soa35_M(KE^yvEfQk;EJiFfGxE4=WG z$i-ukwZr|@&i=TY!MZ`KCkmVCg?_D8w+=CT~gZ9>N=+26Kv;%Fa|J=VStJ%R|f+Ck-)&i2f z+fG!L0Skyay4=RohW;9%dgWgtVet+^>f_;V0MYuwuGX!Pw>xq`*>*D=0o5~l{cojI Nj+@Fw14cC&{Rf!3oml_? literal 0 HcmV?d00001 diff --git a/.doctrees/api_tutorial.doctree b/.doctrees/api_tutorial.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9a47393d8fabdaf54698109784159ab37a71cb2f GIT binary patch literal 24267 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 literal 0 HcmV?d00001 diff --git a/.doctrees/api_views.doctree b/.doctrees/api_views.doctree new file mode 100644 index 0000000000000000000000000000000000000000..184b4a26767eae50bacb55dd99877d34f60ed1a2 GIT binary patch literal 58037 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

s2DDR0_XVv^aq{GJ6e5?fy<0cB8% zm_W@Kg}HA`5`50oGbx#cx7B=y>Bb1cM~cQ`cH8rM7H!vYq#dTq$#d-*t5dX5^<6H- zfd0^4v~QS*f9qlWh7hBipEO^36c3+A5S@XrR--W($9>`J7xosrU zLUvz~<;9rqSfwUkTu4{Qi#rZa(D5j+Rk{Xic=+P%HW|NlyIqN8ISW`+5k;4dWeXzY ziaLT{z1W5B5v`*ILTU_j;58y)8`I)JsC$g;mJ;<4xv?R1gD$~x1SWD1s~=$inkM_2 zltva3F3EOwLRyJQ%GS9xo9G+~b+#nnNS^9{{2v5Lj`}{X$B~?JbB_0gyM-q;^v5%N z=Bj_9r~3YGw=M+k_NSG*y$hUc=bJPD_At)(so?>iA3w6SI%GPYJPwle8v`QGDJPH#JO+vnc1!K?alD$fo%p>7P_nW`jGgtRQ&sYz=W(?t2x$KKDThyE_ zoVRHo^B!jBY7HwhD|!Fyt50Y2A4kr~IR%K`h#D9^u3Tj_3;37~16Oc^28#+ zsxnuyvcK4gLLY{E^W1vn^R9$ zq(oVd&+-qlh_a{1N(8L7+U23G%*nO3zl8lcwC87{1OJA+K5V1G?gS)l@ChiknPP^; zE*Ljy`&~ZcLMuLLriw*V+KEHf>FYG^rFFVg>}F&Ak6&jo>?AqwV%pXB23T(mOdok* z{c^F!Nj`$T26;Gr@9DaC8@AcH&rZ%Ey4UoAg(U1OJ-*mk`}Eu?fa8OUx6;!U2(MxH zi_jDe&$s)*a|}2{yj6j(#qmPx*YQJ``xb#kV(xSi0XujjW6SG7Vy~%rOx+p?{vnk* zlppd3`VHZSJeT)FcyJ^0D5S4}C>_F09p-oq&q36sN!y3uN~@*m> z5of5Ez;f89^Q?!hO5|oliClUoQ&+e&Y2+{IvDJQGtIZhz-`C0*CVoRPP^Cshs@^~$ zI#Q)q3b&+x)scO2X~_KuMeoFjMTq5S?fHU;X5$3^p;$^ld<2^qBO3uk+7c!=TaiB} zH$Mp{<+U(uliyOu!h+gmm3b50 zW9Wr~3Ugy<<8(2e;s}L#EIzJ69CF-XQ*NfTP5TqK)uE+GQw&foR@Ox( zC~)>Jh?K+J&wDVJbFx3QUGJ-Y-adnww)Tw-I&B%JV+`+*9ff^CEs_rt*DNm&sV^f! zZxaXe3SKH;qV?Mdb1Lf3R&k087ss~K)+TR2s!!XWtvON=tyJiZ1tw{h4^ggZ^3h#r zoy1UDe~hmCY;IQW)5}nl)jz*l|2eEh+j9NqV>_zx85YnYcx6)r|HweENzEHIpC?)5 z8qt6S7!_aC?dWGv7+_Oo4u7))#Pgiq#RVx`fCSHnCT-F!^Qz{?zWu>1E{a zks>7{@3utKE8nNW26CAV*hv7@D}UZ!%Q}eYpjZB+fBtQIWfv4p<7-Qbe)hCHnUgak zje&YxlCkv2)@f0TT)m8ng%g-rvYM9fR&l0d{(0bzp{`I=%nI%8PsMuI|CSDVo{CL; z_Vc!lE&g_W6M6g>iCiQPoixkeT~$UgKOa~z2C*cDLhOIj^?*FmggXDTe}0A7pJ>sx zr02mkpyxe(vB{d#i)Vd%PM4uCdKu-=KFuias#w!WAE6S5q!p4vboC4{fTGig`pFRi%)H$m(P%3MS9UmvwV;OO(Q=$a3c+gP-P0A z%XB>;KHE^u^ZoNHd|uX~ZAl`1+WGk6lbaM5QHe#x>7>4j69pQ@t!n88x8kTWrMQHy z2UJ`D#dZ4U-&S$E7}(TTW?-8FaKK!yJ(x|&CZ)K)O0Sb<>l;{8$dxn6^o}Z1R3Wig znmQXzSh$33Qn{kk8A>`K5a$=Hvn@hm^O9MxrXDzt-O}PDdL|prOq&9G*MIe)diNFn z0K(%z?2GO5RcxecV!2VC8$}Jeat;Mr&F)2FGV`#?k9ku>*>}!w{p$56cvWZMKwBrL*K!^>qW(n7xpF z?f`1QCl$g7yPqkf-@UY#mt5P|x1)TPt$9h6=7=;_nMV0&oz>DNs+*w`u+SQEM9gj@ zWfJOl7&Qt9V`sboI;vt5SSWVy@yRr4ESy+~y=IpmDn6{TC<>#hi^UC}MbJ2j>R{pS zfYfxZlu=PimmltV(o;n1?=Wilj4ap4px!=Ie9-eUzn9toti^8j)rl^jR!iB?cpdB6 zd+}upem`7Ttp4Ns6?7sR)ga~!J&a+;SOd+3M!Y((imzK>$#9I%*l7}0O%mVh0bbMf zwB4y{2tu(U!2|jt%;Z$y0g)oWP2F#jIx$P@VHL~p$aODP`w--*=HC=3agr*Ix_T0# z2dZ^1rW3GeNG9dD8X6d8Q)mo6%n^ujhC-*aY}E!G!KII69Hc8$g2jGXt3uyUX?1k@ zek`2pTR?P{#utziGyz24Yvb(nm3xo!nGWkz^_fm;3=WicfOp7FgM;gcHIn0UXB}Jk z0y@ZB!TD6mDFi^yD)!}LeKQfe4_Ig6$l@oV&zY#<^b}7iruahek|2xYI%SU~4N(UO zph9~UP}w9tZ-7yRJssUk6Z|kR*{n`vbe4an?LWJT$4k znqpkXP}Ke6Ufxz|@itTKVaLU{BOG+R9BR0j2 z7b03A_H6dO4uI8fNLt(ABP_Vx#Q_06A?XC;7f_@FBp4h?RUQ=SwH`gR|6 zr`)I9W9~EViIm@0$U~>0B**LTvAB=Q?*_O}fwr?xmvr4{QmVe8@(YWJzVGq|J{CZU z@_N4Y`(TCE@6pdeim2X?ANR-Z-?%?>f7&{XwS(3p^mB!No}-^%p`SJSnW6mq>E}E2 z`nTxkGTmOJpMZW==;ycS!B_B;@=2CS?Di`&0KPQt$_~;Lm8m=^&dFoHl(+!D%0r z6#T3foY55tF07A~Pv?;?G&zlrAIRw!s+K84XeyuV<9rH@LXnD*(XNHQ9y}uPfu2O2 zd$LgCq^ecCbYG!-%uP{3li`ECWo1ub5`b<+*o5Yl{W#&|1C^jHOu6G?)eh-z0ViMX zUI%qxgB?f+po{4%CB%03Y1SUG-Jf z*YlIsXTQ9?;QrZ7oeP;x4p|hXS;Tc|SEDQ}5}um!)AEg{<%i{g?I?DxvqFWuvT{pN5wFfVgFmqup!gD zU+>Sz$o-O5V&U@pd_qThss1OWKXf~1IHD=Vw(SJ9%~CAcc6F5#yBy1umnX%L*)B6i z$zfsO0=n{&j5MxiSHhTS4IzHFQkM8%t5K29216E}DLx{d!mb!Lrm0eFiaoI|?usR` zZ{Il*S;CK0k)~W7ooDLoD0kP6hO-|ynx=e~EmSPXIV4lcsRisho|wjaMQ zc>g={dyl^P-oyU93#INGOv}`8HDV#hNM*%X^v{J1MV~+6>LN>dKV)g2g(26vOZpK) z&}V7XN38qWxB&E7l*m+Sqx=x2BP>1iaoM&1_j6S7hO>{nvroi53aR)K;wbI|JYUA& zYxsK|e{Ud0;!QCS`{FHlc)5-dJbmcVE?TzpFoWk(qaW0_Y)EGNedF`*x6;_JgG9=b zJS)z1!^}MRanrQ4|%Owvchf2!(wHl3e?cAybcIUfkB$2c(RdEh- zx2ux7&z+h9_GdQ-EETVh8%Mh1O3~V|h+}So81>*8%u;#p&`cl=Pa4y9^8w1^gU4f@ zI(Rwy_Q{D8&!ZDCuXyWLk>9*%ge;MUJMqM5gT; z{^ye%%}yFXm!{8|O3RmC4 zfQY|0PTmZ|t8m)CuG_pB22%dV%apGTL(eCU=BUi#ad$3n?8cR8KRb=d>H4jO1sA4i zSZ1PKupno27MIg)(sy*_c^&lNW}!Ll!OC@aenE6j_pt7B1*pD2Gdy1ud#Bx(9H1E? z(r@2D|JfkTdO}_D>w<3EzDSn#)>j?Z_^gq_uB2Y+C_6|nD&_<5u0d7IXKkdOZI=3L zTL*8?KrG>eT}L<%lSyEDo%lV*lDCXa8~4SJ)1 zRRoh!rjim8&>bc70E~>@J{l(XyoATxNrH1}L{L8muw%8LdLMvPDV}Ev%@On(?pw57 z!Q$z#Ww-f6!fT+_AWoH1%eEpuEXLTbN4jmQcWJ0 zwo{nV;Ohe|@%!%8$$%@BsXzcyF(?jl9d`@STQ;Ix)A{ZqXfpH7($x7Y^Ru@V4>J`7pot&?*oGMFiEW2j zI>I&K5g7riV3?Cqv~7=p!3HytU6g>=MpPtuFohr->jdsCl(Lu%ZaRre01E$1lxto@ zSujZmQd{WNndU)rr9(+*f+tc-57ABHz{J6Dk?NEyb!s5Z)^Qn)WbphDsHxO~nkCy^ z`h`t2SHy@B8?qK5y?+B>A_4gk#nv<=}g2*)bqgV)~v8vNN)qj1hV zNoMB1Qky4IOpra}>QHhsa(mFDR+uElW*w9_WKl#OeVoJJ*O84@D2e&F71}S zNDZ3=LXJg@Kj3#c&ItPJI$=n(4+`Y9hNEt~u^$F;7Bc?;vHPLG(>cT=*ykI(>|BV| zXGM-J=-Y*RPE>UOZx2XhIsyjj!mvZ7LKnk1J(&=A$opj=qD== zEBUAJ+9&0E$O}A|kzx2Eq=5v#;k2Y&5wA_fE|_c8^A_M4(`Th_L{+aU5JbR=;o<)P DOW}sK literal 0 HcmV?d00001 diff --git a/.doctrees/station_layout.doctree b/.doctrees/station_layout.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0ef8973888c089ade5eb6ba0f86abb8f5a863cf2 GIT binary patch literal 12799 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 LLW^^UOQ!z;^{M4H literal 0 HcmV?d00001 diff --git a/.doctrees/status_display_views.doctree b/.doctrees/status_display_views.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2fc82ffde6646442408f9e06836fb3c858b4e217 GIT binary patch literal 110062 zcmdsg37lkAb@%Ku-LntSEW-@N3@|-IPY<#)Y{Cd5f)fQ7P@t@?dfiobs;kOcW~Mh?N?7t}hfdTFZgikf$@Q@GX}_n-l25KBVA zB`@<1Aw{wI-_mC^FKd;cf^NUM-XADRma2>WWt@|J{*rpF;q~|R#!CKRsoQPW#(G_l z0CK#zR_P#j%ggmrrvo=3y|hu9WT_REUQ7KkRx0mrd*hg==P&P;Ch$?ey0*Hpx~h6& zb#Zl*|NLFm=A^f)-D@u8gS!5V@;Eg;A_9VH6LbFh<)QU}N*u zi+W?#1^&`nqv9RXB*=tYJqgIJo(!_u3ja@q|J&gIc4Psh(5_L!hy5k3Qmx(hPn~R5 zdUfx@f}mnF*zhQAxbL6B^6hkIt1jEu?U#Dh)2llb&-<#IL9*3Rrb0po5|X*BQ)^6s zp7>W?Q-Ut(?(@1RwCj44lco05wO*yx1|>sPDGbvdD%2WoUbgrBOPpMc#Xu>Xu{HRl*r|bDbbIZ9^6!Xiba=;({Rd0!iOzO95U{$nw7OEG(F9!yjx+zv zS6{TX3j<|$VH*|8wo66|7m4PJomQ#r?JmeHg>9Ey0!l)M=8(UXmgw{G10DG)ro6l( zH9lBH8n6Ds0vo48m{K)V^cqTmzV{a%?3Z*sMfDlOR(oS!Ag7+mA2>8w-%a@d7;3e> zj@Lfm^|9>rQ1)efxZRUvxCw1A#@sG8=2}y`VLWzVPFvR%S zK=}ZS1+43O?RpI`N@Hk+&|5~hP#&2-IxnjDda1I_me($In{7S+q8&SgI54RgzAu_# ze_=DMZtnxm-c5UDwQSJrnPqJFi3Y`=s?pzfHQER_`Uq<@TE~Ul`;hS-uuYMJ0WvsCpr>eK#*$1PHw|EAm^xEnsre8quuc1(B z&#a<7Q*Ji8xrH_+O2wpmtT7g^u_pvg>tC@5^Z!#@Sy6|ThQADFg)$j;C^okY;~moR*SlkosmMR zQ7JT`cpK^fJnf8%;WQgfsV;jiRhLzN1YoyVlTapCrh1is(S+A6wzh!3i^ThW-~2>Q;%|=P*gFixK7;gFOQRIsLtUX z=v<8ygt-!K*6U@R>%#KG8Oe|zejqiCY=GHSw6YCX4_Dt709b+fU~9=5S@!>pKA{f5 zJEgqV8WN>LeYpBAnPDl-z;C}_-d-q;I;4~&w@Ya-Kh!XX4~2Y4FzVz~CA8m=lSMEN%4*W5(f<#4qr z2jRZZN%fE~{#3HK$=!@y7Oa^xvT*0Eep$FK+F&3BB#pYCsx(;vH<=Gp{c81V!7=q0 zao$Sxo7LN^Py5eHjT-&xGO_HJj-CD^z4AlMG zLfv^pKw0#6UhBckQ(AEFh}ZfH!wY}H&V4e;}-z&7*%>&?Pfd|kjFz*@KLCfD6WJXPz|9MB38VGlCxmGt> zaYqZVa1W0RVhPYs=#)3fPBGxhDE2L_1GR27XTZb$qSjO&oN($An67!HISEc!pZpdy z>MsZPy*t(N`s9B6lTPjQzZ=b+EPiy@U)}(R7(+>i{WaqDPK*^z!JSq7q4;|}(uCpj@vtP1>^K~%tqi3sHHHFHHwg5Z(I6E02K0pPNma|T9edD;JY$qF zhF~*f&LQeVn=w^PpT-Gu4pAoZq-?-HJU33Wr9Uu0jFB1TxE>$bcft{J@ixveH#prgsgY-+FD&Qyzk0{bXTIX)Y?jW&d zq7hGM7dngoMM*NK*X#!7)f^h&z+A}#1ps-4kvk^hz(w~i{RFAzNZI6*XSb~OZbWvrE+MHv~`&HD&0>3I; z^TLcKIux1++HA=ZglgV5Z>)}m=(rfog^^|{RM`;<&QzV6<+f-QS$3ZH!jX;2yg`b= z<`h)z#`aby6fm~VsLVUuP1p@BYeJbnb84X*+JlUoTv3@1xrwyP;RB`|Vx5jpxSO%d zf;E#y7Vf;7)1gKIIe?^@QJI_JW)7!=IUG;>{Oz~}ZbMLk5t(m7tG>ghjS9t#q(CGU zgAt5_VJ`9R0p&J)9?ekCyI2Re>hq2+(1qn%>zw2{|f2^NF-w(JylF^s{8 z4g^?@BMNBqA z&!vl)Y&A+41I8XP!DdYTii(&VD;x0dnr+`Tsyo5~ljEYZvNwLw85CxnFIlyDMsDX) ziHV$t)f~xi$v!8Y5gy!&pisbri}hS?bT?!7Tv#)1Zv+t^!zEWzk_?U2rt?O)#42Ld z64?ON7caVHj$N0wWb^*qhC;QQui_EokW^Ll9_q?|cDk z3(awHhO?ps7^*8|m{km&uJH)UN?ZI9c%V$c?>d#*Z2}&UW#_l>jqpM+UY{?J|9L3_ zn+1)qOn(H0(pjb_-Obo76Kh7<3s-#MQUr`>B+Z;t-v>8ySSDtbp7ysV z9u_#I{wHYEk9K?5j5;t3=;DUc6E~tQY7krlrv5exz-kq>3H7e48nF7iOV=T=?E(e1 zb`{nt()9)&U7!ey5(|}DxhoePq%NmM_D?xoiOm(cA4{+a>Ay&(qICkT98O4u0AMaB z#A5o|@e|UOOT=Vu6{hH9j;69q=9pR7#2L!Gvjbj)Q~YH;mCVjvmc!2R)y#pd8@h$N zcV1aIL2aCEJJUJ7xNKoTPJ0U0VO+eg+3>>a8VAwo5DhY;rr%OZe;O!{KA#L~uiKn$ zk!AgPDrv)ztqw?yy?0a*V$0KEZI$5)QCPgMR5z43FP0*)nm4=Mxc~}*c~k2I7hWvd zfRw8IYIo)Kcr>qkz+YBt&>eBwK8_`*JfbP~hidKB&enX`R54zH-3i45rFzc`?u77< z>hxNzX1iPLz>co&YkN)Hd524G$PHNQM#88{W@^u&;t49I8H>=u*GenN+1QwAYEOil zGhk}BCK#o3B_TBDGP3%xq~`V11QlzBRqzNxJqg*3GpwiX^_W#<=s;KQ!Ad{2z>n`t zR7?01=2lvBC#NB~5#5X>m=S%GWFWe?g%K6Zf)N!WNN+@c3mRlm-TN^`jVMj!F`|s2 zJVx{kL~j8%$;{}U9A;Fs6g^dZ*Ss>MirzR=y3IM3L_IK?Fg`M@Ew5Uo_kcji;7z6T zpW$k2*Lk-M{iH1G&s!lIR&)`UmvieH4pZ2jMihVKab(p*<457<44|MN!$(Ux$(=B4P`UFUUQ1K3>Z77o_x^}?7} z=yhPxHB5c#&F20>uLTc1J|$w4pJCXwvQn!@a~yuai4Y13`|8%xt@^NWN$kYe+=4+x zf>8Yxf+(%l9~!kfF`N7&=H5t<6p+P`zdbp3YNVNrL^}}J6|ggpd<>gq*5!MgUT9ve zusZZISh>!lZUsn{*@n2WDJoy?;}mL>t-6P&CeQ_IxMNuP*MQHk0}fWuPZeO(Hue;+ zqh{oS+M5TwcDq)AZHjWjI(Gypu`XH)LITG@=!df>b+N(*I-uuyxE_B;N) z=8iP27`Ae~g%CF7v^-Htca~G>+*Wg!EIa!PwbDq6TDz)RJiq+a+WZhPR2i%V;aU_0xE2*g!1aIxwBQCNws@uwBrwE&7p5p;(^L+` z=9rfCt=t)n(t#ovYOhf#wU6u+OK&L>qUVwKAEYVkVdzPJ~|!xFuj7mATYXL?jTQ+RcYokymh-~ z>TyajC3y%-uqnyYl61GrjbJR;1TYrNM}V<)D=9GC|cA}AZ{=Cc3sg1*7_wW?54F$Re^){H-uHRC6KCq0r5q3RyBk)pL zb{@Sb(ivxdy4t#!D#WF@BgZ16CjR~kM%oPEZ}bZXos(%Y3^cgVSMOemy$Ll(xR!!P zfTTsdU!BNX;K+-oR$=6XsiFmU<1;F4e4f-O>%>S~A}COIA@3R>dsLDgkGg_IKwZIj zdenU(G{{i*Dojz-rKvoq%NWXox^P0=f#Q@`Y9|EU=VyG!Ae)KC+~1ftFBmjp;~@8x z$WVZ+#Nzi3$cMt|)$S+_FLNc$g11Fk)}Nn(&ExJW=E!T2PZMr$fSWS_w~;ITsjosu z4ZcozBedp1Tdi*?*e25%fwh7`0IeH&pE|L2lYzBxhUS4<6VBh|^fChEK8E$-^7zWmXtg_8-^M-l*ih;>q!_H8kUf<8Boyk6k(YyK zst#PSFFN|3vwl*d&TY`&647ARO8l8F|Kw~UA{xvqAM(@4RB0X-PaiN=I!B(s3QXJc z3Ai}}wkPrEnAdT4{lAe0dnMz8@E=2KiG77G&>C>BKlzeR-+`0Wl9p8%9G z2;Yb)3gI-B1H##`h<+h}lEC=N(Q^5(wm&OaEcRHcVM+gXNk2_xp??N;SnlS#t21q_ zlxNplPXiteRUI@p$@f%l4Am6cv!M`lCeJ`8mqRD%AP^5#FEUCPu8kdSu^DqX=+2Y= zO6n5XfPcqqTeVO>gm+P{x8z|?rR9l2+oI&kW~AJ9UP*-9jMXrks$w-WxjUujq%&f7 z%4?wzV5T~cG&Z4nF_F3AGOb=IRNNr;ULOO3==5;CwkH${HU zsj+T+|B5U-PsMEnt7g*P{BOy-%`QgRn;$@-boS<7-ObqT4QobO0oQKG?^2Qy+Z)y8 zpSQ#h1PtMASOHTgi~AC_|M8UgYPA>Df$9XqcCRl1g zYU&M)d~1K|a>_f~2m;XE;OKtj_J(|k_Zl#D953wpmWh~R2?4+~QHaI#i{m#wo(T=I zIpSHEqH{!=$}-1dV84kolqbxG3;XzvyBK@5+a24pYnRx|r+itC_Of zkJmsUP=eT9jcs@3_Favva`Gxz(l3z6SLz02$jun zp*)svJ6b*g*)g{7qAa#g)EzxfyL*0EKSgMq{VUkVi>Sb|Y#_KVjVpZcrqb*0a@Dl! zwcGH0OP2NLpI8mkmuj7sVvPI{c{EY=DY!WUs2Tx%C8NH^tSdw zpqAO%i!eoPEluUIwTz)Wwsu!&ubnM4DmUZ6?!uUr(qTIkY9Z3>vdMsJnzuDk^~M?! z%l;;=#+D~azh3UtFSpHmsVqDD3zQRyh}xWbu3;<~ELtgB&vAD$_qA1|4s4xO=-HSgy0VFWU{UoL+(W9Nep9waow)JCtsHnq{8i$&4FO=1e>zs?m^c$Gni&<*oX$g=ZL zta+w3iZSwC=Giqw1SEq%I1XBQ1f5!VTJhjmr z?j&3IxKEKJtJ1!o@z(9yXL&VG9>)^UA3*xQNz#K#YZgN%R)q?_2 z*IO2VN>tx2^X~dut^2@%XZy0n! z_kV&)=|<91WZC)fb|fIqJUFV@BIhE9CXQ}~n=^o;mcYBt!Zg_n?O0JXw0SR1JA|tz z*a2ucnfIL&LE|^$ar}(WsL=BzyyfKRS-=tuJzp%z4l1e*Jq3$^o`Ui8=s5umGJmv+ zDTUH6-Q&|+vh&eu2C5Wotr|^QJc3ceyFxr ziz~NwM``gJxgy%N*o~XF$+G@D6J;LQR9umJkU4+a+aBv0)%W6K1QANY3+aa^C6M}HC6Hjv?SnNbx7*!Mn6c!amps+iPdI3B&*W zR=ue&@T@i9B$G<7?iHLi1Kz-$;mj}^u0Ci-l5eCtKU~%DA$C50XQVJygb%9JJV+fX z)=Ohv9dFS@`1tD$;hIET*7it&Knc1`2Z5mT;kGk3$+G?%XWP!$_+_R=Z8SS2i7a_I zMtxOcg($@YsCJ1N4~BeoL&@`yl!?^_*;ih6p^$4iws@U|JH=WwueM%vh0v1_y}<`S zue_n?y(bI3eja+4b8R-s4c>AqzYz?f+Znc)mva`Pn zGt3hkhE-*>jWfNu?uG9Qv9a50v(F{qM^6jm%{Cmq+G%;^+IX#8;0nijY{*YpO7-H+oT!Ky zuD0hL=O}ZsS2`qKdaMEn^wmnB1ODK6&8t_6cuHbleTzfvoEq?#(&yGkylA5|>1ogX z!IzZUaI5RJ<~!1B#)Q^v2;F#yEgJOhOC`qlF)_Xyen56Z{?fwV+yTRkdNp75 z&vWqmPb{Q^AGu3wHl+GziL-C<7rrqBCyM^&fwmQhF+ll*Byp8(0Wl z7vc|{M_ODd@(v5#&dJ6oRRKQPplOUhgrromJ%`D{VE%LGcnygU`X5Dd3?It!9p<@t?j`hiADP9fgJEbLLU{{{-};4w}JX?4I{NF3ZmT8g!=w%mp`A%cNG; zSRdz@tNpcbG1#5UeYFQf+!&Mi&%|y(pHUI_9%)1$cYL~>`fB8TZbIbr55WkML~|H<_P5W zIb@hAmKSr%aeQ-GA@9QYs)ySi9B)CBWWg_pA0wi!ubeRJWZzHhhUn*`6=-_rlGo^4N!e6)|L&`MNvR? zQDGKTzY7_msD2nz6xC^Jj!^w-6eUD38eMQ(y&`>AHvx+*IHIR?Ut@L~#k7?R&s{tO zF`Qz08=xINmmGF!Pl_dyy~T;mr;z6Xu61Ibl*YBaUzVNytxBVx-8C(deizojusli^{vr#RU&}-0Vo-CFNOf<>r)fpt zvsnoIyVL|GHZp1ekdGm0rjdCs+{|la9>j{_%VX;hks(cu%*iq8uUQyD7+9G1V^!HK zj3^2gMpT%^!W@TOPz!TBY7vLbA8o6YA;XYwf2d&LEYPK_vyol0?7We`aW=rti1~+Iv>{t2 zXB)=L_27N$tmH*fHYv>3l~5?D*}9zO)y&pR8{V-j9Ne6TgF$Lksh0DuP!quz^LtAc zVh=D8#-96sm%DQNx&N&46zBfG+u2H%bN?9$Zi|c|JltIuQl}N*Uf8?B;beT&$wSq? z3Gk7G-SByL<@Ro1m8a;2C!MWi=>|qZnr?9C)dH^yfyre^x9LP}hnsnwsB^I5Y4XqT zLoiL9s3Dup(L5(X4QSQ~mbZIOYRUERURWDbs@Ds0x<^;c6vo@lNetDsVS#)TCw9WF zB`=_C-M?~5?DI9_jV7**A*W*r5Gt_oW64Hvnr9Zn&E`!ErgFX4fsGUV zuTF1FzYz`-49I$frfGMSDs6=h$?7(pB+L3!bK$mfIh&LG(^JSTp zG5RglHxD`)i|Cu*N!T}k;I7=>H>~m$ee(rpD_Q!6k&vcu+<7%eOJO#79@1?(S|`BG zypGnXSn)LZYxp6UrjFK1X^%ATN{|4q#)(+S?p?*b&lW|&OA!@j@lt+*^wPN0zhH`b zDKwSUOX0>o>q+Prp~PU1UAj^ie9{ERdu?9UlP1hFdMK#c>I);PKC|N zhH)c=eKR4Qf`-ABM(E9I1i;!KDy^I1ieuM0_v*@?EIT*h`!LVul=P$+VRHXjA#nQ5 zh4)AyqySzY3MB>JyJ%i5POlyHqD+K#GkpHb!&zv2Fb|DKLC6h{isIW~?Qvl13kTO0 z!!Kmv<8w@Yu@lO#yDPU(T3F>NCN1A}wvuJi!bosWM8q7Q>5@CIX2jJ1CvQc%O(Wid zn|Y1+tyu9i`EU3km{!qYb9ifpTu=jsyp83phFm|Y=QOnBvO*pj4j$8kP$5t=X?BI9 zi;rSt*m2a1@#5h;bMnSnihwWU5*sHMaPr|i-y^$m^0+i|5*sIv!9tsa4gzw{$i~TY zu*bzIEi`T2I4MO&wZ^`oPuCrD|KwSzIOcoEc0nQghCY0v2aaL?aPCuWRLx|}|y*haaXW_53)++o{Bsp!qMk@7}EP;R2R+^?rZ+s?VcCx+a&pxh}3 zaJ)|h)k@fA1@XduIVHwTH{VK`MA)wj+GN!H+IV4KvjH2(3;Vq8!Df5^3-L%6T;^G* zbzrX3-0xLz$N5O13B0xs);iu`sqlhQtv;o4+K)R6R$v`AsqOz;j6QIShIi>5kzI;U zj4ma!C=sO^CL!^vaa&r|a8@a{be@)=R=#l%A=#WY8di?*6O1;{tnr)g<%vanA}#+` zg8Cd(rT3Uy0r-~AKf*#W)WcsX4MH^soR4 zBrv7Sd>CGW!vZ4O$!bq%;60+w=;i4+ZDyhFuvwv}14Ps)?20pwGAzHtRZaLSLD$J` zSniW$=jH@~NC}vhWox8mQBs~s`|@cim=yNq6Hq9refcQOdj##vH?nZ>WF8LEzg_r; zEHwUYE*j~1RK|V3ty|TOCCiUO=I{TxS7`&K7bWZ zlar1C3xa8C4C$#75hGW#hJq-thVR8{vROk>6s)1BFpD)DMGmMn+=VG>4QXnQtl?Dw zheAfzGEJ{8OfkJOTe4e3{~dEW%Lo%0w^-+Lw>T3RkFbdjs(F|uwjVksmon2=f!;+2 zcid+B3R!mk^^CFjXSNOXYousW80s6LP*OvEJsn5%?!iF{nSKtiJ5r9+)90a#Wm2bzHVdxb6M7Z z*POax(fw!6&X2Old?sh(LqiOm?Ba~r&anXsB{lMEXkN|8r#F$KS!mpmi^kL@^2#hU zUY?r9#3oXyI$4dRnI`gQFck8d$c0$(G#Q5nyD1zfyMX_K0aXq%eMtK z@ejqsZ7C5&!PtljvlyEm@^w*<7{s*gYi!2$gH!&x688r;W;rF_C7I<#B3aP z_`6aRDQ1HYK%u0D;(nS}GZfbMe(Lp_^|9-<;2&q<;IpYYNDR?RxyWxJX(mM92{-dX z^si&Z)8zZ`LoiJtn!Ww7sg?%If+T?DyRZ`b3?>eiMNxodQDGKX{t?noVfi^sQCOy_ zIf7-jeuGOe&*|Jr)^Avw$qLN$dszZh4a(czIDF$#Uw$8dSS?$j5kVr0o)%g)gvjtKruoZb>I;gD~?AzX%;KZS&mS%!SuBPH|AQf?_Q{RAkK6w`-j-XnMKv=$J|kExmV57~S!ZOq_ty*wxJl*9y`R8B$w$P9vE2J$ty`rZ zBZEB;^g}Hp^z(XNyWQj;TZVo}S4j2I_tP*$7kht)O4H3aU+j&Hr|Ki8h7i8kTfm>d zaAzU9*jtz+)d`svdoMpuOcqvPicS`2YK|rgFV{+aZa3T24-f+B!9*^v-U%+;PoNDNt3`(G*VQ@&eUl?qXW&K~D%lMB~+H?yh zgi7BjLZ$xcGPV{ke=5rv`VhwXQcNl45obf8r1OX~XkKj|Ve=G>rDu^@;$}rJ$->Pw zdAPAU3~GL7ee8;KRkLtVNzFktq8p3L)i5HvkTi2vbR68wJ1g3X6;G49;D=zE&Wg4s zfZjfOHP?d85u}0ZegalzogBrkF&9O(3QgOZWR3ZIkPjO1`b|txBSuqmWW>&>di7Si z7us9gb_y%Bni|oSV17F+sij26Usr7&q@U`gzErt@^+9N6LLO4#$e|SW z$Gk1O!WvUJx=iT9SOUZZg#NQ6G^pohF`D&igt+%RP+ivqr=LiWczF z@=Ea1@2SCh2iHKmopXl=UN6hewd@T4Y;{0Bp{c&MD@%cyb~C(P`8Oq}DIl#6g_1(r zJv6U2!u8q@mVee02?AIn1QM^Y1;c>1fBs ziKgp_AIX@)63pZLreq}E;}lFo4MG%IEXR+aNxmorQ`B-ihpDWVgY%Qe<2;}CI4sY` zE#T?Q#}2p4saG6fKVCQ64qT9?I0JHwo*hq1MHz){$0|LWQ0U-IrL!weVB^QGvu^9L zM3(jET5^W@Sk8sRxK|!<@V+t~!TW&8qP!B+Ns`$V24o`?N@_rkO^{dfiIwol5RztM z@-JZ^=f&hftazGS3O@wX6qDEJ>ZO6QpaMX7A(o2+85&SLV8}p$ zvH3*7vH4`k*X}5h-7VQp0m*NJLP;U{&IEZiNLJlI-h!l=kUR-D^Fs0zRy<7}g&%@x z3d!pXy;QMRK?i_x3rog<^6?UsWw&v6S!l2$hw7P6^0w^CY=h$_mSAxFaY<-A91ErZ zjs>e(;P^>slELv;F-75+rZU4Z<0lUsUrIYQ_~JYrCOGUCV46ZXo8tvlUvshr zF@WcPg~j9WJVhLXFJVnlLJftjzys1^9||_S|2|UB@V>wcySfsWIN-ZB!8G8#5JeWe z-;FY-G4l&CMe&}dGUGktClB857Er}bQ%wi;G46M;>Ijsdb=T3PDh}Yc1q-Ofdg6W* z$V)h4q80dV-d6hja;HAKq5Y+@?Cd+^LJ)#a3R~Jc!P(enS(p5$fbuF7a*cmnkA)b3 z-`lRxyjrAP_9N?m*1b85(VMeyaC>SF5{KWFMv*d-W*Vcb;bvZA^h&IFnmhR-Erhs~MxC1m$6|?}TK8>ZVpsH_fym(L5EAPi|ncz1{JpAxT2|v;R zUu+CQEgr&!pKO_^9q<|^zUHh&b@Oq+YpPkmycqx>@nbmgNBlcbJJU!>Ym8D?6{Nb8E$F3j_++1Z@obk4pwXBY5~46R7U-=exXK=Vm>XDf2;1kJQX8+JL4r# z$o_dJe4=X)Y&P4HfObWXSwXaaCAI-xNQrS;cCif*JHWK&#=KT+1KdWl&d4^vNkb-X zQu#JOf`yXn%JavX&AL}=6l#r14Zr)`nBa&afT93aAAltYDWwDOEu_*|-DBzly_LTr z)t9%WVVrIkyp>AbEg-&K5CxQ~FP)kswhIaX5k7&l5DjJskXN0RX}jPu?Qc310w!Lz*U4gG>;-DERcyOwO*B%r|1EAA^?Oh&x zSaS?c9rj>4dgd8toJmibXfzK>XL5ELQ-D-SBS7kKmT2#}15_yCr)dhy!1Wux@XSp`2lt-h+ziG697wwM~h|IMiqW+ga+4Y!l- zoBkav!JOm&k}SE4;aU#CK3F3m6w^p1IcVbO&B7WTgDGl_Xez5UB8;Cr@5`h`LVWFY z(gi>gS|nEWe6vV`s>BwFODMfX5-k}PiQiWGybH71G*HOp%`u9WPaZpTHg+~_Z%t`|PD`{}qZ46!4$V=d4(N%qI_sr8A`d}Y zA+m@dzq+Ax^AEXt*>%%B%lQLY)}KpB8S|Uq0Y_R;p9_jfLtFI`xNkiW>1&eF6vpE# zP$;SK_)>zrT2NmJp8P42Wa!E% z)sR~C0XYjvGm&~D+{}yA+pywkawGf@OjD#j#?k{CXbWNhv^Qh%IMCihLAz8C2W^Ym z;ec&;L(+zKBx6&stcD^790pYHb-M5}w$!K;I=wOer%?GBsY?x!F;0JS1F#88FauDO z%*Pu5At*2aLVQ^az!Wseyz5&qMGXK=Wi|kepF9RYEOhCh0ceyay>#fGY@v&+JOcXX z>bCW{t?M=3aoz! z3MIw*4<^W~VZG`A@&J-%V*T6TW?rm+HNo`fHQX^Qn?sf`rB2K0gw0Qz@e**Ks- zBMH!R^e-S%2(?aMP^tZ2aLVjzZ}Z`OEWsfB>yoW_2p1v%2p59M0^$D%O)?077E=_$ zX(}^>Gk)?wxY*djl%O{`=C#v-c(RQxTJ;eyK37{o0+hu8x!7Ez6^e%P;P|4V6(gG%#5qDMZ=a)MJ_5g$Mvfl;po{4_iV9O-8;elaiX>PxYAUa$=?E`*T<#$Sm-r+eqG#}tKen#v60jGq~UakR5( z-?^rMaaR3&gmFPxDj4U|ij0Q`uv)ah-nrTyDZOqx_1X>N4Ow<>VO;P_G3?03U=B-` zQ~2d?fkLjKuWy^bBSBsb##I-P+mSRA#;b5MFN}Aw;%V}G@Ix>ihHgA;*D-OM{FondS8&4Cbk;IGl z!ABcpIFbLQ0*drTINZM0s8;yuq5DeZ|C(#9UFF>f|2Q&rQx8L{qUhQ@Yfh?s_~fhxNzX1iPLOv33UukAHq`FZ~^_}kHsbFTgcweCS zxx&d$M3-EauuHCUS8neTR(XmpDLGro(j|<9j9s$UfYDH|45|#GWAt09Z*Fli7ST5c z686nq?#k_b!zxeFH}7_~lBI7L32FMqomX>bmAxT9MsPLV*=OKpUU&9yvEpg+X^;!S zG<9d?k|XKU$PJx>5CDq5#G-M&><9}lsXMdOk;}rvow|2pJn{y@n=*?w$HG%;*g;&32Novu@@R9W@gbolQ78w z1C#<}+9x~)G%}N1#uPQlG?mpPb33M9(hTfrHo9<@MQ69b6zz`cv z8>_206b|?+%FW3Z%z7*Rd;7v5R+rHuP!{;hyUlX9?Rnv6Q6B-UZuF_m?ZJsMwN9&E znkpWsc?Uave>w2euE9j|roO+b)_`dptoW_f*^L#Gr9&03)vfkl^eg!1FE5u`7%}Vb z^OsE2n`8aM{<3PVQt=v)TFpz#8!H$>dzJpx3;e-utqZj_8}%v3JJ>EAR1M=4_7)V{ zCMt=QfKvzIPg9NkwVdyr2iv7q%WL-o^JA=~hqZ7yirRD)AFf{HZ$^0Nb#`(=?4*L& z315JRC320j*Y~PhZ|dVX5IGAxXMyGfJP|od)oqY-`%Tov9)xxmvu>wcEHcU0hnByr z)9kgOvFeC_bhlk(=U>QE=i>iz|J9*(*x*9`v+OF@IUJ z*KPH>{e9K7`}~0kui?Srsm(UjGyumdz-IT-WDEXS$r>y|EBoQkLH=j2U5CF`Lnjr- zO6C3d6dGQN{XEt8H;gx%-3G)gw1-zO^jCM_<7l8L#Y2GHlYO`YyS>}B7A$d|oP?qs zs1gcCUqUtKRXCVKF>V~}_S{$2!w**}UI%_0nb&=hC}5n`Xe zj2+5`5~)={R{<&Dv#-niHKiVWwO8Hp7u7($R#$qHt)f&x5G=h>1MO=!N_DJoExkhr z0CvB+)#`Y?O0#%q5>;xQcc|6uctyP=)sk`-V60PPD!LY-4UdT9N5(?Ibt_{?1d+I2+`-rafLZs>eI3`qM=9coqt(?0&C3TJyT&v<(1&UDfVn z9U2?xmd0QdRRGwpUg2*7ot!Mn;VBs?c3P+*hy8V(sYbVSs93E{RO|2`^mj?UiK@Sf zh9ZkR7I_zhC{<{(SZ|g~+>mT4S4%(-bUYhxAZ02-$i2VUf+p4gb<{#|8~}3ycWRAs z&;bDq8xSfW_F&|zO``JFnaHDi}|y!tqUwZr~muW_Ic^KpL#gA*9Ppo(~GAq7zyOnrQBDL{=h|aninuZOKY9UCTKU>&2?MR`ufdTejPQUq)6e1m4%+<#D_`iIv)!DT64_O6D@HF$Y!4O||_ z%gJluavEOVi8@}FAF!oWjS72cF6VAHpX1wN-+jWF`2GKY||u zB=~75g5RGa_+=7;pD!VJEIh%p;|ZQ;Oz_ZSf(O?TJl&4q(H8{I#~`@nnBcx-f;->{ zZj&Rp!-C*841()#2`Ml}+NFQn71;eHUW2*!s7c{)l^H=N0MTgSra*e&& zMYLph&_IcNY|QF+SUwoZfOL~%&AJ3bn)PVorp!GMsBu8FN(*fW)DON!yNk}vF=k!- z2{_1LKIwZd^b=N=oAo-wB=phu;QKGQe=lIbTl&|6DS-3q!KeVFbO8KVgVKryZm*QL aDSoZwPCDS_1VYzf1<%joHj&LfM*lBKmw&_n literal 0 HcmV?d00001 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/_images/coordinate_system.png b/_images/coordinate_system.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc0521840a5b13b9fb7a7cad9c71b429568641f GIT binary patch literal 21572 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 and `Python +`_. We'll show you how to do some neat things. +How can you get a list of all |hisparc| stations in Denmark? What is the +position of station 201? Which stations had data on 20 October 2010? How +does the number of measured events change during a few weeks? This +tutorial will give you an overview of some of possibilities with the +|hisparc| |api|. For details on all available classes and methods, +please see the :doc:`api`. + +.. note:: + + We'll require you to know some basic programming, i.e. to understand + what an :code:`if` statement is and :code:`for` loop does. If you + are new to coding you can try a tutorial online, for instance + `Codeacademy `_, we recommend learning + Python or jQuery. + + +First look +---------- + +First we will just look at what this |api| is. The |api| can be accessed +via the internet by opening urls. Instead of a website you get data as a +response. This data is formatted as a JSON (JavaScript Object Notation), +this format can be understood by many programming languages. + +To see what options the |api| has we will look at it in a browser. Open +the following link in your browser (this will not work in Internet +Explorer): `https://data.hisparc.nl/api/ `_. + +You should now see some text, like this: + +.. code-block:: javascript + + {"base_url": "https://data.hisparc.nl/api/", + "clusters": "clusters/", + "clusters_in_country": "countries/{country_id}/", + "configuration": "station/{station_id}/config/{year}/{month}/{day}/", + "countries": "countries/", + "has_data": "station/{station_id}/data/{year}/{month}/{day}/", + ... + "subclusters_in_cluster": "clusters/{cluster_id}/"} + +This is the JSON, it is a dictionary (indicated by the :code:`{` and +:code:`}` enclosing brackets): an object which has keys and values. Each +key (:code:`"clusters"`, :code:`"has_data"`) refers to a value +(:code:`"clusters/"`, +:code:`"station/{station_id}/data/{year}/{month}/{day}/"`). + + +Cluster list +^^^^^^^^^^^^ + +This tells us that if we want a list of all clusters we need to use the +clusters option by appending :code:`"clusters/"` to the base url, +resulting in the following: +`https://data.hisparc.nl/api/clusters/ `_. + +With this result: + +.. code-block:: javascript + + [{"name": "Amsterdam", + "number": 0}, + {"name": "Utrecht", + "number": 1000}, + ... + {"name": "Karlsruhe", + "number": 70000}] + +This JSON is a list (indicated by the :code:`[` and :code:`]` enclosing +brackets) of dictionaries, one for each cluster. Each dictionary +contains the name and number of a cluster. This way information about +the network of stations can be retrieved. + + +Javascript example +------------------ + +The following code example will generate a webpage which will use the +|api| to get an up-to-date list of stations. It will then show a +drop-down menu from which a station can be selected, once you have +chosen a station you can click the :code:`Get info` button to make +Javascript get the station information. To try this you can either use +this example page: `jsFiddle `_ or create +your own HTML file with this code: + +.. code-block:: html + + + + + + + +

Station info

+

Choose a station:

+ +

+    
+    
+
+
+Python example
+--------------
+
+In this example we will use several standard Python libraries and the
+popular plotting library `matplotlib `_ (pylab).
+We start by importing the required libraries, one to get data from the
+urls, one to make working with dates easy and the plotting library. Then
+define the start values and perpare two empty lists in which the data
+can be placed. Then a while loop is used to loop over all days between
+datum and end_datum, reading each corresponding url. Finally a plot is
+made, setting the dates against their values.
+
+Start Python and type (or copy/paste without the :code:`>>>`) the
+following lines of code:
+
+.. code-block:: python
+
+    >>> from urllib.request import urlopen
+    >>> from datetime import date, timedelta
+    >>> from pylab import plot, show
+    >>> id = 501
+    >>> datum = date(2010, 10, 1)
+    >>> end_datum = date(2011, 2, 1)
+    >>> base = 'https://data.hisparc.nl/api/station/%d/num_events/%d/%d/%d'
+    >>> events = []
+    >>> dates = []
+    >>> while datum < end_datum:
+    ...     url = urlopen(base % (id, datum.year, datum.month, datum.day))
+    ...     events.append(url.read())
+    ...     dates.append(datum)
+    ...     datum += timedelta(days=1)
+    ...
+    >>> step(dates, events)
+    >>> show()
+
+
+SAPPHiRE
+^^^^^^^^
+
+The HiSPARC Python framework SAPPHiRE includes an API module. This module
+simplifies access to the API. See the SAPPHiRE documentation for more
+information:
+`https://docs.hisparc.nl/sapphire/ `_.
diff --git a/_sources/api_views.rst.txt b/_sources/api_views.rst.txt
new file mode 100644
index 000000000..6d9c8cdde
--- /dev/null
+++ b/_sources/api_views.rst.txt
@@ -0,0 +1,11 @@
+API Views Reference
+===================
+
+.. automodule:: publicdb.api.views
+   :members:
+   :undoc-members:
+
+
+Contents:
+
+.. toctree::
diff --git a/_sources/data_access.rst.txt b/_sources/data_access.rst.txt
new file mode 100644
index 000000000..83cccaeb4
--- /dev/null
+++ b/_sources/data_access.rst.txt
@@ -0,0 +1,105 @@
+.. include:: subst.inc
+
+Data access
+===========
+
+There are several ways in which the |hisparc| data can be accessed:
+
+- Via the Public database `download forms
+  `_.
+- Via Python using the |sapphire| framework (see `SAPPHiRE Tutorial
+  `_).
+- Via the `jSparc `_ web applications.
+
+To access metadata, like a list of all stations or information about a
+specific station see the :doc:`api_tutorial`.
+
+
+Download form
+-------------
+
+When looking at the data page for a station (i.e. `Kaj Munk College
+`_), you will see a 'Download
+event summary data' link on the right. When this link is clicked you
+will be taken to the `Data download form
+`_. On this page you can select
+the station, the start and end date for which you want to download the
+data. There is also an option to download weather data instead of events,
+however, not all stations gather weather data.
+
+When you click the Submit button without checking the checkbox to
+Download, the data should (Firefox always downloads the data) show up in
+your browser window. If you check the Download box the data will be
+downloaded to your PC as a csv file.
+
+This csv file can be read by many programs, including Excel. Use the
+Import option in Excel to make it recognize tabs as delimiter between
+columns.
+
+
+Downloading via Python
+----------------------
+
+.. note::
+
+    An easy to use module has been added to |sapphire| to download
+    data from the ESD. The following is an old (but working) example.
+
+This is an example of how to download the data from the Public database
+in Python. In this example we will download 1 hour of data for station
+202 on July 2, 2013.
+
+First load the required libraries (requires the numpy package).
+
+.. code-block:: python
+
+    >>> from datetime import datetime
+    >>> from urllib import urlencode
+    >>> from urllib.request import urlopen
+    >>> from StringIO import StringIO
+    >>> from numpy import genfromtxt
+
+Then define the url and place the start and end datetime in the query.
+To download weather data instead, replace 'events' by 'weather' in
+the url (and choose a station that has weather data, e.g. 3 or 501).
+
+.. note::
+
+    Do not pass the query to the urlopen 'data' argument because that
+    changes the request into a *POST* request, but you need a *GET*
+    request.
+
+.. code-block:: python
+
+    >>> url = 'https://data.hisparc.nl/data/202/events'
+    >>> start = str(datetime(2013, 7, 2, 11, 0))
+    >>> end = str(datetime(2013, 7, 2, 12, 0))
+    >>> query = urlencode({'download': False, 'start': start,'end': end})
+    >>> full_url = url + '?' + query
+
+Download the data and store it in a variable
+
+.. code-block:: python
+
+    >>> data = urlopen(full_url).read()
+
+Now use numpy to convert the data from csv to a numpy array.
+
+.. code-block:: python
+
+    >>> format = [('date', 'datetime64[D]'), ('time', '|S8'),
+                  ('timestamp', 'uint32'), ('nanoseconds', 'uint32'),
+                  ('pulseheights', '4int16'), ('integrals', '4int32'),
+                  ('n1', 'float32'), ('n2', 'float32'),
+                  ('n3', 'float32'), ('n4', 'float32'),
+                  ('t1', 'float32'), ('t2', 'float32'),
+                  ('t3', 'float32'), ('t4', 'float32'),
+                  ('t_trigger', 'float32'),
+                  ('zenith', 'int16'), ('azimuth', 'int16')]
+    >>> a = genfromtxt(StringIO(data), delimiter="\t", dtype=format)
+    >>> print(a[0])
+    (datetime.date(2013, 7, 2), '11:00:02', 1372762802L, 466307811L,
+     [78, 798, -1, -1], [535, 10882, -1, -1],
+     0.14720000326633453, 3.854599952697754, -1.0, -1.0,
+     345.0, 12.5, -1.0, -1.0, 345.0, -999, -999)
diff --git a/_sources/hisparc_maps.rst.txt b/_sources/hisparc_maps.rst.txt
new file mode 100644
index 000000000..8c7d5b44c
--- /dev/null
+++ b/_sources/hisparc_maps.rst.txt
@@ -0,0 +1,110 @@
+.. include:: subst.inc
+
+HiSPARC maps
+============
+
+Each |hisparc| station is equipped with a GPS antenne. This GPS is used
+to for time synchronization between stations and to determine the exact
+location of each station. All these locations are stored in our
+database. The GPS positions can be found on the data pages of stations,
+via the API (:doc:`api`) and in the raw data.
+
+
+Map
+---
+
+Using the `Leafet `_ library with `CARTO
+`_ maps tiles (based on `OpenStreetMap
+`_ data) we are able to visualize the
+detector network by showing the locations of the stations on a map.
+
+Here is an overview of the network: `Stations on map
+`_
+
+
+Station info
+^^^^^^^^^^^^
+
+When you click on a station marker a popup will show information about
+that station, its name and cluster. If the station has data the name of
+the station will be a link to its data page.
+
+
+Status
+^^^^^^
+
+The stations on the map can have one of 4 colors to indicate the current
+status of that station.
+
+- Green: when a station is operating properly
+- Yellow: it is responding to the server but has a problem
+- Red: it is completely unresponsive (offline)
+- Gray: it is is no longer active or the status can't be determined.
+
+
+Embedding
+---------
+
+On several public database pages a map is embedded to show the station
+location or provide an overview of multiple stations. Moreover, maps are
+also used on our main website to give an overview of the station
+organization and clustering (e.g. `Bristol
+`_, `Science
+Park
+`_
+). This is accomplished by placing an iframe on those pages that
+shows another page which only has the map as its content. Example code:
+
+.. code-block:: html
+
+    
+
+Result:
+
+.. raw:: html
+
+    
+ +
+ + +Syntax +^^^^^^ + +To show a map of a specific region or location, use the syntax explained +here. First start with the base url:: + + https://data.hisparc.nl/maps/ + +When no extra options are given the page zooms and positions the map +such that all stations fit in the window. But you can also focus on a +specific region or station. Several levels of regions are possible:: + + https://data.hisparc.nl/maps/[Country]/[Cluster]/[Subcluster]/ + https://data.hisparc.nl/maps/[Station number]/ + +An overview of countries, clusters and subclusters can be found on +https://data.hisparc.nl/ . First you can choose to focus on a Country: + +- https://data.hisparc.nl/maps/Netherlands/ +- https://data.hisparc.nl/maps/Denmark/ + +Then focus more closely on a cluster, note that you also need to give +the country: + +- https://data.hisparc.nl/maps/Netherlands/Enschede/ +- https://data.hisparc.nl/maps/Netherlands/Utrecht/ +- https://data.hisparc.nl/maps/United%20Kingdom/Bristol/ + +And to focus on a subcluster, also specifying the country and cluster: + +- https://data.hisparc.nl/maps/Netherlands/Amsterdam/Zaanstad/ +- https://data.hisparc.nl/maps/Netherlands/Enschede/Enschede/ + +Finally you can also focus on one specific station by simply giving its +station number: + +- https://data.hisparc.nl/maps/8005/ +- https://data.hisparc.nl/maps/8103/ diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 000000000..7cd87648d --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,26 @@ +Public Database documentation! +============================== + +The HiSPARC Public Database is the interface through which everyone can access +the data and our station administration is done. + +Contents: + +.. toctree:: + :maxdepth: 2 + + data_access + api_tutorial + hisparc_maps + station_layout + api + status_display + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/_sources/station_layout.rst.txt b/_sources/station_layout.rst.txt new file mode 100644 index 000000000..441bb23d6 --- /dev/null +++ b/_sources/station_layout.rst.txt @@ -0,0 +1,63 @@ +.. include:: subst.inc + +HiSPARC station layout +====================== + +Each |hisparc| station has a GPS antenne and either 2 or 4 scintillator +detectors. This GPS is used to determine the exact location of the +station. However, the GPS is often not at the center of the station, +moreover, not all stations are oriented the same way, and the distances +between detector may differ. For reconstruction of the measured data it +is important to know the location of each detector, this section +explains how the location of the detectors can be measured and +communicated to us. + + +Compass coordinates +------------------- + +The coordinate system we have chosen for describing the position of +detectors is illustrated in the following figure. + +.. image:: images/coordinate_system.png + :width: 313px + +For each detector 3 (or 4) coordinates need to be determined: + +- First the distance (:code:`r`) from the GPS to the center of the + scintillator (in meters). +- Next the alpha angle (:code:`α`) which is the clock-wise turning angle + between North and the detector as seen from the GPS (in degrees). +- A height (:code:`z`) coordinate can be measured if there is a + significant altitude difference between the GPS antenna and the + detectors, or if the detectors are not at the same height. Up is + positive (in meters). +- The rotation of the detector is described by the beta angle + (:code:`β`), which is the clock-wise turning rotation of the long side + of the detector relative to North (in degrees). + +For more information about the coordinate systems used in HiSPARC see: +`Coordinate systems and units in HiSPARC +`_. + +For Dutch schools we have an assignment sheet in the infopakket which +walks students through the process of measuring the station layout: +`De stationsplattegrond +`_. + + +Submitting the measurements +--------------------------- + +New layouts can be submitted via the `layout submit form +`_. A verification e-mail will be sent +to the submitter. The submitted measurements will be reviewed before they are +made available on the website and via the API. + + +Accessing the data +------------------ + +The detector coordinates can be accessed via the :doc:`API `. +These can, for example, be used when analysing data or when making a schematic +drawing of the station layout. diff --git a/_sources/status_display.rst.txt b/_sources/status_display.rst.txt new file mode 100644 index 000000000..36a72f40d --- /dev/null +++ b/_sources/status_display.rst.txt @@ -0,0 +1,13 @@ +Status Display Reference +======================== + +.. automodule:: publicdb.status_display + :members: + :undoc-members: + + +Contents: + +.. toctree:: + + status_display_views diff --git a/_sources/status_display_views.rst.txt b/_sources/status_display_views.rst.txt new file mode 100644 index 000000000..aac40fa8b --- /dev/null +++ b/_sources/status_display_views.rst.txt @@ -0,0 +1,11 @@ +Status Display Views Reference +============================== + +.. automodule:: publicdb.status_display.views + :members: + :undoc-members: + + +Contents: + +.. toctree:: diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 000000000..867e7247d --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.4', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/favicon.ico b/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2632b900af50d910fc8f276420be1a235eb8c5c2 GIT binary patch literal 4286 zcma)8OQ=p^6g}P|T?rWoWuhdBB+)f7VuUg?QA#Py#NZ~6%uEbSq`YEA29%V?0EHt` z2J*-sk;H^ZK5HF&9qa$j_shAhyZ5)(+IyXS`u}rpRgJ>Wym=LWSLdfz)y%4@762$! zYXH^s8_Yep%8@AK0+*P{Lcp#OA0^Jj(c*odD(L)}x&K;E~r z>Wbu*E2>8v;&&M}YY<*W-L9 z>U=iit*`M$t&QS5lGnUki}NHvyD>J;mb&OUX8g3$9BIWddM=*P^U%ykjXUceR$Ko8 ztIy77auy-I^U9@BbZuz(y`le4peG*rEOoDksmI3 z=QU{C=Tge$sXl4qJPv2R*YvFQ&OIG`^KR1&_IiIlGv~ysUuV}L=ie;(^O;`^-5B*z zPvrfo4~o{$Jud_6tu`8GzR!OE^1l@xt+(lUZ#Z^8)6rApgIgLNcjK&G^tYV7kMr4n zrnmbe*9?6Y8(#IScM0m;@n%-n-mg?=zmU~hfAZv9hrExMCUhNt@Y?|Te{>(^9ytqW z_v6`l=Hl~ua3z0!*Xh4lJ;>X=R8uU?r{2)Fzxo()_4(thcm0##eNK~me`t#HbAO$^ z-~9FY=KqS^eT8&+AJ5|4ANA%w21WIFKXUDV1^FU?-p^w0804LuS@T&q|I=5z_gF6f zi_l#K=)XZcBd+!yJU34MtuE_tc+>m+%l{>2Q}@|*@?-Rwo<|=_Z2$W?Wgck#y)X3g z=ib!ql*anoy;PGXX0-F2SB_ZZ3;w^dxkX>j&2-KDLcMQ)@rniieNj_iC%Uh4%feD*}=|8~EhJU9RLdC)W0u~w>w?g%(~pHQFA^*+^0kveI`doAZoqupn@ zM!kcg^|!v#l2bk?hGrjl`kzye=K7g4y#Bwr`V>2TZ}$wP-ma0D_QjZ%0zPkIs9*e&7HwA*Gi?bzRS`>xaX@NL}Age{e6|7$R=tOxy|7h&5U< IIh_pr22!tZkN^Mx literal 0 HcmV?d00001 diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/header.png b/_static/header.png new file mode 100644 index 0000000000000000000000000000000000000000..383625f38ea5244e6b401fe8d3de52432ba78d40 GIT binary patch literal 3210 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 wHt@W;Ps#ng(R*rXRPZYB0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/nature.css b/_static/nature.css new file mode 100644 index 000000000..84c584afc --- /dev/null +++ b/_static/nature.css @@ -0,0 +1,252 @@ +/* + * nature.css_t + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- nature theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Arial, sans-serif; + font-size: 100%; + background-color: #fff; + color: #555; + margin: 0; + padding: 0; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.document { + background-color: #eee; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 30px 30px; + font-size: 0.9em; +} + +div.footer { + color: #555; + width: 100%; + padding: 13px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #444; + text-decoration: underline; +} + +div.related { + background-color: #6BA81E; + line-height: 32px; + color: #fff; + text-shadow: 0px 1px 0 #444; + font-size: 0.9em; +} + +div.related a { + color: #E2F3CC; +} + +div.sphinxsidebar { + font-size: 0.75em; + line-height: 1.5em; +} + +div.sphinxsidebarwrapper{ + padding: 20px 0; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Arial, sans-serif; + color: #222; + font-size: 1.2em; + font-weight: normal; + margin: 0; + padding: 5px 10px; + background-color: #ddd; + text-shadow: 1px 1px 0 white +} + +div.sphinxsidebar h4{ + font-size: 1.1em; +} + +div.sphinxsidebar h3 a { + color: #444; +} + + +div.sphinxsidebar p { + color: #888; + padding: 5px 20px; +} + +div.sphinxsidebar p.topless { +} + +div.sphinxsidebar ul { + margin: 10px 20px; + padding: 0; + color: #000; +} + +div.sphinxsidebar a { + color: #444; +} + +div.sphinxsidebar input { + border: 1px solid #ccc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar .searchformwrapper { + margin-left: 20px; + margin-right: 20px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #005B81; + text-decoration: none; +} + +a:hover { + color: #E32E00; + text-decoration: underline; +} + +a:visited { + color: #551A8B; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Arial, sans-serif; + background-color: #BED4EB; + font-weight: normal; + color: #212224; + margin: 30px 0px 10px 0px; + padding: 5px 0 5px 10px; + text-shadow: 0px 1px 0 white +} + +div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 150%; background-color: #C8D5E3; } +div.body h3 { font-size: 120%; background-color: #D8DEE3; } +div.body h4 { font-size: 110%; background-color: #D8DEE3; } +div.body h5 { font-size: 100%; background-color: #D8DEE3; } +div.body h6 { font-size: 100%; background-color: #D8DEE3; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + line-height: 1.5em; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +nav.contents, +aside.topic, +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 10px; + line-height: 1.2em; + border: 1px solid #C6C9CB; + font-size: 1.1em; + margin: 1.5em 0 1.5em 0; + -webkit-box-shadow: 1px 1px 1px #d8d8d8; + -moz-box-shadow: 1px 1px 1px #d8d8d8; +} + +code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ + font-size: 1.1em; + font-family: monospace; +} + +.viewcode-back { + font-family: Arial, sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + background-color: #ddd; + color: #222; + border: 1px solid #C6C9CB; +} \ No newline at end of file diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 000000000..0d49244ed --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 000000000..7918c3fab --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '
" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/api.html b/api.html new file mode 100644 index 000000000..b1807d220 --- /dev/null +++ b/api.html @@ -0,0 +1,145 @@ + + + + + + + + API Reference — Public Database 0.4 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

API Reference

+

Application Programming Interface for HiSPARC Public Database

+

The API simplifies data access for data contained in the +HiSPARC Public Database. It was born out of the +need for easy access to up-to-date information about stations.

+

Contents:

+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/api_tutorial.html b/api_tutorial.html new file mode 100644 index 000000000..0b9270188 --- /dev/null +++ b/api_tutorial.html @@ -0,0 +1,286 @@ + + + + + + + + API Tutorial — Public Database 0.4 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

API Tutorial

+

The HiSPARC API (Application Programming Interface) simplifies +metadata access from other applications. In this tutorial, we’ll give +some examples of how this data can be accessed and used with Javascript +(jQuery) and Python. We’ll show you how to do some neat things. +How can you get a list of all HiSPARC stations in Denmark? What is the +position of station 201? Which stations had data on 20 October 2010? How +does the number of measured events change during a few weeks? This +tutorial will give you an overview of some of possibilities with the +HiSPARC API. For details on all available classes and methods, +please see the API Reference.

+
+

Note

+

We’ll require you to know some basic programming, i.e. to understand +what an if statement is and for loop does. If you +are new to coding you can try a tutorial online, for instance +Codeacademy, we recommend learning +Python or jQuery.

+
+
+

First look

+

First we will just look at what this API is. The API can be accessed +via the internet by opening urls. Instead of a website you get data as a +response. This data is formatted as a JSON (JavaScript Object Notation), +this format can be understood by many programming languages.

+

To see what options the API has we will look at it in a browser. Open +the following link in your browser (this will not work in Internet +Explorer): https://data.hisparc.nl/api/.

+

You should now see some text, like this:

+
{"base_url": "https://data.hisparc.nl/api/",
+ "clusters": "clusters/",
+ "clusters_in_country": "countries/{country_id}/",
+ "configuration": "station/{station_id}/config/{year}/{month}/{day}/",
+ "countries": "countries/",
+ "has_data": "station/{station_id}/data/{year}/{month}/{day}/",
+ ...
+ "subclusters_in_cluster": "clusters/{cluster_id}/"}
+
+
+

This is the JSON, it is a dictionary (indicated by the { and +} enclosing brackets): an object which has keys and values. Each +key ("clusters", "has_data") refers to a value +("clusters/", +"station/{station_id}/data/{year}/{month}/{day}/").

+
+

Cluster list

+

This tells us that if we want a list of all clusters we need to use the +clusters option by appending "clusters/" to the base url, +resulting in the following: +https://data.hisparc.nl/api/clusters/.

+

With this result:

+
[{"name": "Amsterdam",
+  "number": 0},
+ {"name": "Utrecht",
+  "number": 1000},
+ ...
+ {"name": "Karlsruhe",
+  "number": 70000}]
+
+
+

This JSON is a list (indicated by the [ and ] enclosing +brackets) of dictionaries, one for each cluster. Each dictionary +contains the name and number of a cluster. This way information about +the network of stations can be retrieved.

+
+
+
+

Javascript example

+

The following code example will generate a webpage which will use the +API to get an up-to-date list of stations. It will then show a +drop-down menu from which a station can be selected, once you have +chosen a station you can click the Get info button to make +Javascript get the station information. To try this you can either use +this example page: jsFiddle or create +your own HTML file with this code:

+
<html>
+<head>
+<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
+<script>
+    $(function() {
+        // Get an up-to-date list of HiSPARC stations
+        $.getJSON(
+            'https://data.hisparc.nl/api/stations/',
+            function(data) {
+                // Create the drop-down menu
+                var select = $('<select>');
+                var id, name;
+                for (var i in data) {
+                    id = data[i].number;
+                    name = data[i].name;
+                    select.append($('<option>').attr('value', id).text(id + ' - ' + name));}
+                $('#station_list').append(select);});
+
+        // Attach a function to the Get info button
+        $('#get_station').on('click', function() {
+            var id = $('#station_list').find('select').val();
+            // Get info for selected station and display it in a nice way
+            $.getJSON('https://data.hisparc.nl/api/station/' + id + '/',
+                      function(data) {
+                          $('#station_info').text(JSON.stringify(data, undefined, 4));
+                      });
+            });
+        });
+</script>
+</head>
+<body style="font-family: sans-serif;">
+    <h2>Station info</h2>
+    <p id="station_list">Choose a station: </p>
+    <input type="submit" id="get_station" value="Get info">
+    <pre id="station_info"></pre>
+</body>
+</html>
+
+
+
+
+

Python example

+

In this example we will use several standard Python libraries and the +popular plotting library matplotlib (pylab). +We start by importing the required libraries, one to get data from the +urls, one to make working with dates easy and the plotting library. Then +define the start values and perpare two empty lists in which the data +can be placed. Then a while loop is used to loop over all days between +datum and end_datum, reading each corresponding url. Finally a plot is +made, setting the dates against their values.

+

Start Python and type (or copy/paste without the >>>) the +following lines of code:

+
>>> from urllib.request import urlopen
+>>> from datetime import date, timedelta
+>>> from pylab import plot, show
+>>> id = 501
+>>> datum = date(2010, 10, 1)
+>>> end_datum = date(2011, 2, 1)
+>>> base = 'https://data.hisparc.nl/api/station/%d/num_events/%d/%d/%d'
+>>> events = []
+>>> dates = []
+>>> while datum < end_datum:
+...     url = urlopen(base % (id, datum.year, datum.month, datum.day))
+...     events.append(url.read())
+...     dates.append(datum)
+...     datum += timedelta(days=1)
+...
+>>> step(dates, events)
+>>> show()
+
+
+
+

SAPPHiRE

+

The HiSPARC Python framework SAPPHiRE includes an API module. This module +simplifies access to the API. See the SAPPHiRE documentation for more +information: +https://docs.hisparc.nl/sapphire/.

+
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/api_views.html b/api_views.html new file mode 100644 index 000000000..a099d1a00 --- /dev/null +++ b/api_views.html @@ -0,0 +1,397 @@ + + + + + + + + API Views Reference — Public Database 0.4 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

API Views Reference

+
+
+clusters(request, country_number=None)
+

Get cluster list

+

Retrieve a list of all clusters or only the clusters in a specific country. +By cluster we here mean the main clusters, which contain subclusters.

+
+
Parameters:
+

country_number – a country number identifier, give this to only get +clusters from a specific country.

+
+
Returns:
+

list of dictionaries containing the name and number of all +clusters that matched the given parameters.

+
+
+
+ +
+
+config(request, station_number, date=None)
+

Get station config settings

+

Retrieve the entire configuration of a station. If no date if given the +latest config will be sent, otherwise the latest on or before the given +date.

+
+
Parameters:
+
    +
  • station_number – a station number identifier.

  • +
  • date – the date for which to get a configuration.

  • +
+
+
Returns:
+

dictionary containing the entire configuration from +the HiSPARC DAQ.

+
+
+
+ +
+
+countries(request)
+

Get country list

+

Retrieve a list of all countries.

+
+
Returns:
+

list of dictionaries containing the name and number of +all countries.

+
+
+
+ +
+
+get_cluster_dict(country=None)
+
+ +
+
+get_country_dict()
+
+ +
+
+get_event_traces(request, station_number, ext_timestamp)
+

Get the traces for an event

+
+
Parameters:
+
    +
  • station_number – a station number identifier.

  • +
  • ext_timestamp – extended timestamp (nanoseconds since UNIX epoch).

  • +
  • raw – (optional, GET) if present get the raw trace, i.e. without +subtracted baseline.

  • +
+
+
Returns:
+

two or four traces.

+
+
+
+ +
+
+get_station_dict(subcluster=None)
+

Return list of station numbers and names

+

For all non-test stations in the given subcluster

+
+ +
+
+get_subcluster_dict(cluster=None)
+
+ +
+
+has_data(request, station_number, type=None, year=None, month=None, date=None)
+

Check for presence of cosmic ray data

+

Find out if the given station has measured shower data, either on a +specific date, or at all.

+
+
Parameters:
+
    +
  • station_number – a stationn number identifier.

  • +
  • type – the data type: events, singles or weather.

  • +
  • year,month,date – the date, this has to be within the time +HiSPARC has been operational and can be as specific as +you desire.

  • +
+
+
Returns:
+

boolean, True if the given station has data, False otherwise.

+
+
+
+ +
+
+json_dict(result)
+

Create a json HTTPResponse

+
+ +
+
+man(request)
+

Give overview of the possible urls

+
+ +
+
+network_status(request)
+

Get status of the network

+
+
Returns:
+

dictionary containing status info for each station.

+
+
+
+ +
+
+num_events(request, station_number, year=None, month=None, date=None, hour=None)
+

Get number of events for a station

+

Retrieve the number of events that a station has measured during its +entire operation or during a specific period, which can be a year, +month, day or an hour.

+
+
Parameters:
+
    +
  • station_number – a stationn number identifier.

  • +
  • year,month,date,hour – the date, this has to be within the time +HiSPARC has been operational and can be as specific as you desire.

  • +
+
+
Returns:
+

integer containing the total number of events ever recorded by +the given station.

+
+
+
+ +
+
+station(request, station_number, year=None, month=None, date=None)
+

Get station info

+

Retrieve general information about a station. If no date if given +the latest valid info will be sent, otherwise the latest on or +before the given date.

+
+
Parameters:
+
    +
  • station_number – a station number identifier.

  • +
  • date – the date for which to get station info.

  • +
+
+
Returns:
+

dictionary containing info about the station. Most importantly, +this contains information about the location of the station GPS +and the relative locations of the individual scintillators.

+
+
+
+ +
+
+stations(request, subcluster_number=None)
+

Get station list

+

Retrieve a list of all stations or all stations in a subcluster.

+
+
Parameters:
+

subcluster_number – a subcluster number identifier. If given, only +stations belonging to that subcluster will be included in the list.

+
+
Returns:
+

list containing dictionaries which consist of the name and number +of each station (matching the subcluster).

+
+
+
+ +
+
+stations_with_data(request, type=None, year=None, month=None, date=None)
+

Get stations with event or weather data

+

Retrieve a list of all stations which have recorded events, singles or +weather data in the given year, month, day or at all.

+
+
Parameters:
+
    +
  • type – data type to check for: events, singles or weather.

  • +
  • year,month,date – the date, this has to be within the time +HiSPARC has been operational and can be as specific as you desire.

  • +
+
+
Returns:
+

list of dictionaries containing the name and number of each +station that has measured weather data in the given year.

+
+
+
+ +
+
+subclusters(request, cluster_number=None)
+

Get subcluster list

+

Retrieve a list of all subclusters or all subclusters in a specific +cluster.

+
+
Parameters:
+

cluster_number – a cluster number identifier, give this to only get +subclusters from this cluster.

+
+
Returns:
+

list of dictionaries containing the name and number of all +subclusters that matched the given parameters.

+
+
+
+ +
+
+validate_date(date)
+

Check if date is outside HiSPARC project range

+

If not valid, a 404 (Not Found) should be returned to the user.

+
+
Returns:
+

boolean, True if the date is in the range, False otherwise.

+
+
+
+ +

Contents:

+
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/data_access.html b/data_access.html new file mode 100644 index 000000000..cf7d63238 --- /dev/null +++ b/data_access.html @@ -0,0 +1,207 @@ + + + + + + + + Data access — Public Database 0.4 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Data access

+

There are several ways in which the HiSPARC data can be accessed:

+ +

To access metadata, like a list of all stations or information about a +specific station see the API Tutorial.

+
+

Download form

+

When looking at the data page for a station (i.e. Kaj Munk College), you will see a ‘Download +event summary data’ link on the right. When this link is clicked you +will be taken to the Data download form. On this page you can select +the station, the start and end date for which you want to download the +data. There is also an option to download weather data instead of events, +however, not all stations gather weather data.

+

When you click the Submit button without checking the checkbox to +Download, the data should (Firefox always downloads the data) show up in +your browser window. If you check the Download box the data will be +downloaded to your PC as a csv file.

+

This csv file can be read by many programs, including Excel. Use the +Import option in Excel to make it recognize tabs as delimiter between +columns.

+
+
+

Downloading via Python

+
+

Note

+

An easy to use module has been added to SAPPHiRE to download +data from the ESD. The following is an old (but working) example.

+
+

This is an example of how to download the data from the Public database +in Python. In this example we will download 1 hour of data for station +202 on July 2, 2013.

+

First load the required libraries (requires the numpy package).

+
>>> from datetime import datetime
+>>> from urllib import urlencode
+>>> from urllib.request import urlopen
+>>> from StringIO import StringIO
+>>> from numpy import genfromtxt
+
+
+

Then define the url and place the start and end datetime in the query. +To download weather data instead, replace ‘events’ by ‘weather’ in +the url (and choose a station that has weather data, e.g. 3 or 501).

+
+

Note

+

Do not pass the query to the urlopen ‘data’ argument because that +changes the request into a POST request, but you need a GET +request.

+
+
>>> url = 'https://data.hisparc.nl/data/202/events'
+>>> start = str(datetime(2013, 7, 2, 11, 0))
+>>> end = str(datetime(2013, 7, 2, 12, 0))
+>>> query = urlencode({'download': False, 'start': start,'end': end})
+>>> full_url = url + '?' + query
+
+
+

Download the data and store it in a variable

+
>>> data = urlopen(full_url).read()
+
+
+

Now use numpy to convert the data from csv to a numpy array.

+
>>> format = [('date', 'datetime64[D]'), ('time', '|S8'),
+              ('timestamp', 'uint32'), ('nanoseconds', 'uint32'),
+              ('pulseheights', '4int16'), ('integrals', '4int32'),
+              ('n1', 'float32'), ('n2', 'float32'),
+              ('n3', 'float32'), ('n4', 'float32'),
+              ('t1', 'float32'), ('t2', 'float32'),
+              ('t3', 'float32'), ('t4', 'float32'),
+              ('t_trigger', 'float32'),
+              ('zenith', 'int16'), ('azimuth', 'int16')]
+>>> a = genfromtxt(StringIO(data), delimiter="\t", dtype=format)
+>>> print(a[0])
+(datetime.date(2013, 7, 2), '11:00:02', 1372762802L, 466307811L,
+ [78, 798, -1, -1], [535, 10882, -1, -1],
+ 0.14720000326633453, 3.854599952697754, -1.0, -1.0,
+ 345.0, 12.5, -1.0, -1.0, 345.0, -999, -999)
+
+
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 000000000..82507e964 --- /dev/null +++ b/genindex.html @@ -0,0 +1,390 @@ + + + + + + + Index — Public Database 0.4 documentation + + + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ C + | G + | H + | J + | L + | M + | N + | P + | S + | T + | V + +
+

C

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

J

+ + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

P

+ + + +
    +
  • + publicdb.api.views + +
  • +
  • + publicdb.status_display + +
  • +
  • + publicdb.status_display.views + +
  • +
+ +

S

+ + + +
+ +

T

+ + +
+ +

V

+ + +
+ + + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/hisparc_maps.html b/hisparc_maps.html new file mode 100644 index 000000000..a6550b556 --- /dev/null +++ b/hisparc_maps.html @@ -0,0 +1,218 @@ + + + + + + + + HiSPARC maps — Public Database 0.4 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

HiSPARC maps

+

Each HiSPARC station is equipped with a GPS antenne. This GPS is used +to for time synchronization between stations and to determine the exact +location of each station. All these locations are stored in our +database. The GPS positions can be found on the data pages of stations, +via the API (API Reference) and in the raw data.

+
+

Map

+

Using the Leafet library with CARTO maps tiles (based on OpenStreetMap data) we are able to visualize the +detector network by showing the locations of the stations on a map.

+

Here is an overview of the network: Stations on map

+
+

Station info

+

When you click on a station marker a popup will show information about +that station, its name and cluster. If the station has data the name of +the station will be a link to its data page.

+
+
+

Status

+

The stations on the map can have one of 4 colors to indicate the current +status of that station.

+
    +
  • Green: when a station is operating properly

  • +
  • Yellow: it is responding to the server but has a problem

  • +
  • Red: it is completely unresponsive (offline)

  • +
  • Gray: it is is no longer active or the status can’t be determined.

  • +
+
+
+
+

Embedding

+

On several public database pages a map is embedded to show the station +location or provide an overview of multiple stations. Moreover, maps are +also used on our main website to give an overview of the station +organization and clustering (e.g. Bristol, Science +Park +). This is accomplished by placing an iframe on those pages that +shows another page which only has the map as its content. Example code:

+
<iframe src="https://data.hisparc.nl/maps/Netherlands/Amsterdam/Science%20Park/"
+        scrolling="no" frameborder="0" width="600" height="300"></iframe>
+
+
+

Result:

+
+ +
+

Syntax

+

To show a map of a specific region or location, use the syntax explained +here. First start with the base url:

+
https://data.hisparc.nl/maps/
+
+
+

When no extra options are given the page zooms and positions the map +such that all stations fit in the window. But you can also focus on a +specific region or station. Several levels of regions are possible:

+
https://data.hisparc.nl/maps/[Country]/[Cluster]/[Subcluster]/
+https://data.hisparc.nl/maps/[Station number]/
+
+
+

An overview of countries, clusters and subclusters can be found on +https://data.hisparc.nl/ . First you can choose to focus on a Country:

+ +

Then focus more closely on a cluster, note that you also need to give +the country:

+ +

And to focus on a subcluster, also specifying the country and cluster:

+ +

Finally you can also focus on one specific station by simply giving its +station number:

+ +
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..dff4a1616 --- /dev/null +++ b/index.html @@ -0,0 +1,156 @@ + + + + + + + + Public Database documentation! — Public Database 0.4 documentation + + + + + + + + + + + + + +
+
+
+
+ +
+

Public Database documentation!

+

The HiSPARC Public Database is the interface through which everyone can access +the data and our station administration is done.

+

Contents:

+ +
+
+

Indices and tables

+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..188acff84f477dd0de37fd80b8051cc14566400c GIT binary patch literal 987 zcmV<110?(-AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkVbz*F3 zV<1FfbYWs)b7cx6AXa5^b7^mGIv_AEGzudiRA^-&a%F8{X>Md?av*PJAarPHb0B7E zY-J#6b0A}HZE$jBb8}^6Aa!$TZf78RY-wUH3V7PRSxa-9Fc7};E9kUWdzx!*ndZ>U zv>i{}$yFo7+9(wg)x!z@zIuQS6elepZuV;T`*yXvdQq8-QIcm{T+y_uZ%dII2I=S2 z{@)h5WFLcM^C{gVRY!SyqVS@ICdfbAiJx~(0*UltSo9@iA)|9m`5wZE2$092gM#trdx?YWwEFVw- ztXdF`3l2yNyM6KnQT?tt`ldP?wdt~@Vb5j0G;p+{YYT4iX>Nht^J!G@kvG02pqYQ4 zi2ywMD7ye~3`msK?I(dq=~<)H`Pl?VN=biccM{E|9JazStO zJHR`iBJWRTcb?R0n9?5NeQG`=rN~EotLjZV5Kz8{H~ipbXY?JjU2Sj8yl<`Sm6{ZN z!ypSb`!K%4M@ag|t8Rq-k^Y>t-+;ncGWfJH02zGQNcW+??i=k(=EsWlI#{=k29U#& J`U7|IeQqkH(U$-K literal 0 HcmV?d00001 diff --git a/py-modindex.html b/py-modindex.html new file mode 100644 index 000000000..20b0a5623 --- /dev/null +++ b/py-modindex.html @@ -0,0 +1,121 @@ + + + + + + + Python Module Index — Public Database 0.4 documentation + + + + + + + + + + + + + + + +
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + +
 
+ p
+ publicdb +
    + publicdb.api +
    + publicdb.api.views +
    + publicdb.status_display +
    + publicdb.status_display.views +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 000000000..3e214f204 --- /dev/null +++ b/search.html @@ -0,0 +1,105 @@ + + + + + + + Search — Public Database 0.4 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + + +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 000000000..1d6c4a395 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api_tutorial", "api_views", "data_access", "hisparc_maps", "index", "station_layout", "status_display", "status_display_views"], "filenames": ["api.rst", "api_tutorial.rst", "api_views.rst", "data_access.rst", "hisparc_maps.rst", "index.rst", "station_layout.rst", "status_display.rst", "status_display_views.rst"], "titles": ["API Reference", "API Tutorial", "API Views Reference", "Data access", "HiSPARC maps", "Public Database documentation!", "HiSPARC station layout", "Status Display Reference", "Status Display Views Reference"], "terms": {"applic": [0, 1, 3], "program": [0, 1, 3], "interfac": [0, 1, 5], "hisparc": [0, 1, 2, 3, 5], "public": [0, 3, 4], "databas": [0, 3, 4], "The": [0, 1, 3, 4, 5, 6, 7, 8], "simplifi": [0, 1], "data": [0, 1, 2, 4, 5, 7, 8], "access": [0, 1, 5], "contain": [0, 1, 2, 8], "It": [0, 1], "wa": 0, "born": 0, "out": [0, 2], "need": [0, 1, 3, 4, 6], "easi": [0, 1, 3], "up": [0, 1, 3, 6, 8], "date": [0, 1, 2, 3, 8], "inform": [0, 1, 2, 3, 4, 6], "about": [0, 1, 2, 3, 4, 6], "station": [0, 1, 2, 3, 5, 7, 8], "content": [0, 2, 4, 5, 7, 8], "view": [0, 5, 7], "cluster": [0, 2, 4, 8], "config": [0, 1, 2, 8], "countri": [0, 1, 2, 4, 8], "get_cluster_dict": [0, 2], "get_country_dict": [0, 2], "get_event_trac": [0, 2], "get_station_dict": [0, 2], "get_subcluster_dict": [0, 2], "has_data": [0, 1, 2], "json_dict": [0, 2], "man": [0, 2], "network_statu": [0, 2], "num_ev": [0, 1, 2], "stations_with_data": [0, 2, 7, 8], "subclust": [0, 2, 4, 8], "validate_d": [0, 2], "metadata": [1, 3], "from": [1, 2, 3, 6, 8], "other": [1, 8], "In": [1, 3], "thi": [1, 2, 3, 4, 6, 8], "we": [1, 2, 3, 4, 6], "ll": 1, "give": [1, 2, 4], "some": 1, "how": [1, 3, 6], "can": [1, 2, 3, 4, 5, 6, 8], "us": [1, 3, 4, 6, 8], "jqueri": 1, "show": [1, 3, 4, 8], "you": [1, 2, 3, 4], "do": [1, 3], "neat": 1, "thing": [1, 8], "get": [1, 2, 3, 8], "all": [1, 2, 3, 4, 6, 8], "denmark": [1, 4], "what": 1, "i": [1, 2, 3, 4, 5, 6, 8], "posit": [1, 4, 6], "201": 1, "which": [1, 2, 3, 4, 5, 6, 8], "had": 1, "20": 1, "octob": 1, "2010": 1, "doe": 1, "number": [1, 2, 4, 8], "measur": [1, 2, 5, 7], "event": [1, 2, 3, 8], "chang": [1, 3], "dure": [1, 2], "few": 1, "week": 1, "an": [1, 2, 3, 4, 6], "overview": [1, 2, 4], "possibl": [1, 2, 4], "For": [1, 2, 6], "detail": 1, "avail": [1, 6, 8], "class": [1, 8], "method": [1, 8], "pleas": 1, "see": [1, 3, 6], "refer": [1, 4, 5], "requir": [1, 3], "know": [1, 6], "basic": 1, "e": [1, 2, 3, 4, 6], "understand": 1, "statement": 1, "loop": 1, "If": [1, 2, 3, 4], "ar": [1, 3, 4, 6, 8], "new": [1, 6], "code": [1, 4], "try": 1, "onlin": 1, "instanc": 1, "codeacademi": 1, "recommend": 1, "learn": 1, "just": 1, "via": [1, 4, 5, 6], "internet": 1, "open": 1, "url": [1, 2, 3, 4, 8], "instead": [1, 3], "websit": [1, 4, 6], "respons": 1, "format": [1, 3], "json": [1, 2], "object": [1, 8], "notat": 1, "understood": 1, "mani": [1, 3], "languag": 1, "To": [1, 3, 4], "option": [1, 2, 3, 4], "ha": [1, 2, 3, 4, 6, 8], "browser": [1, 3], "follow": [1, 3, 6, 8], "link": [1, 3, 4, 8], "your": [1, 3], "work": [1, 3], "explor": 1, "http": [1, 3, 4], "nl": [1, 3, 4], "should": [1, 2, 3], "now": [1, 3, 8], "text": 1, "like": [1, 3], "base_url": 1, "clusters_in_countri": 1, "country_id": 1, "configur": [1, 2, 8], "station_id": 1, "year": [1, 2, 8], "month": [1, 2, 8], "dai": [1, 2], "subclusters_in_clust": 1, "cluster_id": 1, "dictionari": [1, 2], "indic": [1, 4, 8], "enclos": 1, "bracket": 1, "kei": 1, "valu": [1, 8], "each": [1, 2, 4, 6], "tell": 1, "u": [1, 6], "want": [1, 3], "append": 1, "base": [1, 4], "result": [1, 2, 4], "With": 1, "name": [1, 2, 4, 8], "amsterdam": [1, 4], "0": [1, 3, 4], "utrecht": [1, 4], "1000": 1, "karlsruh": 1, "70000": 1, "one": [1, 4], "wai": [1, 3, 6], "network": [1, 2, 4], "retriev": [1, 2, 8], "gener": [1, 2, 8], "webpag": [1, 7], "drop": 1, "down": 1, "menu": 1, "select": [1, 3], "onc": 1, "have": [1, 2, 4, 6], "chosen": [1, 6], "click": [1, 3, 4], "info": [1, 2], "button": [1, 3], "make": [1, 3, 6], "either": [1, 2, 6, 8], "page": [1, 3, 4, 5, 8], "jsfiddl": 1, "creat": [1, 2, 8], "own": 1, "html": [1, 8], "file": [1, 3], "head": 1, "script": 1, "src": [1, 4], "com": 1, "1": [1, 3], "11": [1, 3], "min": 1, "j": 1, "function": 1, "getjson": 1, "var": 1, "id": 1, "attr": 1, "station_list": 1, "attach": 1, "get_stat": 1, "find": [1, 2], "val": 1, "displai": [1, 5], "nice": 1, "station_info": 1, "stringifi": 1, "undefin": 1, "4": [1, 4, 6], "bodi": 1, "style": 1, "font": 1, "famili": 1, "san": 1, "serif": 1, "h2": 1, "p": 1, "choos": [1, 3, 4], "input": 1, "type": [1, 2, 8], "submit": [1, 3, 5], "pre": 1, "sever": [1, 3, 4], "standard": 1, "librari": [1, 3, 4], "popular": 1, "plot": [1, 8], "matplotlib": 1, "pylab": 1, "start": [1, 3, 4, 8], "import": [1, 3, 6], "Then": [1, 3, 4], "defin": [1, 3], "perpar": 1, "two": [1, 2], "empti": 1, "place": [1, 3, 4], "while": 1, "over": 1, "between": [1, 3, 4, 6, 8], "datum": 1, "end_datum": 1, "read": [1, 3], "correspond": 1, "final": [1, 4], "made": [1, 6], "set": [1, 2], "against": 1, "copi": 1, "past": 1, "without": [1, 2, 3], "line": 1, "urllib": [1, 3], "request": [1, 2, 3, 8], "urlopen": [1, 3], "datetim": [1, 3], "timedelta": 1, "501": [1, 3], "10": 1, "2011": 1, "2": [1, 3, 6], "d": [1, 3], "step": 1, "framework": [1, 3], "includ": [1, 2, 3], "modul": [1, 3, 5], "document": 1, "more": [1, 4, 6], "doc": 1, "country_numb": 2, "none": [2, 8], "list": [2, 3, 8], "onli": [2, 4], "specif": [2, 3, 4, 8], "By": 2, "here": [2, 4], "mean": 2, "main": [2, 4], "paramet": [2, 8], "identifi": 2, "return": [2, 8], "match": [2, 8], "given": [2, 4, 8], "station_numb": [2, 8], "entir": 2, "latest": 2, "sent": [2, 6], "otherwis": [2, 8], "befor": [2, 6], "daq": 2, "ext_timestamp": 2, "trace": 2, "extend": 2, "timestamp": [2, 3], "nanosecond": [2, 3], "sinc": 2, "unix": 2, "epoch": 2, "raw": [2, 4], "present": 2, "subtract": 2, "baselin": 2, "four": 2, "non": 2, "test": 2, "check": [2, 3, 8], "presenc": 2, "cosmic": 2, "rai": 2, "shower": [2, 8], "stationn": 2, "singl": [2, 8], "weather": [2, 3, 8], "within": 2, "time": [2, 3, 4, 8], "been": [2, 3], "oper": [2, 4], "desir": 2, "boolean": [2, 8], "true": 2, "fals": [2, 3], "httprespons": 2, "statu": [2, 5], "hour": [2, 3], "its": [2, 4], "period": 2, "integ": 2, "total": 2, "ever": 2, "record": [2, 8], "valid": [2, 8], "most": [2, 8], "importantli": 2, "locat": [2, 4, 6, 8], "gp": [2, 4, 6, 8], "rel": [2, 6], "individu": 2, "scintil": [2, 6], "subcluster_numb": 2, "belong": [2, 8], "consist": 2, "cluster_numb": 2, "outsid": 2, "project": 2, "rang": 2, "404": 2, "Not": 2, "found": [2, 4], "user": 2, "api": [3, 4, 5, 6], "sapphir": [3, 4, 6], "There": 3, "tutori": [3, 5], "jsparc": 3, "web": 3, "when": [3, 4, 6], "look": [3, 5, 8], "kaj": 3, "munk": 3, "colleg": 3, "summari": [3, 7], "right": 3, "taken": 3, "On": [3, 4], "end": [3, 8], "also": [3, 4], "howev": [3, 6], "gather": 3, "checkbox": 3, "firefox": 3, "alwai": 3, "window": [3, 4], "box": 3, "pc": 3, "csv": 3, "excel": 3, "recogn": 3, "tab": 3, "delimit": 3, "column": 3, "ad": 3, "esd": 3, "old": 3, "exampl": [3, 4, 5, 6], "202": 3, "juli": 3, "2013": 3, "first": [3, 4, 5, 6], "load": 3, "numpi": 3, "packag": 3, "urlencod": 3, "stringio": 3, "genfromtxt": 3, "queri": 3, "replac": 3, "g": [3, 4], "3": [3, 6], "pass": 3, "argument": [3, 8], "becaus": 3, "post": 3, "str": 3, "7": 3, "12": 3, "full_url": 3, "store": [3, 4], "variabl": 3, "convert": 3, "arrai": 3, "datetime64": 3, "s8": 3, "uint32": 3, "pulseheight": 3, "4int16": 3, "integr": 3, "4int32": 3, "n1": 3, "float32": 3, "n2": 3, "n3": 3, "n4": 3, "t1": 3, "t2": 3, "t3": 3, "t4": 3, "t_trigger": 3, "zenith": 3, "int16": 3, "azimuth": 3, "t": [3, 4], "dtype": 3, "print": 3, "00": 3, "02": 3, "1372762802l": 3, "466307811l": 3, "78": 3, "798": 3, "535": 3, "10882": 3, "14720000326633453": 3, "854599952697754": 3, "345": 3, "5": 3, "999": 3, "equip": 4, "antenn": [4, 6], "synchron": 4, "determin": [4, 6], "exact": [4, 6], "our": [4, 5], "leafet": 4, "carto": 4, "tile": 4, "openstreetmap": 4, "abl": 4, "visual": 4, "detector": [4, 6], "marker": 4, "popup": 4, "color": 4, "current": [4, 8], "green": 4, "properli": 4, "yellow": 4, "respond": 4, "server": 4, "problem": 4, "red": 4, "complet": 4, "unrespons": 4, "offlin": 4, "grai": 4, "longer": 4, "activ": 4, "provid": [4, 7, 8], "multipl": 4, "moreov": [4, 6], "organ": 4, "bristol": 4, "scienc": 4, "park": 4, "accomplish": 4, "ifram": 4, "those": 4, "anoth": 4, "netherland": 4, "20park": 4, "scroll": 4, "framebord": 4, "width": 4, "600": 4, "height": [4, 6], "300": 4, "region": 4, "explain": [4, 6], "extra": [4, 8], "zoom": 4, "fit": 4, "But": 4, "focu": 4, "level": 4, "close": 4, "note": 4, "ensched": 4, "unit": [4, 6], "20kingdom": 4, "And": 4, "specifi": 4, "zaanstad": 4, "simpli": 4, "8005": 4, "8103": 4, "through": [5, 6], "everyon": 5, "administr": 5, "done": 5, "download": 5, "form": [5, 6], "python": 5, "javascript": 5, "map": [5, 8], "embed": 5, "layout": 5, "compass": 5, "coordin": 5, "index": 5, "search": 5, "often": 6, "center": 6, "orient": 6, "same": 6, "distanc": 6, "mai": [6, 8], "differ": 6, "reconstruct": 6, "section": 6, "commun": 6, "system": 6, "describ": 6, "illustr": 6, "figur": 6, "r": 6, "meter": 6, "next": 6, "alpha": 6, "angl": 6, "\u03b1": 6, "clock": 6, "wise": 6, "turn": 6, "north": 6, "seen": 6, "degre": 6, "A": 6, "z": 6, "signific": 6, "altitud": 6, "antenna": 6, "rotat": 6, "beta": 6, "\u03b2": 6, "long": 6, "side": 6, "dutch": 6, "school": 6, "assign": 6, "sheet": 6, "infopakket": 6, "walk": 6, "student": 6, "process": 6, "de": 6, "stationsplattegrond": 6, "verif": 6, "mail": 6, "submitt": 6, "review": 6, "thei": 6, "These": 6, "analys": 6, "schemat": 6, "draw": 6, "latestnetworksummaryredirectview": [7, 8], "get_redirect_url": [7, 8], "latestsummaryredirectview": [7, 8], "networksummarydetailview": [7, 8], "get_context_data": [7, 8], "get_object": [7, 8], "get_queryset": [7, 8], "http_method_nam": [7, 8], "nav_calendar": [7, 8], "nav_month": [7, 8], "nav_year": [7, 8], "template_nam": [7, 8], "summarydetailview": [7, 8], "create_plot_object": [7, 8], "get_config_sourc": [7, 8], "get_dataset_sourc": [7, 8], "get_detector_timing_offset": [7, 8], "get_detector_timing_offsets_sourc": [7, 8], "get_eventtime_histogram_sourc": [7, 8], "get_eventtime_sourc": [7, 8], "get_focu": [7, 8], "get_gpsloc": [7, 8], "get_histogram_sourc": [7, 8], "get_specific_config_sourc": [7, 8], "get_specific_dataset_sourc": [7, 8], "get_specific_histogram_sourc": [7, 8], "get_specific_network_histogram_sourc": [7, 8], "get_station_layout_sourc": [7, 8], "get_station_timing_offset": [7, 8], "get_station_timing_offsets_sourc": [7, 8], "help": [7, 8], "none_to_nan": [7, 8], "plot_config": [7, 8], "plot_dataset": [7, 8], "plot_histogram": [7, 8], "plot_timing_offset": [7, 8], "station_config": [7, 8], "station_has_config": [7, 8], "station_has_data": [7, 8], "station_latest": [7, 8], "station_statu": [7, 8], "stations_by_countri": [7, 8], "stations_by_nam": [7, 8], "stations_by_numb": [7, 8], "stations_by_statu": [7, 8], "stations_on_map": [7, 8], "kwarg": 8, "recent": 8, "coincid": 8, "constructor": 8, "call": 8, "urlconf": 8, "keyword": 8, "arg": 8, "redirect": 8, "pattern": 8, "particular": 8, "insert": 8, "context": 8, "dict": 8, "queryset": 8, "default": 8, "implement": 8, "overridden": 8, "calendar": 8, "previou": 8, "status_displai": 8, "network_coincid": 8, "station_data": 8, "x_valu": 8, "y_seri": 8, "x_label": 8, "y_label": 8, "support": 8, "voltag": 8, "trigger": 8, "histori": 8, "dataset": 8, "tupl": 8, "x": 8, "y": 8, "pair": 8, "eventtim": 8, "histogram": 8, "networkhistogram": 8, "dailyhistogram": 8, "bin": 8, "ref_station_numb": 8, "offset": 8, "error": 8, "static": 8, "2002": 8, "daili": 8, "order": 8, "2004": 8}, "objects": {"publicdb": [[0, 0, 0, "-", "api"], [7, 0, 0, "-", "status_display"]], "publicdb.api": [[2, 0, 0, "-", "views"]], "publicdb.api.views": [[2, 1, 1, "", "clusters"], [2, 1, 1, "", "config"], [2, 1, 1, "", "countries"], [2, 1, 1, "", "get_cluster_dict"], [2, 1, 1, "", "get_country_dict"], [2, 1, 1, "", "get_event_traces"], [2, 1, 1, "", "get_station_dict"], [2, 1, 1, "", "get_subcluster_dict"], [2, 1, 1, "", "has_data"], [2, 1, 1, "", "json_dict"], [2, 1, 1, "", "man"], [2, 1, 1, "", "network_status"], [2, 1, 1, "", "num_events"], [2, 1, 1, "", "station"], [2, 1, 1, "", "stations"], [2, 1, 1, "", "stations_with_data"], [2, 1, 1, "", "subclusters"], [2, 1, 1, "", "validate_date"]], "publicdb.status_display": [[8, 0, 0, "-", "views"]], "publicdb.status_display.views": [[8, 2, 1, "", "LatestNetworkSummaryRedirectView"], [8, 2, 1, "", "LatestSummaryRedirectView"], [8, 2, 1, "", "NetworkSummaryDetailView"], [8, 2, 1, "", "SummaryDetailView"], [8, 1, 1, "", "create_plot_object"], [8, 1, 1, "", "get_config_source"], [8, 1, 1, "", "get_dataset_source"], [8, 1, 1, "", "get_detector_timing_offsets"], [8, 1, 1, "", "get_detector_timing_offsets_source"], [8, 1, 1, "", "get_eventtime_histogram_sources"], [8, 1, 1, "", "get_eventtime_source"], [8, 1, 1, "", "get_focus"], [8, 1, 1, "", "get_gpslocations"], [8, 1, 1, "", "get_histogram_source"], [8, 1, 1, "", "get_specific_config_source"], [8, 1, 1, "", "get_specific_dataset_source"], [8, 1, 1, "", "get_specific_histogram_source"], [8, 1, 1, "", "get_specific_network_histogram_source"], [8, 1, 1, "", "get_station_layout_source"], [8, 1, 1, "", "get_station_timing_offsets"], [8, 1, 1, "", "get_station_timing_offsets_source"], [8, 1, 1, "", "help"], [8, 1, 1, "", "none_to_nan"], [8, 1, 1, "", "plot_config"], [8, 1, 1, "", "plot_dataset"], [8, 1, 1, "", "plot_histogram"], [8, 1, 1, "", "plot_timing_offsets"], [8, 1, 1, "", "station_config"], [8, 1, 1, "", "station_has_config"], [8, 1, 1, "", "station_has_data"], [8, 1, 1, "", "station_latest"], [8, 1, 1, "", "station_status"], [8, 1, 1, "", "stations"], [8, 1, 1, "", "stations_by_country"], [8, 1, 1, "", "stations_by_name"], [8, 1, 1, "", "stations_by_number"], [8, 1, 1, "", "stations_by_status"], [8, 1, 1, "", "stations_on_map"], [8, 1, 1, "", "stations_with_data"]], "publicdb.status_display.views.LatestNetworkSummaryRedirectView": [[8, 3, 1, "", "get_redirect_url"]], "publicdb.status_display.views.LatestSummaryRedirectView": [[8, 3, 1, "", "get_redirect_url"]], "publicdb.status_display.views.NetworkSummaryDetailView": [[8, 3, 1, "", "get_context_data"], [8, 3, 1, "", "get_object"], [8, 3, 1, "", "get_queryset"], [8, 4, 1, "", "http_method_names"], [8, 3, 1, "", "nav_calendar"], [8, 3, 1, "", "nav_months"], [8, 3, 1, "", "nav_years"], [8, 4, 1, "", "template_name"]], "publicdb.status_display.views.SummaryDetailView": [[8, 3, 1, "", "get_context_data"], [8, 3, 1, "", "get_object"], [8, 3, 1, "", "get_queryset"], [8, 4, 1, "", "http_method_names"], [8, 3, 1, "", "nav_calendar"], [8, 3, 1, "", "nav_months"], [8, 3, 1, "", "nav_years"], [8, 4, 1, "", "template_name"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"api": [0, 1, 2], "refer": [0, 2, 7, 8], "tutori": 1, "first": 1, "look": 1, "cluster": 1, "list": 1, "javascript": 1, "exampl": 1, "python": [1, 3], "sapphir": 1, "view": [2, 8], "data": [3, 6], "access": [3, 6], "download": 3, "form": 3, "via": 3, "hisparc": [4, 6], "map": 4, "station": [4, 6], "info": 4, "statu": [4, 7, 8], "embed": 4, "syntax": 4, "public": 5, "databas": 5, "document": 5, "indic": 5, "tabl": 5, "layout": 6, "compass": 6, "coordin": 6, "submit": 6, "measur": 6, "displai": [7, 8]}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"API Reference": [[0, "module-publicdb.api"]], "API Tutorial": [[1, "api-tutorial"]], "First look": [[1, "first-look"]], "Cluster list": [[1, "cluster-list"]], "Javascript example": [[1, "javascript-example"]], "Python example": [[1, "python-example"]], "SAPPHiRE": [[1, "sapphire"]], "API Views Reference": [[2, "module-publicdb.api.views"]], "Data access": [[3, "data-access"]], "Download form": [[3, "download-form"]], "Downloading via Python": [[3, "downloading-via-python"]], "HiSPARC maps": [[4, "hisparc-maps"]], "Map": [[4, "map"]], "Station info": [[4, "station-info"]], "Status": [[4, "status"]], "Embedding": [[4, "embedding"]], "Syntax": [[4, "syntax"]], "Public Database documentation!": [[5, "public-database-documentation"]], "Indices and tables": [[5, "indices-and-tables"]], "HiSPARC station layout": [[6, "hisparc-station-layout"]], "Compass coordinates": [[6, "compass-coordinates"]], "Submitting the measurements": [[6, "submitting-the-measurements"]], "Accessing the data": [[6, "accessing-the-data"]], "Status Display Reference": [[7, "module-publicdb.status_display"]], "Status Display Views Reference": [[8, "module-publicdb.status_display.views"]]}, "indexentries": {"module": [[0, "module-publicdb.api"], [2, "module-publicdb.api.views"], [7, "module-publicdb.status_display"], [8, "module-publicdb.status_display.views"]], "publicdb.api": [[0, "module-publicdb.api"]], "clusters() (in module publicdb.api.views)": [[2, "publicdb.api.views.clusters"]], "config() (in module publicdb.api.views)": [[2, "publicdb.api.views.config"]], "countries() (in module publicdb.api.views)": [[2, "publicdb.api.views.countries"]], "get_cluster_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_cluster_dict"]], "get_country_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_country_dict"]], "get_event_traces() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_event_traces"]], "get_station_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_station_dict"]], "get_subcluster_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_subcluster_dict"]], "has_data() (in module publicdb.api.views)": [[2, "publicdb.api.views.has_data"]], "json_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.json_dict"]], "man() (in module publicdb.api.views)": [[2, "publicdb.api.views.man"]], "network_status() (in module publicdb.api.views)": [[2, "publicdb.api.views.network_status"]], "num_events() (in module publicdb.api.views)": [[2, "publicdb.api.views.num_events"]], "publicdb.api.views": [[2, "module-publicdb.api.views"]], "station() (in module publicdb.api.views)": [[2, "publicdb.api.views.station"]], "stations() (in module publicdb.api.views)": [[2, "publicdb.api.views.stations"]], "stations_with_data() (in module publicdb.api.views)": [[2, "publicdb.api.views.stations_with_data"]], "subclusters() (in module publicdb.api.views)": [[2, "publicdb.api.views.subclusters"]], "validate_date() (in module publicdb.api.views)": [[2, "publicdb.api.views.validate_date"]], "publicdb.status_display": [[7, "module-publicdb.status_display"]], "latestnetworksummaryredirectview (class in publicdb.status_display.views)": [[8, "publicdb.status_display.views.LatestNetworkSummaryRedirectView"]], "latestsummaryredirectview (class in publicdb.status_display.views)": [[8, "publicdb.status_display.views.LatestSummaryRedirectView"]], "networksummarydetailview (class in publicdb.status_display.views)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView"]], "summarydetailview (class in publicdb.status_display.views)": [[8, "publicdb.status_display.views.SummaryDetailView"]], "create_plot_object() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.create_plot_object"]], "get_config_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_config_source"]], "get_context_data() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.get_context_data"]], "get_context_data() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.get_context_data"]], "get_dataset_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_dataset_source"]], "get_detector_timing_offsets() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_detector_timing_offsets"]], "get_detector_timing_offsets_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_detector_timing_offsets_source"]], "get_eventtime_histogram_sources() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_eventtime_histogram_sources"]], "get_eventtime_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_eventtime_source"]], "get_focus() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_focus"]], "get_gpslocations() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_gpslocations"]], "get_histogram_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_histogram_source"]], "get_object() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.get_object"]], "get_object() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.get_object"]], "get_queryset() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.get_queryset"]], "get_queryset() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.get_queryset"]], "get_redirect_url() (latestnetworksummaryredirectview method)": [[8, "publicdb.status_display.views.LatestNetworkSummaryRedirectView.get_redirect_url"]], "get_redirect_url() (latestsummaryredirectview method)": [[8, "publicdb.status_display.views.LatestSummaryRedirectView.get_redirect_url"]], "get_specific_config_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_specific_config_source"]], "get_specific_dataset_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_specific_dataset_source"]], "get_specific_histogram_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_specific_histogram_source"]], "get_specific_network_histogram_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_specific_network_histogram_source"]], "get_station_layout_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_station_layout_source"]], "get_station_timing_offsets() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_station_timing_offsets"]], "get_station_timing_offsets_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_station_timing_offsets_source"]], "help() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.help"]], "http_method_names (networksummarydetailview attribute)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.http_method_names"]], "http_method_names (summarydetailview attribute)": [[8, "publicdb.status_display.views.SummaryDetailView.http_method_names"]], "nav_calendar() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.nav_calendar"]], "nav_calendar() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.nav_calendar"]], "nav_months() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.nav_months"]], "nav_months() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.nav_months"]], "nav_years() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.nav_years"]], "nav_years() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.nav_years"]], "none_to_nan() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.none_to_nan"]], "plot_config() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.plot_config"]], "plot_dataset() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.plot_dataset"]], "plot_histogram() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.plot_histogram"]], "plot_timing_offsets() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.plot_timing_offsets"]], "publicdb.status_display.views": [[8, "module-publicdb.status_display.views"]], "station_config() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_config"]], "station_has_config() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_has_config"]], "station_has_data() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_has_data"]], "station_latest() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_latest"]], "station_status() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_status"]], "stations() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations"]], "stations_by_country() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_by_country"]], "stations_by_name() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_by_name"]], "stations_by_number() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_by_number"]], "stations_by_status() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_by_status"]], "stations_on_map() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_on_map"]], "stations_with_data() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_with_data"]], "template_name (networksummarydetailview attribute)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.template_name"]], "template_name (summarydetailview attribute)": [[8, "publicdb.status_display.views.SummaryDetailView.template_name"]]}}) \ No newline at end of file diff --git a/station_layout.html b/station_layout.html new file mode 100644 index 000000000..48b295c7f --- /dev/null +++ b/station_layout.html @@ -0,0 +1,172 @@ + + + + + + + + HiSPARC station layout — Public Database 0.4 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

HiSPARC station layout

+

Each HiSPARC station has a GPS antenne and either 2 or 4 scintillator +detectors. This GPS is used to determine the exact location of the +station. However, the GPS is often not at the center of the station, +moreover, not all stations are oriented the same way, and the distances +between detector may differ. For reconstruction of the measured data it +is important to know the location of each detector, this section +explains how the location of the detectors can be measured and +communicated to us.

+
+

Compass coordinates

+

The coordinate system we have chosen for describing the position of +detectors is illustrated in the following figure.

+_images/coordinate_system.png +

For each detector 3 (or 4) coordinates need to be determined:

+
    +
  • First the distance (r) from the GPS to the center of the +scintillator (in meters).

  • +
  • Next the alpha angle (α) which is the clock-wise turning angle +between North and the detector as seen from the GPS (in degrees).

  • +
  • A height (z) coordinate can be measured if there is a +significant altitude difference between the GPS antenna and the +detectors, or if the detectors are not at the same height. Up is +positive (in meters).

  • +
  • The rotation of the detector is described by the beta angle +(β), which is the clock-wise turning rotation of the long side +of the detector relative to North (in degrees).

  • +
+

For more information about the coordinate systems used in HiSPARC see: +Coordinate systems and units in HiSPARC.

+

For Dutch schools we have an assignment sheet in the infopakket which +walks students through the process of measuring the station layout: +De stationsplattegrond.

+
+
+

Submitting the measurements

+

New layouts can be submitted via the layout submit form. A verification e-mail will be sent +to the submitter. The submitted measurements will be reviewed before they are +made available on the website and via the API.

+
+
+

Accessing the data

+

The detector coordinates can be accessed via the API. +These can, for example, be used when analysing data or when making a schematic +drawing of the station layout.

+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/status_display.html b/status_display.html new file mode 100644 index 000000000..c6cd32e0d --- /dev/null +++ b/status_display.html @@ -0,0 +1,191 @@ + + + + + + + + Status Display Reference — Public Database 0.4 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Status Display Reference

+

Station Status Display

+

The Status Display provides webpages that display summaries of data measured +by stations.

+

Contents:

+
+ +
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/status_display_views.html b/status_display_views.html new file mode 100644 index 000000000..cebfd2b83 --- /dev/null +++ b/status_display_views.html @@ -0,0 +1,591 @@ + + + + + + + + Status Display Views Reference — Public Database 0.4 documentation + + + + + + + + + + + + + +
+
+
+
+ +
+

Status Display Views Reference

+
+
+class LatestNetworkSummaryRedirectView(**kwargs)
+

Show most recent coincidence data page

+

Constructor. Called in the URLconf; can contain helpful extra +keyword arguments, and other things.

+
+
+get_redirect_url(*args, **kwargs)
+

Return the URL redirect to. Keyword arguments from the URL pattern +match generating the redirect request are provided as kwargs to this +method.

+
+ +
+ +
+
+class LatestSummaryRedirectView(**kwargs)
+

Show most recent data for a particular station

+

Constructor. Called in the URLconf; can contain helpful extra +keyword arguments, and other things.

+
+
+get_redirect_url(*args, **kwargs)
+

Return the URL redirect to. Keyword arguments from the URL pattern +match generating the redirect request are provided as kwargs to this +method.

+
+ +
+ +
+
+class NetworkSummaryDetailView(**kwargs)
+

Constructor. Called in the URLconf; can contain helpful extra +keyword arguments, and other things.

+
+
+get_context_data(**kwargs)
+

Insert the single object into the context dict.

+
+ +
+
+get_object(queryset=None)
+

Get the object this request displays.

+
+ +
+
+get_queryset()
+

Return the QuerySet that will be used to look up the object.

+

This method is called by the default implementation of get_object() and +may not be called if get_object() is overridden.

+
+ +
+
+http_method_names = ['get']
+
+ +
+
+nav_calendar()
+

Create a month calendar with links

+
+ +
+
+nav_months()
+

Create list of months with links

+
+ +
+
+nav_years()
+

Create list of previous years

+
+ +
+
+template_name = 'status_display/network_coincidences.html'
+
+ +
+ +
+
+class SummaryDetailView(**kwargs)
+

Constructor. Called in the URLconf; can contain helpful extra +keyword arguments, and other things.

+
+
+get_context_data(**kwargs)
+

Insert the single object into the context dict.

+
+ +
+
+get_object(queryset=None)
+

Get the object this request displays.

+
+ +
+
+get_queryset()
+

Return the QuerySet that will be used to look up the object.

+

This method is called by the default implementation of get_object() and +may not be called if get_object() is overridden.

+
+ +
+
+http_method_names = ['get']
+
+ +
+
+nav_calendar()
+

Create a month calendar with links

+
+ +
+
+nav_months()
+

Create list of months with links

+
+ +
+
+nav_years()
+

Create list of previous years

+
+ +
+
+template_name = 'status_display/station_data.html'
+
+ +
+ +
+
+create_plot_object(x_values, y_series, x_label, y_label)
+
+ +
+
+get_config_source(station_number, type)
+

Get configuration data for a specific station

+
+
Parameters:
+
    +
  • station_number – station for which to get the configuration data.

  • +
  • type – the type of configuration data to get. The following +are supported: voltage, current, gps, trigger.

  • +
+
+
Returns:
+

list of lists containing the configuration history.

+
+
+
+ +
+
+get_dataset_source(date, type, station_number)
+

Get a dataset for a specific date and station

+
+
Parameters:
+
    +
  • date – the date for which to get the dataset.

  • +
  • type – the type of dataset to retrieve.

  • +
  • station_number – the station to which the data belongs.

  • +
+
+
Returns:
+

list of tuples containing (x, y) pairs.

+
+
+
+ +
+
+get_detector_timing_offsets(station_number)
+
+ +
+
+get_detector_timing_offsets_source(request, station_number)
+
+ +
+
+get_eventtime_histogram_sources(station_number, start, end)
+
+ +
+
+get_eventtime_source(request, station_number, start=None, end=None)
+

Get all eventtime data from start to end

+
+ +
+
+get_focus(country=None, cluster=None, subcluster=None)
+
+ +
+
+get_gpslocations(configs)
+

Get all valid GPS locations from the configs

+
+ +
+
+get_histogram_source(date, type, station_number=None)
+

Get histogram data for a specific date

+
+
Parameters:
+
    +
  • date – the date for which to get the histogram data.

  • +
  • type – the type of histogram to retrieve.

  • +
  • station_number – if None a NetworkHistogram is looked for, otherwise +a DailyHistogram for a specific station is looked for.

  • +
+
+
Returns:
+

list of tuples containing (bin, value) pairs.

+
+
+
+ +
+
+get_specific_config_source(request, station_number, type)
+
+ +
+
+get_specific_dataset_source(request, station_number, date, type)
+
+ +
+
+get_specific_histogram_source(request, station_number, date, type)
+

Get a station histogram for a specific date

+
+ +
+
+get_specific_network_histogram_source(request, date, type)
+
+ +
+
+get_station_layout_source(request, station_number)
+
+ +
+
+get_station_timing_offsets(ref_station_number, station_number)
+

Get all station timing offsets for a station pair

+
+
Parameters:
+

ref_station_number,station_number – station numbers.

+
+
Returns:
+

list of tuples with date, offset, and error.

+
+
+
+ +
+
+get_station_timing_offsets_source(request, ref_station_number, station_number)
+
+ +
+
+help(request)
+

Show the static help page

+
+ +
+
+none_to_nan(x)
+
+ +
+
+plot_config(type, configs)
+

Create a plot object from station configs

+
+ +
+
+plot_dataset(dataset)
+

Create a dataset plot object

+
+ +
+
+plot_histogram(histogram)
+

Create a histogram object

+
+ +
+
+plot_timing_offsets(station_number)
+

Create a plot object from station configs

+
+ +
+
+station_config(request, station_number)
+

Show configuration history for a particular station

+
+ +
+
+station_has_config(station)
+

Check if there is a valid configuration for the given station

+
+
Parameters:
+

station – Station object for which to check.

+
+
Returns:
+

boolean indicating if the station has a configuration available.

+
+
+
+ +
+
+station_has_data(station)
+

Check if there is valid event or weather data for the given station

+
+
Parameters:
+

station – Station object for which to check.

+
+
Returns:
+

boolean indicating if the station has recorded data, either +weather or shower, between 2002 and now.

+
+
+
+ +
+
+station_latest(request, station_number)
+

Show daily histograms for a particular station

+
+ +
+
+station_status(request, station_number)
+

Show data status for a particular station

+
+ +
+
+stations(request)
+

Show the default station list

+
+ +
+
+stations_by_country(request)
+

Show a list of stations, ordered by country, cluster and subcluster

+
+ +
+
+stations_by_name(request)
+

Show a list of stations, ordered by station name

+
+ +
+
+stations_by_number(request)
+

Show a list of stations, ordered by number

+
+ +
+
+stations_by_status(request)
+

Show a list of stations, ordered by status

+
+ +
+
+stations_on_map(request, country=None, cluster=None, subcluster=None)
+

Show all stations from a subcluster on a map

+
+ +
+
+stations_with_data()
+

Get list of station numbers with valid event or weather data

+
+
Returns:
+

list with station numbers for stations that recorded data, either +weather or shower, between 2004 and now.

+
+
+
+ +

Contents:

+
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file