From bbbdc6ae1c7c51c981b808557922a8bd6221236c Mon Sep 17 00:00:00 2001 From: 153957 <153957@users.noreply.github.com> Date: Tue, 9 Jul 2024 08:26:23 +0000 Subject: [PATCH] deploy: 7f906656196268c6cf4ac44fe9973d51459b786b --- .buildinfo | 4 + .doctrees/api.doctree | Bin 0 -> 4406 bytes .doctrees/api_tutorial.doctree | Bin 0 -> 24283 bytes .doctrees/api_views.doctree | Bin 0 -> 58052 bytes .doctrees/data_access.doctree | Bin 0 -> 16280 bytes .doctrees/environment.pickle | Bin 0 -> 393329 bytes .doctrees/hisparc_maps.doctree | Bin 0 -> 18831 bytes .doctrees/index.doctree | Bin 0 -> 5045 bytes .doctrees/station_layout.doctree | Bin 0 -> 12819 bytes .doctrees/status_display.doctree | Bin 0 -> 3870 bytes .doctrees/status_display_views.doctree | Bin 0 -> 110077 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 | 619 +++++++++++++++++ _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 | 103 +++ searchindex.js | 1 + station_layout.html | 173 +++++ status_display.html | 191 +++++ status_display_views.html | 591 ++++++++++++++++ 50 files changed, 5977 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..58b03ecf9 --- /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: 8bf9155c22aee48e8584c5b3e975d46a +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/api.doctree b/.doctrees/api.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8ad397cbd85ef6cb232ff5e15b43e03922a5ef6f GIT binary patch literal 4406 zcmcIoTW=h<6_zdSN~^2oi&E59Izf>}L89G0s3ZoJz_RZ``=u>Q4w|8M>;{>Tk9J2$G*3HNRV9Ep%ws(Il*_imTi zt<21@IlpdrVx=m&Vz;N34`XZJ_nr&u&&@vEq8NNcn8R9kr*#51^%Z2cGyLe(&P<9)9nW#xPpTpy!cW zE1A^Z-OW{6W&CGRd+8AOcz35JA1_fw|HOJ$i4Vl_f&rhsi2dAu5G^*r=raLbZ`O44fcbQ3|aimL%MmU{qKqs;~?oO(R)ER`AU)uCXamcl^N3J%HSLC(xYd%0CnRUTV)3`rdKVn44V zz{Yge*swCgkcmg)!2R@Fo8#xs{bbR(gb1Wmlkshpf#*K@HV&vu#({h58s{x&@yA6i zt`D(W3pswhMAwJyUApV zT%7@|Ee{<_lYRkiAxT(QIa-y)pGdV+x7kG?^#RDF>4E#hcZR2Hz`)-q(^kJR(*{qF zL8yr4VGDu<%KW~UZx;48vp+;;4;Jnlpy8>!R8^5Kl&_{zub?NW#A?3S)c!{m7x&$2 zDA5bm{KO4Fiq9lJH~#OQxoue_S(WmM%tE;r|730>XS0--R`}oi2Y={atPHId-ENwx zvA=YEA=4C{`O@t)0y@G*QRQPK9pb&>HbWyes>m+DyNL!r?=0kqf1t#XBevj(FVRDn zqU81(n~%>?)Jv{CTkKMF{&nlXM$S$(o=5sfJaRiQ_qfBL=N*=5Bbsk?2qvkUkh)q& zGiZk{x~$ov8r>`)K6H1jW`)T@ZHr6lHK@d47U)@JSysEG;Rzn9=)N0nH>osD8gVyQ zY`2tpzHl3cTZ^`Z(P_V%g(f;6Gxe_j8Otg}uq|`0k1|_U)}M$y1bxaeGcc>P$AW4y z3UFRxv89!=P!#}}d3R&v-BztajC)VPu-Pmtonf_uh{QCj&@NQzQ8+KWyFG!JLRr4B z`O59kj0QNwGphgomD{BbUdF&VO@0Of@7ENb@j!{sr4?~IFX6uCKr=v{xNXf#rEQ$? zGY)s&ben=@-LmKQ`3wUCwU^4YOg-02`M8?my4`c83wRM6nzI~~0Ya8=GKut)1$-7` zL{urbyc<+@a{QBHBk}!Uc{Ao(D;*0~q#2+I7{Io~dbd}5enCnvNb&CQ%FY!L;@@t! z7CKj;J^EmIjtx;vUDN~bZ>n`0&{5*qSO zTpu&S1UAAQGHuZy`fit1R>gCYyD5RSowUl!xWgm78VHi+se)xBa4%3oHc;s2q|)#z zRq-q*G~ME}QW=gRZ+xWsTxWekBKX({5pg@V*ApWSf#lx%=aF$D@UnM><`d+R;7TkYV7yqMH zJoRM4>nYbm$?YWEK_kDgd4|gdXxT`i6s7ywhC2ix^SH~*&VU$m9T0NqZkY>=hO=16 zsmSmHc-JyTxZgH8LzexyLP{Gr>P}eK%Q#aBtGk6eOax}`1mUZb4PFi|#Oc$j#1-^z z3q7Ez0caSY&_LJ~h1*mmOf|m3CUe4WrdXYc^v*iTiuApJ27+VQxpemuaGl0H zXEKZN!la@bwBB#th`?$#sSDbrTjj+Wz1Q4ET}qI619H8fedMrZb4HJJ^nynCu045B)%43i8Em;Hz2CLD4{03!M?r}XRj*p z4t;-x2cHqScqFoR*1y{5A9W*HH+S`c|0QTg|Kl VR8Q%j0h=jRsnrAhz* literal 0 HcmV?d00001 diff --git a/.doctrees/api_tutorial.doctree b/.doctrees/api_tutorial.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a0f1f2fa8394d5eff89920038ec9d2dd82cd75e0 GIT binary patch literal 24283 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 sCi_yy4BK*<3bx-tvInMAu@rap4E{ue-$L literal 0 HcmV?d00001 diff --git a/.doctrees/api_views.doctree b/.doctrees/api_views.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1c5a0796cef6fa1a7f005d168417f9068f23895d GIT binary patch literal 58052 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 W3lM8^iOk2T2Hj*V#4ZmN%>RGX+(#k+ literal 0 HcmV?d00001 diff --git a/.doctrees/data_access.doctree b/.doctrees/data_access.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bdf03a6dc917aff662c0440f5a7b531a4386dc7d GIT binary patch literal 16280 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

-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ޯ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 literal 0 HcmV?d00001 diff --git a/.doctrees/hisparc_maps.doctree b/.doctrees/hisparc_maps.doctree new file mode 100644 index 0000000000000000000000000000000000000000..40276d9ab0b834f069b747b5b0aa42a0206a6166 GIT binary patch literal 18831 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 KOO9(+EB_A!a2coo literal 0 HcmV?d00001 diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3b6d40b2b77215f93ce4ccfafee18a708786ce10 GIT binary patch literal 5045 zcmc&&TW=&s753Vmv1e?LFPk+%UN5skAr55hMB)Lh!~RXyI_Eo= zs-L$$`~3ET`?H%m7c!k3vM5Tki0jg>Mp;-SJT>K~`z5W!!sYk)gj9Md|Hq|Qx}7tqXiBkdJ3%e86ic>U9p%I>$1>&RNik%$%ZyQS zSQwaqj=UrzjpNysFlJhVi0@X)692Ut75Qv1WZ{|OBjPFSieY1#D#fPQ6YJuxSQ7j8 z?IV#T{74mP%GJ?%rp}IXckF05`+$;1GL87;P-*CW?|88o;^ZA1gpC!;Mbm6Qdr$EG z_vH^CedpbW{dp5g-8Yz)so`qGLXMHjim~XQ3mJ+&f5O#8mhyhc(mo4Au639ABe86Bb^seFRG%dbEp{?L5q2xzy+f^(h;a*?!;t;`^;M_Uj;!vLw%n zG-^23hl*GLkh0Jy-i(!M?nMU^d$#591K2`)B^_7~PV5>vHt>!ve^H*;b(YJ(6ed%W z#hxOh2F}7DVYzmcUIl<4W*1pu9Bm2fW|M^uBCNtZXxy&LG>nUgk7VpO7C#k_#ZW|I zBm}ps37bSbH=;aVL|C!h

1fIL?OUrELotMaU_acB2wBC9I}JGUSR!R&wp5%C#Ms`ki?k*v-nSgL4E_&Q;0gp>bTh$jbqg_!LTZ-$(6$3`)sr zP$w1_91vDv&EE5jE~K89)mRgaU2M7J!Q@a$alclhvCf@aHNo!uAdMt~)`cqcAalDc zx%=Fy8DM{TbHGya`lzAO9hZvMhD9866U4{|&tR6)dxvHMX?W6@wwn)-9v?g&^VGrf zvDbDQZ{l}O`vtq6bDS(42NUo&1XK(i+m@+I*>zFqxL(Z*~PEbCIKHE|F-vhW~t$ zqu5CU=+g8#Q)&5$TW6RWbA#$SJqV%s4;7lf1T}ttof^%oM$Er`8S}3jl7B^pf`@-I z#aQLCB!fRtk)CncKb_0|Sn~@%{>$7LZmA_S-147m+#>#ZBai(1y3@VLBmcd*N5tP7 znm7IMDop#Y>o#xtftdgCGUnP3#QdxudOmbCM{X96yK|9aH?BI6qDO zG9&Gx4{}0hjyc^Xe%G)(uZAAn%r~b!NV)FNFL2N49@c#!57h@~`sd4H@3i|81)44* z{`L*{YcGMn_R_2@)LFmI>9+0jWNB}G-L)H^HDb+W)hk712O&oJe1O(#Q04PkC8=kd z+5Xz`ApY^=}-y6(4SGK0pzRojZk72kqPcgyy|LQ!uW zOgriIn&LZZyQ;Y{$mF7dkdv?584!J5i4169#uOkmt2kph=_akcPlLPvJ3ll;B(%5!5#X>{l(Q zt_z9+d~Ghmgxz0!jxi z3ppK$^ph!U7VtErEIlr5r!b?zw+33``|j1rfGd@$KmcMfx*h~S&K9EFYo|-? zaQK!HsHxb3x^cF<^o30{SJWiKHzX~B%h%BEPKU?0>^8+4kdux9#8@V1EZ*6A-S%>x z2h?pKN|9KgIa;e6Xov0;8unFTOs*ds9f7P5^9v)g^e|InMARMPbP9koKqm+H7`S5< z^ucRyeG~TVsZls5o+vZ%U#rDapG=TF4@@S( zG&rXR2yit4LN4u=zDNz51VWBQj34m39A^amb)7H-+WQ5fTEkGc-PjLa!xp7WACqZWvV>z;y%^nT~*gDlhC%qR_=~j!haen%cYNYMZ9JRErOo*qKZt}7a_vx3I%J; z=MT`N5W*Z4UQdQuJOzd$zA{Iga(Avs?9{uuMLSpIBkw9xB8u+J%c^E@*+eP{aYF}Q zP;0^rw;%Vmg<`Vuu%dqot9@L)i?F~28UcnkA`K+?4W}993VCfxcFtU@F1!HGm>!zC N5hcAUKls-C@PAykj_3dY literal 0 HcmV?d00001 diff --git a/.doctrees/station_layout.doctree b/.doctrees/station_layout.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7ac2fa23e0f521866d5b794ea6ec01bb0d509e05 GIT binary patch literal 12819 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 and `Python +`_. We'll show you how to do some neat things. +How can you get a list of all |hisparc| stations in Denmark? What is the +position of station 201? Which stations had data on 20 October 2010? How +does the number of measured events change during a few weeks? This +tutorial will give you an overview of some of possibilities with the +|hisparc| |api|. For details on all available classes and methods, +please see the :doc:`api`. + +.. note:: + + We'll require you to know some basic programming, i.e. to understand + what an :code:`if` statement is and :code:`for` loop does. If you + are new to coding you can try a tutorial online, for instance + `Codeacademy `_, we recommend learning + Python or jQuery. + + +First look +---------- + +First we will just look at what this |api| is. The |api| can be accessed +via the internet by opening urls. Instead of a website you get data as a +response. This data is formatted as a JSON (JavaScript Object Notation), +this format can be understood by many programming languages. + +To see what options the |api| has we will look at it in a browser. Open +the following link in your browser (this will not work in Internet +Explorer): `https://data.hisparc.nl/api/ `_. + +You should now see some text, like this: + +.. code-block:: javascript + + {"base_url": "https://data.hisparc.nl/api/", + "clusters": "clusters/", + "clusters_in_country": "countries/{country_id}/", + "configuration": "station/{station_id}/config/{year}/{month}/{day}/", + "countries": "countries/", + "has_data": "station/{station_id}/data/{year}/{month}/{day}/", + ... + "subclusters_in_cluster": "clusters/{cluster_id}/"} + +This is the JSON, it is a dictionary (indicated by the :code:`{` and +:code:`}` enclosing brackets): an object which has keys and values. Each +key (:code:`"clusters"`, :code:`"has_data"`) refers to a value +(:code:`"clusters/"`, +:code:`"station/{station_id}/data/{year}/{month}/{day}/"`). + + +Cluster list +^^^^^^^^^^^^ + +This tells us that if we want a list of all clusters we need to use the +clusters option by appending :code:`"clusters/"` to the base url, +resulting in the following: +`https://data.hisparc.nl/api/clusters/ `_. + +With this result: + +.. code-block:: javascript + + [{"name": "Amsterdam", + "number": 0}, + {"name": "Utrecht", + "number": 1000}, + ... + {"name": "Karlsruhe", + "number": 70000}] + +This JSON is a list (indicated by the :code:`[` and :code:`]` enclosing +brackets) of dictionaries, one for each cluster. Each dictionary +contains the name and number of a cluster. This way information about +the network of stations can be retrieved. + + +Javascript example +------------------ + +The following code example will generate a webpage which will use the +|api| to get an up-to-date list of stations. It will then show a +drop-down menu from which a station can be selected, once you have +chosen a station you can click the :code:`Get info` button to make +Javascript get the station information. To try this you can either use +this example page: `jsFiddle `_ or create +your own HTML file with this code: + +.. code-block:: html + + + + + + + +

Station info

+

Choose a station:

+ +

+    
+    
+
+
+Python example
+--------------
+
+In this example we will use several standard Python libraries and the
+popular plotting library `matplotlib `_ (pylab).
+We start by importing the required libraries, one to get data from the
+urls, one to make working with dates easy and the plotting library. Then
+define the start values and perpare two empty lists in which the data
+can be placed. Then a while loop is used to loop over all days between
+datum and end_datum, reading each corresponding url. Finally a plot is
+made, setting the dates against their values.
+
+Start Python and type (or copy/paste without the :code:`>>>`) the
+following lines of code:
+
+.. code-block:: python
+
+    >>> from urllib.request import urlopen
+    >>> from datetime import date, timedelta
+    >>> from pylab import plot, show
+    >>> id = 501
+    >>> datum = date(2010, 10, 1)
+    >>> end_datum = date(2011, 2, 1)
+    >>> base = 'https://data.hisparc.nl/api/station/%d/num_events/%d/%d/%d'
+    >>> events = []
+    >>> dates = []
+    >>> while datum < end_datum:
+    ...     url = urlopen(base % (id, datum.year, datum.month, datum.day))
+    ...     events.append(url.read())
+    ...     dates.append(datum)
+    ...     datum += timedelta(days=1)
+    ...
+    >>> step(dates, events)
+    >>> show()
+
+
+SAPPHiRE
+^^^^^^^^
+
+The HiSPARC Python framework SAPPHiRE includes an API module. This module
+simplifies access to the API. See the SAPPHiRE documentation for more
+information:
+`https://docs.hisparc.nl/sapphire/ `_.
diff --git a/_sources/api_views.rst.txt b/_sources/api_views.rst.txt
new file mode 100644
index 000000000..6d9c8cdde
--- /dev/null
+++ b/_sources/api_views.rst.txt
@@ -0,0 +1,11 @@
+API Views Reference
+===================
+
+.. automodule:: publicdb.api.views
+   :members:
+   :undoc-members:
+
+
+Contents:
+
+.. toctree::
diff --git a/_sources/data_access.rst.txt b/_sources/data_access.rst.txt
new file mode 100644
index 000000000..83cccaeb4
--- /dev/null
+++ b/_sources/data_access.rst.txt
@@ -0,0 +1,105 @@
+.. include:: subst.inc
+
+Data access
+===========
+
+There are several ways in which the |hisparc| data can be accessed:
+
+- Via the Public database `download forms
+  `_.
+- Via Python using the |sapphire| framework (see `SAPPHiRE Tutorial
+  `_).
+- Via the `jSparc `_ web applications.
+
+To access metadata, like a list of all stations or information about a
+specific station see the :doc:`api_tutorial`.
+
+
+Download form
+-------------
+
+When looking at the data page for a station (i.e. `Kaj Munk College
+`_), you will see a 'Download
+event summary data' link on the right. When this link is clicked you
+will be taken to the `Data download form
+`_. On this page you can select
+the station, the start and end date for which you want to download the
+data. There is also an option to download weather data instead of events,
+however, not all stations gather weather data.
+
+When you click the Submit button without checking the checkbox to
+Download, the data should (Firefox always downloads the data) show up in
+your browser window. If you check the Download box the data will be
+downloaded to your PC as a csv file.
+
+This csv file can be read by many programs, including Excel. Use the
+Import option in Excel to make it recognize tabs as delimiter between
+columns.
+
+
+Downloading via Python
+----------------------
+
+.. note::
+
+    An easy to use module has been added to |sapphire| to download
+    data from the ESD. The following is an old (but working) example.
+
+This is an example of how to download the data from the Public database
+in Python. In this example we will download 1 hour of data for station
+202 on July 2, 2013.
+
+First load the required libraries (requires the numpy package).
+
+.. code-block:: python
+
+    >>> from datetime import datetime
+    >>> from urllib import urlencode
+    >>> from urllib.request import urlopen
+    >>> from StringIO import StringIO
+    >>> from numpy import genfromtxt
+
+Then define the url and place the start and end datetime in the query.
+To download weather data instead, replace 'events' by 'weather' in
+the url (and choose a station that has weather data, e.g. 3 or 501).
+
+.. note::
+
+    Do not pass the query to the urlopen 'data' argument because that
+    changes the request into a *POST* request, but you need a *GET*
+    request.
+
+.. code-block:: python
+
+    >>> url = 'https://data.hisparc.nl/data/202/events'
+    >>> start = str(datetime(2013, 7, 2, 11, 0))
+    >>> end = str(datetime(2013, 7, 2, 12, 0))
+    >>> query = urlencode({'download': False, 'start': start,'end': end})
+    >>> full_url = url + '?' + query
+
+Download the data and store it in a variable
+
+.. code-block:: python
+
+    >>> data = urlopen(full_url).read()
+
+Now use numpy to convert the data from csv to a numpy array.
+
+.. code-block:: python
+
+    >>> format = [('date', 'datetime64[D]'), ('time', '|S8'),
+                  ('timestamp', 'uint32'), ('nanoseconds', 'uint32'),
+                  ('pulseheights', '4int16'), ('integrals', '4int32'),
+                  ('n1', 'float32'), ('n2', 'float32'),
+                  ('n3', 'float32'), ('n4', 'float32'),
+                  ('t1', 'float32'), ('t2', 'float32'),
+                  ('t3', 'float32'), ('t4', 'float32'),
+                  ('t_trigger', 'float32'),
+                  ('zenith', 'int16'), ('azimuth', 'int16')]
+    >>> a = genfromtxt(StringIO(data), delimiter="\t", dtype=format)
+    >>> print(a[0])
+    (datetime.date(2013, 7, 2), '11:00:02', 1372762802L, 466307811L,
+     [78, 798, -1, -1], [535, 10882, -1, -1],
+     0.14720000326633453, 3.854599952697754, -1.0, -1.0,
+     345.0, 12.5, -1.0, -1.0, 345.0, -999, -999)
diff --git a/_sources/hisparc_maps.rst.txt b/_sources/hisparc_maps.rst.txt
new file mode 100644
index 000000000..8c7d5b44c
--- /dev/null
+++ b/_sources/hisparc_maps.rst.txt
@@ -0,0 +1,110 @@
+.. include:: subst.inc
+
+HiSPARC maps
+============
+
+Each |hisparc| station is equipped with a GPS antenne. This GPS is used
+to for time synchronization between stations and to determine the exact
+location of each station. All these locations are stored in our
+database. The GPS positions can be found on the data pages of stations,
+via the API (:doc:`api`) and in the raw data.
+
+
+Map
+---
+
+Using the `Leafet `_ library with `CARTO
+`_ maps tiles (based on `OpenStreetMap
+`_ data) we are able to visualize the
+detector network by showing the locations of the stations on a map.
+
+Here is an overview of the network: `Stations on map
+`_
+
+
+Station info
+^^^^^^^^^^^^
+
+When you click on a station marker a popup will show information about
+that station, its name and cluster. If the station has data the name of
+the station will be a link to its data page.
+
+
+Status
+^^^^^^
+
+The stations on the map can have one of 4 colors to indicate the current
+status of that station.
+
+- Green: when a station is operating properly
+- Yellow: it is responding to the server but has a problem
+- Red: it is completely unresponsive (offline)
+- Gray: it is is no longer active or the status can't be determined.
+
+
+Embedding
+---------
+
+On several public database pages a map is embedded to show the station
+location or provide an overview of multiple stations. Moreover, maps are
+also used on our main website to give an overview of the station
+organization and clustering (e.g. `Bristol
+`_, `Science
+Park
+`_
+). This is accomplished by placing an iframe on those pages that
+shows another page which only has the map as its content. Example code:
+
+.. code-block:: html
+
+    
+
+Result:
+
+.. raw:: html
+
+    
+ +
+ + +Syntax +^^^^^^ + +To show a map of a specific region or location, use the syntax explained +here. First start with the base url:: + + https://data.hisparc.nl/maps/ + +When no extra options are given the page zooms and positions the map +such that all stations fit in the window. But you can also focus on a +specific region or station. Several levels of regions are possible:: + + https://data.hisparc.nl/maps/[Country]/[Cluster]/[Subcluster]/ + https://data.hisparc.nl/maps/[Station number]/ + +An overview of countries, clusters and subclusters can be found on +https://data.hisparc.nl/ . First you can choose to focus on a Country: + +- https://data.hisparc.nl/maps/Netherlands/ +- https://data.hisparc.nl/maps/Denmark/ + +Then focus more closely on a cluster, note that you also need to give +the country: + +- https://data.hisparc.nl/maps/Netherlands/Enschede/ +- https://data.hisparc.nl/maps/Netherlands/Utrecht/ +- https://data.hisparc.nl/maps/United%20Kingdom/Bristol/ + +And to focus on a subcluster, also specifying the country and cluster: + +- https://data.hisparc.nl/maps/Netherlands/Amsterdam/Zaanstad/ +- https://data.hisparc.nl/maps/Netherlands/Enschede/Enschede/ + +Finally you can also focus on one specific station by simply giving its +station number: + +- https://data.hisparc.nl/maps/8005/ +- https://data.hisparc.nl/maps/8103/ diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 000000000..7cd87648d --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,26 @@ +Public Database documentation! +============================== + +The HiSPARC Public Database is the interface through which everyone can access +the data and our station administration is done. + +Contents: + +.. toctree:: + :maxdepth: 2 + + data_access + api_tutorial + hisparc_maps + station_layout + api + status_display + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/_sources/station_layout.rst.txt b/_sources/station_layout.rst.txt new file mode 100644 index 000000000..441bb23d6 --- /dev/null +++ b/_sources/station_layout.rst.txt @@ -0,0 +1,63 @@ +.. include:: subst.inc + +HiSPARC station layout +====================== + +Each |hisparc| station has a GPS antenne and either 2 or 4 scintillator +detectors. This GPS is used to determine the exact location of the +station. However, the GPS is often not at the center of the station, +moreover, not all stations are oriented the same way, and the distances +between detector may differ. For reconstruction of the measured data it +is important to know the location of each detector, this section +explains how the location of the detectors can be measured and +communicated to us. + + +Compass coordinates +------------------- + +The coordinate system we have chosen for describing the position of +detectors is illustrated in the following figure. + +.. image:: images/coordinate_system.png + :width: 313px + +For each detector 3 (or 4) coordinates need to be determined: + +- First the distance (:code:`r`) from the GPS to the center of the + scintillator (in meters). +- Next the alpha angle (:code:`α`) which is the clock-wise turning angle + between North and the detector as seen from the GPS (in degrees). +- A height (:code:`z`) coordinate can be measured if there is a + significant altitude difference between the GPS antenna and the + detectors, or if the detectors are not at the same height. Up is + positive (in meters). +- The rotation of the detector is described by the beta angle + (:code:`β`), which is the clock-wise turning rotation of the long side + of the detector relative to North (in degrees). + +For more information about the coordinate systems used in HiSPARC see: +`Coordinate systems and units in HiSPARC +`_. + +For Dutch schools we have an assignment sheet in the infopakket which +walks students through the process of measuring the station layout: +`De stationsplattegrond +`_. + + +Submitting the measurements +--------------------------- + +New layouts can be submitted via the `layout submit form +`_. A verification e-mail will be sent +to the submitter. The submitted measurements will be reviewed before they are +made available on the website and via the API. + + +Accessing the data +------------------ + +The detector coordinates can be accessed via the :doc:`API `. +These can, for example, be used when analysing data or when making a schematic +drawing of the station layout. diff --git a/_sources/status_display.rst.txt b/_sources/status_display.rst.txt new file mode 100644 index 000000000..36a72f40d --- /dev/null +++ b/_sources/status_display.rst.txt @@ -0,0 +1,13 @@ +Status Display Reference +======================== + +.. automodule:: publicdb.status_display + :members: + :undoc-members: + + +Contents: + +.. toctree:: + + status_display_views diff --git a/_sources/status_display_views.rst.txt b/_sources/status_display_views.rst.txt new file mode 100644 index 000000000..aac40fa8b --- /dev/null +++ b/_sources/status_display_views.rst.txt @@ -0,0 +1,11 @@ +Status Display Views Reference +============================== + +.. automodule:: publicdb.status_display.views + :members: + :undoc-members: + + +Contents: + +.. toctree:: diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 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..4d67807d1 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 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..ba033b0db --- /dev/null +++ b/_static/nature.css @@ -0,0 +1,252 @@ +/* + * nature.css_t + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- nature theme. + * + * :copyright: Copyright 2007-2024 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..92da3f8b2 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,619 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 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, anchor) + ); + // 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." + ).replace('${resultCount}', resultCount); +}; +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); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (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; +}; + +/** + * 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, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlinks", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. 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); + }, + + _parseQuery: (query) => { + // 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]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + 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; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + normalResults.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, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // 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; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // 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); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], 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.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(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, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + 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..2c9a1d125 --- /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..ba16d8b8f --- /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..a73e55ba4 --- /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..4aa97cd88 --- /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..e96bdeea6 --- /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..34829a678 --- /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..e98240c65 --- /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..e829c9d8b --- /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..34e26561b --- /dev/null +++ b/search.html @@ -0,0 +1,103 @@ + + + + + + + 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..6efe55110 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"API Reference": [[0, "module-publicdb.api"]], "API Tutorial": [[1, "api-tutorial"]], "API Views Reference": [[2, "module-publicdb.api.views"]], "Accessing the data": [[6, "accessing-the-data"]], "Cluster list": [[1, "cluster-list"]], "Compass coordinates": [[6, "compass-coordinates"]], "Data access": [[3, "data-access"]], "Download form": [[3, "download-form"]], "Downloading via Python": [[3, "downloading-via-python"]], "Embedding": [[4, "embedding"]], "First look": [[1, "first-look"]], "HiSPARC maps": [[4, "hisparc-maps"]], "HiSPARC station layout": [[6, "hisparc-station-layout"]], "Indices and tables": [[5, "indices-and-tables"]], "Javascript example": [[1, "javascript-example"]], "Map": [[4, "map"]], "Public Database documentation!": [[5, "public-database-documentation"]], "Python example": [[1, "python-example"]], "SAPPHiRE": [[1, "sapphire"]], "Station info": [[4, "station-info"]], "Status": [[4, "status"]], "Status Display Reference": [[7, "module-publicdb.status_display"]], "Status Display Views Reference": [[8, "module-publicdb.status_display.views"]], "Submitting the measurements": [[6, "submitting-the-measurements"]], "Syntax": [[4, "syntax"]]}, "docnames": ["api", "api_tutorial", "api_views", "data_access", "hisparc_maps", "index", "station_layout", "status_display", "status_display_views"], "envversion": {"sphinx": 61, "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}, "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"], "indexentries": {"clusters() (in module publicdb.api.views)": [[2, "publicdb.api.views.clusters", false]], "config() (in module publicdb.api.views)": [[2, "publicdb.api.views.config", false]], "countries() (in module publicdb.api.views)": [[2, "publicdb.api.views.countries", false]], "create_plot_object() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.create_plot_object", false]], "get_cluster_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_cluster_dict", false]], "get_config_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_config_source", false]], "get_context_data() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.get_context_data", false]], "get_context_data() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.get_context_data", false]], "get_country_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_country_dict", false]], "get_dataset_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_dataset_source", false]], "get_detector_timing_offsets() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_detector_timing_offsets", false]], "get_detector_timing_offsets_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_detector_timing_offsets_source", false]], "get_event_traces() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_event_traces", false]], "get_eventtime_histogram_sources() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_eventtime_histogram_sources", false]], "get_eventtime_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_eventtime_source", false]], "get_focus() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_focus", false]], "get_gpslocations() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_gpslocations", false]], "get_histogram_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_histogram_source", false]], "get_object() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.get_object", false]], "get_object() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.get_object", false]], "get_queryset() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.get_queryset", false]], "get_queryset() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.get_queryset", false]], "get_redirect_url() (latestnetworksummaryredirectview method)": [[8, "publicdb.status_display.views.LatestNetworkSummaryRedirectView.get_redirect_url", false]], "get_redirect_url() (latestsummaryredirectview method)": [[8, "publicdb.status_display.views.LatestSummaryRedirectView.get_redirect_url", false]], "get_specific_config_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_specific_config_source", false]], "get_specific_dataset_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_specific_dataset_source", false]], "get_specific_histogram_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_specific_histogram_source", false]], "get_specific_network_histogram_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_specific_network_histogram_source", false]], "get_station_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_station_dict", false]], "get_station_layout_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_station_layout_source", false]], "get_station_timing_offsets() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_station_timing_offsets", false]], "get_station_timing_offsets_source() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.get_station_timing_offsets_source", false]], "get_subcluster_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.get_subcluster_dict", false]], "has_data() (in module publicdb.api.views)": [[2, "publicdb.api.views.has_data", false]], "help() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.help", false]], "http_method_names (networksummarydetailview attribute)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.http_method_names", false]], "http_method_names (summarydetailview attribute)": [[8, "publicdb.status_display.views.SummaryDetailView.http_method_names", false]], "json_dict() (in module publicdb.api.views)": [[2, "publicdb.api.views.json_dict", false]], "latestnetworksummaryredirectview (class in publicdb.status_display.views)": [[8, "publicdb.status_display.views.LatestNetworkSummaryRedirectView", false]], "latestsummaryredirectview (class in publicdb.status_display.views)": [[8, "publicdb.status_display.views.LatestSummaryRedirectView", false]], "man() (in module publicdb.api.views)": [[2, "publicdb.api.views.man", false]], "module": [[0, "module-publicdb.api", false], [2, "module-publicdb.api.views", false], [7, "module-publicdb.status_display", false], [8, "module-publicdb.status_display.views", false]], "nav_calendar() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.nav_calendar", false]], "nav_calendar() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.nav_calendar", false]], "nav_months() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.nav_months", false]], "nav_months() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.nav_months", false]], "nav_years() (networksummarydetailview method)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.nav_years", false]], "nav_years() (summarydetailview method)": [[8, "publicdb.status_display.views.SummaryDetailView.nav_years", false]], "network_status() (in module publicdb.api.views)": [[2, "publicdb.api.views.network_status", false]], "networksummarydetailview (class in publicdb.status_display.views)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView", false]], "none_to_nan() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.none_to_nan", false]], "num_events() (in module publicdb.api.views)": [[2, "publicdb.api.views.num_events", false]], "plot_config() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.plot_config", false]], "plot_dataset() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.plot_dataset", false]], "plot_histogram() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.plot_histogram", false]], "plot_timing_offsets() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.plot_timing_offsets", false]], "publicdb.api": [[0, "module-publicdb.api", false]], "publicdb.api.views": [[2, "module-publicdb.api.views", false]], "publicdb.status_display": [[7, "module-publicdb.status_display", false]], "publicdb.status_display.views": [[8, "module-publicdb.status_display.views", false]], "station() (in module publicdb.api.views)": [[2, "publicdb.api.views.station", false]], "station_config() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_config", false]], "station_has_config() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_has_config", false]], "station_has_data() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_has_data", false]], "station_latest() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_latest", false]], "station_status() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.station_status", false]], "stations() (in module publicdb.api.views)": [[2, "publicdb.api.views.stations", false]], "stations() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations", false]], "stations_by_country() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_by_country", false]], "stations_by_name() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_by_name", false]], "stations_by_number() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_by_number", false]], "stations_by_status() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_by_status", false]], "stations_on_map() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_on_map", false]], "stations_with_data() (in module publicdb.api.views)": [[2, "publicdb.api.views.stations_with_data", false]], "stations_with_data() (in module publicdb.status_display.views)": [[8, "publicdb.status_display.views.stations_with_data", false]], "subclusters() (in module publicdb.api.views)": [[2, "publicdb.api.views.subclusters", false]], "summarydetailview (class in publicdb.status_display.views)": [[8, "publicdb.status_display.views.SummaryDetailView", false]], "template_name (networksummarydetailview attribute)": [[8, "publicdb.status_display.views.NetworkSummaryDetailView.template_name", false]], "template_name (summarydetailview attribute)": [[8, "publicdb.status_display.views.SummaryDetailView.template_name", false]], "validate_date() (in module publicdb.api.views)": [[2, "publicdb.api.views.validate_date", false]]}, "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"]]}, "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"]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute"}, "terms": {"0": [1, 3, 4], "00": 3, "02": 3, "1": [1, 3], "10": 1, "1000": 1, "10882": 3, "11": [1, 3], "12": 3, "1372762802l": 3, "14720000326633453": 3, "2": [1, 3, 6], "20": 1, "2002": 8, "2004": 8, "201": 1, "2010": 1, "2011": 1, "2013": 3, "202": 3, "20kingdom": 4, "20park": 4, "3": [3, 6], "300": 4, "345": 3, "4": [1, 4, 6], "404": 2, "466307811l": 3, "4int16": 3, "4int32": 3, "5": 3, "501": [1, 3], "535": 3, "600": 4, "7": 3, "70000": 1, "78": 3, "798": 3, "8005": 4, "8103": 4, "854599952697754": 3, "999": 3, "A": 6, "And": 4, "But": 4, "By": 2, "For": [1, 2, 6], "If": [1, 2, 3, 4], "In": [1, 3], "It": [0, 1], "Not": 2, "On": [3, 4], "The": [0, 1, 3, 4, 5, 6, 7, 8], "Then": [1, 3, 4], "There": 3, "These": 6, "To": [1, 3, 4], "With": 1, "abl": 4, "about": [0, 1, 2, 3, 4, 6], "access": [0, 1, 5], "accomplish": 4, "activ": 4, "ad": 3, "administr": 5, "against": 1, "all": [1, 2, 3, 4, 6, 8], "alpha": 6, "also": [3, 4], "altitud": 6, "alwai": 3, "amsterdam": [1, 4], "an": [1, 2, 3, 4, 6], "analys": 6, "angl": 6, "anoth": 4, "antenn": [4, 6], "antenna": 6, "api": [3, 4, 5, 6], "append": 1, "applic": [0, 1, 3], "ar": [1, 3, 4, 6, 8], "arg": 8, "argument": [3, 8], "arrai": 3, "assign": 6, "attach": 1, "attr": 1, "avail": [1, 6, 8], "azimuth": 3, "base": [1, 4], "base_url": 1, "baselin": 2, "basic": 1, "becaus": 3, "been": [2, 3], "befor": [2, 6], "belong": [2, 8], "beta": 6, "between": [1, 3, 4, 6, 8], "bin": 8, "bodi": 1, "boolean": [2, 8], "born": 0, "box": 3, "bracket": 1, "bristol": 4, "browser": [1, 3], "button": [1, 3], "calendar": 8, "call": 8, "can": [1, 2, 3, 4, 5, 6, 8], "carto": 4, "center": 6, "chang": [1, 3], "check": [2, 3, 8], "checkbox": 3, "choos": [1, 3, 4], "chosen": [1, 6], "class": [1, 8], "click": [1, 3, 4], "clock": 6, "close": 4, "cluster": [0, 2, 4, 8], "cluster_id": 1, "cluster_numb": 2, "clusters_in_countri": 1, "code": [1, 4], "codeacademi": 1, "coincid": 8, "colleg": 3, "color": 4, "column": 3, "com": 1, "commun": 6, "compass": 5, "complet": 4, "config": [0, 1, 2, 8], "configur": [1, 2, 8], "consist": 2, "constructor": 8, "contain": [0, 1, 2, 8], "content": [0, 2, 4, 5, 7, 8], "context": 8, "convert": 3, "coordin": 5, "copi": 1, "correspond": 1, "cosmic": 2, "countri": [0, 1, 2, 4, 8], "country_id": 1, "country_numb": 2, "creat": [1, 2, 8], "create_plot_object": [7, 8], "csv": 3, "current": [4, 8], "d": [1, 3], "dai": [1, 2], "daili": 8, "dailyhistogram": 8, "daq": 2, "data": [0, 1, 2, 4, 5, 7, 8], "databas": [0, 3, 4], "dataset": 8, "date": [0, 1, 2, 3, 8], "datetim": [1, 3], "datetime64": 3, "datum": 1, "de": 6, "default": 8, "defin": [1, 3], "degre": 6, "delimit": 3, "denmark": [1, 4], "describ": 6, "desir": 2, "detail": 1, "detector": [4, 6], "determin": [4, 6], "dict": 8, "dictionari": [1, 2], "differ": 6, "displai": [1, 5], "distanc": 6, "do": [1, 3], "doc": 1, "document": 1, "doe": 1, "done": 5, "down": 1, "download": 5, "draw": 6, "drop": 1, "dtype": 3, "dure": [1, 2], "dutch": 6, "e": [1, 2, 3, 4, 6], "each": [1, 2, 4, 6], "easi": [0, 1, 3], "either": [1, 2, 6, 8], "embed": 5, "empti": 1, "enclos": 1, "end": [3, 8], "end_datum": 1, "ensched": 4, "entir": 2, "epoch": 2, "equip": 4, "error": 8, "esd": 3, "event": [1, 2, 3, 8], "eventtim": 8, "ever": 2, "everyon": 5, "exact": [4, 6], "exampl": [3, 4, 5, 6], "excel": 3, "explain": [4, 6], "explor": 1, "ext_timestamp": 2, "extend": 2, "extra": [4, 8], "fals": [2, 3], "famili": 1, "few": 1, "figur": 6, "file": [1, 3], "final": [1, 4], "find": [1, 2], "firefox": 3, "first": [3, 4, 5, 6], "fit": 4, "float32": 3, "focu": 4, "follow": [1, 3, 6, 8], "font": 1, "form": [5, 6], "format": [1, 3], "found": [2, 4], "four": 2, "framebord": 4, "framework": [1, 3], "from": [1, 2, 3, 6, 8], "full_url": 3, "function": 1, "g": [3, 4], "gather": 3, "gener": [1, 2, 8], "genfromtxt": 3, "get": [1, 2, 3, 8], "get_cluster_dict": [0, 2], "get_config_sourc": [7, 8], "get_context_data": [7, 8], "get_country_dict": [0, 2], "get_dataset_sourc": [7, 8], "get_detector_timing_offset": [7, 8], "get_detector_timing_offsets_sourc": [7, 8], "get_event_trac": [0, 2], "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_object": [7, 8], "get_queryset": [7, 8], "get_redirect_url": [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_stat": 1, "get_station_dict": [0, 2], "get_station_layout_sourc": [7, 8], "get_station_timing_offset": [7, 8], "get_station_timing_offsets_sourc": [7, 8], "get_subcluster_dict": [0, 2], "getjson": 1, "give": [1, 2, 4], "given": [2, 4, 8], "gp": [2, 4, 6, 8], "grai": 4, "green": 4, "h2": 1, "ha": [1, 2, 3, 4, 6, 8], "had": 1, "has_data": [0, 1, 2], "have": [1, 2, 4, 6], "head": 1, "height": [4, 6], "help": [7, 8], "here": [2, 4], "hisparc": [0, 1, 2, 3, 5], "histogram": 8, "histori": 8, "hour": [2, 3], "how": [1, 3, 6], "howev": [3, 6], "html": [1, 8], "http": [1, 3, 4], "http_method_nam": [7, 8], "httprespons": 2, "i": [1, 2, 3, 4, 5, 6, 8], "id": 1, "identifi": 2, "ifram": 4, "illustr": 6, "implement": 8, "import": [1, 3, 6], "importantli": 2, "includ": [1, 2, 3], "index": 5, "indic": [1, 4, 8], "individu": 2, "info": [1, 2], "infopakket": 6, "inform": [0, 1, 2, 3, 4, 6], "input": 1, "insert": 8, "instanc": 1, "instead": [1, 3], "int16": 3, "integ": 2, "integr": 3, "interfac": [0, 1, 5], "internet": 1, "its": [2, 4], "j": 1, "javascript": 5, "jqueri": 1, "jsfiddl": 1, "json": [1, 2], "json_dict": [0, 2], "jsparc": 3, "juli": 3, "just": 1, "kaj": 3, "karlsruh": 1, "kei": 1, "keyword": 8, "know": [1, 6], "kwarg": 8, "languag": 1, "latest": 2, "latestnetworksummaryredirectview": [7, 8], "latestsummaryredirectview": [7, 8], "layout": 5, "leafet": 4, "learn": 1, "level": 4, "librari": [1, 3, 4], "like": [1, 3], "line": 1, "link": [1, 3, 4, 8], "list": [2, 3, 8], "ll": 1, "load": 3, "locat": [2, 4, 6, 8], "long": 6, "longer": 4, "look": [3, 5, 8], "loop": 1, "made": [1, 6], "mai": [6, 8], "mail": 6, "main": [2, 4], "make": [1, 3, 6], "man": [0, 2], "mani": [1, 3], "map": [5, 8], "marker": 4, "match": [2, 8], "matplotlib": 1, "mean": 2, "measur": [1, 2, 5, 7], "menu": 1, "metadata": [1, 3], "meter": 6, "method": [1, 8], "min": 1, "modul": [1, 3, 5], "month": [1, 2, 8], "more": [1, 4, 6], "moreov": [4, 6], "most": [2, 8], "multipl": 4, "munk": 3, "n1": 3, "n2": 3, "n3": 3, "n4": 3, "name": [1, 2, 4, 8], "nanosecond": [2, 3], "nav_calendar": [7, 8], "nav_month": [7, 8], "nav_year": [7, 8], "neat": 1, "need": [0, 1, 3, 4, 6], "netherland": 4, "network": [1, 2, 4], "network_coincid": 8, "network_statu": [0, 2], "networkhistogram": 8, "networksummarydetailview": [7, 8], "new": [1, 6], "next": 6, "nice": 1, "nl": [1, 3, 4], "non": 2, "none": [2, 8], "none_to_nan": [7, 8], "north": 6, "notat": 1, "note": 4, "now": [1, 3, 8], "num_ev": [0, 1, 2], "number": [1, 2, 4, 8], "numpi": 3, "object": [1, 8], "octob": 1, "offlin": 4, "offset": 8, "often": 6, "old": 3, "onc": 1, "one": [1, 4], "onli": [2, 4], "onlin": 1, "open": 1, "openstreetmap": 4, "oper": [2, 4], "option": [1, 2, 3, 4], "order": 8, "organ": 4, "orient": 6, "other": [1, 8], "otherwis": [2, 8], "our": [4, 5], "out": [0, 2], "outsid": 2, "over": 1, "overridden": 8, "overview": [1, 2, 4], "own": 1, "p": 1, "packag": 3, "page": [1, 3, 4, 5, 8], "pair": 8, "paramet": [2, 8], "park": 4, "particular": 8, "pass": 3, "past": 1, "pattern": 8, "pc": 3, "period": 2, "perpar": 1, "place": [1, 3, 4], "pleas": 1, "plot": [1, 8], "plot_config": [7, 8], "plot_dataset": [7, 8], "plot_histogram": [7, 8], "plot_timing_offset": [7, 8], "popular": 1, "popup": 4, "posit": [1, 4, 6], "possibl": [1, 2, 4], "post": 3, "pre": 1, "presenc": 2, "present": 2, "previou": 8, "print": 3, "problem": 4, "process": 6, "program": [0, 1, 3], "project": 2, "properli": 4, "provid": [4, 7, 8], "public": [0, 3, 4], "pulseheight": 3, "pylab": 1, "python": 5, "queri": 3, "queryset": 8, "r": 6, "rai": 2, "rang": 2, "raw": [2, 4], "read": [1, 3], "recent": 8, "recogn": 3, "recommend": 1, "reconstruct": 6, "record": [2, 8], "red": 4, "redirect": 8, "ref_station_numb": 8, "refer": [1, 4, 5], "region": 4, "rel": [2, 6], "replac": 3, "request": [1, 2, 3, 8], "requir": [1, 3], "respond": 4, "respons": 1, "result": [1, 2, 4], "retriev": [1, 2, 8], "return": [2, 8], "review": 6, "right": 3, "rotat": 6, "s8": 3, "same": 6, "san": 1, "sapphir": [3, 4, 6], "schemat": 6, "school": 6, "scienc": 4, "scintil": [2, 6], "script": 1, "scroll": 4, "search": 5, "section": 6, "see": [1, 3, 6], "seen": 6, "select": [1, 3], "sent": [2, 6], "serif": 1, "server": 4, "set": [1, 2], "sever": [1, 3, 4], "sheet": 6, "should": [1, 2, 3], "show": [1, 3, 4, 8], "shower": [2, 8], "side": 6, "signific": 6, "simpli": 4, "simplifi": [0, 1], "sinc": 2, "singl": [2, 8], "some": 1, "specif": [2, 3, 4, 8], "specifi": 4, "src": [1, 4], "standard": 1, "start": [1, 3, 4, 8], "statement": 1, "static": 8, "station": [0, 1, 2, 3, 5, 7, 8], "station_config": [7, 8], "station_data": 8, "station_has_config": [7, 8], "station_has_data": [7, 8], "station_id": 1, "station_info": 1, "station_latest": [7, 8], "station_list": 1, "station_numb": [2, 8], "station_statu": [7, 8], "stationn": 2, "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], "stations_with_data": [0, 2, 7, 8], "stationsplattegrond": 6, "statu": [2, 5], "status_displai": 8, "step": 1, "store": [3, 4], "str": 3, "stringifi": 1, "stringio": 3, "student": 6, "style": 1, "subclust": [0, 2, 4, 8], "subcluster_numb": 2, "subclusters_in_clust": 1, "submit": [1, 3, 5], "submitt": 6, "subtract": 2, "summari": [3, 7], "summarydetailview": [7, 8], "support": 8, "synchron": 4, "system": 6, "t": [3, 4], "t1": 3, "t2": 3, "t3": 3, "t4": 3, "t_trigger": 3, "tab": 3, "taken": 3, "tell": 1, "template_nam": [7, 8], "test": 2, "text": 1, "thei": 6, "thi": [1, 2, 3, 4, 6, 8], "thing": [1, 8], "those": 4, "through": [5, 6], "tile": 4, "time": [2, 3, 4, 8], "timedelta": 1, "timestamp": [2, 3], "total": 2, "trace": 2, "trigger": 8, "true": 2, "try": 1, "tupl": 8, "turn": 6, "tutori": [3, 5], "two": [1, 2], "type": [1, 2, 8], "u": [1, 6], "uint32": 3, "undefin": 1, "understand": 1, "understood": 1, "unit": [4, 6], "unix": 2, "unrespons": 4, "up": [0, 1, 3, 6, 8], "url": [1, 2, 3, 4, 8], "urlconf": 8, "urlencod": 3, "urllib": [1, 3], "urlopen": [1, 3], "us": [1, 3, 4, 6, 8], "user": 2, "utrecht": [1, 4], "val": 1, "valid": [2, 8], "validate_d": [0, 2], "valu": [1, 8], "var": 1, "variabl": 3, "verif": 6, "via": [1, 4, 5, 6], "view": [0, 5, 7], "visual": 4, "voltag": 8, "wa": 0, "wai": [1, 3, 6], "walk": 6, "want": [1, 3], "we": [1, 2, 3, 4, 6], "weather": [2, 3, 8], "web": 3, "webpag": [1, 7], "websit": [1, 4, 6], "week": 1, "what": 1, "when": [3, 4, 6], "which": [1, 2, 3, 4, 5, 6, 8], "while": 1, "width": 4, "window": [3, 4], "wise": 6, "within": 2, "without": [1, 2, 3], "work": [1, 3], "x": 8, "x_label": 8, "x_valu": 8, "y": 8, "y_label": 8, "y_seri": 8, "year": [1, 2, 8], "yellow": 4, "you": [1, 2, 3, 4], "your": [1, 3], "z": 6, "zaanstad": 4, "zenith": 3, "zoom": 4, "\u03b1": 6, "\u03b2": 6}, "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"], "titleterms": {"access": [3, 6], "api": [0, 1, 2], "cluster": 1, "compass": 6, "coordin": 6, "data": [3, 6], "databas": 5, "displai": [7, 8], "document": 5, "download": 3, "embed": 4, "exampl": 1, "first": 1, "form": 3, "hisparc": [4, 6], "indic": 5, "info": 4, "javascript": 1, "layout": 6, "list": 1, "look": 1, "map": 4, "measur": 6, "public": 5, "python": [1, 3], "refer": [0, 2, 7, 8], "sapphir": 1, "station": [4, 6], "statu": [4, 7, 8], "submit": 6, "syntax": 4, "tabl": 5, "tutori": 1, "via": 3, "view": [2, 8]}}) \ No newline at end of file diff --git a/station_layout.html b/station_layout.html new file mode 100644 index 000000000..3a1e20f2d --- /dev/null +++ b/station_layout.html @@ -0,0 +1,173 @@ + + + + + + + + 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..7ab75d09f --- /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..c8eca11a6 --- /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