From 0a0dc96ce1e433c2989e1e2696b1572ab3715d03 Mon Sep 17 00:00:00 2001 From: 153957 <153957@users.noreply.github.com> Date: Tue, 28 May 2024 06:47:21 +0000 Subject: [PATCH] deploy: fdd0822199f2a2333db9e68f7bae7a5f61abf0e4 --- .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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 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