From ca3b137a80f17caaf880468b5fdd5c55fef01af2 Mon Sep 17 00:00:00 2001 From: 153957 <153957@users.noreply.github.com> Date: Tue, 20 Feb 2024 10:28:34 +0000 Subject: [PATCH] deploy: 616debb92bcb74897b9c231725b67a7139ce392c --- .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 zcmeHPO^h7JbtbvoC3pBEE%h(!r?e8av(fGhDM+xgB3EIkA4-%+N@66&G(FohU9;V@ zGu@;9;c`LIaSjf+cKf8U;Uq{57zmP+2YR#|w`&K|8(hM}gVaBAyJ0OI;GQsUhLIbg z(f1m*Y`dOIU$gO?@#LXeO}y*4Vc!Z`?}|Y7yH-msEQnL?o99lvadP17xioMllila# z6@nw#qaS>EKp-U(c#%MK_J>U?saR1IxXm~M`~>fqYlna>+0*J;VTeY2ANQ=D`nD&X zcVGe6xSzG}ZCb6BK(?uSoa~9LWqLGlD#?UK{s3^TGkP`GYYmd!UDuO?(>tBJov~!H zkx|YWi<{0qMLl49H(_h_T@%w2=U!G=P9cbR1{{;go=~<*i|$O&s#dYA z70d2rSqXuokXI}WD?{P8h2yWP?mTwO@bxGyU`-rzqNu-6udlAI);jM{Q?2Fq>WfQ_S$=!z+*;)LUd8O!=cbw;ETdaZyv^W+ z1j(8oD~Nny`+|Y>q!kf_-f~#0oI)Rhk@_vmNLZrlh7sXm0mEEmgb|Z96s{+pmtM~b zR-O}YI~a)wp0vU^0MX=S2%%849Lrml!j1!4T}!m(Dwag9gwKidSg49#C=fYa zCdLnF`j=&J*+qAPl2#7?1M<*qx?O;enR#6Zp&WPSu9|q!4}=Y#f#?+gp6G++bGufv zD@7{#c!j`Nj&Fx^6|jUAN)bxQ2rYow7nZ>7OEundRc8tk7nr7!fc9F$+-rDV62zNz z**WZeL)LBf?hnK#xoQ64OTWGC+h$AJL3%*BNT@BSQLS2`9Hwu)(X>FEP+QWNV$EEh zjcP-S!elqAvP2J%OaK&c>ma#%^WDuFW|h{T<=#YO1=x)y*!OKI7!Uu4fKnZ|wOhEge`sS;ntnBTfdnx+Fd z>&aaPF>?`Epkv1*1ZU z!1!C3<)4SaIFSm^sbpu(z_hSw{a{ISeZLPQPLf61rb#RC$%F@E2IFE3vW3WuBXcf-A!%g>E6f#Qj5&dE zV8GGzEm>JQiFvJ-Wy@aC>Lhqnv$j0R;)T};I~2g#0%lF%VY-SE#R8)$O{we}=L=fs z-XhiwiA6@>S*tpr zKy4_*ox^y1bMU^t?K{wbwv4Wm+g4B9#75P$*k|l*W0n&`X;N6d)PgMx1e5E2!{jQ- z32k@j70yks2Me}q>9s`#b7sHpqvxquGK{cNbJ-H>ybjb1V@v}vmCTMVyfOv3VcU$R zIqn2|?G;_jtVSOIAi4Oy2M^WMkpJvVcj6Qd0p-OSj6)+T0OLY6kw2?`l|mnt%Puq$p1Kr` z@epfht_dIJ4e6~oKs*zHmN1ft55Ot6pmCarC@AepkqH&5fm(#K683#BghC~6Up>J8 z*#12PCMn2*UgDKE&z=!gim<%N5f*W_*+GmpsUwdYa&pS>Sy1#3A~== zt(kgUXpt7?9{k~v2xM%+FJ%;05w#6AW@nQglduRBaX;=zKhdbFu$Q#|uPscz8_IMX zZ5Kae>IK^^&>cmUd6Tys3{XMQQ|iN!OzfS?3$T#=KnAl5Vu?g@h=?KW zkXjmSuX$aHtJam|-Rdbt3t6C$6>{%Z=ouXM`#0p>O?s>$==X~u%`nJw1-tn1D5xd! z1H;zAfaE(R8Wv5d&6M!)k)f4`cOX%Z*iwg<1`M6+<%e&;9VN|tA0s$VY&M^=*}T`C zC)Y9$HVp?Q%cx`_sLlrj6(IboilS&Ji+&upns)4HTlvwgwsQ5?;V20vB5Jy#Latu7QeJW%Sazt;;-8m`x9`LPEVk~{HNM8@k^)7FM-UrS%{ zy|%j?2b>z9&S~Jkel`8VU0d9%esv9A>q-QH%ox(*i15c zrPp0R>YCEwd;75dki)^(aae9>S~nccq|(VUYJ=pU<1Ra0{EHe0r&FpL`>gYiv@2E2 zXtuc3a=Z5-^kLglCAZj?L<~oTWrXc=s?|b_rRpL&hm0ePPMC|N*Hg#z>Jr6ov|D{` zNgxf;MT!jiz8N6zEu#>sn=(?$DqZC)8R^Ltxu#-2m#uD0!JZeamQz8isHS6Q8+UqX zPR}=;ZIq>1L~4-tfNA2x^59V_8(yvBT@Bsl+jhvZFU{sw!)HGtoeYKe-?Sn|in-|O zPi7R=vUulJIUgFs&2BfsyXK7iW@kib^WBg`o3$Cx9@}nc@7i?t88Z$?;Epo6u}?Jy z`!aghr;P#6ZZ`_M<|@YU!{Pm94ezF!f0zi-SRK7->0VG}jQeOt=Tk+k zG9;|C|D-ZH_{@bSNU<>o=8HpdHQffXCMmRYHG6|YJI4yn?9W(kN3x643^BQ}Z zfwho-D4qk+))PJUB$ORg3r?|+!mDJ@lt)Z@5XWa!)+*CZx)a!$-X%pzW-G;g<|v*M zcOz1b@Nf&h@j_*&YnF{V+>gn+72I9tVa`sr<_3^|IFw%I4$|j0Mw|j3_=r7eYmzITl00|CtD~~8 z!aj?ZE01q8pL|}Ez;Mn-gmM!v{ZEKT3@<(788h3;Xqm>?XaaN5kW~d4HTAZOLvj%X zd6kUF-0@AGcI1bZ-xzkl)K)oD7>LoVZq9y!pq)g%8@Osi9B zcyQzze&^kOEkeH3iAtT09y!AO*e}gHpSBSH4q``^x_=hkk6c6EosQ>DCBJAeGMDYg zpztu4t@H1oUgxLu@gMkD@B9p(1?Q~uUufCjkiAe?gFF$D{3i=*4(Wp#QsuOz^L3G( zFRgqo8O~QFbG|6akU4UQJ^0UjC@Mg@DN2D$|l54ZKS^c$WU5CFi(eq4LzdUmEoGH3lgUmd>39RTlHE3#s&3n4;QW-9ee@rV>B zyaNQ*Sn2CoB+LMu1P4V_$~HZ2FNkEwe|5qaUE9VX>|QB-EdOE1o3UK^gRyf&4G&yztwO2*k#oOu0Z|E0VDrIU=UhKu~Sw};9{c6TJTV;SZ z>G5qM<)@nmhM-tfKDU>-MeotQntzO;-Y8M)qpBjJDXXH+C&!xx8XJ~0PeA_C=q#KO zN;ADNgB(gIQ-o>%W^Xo%P9ko#d$PklDHU_iB~2o3^7 z7qn%NNZ3R#q?h=#pbfLP9;-o+kTqS+nrN_@VIH-%QR_40_vC*vuqfJRf~LCw#FH#^ zS?CwFQDG!{;j$Irj0I^SaU3|$98*6QXJ((>w66 zq7E0`OEqQ5Zyb&~vbk?`-E>~+sDQ4iI9Qd?P{A>vQKP$))frC9%pj*^&(c5Bq6fTslmZhH%1mh@tupMuC5oflhGbtUU@h*NNJS^ku%L!PK7&=V45wx|+xn zGQgHsm-bpMgj44&yY00q4K&AR%|IG5x1Pdk7tqji3qcE-|0@2bXNJ6}r?RK%+iRfQ zT2~&QZo^-lZ(BXLyS5-g%M0g`K6TsAPAjo;%z1M0O=Ui^9d@ja2A=O&AA~usqw~yd z(~Bn^AC@4vDP5NZajf1?`@3F0hGB=J{CF#F_S|TiM=+RaTBRe8PiyAWP#~*Yn2l&h zq7dzngLOiP{$~-Js=!-97vTivq+3Fl_s1=v%ja;kUbrQ6ZwXy>Fl$?cZWjCf8tn0# zkNxf@(LLBa>bq31taEETIh3E~nNNLw!)q{}>bMG?rv5`3iYkPTC_*zNbaXJi&7@~a zgYM<#+>iJpP{Pc16dhC3-_jwYKgizTkkMBPA)|*8Dt(y}pol=|2!}pTOu?WK0byL* zA=T^IR$z-1-mZ(FHXWbiNHiiPxQpM9yRdw5L^$HSs_L>PmT*9x8u2>|mgG%o{Qyzz zui;YrY_0M($7ljRsgJq|e!zoK=qA0WgxgJeauq*MLlk7+s6Z2eLx=mb#}o|W!ve`ac>TEvG^XI$|3lHx~jlUpaQOnx*qBV(A_*j5oh`0*W!`iBaN`a)cT&64o z2g=+aMKsR_G=9#EVnh|*&v-TsR^@Sv!z1yN4p{(I&3wl2AC!jQdK2lOg*gtw7Wxu+ zK05Jn7Ox=ivCZ;$#l2f`zJfE$teVppaq4`UT-fA?ng5DrGlCWA>{Azh7xCa*8|%}% zv2v+i=J#A54T}yX&|zA-n^Hab9K0(?s#I39fP;r5suYU$`)l>Sg>*6tLgWQm_@%MY z#l=M&e%wb-%?g_Ct;y{dbW0)XI0j)psM5bEh8NBM`+EgWf*RVs}$C-~niKh5-w z3R`iHqjTa(bW$DoXw~tN!g=+>b{!$FhN`SXzxeNrnn;z~IW8_<(qMu8vY$$2Dp-#p zf0}B+g$hnLutx?;p?6BJDnoS`N2U?);FoH2BS3%WYXSNP6z%M6HjIKz2f8pER>ZQa zMh~KRs5|i3`P&Mxj zeX773nOC%D_eb%HCi+~sYYV^Vn*}*F%yr3Y%B4cTeS@a`>Fga=2kc>>zFT$Zq)^3(Wby7S;lCq&IVvdN`Ms&1=C;Frv3=S!vh$h z7un==?viLz@CF_m1>cfq@DL+SRdGV|9;D_hBSbL*WLd-_cOrg;fHa(l6zI~8$nr9e zX8U{>M9|y1a4g5HHmM7TnQg_mN@nY(H>n^R^7)g4N~~=Xvq_)m_(twR5xzJ&REXCg zJYoz=MTF*cWj}+))Sgwk**GAV>P(?TQOSJ3vNfMo9d$mR+!+PPlyp@*mFxJRKqQws z9gk2xpgTB?(~P>0M9s7vF(I%sIoOKf^Lxmisq(F7aD*yt;nGZJlD(;`kIJu8B*?gu zD@sqID1wK2OA~MLt*`8sXEFh|0C|g#+GK4}W_`w!Sgvyinu}@8i;IFrW zpD0U7cc-kBVrTB2kWULk>sf^f+} zN?rAFEtKm2L?MR!jA}uqmRlMW$!X~Fub44?A*}}sGN9%x;zx}x>?@FOS5k4TZuWCL znUYsrm2-?k-Dx}-w`DV4#&id%1Qa4h$V$TY>!D>5fD zs6GG8eCRF@k_UgjrpJ34`+F#%tZyAi( zb&-7>ymtExM3L+__&y{k#sot}wLbV=-I*RF_i7D>=CGy&7X^^&gXAvi$pBy*H6lb6 zArbfvs_f4nKJpakc`#_VO2bo2KK$c)cx+aSSatc@78w&S_$@$;fJA7uk_B zIK4M{5IosyWZN@CprNk8t|zyLYdD8|rIB56rQ*oG2X@~dqBv{Rcqhib4ne3p__zAm zzzuRMCGCT#q6&Dhd}_ae%1lBk?Hc!St(FQ+bK&4r4y=QF{1#bRxnMX%q5{d@Qa`tc zlX;kogQ2Qy^U44`gMzL$wlEUYp(9b>645){inUf664l_k4HU&jz?2F|Ur(meg2rIh zZd-}9^<+$Xmj|eolk8RE1p61PNOy3tIiiLt4#$i$#Z{w?qS!3Horj(M&eP7U^Stv+ zoE$3jp~D?Y#%BeqorhJOIp=AJZJe{9+Rg*#`Ix3}>;9~_sQ@<0WbdIy^}X8ZK`L}Q z_;9}Ayytw+dB1ZJLBP%h`lun+(RqSC{*r$F1${hDKOd!!A0PkP#@LvWpE zU+0;x^Q`MU<8_{GooBkvv#j$B*JI~Cl+0G>y$tle=DhEGSK;;sA;Y-QIbem`_vsts zMwikQZhuPO7&kget8lwa-xxOvrYYQhNZ%MYGF%w9&Iv~FfVn|<0S=&Opwik{A=N^1 zQ1?@;VYblbRI`vLxu4YKT3iCd`C&p?P1{%-dvN>WN`n mE>nT_J4yJ!b}E+MuAaf4Xz*Jo){b-w6izCe$#IOEwf_O)0d}7N 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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

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

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 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 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 + + + + + + + +