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

n8vc8F=?HY<>y02ZhaV!#n&a!{&Hz+kV%R_JCYC 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 F_CF;1yA=Qc literal 0 HcmV?d00001 diff --git a/.doctrees/hisparc_maps.doctree b/.doctrees/hisparc_maps.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c72864b004c5c01233692abce65c299e62b35bb0 GIT binary patch literal 18803 zcmeHPTZ|mXb)~r6*Kl{K)q}ER(rPb6b7^yDR+8lqYmos-Q6$BOXf9>Rmgr$mPtA1C z_H>W>!QE9P!wTSl3sjH~O+IYL@k2(C0QoTj1W1%1f#JU-Helr8k9;ISe)5q3aS+6T z{gHF4x~jToA2YL}1jWe$9ClY%SKYdG>eRirs`^W#zv*7wBmVe-xZ`@kTG_7GgRsux zE}y7}PTFQc(tWFY?9J{Q-FZG4*{gAwMh@%pJ;>p>o?nkx(7lO=Gn7B^{J5MI@KBuA z;>1gk7zWikYj}Z2m%2Q6lz*gLwqAF=xMN4o>sG`%zU{E3CF_E>eC_o0vt4)mX4jqM z`);r`l7o+{2Vd@zNPG-0l8Ek9T(fz}PLjy0r3vIGc}Ki@4B7a&xF2(mUfN5QyYoF&ew3<=?GAc3V)=TPPhY!s!MlF0q-vi~DMo}7 zTZ%BDirZR_k(?Zpd^~1OPp7+M)T{I8)={9tXL&qKW&LZl?M|#DD<(<>&7+p9)LQq* zRrl!CbPHYOm2?@|FUsuvM8yr;tP-U`z@o}(7_C$~Y0dYXdd*x=2WR-Gk}TyY2Fi|J z+J_FE6!%eKy6Tej>V zVUVJ1-9TL;1^=ZntCy0{YJ`!Mcx`6I>w)7&Vc@+c3#+kYm9fCe3Xf4t-NFlXmawP| zBwC5fEVgDlNy!f#`BK=h7|E8sRJKn0KIMyGtO^W9fuw|Tx#RK-W)qz=l)?*d@b zWkh@Vp_~E+ukJM7`4~i|SNT+a1a~ogQF`0nVldIwY4h{(Jj_iU{L9`KUx zhIqVcM?v?FcrUS|CQCB@CE5)^yRU!{#t4-lg;{=Z8!(&Z7tqT#k$b+CH*>`c;zAV{ z)I_2f^omO0BUkK>qDygYDt&uXGtqAJ7N3Ot*YgFwaAXvCEwjTd;0o~=Sw=bV@FA-auUIU>U@yK zJdurHlUvUNg3C$7Sc1lxH&<6z%OM`c;t^gghf$O2BkDP3tun!4cFhM3hSqH_PHo?N zO>km~7}5d1Spg^%#BbHst=J7$Rig|Og1m^56oC=F*)%B`ZYmjFcSK2=gr_=0x_b>RY(xt|8L61Msay?)Gth1i#QQW9_lGB?`*rc|9 z7ix3=UYMLxR|kd7v}qXSTDhIh7Ka^bN{`cpA!=%BjeshKQ)y38Q0-x*+ARnCHfpwv znzwwdSLM?MCdsLO(}UhFXx)!CZtjKV`$a>B;0xV4*sOA|BKkbR^Tq`*6`4q|>%!YC zy6v%5vf_vcGs0Z5ZY@ib7WQ30h%*W&{w-%SZaMHPM64A>pjEhl$Xx+Z3-pk6_t+ry zX@VF31m0`@=(Q$TM~>(O0?QWl3*eGlCn zP<^uy1`Ft$9QyU6tdsF*6aLQ@@t?^z82%p2;co}4W-99nI3tZvkxnsD4};d{2ksmi zwJ>#BFX}ghwev_}Fue1k3m0oWOf3f{;fgc>GK~TE(F%)T5p=>%+JS`wUy9%^1dZC# z|KiByvc*FBG04XF3NBBP_<&@CRO*B{I23ObtP z`)jEWx1{QO2;dlNR=H5H(CJClOISPin1A9t9FJhhS|t{+)c~f+5f(#)0S-5)6VbK5 zE}2O?O0C}^$tiF-J6tiQ?Z3OLwjV{?zk@e-a*l!K*0-tjgRO7qN(fR2p|##dindr! ze2)2kxVi*xp=L)c?t~&FK;RK<1PcKqh;XZ5ERbOo!s}}Hs^d?o9;uGqmuYnKXIkuG zaDm8B>m9s#cXV_7I;$(iz}xKrV9Z~)(m-k{_Aun;!$yO`BFB35@z+Kl!OP~}43y&rgF4R%VdbyMZpY_n; zXWo6G%1#(wzJL1CS9&GP8Grw}E1iEFI{%k

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