From a9b3754e98f4ece4968ed52c92fa5043bcc79331 Mon Sep 17 00:00:00 2001 From: 153957 <153957@users.noreply.github.com> Date: Mon, 25 Mar 2024 16:42:06 +0000 Subject: [PATCH] deploy: cccb65a94db83b5d6ed0325b74e90d6c4f58535c --- .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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�XUxlv5`b1V_3A7gwB4M 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 E4-_uGmjD0& 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 + + + + + + + +