From 509a5ba4f56f77c26db4a4074268cd998e7d3a4d Mon Sep 17 00:00:00 2001 From: 153957 <153957@users.noreply.github.com> Date: Mon, 12 Feb 2024 23:29:25 +0000 Subject: [PATCH] deploy: d5b1d4fe0de28f2e5a762ad2d88500f53f9e401a --- .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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 z 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 F{s+ODyvqOp 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 + + + + + + + +