From 54e3f85f32a8cd8e69ba72e47ab8cb692c0d6572 Mon Sep 17 00:00:00 2001 From: 153957 <153957@users.noreply.github.com> Date: Tue, 9 Jul 2024 05:31:23 +0000 Subject: [PATCH] deploy: 36740e569feb3aa9e529b3fdb5cdf156fcfb9f9f --- .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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⁢%1X5*zMRaG_RadTERHRW5z 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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